]> git.draconx.ca Git - cdecl99.git/commitdiff
cdecl99: Reverse sense of "interactive" global variable.
authorNick Bowler <nbowler@draconx.ca>
Wed, 5 Jul 2023 01:39:55 +0000 (21:39 -0400)
committerNick Bowler <nbowler@draconx.ca>
Wed, 5 Jul 2023 05:06:55 +0000 (01:06 -0400)
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
src/cdecl99.h
src/execute.gperf
tests/general.at

index f7eed62acbd94bf0a74dc7d0d73398dc6dc05704..1b821689625645e57265572d2f873767336d0d57 100644 (file)
@@ -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;
index 0f36f7b9ab45ab45631438d85e816176098ace5b..d96a410ad71af826e9a2462ab273c8d0b9d7de23 100644 (file)
@@ -22,7 +22,7 @@
 #include <gettext.h>
 #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);
index de8b1364c7cf44c953b8f9983ca6d0aed1bbf2a9..ddebd5d08867d246ef5fea503da0fc33936bd315 100644 (file)
@@ -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."));
                }
index 35c9dbb0db1e8c73d77ed68f5838c87cecc10c52..b0806a3fb4e39284bfd8e57f31c688cb31c6241f 100644 (file)
@@ -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<input
+set x; shift
+while read line <&3; do
+  set x "$@" "--execute=$line"; shift;
+done
+AT_CHECK([LC_ALL=C cdecl99 "$@" || exit 42], [42], [], [stderr])
+AT_CHECK([$AWK -v progname="$progname" -f check.awk stderr])
+
 AT_CLEANUP
 
 AT_SETUP([cdecl99 invalid character error messages])