OSDN Git Service

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