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