1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 #ifndef _PRINTF_ARGS_H
  19 #define _PRINTF_ARGS_H
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 #ifndef PRINTF_FETCHARGS
  28 # define PRINTF_FETCHARGS printf_fetchargs
  29 #endif
  30 
  31 
  32 #include <stddef.h>
  33 
  34 
  35 #if HAVE_WCHAR_T
  36 # include <stddef.h>
  37 #endif
  38 
  39 
  40 #if HAVE_WINT_T
  41 # include <wchar.h>
  42 #endif
  43 
  44 
  45 #include <stdarg.h>
  46 
  47 
  48 
  49 typedef enum
  50 {
  51   TYPE_NONE,
  52   TYPE_SCHAR,
  53   TYPE_UCHAR,
  54   TYPE_SHORT,
  55   TYPE_USHORT,
  56   TYPE_INT,
  57   TYPE_UINT,
  58   TYPE_LONGINT,
  59   TYPE_ULONGINT,
  60   TYPE_LONGLONGINT,
  61   TYPE_ULONGLONGINT,
  62   TYPE_DOUBLE,
  63   TYPE_LONGDOUBLE,
  64   TYPE_CHAR,
  65 #if HAVE_WINT_T
  66   TYPE_WIDE_CHAR,
  67 #endif
  68   TYPE_STRING,
  69 #if HAVE_WCHAR_T
  70   TYPE_WIDE_STRING,
  71 #endif
  72   TYPE_POINTER,
  73   TYPE_COUNT_SCHAR_POINTER,
  74   TYPE_COUNT_SHORT_POINTER,
  75   TYPE_COUNT_INT_POINTER,
  76   TYPE_COUNT_LONGINT_POINTER,
  77   TYPE_COUNT_LONGLONGINT_POINTER
  78 #if ENABLE_UNISTDIO
  79   
  80 , TYPE_U8_STRING
  81 , TYPE_U16_STRING
  82 , TYPE_U32_STRING
  83 #endif
  84 } arg_type;
  85 
  86 
  87 typedef struct
  88 {
  89   arg_type type;
  90   union
  91   {
  92     signed char                 a_schar;
  93     unsigned char               a_uchar;
  94     short                       a_short;
  95     unsigned short              a_ushort;
  96     int                         a_int;
  97     unsigned int                a_uint;
  98     long int                    a_longint;
  99     unsigned long int           a_ulongint;
 100     long long int               a_longlongint;
 101     unsigned long long int      a_ulonglongint;
 102     float                       a_float;
 103     double                      a_double;
 104     long double                 a_longdouble;
 105     int                         a_char;
 106 #if HAVE_WINT_T
 107     wint_t                      a_wide_char;
 108 #endif
 109     const char*                 a_string;
 110 #if HAVE_WCHAR_T
 111     const wchar_t*              a_wide_string;
 112 #endif
 113     void*                       a_pointer;
 114     signed char *               a_count_schar_pointer;
 115     short *                     a_count_short_pointer;
 116     int *                       a_count_int_pointer;
 117     long int *                  a_count_longint_pointer;
 118     long long int *             a_count_longlongint_pointer;
 119 #if ENABLE_UNISTDIO
 120     
 121     const uint8_t *             a_u8_string;
 122     const uint16_t *            a_u16_string;
 123     const uint32_t *            a_u32_string;
 124 #endif
 125   }
 126   a;
 127 }
 128 argument;
 129 
 130 
 131 #define N_DIRECT_ALLOC_ARGUMENTS 7
 132 
 133 typedef struct
 134 {
 135   size_t count;
 136   argument *arg;
 137   argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
 138 }
 139 arguments;
 140 
 141 
 142 
 143 #ifdef STATIC
 144 STATIC
 145 #else
 146 extern
 147 #endif
 148 int PRINTF_FETCHARGS (va_list args, arguments *a);
 149 
 150 #endif