5b8763990c31a125cb73e1169fbda72008b59747
[supertux.git] / external / squirrel / sqstdlib / sqstdaux.cpp
1 /* see copyright notice in squirrel.h */\r
2 #include <squirrel.h>\r
3 #include <sqstdaux.h>\r
4 #include <assert.h>\r
5 \r
6 void sqstd_printcallstack(HSQUIRRELVM v)\r
7 {\r
8         SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
9         if(pf) {\r
10                 SQStackInfos si;\r
11                 SQInteger i;\r
12                 SQBool b;\r
13                 SQFloat f;\r
14                 const SQChar *s;\r
15                 SQInteger level=1; //1 is to skip this function that is level 0\r
16                 const SQChar *name=0; \r
17                 SQInteger seq=0;\r
18                 pf(v,_SC("\nCALLSTACK\n"));\r
19                 while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))\r
20                 {\r
21                         const SQChar *fn=_SC("unknown");\r
22                         const SQChar *src=_SC("unknown");\r
23                         if(si.funcname)fn=si.funcname;\r
24                         if(si.source)src=si.source;\r
25                         pf(v,_SC("*FUNCTION [%s()] %s line [%d]\n"),fn,src,si.line);\r
26                         level++;\r
27                 }\r
28                 level=0;\r
29                 pf(v,_SC("\nLOCALS\n"));\r
30 \r
31                 for(level=0;level<10;level++){\r
32                         seq=0;\r
33                         while((name = sq_getlocal(v,level,seq)))\r
34                         {\r
35                                 seq++;\r
36                                 switch(sq_gettype(v,-1))\r
37                                 {\r
38                                 case OT_NULL:\r
39                                         pf(v,_SC("[%s] NULL\n"),name);\r
40                                         break;\r
41                                 case OT_INTEGER:\r
42                                         sq_getinteger(v,-1,&i);\r
43                                         pf(v,_SC("[%s] %d\n"),name,i);\r
44                                         break;\r
45                                 case OT_FLOAT:\r
46                                         sq_getfloat(v,-1,&f);\r
47                                         pf(v,_SC("[%s] %.14g\n"),name,f);\r
48                                         break;\r
49                                 case OT_USERPOINTER:\r
50                                         pf(v,_SC("[%s] USERPOINTER\n"),name);\r
51                                         break;\r
52                                 case OT_STRING:\r
53                                         sq_getstring(v,-1,&s);\r
54                                         pf(v,_SC("[%s] \"%s\"\n"),name,s);\r
55                                         break;\r
56                                 case OT_TABLE:\r
57                                         pf(v,_SC("[%s] TABLE\n"),name);\r
58                                         break;\r
59                                 case OT_ARRAY:\r
60                                         pf(v,_SC("[%s] ARRAY\n"),name);\r
61                                         break;\r
62                                 case OT_CLOSURE:\r
63                                         pf(v,_SC("[%s] CLOSURE\n"),name);\r
64                                         break;\r
65                                 case OT_NATIVECLOSURE:\r
66                                         pf(v,_SC("[%s] NATIVECLOSURE\n"),name);\r
67                                         break;\r
68                                 case OT_GENERATOR:\r
69                                         pf(v,_SC("[%s] GENERATOR\n"),name);\r
70                                         break;\r
71                                 case OT_USERDATA:\r
72                                         pf(v,_SC("[%s] USERDATA\n"),name);\r
73                                         break;\r
74                                 case OT_THREAD:\r
75                                         pf(v,_SC("[%s] THREAD\n"),name);\r
76                                         break;\r
77                                 case OT_CLASS:\r
78                                         pf(v,_SC("[%s] CLASS\n"),name);\r
79                                         break;\r
80                                 case OT_INSTANCE:\r
81                                         pf(v,_SC("[%s] INSTANCE\n"),name);\r
82                                         break;\r
83                                 case OT_WEAKREF:\r
84                                         pf(v,_SC("[%s] WEAKREF\n"),name);\r
85                                         break;\r
86                                 case OT_BOOL:{\r
87                                         sq_getbool(v,-1,&b);\r
88                                         pf(v,_SC("[%s] %s\n"),name,b?_SC("true"):_SC("false"));\r
89                                                          }\r
90                                         break;\r
91                                 default: assert(0); break;\r
92                                 }\r
93                                 sq_pop(v,1);\r
94                         }\r
95                 }\r
96         }\r
97 }\r
98 \r
99 static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)\r
100 {\r
101         SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
102         if(pf) {\r
103                 const SQChar *sErr = 0;\r
104                 if(sq_gettop(v)>=1) {\r
105                         if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr)))       {\r
106                                 pf(v,_SC("\nAN ERROR HAS OCCURED [%s]\n"),sErr);\r
107                         }\r
108                         else{\r
109                                 pf(v,_SC("\nAN ERROR HAS OCCURED [unknown]\n"));\r
110                         }\r
111                         sqstd_printcallstack(v);\r
112                 }\r
113         }\r
114         return 0;\r
115 }\r
116 \r
117 void _sqstd_compiler_error(HSQUIRRELVM v,const SQChar *sErr,const SQChar *sSource,SQInteger line,SQInteger column)\r
118 {\r
119         SQPRINTFUNCTION pf = sq_getprintfunc(v);\r
120         if(pf) {\r
121                 pf(v,_SC("%s line = (%d) column = (%d) : error %s\n"),sSource,line,column,sErr);\r
122         }\r
123 }\r
124 \r
125 void sqstd_seterrorhandlers(HSQUIRRELVM v)\r
126 {\r
127         sq_setcompilererrorhandler(v,_sqstd_compiler_error);\r
128         sq_newclosure(v,_sqstd_aux_printerror,0);\r
129         sq_seterrorhandler(v);\r
130 }\r