2

因此,我正在尝试使用 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 上编译(在 10.4 上没有定义_rl_insert_text,这有点糟糕),但在 10.5 上可以编译。但是,rl_insert_text()'d 文本永远不会显示在屏幕上,也不会作为用户输入返回。正在使用回调并rl_insert_text()返回正确的值,(谢谢,printf),所以我不确定这里发生了什么。

我检查了/usr/include/readline/readline.h,并且rl_insert_text()在:

/* supported functions */

令人困惑的是:

/*
 * The following is not implemented
 */

那么我是SOL,还是我做错了?

4

1 回答 1

1

不幸的是,您可能不走运,至少对于 OS X 中包含的 readline 库是这样。由于许可证兼容性问题,Apple 使用libedit,它(显然)提供了不完整的 readline 仿真。readline.h(此库在OS X 附带的文件中以名称“editline”记录。)

GNU Readline 库(“一个真正的”readline 库)在 GPL 下,它(作为 copyleft 许可证)不能很好地与不完全开源的代码配合使用。如果归结为 (A) 开源所有 Xcode、OS X 等或 (B) 使用你真正喜欢使用的仿制品,Apple(像大多数公司一样)总是会选择B. 这很糟糕,但这就是生活。

就我个人而言,我认为这是 GPL 代码在这片土地上有些枯萎的原因之一,因为在“粘在人身上”的行为中,它通常还会向购买软件的大众隐瞒代码。{BSD,MIT,Apache} 风格的许可证更有利于在闭源系统中使用,并且仍然允许商业实体提供补丁等。我的猜测是libedit没有得到足够的关注来正确修复。社区补丁肯定会受到欢迎,尽管如果我们可以使用代码而不必自己破解它会更好...... ;-)

顺便说一句,同样的事情也适用于其他 GPL 项目——只要 {git,mercurial,bazaar} 仍然在 GPL 下,不要屏息等待 Apple 在 Xcode 中为它们提供集成。:-(

更新:新的 Xcode 4 提供 git 支持。嘘!我的理解是,这是由于新的插件架构将 GPL 代码与主 Xcode 代码库隔离开来。但是,我强调 Copyleft 许可证仍然是应该使所有人受益的代码的错误解决方案。显然有些人不同意(你是一个朋友,匿名的反对者),但事实是GPL 也可以限制自由——通常它不同于闭源/专有软件通常会这样做,但 GPL 在防止非法使用源代码...不同的是一种道德优越感。

于 2009-07-10T18:51:45.710 回答