xref: /dflybsd-src/contrib/cvs-1.12/lib/printf-args.c (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 #ifdef HAVE_CONFIG_H
1986d7f5d3SJohn Marino # include <config.h>
2086d7f5d3SJohn Marino #endif
2186d7f5d3SJohn Marino 
2286d7f5d3SJohn Marino /* Specification.  */
2386d7f5d3SJohn Marino #include "printf-args.h"
2486d7f5d3SJohn Marino 
2586d7f5d3SJohn Marino #ifdef STATIC
2686d7f5d3SJohn Marino STATIC
2786d7f5d3SJohn Marino #endif
2886d7f5d3SJohn Marino int
printf_fetchargs(va_list args,arguments * a)2986d7f5d3SJohn Marino printf_fetchargs (va_list args, arguments *a)
3086d7f5d3SJohn Marino {
3186d7f5d3SJohn Marino   size_t i;
3286d7f5d3SJohn Marino   argument *ap;
3386d7f5d3SJohn Marino 
3486d7f5d3SJohn Marino   for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
3586d7f5d3SJohn Marino     switch (ap->type)
3686d7f5d3SJohn Marino       {
3786d7f5d3SJohn Marino       case TYPE_SCHAR:
3886d7f5d3SJohn Marino 	ap->a.a_schar = va_arg (args, /*signed char*/ int);
3986d7f5d3SJohn Marino 	break;
4086d7f5d3SJohn Marino       case TYPE_UCHAR:
4186d7f5d3SJohn Marino 	ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
4286d7f5d3SJohn Marino 	break;
4386d7f5d3SJohn Marino       case TYPE_SHORT:
4486d7f5d3SJohn Marino 	ap->a.a_short = va_arg (args, /*short*/ int);
4586d7f5d3SJohn Marino 	break;
4686d7f5d3SJohn Marino       case TYPE_USHORT:
4786d7f5d3SJohn Marino 	ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
4886d7f5d3SJohn Marino 	break;
4986d7f5d3SJohn Marino       case TYPE_INT:
5086d7f5d3SJohn Marino 	ap->a.a_int = va_arg (args, int);
5186d7f5d3SJohn Marino 	break;
5286d7f5d3SJohn Marino       case TYPE_UINT:
5386d7f5d3SJohn Marino 	ap->a.a_uint = va_arg (args, unsigned int);
5486d7f5d3SJohn Marino 	break;
5586d7f5d3SJohn Marino       case TYPE_LONGINT:
5686d7f5d3SJohn Marino 	ap->a.a_longint = va_arg (args, long int);
5786d7f5d3SJohn Marino 	break;
5886d7f5d3SJohn Marino       case TYPE_ULONGINT:
5986d7f5d3SJohn Marino 	ap->a.a_ulongint = va_arg (args, unsigned long int);
6086d7f5d3SJohn Marino 	break;
6186d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
6286d7f5d3SJohn Marino       case TYPE_LONGLONGINT:
6386d7f5d3SJohn Marino 	ap->a.a_longlongint = va_arg (args, long long int);
6486d7f5d3SJohn Marino 	break;
6586d7f5d3SJohn Marino       case TYPE_ULONGLONGINT:
6686d7f5d3SJohn Marino 	ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
6786d7f5d3SJohn Marino 	break;
6886d7f5d3SJohn Marino #endif
6986d7f5d3SJohn Marino       case TYPE_DOUBLE:
7086d7f5d3SJohn Marino 	ap->a.a_double = va_arg (args, double);
7186d7f5d3SJohn Marino 	break;
7286d7f5d3SJohn Marino #ifdef HAVE_LONG_DOUBLE
7386d7f5d3SJohn Marino       case TYPE_LONGDOUBLE:
7486d7f5d3SJohn Marino 	ap->a.a_longdouble = va_arg (args, long double);
7586d7f5d3SJohn Marino 	break;
7686d7f5d3SJohn Marino #endif
7786d7f5d3SJohn Marino       case TYPE_CHAR:
7886d7f5d3SJohn Marino 	ap->a.a_char = va_arg (args, int);
7986d7f5d3SJohn Marino 	break;
8086d7f5d3SJohn Marino #ifdef HAVE_WINT_T
8186d7f5d3SJohn Marino       case TYPE_WIDE_CHAR:
8286d7f5d3SJohn Marino 	ap->a.a_wide_char = va_arg (args, wint_t);
8386d7f5d3SJohn Marino 	break;
8486d7f5d3SJohn Marino #endif
8586d7f5d3SJohn Marino       case TYPE_STRING:
8686d7f5d3SJohn Marino 	ap->a.a_string = va_arg (args, const char *);
8786d7f5d3SJohn Marino 	break;
8886d7f5d3SJohn Marino #ifdef HAVE_WCHAR_T
8986d7f5d3SJohn Marino       case TYPE_WIDE_STRING:
9086d7f5d3SJohn Marino 	ap->a.a_wide_string = va_arg (args, const wchar_t *);
9186d7f5d3SJohn Marino 	break;
9286d7f5d3SJohn Marino #endif
9386d7f5d3SJohn Marino       case TYPE_POINTER:
9486d7f5d3SJohn Marino 	ap->a.a_pointer = va_arg (args, void *);
9586d7f5d3SJohn Marino 	break;
9686d7f5d3SJohn Marino       case TYPE_COUNT_SCHAR_POINTER:
9786d7f5d3SJohn Marino 	ap->a.a_count_schar_pointer = va_arg (args, signed char *);
9886d7f5d3SJohn Marino 	break;
9986d7f5d3SJohn Marino       case TYPE_COUNT_SHORT_POINTER:
10086d7f5d3SJohn Marino 	ap->a.a_count_short_pointer = va_arg (args, short *);
10186d7f5d3SJohn Marino 	break;
10286d7f5d3SJohn Marino       case TYPE_COUNT_INT_POINTER:
10386d7f5d3SJohn Marino 	ap->a.a_count_int_pointer = va_arg (args, int *);
10486d7f5d3SJohn Marino 	break;
10586d7f5d3SJohn Marino       case TYPE_COUNT_LONGINT_POINTER:
10686d7f5d3SJohn Marino 	ap->a.a_count_longint_pointer = va_arg (args, long int *);
10786d7f5d3SJohn Marino 	break;
10886d7f5d3SJohn Marino #ifdef HAVE_LONG_LONG
10986d7f5d3SJohn Marino       case TYPE_COUNT_LONGLONGINT_POINTER:
11086d7f5d3SJohn Marino 	ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
11186d7f5d3SJohn Marino 	break;
11286d7f5d3SJohn Marino #endif
11386d7f5d3SJohn Marino       default:
11486d7f5d3SJohn Marino 	/* Unknown type.  */
11586d7f5d3SJohn Marino 	return -1;
11686d7f5d3SJohn Marino       }
11786d7f5d3SJohn Marino   return 0;
11886d7f5d3SJohn Marino }
119