X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=src%2Fdeclara.c;h=f5faa009fac5c1903e8d8081eabf0cfe4bebda0d;hb=refs%2Fheads%2Ftest;hp=7677e2244f1da89b2bdda5c133b36403c7f42096;hpb=6612f883a37af7273563d908d9dece30e27631f8;p=cascardo%2Fdeclara.git diff --git a/src/declara.c b/src/declara.c index 7677e22..f5faa00 100644 --- a/src/declara.c +++ b/src/declara.c @@ -23,19 +23,15 @@ #include #include +#include +#include + #include "declaracao.h" #include "cmd.h" -#include "base.h" -#include "contribuinte.h" -#include "rendimento.h" -#include "isento.h" -#include "pagamento.h" -#include "bem.h" -#include "dependente.h" -#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; @@ -49,11 +45,30 @@ static int realprocess(struct declaracao *dec, int fd) r = cmd_run(dec, line); if (r < 0) { fprintf(stderr, "Não foi possível executar comando na linha %d: %s\n", - n, strerror(-r)); + n, dec->error ?: strerror(-r)); } n++; } free(line); + fclose(f); + 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", + dec->error ?: strerror(-r)); + } + free(line); + } return r; } @@ -65,13 +80,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; @@ -85,26 +108,19 @@ 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(); - base_cmd_init(); - contribuinte_cmd_init(); - rendimento_cmd_init(); - isento_cmd_init(); - pagamento_cmd_init(); - bem_cmd_init(); - dependente_cmd_init(); - calcula_cmd_init(); - gera_cmd_init(); - sistema_cmd_init(); + dec_cmd_init(); - filename = argv[1]; + if (argc > 1) + filename = argv[1]; r = process(filename); if (r) return 1; + return 0; }