2009-06-08 2 views
2

Итак, я пытаюсь набить текст по умолчанию в пользовательский ввод с использованием Readline, и возникли проблемы заставить его работать на OSX 10.5:с использованием Readline на OS X 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; 
} 

Этот код Безразлично» t даже скомпилировать 10.4 (нет определения для _rl_insert_text на 10.4, что немного облом), но компилируется на 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, или я просто делаю неправильно?

+0

Почему это помечено как ruby? Код выглядит как код C. –

+0

хороший вопрос! исправлено это. – rampion

ответ

1

К сожалению, вам может быть не повезло, по крайней мере, с библиотекой readline, включенной в OS X. Из-за проблем с совместимостью с лицензией Apple использует libedit, что (по-видимому) обеспечивает неполную эмуляцию readline. (Эта библиотека документированы с именем «editline» в readline.h в комплекте с OS X.)

GNU Readline Library («один истинный» Readline библиотека) находится под лицензией GPL, которая (будучи копилефт лицензии) не очень хорошо играть с код, который не является полностью открытым исходным кодом. Если до (A) открыть все Xcode, OS X и т. Д. Или (B), используя нокаут того, что вы действительно хотите использовать, Apple (как и большинство компаний) всегда будет выбирать Б. Это облом, но это жизнь.

Лично я считаю, что это одна из причин того, что код GPL'd является чем-то вроде ужаса на земле, поскольку в акте «приклеивания его к человеку» он часто также удерживает код от масс, которые покупают программного обеспечения. Лицензии {BSD, MIT, Apache} гораздо более благоприятны для использования в системах с закрытыми исходными кодами и по-прежнему позволяют коммерческим организациям вносить исправления и т. Д. Я предполагаю, что libedit не получил достаточного внимания, чтобы исправляться должным образом , Патчи сообщества наверняка будут приветствоваться, хотя это гораздо приятнее, если мы сможем использовать код без необходимости взломать его сами ... ;-)

BTW, то же самое относится и к другим проектам GPL - , пока { git, mercurial, bazaar} остается под GPL, не задерживайте дыхание для Apple, чтобы отправить интеграцию для них в Xcode. :-(

UPDATE:.!. Новый Xcode 4 предлагает поддержку GIT возгласы ликования Я понимаю, что это связано с новой архитектурой плагин, который изолирует код под GPL от основного Xcode кодовую Однако, подчеркиваю что лицензии на копилефт по-прежнему являются неправильным решением для кода, который должен приносить пользу всем. Очевидно, что некоторые люди не согласны (вы - приятель, анонимный downvoter), но факт в том, что GPL can restrict freedoms too - обычно его разные, чем программное обеспечение с закрытым исходным кодом/проприетарным программным обеспечением как правило, делает, но GPL также весьма эффективен для предотвращения незаконного использования исходного кода ... Разница - это чувство морального превосходства.

+0

Спасибо! Это подтверждает мое решение просто использовать editline(), когда на OS X. – rampion