From 68270520285b0dc869565573fce3b02e860ffa7f Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 4 Jul 2023 21:39:55 -0400 Subject: [PATCH] cdecl99: Reverse sense of "interactive" global variable. Instead of a default-true "interactive" global variable, we can use a default-false "batch" global variable, reversing the sense of all the tests. This moves the variable from the initialized data segment into bss, which is more efficient. --- src/cdecl99.c | 60 +++++++++++++++++++++++------------------------ src/cdecl99.h | 2 +- src/execute.gperf | 4 ++-- tests/general.at | 9 +++++++ 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/cdecl99.c b/src/cdecl99.c index f7eed62..1b82168 100644 --- a/src/cdecl99.c +++ b/src/cdecl99.c @@ -58,13 +58,13 @@ static void do_add_history(const char *line) #endif static const char *progname = "cdecl99"; -static bool interactive = true; +static bool batch_mode; void print_error(const char *fmt, ...) { va_list(ap); - if (!interactive) + if (batch_mode) fprintf(stderr, "%s: ", progname); fprintf(stderr, "%s", _("error: ")); @@ -124,22 +124,6 @@ static void print_help(const struct option *lopts) printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT); } -static int repl_cmdline(unsigned count, char **commands) -{ - int ret = 0; - unsigned i; - - for (i = 0; i < count; i++) { - int rc = run_command(commands[i], false); - if (rc < 0) - ret = -1; - else if (rc > 0) - break; - } - - return ret; -} - static int do_getline(char **linebuf, size_t *n) { ssize_t rc; @@ -155,17 +139,17 @@ static int do_getline(char **linebuf, size_t *n) return 1; } -static int do_readline(char **linebuf, size_t *n, int interactive) +static int do_readline(char **linebuf, size_t *n, int batch) { #if !HAVE_READLINE - if (interactive) { + if (!batch) { fputs("> ", stdout); fflush(stdout); } return do_getline(linebuf, n); #else - if (!interactive) + if (batch) return do_getline(linebuf, n); free(*linebuf); @@ -177,24 +161,40 @@ static int do_readline(char **linebuf, size_t *n, int interactive) #endif } -static int repl(int interactive) +static int repl(int batch) { char *line = NULL; int ret = 0; size_t n; - while (do_readline(&line, &n, interactive)) { - int rc = run_command(line, interactive); + while (do_readline(&line, &n, batch)) { + int rc = run_command(line, batch); if (rc > 0) break; else if (rc < 0) - ret = -!interactive; + ret = -batch; } free(line); return ret; } +static int repl_cmdline(unsigned count, char **commands) +{ + int ret = 0; + unsigned i; + + for (i = 0; i < count; i++) { + int rc = run_command(commands[i], true); + if (rc < 0) + ret = -1; + else if (rc > 0) + break; + } + + return ret; +} + /* Initialize gettext */ static void init_i18n(void) { @@ -229,10 +229,10 @@ static int initialize(int argc, char **argv) quiet = 1; break; case 'b': - interactive = false; + batch_mode = true; break; case 'i': - interactive = true; + batch_mode = false; break; case 'f': filename = optarg; @@ -265,10 +265,10 @@ static int initialize(int argc, char **argv) /* --filename and --execute imply --batch. */ if (filename || execute) - interactive = false; + batch_mode = true; /* --batch implies --quiet */ - if (interactive && !quiet) + if (!batch_mode && !quiet) print_version(); /* --execute supersedes --filename */ @@ -295,7 +295,7 @@ int main(int argc, char **argv) if (execute) rc = repl_cmdline(execute, argv); else - rc = repl(interactive); + rc = repl(batch_mode); if (rc != 0) return EXIT_FAILURE; diff --git a/src/cdecl99.h b/src/cdecl99.h index 0f36f7b..d96a410 100644 --- a/src/cdecl99.h +++ b/src/cdecl99.h @@ -22,7 +22,7 @@ #include #define _(x) gettext(x) -int run_command(const char *line, int interactive); +int run_command(const char *line, int batch); int run_command_simplify(const char *arg); int run_command_explain(const char *arg); int run_command_declare(const char *cmdarg); diff --git a/src/execute.gperf b/src/execute.gperf index de8b136..ddebd5d 100644 --- a/src/execute.gperf +++ b/src/execute.gperf @@ -83,7 +83,7 @@ static int run_cmd_help(void) return 0; } -int run_command(const char *line, int interactive) +int run_command(const char *line, int batch) { const char *cmd = line + strspn(line, " \t"); const char *arg = cmd + strcspn(cmd, " \t"); @@ -96,7 +96,7 @@ int run_command(const char *line, int interactive) c = in_word_set(cmd, arg-cmd); if (!c) { print_error(_("unknown command %.*s"), (int)(arg-cmd), cmd); - if (interactive) { + if (!batch) { fprintf(stderr, "%s\n", _("Try \"help\" for a list of possible commands.")); } diff --git a/tests/general.at b/tests/general.at index 35c9dbb..b0806a3 100644 --- a/tests/general.at +++ b/tests/general.at @@ -104,6 +104,7 @@ AT_DATA([input], [[explain int a b c simplify int a b c declare a as b c +bad command ]]) AT_DATA([check.awk], @@ -116,6 +117,14 @@ END { exit(status); } AT_CHECK([LC_ALL=C cdecl99 --file=input || exit 42], [42], [], [stderr]) AT_CHECK([$AWK -v progname="$progname" -f check.awk stderr]) +exec 3