This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Fork of libMiMic by Ryo Iizuka

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?

UserRevisionLine numberNew 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