28 #include "tinyprintf.h" 36 #define PRINTF_LONG_SUPPORT 39 #define PRINTF_LONG_LONG_SUPPORT 42 #define PRINTF_SIZE_T_SUPPORT 47 #ifdef PRINTF_SIZE_T_SUPPORT 48 #include <sys/types.h> 51 #ifdef PRINTF_LONG_LONG_SUPPORT 52 # define PRINTF_LONG_SUPPORT 56 #ifdef __SIZEOF_POINTER__ 57 # define SIZEOF_POINTER __SIZEOF_POINTER__ 59 #ifdef __SIZEOF_LONG_LONG__ 60 # define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__ 62 #ifdef __SIZEOF_LONG__ 63 # define SIZEOF_LONG __SIZEOF_LONG__ 66 # define SIZEOF_INT __SIZEOF_INT__ 70 # define _TFP_GCC_NO_INLINE_ __attribute__ ((noinline)) 72 # define _TFP_GCC_NO_INLINE_ 90 #ifdef PRINTF_LONG_LONG_SUPPORT 91 static void _TFP_GCC_NO_INLINE_ ulli2a(
92 unsigned long long int num,
struct param *p)
95 unsigned long long int d = 1;
97 while (num / d >= p->base)
103 if (n || dgt > 0 || d == 0) {
104 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
111 static void lli2a(
long long int num,
struct param *p)
121 #ifdef PRINTF_LONG_SUPPORT 122 static void uli2a(
unsigned long int num,
struct param *p)
125 unsigned long int d = 1;
127 while (num / d >= p->base)
133 if (n || dgt > 0 || d == 0) {
134 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
141 static void li2a(
long num,
struct param *p)
151 static void ui2a(
unsigned int num,
struct param *p)
156 while (num / d >= p->base)
162 if (n || dgt > 0 || d == 0) {
163 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
170 static void i2a(
int num,
struct param *p)
179 static int a2d(
char ch)
181 if (ch >=
'0' && ch <=
'9')
183 else if (ch >=
'a' && ch <=
'f')
184 return ch -
'a' + 10;
185 else if (ch >=
'A' && ch <=
'F')
186 return ch -
'A' + 10;
191 static char a2u(
char ch,
const char **src,
int base,
unsigned int *nump)
193 const char *p = *src;
194 unsigned int num = 0;
196 while ((digit = a2d(ch)) >= 0) {
199 num = num * base + digit;
207 static void putchw(
void *putp, putcf putf,
struct param *p)
214 while (*bf++ && n > 0)
218 if (p->alt && p->base == 16)
220 else if (p->alt && p->base == 8)
224 if (!p->lz && !p->align_left) {
234 if (p->alt && p->base == 16) {
236 putf(putp, (p->uc ?
'X' :
'x'));
237 }
else if (p->alt && p->base == 8) {
253 if (!p->lz && p->align_left) {
259 void tfp_format(
void *putp, putcf putf,
const char *fmt, va_list va)
262 #ifdef PRINTF_LONG_SUPPORT 270 while ((ch = *(fmt++))) {
274 #ifdef PRINTF_LONG_SUPPORT 285 while ((ch = *(fmt++))) {
303 if (ch >=
'0' && ch <=
'9') {
304 ch = a2u(ch, &fmt, 10, &(p.width));
315 }
while ((ch >=
'0') && (ch <=
'9'));
318 #ifdef PRINTF_SIZE_T_SUPPORT 319 # ifdef PRINTF_LONG_SUPPORT 322 if (
sizeof(
size_t) ==
sizeof(
unsigned long int))
324 # ifdef PRINTF_LONG_LONG_SUPPORT 325 else if (
sizeof(
size_t) ==
sizeof(
unsigned long long int))
332 #ifdef PRINTF_LONG_SUPPORT 336 #ifdef PRINTF_LONG_LONG_SUPPORT 349 #ifdef PRINTF_LONG_SUPPORT 350 #ifdef PRINTF_LONG_LONG_SUPPORT 352 ulli2a(va_arg(va,
unsigned long long int), &p);
356 uli2a(va_arg(va,
unsigned long int), &p);
359 ui2a(va_arg(va,
unsigned int), &p);
360 putchw(putp, putf, &p);
365 #ifdef PRINTF_LONG_SUPPORT 366 #ifdef PRINTF_LONG_LONG_SUPPORT 368 lli2a(va_arg(va,
long long int), &p);
372 li2a(va_arg(va,
long int), &p);
375 i2a(va_arg(va,
int), &p);
376 putchw(putp, putf, &p);
378 #ifdef SIZEOF_POINTER 381 # if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT 383 # elif defined(SIZEOF_LONG) && SIZEOF_POINTER <= SIZEOF_LONG 385 # elif defined(SIZEOF_LONG_LONG) && SIZEOF_POINTER <= SIZEOF_LONG_LONG 392 p.uc = (ch ==
'X')?1:0;
393 #ifdef PRINTF_LONG_SUPPORT 394 #ifdef PRINTF_LONG_LONG_SUPPORT 396 ulli2a(va_arg(va,
unsigned long long int), &p);
400 uli2a(va_arg(va,
unsigned long int), &p);
403 ui2a(va_arg(va,
unsigned int), &p);
404 putchw(putp, putf, &p);
408 ui2a(va_arg(va,
unsigned int), &p);
409 putchw(putp, putf, &p);
412 putf(putp, (
char)(va_arg(va,
int)));
415 p.bf = va_arg(va,
char *);
416 putchw(putp, putf, &p);
429 #if TINYPRINTF_DEFINE_TFP_PRINTF 430 static putcf stdout_putf;
431 static void *stdout_putp;
433 void init_printf(
void *putp, putcf putf)
439 void tfp_printf(
char *fmt, ...)
443 tfp_format(stdout_putp, stdout_putf, fmt, va);
445 stdout_putf((
void *)START_TX,0);
450 #if TINYPRINTF_DEFINE_TFP_SPRINTF 451 struct _vsnprintf_putcf_data
453 size_t dest_capacity;
458 static void _vsnprintf_putcf(
void *p,
char c)
460 struct _vsnprintf_putcf_data *data = (
struct _vsnprintf_putcf_data*)p;
461 if (data->num_chars < data->dest_capacity)
462 data->dest[data->num_chars] = c;
466 int tfp_vsnprintf(
char *str,
size_t size,
const char *format, va_list ap)
468 struct _vsnprintf_putcf_data data;
474 data.dest_capacity = size-1;
476 tfp_format(&data, _vsnprintf_putcf, format, ap);
478 if (data.num_chars < data.dest_capacity)
479 data.dest[data.num_chars] =
'\0';
481 data.dest[data.dest_capacity] =
'\0';
483 return data.num_chars;
486 int tfp_snprintf(
char *str,
size_t size,
const char *format, ...)
491 va_start(ap, format);
492 retval = tfp_vsnprintf(str, size, format, ap);
497 struct _vsprintf_putcf_data
503 static void _vsprintf_putcf(
void *p,
char c)
505 struct _vsprintf_putcf_data *data = (
struct _vsprintf_putcf_data*)p;
506 data->dest[data->num_chars++] = c;
509 int tfp_vsprintf(
char *str,
const char *format, va_list ap)
511 struct _vsprintf_putcf_data data;
514 tfp_format(&data, _vsprintf_putcf, format, ap);
515 data.dest[data.num_chars] =
'\0';
516 return data.num_chars;
519 int tfp_sprintf(
char *str,
const char *format, ...)
524 va_start(ap, format);
525 retval = tfp_vsprintf(str, format, ap);