OSDN Git Service

skip 表示を修正, squirrel の呼び出しバグを修正
[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                 int i;
67                 va_list ap;
68                 va_start(ap, argnum);
69                 sq_pushroottable(v);
70                 sq_pushuserpointer(v, up);
71                 sq_pushstring(v, scriptfile, -1);
72                 for(i = 0; i < argnum; i++){
73                         sq_pushinteger(v, va_arg(ap, long));
74                 }
75                 r = sq_call(v, 3 + argnum, SQFalse, SQTrue); //calls the function 
76         }
77         sq_settop(v, top); //restores the original stack size
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, _SC("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, _SC("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, _SC("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 _SC(" "));
130         l->append(l->object, SQUIRREL_COPYRIGHT _SC("\n"));
131 }