Gain de code
[romboot.git] / stdio.cpp
blobf96156282efadbb3c76f148b791392cddf0af09f
1 #include "stdio.h"
3 extern int at91_dbgu_putc(int ch);
5 FILE *stdout = (FILE *)0;
6 FILE *stdin = (FILE *)0;
8 FILE __filedesc[FILEDESCS];
10 FILE *fopen(int (*put)(int), int (*get)())
12 static int init = 1;
14 if(init != 0)
16 for(int i = 0; i < FILEDESCS; i++)
18 __filedesc[i].active = false;
19 __filedesc[i].put = 0;
20 __filedesc[i].get = 0;
23 init = 0;
26 for(int i = 0; i < FILEDESCS; i++)
28 if(!__filedesc[i].active)
30 __filedesc[i].put = put;
31 __filedesc[i].get = get;
33 __filedesc[i].active = true;
35 return &__filedesc[i];
39 return (FILE *)0;
42 int fclose(FILE *fp)
44 for(int i = 0; i < FILEDESCS; i++)
45 if(&__filedesc[i] == fp || fp->active)
47 fp->active = false;
49 fp->put = 0;
50 fp->get = 0;
52 return 0;
55 return -1;
58 int fputs(const char *str, FILE *fp)
60 if(fp == (FILE *)0)
61 return -1;
63 if(fp->put == (void *)0)
64 return -1;
66 while(*str != 0)
68 fp->put(*str);
69 str++;
71 return 0;
74 int fputc(int c, FILE *fp)
76 if(fp == (FILE *)0)
77 return -1;
79 if(fp->put == (void *)0)
80 return -1;
82 return fp->put(c);
85 int fgetc(FILE *fp)
87 if(fp == (FILE *)0)
88 return -1;
90 if(fp->get == (void *)0)
91 return -1;
93 return fp->get();
97 int puts(const char *str)
99 return fputs(str, stdout);
102 int putc(int c)
104 return fputc(c, stdout);
107 int putchar(int c)
109 return fputc(c, stdout);
112 int getc()
114 return fgetc(stdin);
117 int strlen(const char *str)
119 int len = 0;
121 if(str == (char *)0)
122 return 0;
124 while(*str++ != 0)
125 len++;
127 return len;
130 #define ZEROPAD 1 /* pad with zero */
131 #define SIGN 2 /* unsigned/signed long */
132 #define LEFT 4 /* left justified */
133 #define LARGE 8 /* use 'ABCDEF' instead of 'abcdef' */
135 #define do_div(n,base) ({ \
136 int __res; \
137 __res = ((unsigned) n) % (unsigned) base; \
138 n = ((unsigned) n) / (unsigned) base; \
139 __res; \
142 int number(FILE *fp, int num, int base, int size, int precision, int type)
144 char c, sign, tmp[66];
145 const char *digits="0123456789abcdef";
146 int i;
148 if (type & LARGE)
149 digits = "0123456789ABCDEF";
150 if (type & LEFT)
151 type &= ~ZEROPAD;
152 if (base < 2 || base > 16)
153 return 0;
154 c = (type & ZEROPAD) ? '0' : ' ';
155 sign = 0;
157 if(type & SIGN && num < 0)
159 sign = '-';
160 num = -num;
161 size--;
164 i = 0;
165 if(num == 0)
166 tmp[i++] = digits[0];
167 else while(num != 0)
168 tmp[i++] = digits[do_div(num, base)];
170 if(i > precision)
171 precision = i;
172 size -= precision;
174 if(!(type&(ZEROPAD+LEFT)))
175 while(size-->0)
176 fputc(' ', fp);
178 if(sign)
179 fputc(sign, fp);
181 if (!(type & LEFT))
182 while (size-- > 0)
183 fputc(c, fp);
185 while (i < precision--)
186 fputc('0', fp);
188 while (i-- > 0)
189 fputc(tmp[i], fp);
191 while (size-- > 0)
192 fputc(' ', fp);;
194 return 1;
197 int vfprintf(FILE *fp, const char *fmt, va_list va)
199 char *s;
203 if(*fmt == '%')
205 bool done = false;
207 int type = 0;
208 int precision = 0;
212 fmt++;
213 switch(*fmt)
215 case '0' :
216 if(!precision)
217 type |= ZEROPAD;
218 case '1' :
219 case '2' :
220 case '3' :
221 case '4' :
222 case '5' :
223 case '6' :
224 case '7' :
225 case '8' :
226 case '9' :
227 precision = precision * 10 + (*fmt - '0');
228 break;
229 case '.' :
230 break;
231 case 's' :
232 s = va_arg(va, char *);
233 if(!s)
234 fputs("<NULL>", fp);
235 else
236 fputs(s, fp);
237 done = true;
238 break;
239 case 'c' :
240 fputc(va_arg(va, int), fp);
241 done = true;
242 break;
243 case 'd' :
244 number(fp, va_arg(va, int), 10, 0, precision, type);
245 done = true;
246 break;
247 case 'x' :
248 number(fp, va_arg(va, int), 16, 0, precision, type);
249 done = true;
250 break;
251 case 'X' :
252 number(fp, va_arg(va, int), 16, 0, precision, type | LARGE);
253 done = true;
254 break;
255 case '%' :
256 fputc(*fmt, fp);
257 done = true;
258 default:
259 fputc('%', fp);
260 fputc(*fmt, fp);
261 done = true;
262 break;
265 while(!done);
267 else
268 fputc(*fmt, fp);
270 fmt++;
272 while(*fmt != 0);
274 return 0;
277 int fprintf(FILE *fp, const char *fmt, ...)
279 va_list ap;
280 int i;
282 va_start(ap, fmt);
283 i = fprintf(fp, fmt, ap);
284 va_end(ap);
286 return i;
289 int printf(const char *fmt, ...)
291 va_list ap;
292 int i;
294 va_start(ap, fmt);
295 i = vfprintf(stdout, fmt, ap);
296 va_end(ap);
298 return i;