[njs] Shell: introduced scripts arguments support.

Dmitry Volyntsev xeioex at nginx.com
Fri Apr 17 17:04:41 UTC 2020


details:   https://hg.nginx.org/njs/rev/e077780227e0
branches:  
changeset: 1374:e077780227e0
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Fri Apr 17 17:03:59 2020 +0000
description:
Shell: introduced scripts arguments support.

diffstat:

 src/njs_shell.c          |  34 +++++++++++++++++++++++++++-------
 test/njs_expect_test.exp |   6 +++++-
 test/script_args.js      |   2 ++
 3 files changed, 34 insertions(+), 8 deletions(-)

diffs (119 lines):

diff -r 3a650363913a -r e077780227e0 src/njs_shell.c
--- a/src/njs_shell.c	Tue Apr 14 12:43:09 2020 +0000
+++ b/src/njs_shell.c	Fri Apr 17 17:03:59 2020 +0000
@@ -39,6 +39,8 @@ typedef struct {
     char                    *command;
     size_t                  n_paths;
     char                    **paths;
+    char                    **argv;
+    njs_uint_t              argc;
 } njs_opts_t;
 
 
@@ -264,8 +266,8 @@ main(int argc, char **argv)
 
     vm_options.ops = &njs_console_ops;
     vm_options.external = &njs_console;
-    vm_options.argv = argv;
-    vm_options.argc = argc;
+    vm_options.argv = opts.argv;
+    vm_options.argc = opts.argc;
 
     if (opts.interactive) {
         ret = njs_interactive_shell(&opts, &vm_options);
@@ -295,12 +297,15 @@ done:
 static njs_int_t
 njs_get_options(njs_opts_t *opts, int argc, char **argv)
 {
-    char       *p, **paths;
-    njs_int_t  i, ret;
+    char        *p, **paths;
+    njs_int_t   i, ret;
+    njs_uint_t  n;
 
     static const char  help[] =
         "Interactive njs shell.\n"
         "\n"
+        "njs [options] [-c string | script.js | -] [script args]"
+        "\n"
         "Options:\n"
         "  -c                specify the command to execute.\n"
         "  -d                print disassembled code.\n"
@@ -311,7 +316,7 @@ njs_get_options(njs_opts_t *opts, int ar
         "  -t script|module  source code type (script is default).\n"
         "  -v                print njs version and exit.\n"
         "  -u                disable \"unsafe\" mode.\n"
-        "  <filename> | -    run code from a file or stdin.\n";
+        "  script.js | -     run code from a file or stdin.\n";
 
     ret = NJS_DONE;
 
@@ -324,7 +329,7 @@ njs_get_options(njs_opts_t *opts, int ar
         if (p[0] != '-' || (p[0] == '-' && p[1] == '\0')) {
             opts->interactive = 0;
             opts->file = argv[i];
-            continue;
+            goto done;
         }
 
         p++;
@@ -340,7 +345,7 @@ njs_get_options(njs_opts_t *opts, int ar
 
             if (++i < argc) {
                 opts->command = argv[i];
-                break;
+                goto done;
             }
 
             njs_stderror("option \"-c\" requires argument\n");
@@ -418,6 +423,21 @@ njs_get_options(njs_opts_t *opts, int ar
         }
     }
 
+done:
+
+    opts->argc = njs_max(argc - i + 1, 2);
+    opts->argv = malloc(sizeof(char*) * opts->argc);
+    if (opts->argv == NULL) {
+        njs_stderror("failed to alloc argv\n");
+        return NJS_ERROR;
+    }
+
+    opts->argv[0] = argv[0];
+    opts->argv[1] = (opts->file != NULL) ? opts->file : (char *) "";
+    for (n = 2; n < opts->argc; n++) {
+        opts->argv[n] = argv[i + n - 1];
+    }
+
     return NJS_OK;
 }
 
diff -r 3a650363913a -r e077780227e0 test/njs_expect_test.exp
--- a/test/njs_expect_test.exp	Tue Apr 14 12:43:09 2020 +0000
+++ b/test/njs_expect_test.exp	Fri Apr 17 17:03:59 2020 +0000
@@ -801,7 +801,7 @@ njs_run {"-c" "console.log("} "SyntaxErr
 # process
 
 njs_run {"-c" "console.log(typeof process.argv)"} "object"
-njs_run {"-c" "console.log(process.argv[3])" "AAA"} "AAA"
+njs_run {"-c" "console.log(process.argv.slice(2))" "AAA"} "AAA"
 
 njs_run {"-c" "console.log(typeof process.env)"} "object"
 njs_run {"-c" "console.log(process.env.HOME != undefined)"} "true"
@@ -812,6 +812,10 @@ njs_run {"-c" "console.log(process.pid)"
 njs_run {"-c" "console.log(process.ppid)"} "\\d+"
 
 
+# script args
+
+njs_run {"test/script_args.js" "A" "B"} "AB"
+
 # disassemble
 
 njs_test {
diff -r 3a650363913a -r e077780227e0 test/script_args.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script_args.js	Fri Apr 17 17:03:59 2020 +0000
@@ -0,0 +1,2 @@
+var argv = process.argv.slice(2);
+console.log(argv[0] + argv[1])


More information about the nginx-devel mailing list