OSDN Git Service

ETBalanceRunnerの不具合修正とStopで止まるようにした
[tondenhei/et2013.git] / tsprintf.c
1 /*\r
2   Tiny sprintf module\r
3    for Embedded microcontrollers\r
4    File Version : 1.0\r
5    Yasuhiro ISHII 2005\r
6 \r
7    \81y\83o\81[\83W\83\87\83\93\83A\83b\83v\97\9a\97ð\81z\r
8    0.1 : \82Æ\82è\82 \82¦\82¸\82È\82ñ\82©\93®\82¢\82½\94Å\r
9    0.2 : decimal\82Ì0\95\\8e¦\91Î\89\9e   20050313\r
10    0.3 : hexa decimal\82Ì0\95\\8e¦\91Î\89\9e 20050313\r
11    0.4 : \83\\81[\83X\92\86\82Ì\95Ï\82È\83R\81[\83h(^M)\82ð\8dí\8f\9c\82µ\82½ 20050503\r
12    0.5 : tsprintf\8aÖ\90\94\82Ì\95Ï\90\94 size\82ð\8f\89\8aú\89»\82·\82é\82æ\82¤\82É\82µ\82½ 20050503\r
13    0.6 : %d\82Ì\95\89\90\94\91Î\89\9e,%x\82Ìunsigned\8f\88\97\9d\89» 20050522\r
14    0.7 : %d,%x\82Ì\8c\85\90\94\8ew\92è(%[n]d)/0\95â\8a®\8ew\92è(%0[n]d)\91Î\89\9e 20050522\r
15    0.8 : va_list\82Å\93n\82·vtsprintf\82ð\8dì\90¬\82µ\81Avsprintf\82ðvtsprintf\82Ì\90e\8aÖ\90\94\82É\82µ\82½ 20050522\r
16    0.9 : hex\82Å\81A\92l\82ª0\82Ì\8e\9e\82É\8c\85\82ª1\82É\82È\82Á\82Ä\82µ\82Ü\82¤\83o\83O\8fC\90³ 20050526\r
17    1.0 : dec\82Å\81A\92l\82ª0\82Ì\8e\9e\82É\8c\85\82ª1\82É\82È\82Á\82Ä\82µ\82Ü\82¤\83o\83O\8fC\90³ 20050629\r
18    \r
19    printf\82Ì\8f\91\8e®\90Ý\92è\82ð\8aÈ\88Õ\93I\82È\82à\82Ì\82É\82µ\82Ä\8eÀ\91\95\82µ\82Ä\82 \82é\82Ì\82Å\8eg\97p\8e\9e\82É\82Í\r
20    \90à\96¾\8f\91\82ð\8am\94F\82µ\82Ä\89º\82³\82¢\81B\r
21 \r
22 */\r
23 \r
24 #include <stdarg.h>\r
25 \r
26 int tsprintf(char* ,char* , ...);\r
27 int vtsprintf(char* buff,char* fmt,va_list arg);\r
28 \r
29 static int tsprintf_string(char* ,char* );\r
30 static int tsprintf_char(int ,char* );\r
31 static int tsprintf_decimal(signed long,char* ,int ,int );\r
32 static int tsprintf_hexadecimal(unsigned long ,char* ,int ,int ,int );\r
33 \r
34 /*\r
35   Tiny sprintf\8aÖ\90\94\r
36 */\r
37 int tsprintf(char* buff,char* fmt, ...){\r
38         va_list arg;\r
39         int len;\r
40 \r
41         len = 0;\r
42         va_start(arg, fmt);\r
43 \r
44         len = vtsprintf(buff,fmt,arg);\r
45         \r
46         va_end(arg);\r
47         return len;\r
48 }\r
49 \r
50 int vtsprintf(char* buff,char* fmt,va_list arg){\r
51         int len;\r
52         int size;\r
53         int zeroflag,width;\r
54 \r
55         size = 0;\r
56         len = 0;\r
57 \r
58         while(*fmt){\r
59                 if(*fmt=='%'){          /* % \82É\8aÖ\82·\82é\8f\88\97\9d */\r
60                         zeroflag = width = 0;\r
61                         fmt++;\r
62 \r
63                         if (*fmt == '0'){\r
64                                 fmt++;\r
65                                 zeroflag = 1;\r
66                         }\r
67                         if ((*fmt >= '0') && (*fmt <= '9')){\r
68                                 width = *(fmt++) - '0';\r
69                         }\r
70 \r
71                         /* printf ("zerof = %d,width = %d\n",zeroflag,width); */\r
72 \r
73                         switch(*fmt){\r
74                         case 'd':               /* 10\90i\90\94 */\r
75                                 size = tsprintf_decimal(va_arg(arg,signed long),buff,zeroflag,width);\r
76                                 break;\r
77                         case 'x':               /* 16\90i\90\94 0-f */\r
78                                 size = tsprintf_hexadecimal(va_arg(arg,unsigned long),buff,0,zeroflag,width);\r
79                                 break;\r
80                         case 'X':               /* 16\90i\90\94 0-F */\r
81                                 size = tsprintf_hexadecimal(va_arg(arg,unsigned long),buff,1,zeroflag,width);\r
82                                 break;\r
83                         case 'c':               /* \83L\83\83\83\89\83N\83^\81[ */\r
84                                 size = tsprintf_char(va_arg(arg,int),buff);\r
85                                 break;\r
86                         case 's':               /* ASCIIZ\95\8e\9a\97ñ */\r
87                                 size = tsprintf_string(va_arg(arg,char*),buff);\r
88                                 break;\r
89                         default:                /* \83R\83\93\83g\83\8d\81[\83\8b\83R\81[\83h\88È\8aO\82Ì\95\8e\9a */\r
90                                 /* %%(%\82É\91Î\89\9e)\82Í\82±\82±\82Å\91Î\89\9e\82³\82ê\82é */\r
91                                 len++;\r
92                                 *(buff++) = *fmt;\r
93                                 break;\r
94                         }\r
95                         len += size;\r
96                         buff += size;\r
97                         fmt++;\r
98                 } else {\r
99                         *(buff++) = *(fmt++);\r
100                         len++;\r
101                 }\r
102         }\r
103 \r
104         *buff = '\0';           /* \8fI\92[\82ð\93ü\82ê\82é */\r
105 \r
106         va_end(arg);\r
107         return (len);\r
108 }\r
109 \r
110 \r
111 \r
112 \r
113 /*\r
114   \90\94\92l => 10\90i\95\8e\9a\97ñ\95Ï\8a·\r
115 */\r
116 static int tsprintf_decimal(signed long val,char* buff,int zf,int wd){\r
117         int i;\r
118         char tmp[10];\r
119         char* ptmp = tmp + 9;\r
120         int len = 0;\r
121         int minus = 0;\r
122 \r
123         if (!val){              /* \8ew\92è\92l\82ª0\82Ì\8fê\8d\87 */\r
124                 *(ptmp--) = '0';\r
125                 len++;\r
126         } else {\r
127                 /* \83}\83C\83i\83X\82Ì\92l\82Ì\8fê\8d\87\82É\82Í2\82Ì\95â\90\94\82ð\8eæ\82é */\r
128                 if (val < 0){\r
129                         val = ~val;\r
130                         val++;\r
131                         minus = 1;\r
132                 }\r
133                 while (val){\r
134                         /* \83o\83b\83t\83@\83A\83\93\83_\81[\83t\83\8d\81[\91Î\8dô */\r
135                         if (len >= 8){\r
136                                 break;\r
137                         }\r
138         \r
139                         *ptmp = (val % 10) + '0';\r
140                         val /= 10;\r
141                         ptmp--;\r
142                         len++;\r
143                 }\r
144 \r
145         }\r
146 \r
147         /* \95\84\8d\86\81A\8c\85\8d\87\82í\82¹\82É\8aÖ\82·\82é\8f\88\97\9d */\r
148         if (zf){\r
149                 if (minus){\r
150                         wd--;\r
151                 }\r
152                 while (len < wd){\r
153                         *(ptmp--) =  '0';\r
154                         len++;\r
155                 }\r
156                 if (minus){\r
157                         *(ptmp--) = '-';\r
158                         len++;\r
159                 }\r
160         } else {\r
161                 if (minus){\r
162                         *(ptmp--) = '-';\r
163                         len++;\r
164                 }\r
165                 while (len < wd){\r
166                         *(ptmp--) =  ' ';\r
167                         len++;\r
168                 }\r
169         }\r
170 \r
171         /* \90\90¬\95\8e\9a\97ñ\82Ì\83o\83b\83t\83@\83R\83s\81[ */\r
172         for (i=0;i<len;i++){\r
173                 *(buff++) = *(++ptmp);\r
174         }\r
175 \r
176         return (len);\r
177 }\r
178 \r
179 /*\r
180   \90\94\92l => 16\90i\95\8e\9a\97ñ\95Ï\8a·\r
181 */\r
182 static int tsprintf_hexadecimal(unsigned long val,char* buff,\r
183                                                                 int capital,int zf,int wd){\r
184         int i;\r
185         char tmp[10];\r
186         char* ptmp = tmp + 9;\r
187         int len = 0;\r
188         char str_a;\r
189 \r
190         /* A\81`F\82ð\91å\95\8e\9a\82É\82·\82é\82©\8f¬\95\8e\9a\82É\82·\82é\82©\90Ø\82è\91Ö\82¦\82é */\r
191         if (capital){\r
192                 str_a = 'A';\r
193         } else {\r
194                 str_a = 'a';\r
195         }\r
196         \r
197         if (!val){              /* \8ew\92è\92l\82ª0\82Ì\8fê\8d\87 */\r
198                 *(ptmp--) = '0';\r
199                 len++;\r
200         } else {\r
201                 while (val){\r
202                         /* \83o\83b\83t\83@\83A\83\93\83_\81[\83t\83\8d\81[\91Î\8dô */\r
203                         if (len >= 8){\r
204                                 break;\r
205                         }\r
206 \r
207                         *ptmp = (val % 16);\r
208                         if (*ptmp > 9){\r
209                                 *ptmp += str_a - 10;\r
210                         } else {\r
211                                 *ptmp += '0';\r
212                         }\r
213                 \r
214                         val >>= 4;              /* 16\82Å\8a\84\82é */\r
215                         ptmp--;\r
216                         len++;\r
217                 }\r
218         }\r
219         while (len < wd){\r
220                 *(ptmp--) =  zf ? '0' : ' ';\r
221                 len++;\r
222         }\r
223                 \r
224         for (i=0;i<len;i++){\r
225                 *(buff++) = *(++ptmp);\r
226         }\r
227 \r
228         return(len);\r
229 }\r
230 \r
231 /*\r
232   \90\94\92l => 1\95\8e\9a\83L\83\83\83\89\83N\83^\95Ï\8a·\r
233 */\r
234 static int tsprintf_char(int ch,char* buff){\r
235         *buff = (char)ch;\r
236         return(1);\r
237 }\r
238 \r
239 /*\r
240   \90\94\92l => ASCIIZ\95\8e\9a\97ñ\95Ï\8a·\r
241 */\r
242 static int tsprintf_string(char* str,char* buff){\r
243         int count = 0;\r
244         while(*str){\r
245                 *(buff++) = *str;\r
246                 str++;\r
247                 count++;\r
248         }\r
249         return(count);\r
250 }\r
251 \r