25 typedef void (*putcf) (
void *, char);
26 static putcf stdout_putf;
27 static void *stdout_putp;
28 static char stdout_inited = 0;
30 #ifdef PRINTF_LONG_SUPPORT
33 uli2a(
unsigned long num,
unsigned long base,
int uc,
char *bf_out)
40 while(num / d >= base)
46 if(n || dgt > 0 || d == 0) {
47 *bf++ = dgt + (dgt < 10 ?
'0' : (uc ?
'A' :
'a') - 10);
52 while(n++ < 8 && base == 16) {
55 strcpy(bf_out, bf_tmp);
58 li2a(
long num,
char *bf)
64 uli2a(num, 10, 0, bf);
68 #ifdef PRINTF_FLOAT_SUPPORT
69 unsigned long decimal_array[6] = { 0, 10, 100, 1000, 10000, 100000 };
71 f2a(
double num,
int decimals,
char *bf)
88 num = num * decimal_array[decimals % 6];
89 uli2a((
unsigned long)num, 10, 0, bf);
94 for(i = length - decimals; i < length; ++i) {
105 ui2a(
unsigned int num,
unsigned int base,
int uc,
char *bf_out)
111 while(num / d >= base)
117 if(n || dgt > 0 || d == 0) {
118 *bf++ = dgt + (dgt < 10 ?
'0' : (uc ?
'A' :
'a') - 10);
123 while(n++ < 4 && base == 16) {
126 strcpy(bf_out, bf_tmp);
129 i2a(
int num,
char *bf)
135 ui2a(num, 10, 0, bf);
140 if(ch >=
'0' && ch <=
'9') {
142 }
else if(ch >=
'a' && ch <=
'f') {
143 return ch -
'a' + 10;
144 }
else if(ch >=
'A' && ch <=
'F') {
145 return ch -
'A' + 10;
150 a2i(
char ch,
const char **src,
int base,
int *nump)
152 const char *p = *src;
155 while((digit = a2d(ch)) >= 0) {
159 num = num * base + digit;
167 putchw(
void *putp, putcf putf,
int n,
char z,
char *bf)
169 char fc = z ?
'0' :
' ';
180 tfp_format(
void *putp, putcf putf,
const char *fmt, va_list va)
186 while((ch = *(fmt++))) {
191 #ifdef PRINTF_LONG_SUPPORT
200 if(ch >=
'0' && ch <=
'9') {
201 ch = a2i(ch, &fmt, 10, &w);
203 #ifdef PRINTF_LONG_SUPPORT
213 #ifdef PRINTF_LONG_SUPPORT
215 uli2a(va_arg(va,
unsigned long), 10, 0, bf);
218 ui2a(va_arg(va,
unsigned int), 10, 0, bf);
219 putchw(putp, putf, w, lz, bf);
224 #ifdef PRINTF_LONG_SUPPORT
226 li2a(va_arg(va,
unsigned long), bf);
229 { i2a(va_arg(va,
int), bf);
231 putchw(putp, putf, w, lz, bf);
235 #ifdef PRINTF_LONG_SUPPORT
237 uli2a(va_arg(va,
unsigned long), 16, (ch ==
'X'), bf);
240 ui2a(va_arg(va,
unsigned int), 16, (ch ==
'X'), bf);
241 putchw(putp, putf, w, lz, bf);
243 #ifdef PRINTF_FLOAT_SUPPORT
245 f2a(va_arg(va,
double), 2, bf);
246 putchw(putp, putf, w, lz, bf);
250 putf(putp, (
char)(va_arg(va,
int)));
253 putchw(putp, putf, w, 0, va_arg(va,
char *));
265 init_printf(
void *putp,
void (*putf) (
void *,
char))
272 tfp_printf(
const char *fmt, ...)
275 static int inited = 0;
280 tfp_format(stdout_putp, stdout_putf, fmt, va);
285 putcp(
void *p,
char c)
287 *(*((
char **)p))++ = c;
290 tfp_sprintf(
char *s,
const char *fmt, ...)
295 tfp_format(&s, putcp, fmt, va);