OSDN Git Service

c0a66b332d82529ed3b281e299334d04ced3a335
[unagi/old-svn-converted.git] / client / trunk / anago / squirrel_wrap.c
1 #include <assert.h>
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <stdbool.h>
5 #include <squirrel.h>
6 #include <sqstdio.h>
7 #include <sqstdaux.h>
8 #include "widget.h"
9
10 #ifdef SQUNICODE 
11 #define scvprintf vwprintf 
12 #else 
13 #define scvprintf vprintf 
14 #endif 
15 static void print_stdout(HSQUIRRELVM v, const SQChar *s, ...) 
16 {
17         va_list arglist;
18         va_start(arglist, s);
19         scvprintf(s, arglist);
20         va_end(arglist);
21 }
22
23 static void print_other(HSQUIRRELVM v, const SQChar *s, ...)
24 {
25         va_list arglist;
26         const struct textcontrol *p = (const struct textcontrol *) sq_getforeignptr(v);
27         va_start(arglist, s);
28
29         p->append_va(p->object, s, arglist);
30         va_end(arglist);
31 }
32
33 HSQUIRRELVM qr_open(const struct textcontrol *p)
34 {
35         HSQUIRRELVM v = sq_open(0x400);
36         sqstd_seterrorhandlers(v);
37         sqstd_register_iolib(v);
38         if(p == NULL){
39                 sq_setprintfunc(v, print_stdout);
40         }else{
41                 sq_setforeignptr(v, (SQUserPointer) p);
42                 sq_setprintfunc(v, print_other);
43         }
44         sq_pushroottable(v);
45         return v;
46 }
47
48 //SQInteger 
49 void qr_function_register_global(HSQUIRRELVM v, const char *name, SQFUNCTION f)
50 {
51         sq_pushroottable(v);
52         sq_pushstring(v, name, -1);
53         sq_newclosure(v, f, 0);
54         sq_createslot(v, -3); 
55         sq_pop(v, 1);
56 }
57
58 SQRESULT qr_call(HSQUIRRELVM v, const SQChar *functionname, SQUserPointer up, bool settop, int argnum, ...)
59 {
60         SQRESULT r = SQ_ERROR;
61         SQInteger top = sq_gettop(v);
62         sq_pushroottable(v);
63         sq_pushstring(v, _SC(functionname), -1);
64         if(SQ_SUCCEEDED(sq_get(v,-2))){
65                 int i;
66                 va_list ap;
67                 va_start(ap, argnum);
68                 sq_pushroottable(v);
69                 sq_pushuserpointer(v, up);
70                 for(i = 0; i < argnum; i++){
71                         sq_pushinteger(v, va_arg(ap, long));
72                 }
73                 r = sq_call(v, 2 + argnum, SQFalse, SQTrue); //calls the function 
74         }
75         if(settop == true){
76                 sq_settop(v, top); //restores the original stack size
77         }
78         return r;
79 }
80
81 void qr_close(HSQUIRRELVM v)
82 {
83         sq_pop(v, 1);
84         sq_close(v); 
85 }
86
87 static bool long_get(HSQUIRRELVM v, SQInteger index, long *d)
88 {
89         if(sq_gettype(v, index) != OT_INTEGER){
90                 return false;
91         }
92         SQInteger i;
93         if(SQ_FAILED(sq_getinteger(v, index, &i))){
94                 return false;
95         }
96         *d = (long) i;
97         return true;
98 }
99
100 SQRESULT qr_argument_get(HSQUIRRELVM v, SQInteger num, ...)
101 {
102         va_list ap;
103         if(sq_gettop(v) != (num + 2)){ //roottable, up, arguments...
104                 return sq_throwerror(v, "argument number error");
105         }
106         va_start(ap, num);
107         SQInteger i;
108         for(i = 0; i < num; i++){
109                 if(long_get(v, i + 3, va_arg(ap, long *)) == false){
110                         return sq_throwerror(v, "argument type error");
111                 }
112         }
113         return SQ_OK;
114 }
115
116 SQRESULT qr_userpointer_get(HSQUIRRELVM v, SQUserPointer *up)
117 {
118         SQRESULT r;
119         assert(sq_gettype(v, 2) == OT_USERPOINTER);
120         r = sq_getuserpointer(v, 2, up);
121         if(SQ_FAILED(r)){
122                 return sq_throwerror(v, "1st argument must be d (userpointer)");
123         }
124         return r;
125 }
126
127 void qr_version_print(const struct textcontrol *l)
128 {
129         l->append(l->object, SQUIRREL_VERSION " ");
130         l->append(l->object, SQUIRREL_COPYRIGHT "\n");
131 }