Преглед изворни кода

If the script has a function called main call it like C/C++ does

mingodad пре 9 година
родитељ
комит
a159ef9c15
1 измењених фајлова са 30 додато и 5 уклоњено
  1. 30 5
      SquiLu/sq/sq.c

+ 30 - 5
SquiLu/sq/sq.c

@@ -66,8 +66,12 @@ 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 push_program_args(HSQUIRRELVM v,SQInteger arg, SQInteger argc, char* argv[], int asArray){
     SQInteger i, callargs = 0;
+    if(asArray)
+    {
+        sq_newarray(v, 0);
+    }
     for(i=arg;i<argc;i++)
     {
         const SQChar *a;
@@ -80,6 +84,7 @@ SQInteger push_program_args(HSQUIRRELVM v,SQInteger arg, SQInteger argc, char* a
         a=argv[i];
 #endif
         sq_pushstring(v,a,-1);
+        if(asArray) sq_arrayappend(v, -2);
         callargs++;
         //sq_arrayappend(v,-2);
     }
@@ -111,7 +116,7 @@ void loadDefaultScript(HSQUIRRELVM v, const char *script)
     if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, strlen(srcBoot), _SC("defaultScript"), SQTrue, SQTrue))) {
         int callargs = 1;
         sq_pushroottable(v);
-        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv);
+        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
         sq_call(v, callargs,SQFalse, SQTrue);
     }
 }
@@ -239,13 +244,33 @@ 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);
-					callargs += push_program_args(v, arg, argc, argv);
+					callargs += push_program_args(v, arg, argc, argv, 0);
 					if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
 						SQObjectType type = sq_gettype(v,-1);
 						if(type == OT_INTEGER) {
 							*retval = type;
 							sq_getinteger(v,-1,retval);
 						}
+						//if there is a function called "main" we call it like in C/C++
+						sq_pushliteral(v, _SC("main"));
+						if(sq_getonroottable(v) == SQ_OK)
+                        {
+                            if(sq_gettype(v, -1) == OT_CLOSURE)
+                            {
+                                sq_pushroottable(v);
+                                sq_pushinteger(v, 1);
+                                callargs = push_program_args(v, arg, argc, argv, 1);
+                                sq_pushinteger(v, callargs);
+                                sq_replace(v, -3);
+                                if(SQ_SUCCEEDED(sq_call(v,3,SQTrue,SQTrue))) {
+                                    SQObjectType type = sq_gettype(v,-1);
+                                    if(type == OT_INTEGER) {
+                                        *retval = type;
+                                        sq_getinteger(v,-1,retval);
+                                    }
+                                }
+                            }
+                        }
 						return _DONE;
 					}
 					else{
@@ -427,7 +452,7 @@ static SQInteger LoadFrozenScript0(HSQUIRRELVM v, const SQChar* filename, int on
     if(SQ_SUCCEEDED(sq_compilebuffer(v,script, script_len, _SC("frozenScript"), SQTrue))) {
         int callargs = 1;
         sq_pushroottable(v);
-        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv);
+        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
         if(SQ_SUCCEEDED(sq_call(v,callargs,SQTrue,SQTrue))) {
             SQObjectType type = sq_gettype(v,-1);
             if(type == OT_INTEGER) {
@@ -514,7 +539,7 @@ static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int onl
     if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue))) {
         int callargs = 1;
         sq_pushroottable(v);
-        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv);
+        callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
         if(SQ_SUCCEEDED(sq_call(v, callargs,SQFalse, SQTrue))) {
             return _DONE;
         }