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