因此,我尝试使用 readline 将一些默认文本填充到用户输入中,但无法使其在 OSX 10.5 上工作:
// rl_insert_text_ex.c
// gcc -o rl_insert_text_ex rl_insert_text_ex.c -lreadline
#include <stdio.h>
#include <readline/readline.h>
int my_startup_hook(void) {
return rl_insert_text("ponycorns");
}
int main(int argc, char *argv[]) {
char *line;
rl_startup_hook = (Function*) my_startup_hook;
line = readline("What's your favorite mythical animal? ");
if (NULL == line || '\0' == *line) {
printf("Nothing given... :(\n");
}
else {
printf("That's funny, I love %s too!\n", line);
}
return 0;
}
该代码甚至无法在 10.4 上编译(没有定义_rl_insert_text
在 10.4 上,这有点令人失望),但可以在 10.5 上编译。但是,那rl_insert_text()
'd 文本永远不会显示在屏幕上,也不会作为用户输入返回。正在使用回调并且rl_insert_text()
返回正确的值,(谢谢,printf
),所以我不确定这里发生了什么。
我检查了/usr/include/readline/readline.h
, and rl_insert_text()
在下面:
/* supported functions */
这是令人困惑的:
/*
* The following is not implemented
*/
那么我是SOL,还是我只是做错了?
不幸的是,你可能不走运,至少 OS X 中包含的 readline 库是这样。由于许可证兼容性问题,Apple 使用libedit http://www.thrysoee.dk/editline/,它(显然)提供了不完整的读取行模拟。 (该库在文档中的名称为“editline”readline.h
包含在 OS X 中。)
GNU Readline 库 http://en.wikipedia.org/wiki/GNU_readline(“一个真正的”readline 库)遵循 GPL,它(作为 Copyleft 许可证)不能很好地与不完全开源的代码兼容。如果归结为 (A) 开源所有 Xcode、OS X 等,或者 (B) 使用你真正喜欢使用的仿制品,Apple(像大多数公司一样)总是会选择B. 很遗憾,但这就是生活。
就我个人而言,我认为这是 GPL 代码在某种程度上成为这片土地上的祸害的原因之一,因为在“将其粘在人身上”的行为中,它通常也会向购买软件的大众扣留代码。 {BSD,MIT,Apache} 风格的许可证更有利于在闭源系统中使用,并且仍然允许商业实体贡献补丁等。我的猜测是libedit
尚未得到足够的重视而无法得到妥善修复。社区补丁肯定会受到欢迎,尽管如果我们可以使用代码而不需要自己破解它会更好......;-)
顺便说一句,同样的事情也适用于其他 GPL 项目 - 只要 {git,mercurial,bazaar} 仍然处于 GPL 之下,就不要屏息等待 Apple 在 Xcode 中为它们提供集成。 :-(罢工>
UPDATE:新的 Xcode 4 提供了 git 支持。哈扎!我的理解是,这是由于新的插件架构将 GPL 代码与主 Xcode 代码库隔离。然而,我强调,对于应该让每个人受益的代码来说,copyleft 许可证仍然是错误的解决方案。显然有些人不同意(你是一个朋友,匿名反对者)但事实是GPL 也可以限制自由 http://news.cnet.com/8301-10784_3-9738466-7.html— 通常它与闭源/专有软件通常不同,但 GPL 在防止非法使用源代码方面也非常有效......区别在于道德优越感。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)