OSDN Git Service

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@14 47198e57-cb75-475f-84c4-a814cd6...
[mimic/MiMicSDK.git] / lib / src / mimicvm / NyLPC_cMiMicDbCompiler.c
1 #include "NyLPC_mimicvm_utils_protected.h"\r
2 #include "NyLPC_cMiMicDbCompiler.h"\r
3 \r
4 \r
5 \r
6 void NyLPC_cMiMicDbCompiler_initialize(NyLPC_TcMiMicDbCompiler_t* i_inst)\r
7 {\r
8         i_inst->_bc_fragment_len=0;\r
9 }\r
10 \r
11 /**\r
12  * この関数は、MiMicDBのフラグメントをコンパイルします。\r
13  * @param o_parsed_len\r
14  * 変換した文字列の長さ。\r
15  * @return\r
16  * ステータスを返す。\r
17  */\r
18 NyLPC_TcMiMicDbCompiler_RET NyLPC_cMiMicDbCompiler_compileFragment(NyLPC_TcMiMicDbCompiler_t* i_inst,const struct NyLPC_TCharArrayPtr* i_bc,NyLPC_TUInt32* o_val,NyLPC_TUInt16* o_parsed_bc)\r
19 {\r
20         int i;\r
21         NyLPC_TUInt8 c=i_inst->_bc_fragment_len;\r
22         if(c==0 && i_bc->len>=8){\r
23                 //キャッシュ0でソースが十分あるときは直接変換\r
24                 if(NyLPC_mimicvm_txt2UInt(i_bc->ptr,8,o_val)){\r
25                         *o_parsed_bc=8;\r
26                         return NyLPC_TcMiMicDbCompiler_RET_OK;\r
27                 }else{\r
28                         i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FORMAT;\r
29                         return NyLPC_TcMiMicDbCompiler_RET_ERROR;\r
30                 }\r
31         }else{\r
32                 //キャッシュが0でなければ、パディングして変換\r
33                 for(i=0;i<i_bc->len;i++){\r
34                         i_inst->_tmp[c]=i_bc->ptr[i];\r
35                         c++;\r
36                         //8個のバイトコードが溜まったら変換\r
37                         if(c==8){\r
38                                 i_inst->_bc_fragment_len=0;\r
39                                 if(NyLPC_mimicvm_txt2UInt(i_inst->_tmp,8,o_val)){\r
40                                         *o_parsed_bc=i+1;//見チェック\r
41                                         return NyLPC_TcMiMicDbCompiler_RET_OK;\r
42                                 }else{\r
43                                         i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FORMAT;\r
44                                         return NyLPC_TcMiMicDbCompiler_RET_ERROR;\r
45                                 }\r
46                         }\r
47                 }\r
48                 i_inst->_bc_fragment_len=c;\r
49                 *o_parsed_bc=i_bc->len;\r
50                 return NyLPC_TcMiMicDbCompiler_RET_CONTINUE;\r
51         }\r
52 }\r
53 /**\r
54  * MiMicDBフラグメントを1文字パースします。\r
55  */\r
56 NyLPC_TcMiMicDbCompiler_RET NyLPC_cMiMicDbCompiler_compileFragment2(NyLPC_TcMiMicDbCompiler_t* i_inst,NyLPC_TChar i_bc,NyLPC_TUInt32* o_val)\r
57 {\r
58         struct NyLPC_TCharArrayPtr bc;\r
59         NyLPC_TUInt16 l;\r
60         bc.ptr=&i_bc;\r
61         bc.len=1;\r
62         return NyLPC_cMiMicDbCompiler_compileFragment(i_inst,&bc,o_val,&l);\r
63 }\r
64 \r
65 /**\r
66  * 複数の数値を一括して変換する。テストしえてないから注意な。\r
67  * @return\r
68  * 0   - エラー。変換エラーが発生した。\r
69  * 0<n - 成功。o_valに出力したデータの数\r
70  */\r
71 NyLPC_TUInt16 NyLPC_cMiMicDbCompiler_compile(NyLPC_TcMiMicDbCompiler_t* i_inst,const struct NyLPC_TCharArrayPtr* i_bc,struct NyLPC_TUInt32ArrayPtr* o_val)\r
72 {\r
73         struct NyLPC_TUInt32ArrayPtr wp=*o_val;\r
74         struct NyLPC_TCharArrayPtr rp=*i_bc;\r
75         NyLPC_TUInt16 s;\r
76         NyLPC_Assert(i_bc->len>0);\r
77         while(i_bc->len>0){\r
78                 //空き領域チェック\r
79                 if(wp.len==0){\r
80                         //空き領域不足\r
81                         i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_OUT_BUFFER_TOO_SHORT;\r
82                         return 0;\r
83                 }\r
84                 switch(NyLPC_cMiMicDbCompiler_compileFragment(i_inst,&rp,o_val->ptr,&s)){\r
85                 case NyLPC_TcMiMicDbCompiler_RET_OK:\r
86                         //入力ポインタの移動\r
87                         NyLPC_TCharArrayPtr_seek(&rp,s);\r
88                         //出力ポインタの移動\r
89                         NyLPC_TUInt32ArrayPtr_seek(&wp,1);\r
90                         continue;\r
91                 case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:\r
92                         //フラグメント化してたらエラー\r
93                         i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FRAGMENT_UNIT;\r
94                 default:\r
95                         return 0;\r
96                 }\r
97         }\r
98         //変換完了\r
99         return o_val->len-wp.len;\r
100 }\r
101 \r
102 \r
103 #define TEST\r
104 #ifndef TEST\r
105 void main(void)\r
106 {\r
107         int i=0;\r
108         struct NyLPC_TCharArrayPtr bc;\r
109         const char* BC="0000000100000002";\r
110         const char* rp;\r
111         NyLPC_TcMiMicDbCompiler_t inst;\r
112         NyLPC_TUInt32 obuf[1024];\r
113         NyLPC_TUInt16 pl;\r
114         NyLPC_cMiMicDbCompiler_initialize(&inst);\r
115         bc.ptr=(char*)BC;\r
116         bc.len=strlen(BC);\r
117         rp=BC;\r
118         NyLPC_cMiMicDbCompiler_compileFragment(&inst,&bc,obuf,&pl);\r
119 /*\r
120         for(;;){\r
121                 switch(NyLPC_cMiMicDbCompiler_compileFragment2(&inst,*bc.ptr,&obuf[i]))\r
122                 {\r
123                 case NyLPC_TcMiMicDbCompiler_RET_ERROR:\r
124                         printf("ERROR");\r
125                         return;\r
126                 case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:\r
127                         NyLPC_TCharArrayPtr_seek(&bc,1);\r
128                         break;\r
129                 case NyLPC_TcMiMicDbCompiler_RET_OK:\r
130                         i++;\r
131                         NyLPC_TCharArrayPtr_seek(&bc,1);\r
132                         break;\r
133                 }\r
134         }\r
135 */\r
136         return;\r
137 }\r
138 #endif\r