OSDN Git Service

gui をレイアウトを整理、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 char *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, _SC(devicename), -1);
19                 SQRESULT r = sq_call(v, 2, SQTrue, SQTrue);
20                 assert(r == SQ_OK);
21                 r++; //avoid warning unused variable with -DNDEBUG
22         }
23 }
24 static bool long_get(HSQUIRRELVM v, const char *field, long *ret)
25 {
26         sq_pushstring(v, _SC(field), -1);
27         SQRESULT r = sq_get(v, -2);
28         if(r != SQ_OK){
29                 return false;
30         }
31         if(sq_gettype(v, -1) != OT_INTEGER){
32                 return false;
33         }
34         SQInteger i;
35         r = sq_getinteger(v, -1, &i);
36         if(r != SQ_OK){
37                 return false;
38         }
39         *ret = (long) i;
40         sq_pop(v, 1);
41         return true;
42 }
43 static bool bool_get(HSQUIRRELVM v, const char *field, bool *ret)
44 {
45         sq_pushstring(v, _SC(field), -1);
46         SQRESULT r = sq_get(v, -2);
47         if(r != SQ_OK){
48                 return false;
49         }
50         if(sq_gettype(v, -1) != OT_BOOL){
51                 return false;
52         }
53         SQBool i;
54         r = sq_getbool(v, -1, &i);
55         if(r != SQ_OK){
56                 return false;
57         }
58         if(i == SQTrue){
59                 *ret = true;
60         }else{
61                 *ret = false;
62         }
63         sq_pop(v, 1);
64         return true;
65 }
66 bool flash_device_get(const char *name, struct flash_device *t)
67 {
68         HSQUIRRELVM v = qr_open(NULL); 
69         if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
70                 puts("flash device script error");
71                 qr_close(v);
72                 return false;
73         }
74         SQInteger top = sq_gettop(v);
75         call(v, name);
76         if(sq_gettype(v, -1) != OT_TABLE){
77                 goto field_error;
78         }
79         t->name = name;
80         if(long_get(v, "capacity", &t->capacity) == false){
81                 goto field_error;
82         }
83         if(long_get(v, "pagesize", &t->pagesize) == false){
84                 goto field_error;
85         }
86         if(long_get(v, "erase_wait", &t->erase_wait) == false){
87                 goto field_error;
88         }
89         if(bool_get(v, "erase_require", &t->erase_require) == false){
90                 goto field_error;
91         }
92         if(bool_get(v, "retry", &t->retry) == false){
93                 goto field_error;
94         }
95         if(long_get(v, "command_mask", &t->command_mask) == false){
96                 goto field_error;
97         }
98         long dd;
99         if(long_get(v, "id_manufacurer", &dd) == false){
100                 goto field_error;
101         }
102         t->id_manufacurer = dd;
103         if(long_get(v, "id_device", &dd) == false){
104                 goto field_error;
105         }
106         t->id_device = dd;
107         sq_settop(v, top);
108         qr_close(v);
109         return true;
110
111 field_error:
112         puts("script field error");
113         qr_close(v);
114         return false;
115 }
116
117 static int flash_device_number_get(HSQUIRRELVM v)
118 {
119         sq_pushroottable(v);
120         sq_pushstring(v, _SC("flash_device_number_get"), -1);
121         if(SQ_SUCCEEDED(sq_get(v,-2))){
122                 sq_pushroottable(v);
123                 SQRESULT r = sq_call(v, 1, SQTrue, SQTrue);
124                 assert(r == SQ_OK);
125                 r++;
126         }
127         if(sq_gettype(v, -1) != OT_INTEGER){
128                 return 0;
129         }
130         SQInteger i;
131         if(SQ_FAILED(sq_getinteger(v, -1, &i))){
132                 return 0;
133         }
134         return i;
135 }
136
137 static int flash_device_name_get(HSQUIRRELVM v, int index, const char **str)
138 {
139         sq_pushroottable(v);
140         sq_pushstring(v, _SC("flash_device_name_get"), -1);
141         if(SQ_SUCCEEDED(sq_get(v,-2))){
142                 sq_pushroottable(v);
143                 sq_pushinteger(v, index);
144                 SQRESULT r = sq_call(v, 2, SQTrue, SQTrue);
145                 assert(r == SQ_OK);
146                 r++;
147         }
148         if(sq_gettype(v, -1) != OT_STRING){
149                 return 0;
150         }
151         if(SQ_FAILED(sq_getstring(v, -1, str))){
152                 return 0;
153         }
154         return 1;
155 }
156
157 void flash_device_listup(struct flash_listup *t)
158 {
159         const char *str;
160         HSQUIRRELVM v = qr_open(NULL);
161         SQInteger top = sq_gettop(v);
162
163         if(SQ_FAILED(sqstd_dofile(v, _SC("flashdevice.nut"), SQFalse, SQTrue))){
164 //              puts("flash device script error");
165                 qr_close(v);
166                 return;
167         }
168
169         int i;
170         const int device_num = flash_device_number_get(v);
171         sq_settop(v, top);
172
173         for(i = 0; i < device_num; i++){
174                 flash_device_name_get(v, i, &str);
175                 if(strncmp(str, "dummy", 6) != 0){
176                         t->append(t->obj_cpu, str);
177                         t->append(t->obj_ppu, str);
178                 }
179                 sq_settop(v, top);
180         }
181
182         qr_close(v);
183         v = NULL;
184 }