1 /* Decomposed printf argument list. 2 Copyright (C) 1999, 2002-2003, 2006-2007 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify it 5 under the terms of the GNU Library General Public License as published 6 by the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU Library General Public 15 License along with this program; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 17 USA. */ 18 19 #ifndef _PRINTF_ARGS_H 20 #define _PRINTF_ARGS_H 21 22 /* This file can be parametrized with the following macros: 23 ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. 24 PRINTF_FETCHARGS Name of the function to be declared. 25 STATIC Set to 'static' to declare the function static. */ 26 27 /* Default parameters. */ 28 #ifndef PRINTF_FETCHARGS 29 # define PRINTF_FETCHARGS printf_fetchargs 30 #endif 31 32 /* Get size_t. */ 33 #include <stddef.h> 34 35 /* Get wchar_t. */ 36 #if HAVE_WCHAR_T 37 # include <stddef.h> 38 #endif 39 40 /* Get wint_t. */ 41 #if HAVE_WINT_T 42 # include <wchar.h> 43 #endif 44 45 /* Get va_list. */ 46 #include <stdarg.h> 47 48 49 /* Argument types */ 50 typedef enum 51 { 52 TYPE_NONE, 53 TYPE_SCHAR, 54 TYPE_UCHAR, 55 TYPE_SHORT, 56 TYPE_USHORT, 57 TYPE_INT, 58 TYPE_UINT, 59 TYPE_LONGINT, 60 TYPE_ULONGINT, 61 #if HAVE_LONG_LONG_INT 62 TYPE_LONGLONGINT, 63 TYPE_ULONGLONGINT, 64 #endif 65 TYPE_DOUBLE, 66 TYPE_LONGDOUBLE, 67 TYPE_CHAR, 68 #if HAVE_WINT_T 69 TYPE_WIDE_CHAR, 70 #endif 71 TYPE_STRING, 72 #if HAVE_WCHAR_T 73 TYPE_WIDE_STRING, 74 #endif 75 TYPE_POINTER, 76 TYPE_COUNT_SCHAR_POINTER, 77 TYPE_COUNT_SHORT_POINTER, 78 TYPE_COUNT_INT_POINTER, 79 TYPE_COUNT_LONGINT_POINTER 80 #if HAVE_LONG_LONG_INT 81 , TYPE_COUNT_LONGLONGINT_POINTER 82 #endif 83 #if ENABLE_UNISTDIO 84 /* The unistdio extensions. */ 85 , TYPE_U8_STRING 86 , TYPE_U16_STRING 87 , TYPE_U32_STRING 88 #endif 89 } arg_type; 90 91 /* Polymorphic argument */ 92 typedef struct 93 { 94 arg_type type; 95 union 96 { 97 signed char a_schar; 98 unsigned char a_uchar; 99 short a_short; 100 unsigned short a_ushort; 101 int a_int; 102 unsigned int a_uint; 103 long int a_longint; 104 unsigned long int a_ulongint; 105 #if HAVE_LONG_LONG_INT 106 long long int a_longlongint; 107 unsigned long long int a_ulonglongint; 108 #endif 109 float a_float; 110 double a_double; 111 long double a_longdouble; 112 int a_char; 113 #if HAVE_WINT_T 114 wint_t a_wide_char; 115 #endif 116 const char* a_string; 117 #if HAVE_WCHAR_T 118 const wchar_t* a_wide_string; 119 #endif 120 void* a_pointer; 121 signed char * a_count_schar_pointer; 122 short * a_count_short_pointer; 123 int * a_count_int_pointer; 124 long int * a_count_longint_pointer; 125 #if HAVE_LONG_LONG_INT 126 long long int * a_count_longlongint_pointer; 127 #endif 128 #if ENABLE_UNISTDIO 129 /* The unistdio extensions. */ 130 const uint8_t * a_u8_string; 131 const uint16_t * a_u16_string; 132 const uint32_t * a_u32_string; 133 #endif 134 } 135 a; 136 } 137 argument; 138 139 typedef struct 140 { 141 size_t count; 142 argument *arg; 143 } 144 arguments; 145 146 147 /* Fetch the arguments, putting them into a. */ 148 #ifdef STATIC 149 STATIC 150 #else 151 extern 152 #endif 153 int PRINTF_FETCHARGS (va_list args, arguments *a); 154 155 #endif /* _PRINTF_ARGS_H */ 156