33#ifdef HAVE_UBSAN_SUPPORT
40#define PRINTF_LONG_SUPPORT
43#define PRINTF_LONG_LONG_SUPPORT
46#define PRINTF_SIZE_T_SUPPORT
51#ifdef PRINTF_SIZE_T_SUPPORT
55#ifdef PRINTF_LONG_LONG_SUPPORT
56# define PRINTF_LONG_SUPPORT
60#ifdef __SIZEOF_POINTER__
61# define SIZEOF_POINTER __SIZEOF_POINTER__
63#ifdef __SIZEOF_LONG_LONG__
64# define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__
67# define SIZEOF_LONG __SIZEOF_LONG__
70# define SIZEOF_INT __SIZEOF_INT__
73#if defined(__GNUC__) || defined(__clang__)
74# define _TFP_GCC_NO_INLINE_ __attribute__ ((noinline))
76# define _TFP_GCC_NO_INLINE_
94#ifdef PRINTF_LONG_LONG_SUPPORT
95static void _TFP_GCC_NO_INLINE_ ulli2a(
96 unsigned long long int num,
struct param *p)
99 unsigned long long int d = 1;
101 while (num / d >= p->base)
107 if (n || dgt > 0 || d == 0) {
108 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
115static void lli2a(
long long int num,
struct param *p)
125#ifdef PRINTF_LONG_SUPPORT
126static void uli2a(
unsigned long int num,
struct param *p)
129 unsigned long int d = 1;
131 while (num / d >= p->base)
137 if (n || dgt > 0 || d == 0) {
138 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
145static void li2a(
long num,
struct param *p)
155static void ui2a(
unsigned int num,
struct param *p)
160 while (num / d >= p->base)
166 if (n || dgt > 0 || d == 0) {
167 *bf++ = dgt + (dgt < 10 ?
'0' : (p->uc ?
'A' :
'a') - 10);
174static void i2a(
int num,
struct param *p)
183static int a2d(
char ch)
185 if (ch >=
'0' && ch <=
'9')
187 else if (ch >=
'a' && ch <=
'f')
188 return ch -
'a' + 10;
189 else if (ch >=
'A' && ch <=
'F')
190 return ch -
'A' + 10;
195static char a2u(
char ch,
const char **src,
int base,
unsigned int *nump)
197 const char *p = *src;
198 unsigned int num = 0;
200 while ((digit = a2d(ch)) >= 0) {
203 num = num *
base + digit;
211static void putchw(
void *putp,
putcf putf,
struct param *p)
218 while (*bf++ && n > 0)
222 if (p->alt && p->base == 16)
224 else if (p->alt && p->base == 8)
228 if (!p->lz && !p->align_left) {
238 if (p->alt && p->base == 16) {
240 putf(putp, (p->uc ?
'X' :
'x'));
241 }
else if (p->alt && p->base == 8) {
257 if (!p->lz && p->align_left) {
266#ifdef PRINTF_LONG_SUPPORT
274 while ((ch = *(fmt++))) {
278#ifdef PRINTF_LONG_SUPPORT
289 while ((ch = *(fmt++))) {
307 if (ch >=
'0' && ch <=
'9') {
308 ch = a2u(ch, &fmt, 10, &(p.width));
319 }
while ((ch >=
'0') && (ch <=
'9'));
322#ifdef PRINTF_SIZE_T_SUPPORT
323# ifdef PRINTF_LONG_SUPPORT
326 if (
sizeof(
size_t) ==
sizeof(
unsigned long int))
328# ifdef PRINTF_LONG_LONG_SUPPORT
329 else if (
sizeof(
size_t) ==
sizeof(
unsigned long long int))
336#ifdef PRINTF_LONG_SUPPORT
340#ifdef PRINTF_LONG_LONG_SUPPORT
354#ifdef PRINTF_LONG_SUPPORT
355#ifdef PRINTF_LONG_LONG_SUPPORT
357 ulli2a(
va_arg(va,
unsigned long long int), &p);
361 uli2a(
va_arg(va,
unsigned long int), &p);
364 ui2a(
va_arg(va,
unsigned int), &p);
365 putchw(putp, putf, &p);
370#ifdef PRINTF_LONG_SUPPORT
371#ifdef PRINTF_LONG_LONG_SUPPORT
373 lli2a(
va_arg(va,
long long int), &p);
377 li2a(
va_arg(va,
long int), &p);
381 putchw(putp, putf, &p);
386# if defined(SIZEOF_INT) && SIZEOF_POINTER <= SIZEOF_INT
388# elif defined(SIZEOF_LONG) && SIZEOF_POINTER <= SIZEOF_LONG
390# elif defined(SIZEOF_LONG_LONG) && SIZEOF_POINTER <= SIZEOF_LONG_LONG
398 p.uc = (ch ==
'X')?1:0;
399#ifdef PRINTF_LONG_SUPPORT
400#ifdef PRINTF_LONG_LONG_SUPPORT
402 ulli2a(
va_arg(va,
unsigned long long int), &p);
406 uli2a(
va_arg(va,
unsigned long int), &p);
409 ui2a(
va_arg(va,
unsigned int), &p);
410 putchw(putp, putf, &p);
415 ui2a(
va_arg(va,
unsigned int), &p);
416 putchw(putp, putf, &p);
419 putf(putp, (
char)(
va_arg(va,
int)));
422 p.bf =
va_arg(va,
char *);
423 putchw(putp, putf, &p);
436#if TINYPRINTF_DEFINE_TFP_PRINTF
437static putcf stdout_putf;
438static void *stdout_putp;
440void init_printf(
void *putp,
putcf putf)
446void EFIAPI tfp_printf(
char *fmt, ...)
450 tfp_format(stdout_putp, stdout_putf, fmt, va);
455#if TINYPRINTF_DEFINE_TFP_SPRINTF
456struct _vsnprintf_putcf_data
458 size_t dest_capacity;
463static void _vsnprintf_putcf(
void *p,
char c)
465 struct _vsnprintf_putcf_data *data = (
struct _vsnprintf_putcf_data*)p;
466 if (data->num_chars < data->dest_capacity)
467 data->dest[data->num_chars] = c;
473 struct _vsnprintf_putcf_data data;
479 data.dest_capacity =
size-1;
481 tfp_format(&data, _vsnprintf_putcf, format, ap);
483 if (data.num_chars < data.dest_capacity)
484 data.dest[data.num_chars] =
'\0';
486 data.dest[data.dest_capacity] =
'\0';
488 return data.num_chars;
502struct _vsprintf_putcf_data
508static void _vsprintf_putcf(
void *p,
char c)
510 struct _vsprintf_putcf_data *data = (
struct _vsprintf_putcf_data*)p;
511 data->dest[data->num_chars++] = c;
516 struct _vsprintf_putcf_data data;
519 tfp_format(&data, _vsprintf_putcf, format, ap);
520 data.dest[data.num_chars] =
'\0';
521 return data.num_chars;
524int EFIAPI
tfp_sprintf(
char *str,
const char *format, ...)
int tfp_vsnprintf(char *str, size_t size, const char *fmt, va_list ap)
int EFIAPI tfp_sprintf(char *str, const char *fmt,...) __printflike(2
int EFIAPI int EFIAPI tfp_vsprintf(char *str, const char *fmt, va_list ap)
void EFIAPI tfp_format(void *putp, putcf putf, const char *fmt, va_list va)
void(* putcf)(void *, char)
int EFIAPI tfp_snprintf(char *str, size_t size, const char *fmt,...) __printflike(3