346eb3f1ad3ed600a49b36356c30785684b63bbd
[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 /* PENDING */
9 #define NULL    0
10
11 static void _printn(unsigned u, unsigned base, char issigned, void (*emitter)(), void *pData)
12 {
13     const char *_hex = "0123456789ABCDEF";
14     if (issigned && ((int)u < 0)) {
15         (*emitter)('-', pData);
16         u = (unsigned)-((int)u);
17     }
18     if (u >= base)
19         _printn(u/base, base, 0, emitter, pData);
20     (*emitter)(_hex[u%base], pData);
21 }
22
23 static void _printf(const char *format, void (*emitter)(), void *pData, va_list va)
24 {
25     while (*format) {
26         if (*format == '%') {
27             switch (*++format) {
28             case 'c': {
29                 char c = va_arg(va, char);
30                 (*emitter)(c, pData);
31                 break;
32             }
33             case 'u':
34                 {
35                     unsigned u = va_arg(va, unsigned);
36                     _printn(u, 10, 0, emitter, pData);
37                     break;
38                 }
39             case 'd':
40                 {
41                     unsigned u = va_arg(va, unsigned);
42                     _printn(u, 10, 1, emitter, pData);
43                     break;
44                 }
45             case 'x':
46                 {
47                     unsigned u = va_arg(va, unsigned);
48                     _printn(u, 16, 0, emitter, pData);
49                     break;
50                 }
51             case 's': 
52                 {
53                     char *s = va_arg(va, char *);
54                     while (*s) {
55                         (*emitter)(*s, pData);
56                         s++;
57                     }
58                 }
59             }
60         }
61         else {
62             (*emitter)(*format, pData);
63         }
64         format++;
65     }
66 }
67
68 void putchar(char c);
69
70 static void _char_emitter(char c, void *pData)
71 {
72     /* PENDING: Make the compiler happy. */
73     pData = 0;
74
75     putchar(c);
76 }
77
78 int printf(const char *format, ...)
79 {
80     va_list va;
81     va_start(va, format);
82
83     _printf(format, _char_emitter, NULL, va);
84     _printf(format, _char_emitter, NULL, va);
85
86     /* PENDING: What to return? */
87     return 0;
88 }