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

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers NyLPC_cFormatWriter.c Source File

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 }