Blame intl/printf-args.c

Packit Service a721b1
/* Decomposed printf argument list.
Packit Service a721b1
   Copyright (C) 1999, 2002-2003, 2005-2007 Free Software Foundation, Inc.
Packit Service a721b1
Packit Service a721b1
   This program is free software; you can redistribute it and/or modify it
Packit Service a721b1
   under the terms of the GNU Library General Public License as published
Packit Service a721b1
   by the Free Software Foundation; either version 2, or (at your option)
Packit Service a721b1
   any later version.
Packit Service a721b1
Packit Service a721b1
   This program is distributed in the hope that it will be useful,
Packit Service a721b1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a721b1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service a721b1
   Library General Public License for more details.
Packit Service a721b1
Packit Service a721b1
   You should have received a copy of the GNU Library General Public
Packit Service a721b1
   License along with this program; if not, write to the Free Software
Packit Service a721b1
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
Packit Service a721b1
   USA.  */
Packit Service a721b1
Packit Service a721b1
/* This file can be parametrized with the following macros:
Packit Service a721b1
     ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
Packit Service a721b1
     PRINTF_FETCHARGS   Name of the function to be defined.
Packit Service a721b1
     STATIC             Set to 'static' to declare the function static.  */
Packit Service a721b1
Packit Service a721b1
#ifndef PRINTF_FETCHARGS
Packit Service a721b1
# include <config.h>
Packit Service a721b1
#endif
Packit Service a721b1
Packit Service a721b1
/* Specification.  */
Packit Service a721b1
#ifndef PRINTF_FETCHARGS
Packit Service a721b1
# include "printf-args.h"
Packit Service a721b1
#endif
Packit Service a721b1
Packit Service a721b1
#ifdef STATIC
Packit Service a721b1
STATIC
Packit Service a721b1
#endif
Packit Service a721b1
int
Packit Service a721b1
PRINTF_FETCHARGS (va_list args, arguments *a)
Packit Service a721b1
{
Packit Service a721b1
  size_t i;
Packit Service a721b1
  argument *ap;
Packit Service a721b1
Packit Service a721b1
  for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
Packit Service a721b1
    switch (ap->type)
Packit Service a721b1
      {
Packit Service a721b1
      case TYPE_SCHAR:
Packit Service a721b1
	ap->a.a_schar = va_arg (args, /*signed char*/ int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_UCHAR:
Packit Service a721b1
	ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_SHORT:
Packit Service a721b1
	ap->a.a_short = va_arg (args, /*short*/ int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_USHORT:
Packit Service a721b1
	ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_INT:
Packit Service a721b1
	ap->a.a_int = va_arg (args, int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_UINT:
Packit Service a721b1
	ap->a.a_uint = va_arg (args, unsigned int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_LONGINT:
Packit Service a721b1
	ap->a.a_longint = va_arg (args, long int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_ULONGINT:
Packit Service a721b1
	ap->a.a_ulongint = va_arg (args, unsigned long int);
Packit Service a721b1
	break;
Packit Service a721b1
#if HAVE_LONG_LONG_INT
Packit Service a721b1
      case TYPE_LONGLONGINT:
Packit Service a721b1
	ap->a.a_longlongint = va_arg (args, long long int);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_ULONGLONGINT:
Packit Service a721b1
	ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
Packit Service a721b1
	break;
Packit Service a721b1
#endif
Packit Service a721b1
      case TYPE_DOUBLE:
Packit Service a721b1
	ap->a.a_double = va_arg (args, double);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_LONGDOUBLE:
Packit Service a721b1
	ap->a.a_longdouble = va_arg (args, long double);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_CHAR:
Packit Service a721b1
	ap->a.a_char = va_arg (args, int);
Packit Service a721b1
	break;
Packit Service a721b1
#if HAVE_WINT_T
Packit Service a721b1
      case TYPE_WIDE_CHAR:
Packit Service a721b1
	/* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
Packit Service a721b1
	   default argument promotions", this is not the case in mingw32,
Packit Service a721b1
	   where wint_t is 'unsigned short'.  */
Packit Service a721b1
	ap->a.a_wide_char =
Packit Service a721b1
	  (sizeof (wint_t) < sizeof (int)
Packit Service a721b1
	   ? va_arg (args, int)
Packit Service a721b1
	   : va_arg (args, wint_t));
Packit Service a721b1
	break;
Packit Service a721b1
#endif
Packit Service a721b1
      case TYPE_STRING:
Packit Service a721b1
	ap->a.a_string = va_arg (args, const char *);
Packit Service a721b1
	/* A null pointer is an invalid argument for "%s", but in practice
Packit Service a721b1
	   it occurs quite frequently in printf statements that produce
Packit Service a721b1
	   debug output.  Use a fallback in this case.  */
Packit Service a721b1
	if (ap->a.a_string == NULL)
Packit Service a721b1
	  ap->a.a_string = "(NULL)";
Packit Service a721b1
	break;
Packit Service a721b1
#if HAVE_WCHAR_T
Packit Service a721b1
      case TYPE_WIDE_STRING:
Packit Service a721b1
	ap->a.a_wide_string = va_arg (args, const wchar_t *);
Packit Service a721b1
	/* A null pointer is an invalid argument for "%ls", but in practice
Packit Service a721b1
	   it occurs quite frequently in printf statements that produce
Packit Service a721b1
	   debug output.  Use a fallback in this case.  */
Packit Service a721b1
	if (ap->a.a_wide_string == NULL)
Packit Service a721b1
	  {
Packit Service a721b1
	    static const wchar_t wide_null_string[] =
Packit Service a721b1
	      {
Packit Service a721b1
		(wchar_t)'(',
Packit Service a721b1
		(wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
Packit Service a721b1
		(wchar_t)')',
Packit Service a721b1
		(wchar_t)0
Packit Service a721b1
	      };
Packit Service a721b1
	    ap->a.a_wide_string = wide_null_string;
Packit Service a721b1
	  }
Packit Service a721b1
	break;
Packit Service a721b1
#endif
Packit Service a721b1
      case TYPE_POINTER:
Packit Service a721b1
	ap->a.a_pointer = va_arg (args, void *);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_COUNT_SCHAR_POINTER:
Packit Service a721b1
	ap->a.a_count_schar_pointer = va_arg (args, signed char *);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_COUNT_SHORT_POINTER:
Packit Service a721b1
	ap->a.a_count_short_pointer = va_arg (args, short *);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_COUNT_INT_POINTER:
Packit Service a721b1
	ap->a.a_count_int_pointer = va_arg (args, int *);
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_COUNT_LONGINT_POINTER:
Packit Service a721b1
	ap->a.a_count_longint_pointer = va_arg (args, long int *);
Packit Service a721b1
	break;
Packit Service a721b1
#if HAVE_LONG_LONG_INT
Packit Service a721b1
      case TYPE_COUNT_LONGLONGINT_POINTER:
Packit Service a721b1
	ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
Packit Service a721b1
	break;
Packit Service a721b1
#endif
Packit Service a721b1
#if ENABLE_UNISTDIO
Packit Service a721b1
      /* The unistdio extensions.  */
Packit Service a721b1
      case TYPE_U8_STRING:
Packit Service a721b1
	ap->a.a_u8_string = va_arg (args, const uint8_t *);
Packit Service a721b1
	/* A null pointer is an invalid argument for "%U", but in practice
Packit Service a721b1
	   it occurs quite frequently in printf statements that produce
Packit Service a721b1
	   debug output.  Use a fallback in this case.  */
Packit Service a721b1
	if (ap->a.a_u8_string == NULL)
Packit Service a721b1
	  {
Packit Service a721b1
	    static const uint8_t u8_null_string[] =
Packit Service a721b1
	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
Packit Service a721b1
	    ap->a.a_u8_string = u8_null_string;
Packit Service a721b1
	  }
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_U16_STRING:
Packit Service a721b1
	ap->a.a_u16_string = va_arg (args, const uint16_t *);
Packit Service a721b1
	/* A null pointer is an invalid argument for "%lU", but in practice
Packit Service a721b1
	   it occurs quite frequently in printf statements that produce
Packit Service a721b1
	   debug output.  Use a fallback in this case.  */
Packit Service a721b1
	if (ap->a.a_u16_string == NULL)
Packit Service a721b1
	  {
Packit Service a721b1
	    static const uint16_t u16_null_string[] =
Packit Service a721b1
	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
Packit Service a721b1
	    ap->a.a_u16_string = u16_null_string;
Packit Service a721b1
	  }
Packit Service a721b1
	break;
Packit Service a721b1
      case TYPE_U32_STRING:
Packit Service a721b1
	ap->a.a_u32_string = va_arg (args, const uint32_t *);
Packit Service a721b1
	/* A null pointer is an invalid argument for "%llU", but in practice
Packit Service a721b1
	   it occurs quite frequently in printf statements that produce
Packit Service a721b1
	   debug output.  Use a fallback in this case.  */
Packit Service a721b1
	if (ap->a.a_u32_string == NULL)
Packit Service a721b1
	  {
Packit Service a721b1
	    static const uint32_t u32_null_string[] =
Packit Service a721b1
	      { '(', 'N', 'U', 'L', 'L', ')', 0 };
Packit Service a721b1
	    ap->a.a_u32_string = u32_null_string;
Packit Service a721b1
	  }
Packit Service a721b1
	break;
Packit Service a721b1
#endif
Packit Service a721b1
      default:
Packit Service a721b1
	/* Unknown type.  */
Packit Service a721b1
	return -1;
Packit Service a721b1
      }
Packit Service a721b1
  return 0;
Packit Service a721b1
}