From: Nick Bowler Date: Sun, 10 Jul 2011 16:48:27 +0000 (-0400) Subject: Add support for --execute and --file options. X-Git-Tag: v1~136 X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/commitdiff_plain/df3504fde7eeb2a921e436003231a99bb1f690f0 Add support for --execute and --file options. For useful non-interactive invocation. --- diff --git a/src/cdecl99.c b/src/cdecl99.c index 667ae03..5c67ed8 100644 --- a/src/cdecl99.c +++ b/src/cdecl99.c @@ -26,11 +26,13 @@ #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();