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