1 /* Decomposed printf argument list. 2 Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify it 5 under the terms of the GNU Library General Public License as published 6 by the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU Library General Public 15 License along with this program; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 17 USA. */ 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 /* Specification. */ 24 #include "printf-args.h" 25 26 #ifdef STATIC 27 STATIC 28 #endif 29 int 30 printf_fetchargs (va_list args, arguments *a) 31 { 32 size_t i; 33 argument *ap; 34 35 for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) 36 switch (ap->type) 37 { 38 case TYPE_SCHAR: 39 ap->a.a_schar = va_arg (args, /*signed char*/ int); 40 break; 41 case TYPE_UCHAR: 42 ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); 43 break; 44 case TYPE_SHORT: 45 ap->a.a_short = va_arg (args, /*short*/ int); 46 break; 47 case TYPE_USHORT: 48 ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); 49 break; 50 case TYPE_INT: 51 ap->a.a_int = va_arg (args, int); 52 break; 53 case TYPE_UINT: 54 ap->a.a_uint = va_arg (args, unsigned int); 55 break; 56 case TYPE_LONGINT: 57 ap->a.a_longint = va_arg (args, long int); 58 break; 59 case TYPE_ULONGINT: 60 ap->a.a_ulongint = va_arg (args, unsigned long int); 61 break; 62 #ifdef HAVE_LONG_LONG 63 case TYPE_LONGLONGINT: 64 ap->a.a_longlongint = va_arg (args, long long int); 65 break; 66 case TYPE_ULONGLONGINT: 67 ap->a.a_ulonglongint = va_arg (args, unsigned long long int); 68 break; 69 #endif 70 case TYPE_DOUBLE: 71 ap->a.a_double = va_arg (args, double); 72 break; 73 #ifdef HAVE_LONG_DOUBLE 74 case TYPE_LONGDOUBLE: 75 ap->a.a_longdouble = va_arg (args, long double); 76 break; 77 #endif 78 case TYPE_CHAR: 79 ap->a.a_char = va_arg (args, int); 80 break; 81 #ifdef HAVE_WINT_T 82 case TYPE_WIDE_CHAR: 83 ap->a.a_wide_char = va_arg (args, wint_t); 84 break; 85 #endif 86 case TYPE_STRING: 87 ap->a.a_string = va_arg (args, const char *); 88 break; 89 #ifdef HAVE_WCHAR_T 90 case TYPE_WIDE_STRING: 91 ap->a.a_wide_string = va_arg (args, const wchar_t *); 92 break; 93 #endif 94 case TYPE_POINTER: 95 ap->a.a_pointer = va_arg (args, void *); 96 break; 97 case TYPE_COUNT_SCHAR_POINTER: 98 ap->a.a_count_schar_pointer = va_arg (args, signed char *); 99 break; 100 case TYPE_COUNT_SHORT_POINTER: 101 ap->a.a_count_short_pointer = va_arg (args, short *); 102 break; 103 case TYPE_COUNT_INT_POINTER: 104 ap->a.a_count_int_pointer = va_arg (args, int *); 105 break; 106 case TYPE_COUNT_LONGINT_POINTER: 107 ap->a.a_count_longint_pointer = va_arg (args, long int *); 108 break; 109 #ifdef HAVE_LONG_LONG 110 case TYPE_COUNT_LONGLONGINT_POINTER: 111 ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); 112 break; 113 #endif 114 default: 115 /* Unknown type. */ 116 return -1; 117 } 118 return 0; 119 } 120