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