This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
NyLPC_cFormatWriter.c
00001 #include "NyLPC_cFormatWriter.h" 00002 00003 00004 #define FTYPE_LENGTH 0x01 00005 #define FTYPE_NOTHING 0x00 00006 00007 #define NUM_OF_WORK 16 00008 NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args) 00009 { 00010 const char* rp=i_fmt; 00011 const char* sp; 00012 char wk[NUM_OF_WORK]; 00013 NyLPC_TUInt8 ftype; 00014 NyLPC_TUInt32 ut; 00015 NyLPC_TInt16 ol=0; 00016 while(*rp!='\0'){ 00017 if(*rp=='%'){ 00018 ftype=FTYPE_NOTHING; 00019 rp++; 00020 FMT_NEXT: 00021 switch (*rp){ 00022 case '.': 00023 //%.*(s) 00024 if(*(rp+1)=='*'){ 00025 //%.* 00026 ftype=FTYPE_LENGTH; 00027 rp+=2; 00028 goto FMT_NEXT; 00029 } 00030 //その他 00031 wk[ol]=*rp; 00032 ol++; 00033 rp++; 00034 break; 00035 case 's': 00036 switch(ftype){ 00037 case FTYPE_LENGTH: 00038 //%.*sの場合 00039 ut=va_arg(args,NyLPC_TUInt32); 00040 break; 00041 default: 00042 ut=0x7FFFFFFF; 00043 } 00044 sp=va_arg(args,const char*); 00045 while(*sp!=0 && ut>0){ 00046 wk[ol]=*sp; 00047 ol++; 00048 sp++; 00049 //バッファフルなら書込み。 00050 if(ol>=NUM_OF_WORK){ 00051 i_handler(i_inst,wk,NUM_OF_WORK); 00052 ol=0; 00053 } 00054 ut--; 00055 } 00056 rp++; 00057 continue; 00058 case 'c': 00059 wk[ol]=(char)va_arg(args,int); 00060 rp++; 00061 ol++; 00062 break; 00063 case 'd': 00064 //ワークを空にする。 00065 if(ol>0){ 00066 i_handler(i_inst,wk,ol); 00067 ol=0; 00068 } 00069 NyLPC_itoa((va_arg(args,int)),wk,10); 00070 //強制コミット 00071 i_handler(i_inst,wk,strlen(wk)); 00072 rp++; 00073 continue; 00074 case 'u': 00075 //ワークを空にする。 00076 if (ol>0){ 00077 i_handler(i_inst, wk, ol); 00078 ol = 0; 00079 } 00080 NyLPC_uitoa ((va_arg(args, NyLPC_TUInt32)), wk, 10); 00081 //強制コミット 00082 i_handler(i_inst, wk, strlen(wk)); 00083 rp++; 00084 continue; 00085 //16進数 00086 case 'x': 00087 //ワークを空にする。 00088 if(ol>0){ 00089 i_handler(i_inst,wk,ol); 00090 ol=0; 00091 } 00092 NyLPC_uitoa ((va_arg(args,unsigned int)),wk,16); 00093 //強制コミット 00094 i_handler(i_inst,wk,strlen(wk)); 00095 rp++; 00096 continue; 00097 //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ) 00098 case 'B': 00099 switch(ftype){ 00100 case FTYPE_LENGTH: 00101 //%.*Bの場合 00102 ut=va_arg(args,NyLPC_TUInt32); 00103 break; 00104 default: 00105 ut=0; 00106 } 00107 sp=va_arg(args,const char*); 00108 while(ut>0){ 00109 //2文字以上の空きがないなら書き込み 00110 if (ol >= (NUM_OF_WORK - 2)){ 00111 i_handler(i_inst, wk, ol); 00112 ol = 0; 00113 } 00114 NyLPC_uitoa2((int)(*sp), wk + ol, 16, 2); 00115 ol += 2; 00116 sp++; 00117 ut--; 00118 } 00119 rp++; 00120 continue; 00121 case '%': 00122 wk[ol]='%'; 00123 ol++; 00124 rp++; 00125 break; 00126 case '\0': 00127 //オワタ(ループ抜けるためにrpはそのまま。) 00128 break; 00129 default: 00130 wk[ol]=*rp; 00131 ol++; 00132 } 00133 //バッファフルなら書込み。 00134 if(ol>=NUM_OF_WORK){ 00135 i_handler(i_inst,wk,NUM_OF_WORK); 00136 ol=0; 00137 } 00138 }else if(*rp==0){ 00139 //オワタ 00140 break; 00141 }else{ 00142 wk[ol]=*rp; 00143 ol++; 00144 rp++; 00145 if(ol>=NUM_OF_WORK){ 00146 i_handler(i_inst,wk,NUM_OF_WORK); 00147 ol=0; 00148 } 00149 } 00150 } 00151 //どこかでエラーが起こってればFALSE返す。 00152 return i_handler(i_inst,wk,ol); 00153 } 00154 00155 NyLPC_TInt16 NyLPC_cFormatWriter_length(const NyLPC_TChar* i_fmt,va_list args) 00156 { 00157 const char* rp=i_fmt; 00158 const char* sp; 00159 char wk[NUM_OF_WORK]; 00160 NyLPC_TUInt32 ut; 00161 NyLPC_TUInt8 ftype; 00162 NyLPC_TInt16 len=0; 00163 while(*rp!='\0'){ 00164 if(*rp=='%'){ 00165 ftype=FTYPE_NOTHING; 00166 rp++; 00167 FMT_NEXT: 00168 switch (*rp){ 00169 case '.': 00170 //%.*(s) 00171 if(*(rp+1)=='*'){ 00172 //%.* 00173 ftype=FTYPE_LENGTH; 00174 rp+=2; 00175 goto FMT_NEXT; 00176 } 00177 //その他 00178 len++; 00179 rp++; 00180 break; 00181 case 's': 00182 switch(ftype){ 00183 case FTYPE_LENGTH: 00184 //%.*sの場合 00185 ut=va_arg(args,NyLPC_TUInt32); 00186 break; 00187 default: 00188 ut=0x7FFFFFFF; 00189 } 00190 sp=va_arg(args,const char*); 00191 while(*sp!=0 && ut>0){ 00192 len++; 00193 sp++; 00194 ut--; 00195 } 00196 rp++; 00197 continue; 00198 case 'c': 00199 va_arg(args,int); 00200 len++; 00201 rp++; 00202 break; 00203 case 'd': 00204 NyLPC_itoa((va_arg(args,int)),wk,10); 00205 //強制コミット 00206 len+=(NyLPC_TInt16)strlen(wk); 00207 rp++; 00208 continue; 00209 case 'u': 00210 //ワークを空にする。 00211 NyLPC_uitoa ((va_arg(args, NyLPC_TUInt32)), wk, 10); 00212 //強制コミット 00213 len += (NyLPC_TInt16)strlen(wk); 00214 rp++; 00215 continue; 00216 case 'x': 00217 NyLPC_uitoa ((va_arg(args,unsigned int)),wk,16); 00218 //強制コミット 00219 len+=(NyLPC_TInt16)strlen(wk); 00220 rp++; 00221 continue; 00222 //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ) 00223 case 'B': 00224 switch(ftype){ 00225 case FTYPE_LENGTH: 00226 //%.*Bの場合 00227 ut=va_arg(args,NyLPC_TUInt32); 00228 break; 00229 default: 00230 ut=0; 00231 } 00232 sp=va_arg(args,const char*); 00233 len += (NyLPC_TInt16)ut * 2; 00234 rp++; 00235 continue; 00236 case '%': 00237 len++; 00238 rp++; 00239 break; 00240 case '\0': 00241 //オワタ(ループ抜けるためにrpはそのまま。) 00242 break; 00243 default: 00244 len++; 00245 } 00246 }else if(*rp==0){ 00247 //オワタ 00248 break; 00249 }else{ 00250 len++; 00251 rp++; 00252 } 00253 } 00254 //どこかでエラーが起こってればFALSE返す。 00255 return len; 00256 }
Generated on Tue Jul 12 2022 15:46:15 by 1.7.2