From c9fba31fb81bde6a61c8312104724b9dfd74892e Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Tue, 15 Jul 2003 00:46:22 +0000 Subject: [PATCH] Global exit() method can now accept an optional numeric argument, which it will use to set the global property, exit_code, used by jsexec and bbs.exec() for numeric return codes. Bugfix: No .js extension required for scripts in mods dir. --- src/sbbs3/jsexec.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c index aadfaa6c17..dc518a0a57 100644 --- a/src/sbbs3/jsexec.c +++ b/src/sbbs3/jsexec.c @@ -131,6 +131,9 @@ void bail(int code) fprintf(statfp,"\nHit enter to continue..."); getchar(); } + + if(code) + fprintf(statfp,"\nReturning error code: %d\n",code); exit(code); } @@ -476,6 +479,13 @@ static BOOL js_init(char** environ) return(TRUE); } +static const char* js_ext(const char* fname) +{ + if(strchr(fname,'.')==NULL) + return(".js"); + return(""); +} + long js_exec(const char *fname, char** args) { int argc=0; @@ -489,20 +499,19 @@ long js_exec(const char *fname, char** args) int32 result=0; if(strcspn(fname,"/\\")==strlen(fname)) { - sprintf(path,"%s%s",scfg.mods_dir,fname); + sprintf(path,"%s%s%s",scfg.mods_dir,fname,js_ext(fname)); if(scfg.mods_dir[0]==0 || !fexistcase(path)) - sprintf(path,"%s%s",scfg.exec_dir,fname); + sprintf(path,"%s%s%s",scfg.exec_dir,fname,js_ext(fname)); } else - sprintf(path,"%.*s",(int)sizeof(path)-4,fname); - /* Add extension if not specified */ - if(!strchr(path,'.')) - strcat(path,".js"); + sprintf(path,"%s%s",fname,js_ext(fname)); if(!fexistcase(path)) { fprintf(errfp,"!Module file (%s) doesn't exist\n",path); return(-1); } + JS_ClearPendingException(js_cx); + js_scope=JS_NewObject(js_cx, NULL, NULL, js_glob); if(js_scope==NULL) { @@ -526,14 +535,20 @@ long js_exec(const char *fname, char** args) ,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE); if((js_script=JS_CompileFile(js_cx, js_scope, path))==NULL) { - fprintf(errfp,"!Error executing %s\n",fname); + fprintf(errfp,"!Error compiling %s\n",path); return(-1); } JS_SetBranchCallback(js_cx, js_BranchCallback); - if(!JS_ExecuteScript(js_cx, js_scope, js_script, &rval)) - result=-1; + JS_ExecuteScript(js_cx, js_scope, js_script, &rval); + + JS_GetProperty(js_cx, js_glob, "exit_code", &rval); + + if(rval!=JSVAL_VOID) { + fprintf(statfp,"Using JavaScript exit_code: %s\n",JS_GetStringBytes(JS_ValueToString(js_cx,rval))); + JS_ValueToInt32(js_cx,rval,&result); + } JS_DestroyScript(js_cx, js_script); @@ -541,9 +556,6 @@ long js_exec(const char *fname, char** args) JS_GC(js_cx); - if(result==0 && rval!=JSVAL_VOID) /* No error? Use script result */ - JS_ValueToInt32(js_cx,rval,&result); - return(result); } -- GitLab