105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Decomposed printf argument list. 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2012 Free Software 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Foundation, Inc. 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software; you can redistribute it and/or modify 605436638acc7c010349a69c3395f1a57c642dc62Ying Wang it under the terms of the GNU General Public License as published by 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation; either version 3, or (at your option) 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang any later version. 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is distributed in the hope that it will be useful, 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang but WITHOUT ANY WARRANTY; without even the implied warranty of 1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang GNU General Public License for more details. 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang You should have received a copy of the GNU General Public License along 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang with this program; if not, see <http://www.gnu.org/licenses/>. */ 1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _PRINTF_ARGS_H 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _PRINTF_ARGS_H 2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* This file can be parametrized with the following macros: 2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang PRINTF_FETCHARGS Name of the function to be declared. 2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang STATIC Set to 'static' to declare the function static. */ 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Default parameters. */ 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef PRINTF_FETCHARGS 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define PRINTF_FETCHARGS printf_fetchargs 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Get size_t. */ 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stddef.h> 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Get wchar_t. */ 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WCHAR_T 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <stddef.h> 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Get wint_t. */ 4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WINT_T 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <wchar.h> 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Get va_list. */ 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdarg.h> 4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Argument types */ 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef enum 5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_NONE, 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_SCHAR, 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_UCHAR, 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_SHORT, 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_USHORT, 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_INT, 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_UINT, 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_LONGINT, 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_ULONGINT, 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_LONG_LONG_INT 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_LONGLONGINT, 6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_ULONGLONGINT, 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_DOUBLE, 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_LONGDOUBLE, 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_CHAR, 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WINT_T 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_WIDE_CHAR, 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_STRING, 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WCHAR_T 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_WIDE_STRING, 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_POINTER, 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_COUNT_SCHAR_POINTER, 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_COUNT_SHORT_POINTER, 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_COUNT_INT_POINTER, 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang TYPE_COUNT_LONGINT_POINTER 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_LONG_LONG_INT 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang, TYPE_COUNT_LONGLONGINT_POINTER 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if ENABLE_UNISTDIO 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The unistdio extensions. */ 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang, TYPE_U8_STRING 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang, TYPE_U16_STRING 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang, TYPE_U32_STRING 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang} arg_type; 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Polymorphic argument */ 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef struct 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang arg_type type; 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang union 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang signed char a_schar; 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned char a_uchar; 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang short a_short; 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned short a_ushort; 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int a_int; 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned int a_uint; 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang long int a_longint; 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned long int a_ulongint; 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_LONG_LONG_INT 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang long long int a_longlongint; 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang unsigned long long int a_ulonglongint; 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang float a_float; 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang double a_double; 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang long double a_longdouble; 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang int a_char; 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WINT_T 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang wint_t a_wide_char; 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char* a_string; 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_WCHAR_T 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang const wchar_t* a_wide_string; 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang void* a_pointer; 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang signed char * a_count_schar_pointer; 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang short * a_count_short_pointer; 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang int * a_count_int_pointer; 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang long int * a_count_longint_pointer; 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_LONG_LONG_INT 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang long long int * a_count_longlongint_pointer; 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if ENABLE_UNISTDIO 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The unistdio extensions. */ 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const uint8_t * a_u8_string; 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang const uint16_t * a_u16_string; 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang const uint32_t * a_u32_string; 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang a; 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wangargument; 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Number of directly allocated arguments (no malloc() needed). */ 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define N_DIRECT_ALLOC_ARGUMENTS 7 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtypedef struct 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t count; 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang argument *arg; 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS]; 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wangarguments; 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Fetch the arguments, putting them into a. */ 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef STATIC 15205436638acc7c010349a69c3395f1a57c642dc62Ying WangSTATIC 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wangint PRINTF_FETCHARGS (va_list args, arguments *a); 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _PRINTF_ARGS_H */ 159