Home | History | Annotate | Download | only in gnulib
      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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
     17    USA.  */
     18 
     19 #ifndef _PRINTF_ARGS_H
     20 #define _PRINTF_ARGS_H
     21 
     22 /* Get wchar_t.  */
     23 #ifdef HAVE_WCHAR_T
     24 # include <stddef.h>
     25 #endif
     26 
     27 /* Get wint_t.  */
     28 #ifdef HAVE_WINT_T
     29 # include <wchar.h>
     30 #endif
     31 
     32 /* Get va_list.  */
     33 #include <stdarg.h>
     34 
     35 
     36 /* Argument types */
     37 typedef enum
     38 {
     39   TYPE_NONE,
     40   TYPE_SCHAR,
     41   TYPE_UCHAR,
     42   TYPE_SHORT,
     43   TYPE_USHORT,
     44   TYPE_INT,
     45   TYPE_UINT,
     46   TYPE_LONGINT,
     47   TYPE_ULONGINT,
     48 #ifdef HAVE_LONG_LONG
     49   TYPE_LONGLONGINT,
     50   TYPE_ULONGLONGINT,
     51 #endif
     52 #ifdef HAVE_INT64_AND_I64
     53   TYPE_INT64,
     54   TYPE_UINT64,
     55 #endif
     56   TYPE_DOUBLE,
     57 #ifdef HAVE_LONG_DOUBLE
     58   TYPE_LONGDOUBLE,
     59 #endif
     60   TYPE_CHAR,
     61 #ifdef HAVE_WINT_T
     62   TYPE_WIDE_CHAR,
     63 #endif
     64   TYPE_STRING,
     65 #ifdef HAVE_WCHAR_T
     66   TYPE_WIDE_STRING,
     67 #endif
     68   TYPE_POINTER,
     69   TYPE_COUNT_SCHAR_POINTER,
     70   TYPE_COUNT_SHORT_POINTER,
     71   TYPE_COUNT_INT_POINTER,
     72   TYPE_COUNT_LONGINT_POINTER
     73 #ifdef HAVE_LONG_LONG
     74 , TYPE_COUNT_LONGLONGINT_POINTER
     75 #endif
     76 } arg_type;
     77 
     78 /* Polymorphic argument */
     79 typedef struct
     80 {
     81   arg_type type;
     82   union
     83   {
     84     signed char			a_schar;
     85     unsigned char		a_uchar;
     86     short			a_short;
     87     unsigned short		a_ushort;
     88     int				a_int;
     89     unsigned int		a_uint;
     90     long int			a_longint;
     91     unsigned long int		a_ulongint;
     92 #ifdef HAVE_LONG_LONG
     93     long long int		a_longlongint;
     94     unsigned long long int	a_ulonglongint;
     95 #endif
     96 #ifdef HAVE_INT64_AND_I64
     97     __int64                     a_int64;
     98     unsigned __int64            a_uint64;
     99 #endif
    100     float			a_float;
    101     double			a_double;
    102 #ifdef HAVE_LONG_DOUBLE
    103     long double			a_longdouble;
    104 #endif
    105     int				a_char;
    106 #ifdef HAVE_WINT_T
    107     wint_t			a_wide_char;
    108 #endif
    109     const char*			a_string;
    110 #ifdef HAVE_WCHAR_T
    111     const wchar_t*		a_wide_string;
    112 #endif
    113     void*			a_pointer;
    114     signed char *		a_count_schar_pointer;
    115     short *			a_count_short_pointer;
    116     int *			a_count_int_pointer;
    117     long int *			a_count_longint_pointer;
    118 #ifdef HAVE_LONG_LONG
    119     long long int *		a_count_longlongint_pointer;
    120 #endif
    121   }
    122   a;
    123 }
    124 argument;
    125 
    126 typedef struct
    127 {
    128   unsigned int count;
    129   argument *arg;
    130 }
    131 arguments;
    132 
    133 
    134 /* Fetch the arguments, putting them into a. */
    135 #ifdef STATIC
    136 STATIC
    137 #else
    138 extern
    139 #endif
    140 int printf_fetchargs (va_list args, arguments *a);
    141 
    142 #endif /* _PRINTF_ARGS_H */
    143