Skip to content
Snippets Groups Projects
Commit 6cd643a3 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add -I (Interpret) command-line option to execute cmdline string

At Tracker1's request/suggestion.

jsexec -Itrue
...
Result (boolean): true

More elaborate expressions can be evaluated and white-space included by quoting the "-I expression".

Also, send all cmd-line usage errors to stderr and syntax help to stdout, always (Deuce's request).
parent 8404da74
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -101,11 +101,11 @@ void banner(FILE* fp) ...@@ -101,11 +101,11 @@ void banner(FILE* fp)
,__DATE__, __TIME__, compiler); ,__DATE__, __TIME__, compiler);
} }
void usage(FILE* fp) void usage()
{ {
banner(fp); banner(stderr);
fprintf(fp,"\nusage: " PROG_NAME_LC " [-opts] [path]module[.js] [args]\n" fprintf(stderr, "\nusage: " PROG_NAME_LC " [-opts] [[path/]module[.js] or -Ijs-expression] [args]\n"
"\navailable opts:\n\n" "\navailable opts:\n\n"
#ifdef JSDOOR #ifdef JSDOOR
" -c<ctrl_dir> specify path to CTRL directory\n" " -c<ctrl_dir> specify path to CTRL directory\n"
...@@ -129,6 +129,7 @@ void usage(FILE* fp) ...@@ -129,6 +129,7 @@ void usage(FILE* fp)
" -L<level> set log level (default=%u)\n" " -L<level> set log level (default=%u)\n"
" -E<level> set error log level threshold (default=%u)\n" " -E<level> set error log level threshold (default=%u)\n"
" -i<path_list> set load() comma-sep search path list (default=\"%s\")\n" " -i<path_list> set load() comma-sep search path list (default=\"%s\")\n"
" -I<expression> interpret and execute specified JavaScript expression\n"
" -f use non-buffered stream for console messages\n" " -f use non-buffered stream for console messages\n"
" -a append instead of overwriting message output files\n" " -a append instead of overwriting message output files\n"
" -A send all message to stdout\n" " -A send all message to stdout\n"
...@@ -909,7 +910,7 @@ char *dbg_getline(void) ...@@ -909,7 +910,7 @@ char *dbg_getline(void)
#endif #endif
} }
long js_exec(const char *fname, char** args) long js_exec(const char *fname, const char* buf, char** args)
{ {
int argc=0; int argc=0;
uint line_no; uint line_no;
...@@ -993,33 +994,39 @@ long js_exec(const char *fname, char** args) ...@@ -993,33 +994,39 @@ long js_exec(const char *fname, char** args)
JS_SetOperationCallback(js_cx, js_OperationCallback); JS_SetOperationCallback(js_cx, js_OperationCallback);
if(fp==stdin) /* Using stdin for script source */ if(buf != NULL) {
SAFECOPY(path,"stdin"); SAFECOPY(path, "cmdline");
fp = NULL;
fprintf(statfp,"Reading script from %s\n",path); js_buf = (char*)buf;
line_no=0; js_buflen = strlen(buf);
js_buflen=0; } else {
while(!feof(fp)) { if(fp==stdin) /* Using stdin for script source */
if(!fgets(line,sizeof(line),fp)) SAFECOPY(path,"stdin");
break;
line_no++; fprintf(statfp,"Reading script from %s\n",path);
/* Support Unix Shell Scripts that start with #!/path/to/jsexec */ line_no=0;
if(line_no==1 && strncmp(line,"#!",2)==0) js_buflen=0;
strcpy(line,"\n"); /* To keep line count correct */ while(!feof(fp)) {
len=strlen(line); if(!fgets(line,sizeof(line),fp))
if((js_buf=realloc(js_buf,js_buflen+len))==NULL) { break;
lprintf(LOG_ERR,"!Error allocating %lu bytes of memory" line_no++;
,(ulong)(js_buflen+len)); /* Support Unix Shell Scripts that start with #!/path/to/jsexec */
if(fp!=stdin) if(line_no==1 && strncmp(line,"#!",2)==0)
fclose(fp); strcpy(line,"\n"); /* To keep line count correct */
return(-1); len=strlen(line);
if((js_buf=realloc(js_buf,js_buflen+len))==NULL) {
lprintf(LOG_ERR,"!Error allocating %lu bytes of memory"
,(ulong)(js_buflen+len));
if(fp!=stdin)
fclose(fp);
return(-1);
}
memcpy(js_buf+js_buflen,line,len);
js_buflen+=len;
} }
memcpy(js_buf+js_buflen,line,len); if(fp!=NULL && fp!=stdin)
js_buflen+=len; fclose(fp);
} }
if(fp!=NULL && fp!=stdin)
fclose(fp);
start=xp_timer(); start=xp_timer();
if(debugger) if(debugger)
init_debugger(js_runtime, js_cx, dbg_puts, dbg_getline); init_debugger(js_runtime, js_cx, dbg_puts, dbg_getline);
...@@ -1040,10 +1047,13 @@ long js_exec(const char *fname, char** args) ...@@ -1040,10 +1047,13 @@ long js_exec(const char *fname, char** args)
result = EXIT_FAILURE; result = EXIT_FAILURE;
} else { } else {
exec_result = JS_ExecuteScript(js_cx, js_glob, js_script, &rval); exec_result = JS_ExecuteScript(js_cx, js_glob, js_script, &rval);
char *p;
if(buf != NULL) {
JSVALUE_TO_MSTRING(js_cx, rval, p, NULL);
mfprintf(statfp,"Result (%s): %s", JS_GetTypeName(js_cx, JS_TypeOfValue(js_cx, rval)), p);
}
JS_GetProperty(js_cx, js_glob, "exit_code", &rval); JS_GetProperty(js_cx, js_glob, "exit_code", &rval);
if(rval!=JSVAL_VOID && JSVAL_IS_NUMBER(rval)) { if(rval!=JSVAL_VOID && JSVAL_IS_NUMBER(rval)) {
char *p;
JSVALUE_TO_MSTRING(js_cx, rval, p, NULL); JSVALUE_TO_MSTRING(js_cx, rval, p, NULL);
mfprintf(statfp,"Using JavaScript exit_code: %s",p); mfprintf(statfp,"Using JavaScript exit_code: %s",p);
free(p); free(p);
...@@ -1060,7 +1070,7 @@ long js_exec(const char *fname, char** args) ...@@ -1060,7 +1070,7 @@ long js_exec(const char *fname, char** args)
,path ,path
,diff); ,diff);
if(js_buf!=NULL) if(js_buf!=NULL && js_buf!=buf)
free(js_buf); free(js_buf);
return(result); return(result);
...@@ -1134,6 +1144,7 @@ int main(int argc, char **argv, char** env) ...@@ -1134,6 +1144,7 @@ int main(int argc, char **argv, char** env)
char error[512]; char error[512];
#endif #endif
char* module=NULL; char* module=NULL;
char* js_buf=NULL;
char* p; char* p;
char* omode="w"; char* omode="w";
int argn; int argn;
...@@ -1208,7 +1219,7 @@ int main(int argc, char **argv, char** env) ...@@ -1208,7 +1219,7 @@ int main(int argc, char **argv, char** env)
errfp = fopen("error.log", "a"); errfp = fopen("error.log", "a");
#endif #endif
for(argn=1;argn<argc && module==NULL;argn++) { for(argn=1;argn<argc && module==NULL && js_buf==NULL;argn++) {
if(argv[argn][0]=='-') { if(argv[argn][0]=='-') {
p=argv[argn]+2; p=argv[argn]+2;
switch(argv[argn][1]) { switch(argv[argn][1]) {
...@@ -1218,6 +1229,7 @@ int main(int argc, char **argv, char** env) ...@@ -1218,6 +1229,7 @@ int main(int argc, char **argv, char** env)
case 'E': case 'E':
case 'g': case 'g':
case 'i': case 'i':
case 'I':
case 'L': case 'L':
case 'm': case 'm':
case 'o': case 'o':
...@@ -1229,8 +1241,8 @@ int main(int argc, char **argv, char** env) ...@@ -1229,8 +1241,8 @@ int main(int argc, char **argv, char** env)
char opt = argv[argn][1]; char opt = argv[argn][1];
if(*p==0) { if(*p==0) {
if(argn + 1 >= argc) { if(argn + 1 >= argc) {
fprintf(errfp,"\n!Option requires a parameter value: %s\n", argv[argn]); fprintf(stderr,"\n!Option requires a parameter value: %s\n", argv[argn]);
usage(errfp); usage();
return(do_bail(1)); return(do_bail(1));
} }
p=argv[++argn]; p=argv[++argn];
...@@ -1256,6 +1268,9 @@ int main(int argc, char **argv, char** env) ...@@ -1256,6 +1268,9 @@ int main(int argc, char **argv, char** env)
case 'i': case 'i':
load_path_list=p; load_path_list=p;
break; break;
case 'I':
js_buf = p;
break;
case 'L': case 'L':
log_level=parseLogLevel(p); log_level=parseLogLevel(p);
break; break;
...@@ -1352,9 +1367,9 @@ int main(int argc, char **argv, char** env) ...@@ -1352,9 +1367,9 @@ int main(int argc, char **argv, char** env)
pause_on_error=TRUE; pause_on_error=TRUE;
break; break;
default: default:
fprintf(errfp,"\n!Unsupported option: %s\n",argv[argn]); fprintf(stderr,"\n!Unsupported option: %s\n",argv[argn]);
case '?': case '?':
usage(errfp); usage();
return(do_bail(1)); return(do_bail(1));
} }
continue; continue;
...@@ -1370,9 +1385,9 @@ int main(int argc, char **argv, char** env) ...@@ -1370,9 +1385,9 @@ int main(int argc, char **argv, char** env)
if(umask_val >= 0) if(umask_val >= 0)
umask(umask_val); umask(umask_val);
if(module==NULL && isatty(fileno(stdin))) { if(module==NULL && js_buf==NULL && isatty(fileno(stdin))) {
fprintf(errfp,"\n!Module name not specified\n"); fprintf(stderr,"\n!Module name not specified\n");
usage(errfp); usage();
return(do_bail(1)); return(do_bail(1));
} }
...@@ -1455,13 +1470,13 @@ int main(int argc, char **argv, char** env) ...@@ -1455,13 +1470,13 @@ int main(int argc, char **argv, char** env)
} }
fprintf(statfp,"\n"); fprintf(statfp,"\n");
result=js_exec(module,&argv[argn]); result=js_exec(module, js_buf, &argv[argn]);
JS_RemoveObjectRoot(js_cx, &js_glob); JS_RemoveObjectRoot(js_cx, &js_glob);
JS_ENDREQUEST(js_cx); JS_ENDREQUEST(js_cx);
YIELD(); YIELD();
if(result) if(result)
lprintf(LOG_ERR,"!Module (%s) set exit_code: %ld", module, result); lprintf(LOG_ERR,"!Module (%s) set exit_code: %ld", module == NULL ? "cmdline" : module, result);
fprintf(statfp,"\n"); fprintf(statfp,"\n");
fprintf(statfp,"JavaScript: Destroying context\n"); fprintf(statfp,"JavaScript: Destroying context\n");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment