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