8b67d344fcceb95a5985309fd23e20962a107e24
[supertux.git] / src / scripting / wrapper_util.cpp
1 #include <config.h>
2
3 #include <stdexcept>
4 #include <sstream>
5 #include "wrapper_util.hpp"
6
7 void print_squirrel_stack(HSQUIRRELVM v)
8 {
9     printf("--------------------------------------------------------------\n");
10     int count = sq_gettop(v);
11     for(int i = 1; i <= count; ++i) {
12         printf("%d: ",i);
13         switch(sq_gettype(v, i))
14         {
15             case OT_NULL:
16                 printf("null");        
17                 break;
18             case OT_INTEGER: {
19                 int val;
20                 sq_getinteger(v, i, &val);
21                 printf("integer (%d)", val);
22                 break;
23             }
24             case OT_FLOAT: {
25                 float val;
26                 sq_getfloat(v, i, &val);
27                 printf("float (%f)", val);
28                 break;
29             }
30             case OT_STRING: {
31                 const char* val;
32                 sq_getstring(v, i, &val);
33                 printf("string (%s)", val);
34                 break;    
35             }
36             case OT_TABLE:
37                 printf("table");
38                 break;
39             case OT_ARRAY:
40                 printf("array");
41                 break;
42             case OT_USERDATA:
43                 printf("userdata");
44                 break;
45             case OT_CLOSURE:        
46                 printf("closure(function)");    
47                 break;
48             case OT_NATIVECLOSURE:
49                 printf("native closure(C function)");
50                 break;
51             case OT_GENERATOR:
52                 printf("generator");
53                 break;
54             case OT_USERPOINTER:
55                 printf("userpointer");
56                 break;
57             case OT_THREAD:
58                 printf("thread");
59                 break;
60             case OT_CLASS:
61                 printf("class");
62                 break;
63             case OT_INSTANCE:
64                 printf("instance");
65                 break;
66             default:
67                 printf("unknown?!?");
68                 break;
69         }
70         printf("\n");
71     }
72     printf("--------------------------------------------------------------\n");
73 }
74
75 //----------------------------------------------------------------------------
76
77 SquirrelError::SquirrelError(HSQUIRRELVM v, const std::string& message) throw()
78 {
79   std::ostringstream msg;
80   msg << "SQuirrel error: " << message << " (";
81   const char* lasterr;
82   sq_getlasterror(v);
83   if(sq_gettype(v, -1) != OT_STRING) {
84     lasterr = "no error info";
85   } else {
86     sq_getstring(v, -1, &lasterr);
87   }
88   sq_pop(v, 1);
89   msg << lasterr << ")";
90   this->message = msg.str();
91 }
92
93 SquirrelError::~SquirrelError() throw()
94 {}
95
96 const char*
97 SquirrelError::what() const throw()
98 {
99   return message.c_str();
100 }