Использование rl_insert_text readline в OS X 10.5

Итак, я пытаюсь вставить некоторый текст по умолчанию в пользовательский ввод, используя 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() никогда не отображается на экране и не возвращается в качестве пользовательского ввода. Обратный вызов используется, и rl_insert_text() возвращает правильное значение (спасибо, printf), поэтому я не уверен, что здесь происходит.

Я проверил /usr/include/readline/readline.h, а rl_insert_text() находится под:

/* supported functions */

что сбивает с толку под:

/*
 * The following is not implemented
 */

Так я SOL, или я просто делаю это неправильно?


person rampion    schedule 08.06.2009    source источник
comment
Почему это помечено как рубин? Код выглядит как код C.   -  person Kathy Van Stone    schedule 10.07.2009


Ответы (1)


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

Библиотека чтения GNU ("единственная настоящая" библиотека чтения) находится под лицензией GPL, которая (будучи лицензия с авторским левом) не работает с кодом, который не является полностью открытым исходным кодом. Если дело доходит до (A) открытого исходного кода всего Xcode, OS X и т. д. или (B) использования копии того, что вы действительно хотите использовать, Apple (как и большинство компаний) всегда будет выбирать Б. Облом, но такова жизнь.

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

Кстати, то же самое относится и к другим проектам GPL — , пока {git,mercurial,bazaar} остается под GPL, не ждите, пока Apple интегрирует их в Xcode. :-(

ОБНОВЛЕНИЕ: новый Xcode 4 предлагает поддержку git. Ура! Насколько я понимаю, это связано с новой архитектурой плагинов, которая изолирует код GPL от основной кодовой базы Xcode. Однако я подчеркиваю, что лицензии с авторским левом по-прежнему являются неправильным решением для кода, которое должно приносить пользу всем. Очевидно, что некоторые люди не согласны (вы приятель, анонимный даунвотер), но факт в том, что GPL тоже может ограничивать свободы — обычно это другие свободы, чем обычно делают закрытые/проприетарные программы, но GPL также весьма эффективна для предотвращения незаконного использования исходного кода... Разница заключается в ощущении свободы. моральное превосходство.

person Quinn Taylor    schedule 10.07.2009
comment
Спасибо! Это подтверждает мое решение просто использовать editline() в OS X. - person rampion; 11.07.2009