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#ifdef HAVE_CONFIG_H
20b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o# include <config.h>
21b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
22b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o
23b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o/* Specification.  */
24b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#include "printf-args.h"
25b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o
26b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef STATIC
27b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'oSTATIC
28b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
29b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'oint
30b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'oprintf_fetchargs (va_list args, arguments *a)
31b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o{
32b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o  size_t i;
33b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o  argument *ap;
34b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o
35b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o  for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
36b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o    switch (ap->type)
37b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      {
38b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_SCHAR:
39b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_schar = va_arg (args, /*signed char*/ int);
40b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
41b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_UCHAR:
42b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
43b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
44b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_SHORT:
45b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_short = va_arg (args, /*short*/ int);
46b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
47b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_USHORT:
48b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
49b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
50b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_INT:
51b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_int = va_arg (args, int);
52b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
53b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_UINT:
54b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_uint = va_arg (args, unsigned int);
55b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
56b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_LONGINT:
57b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_longint = va_arg (args, long int);
58b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
59b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_ULONGINT:
60b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_ulongint = va_arg (args, unsigned long int);
61b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
62b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef HAVE_LONG_LONG
63b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_LONGLONGINT:
64b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_longlongint = va_arg (args, long long int);
65b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
66b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_ULONGLONGINT:
67b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
68b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
69b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
70b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_DOUBLE:
71b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_double = va_arg (args, double);
72b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
73b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef HAVE_LONG_DOUBLE
74b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_LONGDOUBLE:
75b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_longdouble = va_arg (args, long double);
76b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
77b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
78b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_CHAR:
79b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_char = va_arg (args, int);
80b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
81b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef HAVE_WINT_T
82b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_WIDE_CHAR:
83b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_wide_char = va_arg (args, wint_t);
84b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
85b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
86b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_STRING:
87b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_string = va_arg (args, const char *);
88b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
89b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef HAVE_WCHAR_T
90b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_WIDE_STRING:
91b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_wide_string = va_arg (args, const wchar_t *);
92b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
93b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
94b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_POINTER:
95b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_pointer = va_arg (args, void *);
96b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
97b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_COUNT_SCHAR_POINTER:
98b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_count_schar_pointer = va_arg (args, signed char *);
99b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
100b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_COUNT_SHORT_POINTER:
101b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_count_short_pointer = va_arg (args, short *);
102b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
103b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_COUNT_INT_POINTER:
104b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_count_int_pointer = va_arg (args, int *);
105b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
106b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_COUNT_LONGINT_POINTER:
107b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_count_longint_pointer = va_arg (args, long int *);
108b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
109b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#ifdef HAVE_LONG_LONG
110b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      case TYPE_COUNT_LONGLONGINT_POINTER:
111b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
112b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	break;
113b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o#endif
114b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      default:
115b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	/* Unknown type.  */
116b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o	return -1;
117b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o      }
118b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o  return 0;
119b0cacab066000b940551d59aad3e4553d4bad268Theodore Ts'o}
120