-/* see copyright notice in squirrel.h */
-#include <squirrel.h>
-#include <sqstdaux.h>
-#include <assert.h>
-
-void sqstd_printcallstack(HSQUIRRELVM v)
-{
- SQPRINTFUNCTION pf = sq_getprintfunc(v);
- if(pf) {
- SQStackInfos si;
- SQInteger i;
- SQBool b;
- SQFloat f;
- const SQChar *s;
- SQInteger level=1; //1 is to skip this function that is level 0
- const SQChar *name=0;
- SQInteger seq=0;
- pf(v,_SC("\nCALLSTACK\n"));
- while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
- {
- const SQChar *fn=_SC("unknown");
- const SQChar *src=_SC("unknown");
- if(si.funcname)fn=si.funcname;
- if(si.source)src=si.source;
- pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);
- level++;
- }
- level=0;
- pf(v,_SC("\nLOCALS\n"));
-
- for(level=0;level<10;level++){
- seq=0;
- while((name = sq_getlocal(v,level,seq)))
- {
- seq++;
- switch(sq_gettype(v,-1))
- {
- case OT_NULL:
- pf(v,_SC("[%s] NULL\n"),name);
- break;
- case OT_INTEGER:
- sq_getinteger(v,-1,&i);
- pf(v,_SC("[%s] %d\n"),name,i);
- break;
- case OT_FLOAT:
- sq_getfloat(v,-1,&f);
- pf(v,_SC("[%s] %.14g\n"),name,f);
- break;
- case OT_USERPOINTER:
- pf(v,_SC("[%s] USERPOINTER\n"),name);
- break;
- case OT_STRING:
- sq_getstring(v,-1,&s);
- pf(v,_SC("[%s] \"%s\"\n"),name,s);
- break;
- case OT_TABLE:
- pf(v,_SC("[%s] TABLE\n"),name);
- break;
- case OT_ARRAY:
- pf(v,_SC("[%s] ARRAY\n"),name);
- break;
- case OT_CLOSURE:
- pf(v,_SC("[%s] CLOSURE\n"),name);
- break;
- case OT_NATIVECLOSURE:
- pf(v,_SC("[%s] NATIVECLOSURE\n"),name);
- break;
- case OT_GENERATOR:
- pf(v,_SC("[%s] GENERATOR\n"),name);
- break;
- case OT_USERDATA:
- pf(v,_SC("[%s] USERDATA\n"),name);
- break;
- case OT_THREAD:
- pf(v,_SC("[%s] THREAD\n"),name);
- break;
- case OT_CLASS:
- pf(v,_SC("[%s] CLASS\n"),name);
- break;
- case OT_INSTANCE:
- pf(v,_SC("[%s] INSTANCE\n"),name);
- break;
- case OT_WEAKREF:
- pf(v,_SC("[%s] WEAKREF\n"),name);
- break;
- case OT_BOOL:{
- sq_getbool(v,-1,&b);
- pf(v,_SC("[%s] %s\n"),name,b?_SC("true"):_SC("false"));
- }
- break;
- default: assert(0); break;
- }
- sq_pop(v,1);
- }
- }
- }
-}
-
-static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
-{
- SQPRINTFUNCTION pf = sq_getprintfunc(v);
- if(pf) {
- const SQChar *sErr = 0;
- if(sq_gettop(v)>=1) {
- if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
- pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);
- }
- else{
- pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));
- }
- sqstd_printcallstack(v);
- }
- }
- return 0;
-}
-
-void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)
-{
- SQPRINTFUNCTION pf = sq_getprintfunc(v);
- if(pf) {
- pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);
- }
-}
-
-void sqstd_seterrorhandlers(HSQUIRRELVM v)
-{
- sq_setcompilererrorhandler(v,_sqstd_compiler_error);
- sq_newclosure(v,_sqstd_aux_printerror,0);
- sq_seterrorhandler(v);
-}
+/* see copyright notice in squirrel.h */\r
+#include <squirrel.h>\r
+#include <sqstdaux.h>\r
+#include <assert.h>\r
+\r
+void sqstd_printcallstack(HSQUIRRELVM v)\r
+{\r
+ SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
+ if(pf) {\r
+ SQStackInfos si;\r
+ SQInteger i;\r
+ SQBool b;\r
+ SQFloat f;\r
+ const SQChar *s;\r
+ SQInteger level=1; //1 is to skip this function that is level 0\r
+ const SQChar *name=0; \r
+ SQInteger seq=0;\r
+ pf(v,_SC("\nCALLSTACK\n"));\r
+ while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))\r
+ {\r
+ const SQChar *fn=_SC("unknown");\r
+ const SQChar *src=_SC("unknown");\r
+ if(si.funcname)fn=si.funcname;\r
+ if(si.source)src=si.source;\r
+ pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);\r
+ level++;\r
+ }\r
+ level=0;\r
+ pf(v,_SC("\nLOCALS\n"));\r
+\r
+ for(level=0;level<10;level++){\r
+ seq=0;\r
+ while((name = sq_getlocal(v,level,seq)))\r
+ {\r
+ seq++;\r
+ switch(sq_gettype(v,-1))\r
+ {\r
+ case OT_NULL:\r
+ pf(v,_SC("[%s] NULL\n"),name);\r
+ break;\r
+ case OT_INTEGER:\r
+ sq_getinteger(v,-1,&i);\r
+ pf(v,_SC("[%s] %d\n"),name,i);\r
+ break;\r
+ case OT_FLOAT:\r
+ sq_getfloat(v,-1,&f);\r
+ pf(v,_SC("[%s] %.14g\n"),name,f);\r
+ break;\r
+ case OT_USERPOINTER:\r
+ pf(v,_SC("[%s] USERPOINTER\n"),name);\r
+ break;\r
+ case OT_STRING:\r
+ sq_getstring(v,-1,&s);\r
+ pf(v,_SC("[%s] \"%s\"\n"),name,s);\r
+ break;\r
+ case OT_TABLE:\r
+ pf(v,_SC("[%s] TABLE\n"),name);\r
+ break;\r
+ case OT_ARRAY:\r
+ pf(v,_SC("[%s] ARRAY\n"),name);\r
+ break;\r
+ case OT_CLOSURE:\r
+ pf(v,_SC("[%s] CLOSURE\n"),name);\r
+ break;\r
+ case OT_NATIVECLOSURE:\r
+ pf(v,_SC("[%s] NATIVECLOSURE\n"),name);\r
+ break;\r
+ case OT_GENERATOR:\r
+ pf(v,_SC("[%s] GENERATOR\n"),name);\r
+ break;\r
+ case OT_USERDATA:\r
+ pf(v,_SC("[%s] USERDATA\n"),name);\r
+ break;\r
+ case OT_THREAD:\r
+ pf(v,_SC("[%s] THREAD\n"),name);\r
+ break;\r
+ case OT_CLASS:\r
+ pf(v,_SC("[%s] CLASS\n"),name);\r
+ break;\r
+ case OT_INSTANCE:\r
+ pf(v,_SC("[%s] INSTANCE\n"),name);\r
+ break;\r
+ case OT_WEAKREF:\r
+ pf(v,_SC("[%s] WEAKREF\n"),name);\r
+ break;\r
+ case OT_BOOL:{\r
+ sq_getbool(v,-1,&b);\r
+ pf(v,_SC("[%s] %s\n"),name,b?_SC("true"):_SC("false"));\r
+ }\r
+ break;\r
+ default: assert(0); break;\r
+ }\r
+ sq_pop(v,1);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)\r
+{\r
+ SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
+ if(pf) {\r
+ const SQChar *sErr = 0;\r
+ if(sq_gettop(v)>=1) {\r
+ if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {\r
+ pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);\r
+ }\r
+ else{\r
+ pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));\r
+ }\r
+ sqstd_printcallstack(v);\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)\r
+{\r
+ SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
+ if(pf) {\r
+ pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);\r
+ }\r
+}\r
+\r
+void sqstd_seterrorhandlers(HSQUIRRELVM v)\r
+{\r
+ sq_setcompilererrorhandler(v,_sqstd_compiler_error);\r
+ sq_newclosure(v,_sqstd_aux_printerror,0);\r
+ sq_seterrorhandler(v);\r
+}\r