OSDN Git Service

cartrdige script を管理開始 (なぜかやってなかった)
[unagi/old-svn-converted.git] / client / trunk / anago / flash_device.c
1 #include <assert.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <squirrel.h>
5 #include <sqstdio.h>
6 #include <sqstdaux.h>
7 #include "type.h"
8 #include "memory_manage.h"
9 #include "squirrel_wrap.h"
10 #include "flash_device.h"
11
12 static void call(HSQUIRRELVM v, const wgChar *devicename)
13 {
14         sq_pushroottable(v);
15         sq_pushstring(v, _SC("flash_device_get"), -1);
16         if(SQ_SUCCEEDED(sq_get(v,-2))){
17                 sq_pushroottable(v);
18                 sq_pushstring(v, devicename, -1);
19                 sq_call(v, 2, SQTrue, SQTrue);
20         }
21 }
22 static bool long_get(HSQUIRRELVM v, const wgChar *field, long *ret)
23 {
24         sq_pushstring(v, field, -1);
25         SQRESULT r = sq_get(v, -2);
26         if(r != SQ_OK){
27                 return false;
28         }
29         if(sq_gettype(v, -1) != OT_INTEGER){
30                 return false;
31         }
32         SQInteger i;
33         r = sq_getinteger(v, -1, &i);
34         if(r != SQ_OK){
35                 return false;
36         }
37         *ret = (long) i;
38         sq_pop(v, 1);
39         return true;
40 }
41 static bool bool_get(HSQUIRRELVM v, const wgChar *field, bool *ret)
42 {
43         sq_pushstring(v, field, -1);
44         SQRESULT r = sq_get(v, -2);
45         if(r != SQ_OK){
46                 return false;
47         }
48         if(sq_gettype(v, -1) != OT_BOOL){
49                 return false;
50         }
51         SQBool i;
52         r = sq_getbool(v, -1, &i);
53         if(r != SQ_OK){
54                 return false;
55         }
56         if(i == SQTrue){
57                 *ret = true;
58         }else{
59                 *ret = false;
60         }
61         sq_pop(v, 1);
62         return true;
63 }
64 bool flash_device_get(const wgChar *name, struct flash_device *t)
65 {
66         HSQUIRRELVM v = qr_open(NULL); 
67         if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
68                 qr_close(v);
69                 return false;
70         }
71         SQInteger top = sq_gettop(v);
72         call(v, name);
73         if(sq_gettype(v, -1) != OT_TABLE){
74                 goto field_error;
75         }
76         t->name = name;
77         if(long_get(v, _SC("capacity"), &t->capacity) == false){
78                 goto field_error;
79         }
80         if(long_get(v, _SC("pagesize"), &t->pagesize) == false){
81                 goto field_error;
82         }
83         if(long_get(v, _SC("erase_wait"), &t->erase_wait) == false){
84                 goto field_error;
85         }
86         if(bool_get(v, _SC("erase_require"), &t->erase_require) == false){
87                 goto field_error;
88         }
89         if(bool_get(v, _SC("retry"), &t->retry) == false){
90                 goto field_error;
91         }
92         if(long_get(v, _SC("command_mask"), &t->command_mask) == false){
93                 goto field_error;
94         }
95         long dd;
96         if(long_get(v, _SC("id_manufacurer"), &dd) == false){
97                 goto field_error;
98         }
99         t->id_manufacurer = dd;
100         if(long_get(v, _SC("id_device"), &dd) == false){
101                 goto field_error;
102         }
103         t->id_device = dd;
104         sq_settop(v, top);
105         qr_close(v);
106         return true;
107
108 field_error:
109 //      puts("script field error");
110         qr_close(v);
111         return false;
112 }
113
114 static int flash_device_number_get(HSQUIRRELVM v)
115 {
116         sq_pushroottable(v);
117         sq_pushstring(v, _SC("flash_device_number_get"), -1);
118         if(SQ_SUCCEEDED(sq_get(v,-2))){
119                 sq_pushroottable(v);
120                 SQRESULT r = sq_call(v, 1, SQTrue, SQTrue);
121                 assert(r == SQ_OK);
122                 r++;
123         }
124         if(sq_gettype(v, -1) != OT_INTEGER){
125                 return 0;
126         }
127         SQInteger i;
128         if(SQ_FAILED(sq_getinteger(v, -1, &i))){
129                 return 0;
130         }
131         return i;
132 }
133
134 static int flash_device_name_get(HSQUIRRELVM v, int index, const wgChar **str)
135 {
136         sq_pushroottable(v);
137         sq_pushstring(v, _SC("flash_device_name_get"), -1);
138         if(SQ_SUCCEEDED(sq_get(v,-2))){
139                 sq_pushroottable(v);
140                 sq_pushinteger(v, index);
141                 SQRESULT r = sq_call(v, 2, SQTrue, SQTrue);
142                 assert(r == SQ_OK);
143                 r++;
144         }
145         if(sq_gettype(v, -1) != OT_STRING){
146                 return 0;
147         }
148         if(SQ_FAILED(sq_getstring(v, -1, str))){
149                 return 0;
150         }
151         return 1;
152 }
153
154 #ifdef _UNICODE
155   #define STRNCMP wcsncmp
156 #else
157   #define STRNCMP strncmp
158 #endif
159 void flash_device_listup(struct flash_listup *t)
160 {
161         const wgChar *str;
162         HSQUIRRELVM v = qr_open(NULL);
163         SQInteger top = sq_gettop(v);
164
165         if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
166 //              puts("flash device script error");
167                 qr_close(v);
168                 return;
169         }
170
171         int i;
172         const int device_num = flash_device_number_get(v);
173         sq_settop(v, top);
174
175         for(i = 0; i < device_num; i++){
176                 flash_device_name_get(v, i, &str);
177                 if(STRNCMP(str, _SC("dummy"), 6) != 0){
178                         t->append(t->obj_cpu, str);
179                         t->append(t->obj_ppu, str);
180                 }
181                 sq_settop(v, top);
182         }
183
184         qr_close(v);
185         v = NULL;
186 }