* Abortマクロです。eが偽の時に、異常終了します。\r
* デバック時/リリース時のどちらでも有効です。\r
* @param e\r
- * 評価式です。\r
+ * 評価式です.\r
*/\r
#define NyLPC_AbortIfNot(e) if(!(e)){NyLPC_abortHook(__FILE__,__LINE__);};\r
\r
/**\r
- * 警告表示用のマクロです。デバックに使います。\r
- * デバック時のみ有効です。\r
+ * 警告表示用のマクロです.デバックに使います.\r
+ * デバック時のみ有効です.\r
*/\r
#define NyLPC_Warning() {NyLPC_debugHook(__FILE__,__LINE__);};\r
\r
/**\r
- * 警告表示用のマクロです。eが偽の時に、警告を出します。\r
- * デバック時のみ有効です。\r
+ * 警告表示用のマクロです.eが偽の時に、警告を出します.\r
+ * デバック時のみ有効です.\r
* @param e\r
* 評価式です。\r
*/\r
/*\r
* トレースマクロです。デバックに使います。\r
* 内部変数に、最後にコールされたファイル名と、行番号を保存します。\r
- * デバック時のみ有効です。\r
+ * デバック時のみ有効です.\r
*/\r
#define NyLPC_Trace() {NyLPC_debugHook(__FILE__,__LINE__);};\r
#else\r
*/\r
NyLPC_TUInt8 NyLPC_TTextIdTbl_getMatchIdIgnoreCase(const NyLPC_TChar* i_str,const struct NyLPC_TTextIdTbl i_tbl[]);\r
/**\r
- * テーブルからIDに一致する文字列を返す。\r
+ * テーブルからIDに一致する文字列を返す.\r
* @return\r
- * IDに一致する文字列。\r
+ * IDに一致する文字列.\r
* 存在しなければNULL\r
*/\r
const NyLPC_TChar* NyLPC_TTextIdTbl_getTextById(NyLPC_TUInt8 i_id,const struct NyLPC_TTextIdTbl i_tbl[]);\r
#include "NyLPC_cFormatWriter.h"\r
\r
\r
-#define FTYPE_LENGTH 0x00000001\r
-#define FTYPE_NOTHING 0x00000000\r
+#define FTYPE_LENGTH 0x01\r
+#define FTYPE_NOTHING 0x00\r
\r
#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
const char* rp=i_fmt;\r
const char* sp;\r
char wk[NUM_OF_WORK];\r
- NyLPC_TUInt32 ftype;\r
+ NyLPC_TUInt8 ftype;\r
NyLPC_TUInt32 ut;\r
- int ol=0;\r
+ NyLPC_TInt16 ol=0;\r
while(*rp!='\0'){\r
if(*rp=='%'){\r
ftype=FTYPE_NOTHING;\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
+ 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
+ len+=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
+ len+=ol;\r
+ ol=0;\r
+ }\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
+ if(ol>0){\r
+ len+=ol;\r
+ }\r
+ ut=va_arg(args,NyLPC_TUInt32);\r
+ ol=15;\r
+ wk[ol--]='\0';\r
+ do{\r
+ wk[ol--]='0'+(ut%10);\r
+ ut/=10;\r
+ }while(ut>0);\r
+ len+=14-ol;\r
+ ol=0;\r
+ rp++;\r
+ continue;\r
+ case 'x':\r
+ //ワークを空にする。\r
+ if(ol>0){\r
+ len+=ol;\r
+ ol=0;\r
+ }\r
+ NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
+ //強制コミット\r
+ len+=(NyLPC_TInt16)strlen(wk);\r
+ rp++;\r
+ continue;\r
+// case 'X':\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
+ len+=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
+ len+=NUM_OF_WORK;\r
+ ol=0;\r
+ }\r
+ }\r
+ }\r
+ //どこかでエラーが起こってればFALSE返す。\r
+ return len+ol;\r
+}\r