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