xref: /dflybsd-src/contrib/cvs-1.12/lib/printf-args.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /* Decomposed printf argument list.
286d7f5d3SJohn Marino    Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
386d7f5d3SJohn Marino 
486d7f5d3SJohn Marino    This program is free software; you can redistribute it and/or modify
586d7f5d3SJohn Marino    it under the terms of the GNU General Public License as published by
686d7f5d3SJohn Marino    the Free Software Foundation; either version 2, or (at your option)
786d7f5d3SJohn Marino    any later version.
886d7f5d3SJohn Marino 
986d7f5d3SJohn Marino    This program is distributed in the hope that it will be useful,
1086d7f5d3SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
1186d7f5d3SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1286d7f5d3SJohn Marino    GNU General Public License for more details.
1386d7f5d3SJohn Marino 
1486d7f5d3SJohn Marino    You should have received a copy of the GNU General Public License along
1586d7f5d3SJohn Marino    with this program; if not, write to the Free Software Foundation,
1686d7f5d3SJohn Marino    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
1786d7f5d3SJohn Marino 
1886d7f5d3SJohn Marino #ifndef _PRINTF_ARGS_H
1986d7f5d3SJohn Marino #define _PRINTF_ARGS_H
2086d7f5d3SJohn Marino 
2186d7f5d3SJohn Marino /* Get size_t.  */
2286d7f5d3SJohn Marino #include <stddef.h>
2386d7f5d3SJohn Marino 
2486d7f5d3SJohn Marino /* Get wchar_t.  */
2586d7f5d3SJohn Marino #ifdef HAVE_WCHAR_T
2686d7f5d3SJohn Marino # include <stddef.h>
2786d7f5d3SJohn Marino #endif
2886d7f5d3SJohn Marino 
2986d7f5d3SJohn Marino /* Get wint_t.  */
3086d7f5d3SJohn Marino #ifdef HAVE_WINT_T
3186d7f5d3SJohn Marino # include <wchar.h>
3286d7f5d3SJohn Marino #endif
3386d7f5d3SJohn Marino 
3486d7f5d3SJohn Marino /* Get va_list.  */
3586d7f5d3SJohn Marino #include <stdarg.h>
3686d7f5d3SJohn Marino 
3786d7f5d3SJohn Marino 
3886d7f5d3SJohn Marino /* Argument types */
3986d7f5d3SJohn Marino typedef enum
4086d7f5d3SJohn Marino {
4186d7f5d3SJohn Marino   TYPE_NONE,
4286d7f5d3SJohn Marino   TYPE_SCHAR,
4386d7f5d3SJohn Marino   TYPE_UCHAR,
4486d7f5d3SJohn Marino   TYPE_SHORT,
4586d7f5d3SJohn Marino   TYPE_USHORT,
4686d7f5d3SJohn Marino   TYPE_INT,
4786d7f5d3SJohn Marino   TYPE_UINT,
4886d7f5d3SJohn Marino   TYPE_LONGINT,
4986d7f5d3SJohn Marino   TYPE_ULONGINT,
5086d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
5186d7f5d3SJohn Marino   TYPE_LONGLONGINT,
5286d7f5d3SJohn Marino   TYPE_ULONGLONGINT,
5386d7f5d3SJohn Marino #endif
5486d7f5d3SJohn Marino   TYPE_DOUBLE,
5586d7f5d3SJohn Marino #ifdef HAVE_LONG_DOUBLE
5686d7f5d3SJohn Marino   TYPE_LONGDOUBLE,
5786d7f5d3SJohn Marino #endif
5886d7f5d3SJohn Marino   TYPE_CHAR,
5986d7f5d3SJohn Marino #ifdef HAVE_WINT_T
6086d7f5d3SJohn Marino   TYPE_WIDE_CHAR,
6186d7f5d3SJohn Marino #endif
6286d7f5d3SJohn Marino   TYPE_STRING,
6386d7f5d3SJohn Marino #ifdef HAVE_WCHAR_T
6486d7f5d3SJohn Marino   TYPE_WIDE_STRING,
6586d7f5d3SJohn Marino #endif
6686d7f5d3SJohn Marino   TYPE_POINTER,
6786d7f5d3SJohn Marino   TYPE_COUNT_SCHAR_POINTER,
6886d7f5d3SJohn Marino   TYPE_COUNT_SHORT_POINTER,
6986d7f5d3SJohn Marino   TYPE_COUNT_INT_POINTER,
7086d7f5d3SJohn Marino   TYPE_COUNT_LONGINT_POINTER
7186d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
7286d7f5d3SJohn Marino , TYPE_COUNT_LONGLONGINT_POINTER
7386d7f5d3SJohn Marino #endif
7486d7f5d3SJohn Marino } arg_type;
7586d7f5d3SJohn Marino 
7686d7f5d3SJohn Marino /* Polymorphic argument */
7786d7f5d3SJohn Marino typedef struct
7886d7f5d3SJohn Marino {
7986d7f5d3SJohn Marino   arg_type type;
8086d7f5d3SJohn Marino   union
8186d7f5d3SJohn Marino   {
8286d7f5d3SJohn Marino     signed char			a_schar;
8386d7f5d3SJohn Marino     unsigned char		a_uchar;
8486d7f5d3SJohn Marino     short			a_short;
8586d7f5d3SJohn Marino     unsigned short		a_ushort;
8686d7f5d3SJohn Marino     int				a_int;
8786d7f5d3SJohn Marino     unsigned int		a_uint;
8886d7f5d3SJohn Marino     long int			a_longint;
8986d7f5d3SJohn Marino     unsigned long int		a_ulongint;
9086d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
9186d7f5d3SJohn Marino     long long int		a_longlongint;
9286d7f5d3SJohn Marino     unsigned long long int	a_ulonglongint;
9386d7f5d3SJohn Marino #endif
9486d7f5d3SJohn Marino     float			a_float;
9586d7f5d3SJohn Marino     double			a_double;
9686d7f5d3SJohn Marino #ifdef HAVE_LONG_DOUBLE
9786d7f5d3SJohn Marino     long double			a_longdouble;
9886d7f5d3SJohn Marino #endif
9986d7f5d3SJohn Marino     int				a_char;
10086d7f5d3SJohn Marino #ifdef HAVE_WINT_T
10186d7f5d3SJohn Marino     wint_t			a_wide_char;
10286d7f5d3SJohn Marino #endif
10386d7f5d3SJohn Marino     const char*			a_string;
10486d7f5d3SJohn Marino #ifdef HAVE_WCHAR_T
10586d7f5d3SJohn Marino     const wchar_t*		a_wide_string;
10686d7f5d3SJohn Marino #endif
10786d7f5d3SJohn Marino     void*			a_pointer;
10886d7f5d3SJohn Marino     signed char *		a_count_schar_pointer;
10986d7f5d3SJohn Marino     short *			a_count_short_pointer;
11086d7f5d3SJohn Marino     int *			a_count_int_pointer;
11186d7f5d3SJohn Marino     long int *			a_count_longint_pointer;
11286d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
11386d7f5d3SJohn Marino     long long int *		a_count_longlongint_pointer;
11486d7f5d3SJohn Marino #endif
11586d7f5d3SJohn Marino   }
11686d7f5d3SJohn Marino   a;
11786d7f5d3SJohn Marino }
11886d7f5d3SJohn Marino argument;
11986d7f5d3SJohn Marino 
12086d7f5d3SJohn Marino typedef struct
12186d7f5d3SJohn Marino {
12286d7f5d3SJohn Marino   size_t count;
12386d7f5d3SJohn Marino   argument *arg;
12486d7f5d3SJohn Marino }
12586d7f5d3SJohn Marino arguments;
12686d7f5d3SJohn Marino 
12786d7f5d3SJohn Marino 
12886d7f5d3SJohn Marino /* Fetch the arguments, putting them into a. */
12986d7f5d3SJohn Marino #ifdef STATIC
13086d7f5d3SJohn Marino STATIC
13186d7f5d3SJohn Marino #else
13286d7f5d3SJohn Marino extern
13386d7f5d3SJohn Marino #endif
13486d7f5d3SJohn Marino int printf_fetchargs (va_list args, arguments *a);
13586d7f5d3SJohn Marino 
13686d7f5d3SJohn Marino #endif /* _PRINTF_ARGS_H */
137