Jelajahi Sumber

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 tahun lalu
induk
melakukan
3c97680a1d
1 mengubah file dengan 32 tambahan dan 38 penghapusan
  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()
 {
 	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()
@@ -153,7 +173,7 @@ int getargs(HSQUIRRELVM v,int argc, char* argv[],SQInteger *retval)
 			filename=argv[arg];
 #endif
 
-			arg++;
+			//arg++; //commenting this line to pass the script filename as first parameter in vargv
 
 			//sq_pushstring(v,_SC("ARGS"),-1);
 			//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))) {
 					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))) {
 						SQObjectType type = sq_gettype(v,-1);
 						if(type == OT_INTEGER) {
@@ -400,23 +406,9 @@ static SQInteger LoadFrozenScript0(HSQUIRRELVM v, const SQChar* filename, int on
     //fclose(f);
 
     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))) {
             SQObjectType type = sq_gettype(v,-1);
             if(type == OT_INTEGER) {
@@ -486,14 +478,16 @@ static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int onl
     }
 
     fclose(f);
-    SQChar srcBoot[192];
+    SQChar srcBoot[256];
     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);
 
     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;
         }
         else{