ref: 2c0c6c94ca2ab0132bee57e369070eed6a73c9a6
parent: 643d4288948c1655a3dfa3b03ce783c66e82a36f
author: Tor Andersson <tor.andersson@artifex.com>
date: Wed Aug 29 08:56:23 EDT 2018
Use getopt command line argument processing. Pass script arguments to script as global variable scriptArgs.
--- a/main.c
+++ b/main.c
@@ -5,6 +5,57 @@
#include "mujs.h"
+static char *optarg; /* Global argument pointer. */
+static int optind = 0; /* Global argv index. */
+static int getopt(int argc, char *argv[], char *optstring)
+{
+ static char *scan = NULL; /* Private scan pointer. */
+
+ char c;
+ char *place;
+
+ optarg = NULL;
+
+ if (!scan || *scan == '\0') {
+ if (optind == 0)
+ optind++;
+
+ if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0')
+ return EOF;
+ if (argv[optind][1] == '-' && argv[optind][2] == '\0') {
+ optind++;
+ return EOF;
+ }
+
+ scan = argv[optind]+1;
+ optind++;
+ }
+
+ c = *scan++;
+ place = strchr(optstring, c);
+
+ if (!place || c == ':') {
+ fprintf(stderr, "%s: unknown option -%c\n", argv[0], c);
+ return '?';
+ }
+
+ place++;
+ if (*place == ':') {
+ if (*scan != '\0') {
+ optarg = scan;
+ scan = NULL;
+ } else if( optind < argc ) {
+ optarg = argv[optind];
+ optind++;
+ } else {
+ fprintf(stderr, "%s: option requires argument -%c\n", argv[0], c);
+ return ':';
+ }
+ }
+
+ return c;
+}
+
#ifdef HAVE_READLINE
#include <readline/readline.h>
#include <readline/history.h>
@@ -203,6 +254,14 @@
return s;
}
+static void usage(void)
+{
+ fprintf(stderr, "Usage: mujs [options] [script [scriptArgs*]]\n");
+ fprintf(stderr, "\t-i: Enter interactive prompt after running code.\n");
+ fprintf(stderr, "\t-s: Check strictness.\n");
+ exit(1);
+}
+
int
main(int argc, char **argv)
{
@@ -209,15 +268,19 @@
char *input;
js_State *J;
int status = 0;
- int flags = 0;
- int i = 1;
+ int strict = 0;
+ int interactive = 0;
+ int i, c;
- if (i < argc && !strcmp(argv[i], "-s")) {
- flags |= JS_STRICT;
- ++i;
+ while ((c = getopt(argc, argv, "is")) != -1) {
+ switch (c) {
+ default: usage(); break;
+ case 'i': interactive = 1; break;
+ case 's': strict = 1; break;
+ }
}
- J = js_newstate(NULL, NULL, flags);
+ J = js_newstate(NULL, NULL, strict ? JS_STRICT : 0);
js_newcfunction(J, jsB_gc, "gc", 0);
js_setglobal(J, "gc");
@@ -243,13 +306,24 @@
js_dostring(J, require_js);
js_dostring(J, stacktrace_js);
- if (i < argc) {
- while (i < argc) {
- if (js_dofile(J, argv[i]))
- status = 1;
- ++i;
- }
+ if (optind == argc) {
+ interactive = 1;
} else {
+ c = optind++;
+
+ js_newarray(J);
+ i = 0;
+ while (optind < argc) {
+ js_pushstring(J, argv[optind++]);
+ js_setindex(J, -2, i++);
+ }
+ js_setglobal(J, "scriptArgs");
+
+ if (js_dofile(J, argv[c]))
+ status = 1;
+ }
+
+ if (interactive) {
if (isatty(0)) {
using_history();
rl_bind_key('\t', rl_insert);