#define NUM_OF_WORK 16\r
NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args)\r
{\r
- const char* rp=i_fmt;\r
- const char* sp;\r
- char wk[NUM_OF_WORK];\r
- NyLPC_TUInt8 ftype;\r
- NyLPC_TUInt32 ut;\r
- NyLPC_TInt16 ol=0;\r
- while(*rp!='\0'){\r
- if(*rp=='%'){\r
- ftype=FTYPE_NOTHING;\r
- rp++;\r
- FMT_NEXT:\r
- switch (*rp){\r
- case '.':\r
- //%.*(s)\r
- if(*(rp+1)=='*'){\r
- //%.*\r
- ftype=FTYPE_LENGTH;\r
- rp+=2;\r
- goto FMT_NEXT;\r
- }\r
- //その他\r
- wk[ol]=*rp;\r
- ol++;\r
- rp++;\r
- break;\r
- case 's':\r
- switch(ftype){\r
- case FTYPE_LENGTH:\r
- //%.*sの場合\r
- ut=va_arg(args,NyLPC_TUInt32);\r
- break;\r
- default:\r
- ut=0x7FFFFFFF;\r
- }\r
- sp=va_arg(args,const char*);\r
- while(*sp!=0 && ut>0){\r
- wk[ol]=*sp;\r
- ol++;\r
- sp++;\r
- //バッファフルなら書込み。\r
- if(ol>=NUM_OF_WORK){\r
- i_handler(i_inst,wk,NUM_OF_WORK);\r
- ol=0;\r
- }\r
- ut--;\r
- }\r
- rp++;\r
- continue;\r
- case 'c':\r
- wk[ol]=(char)va_arg(args,int);\r
- rp++;\r
- ol++;\r
- break;\r
- case 'd':\r
- //ワークを空にする。\r
- if(ol>0){\r
- i_handler(i_inst,wk,ol);\r
- ol=0;\r
- }\r
- NyLPC_itoa((va_arg(args,int)),wk,10);\r
- //強制コミット\r
- i_handler(i_inst,wk,strlen(wk));\r
- rp++;\r
- continue;\r
- case 'u':\r
- //ワークを空にする。\r
- if (ol>0){\r
- i_handler(i_inst, wk, ol);\r
- ol = 0;\r
- }\r
- NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
- //強制コミット\r
- i_handler(i_inst, wk, strlen(wk));\r
- rp++;\r
- continue;\r
- //16進数\r
- case 'x':\r
- //ワークを空にする。\r
- if(ol>0){\r
- i_handler(i_inst,wk,ol);\r
- ol=0;\r
- }\r
- NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
- //強制コミット\r
- i_handler(i_inst,wk,strlen(wk));\r
- rp++;\r
- continue;\r
- //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
- case 'B':\r
- switch(ftype){\r
- case FTYPE_LENGTH:\r
- //%.*Bの場合\r
- ut=va_arg(args,NyLPC_TUInt32);\r
- break;\r
- default:\r
- ut=0;\r
- }\r
- sp=va_arg(args,const char*);\r
- while(ut>0){\r
- //2文字以上の空きがないなら書き込み\r
- if (ol >= (NUM_OF_WORK - 2)){\r
- i_handler(i_inst, wk, ol);\r
- ol = 0;\r
- }\r
- NyLPC_uitoa2((int)(*sp), wk + ol, 16, 2);\r
- ol += 2;\r
- sp++;\r
- ut--;\r
- }\r
- rp++;\r
- continue;\r
- case '%':\r
- wk[ol]='%';\r
- ol++;\r
- rp++;\r
- break;\r
- case '\0':\r
- //オワタ(ループ抜けるためにrpはそのまま。)\r
- break;\r
- default:\r
- wk[ol]=*rp;\r
- ol++;\r
- }\r
- //バッファフルなら書込み。\r
- if(ol>=NUM_OF_WORK){\r
- i_handler(i_inst,wk,NUM_OF_WORK);\r
- ol=0;\r
- }\r
- }else if(*rp==0){\r
- //オワタ\r
- break;\r
- }else{\r
- wk[ol]=*rp;\r
- ol++;\r
- rp++;\r
- if(ol>=NUM_OF_WORK){\r
- i_handler(i_inst,wk,NUM_OF_WORK);\r
- ol=0;\r
- }\r
- }\r
- }\r
- //どこかでエラーが起こってればFALSE返す。\r
- return i_handler(i_inst,wk,ol);\r
+ const char* rp=i_fmt;\r
+ const char* sp;\r
+ char wk[NUM_OF_WORK];\r
+ NyLPC_TUInt8 ftype;\r
+ NyLPC_TUInt32 ut;\r
+ NyLPC_TInt16 ol=0;\r
+ while(*rp!='\0'){\r
+ if(*rp=='%'){\r
+ ftype=FTYPE_NOTHING;\r
+ rp++;\r
+ FMT_NEXT:\r
+ switch (*rp){\r
+ case '.':\r
+ //%.*(s)\r
+ if(*(rp+1)=='*'){\r
+ //%.*\r
+ ftype=FTYPE_LENGTH;\r
+ rp+=2;\r
+ goto FMT_NEXT;\r
+ }\r
+ //その他\r
+ wk[ol]=*rp;\r
+ ol++;\r
+ rp++;\r
+ break;\r
+ case 's':\r
+ switch(ftype){\r
+ case FTYPE_LENGTH:\r
+ //%.*sの場合\r
+ ut=va_arg(args,NyLPC_TUInt32);\r
+ break;\r
+ default:\r
+ ut=0x7FFFFFFF;\r
+ }\r
+ sp=va_arg(args,const char*);\r
+ while(*sp!=0 && ut>0){\r
+ wk[ol]=*sp;\r
+ ol++;\r
+ sp++;\r
+ //バッファフルなら書込み。\r
+ if(ol>=NUM_OF_WORK){\r
+ i_handler(i_inst,wk,NUM_OF_WORK);\r
+ ol=0;\r
+ }\r
+ ut--;\r
+ }\r
+ rp++;\r
+ continue;\r
+ case 'c':\r
+ wk[ol]=(char)va_arg(args,int);\r
+ rp++;\r
+ ol++;\r
+ break;\r
+ case 'd':\r
+ //ワークを空にする。\r
+ if(ol>0){\r
+ i_handler(i_inst,wk,ol);\r
+ ol=0;\r
+ }\r
+ NyLPC_itoa((va_arg(args,int)),wk,10);\r
+ //強制コミット\r
+ i_handler(i_inst,wk,strlen(wk));\r
+ rp++;\r
+ continue;\r
+ case 'u':\r
+ //ワークを空にする。\r
+ if (ol>0){\r
+ i_handler(i_inst, wk, ol);\r
+ ol = 0;\r
+ }\r
+ NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
+ //強制コミット\r
+ i_handler(i_inst, wk, strlen(wk));\r
+ rp++;\r
+ continue;\r
+ //16進数\r
+ case 'x':\r
+ //ワークを空にする。\r
+ if(ol>0){\r
+ i_handler(i_inst,wk,ol);\r
+ ol=0;\r
+ }\r
+ NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
+ //強制コミット\r
+ i_handler(i_inst,wk,strlen(wk));\r
+ rp++;\r
+ continue;\r
+ //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
+ case 'B':\r
+ switch(ftype){\r
+ case FTYPE_LENGTH:\r
+ //%.*Bの場合\r
+ ut=va_arg(args,NyLPC_TUInt32);\r
+ break;\r
+ default:\r
+ ut=0;\r
+ }\r
+ sp=va_arg(args,const char*);\r
+ while(ut>0){\r
+ //2文字以上の空きがないなら書き込み\r
+ if (ol >= (NUM_OF_WORK - 2)){\r
+ i_handler(i_inst, wk, ol);\r
+ ol = 0;\r
+ }\r
+ NyLPC_uitoa2((int)(*sp), wk + ol, 16, 2);\r
+ ol += 2;\r
+ sp++;\r
+ ut--;\r
+ }\r
+ rp++;\r
+ continue;\r
+ case '%':\r
+ wk[ol]='%';\r
+ ol++;\r
+ rp++;\r
+ break;\r
+ case '\0':\r
+ //オワタ(ループ抜けるためにrpはそのまま。)\r
+ break;\r
+ default:\r
+ wk[ol]=*rp;\r
+ ol++;\r
+ }\r
+ //バッファフルなら書込み。\r
+ if(ol>=NUM_OF_WORK){\r
+ i_handler(i_inst,wk,NUM_OF_WORK);\r
+ ol=0;\r
+ }\r
+ }else if(*rp==0){\r
+ //オワタ\r
+ break;\r
+ }else{\r
+ wk[ol]=*rp;\r
+ ol++;\r
+ rp++;\r
+ if(ol>=NUM_OF_WORK){\r
+ i_handler(i_inst,wk,NUM_OF_WORK);\r
+ ol=0;\r
+ }\r
+ }\r
+ }\r
+ //どこかでエラーが起こってればFALSE返す。\r
+ return i_handler(i_inst,wk,ol);\r
}\r
\r
NyLPC_TInt16 NyLPC_cFormatWriter_length(const NyLPC_TChar* i_fmt,va_list args)\r
{\r
- const char* rp=i_fmt;\r
- const char* sp;\r
- char wk[NUM_OF_WORK];\r
- NyLPC_TUInt32 ut;\r
- NyLPC_TUInt8 ftype;\r
- NyLPC_TInt16 len=0;\r
- while(*rp!='\0'){\r
- if(*rp=='%'){\r
- ftype=FTYPE_NOTHING;\r
- rp++;\r
- FMT_NEXT:\r
- switch (*rp){\r
- case '.':\r
- //%.*(s)\r
- if(*(rp+1)=='*'){\r
- //%.*\r
- ftype=FTYPE_LENGTH;\r
- rp+=2;\r
- goto FMT_NEXT;\r
- }\r
- //その他\r
- len++;\r
- rp++;\r
- break;\r
- case 's':\r
- switch(ftype){\r
- case FTYPE_LENGTH:\r
- //%.*sの場合\r
- ut=va_arg(args,NyLPC_TUInt32);\r
- break;\r
- default:\r
- ut=0x7FFFFFFF;\r
- }\r
- sp=va_arg(args,const char*);\r
- while(*sp!=0 && ut>0){\r
- len++;\r
- sp++;\r
- ut--;\r
- }\r
- rp++;\r
- continue;\r
- case 'c':\r
- va_arg(args,int);\r
- len++;\r
- rp++;\r
- break;\r
- case 'd':\r
- NyLPC_itoa((va_arg(args,int)),wk,10);\r
- //強制コミット\r
- len+=(NyLPC_TInt16)strlen(wk);\r
- rp++;\r
- continue;\r
- case 'u':\r
- //ワークを空にする。\r
- NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
- //強制コミット\r
- len += (NyLPC_TInt16)strlen(wk);\r
- rp++;\r
- continue;\r
- case 'x':\r
- NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
- //強制コミット\r
- len+=(NyLPC_TInt16)strlen(wk);\r
- rp++;\r
- continue;\r
- //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
- case 'B':\r
- switch(ftype){\r
- case FTYPE_LENGTH:\r
- //%.*Bの場合\r
- ut=va_arg(args,NyLPC_TUInt32);\r
- break;\r
- default:\r
- ut=0;\r
- }\r
- sp=va_arg(args,const char*);\r
- len += (NyLPC_TInt16)ut * 2;\r
- rp++;\r
- continue;\r
- case '%':\r
- len++;\r
- rp++;\r
- break;\r
- case '\0':\r
- //オワタ(ループ抜けるためにrpはそのまま。)\r
- break;\r
- default:\r
- len++;\r
- }\r
- }else if(*rp==0){\r
- //オワタ\r
- break;\r
- }else{\r
- len++;\r
- rp++;\r
- }\r
- }\r
- //どこかでエラーが起こってればFALSE返す。\r
- return len;\r
+ const char* rp=i_fmt;\r
+ const char* sp;\r
+ char wk[NUM_OF_WORK];\r
+ NyLPC_TUInt32 ut;\r
+ NyLPC_TUInt8 ftype;\r
+ NyLPC_TInt16 len=0;\r
+ while(*rp!='\0'){\r
+ if(*rp=='%'){\r
+ ftype=FTYPE_NOTHING;\r
+ rp++;\r
+ FMT_NEXT:\r
+ switch (*rp){\r
+ case '.':\r
+ //%.*(s)\r
+ if(*(rp+1)=='*'){\r
+ //%.*\r
+ ftype=FTYPE_LENGTH;\r
+ rp+=2;\r
+ goto FMT_NEXT;\r
+ }\r
+ //その他\r
+ len++;\r
+ rp++;\r
+ break;\r
+ case 's':\r
+ switch(ftype){\r
+ case FTYPE_LENGTH:\r
+ //%.*sの場合\r
+ ut=va_arg(args,NyLPC_TUInt32);\r
+ break;\r
+ default:\r
+ ut=0x7FFFFFFF;\r
+ }\r
+ sp=va_arg(args,const char*);\r
+ while(*sp!=0 && ut>0){\r
+ len++;\r
+ sp++;\r
+ ut--;\r
+ }\r
+ rp++;\r
+ continue;\r
+ case 'c':\r
+ va_arg(args,int);\r
+ len++;\r
+ rp++;\r
+ break;\r
+ case 'd':\r
+ NyLPC_itoa((va_arg(args,int)),wk,10);\r
+ //強制コミット\r
+ len+=(NyLPC_TInt16)strlen(wk);\r
+ rp++;\r
+ continue;\r
+ case 'u':\r
+ //ワークを空にする。\r
+ NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
+ //強制コミット\r
+ len += (NyLPC_TInt16)strlen(wk);\r
+ rp++;\r
+ continue;\r
+ case 'x':\r
+ NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
+ //強制コミット\r
+ len+=(NyLPC_TInt16)strlen(wk);\r
+ rp++;\r
+ continue;\r
+ //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
+ case 'B':\r
+ switch(ftype){\r
+ case FTYPE_LENGTH:\r
+ //%.*Bの場合\r
+ ut=va_arg(args,NyLPC_TUInt32);\r
+ break;\r
+ default:\r
+ ut=0;\r
+ }\r
+ sp=va_arg(args,const char*);\r
+ len += (NyLPC_TInt16)ut * 2;\r
+ rp++;\r
+ continue;\r
+ case '%':\r
+ len++;\r
+ rp++;\r
+ break;\r
+ case '\0':\r
+ //オワタ(ループ抜けるためにrpはそのまま。)\r
+ break;\r
+ default:\r
+ len++;\r
+ }\r
+ }else if(*rp==0){\r
+ //オワタ\r
+ break;\r
+ }else{\r
+ len++;\r
+ rp++;\r
+ }\r
+ }\r
+ //どこかでエラーが起こってればFALSE返す。\r
+ return len;\r
}\r