diff options
Diffstat (limited to 'tmk_core/common/chibios/printf.c')
-rw-r--r-- | tmk_core/common/chibios/printf.c | 277 |
1 files changed, 128 insertions, 149 deletions
diff --git a/tmk_core/common/chibios/printf.c b/tmk_core/common/chibios/printf.c index 72e3d4f8c..dbd059448 100644 --- a/tmk_core/common/chibios/printf.c +++ b/tmk_core/common/chibios/printf.c | |||
@@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
26 | 26 | ||
27 | #include "printf.h" | 27 | #include "printf.h" |
28 | 28 | ||
29 | typedef void (*putcf) (void*,char); | 29 | typedef void (*putcf)(void*, char); |
30 | static putcf stdout_putf; | 30 | static putcf stdout_putf; |
31 | static void* stdout_putp; | 31 | static void* stdout_putp; |
32 | 32 | ||
@@ -35,206 +35,185 @@ static void* stdout_putp; | |||
35 | 35 | ||
36 | #ifdef PRINTF_LONG_SUPPORT | 36 | #ifdef PRINTF_LONG_SUPPORT |
37 | 37 | ||
38 | static void uli2a(unsigned long int num, unsigned int base, int uc,char * bf) | 38 | static void uli2a(unsigned long int num, unsigned int base, int uc, char* bf) { |
39 | { | 39 | int n = 0; |
40 | int n=0; | 40 | unsigned int d = 1; |
41 | unsigned int d=1; | 41 | while (num / d >= base) d *= base; |
42 | while (num/d >= base) | 42 | while (d != 0) { |
43 | d*=base; | ||
44 | while (d!=0) { | ||
45 | int dgt = num / d; | 43 | int dgt = num / d; |
46 | num%=d; | 44 | num %= d; |
47 | d/=base; | 45 | d /= base; |
48 | if (n || dgt>0|| d==0) { | 46 | if (n || dgt > 0 || d == 0) { |
49 | *bf++ = dgt+(dgt<10 ? '0' : (uc ? 'A' : 'a')-10); | 47 | *bf++ = dgt + (dgt < 10 ? '0' : (uc ? 'A' : 'a') - 10); |
50 | ++n; | 48 | ++n; |
51 | } | ||
52 | } | 49 | } |
53 | *bf=0; | ||
54 | } | 50 | } |
51 | *bf = 0; | ||
52 | } | ||
55 | 53 | ||
56 | static void li2a (long num, char * bf) | 54 | static void li2a(long num, char* bf) { |
57 | { | 55 | if (num < 0) { |
58 | if (num<0) { | 56 | num = -num; |
59 | num=-num; | ||
60 | *bf++ = '-'; | 57 | *bf++ = '-'; |
61 | } | ||
62 | uli2a(num,10,0,bf); | ||
63 | } | 58 | } |
59 | uli2a(num, 10, 0, bf); | ||
60 | } | ||
64 | 61 | ||
65 | #endif | 62 | #endif |
66 | 63 | ||
67 | static void ui2a(unsigned int num, unsigned int base, int uc,char * bf) | 64 | static void ui2a(unsigned int num, unsigned int base, int uc, char* bf) { |
68 | { | 65 | int n = 0; |
69 | int n=0; | 66 | unsigned int d = 1; |
70 | unsigned int d=1; | 67 | while (num / d >= base) d *= base; |
71 | while (num/d >= base) | 68 | while (d != 0) { |
72 | d*=base; | ||
73 | while (d!=0) { | ||
74 | int dgt = num / d; | 69 | int dgt = num / d; |
75 | num%= d; | 70 | num %= d; |
76 | d/=base; | 71 | d /= base; |
77 | if (n || dgt>0 || d==0) { | 72 | if (n || dgt > 0 || d == 0) { |
78 | *bf++ = dgt+(dgt<10 ? '0' : (uc ? 'A' : 'a')-10); | 73 | *bf++ = dgt + (dgt < 10 ? '0' : (uc ? 'A' : 'a') - 10); |
79 | ++n; | 74 | ++n; |
80 | } | ||
81 | } | 75 | } |
82 | *bf=0; | ||
83 | } | 76 | } |
77 | *bf = 0; | ||
78 | } | ||
84 | 79 | ||
85 | static void i2a (int num, char * bf) | 80 | static void i2a(int num, char* bf) { |
86 | { | 81 | if (num < 0) { |
87 | if (num<0) { | 82 | num = -num; |
88 | num=-num; | ||
89 | *bf++ = '-'; | 83 | *bf++ = '-'; |
90 | } | ||
91 | ui2a(num,10,0,bf); | ||
92 | } | 84 | } |
93 | 85 | ui2a(num, 10, 0, bf); | |
94 | static int a2d(char ch) | 86 | } |
95 | { | 87 | |
96 | if (ch>='0' && ch<='9') | 88 | static int a2d(char ch) { |
97 | return ch-'0'; | 89 | if (ch >= '0' && ch <= '9') |
98 | else if (ch>='a' && ch<='f') | 90 | return ch - '0'; |
99 | return ch-'a'+10; | 91 | else if (ch >= 'a' && ch <= 'f') |
100 | else if (ch>='A' && ch<='F') | 92 | return ch - 'a' + 10; |
101 | return ch-'A'+10; | 93 | else if (ch >= 'A' && ch <= 'F') |
102 | else return -1; | 94 | return ch - 'A' + 10; |
95 | else | ||
96 | return -1; | ||
97 | } | ||
98 | |||
99 | static char a2i(char ch, char** src, int base, int* nump) { | ||
100 | char* p = *src; | ||
101 | int num = 0; | ||
102 | int digit; | ||
103 | while ((digit = a2d(ch)) >= 0) { | ||
104 | if (digit > base) break; | ||
105 | num = num * base + digit; | ||
106 | ch = *p++; | ||
103 | } | 107 | } |
104 | 108 | *src = p; | |
105 | static char a2i(char ch, char** src,int base,int* nump) | 109 | *nump = num; |
106 | { | ||
107 | char* p= *src; | ||
108 | int num=0; | ||
109 | int digit; | ||
110 | while ((digit=a2d(ch))>=0) { | ||
111 | if (digit>base) break; | ||
112 | num=num*base+digit; | ||
113 | ch=*p++; | ||
114 | } | ||
115 | *src=p; | ||
116 | *nump=num; | ||
117 | return ch; | 110 | return ch; |
118 | } | 111 | } |
119 | 112 | ||
120 | static void putchw(void* putp,putcf putf,int n, char z, char* bf) | 113 | static void putchw(void* putp, putcf putf, int n, char z, char* bf) { |
121 | { | 114 | char fc = z ? '0' : ' '; |
122 | char fc=z? '0' : ' '; | 115 | char ch; |
123 | char ch; | 116 | char* p = bf; |
124 | char* p=bf; | 117 | while (*p++ && n > 0) n--; |
125 | while (*p++ && n > 0) | 118 | while (n-- > 0) putf(putp, fc); |
126 | n--; | 119 | while ((ch = *bf++)) putf(putp, ch); |
127 | while (n-- > 0) | 120 | } |
128 | putf(putp,fc); | 121 | |
129 | while ((ch= *bf++)) | 122 | void tfp_format(void* putp, putcf putf, char* fmt, va_list va) { |
130 | putf(putp,ch); | ||
131 | } | ||
132 | |||
133 | void tfp_format(void* putp,putcf putf,char *fmt, va_list va) | ||
134 | { | ||
135 | char bf[12]; | 123 | char bf[12]; |
136 | |||
137 | char ch; | ||
138 | 124 | ||
125 | char ch; | ||
139 | 126 | ||
140 | while ((ch=*(fmt++))) { | 127 | while ((ch = *(fmt++))) { |
141 | if (ch!='%') | 128 | if (ch != '%') |
142 | putf(putp,ch); | 129 | putf(putp, ch); |
143 | else { | 130 | else { |
144 | char lz=0; | 131 | char lz = 0; |
145 | #ifdef PRINTF_LONG_SUPPORT | 132 | #ifdef PRINTF_LONG_SUPPORT |
146 | char lng=0; | 133 | char lng = 0; |
147 | #endif | 134 | #endif |
148 | int w=0; | 135 | int w = 0; |
149 | ch=*(fmt++); | 136 | ch = *(fmt++); |
150 | if (ch=='0') { | 137 | if (ch == '0') { |
151 | ch=*(fmt++); | 138 | ch = *(fmt++); |
152 | lz=1; | 139 | lz = 1; |
153 | } | 140 | } |
154 | if (ch>='0' && ch<='9') { | 141 | if (ch >= '0' && ch <= '9') { |
155 | ch=a2i(ch,&fmt,10,&w); | 142 | ch = a2i(ch, &fmt, 10, &w); |
156 | } | 143 | } |
157 | #ifdef PRINTF_LONG_SUPPORT | 144 | #ifdef PRINTF_LONG_SUPPORT |
158 | if (ch=='l') { | 145 | if (ch == 'l') { |
159 | ch=*(fmt++); | 146 | ch = *(fmt++); |
160 | lng=1; | 147 | lng = 1; |
161 | } | 148 | } |
162 | #endif | 149 | #endif |
163 | switch (ch) { | 150 | switch (ch) { |
164 | case 0: | 151 | case 0: |
165 | goto abort; | 152 | goto abort; |
166 | case 'u' : { | 153 | case 'u': { |
167 | #ifdef PRINTF_LONG_SUPPORT | 154 | #ifdef PRINTF_LONG_SUPPORT |
168 | if (lng) | 155 | if (lng) |
169 | uli2a(va_arg(va, unsigned long int),10,0,bf); | 156 | uli2a(va_arg(va, unsigned long int), 10, 0, bf); |
170 | else | 157 | else |
171 | #endif | 158 | #endif |
172 | ui2a(va_arg(va, unsigned int),10,0,bf); | 159 | ui2a(va_arg(va, unsigned int), 10, 0, bf); |
173 | putchw(putp,putf,w,lz,bf); | 160 | putchw(putp, putf, w, lz, bf); |
174 | break; | 161 | break; |
175 | } | 162 | } |
176 | case 'd' : { | 163 | case 'd': { |
177 | #ifdef PRINTF_LONG_SUPPORT | 164 | #ifdef PRINTF_LONG_SUPPORT |
178 | if (lng) | 165 | if (lng) |
179 | li2a(va_arg(va, unsigned long int),bf); | 166 | li2a(va_arg(va, unsigned long int), bf); |
180 | else | 167 | else |
181 | #endif | 168 | #endif |
182 | i2a(va_arg(va, int),bf); | 169 | i2a(va_arg(va, int), bf); |
183 | putchw(putp,putf,w,lz,bf); | 170 | putchw(putp, putf, w, lz, bf); |
184 | break; | 171 | break; |
185 | } | 172 | } |
186 | case 'x': case 'X' : | 173 | case 'x': |
187 | #ifdef PRINTF_LONG_SUPPORT | 174 | case 'X': |
175 | #ifdef PRINTF_LONG_SUPPORT | ||
188 | if (lng) | 176 | if (lng) |
189 | uli2a(va_arg(va, unsigned long int),16,(ch=='X'),bf); | 177 | uli2a(va_arg(va, unsigned long int), 16, (ch == 'X'), bf); |
190 | else | 178 | else |
191 | #endif | 179 | #endif |
192 | ui2a(va_arg(va, unsigned int),16,(ch=='X'),bf); | 180 | ui2a(va_arg(va, unsigned int), 16, (ch == 'X'), bf); |
193 | putchw(putp,putf,w,lz,bf); | 181 | putchw(putp, putf, w, lz, bf); |
194 | break; | 182 | break; |
195 | case 'c' : | 183 | case 'c': |
196 | putf(putp,(char)(va_arg(va, int))); | 184 | putf(putp, (char)(va_arg(va, int))); |
197 | break; | 185 | break; |
198 | case 's' : | 186 | case 's': |
199 | putchw(putp,putf,w,0,va_arg(va, char*)); | 187 | putchw(putp, putf, w, 0, va_arg(va, char*)); |
200 | break; | 188 | break; |
201 | case '%' : | 189 | case '%': |
202 | putf(putp,ch); | 190 | putf(putp, ch); |
203 | default: | 191 | default: |
204 | break; | 192 | break; |
205 | } | ||
206 | } | 193 | } |
207 | } | 194 | } |
208 | abort:; | ||
209 | } | 195 | } |
196 | abort:; | ||
197 | } | ||
210 | 198 | ||
199 | void init_printf(void* putp, void (*putf)(void*, char)) { | ||
200 | stdout_putf = putf; | ||
201 | stdout_putp = putp; | ||
202 | } | ||
211 | 203 | ||
212 | void init_printf(void* putp,void (*putf) (void*,char)) | 204 | void tfp_printf(char* fmt, ...) { |
213 | { | ||
214 | stdout_putf=putf; | ||
215 | stdout_putp=putp; | ||
216 | } | ||
217 | |||
218 | void tfp_printf(char *fmt, ...) | ||
219 | { | ||
220 | va_list va; | 205 | va_list va; |
221 | va_start(va,fmt); | 206 | va_start(va, fmt); |
222 | tfp_format(stdout_putp,stdout_putf,fmt,va); | 207 | tfp_format(stdout_putp, stdout_putf, fmt, va); |
223 | va_end(va); | 208 | va_end(va); |
224 | } | 209 | } |
225 | |||
226 | static void putcp(void* p,char c) | ||
227 | { | ||
228 | *(*((char**)p))++ = c; | ||
229 | } | ||
230 | 210 | ||
211 | static void putcp(void* p, char c) { *(*((char**)p))++ = c; } | ||
231 | 212 | ||
232 | 213 | void tfp_sprintf(char* s, char* fmt, ...) { | |
233 | void tfp_sprintf(char* s,char *fmt, ...) | ||
234 | { | ||
235 | va_list va; | 214 | va_list va; |
236 | va_start(va,fmt); | 215 | va_start(va, fmt); |
237 | tfp_format(&s,putcp,fmt,va); | 216 | tfp_format(&s, putcp, fmt, va); |
238 | putcp(&s,0); | 217 | putcp(&s, 0); |
239 | va_end(va); | 218 | va_end(va); |
240 | } | 219 | } |