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