OSDN Git Service

26af5fc527e9fe1b65f4dcb9d6e6b8ec2637d3e6
[mimic/MiMicSDK.git] / lib / src / utils / NyLPC_cFormatWriter.c
1 #include "NyLPC_cFormatWriter.h"\r
2 \r
3 \r
4 #define FTYPE_LENGTH 0x01\r
5 #define FTYPE_NOTHING 0x00\r
6 \r
7 #define NUM_OF_WORK 16\r
8 NyLPC_TBool NyLPC_cFormatWriter_print(NyLPC_cFormatWriter_printHandler i_handler,void* i_inst,const NyLPC_TChar* i_fmt,va_list args)\r
9 {\r
10         const char* rp=i_fmt;\r
11         const char* sp;\r
12         char wk[NUM_OF_WORK];\r
13         NyLPC_TUInt8 ftype;\r
14         NyLPC_TUInt32 ut;\r
15         NyLPC_TInt16 ol=0;\r
16         while(*rp!='\0'){\r
17                 if(*rp=='%'){\r
18                         ftype=FTYPE_NOTHING;\r
19                         rp++;\r
20                 FMT_NEXT:\r
21                         switch (*rp){\r
22                         case '.':\r
23                                 //%.*(s)\r
24                                 if(*(rp+1)=='*'){\r
25                                         //%.*\r
26                                         ftype=FTYPE_LENGTH;\r
27                                         rp+=2;\r
28                                         goto FMT_NEXT;\r
29                                 }\r
30                                 //その他\r
31                                 wk[ol]=*rp;\r
32                                 ol++;\r
33                                 rp++;\r
34                                 break;\r
35                         case 's':\r
36                                 switch(ftype){\r
37                                 case FTYPE_LENGTH:\r
38                                         //%.*sの場合\r
39                                         ut=va_arg(args,NyLPC_TUInt32);\r
40                                         break;\r
41                                 default:\r
42                                         ut=0x7FFFFFFF;\r
43                                 }\r
44                                 sp=va_arg(args,const char*);\r
45                                 while(*sp!=0 && ut>0){\r
46                                         wk[ol]=*sp;\r
47                                         ol++;\r
48                                         sp++;\r
49                                         //バッファフルなら書込み。\r
50                                         if(ol>=NUM_OF_WORK){\r
51                                                 i_handler(i_inst,wk,NUM_OF_WORK);\r
52                                                 ol=0;\r
53                                         }\r
54                                         ut--;\r
55                                 }\r
56                                 rp++;\r
57                                 continue;\r
58                         case 'c':\r
59                                 wk[ol]=(char)va_arg(args,int);\r
60                                 rp++;\r
61                                 ol++;\r
62                                 break;\r
63                         case 'd':\r
64                                 //ワークを空にする。\r
65                                 if(ol>0){\r
66                                         i_handler(i_inst,wk,ol);\r
67                                         ol=0;\r
68                                 }\r
69                                 NyLPC_itoa((va_arg(args,int)),wk,10);\r
70                                 //強制コミット\r
71                                 i_handler(i_inst,wk,strlen(wk));\r
72                                 rp++;\r
73                                 continue;\r
74                         case 'u':\r
75                                 //ワークを空にする。\r
76                                 if (ol>0){\r
77                                         i_handler(i_inst, wk, ol);\r
78                                         ol = 0;\r
79                                 }\r
80                                 NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
81                                 //強制コミット\r
82                                 i_handler(i_inst, wk, strlen(wk));\r
83                                 rp++;\r
84                                 continue;\r
85                         //16進数\r
86                         case 'x':\r
87                                 //ワークを空にする。\r
88                                 if(ol>0){\r
89                                         i_handler(i_inst,wk,ol);\r
90                                         ol=0;\r
91                                 }\r
92                                 NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
93                                 //強制コミット\r
94                                 i_handler(i_inst,wk,strlen(wk));\r
95                                 rp++;\r
96                                 continue;\r
97                         //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
98                         case 'B':\r
99                                 switch(ftype){\r
100                                 case FTYPE_LENGTH:\r
101                                         //%.*Bの場合\r
102                                         ut=va_arg(args,NyLPC_TUInt32);\r
103                                         break;\r
104                                 default:\r
105                                         ut=0;\r
106                                 }\r
107                                 sp=va_arg(args,const char*);\r
108                                 while(ut>0){\r
109                                         //2文字以上の空きがないなら書き込み\r
110                                         if (ol >= (NUM_OF_WORK - 2)){\r
111                                                 i_handler(i_inst, wk, ol);\r
112                                                 ol = 0;\r
113                                         }\r
114                                         NyLPC_uitoa2((int)(*sp), wk + ol, 16, 2);\r
115                                         ol += 2;\r
116                                         sp++;\r
117                                         ut--;\r
118                                 }\r
119                                 rp++;\r
120                                 continue;\r
121                         case '%':\r
122                                 wk[ol]='%';\r
123                                 ol++;\r
124                                 rp++;\r
125                                 break;\r
126                         case '\0':\r
127                                 //オワタ(ループ抜けるためにrpはそのまま。)\r
128                                 break;\r
129                         default:\r
130                                 wk[ol]=*rp;\r
131                                 ol++;\r
132                         }\r
133                         //バッファフルなら書込み。\r
134                         if(ol>=NUM_OF_WORK){\r
135                                 i_handler(i_inst,wk,NUM_OF_WORK);\r
136                                 ol=0;\r
137                         }\r
138                 }else if(*rp==0){\r
139                         //オワタ\r
140                         break;\r
141                 }else{\r
142                         wk[ol]=*rp;\r
143                         ol++;\r
144                         rp++;\r
145                         if(ol>=NUM_OF_WORK){\r
146                                 i_handler(i_inst,wk,NUM_OF_WORK);\r
147                                 ol=0;\r
148                         }\r
149                 }\r
150         }\r
151         //どこかでエラーが起こってればFALSE返す。\r
152         return i_handler(i_inst,wk,ol);\r
153 }\r
154 \r
155 NyLPC_TInt16 NyLPC_cFormatWriter_length(const NyLPC_TChar* i_fmt,va_list args)\r
156 {\r
157         const char* rp=i_fmt;\r
158         const char* sp;\r
159         char wk[NUM_OF_WORK];\r
160         NyLPC_TUInt32 ut;\r
161         NyLPC_TUInt8 ftype;\r
162         NyLPC_TInt16 len=0;\r
163         while(*rp!='\0'){\r
164                 if(*rp=='%'){\r
165                         ftype=FTYPE_NOTHING;\r
166                         rp++;\r
167                 FMT_NEXT:\r
168                         switch (*rp){\r
169                         case '.':\r
170                                 //%.*(s)\r
171                                 if(*(rp+1)=='*'){\r
172                                         //%.*\r
173                                         ftype=FTYPE_LENGTH;\r
174                                         rp+=2;\r
175                                         goto FMT_NEXT;\r
176                                 }\r
177                                 //その他\r
178                                 len++;\r
179                                 rp++;\r
180                                 break;\r
181                         case 's':\r
182                                 switch(ftype){\r
183                                 case FTYPE_LENGTH:\r
184                                         //%.*sの場合\r
185                                         ut=va_arg(args,NyLPC_TUInt32);\r
186                                         break;\r
187                                 default:\r
188                                         ut=0x7FFFFFFF;\r
189                                 }\r
190                                 sp=va_arg(args,const char*);\r
191                                 while(*sp!=0 && ut>0){\r
192                                         len++;\r
193                                         sp++;\r
194                                         ut--;\r
195                                 }\r
196                                 rp++;\r
197                                 continue;\r
198                         case 'c':\r
199                                 va_arg(args,int);\r
200                                 len++;\r
201                                 rp++;\r
202                                 break;\r
203                         case 'd':\r
204                                 NyLPC_itoa((va_arg(args,int)),wk,10);\r
205                                 //強制コミット\r
206                                 len+=(NyLPC_TInt16)strlen(wk);\r
207                                 rp++;\r
208                                 continue;\r
209                         case 'u':\r
210                                 //ワークを空にする。\r
211                                 NyLPC_uitoa((va_arg(args, NyLPC_TUInt32)), wk, 10);\r
212                                 //強制コミット\r
213                                 len += (NyLPC_TInt16)strlen(wk);\r
214                                 rp++;\r
215                                 continue;\r
216                         case 'x':\r
217                                 NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
218                                 //強制コミット\r
219                                 len+=(NyLPC_TInt16)strlen(wk);\r
220                                 rp++;\r
221                                 continue;\r
222                         //BYTE値のHEXエンコード文字列(XX形式のテキスト。%.*Bのみ)\r
223                         case 'B':\r
224                                 switch(ftype){\r
225                                 case FTYPE_LENGTH:\r
226                                         //%.*Bの場合\r
227                                         ut=va_arg(args,NyLPC_TUInt32);\r
228                                         break;\r
229                                 default:\r
230                                         ut=0;\r
231                                 }\r
232                                 sp=va_arg(args,const char*);\r
233                                 len += (NyLPC_TInt16)ut * 2;\r
234                                 rp++;\r
235                                 continue;\r
236                         case '%':\r
237                                 len++;\r
238                                 rp++;\r
239                                 break;\r
240                         case '\0':\r
241                                 //オワタ(ループ抜けるためにrpはそのまま。)\r
242                                 break;\r
243                         default:\r
244                                 len++;\r
245                         }\r
246                 }else if(*rp==0){\r
247                         //オワタ\r
248                         break;\r
249                 }else{\r
250                         len++;\r
251                         rp++;\r
252                 }\r
253         }\r
254         //どこかでエラーが起こってればFALSE返す。\r
255         return len;\r
256 }\r