Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of libMiMic by
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 16:22:57 by
