From 81af33db3056d7f49917f103307bc7d427fe4157 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Sat, 10 Dec 2016 11:21:21 -0200 Subject: [PATCH] Adiciona suporte a readline. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Quando executado sem um parâmetro, o declara aceitará comandos na entrada padrão, utilizando readline e history. --- configure.ac | 4 ++++ src/declara.c | 53 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 7e84526..0cea681 100644 --- a/configure.ac +++ b/configure.ac @@ -9,5 +9,9 @@ dnl Checking for zlib. AC_SEARCH_LIBS([crc32], [z], [], AC_MSG_ERROR([could not find zlib])) +dnl Checking for readline +AC_SEARCH_LIBS([readline], [readline], [], + AC_MSG_ERROR([could not find readline])) + AC_CONFIG_HEADERS([config.h]) AC_OUTPUT(Makefile lib/Makefile src/Makefile test/Makefile) diff --git a/src/declara.c b/src/declara.c index 6f6a741..54e1abb 100644 --- a/src/declara.c +++ b/src/declara.c @@ -23,6 +23,9 @@ #include #include +#include +#include + #include "declaracao.h" #include "cmd.h" #include "base.h" @@ -36,7 +39,9 @@ #include "calcula.h" #include "gera.h" -static int realprocess(struct declaracao *dec, int fd) +static int readline_support = 1; + +static int fileprocess(struct declaracao *dec, int fd) { char *line = NULL; size_t lsz = 0; @@ -58,6 +63,24 @@ static int realprocess(struct declaracao *dec, int fd) return r; } +static int ttyprocess(struct declaracao *dec) +{ + char *line = NULL; + int r; + using_history(); + while ((line = readline("declara> ")) != NULL) { + if (*line) + add_history(line); + r = cmd_run(dec, line); + if (r < 0) { + fprintf(stderr, "Não foi possível executar comando: %s\n", + strerror(-r)); + } + free(line); + } + return r; +} + static int process(char *filename) { int r = 0; @@ -66,13 +89,21 @@ static int process(char *filename) dec = declaracao_new(-1); if (!dec) return -errno; - fd = open(filename, O_RDONLY); - if (fd < 0) { - r = -errno; - goto out_open; + if (filename != NULL) { + fd = open(filename, O_RDONLY); + if (fd < 0) { + r = -errno; + goto out_open; + } + r = fileprocess(dec, fd); + close(fd); + } else { + if (isatty(0) && readline_support) { + r = ttyprocess(dec); + } else { + r = fileprocess(dec, 0); + } } - realprocess(dec, fd); - close(fd); out_open: declaracao_free(dec); return r; @@ -86,9 +117,9 @@ static void usage(void) int main(int argc, char **argv) { - char *filename; + char *filename = NULL; int r; - if (argc < 2) + if (!readline_support && argc < 2) usage(); cmd_init(); @@ -104,9 +135,11 @@ int main(int argc, char **argv) gera_cmd_init(); sistema_cmd_init(); - filename = argv[1]; + if (argc > 1) + filename = argv[1]; r = process(filename); if (r) return 1; + return 0; } -- 2.20.1