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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top