瀏覽代碼

Introduce an incompatibility change on vargv for the main script, now it allways contain the script name at index 0.
So any script that used to test "vargv.len()" should be revised.

mingodad 13 年之前
父節點
當前提交
3c97680a1d
共有 1 個文件被更改,包括 32 次插入38 次删除
  1. 32 38
      SquiLu/sq/sq.c

+ 32 - 38
SquiLu/sq/sq.c

@@ -69,6 +69,26 @@ void errorfunc(HSQUIRRELVM v,const SQChar *s,...)
 void PrintVersionInfos()
 void PrintVersionInfos()
 {
 {
 	scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8)));
 	scfprintf(stdout,_SC("%s %s (%d bits)\n"),SQUIRREL_VERSION,SQUIRREL_COPYRIGHT,((int)(sizeof(SQInteger)*8)));
+}
+
+SQInteger push_program_args(HSQUIRRELVM v,SQInteger arg, SQInteger argc, char* argv[]){
+    SQInteger i, callargs = 0;
+    for(i=arg;i<argc;i++)
+    {
+        const SQChar *a;
+#ifdef SQUNICODE
+        int alen=(int)strlen(argv[i]);
+        a=sq_getscratchpad(v,(int)(alen*sizeof(SQChar)));
+        mbstowcs(sq_getscratchpad(v,-1),argv[i],alen);
+        sq_getscratchpad(v,-1)[alen] = _SC('\0');
+#else
+        a=argv[i];
+#endif
+        sq_pushstring(v,a,-1);
+        callargs++;
+        //sq_arrayappend(v,-2);
+    }
+    return callargs;
 }
 }
 
 
 void PrintUsage()
 void PrintUsage()
@@ -153,7 +173,7 @@ int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval)
 			filename=argv[arg];
 			filename=argv[arg];
 #endif
 #endif
 
 
-			arg++;
+			//arg++; //commenting this line to pass the script filename as first parameter in vargv
 
 
 			//sq_pushstring(v,_SC("ARGS"),-1);
 			//sq_pushstring(v,_SC("ARGS"),-1);
 			//sq_newarray(v,0);
 			//sq_newarray(v,0);
@@ -198,22 +218,8 @@ int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval)
 				//}
 				//}
 				if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue,SQTrue))) {
 				if(SQ_SUCCEEDED(sqstd_loadfile(v,filename,SQTrue,SQTrue))) {
 					int callargs = 1;
 					int callargs = 1;
-					sq_pushroottable(v);
-					for(i=arg;i<argc;i++)
-					{
-						const SQChar *a;
-#ifdef SQUNICODE
-						int alen=(int)strlen(argv[i]);
-						a=sq_getscratchpad(v,(int)(alen*sizeof(SQChar)));
-						mbstowcs(sq_getscratchpad(v,-1),argv[i],alen);
-						sq_getscratchpad(v,-1)[alen] = _SC('\0');
-#else
-						a=argv[i];
-#endif
-						sq_pushstring(v,a,-1);
-						callargs++;
-						//sq_arrayappend(v,-2);
-					}
+					sq_pushroottable(v);
+					callargs += push_program_args(v, arg, argc, argv);
 					if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
 					if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
 						SQObjectType type = sq_gettype(v,-1);
 						SQObjectType type = sq_gettype(v,-1);
 						if(type == OT_INTEGER) {
 						if(type == OT_INTEGER) {
@@ -400,23 +406,9 @@ static SQInteger LoadFrozenScript0(HSQUIRRELVM v, const SQChar* filename, int on
     //fclose(f);
     //fclose(f);
 
 
     if(SQ_SUCCEEDED(sq_compilebuffer(v,script, script_len, _SC("frozenScript"), SQTrue))) {
     if(SQ_SUCCEEDED(sq_compilebuffer(v,script, script_len, _SC("frozenScript"), SQTrue))) {
-        int i, callargs = 1;
-        sq_pushroottable(v);
-        for(i=0;i<sq_main_argc;i++)
-        {
-            const SQChar *a;
-#ifdef SQUNICODE
-            int alen=(int)strlen(sq_main_argv[i]);
-            a=sq_getscratchpad(v,(int)(alen*sizeof(SQChar)));
-            mbstowcs(sq_getscratchpad(v,-1),sq_main_argv[i],alen);
-            sq_getscratchpad(v,-1)[alen] = _SC('\0');
-#else
-            a=sq_main_argv[i];
-#endif
-            sq_pushstring(v,a,-1);
-            callargs++;
-            //sq_arrayappend(v,-2);
-        }
+        int callargs = 1;
+        sq_pushroottable(v);
+        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv);
         if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
         if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
             SQObjectType type = sq_gettype(v,-1);
             SQObjectType type = sq_gettype(v,-1);
             if(type == OT_INTEGER) {
             if(type == OT_INTEGER) {
@@ -486,14 +478,16 @@ static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int onl
     }
     }
 
 
     fclose(f);
     fclose(f);
-    SQChar srcBoot[192];
+    SQChar srcBoot[256];
     SQInteger scr_len = scsnprintf(srcBoot, sizeof(srcBoot),
     SQInteger scr_len = scsnprintf(srcBoot, sizeof(srcBoot),
-            _SC("local __fd=file(\"%s\", \"rb\");__fd.seek(%d, 'b');local __zsrc=__fd.read(%d);__fd.close();__zsrc=compilestring(zlib.inflate(__zsrc),\"zsrc\",false);__zsrc();"),
+            _SC("local __fd=file(\"%s\", \"rb\");__fd.seek(%d, 'b');local __zsrc=__fd.read(%d);__fd.close();__zsrc=compilestring(zlib.inflate(__zsrc),\"zsrc\",false);__zsrc.acall2(this, vargv);"),
             filename, fileSize-END_TAG_LEN - script_len, script_len);
             filename, fileSize-END_TAG_LEN - script_len, script_len);
 
 
     if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue))) {
     if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue))) {
-        sq_pushroottable(v);
-        if(SQ_SUCCEEDED(sq_call(v, 1,SQFalse, SQTrue))) {
+        int callargs = 1;
+        sq_pushroottable(v);
+        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv);
+        if(SQ_SUCCEEDED(sq_call(v, callargs,SQFalse, SQTrue))) {
             return _DONE;
             return _DONE;
         }
         }
         else{
         else{