* src/z80/gen.c: Fixed up generator to pass the regresion tests, specifically fixing...
[fw/sdcc] / device / lib / gbz80 / printf.c
1 /** Simple printf implementation
2     Again a stub - will use the std one later...
3 */
4
5 #include <stdarg.h>
6 #include <stdio.h>
7
8 #define STATIC
9
10 /* PENDING */
11 #define NULL    0
12
13 STATIC void _printn(unsigned u, unsigned base, char issigned, void (*emitter)(char, void *), void *pData)
14 {
15     const char *_hex = "0123456789ABCDEF";
16     if (issigned && ((int)u < 0)) {
17         (*emitter)('-', pData);
18         u = (unsigned)-((int)u);
19     }
20     if (u >= base)
21         _printn(u/base, base, 0, emitter, pData);
22     (*emitter)(_hex[u%base], pData);
23 }
24
25 STATIC void _printf(const char *format, void (*emitter)(char, void *), void *pData, va_list va)
26 {
27     while (*format) {
28         if (*format == '%') {
29             switch (*++format) {
30             case 'c': {
31                 char c = (char)va_arg(va, int);
32                 (*emitter)(c, pData);
33                 break;
34             }
35             case 'u':
36                 {
37                     unsigned u = va_arg(va, unsigned);
38                     _printn(u, 10, 0, emitter, pData);
39                     break;
40                 }
41             case 'd':
42                 {
43                     unsigned u = va_arg(va, unsigned);
44                     _printn(u, 10, 1, emitter, pData);
45                     break;
46                 }
47             case 'x':
48                 {
49                     unsigned u = va_arg(va, unsigned);
50                     _printn(u, 16, 0, emitter, pData);
51                     break;
52                 }
53             case 's': 
54                 {
55                     char *s = va_arg(va, char *);
56                     while (*s) {
57                         (*emitter)(*s, pData);
58                         s++;
59                     }
60                 }
61             }
62         }
63         else {
64             (*emitter)(*format, pData);
65         }
66         format++;
67     }
68 }
69
70 void putchar(char c);
71
72 STATIC void _char_emitter(char c, void *pData)
73 {
74     /* PENDING: Make the compiler happy. */
75     pData = 0;
76
77     putchar(c);
78 }
79
80 int printf(const char *format, ...)
81 {
82     va_list va;
83     va_start(va, format);
84
85     _printf(format, _char_emitter, NULL, va);
86
87     /* PENDING: What to return? */
88     return 0;
89 }