487958a9f0bd32e2e3cc61709dd09e97ef92eaba
[matches/honours.git] / printf.c
1 #include "printf.h"\r
2 \r
3 /*\r
4  * @file printf.c\r
5  * @author Sam Moore\r
6  * @purpose Implement sprintf functions, because WinAVR can't do it\r
7  */\r
8 \r
9 //#include <math.h> // Needed for modf\r
10 \r
11 int luint2str(char * str, uint32 integer)\r
12 {\r
13         uint8 base = 10;\r
14 \r
15         if (integer == 0)\r
16         {\r
17                 str[0] = '0';\r
18                 str[1] = '\0';\r
19                 return 1;\r
20         }\r
21         \r
22         int i = 0;\r
23         \r
24         uint remainder;\r
25         while (integer >= base)\r
26         {\r
27                 remainder = integer % base;\r
28                 integer = integer / base;\r
29                 str[i] = (char)((uint)'0' + remainder);\r
30                 ++i;\r
31         }\r
32 \r
33         if (integer != 0)\r
34         {\r
35                 str[i] = (char)((uint)'0' + integer);\r
36                 ++i;\r
37         }\r
38 \r
39         //reverse the string\r
40         for (int j = 0; j < i/2; ++j)\r
41         {\r
42                 char t = str[j];\r
43                 str[j] = str[i - 1 - j];\r
44                 str[i -1 - j] = t;\r
45         }\r
46         str[i] = '\0';\r
47         return i;\r
48 \r
49 \r
50 }\r
51 \r
52 int uint2str(char * str, uint integer)\r
53 {\r
54         uint8 base = 10;\r
55 \r
56         if (integer == 0)\r
57         {\r
58                 str[0] = '0';\r
59                 str[1] = '\0';\r
60                 return 1;\r
61         }\r
62         \r
63         int i = 0;\r
64         \r
65         uint remainder;\r
66         while (integer >= base)\r
67         {\r
68                 remainder = integer % base;\r
69                 integer = integer / base;\r
70                 str[i] = (char)((uint)'0' + remainder);\r
71                 ++i;\r
72         }\r
73 \r
74         if (integer != 0)\r
75         {\r
76                 str[i] = (char)((uint)'0' + integer);\r
77                 ++i;\r
78         }\r
79 \r
80         //reverse the string\r
81         for (int j = 0; j < i/2; ++j)\r
82         {\r
83                 char t = str[j];\r
84                 str[j] = str[i - 1 - j];\r
85                 str[i -1 - j] = t;\r
86         }\r
87         str[i] = '\0';\r
88         return i;\r
89 \r
90 \r
91 }\r
92 \r
93 int int2str(char * str, int integer)\r
94 {\r
95         uint8 base = 10;\r
96 \r
97         if (integer == 0)\r
98         {\r
99                 str[0] = '0';\r
100                 str[1] = '\0';\r
101                 return 1;\r
102         }\r
103 \r
104         char negative = FALSE;\r
105         if (integer < 0)\r
106                 negative = TRUE;\r
107         \r
108         int i = 0;\r
109         \r
110         uint remainder;\r
111         while (integer >= base)\r
112         {\r
113                 remainder = integer % base;\r
114                 integer = integer / base;\r
115                 str[i] = (char)((uint)'0' + remainder);\r
116                 ++i;\r
117         }\r
118 \r
119         if (integer != 0)\r
120         {\r
121                 str[i] = (char)((uint)'0' + integer);\r
122                 ++i;\r
123         }\r
124 \r
125         if (negative == TRUE)\r
126         {\r
127                 str[i] = '-';\r
128                 ++i;\r
129 \r
130         }\r
131 \r
132         //reverse the string\r
133         for (int j = 0; j < i/2; ++j)\r
134         {\r
135                 char t = str[j];\r
136                 str[j] = str[i - 1 - j];\r
137                 str[i -1 - j] = t;\r
138         }\r
139         str[i] = '\0';\r
140         return i;\r
141 \r
142 \r
143 }\r
144 \r
145 int float2str(char * str, float flt)\r
146 {\r
147         int places = 100;\r
148 \r
149         int intpart = (int)(flt);\r
150         double decpart = flt - (double)(intpart);\r
151         int s = int2str(str, intpart);\r
152 \r
153         str[s] = '.';\r
154         ++s;\r
155         s += int2str(str+s, (int)(decpart*places));\r
156         return s;\r
157 \r
158 }\r
159 \r
160 int str2str(char * str1, char * str2)\r
161 {\r
162         int i = 0;\r
163         for (i = 0; str2[i] != '\0'; ++i)\r
164         {\r
165                 str1[i] = str2[i];\r
166         }\r
167         str1[i] = '\0';\r
168         return i;\r
169 }\r
170 \r
171 int vsprintf(char * str, const char * format, va_list args)\r
172 {\r
173         int s; int f;\r
174         s = 0;\r
175         for (f = 0; format[f] != '\0'; ++f)\r
176         {\r
177                 if (format[f] == '%')\r
178                 {\r
179                         switch (format[f+1])\r
180                         {\r
181                                 case 'd':\r
182                                 case 'u':\r
183                                 case 'i':\r
184                                 {\r
185                                         uint integer = va_arg(args, uint);\r
186                                         s += uint2str(str+s, integer);\r
187                                         break;\r
188                                 }\r
189                                 case 'l':\r
190                                 {\r
191                                         uint32 integer = va_arg(args, uint32);\r
192                                         s += luint2str(str+s, integer);\r
193                                         break;\r
194                                 }\r
195                                 case 's':\r
196                                 {\r
197                                         char * str2 = va_arg(args, char*);\r
198                                         s += str2str(str+s, str2);\r
199                                         \r
200                                         break;\r
201                                 }\r
202                                 case 'f':\r
203                                 {\r
204                                         float flt = va_arg(args, double);\r
205                                         s += float2str(str+s, flt);\r
206                                         break;\r
207                                 }\r
208                                 case 'c':\r
209                                         str[s] = (char)(va_arg(args, int));\r
210                                         ++s;\r
211                                         break;\r
212                                 case '\0':\r
213                                 default:\r
214                                         return -1;\r
215                         }\r
216                         ++f;\r
217                 }\r
218                 else\r
219                 {\r
220                         str[s] = format[f];\r
221                         ++s;\r
222                 }\r
223         }\r
224         str[s] = '\0';\r
225         return s;\r
226 }\r
227 \r
228 int sprintf(char * str, const char * format, ...)\r
229 {\r
230         int result = 0;\r
231         va_list args;\r
232         va_start(args, format);\r
233         result = vsprintf(str, format, args);\r
234         va_end(args);   \r
235         return result;\r
236 }\r

UCC git Repository :: git.ucc.asn.au