1 #include "NyLPC_mimicvm_utils_protected.h"
\r
2 #include "NyLPC_cMiMicDbCompiler.h"
\r
6 void NyLPC_cMiMicDbCompiler_initialize(NyLPC_TcMiMicDbCompiler_t* i_inst)
\r
8 i_inst->_bc_fragment_len=0;
\r
12 * この関数は、MiMicDBのフラグメントをコンパイルします。
\r
13 * @param o_parsed_len
\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
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
26 return NyLPC_TcMiMicDbCompiler_RET_OK;
\r
28 i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FORMAT;
\r
29 return NyLPC_TcMiMicDbCompiler_RET_ERROR;
\r
32 //キャッシュが0でなければ、パディングして変換
\r
33 for(i=0;i<i_bc->len;i++){
\r
34 i_inst->_tmp[c]=i_bc->ptr[i];
\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
43 i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FORMAT;
\r
44 return NyLPC_TcMiMicDbCompiler_RET_ERROR;
\r
48 i_inst->_bc_fragment_len=c;
\r
49 *o_parsed_bc=i_bc->len;
\r
50 return NyLPC_TcMiMicDbCompiler_RET_CONTINUE;
\r
54 * MiMicDBフラグメントを1文字パースします。
\r
56 NyLPC_TcMiMicDbCompiler_RET NyLPC_cMiMicDbCompiler_compileFragment2(NyLPC_TcMiMicDbCompiler_t* i_inst,NyLPC_TChar i_bc,NyLPC_TUInt32* o_val)
\r
58 struct NyLPC_TCharArrayPtr bc;
\r
62 return NyLPC_cMiMicDbCompiler_compileFragment(i_inst,&bc,o_val,&l);
\r
66 * 複数の数値を一括して変換する。テストしえてないから注意な。
\r
68 * 0 - エラー。変換エラーが発生した。
\r
69 * 0<n - 成功。o_valに出力したデータの数
\r
71 NyLPC_TUInt16 NyLPC_cMiMicDbCompiler_compile(NyLPC_TcMiMicDbCompiler_t* i_inst,const struct NyLPC_TCharArrayPtr* i_bc,struct NyLPC_TUInt32ArrayPtr* o_val)
\r
73 struct NyLPC_TUInt32ArrayPtr wp=*o_val;
\r
74 struct NyLPC_TCharArrayPtr rp=*i_bc;
\r
76 NyLPC_Assert(i_bc->len>0);
\r
81 i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_OUT_BUFFER_TOO_SHORT;
\r
84 switch(NyLPC_cMiMicDbCompiler_compileFragment(i_inst,&rp,o_val->ptr,&s)){
\r
85 case NyLPC_TcMiMicDbCompiler_RET_OK:
\r
87 NyLPC_TCharArrayPtr_seek(&rp,s);
\r
89 NyLPC_TUInt32ArrayPtr_seek(&wp,1);
\r
91 case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:
\r
93 i_inst->error_reason=NyLPC_TcMiMicDbCompiler_ERROR_FRAGMENT_UNIT;
\r
99 return o_val->len-wp.len;
\r
108 struct NyLPC_TCharArrayPtr bc;
\r
109 const char* BC="0000000100000002";
\r
111 NyLPC_TcMiMicDbCompiler_t inst;
\r
112 NyLPC_TUInt32 obuf[1024];
\r
114 NyLPC_cMiMicDbCompiler_initialize(&inst);
\r
118 NyLPC_cMiMicDbCompiler_compileFragment(&inst,&bc,obuf,&pl);
\r
121 switch(NyLPC_cMiMicDbCompiler_compileFragment2(&inst,*bc.ptr,&obuf[i]))
\r
123 case NyLPC_TcMiMicDbCompiler_RET_ERROR:
\r
126 case NyLPC_TcMiMicDbCompiler_RET_CONTINUE:
\r
127 NyLPC_TCharArrayPtr_seek(&bc,1);
\r
129 case NyLPC_TcMiMicDbCompiler_RET_OK:
\r
131 NyLPC_TCharArrayPtr_seek(&bc,1);
\r