Usando o RL_INSERT_TEXT da ReadLine no OS X 10.5
Pergunta
Então, estou tentando encher algum texto padrão em uma entrada do usuário usando o ReadLine e tendo problemas para fazê -lo funcionar no 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;
}
Este código nem sequer compila em 10.4 (nenhuma definição para _rl_insert_text
em 10.4, que é um pouco chatice), mas compila em 10.5. No entanto, o rl_insert_text()
'D O texto nunca é mostrado na tela, nem devolvido como entrada do usuário. O retorno de chamada está sendo usado e rl_insert_text()
Retorna o valor adequado (obrigado, printf
), então não tenho certeza do que está acontecendo aqui.
eu chequei /usr/include/readline/readline.h
, e rl_insert_text()
está embaixo:
/* supported functions */
que é confuso abaixo:
/*
* The following is not implemented
*/
Eu também estou sol, ou estou apenas fazendo errado?
Solução
Infelizmente, você pode estar sem sorte, pelo menos com a biblioteca ReadLine incluída no OS X. Devido a problemas de compatibilidade de licença, a Apple usa libedit, que (aparentemente) fornece emulação de readline incompleta. (Esta biblioteca está documentada com o nome "EditLine" no readline.h
incluído no OS X.)
GNU ReadLine Library (A biblioteca readline "One True") está sob a GPL, que (sendo uma licença copyleft) não joga bem com o código que não é totalmente de código aberto. Se se trata de (a) de código aberto todo o Xcode, OS X, etc. ou (b) usando uma imitação do que você realmente gosta de usar, a Apple (como a maioria das empresas) sempre escolherá B. É uma chatice, mas isso é vida.
Pessoalmente, acho que esse é um dos motivos pelos quais o código GPL é um pouco uma praga na terra, já que, no ato de "aderir ao homem", muitas vezes também retém o código do software de massas que compram. As licenças de estilo {BSD, MIT, Apache} são muito mais propícias a usar em sistemas de código fechado e ainda permitem que entidades comerciais contribuam com patches de volta, etc. Meu palpite é que libedit
não recebeu atenção suficiente para ser corrigida corretamente. Os patches da comunidade certamente seriam bem-vindos, embora seja muito melhor se pudermos usar o código sem ter que invadir isso sozinhos ... ;-)
BTW, o mesmo se aplica a outros projetos da GPL - Enquanto {Git, Mercurial, Bazaar} permanecer sob GPL, não prenda a respiração para a Apple enviar a integração para eles no Xcode. :-(
ATUALIZAR: O novo Xcode 4 oferece suporte Git. Huzzah! Meu entendimento é que isso se deve à nova arquitetura do plug -in, que isola o código GPL'D da base de código Xcode principal. No entanto, enfatizo que as licenças copyleft ainda são a solução errada para o código que deve beneficiar a todos. Obviamente, algumas pessoas não concordam (você é um amigo, anônimo do que descendente), mas o fato é que GPL pode restringir as liberdades também -geralmente são diferentes do software de código fechado/proprietário geralmente, mas a GPL também é bastante eficaz para impedir o uso ilegal do código-fonte ... A diferença é um sentimento de superioridade moral.