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