]> git.draconx.ca Git - cdecl99.git/commitdiff
Add support for --execute and --file options.
authorNick Bowler <nbowler@draconx.ca>
Sun, 10 Jul 2011 16:48:27 +0000 (12:48 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sun, 10 Jul 2011 16:48:27 +0000 (12:48 -0400)
For useful non-interactive invocation.

src/cdecl99.c

index 667ae034b2cbc9bf844e99117e2ba8771f92834b..5c67ed8de9af74456901115c4f57fd41e9503c98 100644 (file)
 #include "cdecl.h"
 
 static const char *progname = "cdecl99";
-static const char sopts[] = "qbiVH";
+static const char sopts[] = "qbif:e:VH";
 static const struct option lopts[] = {
        { "quiet",       0, NULL, 'q' },
        { "batch",       0, NULL, 'b' },
        { "interactive", 0, NULL, 'i' },
+       { "file",        1, NULL, 'f' },
+       { "execute",     1, NULL, 'e' },
        { "version",     0, NULL, 'V' },
        { "help",        0, NULL, 'H' },
        { 0 }
@@ -215,6 +217,25 @@ static int repl(void)
        return 0;
 }
 
+static int repl_cmdline(int argc, char **argv)
+{
+       int opt, rc, ret = 0;
+
+       optind = 1;
+       while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
+               if (opt != 'e')
+                       continue;
+
+               rc = run_command(optarg);
+               if (rc < 0)
+                       ret = -1;
+               else if (rc == 0)
+                       break;
+       }
+
+       return ret;
+}
+
 static int repl_noninteractive(void)
 {
        int rc, ret = 0, saved_errno;
@@ -247,7 +268,8 @@ static int repl_noninteractive(void)
 
 int main(int argc, char **argv)
 {
-       bool show_intro = true, interactive = true;
+       bool show_intro = true, interactive = true, execute = false;
+       const char *filename = NULL;
        int opt, rc;
 
        if (argc > 0)
@@ -264,6 +286,12 @@ int main(int argc, char **argv)
                case 'i':
                        interactive = true;
                        break;
+               case 'f':
+                       filename = optarg;
+                       break;
+               case 'e':
+                       execute = true;
+                       break;
                case 'V':
                        print_version();
                        return EXIT_SUCCESS;
@@ -276,11 +304,26 @@ int main(int argc, char **argv)
                }
        }
 
+       /* --filename and --execute imply --batch. */
+       if (filename || execute)
+               interactive = false;
+
+       /* --batch implies --quiet */
        if (interactive && show_intro)
                print_version();
 
+       /* --execute supersedes --filename */
+       if (filename && !execute) {
+               if (!freopen(filename, "r", stdin)) {
+                       perror(filename);
+                       return EXIT_FAILURE;
+               }
+       }
+
        if (interactive)
                rc = repl();
+       else if (execute)
+               rc = repl_cmdline(argc, argv);
        else
                rc = repl_noninteractive();