(root)/
glib-2.79.0/
glib/
gnulib/
printf-args.h
       1  /* Decomposed printf argument list.
       2     Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2019 Free Software
       3     Foundation, Inc.
       4  
       5     This program is free software; you can redistribute it and/or modify
       6     it under the terms of the GNU Lesser General Public License as published by
       7     the Free Software Foundation; either version 2.1, or (at your option)
       8     any later version.
       9  
      10     This program is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13     GNU Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public License along
      16     with this program; if not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #ifndef _PRINTF_ARGS_H
      19  #define _PRINTF_ARGS_H
      20  
      21  /* This file can be parametrized with the following macros:
      22       ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
      23       PRINTF_FETCHARGS   Name of the function to be declared.
      24       STATIC             Set to 'static' to declare the function static.  */
      25  
      26  /* Default parameters.  */
      27  #ifndef PRINTF_FETCHARGS
      28  # define PRINTF_FETCHARGS printf_fetchargs
      29  #endif
      30  
      31  /* Get size_t.  */
      32  #include <stddef.h>
      33  
      34  /* Get wchar_t.  */
      35  #if HAVE_WCHAR_T
      36  # include <stddef.h>
      37  #endif
      38  
      39  /* Get wint_t.  */
      40  #if HAVE_WINT_T
      41  # include <wchar.h>
      42  #endif
      43  
      44  /* Get va_list.  */
      45  #include <stdarg.h>
      46  
      47  
      48  /* Argument types */
      49  typedef enum
      50  {
      51    TYPE_NONE,
      52    TYPE_SCHAR,
      53    TYPE_UCHAR,
      54    TYPE_SHORT,
      55    TYPE_USHORT,
      56    TYPE_INT,
      57    TYPE_UINT,
      58    TYPE_LONGINT,
      59    TYPE_ULONGINT,
      60  #if HAVE_LONG_LONG
      61    TYPE_LONGLONGINT,
      62    TYPE_ULONGLONGINT,
      63  #endif
      64    TYPE_DOUBLE,
      65    TYPE_LONGDOUBLE,
      66    TYPE_CHAR,
      67  #if HAVE_WINT_T
      68    TYPE_WIDE_CHAR,
      69  #endif
      70    TYPE_STRING,
      71  #if HAVE_WCHAR_T
      72    TYPE_WIDE_STRING,
      73  #endif
      74    TYPE_POINTER,
      75    TYPE_COUNT_SCHAR_POINTER,
      76    TYPE_COUNT_SHORT_POINTER,
      77    TYPE_COUNT_INT_POINTER,
      78    TYPE_COUNT_LONGINT_POINTER
      79  #if HAVE_LONG_LONG
      80  , TYPE_COUNT_LONGLONGINT_POINTER
      81  #endif
      82  #if ENABLE_UNISTDIO
      83    /* The unistdio extensions.  */
      84  , TYPE_U8_STRING
      85  , TYPE_U16_STRING
      86  , TYPE_U32_STRING
      87  #endif
      88  } arg_type;
      89  
      90  /* Polymorphic argument */
      91  typedef struct
      92  {
      93    arg_type type;
      94    union
      95    {
      96      signed char                 a_schar;
      97      unsigned char               a_uchar;
      98      short                       a_short;
      99      unsigned short              a_ushort;
     100      int                         a_int;
     101      unsigned int                a_uint;
     102      long int                    a_longint;
     103      unsigned long int           a_ulongint;
     104  #if HAVE_LONG_LONG
     105      long long int               a_longlongint;
     106      unsigned long long int      a_ulonglongint;
     107  #endif
     108      float                       a_float;
     109      double                      a_double;
     110      long double                 a_longdouble;
     111      int                         a_char;
     112  #if HAVE_WINT_T
     113      wint_t                      a_wide_char;
     114  #endif
     115      const char*                 a_string;
     116  #if HAVE_WCHAR_T
     117      const wchar_t*              a_wide_string;
     118  #endif
     119      void*                       a_pointer;
     120      signed char *               a_count_schar_pointer;
     121      short *                     a_count_short_pointer;
     122      int *                       a_count_int_pointer;
     123      long int *                  a_count_longint_pointer;
     124  #if HAVE_LONG_LONG
     125      long long int *             a_count_longlongint_pointer;
     126  #endif
     127  #if ENABLE_UNISTDIO
     128      /* The unistdio extensions.  */
     129      const uint8_t *             a_u8_string;
     130      const uint16_t *            a_u16_string;
     131      const uint32_t *            a_u32_string;
     132  #endif
     133    }
     134    a;
     135  }
     136  argument;
     137  
     138  /* Number of directly allocated arguments (no malloc() needed).  */
     139  #define N_DIRECT_ALLOC_ARGUMENTS 7
     140  
     141  typedef struct
     142  {
     143    size_t count;
     144    argument *arg;
     145    argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
     146  }
     147  arguments;
     148  
     149  
     150  /* Fetch the arguments, putting them into a. */
     151  #ifdef STATIC
     152  STATIC
     153  #else
     154  extern
     155  #endif
     156  int PRINTF_FETCHARGS (va_list args, arguments *a);
     157  
     158  #endif /* _PRINTF_ARGS_H */