#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 }
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;
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)
case 'i':
interactive = true;
break;
+ case 'f':
+ filename = optarg;
+ break;
+ case 'e':
+ execute = true;
+ break;
case 'V':
print_version();
return EXIT_SUCCESS;
}
}
+ /* --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();