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