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