OSDN Git Service

コメント修正
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 12 Sep 2013 14:22:49 +0000 (14:22 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Thu, 12 Sep 2013 14:22:49 +0000 (14:22 +0000)
NyLPC_cFormatWriter_length関数の追加

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@325 47198e57-cb75-475f-84c4-a814cd6f29e0

lib/src/NyLPC_cMiMicEnv.h
lib/src/include/NyLPC_stdlib.h
lib/src/utils/NyLPC_cFormatWriter.c
lib/src/utils/NyLPC_cFormatWriter.h

index fc4c756..abc7680 100644 (file)
@@ -13,7 +13,7 @@ extern "C" {
 #endif /* __cplusplus */\r
 \r
 \r
-#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.60"\r
+#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.61"\r
 \r
 \r
 #ifdef __cplusplus\r
index 28bbb47..0e172e6 100644 (file)
@@ -74,19 +74,19 @@ extern "C" {
         * 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
@@ -95,7 +95,7 @@ extern "C" {
        /*\r
         * トレースマクロです。デバックに使います。\r
         * 内部変数に、最後にコールされたファイル名と、行番号を保存します。\r
-        * デバック時のみ有効です\r
+        * デバック時のみ有効です.\r
         */\r
        #define NyLPC_Trace() {NyLPC_debugHook(__FILE__,__LINE__);};\r
 #else\r
@@ -480,9 +480,9 @@ NyLPC_TUInt8 NyLPC_TTextIdTbl_getMatchId(const NyLPC_TChar* i_str,const struct N
  */\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
index 3db8f36..39e49e4 100644 (file)
@@ -1,8 +1,8 @@
 #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
@@ -10,9 +10,9 @@ NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler
        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
@@ -132,3 +132,132 @@ NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler
        //どこかでエラーが起こってれば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
index 5bc9cde..7ada3d7 100644 (file)
@@ -21,6 +21,11 @@ typedef NyLPC_TBool(*NyLPC_cFormatWriter_printHandler)(void* i_inst,const void*
  */\r
 NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args);\r
 \r
+/**\r
+ * 書式文字列を出力した時のバイト長さを求めます。\r
+ */\r
+NyLPC_TInt16 NyLPC_cFormatWriter_length(const NyLPC_TChar* i_fmt,va_list args);\r
+\r
 \r
 #ifdef __cplusplus\r
 }\r