PageRenderTime 21ms CodeModel.GetById 7ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/xbmc/screensavers/rsxs-0.9/lib/printf-args.c

http://github.com/xbmc/xbmc
C | 137 lines | 109 code | 4 blank | 24 comment | 6 complexity | a5bca063658b639b53e8520ffd9b9c24 MD5 | raw file
  1/* Decomposed printf argument list.
  2   Copyright (C) 1999, 2002-2003, 2006 Free Software Foundation, Inc.
  3
  4   This program is free software; you can redistribute it and/or modify
  5   it under the terms of the GNU General Public License as published by
  6   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
 12   GNU General Public License for more details.
 13
 14   You should have received a copy of the GNU General Public License along
 15   with this program; if not, write to the Free Software Foundation,
 16   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 17
 18#ifdef HAVE_CONFIG_H
 19# include <config.h>
 20#endif
 21
 22/* Specification.  */
 23#include "printf-args.h"
 24
 25#ifdef STATIC
 26STATIC
 27#endif
 28int
 29printf_fetchargs (va_list args, arguments *a)
 30{
 31  size_t i;
 32  argument *ap;
 33
 34  for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
 35    switch (ap->type)
 36      {
 37      case TYPE_SCHAR:
 38	ap->a.a_schar = va_arg (args, /*signed char*/ int);
 39	break;
 40      case TYPE_UCHAR:
 41	ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
 42	break;
 43      case TYPE_SHORT:
 44	ap->a.a_short = va_arg (args, /*short*/ int);
 45	break;
 46      case TYPE_USHORT:
 47	ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
 48	break;
 49      case TYPE_INT:
 50	ap->a.a_int = va_arg (args, int);
 51	break;
 52      case TYPE_UINT:
 53	ap->a.a_uint = va_arg (args, unsigned int);
 54	break;
 55      case TYPE_LONGINT:
 56	ap->a.a_longint = va_arg (args, long int);
 57	break;
 58      case TYPE_ULONGINT:
 59	ap->a.a_ulongint = va_arg (args, unsigned long int);
 60	break;
 61#ifdef HAVE_LONG_LONG
 62      case TYPE_LONGLONGINT:
 63	ap->a.a_longlongint = va_arg (args, long long int);
 64	break;
 65      case TYPE_ULONGLONGINT:
 66	ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
 67	break;
 68#endif
 69      case TYPE_DOUBLE:
 70	ap->a.a_double = va_arg (args, double);
 71	break;
 72#ifdef HAVE_LONG_DOUBLE
 73      case TYPE_LONGDOUBLE:
 74	ap->a.a_longdouble = va_arg (args, long double);
 75	break;
 76#endif
 77      case TYPE_CHAR:
 78	ap->a.a_char = va_arg (args, int);
 79	break;
 80#ifdef HAVE_WINT_T
 81      case TYPE_WIDE_CHAR:
 82	ap->a.a_wide_char = va_arg (args, wint_t);
 83	break;
 84#endif
 85      case TYPE_STRING:
 86	ap->a.a_string = va_arg (args, const char *);
 87	/* A null pointer is an invalid argument for "%s", but in practice
 88	   it occurs quite frequently in printf statements that produce
 89	   debug output.  Use a fallback in this case.  */
 90	if (ap->a.a_string == NULL)
 91	  ap->a.a_string = "(NULL)";
 92	break;
 93#ifdef HAVE_WCHAR_T
 94      case TYPE_WIDE_STRING:
 95	ap->a.a_wide_string = va_arg (args, const wchar_t *);
 96	/* A null pointer is an invalid argument for "%ls", but in practice
 97	   it occurs quite frequently in printf statements that produce
 98	   debug output.  Use a fallback in this case.  */
 99	if (ap->a.a_wide_string == NULL)
100	  {
101	    static const wchar_t wide_null_string[] =
102	      {
103		(wchar_t)'(',
104		(wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
105		(wchar_t)')',
106		(wchar_t)0
107	      };
108	    ap->a.a_wide_string = wide_null_string;
109	  }
110	break;
111#endif
112      case TYPE_POINTER:
113	ap->a.a_pointer = va_arg (args, void *);
114	break;
115      case TYPE_COUNT_SCHAR_POINTER:
116	ap->a.a_count_schar_pointer = va_arg (args, signed char *);
117	break;
118      case TYPE_COUNT_SHORT_POINTER:
119	ap->a.a_count_short_pointer = va_arg (args, short *);
120	break;
121      case TYPE_COUNT_INT_POINTER:
122	ap->a.a_count_int_pointer = va_arg (args, int *);
123	break;
124      case TYPE_COUNT_LONGINT_POINTER:
125	ap->a.a_count_longint_pointer = va_arg (args, long int *);
126	break;
127#ifdef HAVE_LONG_LONG
128      case TYPE_COUNT_LONGLONGINT_POINTER:
129	ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
130	break;
131#endif
132      default:
133	/* Unknown type.  */
134	return -1;
135      }
136  return 0;
137}