summaryrefslogtreecommitdiffstats
path: root/gl/printf-args.c
diff options
context:
space:
mode:
Diffstat (limited to 'gl/printf-args.c')
-rw-r--r--gl/printf-args.c144
1 files changed, 139 insertions, 5 deletions
diff --git a/gl/printf-args.c b/gl/printf-args.c
index 5e14f654..b83ec1e8 100644
--- a/gl/printf-args.c
+++ b/gl/printf-args.c
@@ -1,5 +1,5 @@
1/* Decomposed printf argument list. 1/* Decomposed printf argument list.
2 Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2023 Free Software 2 Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2025 Free Software
3 Foundation, Inc. 3 Foundation, Inc.
4 4
5 This file is free software: you can redistribute it and/or modify 5 This file is free software: you can redistribute it and/or modify
@@ -29,6 +29,12 @@
29# include "printf-args.h" 29# include "printf-args.h"
30#endif 30#endif
31 31
32/* Get INT_WIDTH. */
33#include <limits.h>
34
35/* Get abort(). */
36#include <stdlib.h>
37
32#ifdef STATIC 38#ifdef STATIC
33STATIC 39STATIC
34#endif 40#endif
@@ -71,6 +77,102 @@ PRINTF_FETCHARGS (va_list args, arguments *a)
71 case TYPE_ULONGLONGINT: 77 case TYPE_ULONGLONGINT:
72 ap->a.a_ulonglongint = va_arg (args, unsigned long long int); 78 ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
73 break; 79 break;
80 case TYPE_INT8_T:
81 #if INT8_WIDTH < INT_WIDTH
82 ap->a.a_int8_t = va_arg (args, /* int8_t */ int);
83 #else
84 ap->a.a_int8_t = va_arg (args, int8_t);
85 #endif
86 break;
87 case TYPE_UINT8_T:
88 #if UINT8_WIDTH < INT_WIDTH
89 ap->a.a_uint8_t = va_arg (args, /* uint8_t */ int);
90 #else
91 ap->a.a_uint8_t = va_arg (args, uint8_t);
92 #endif
93 break;
94 case TYPE_INT16_T:
95 #if INT16_WIDTH < INT_WIDTH
96 ap->a.a_int16_t = va_arg (args, /* int16_t */ int);
97 #else
98 ap->a.a_int16_t = va_arg (args, int16_t);
99 #endif
100 break;
101 case TYPE_UINT16_T:
102 #if UINT16_WIDTH < INT_WIDTH
103 ap->a.a_uint16_t = va_arg (args, /* uint16_t */ int);
104 #else
105 ap->a.a_uint16_t = va_arg (args, uint16_t);
106 #endif
107 break;
108 case TYPE_INT32_T:
109 #if INT32_WIDTH < INT_WIDTH
110 ap->a.a_int32_t = va_arg (args, /* int32_t */ int);
111 #else
112 ap->a.a_int32_t = va_arg (args, int32_t);
113 #endif
114 break;
115 case TYPE_UINT32_T:
116 #if UINT32_WIDTH < INT_WIDTH
117 ap->a.a_uint32_t = va_arg (args, /* uint32_t */ int);
118 #else
119 ap->a.a_uint32_t = va_arg (args, uint32_t);
120 #endif
121 break;
122 case TYPE_INT64_T:
123 ap->a.a_int64_t = va_arg (args, int64_t);
124 break;
125 case TYPE_UINT64_T:
126 ap->a.a_uint64_t = va_arg (args, uint64_t);
127 break;
128 case TYPE_INT_FAST8_T:
129 #if INT_FAST8_WIDTH < INT_WIDTH
130 ap->a.a_int_fast8_t = va_arg (args, /* int_fast8_t */ int);
131 #else
132 ap->a.a_int_fast8_t = va_arg (args, int_fast8_t);
133 #endif
134 break;
135 case TYPE_UINT_FAST8_T:
136 #if UINT_FAST8_WIDTH < INT_WIDTH
137 ap->a.a_uint_fast8_t = va_arg (args, /* uint_fast8_t */ int);
138 #else
139 ap->a.a_uint_fast8_t = va_arg (args, uint_fast8_t);
140 #endif
141 break;
142 case TYPE_INT_FAST16_T:
143 #if INT_FAST16_WIDTH < INT_WIDTH
144 ap->a.a_int_fast16_t = va_arg (args, /* int_fast16_t */ int);
145 #else
146 ap->a.a_int_fast16_t = va_arg (args, int_fast16_t);
147 #endif
148 break;
149 case TYPE_UINT_FAST16_T:
150 #if UINT_FAST16_WIDTH < INT_WIDTH
151 ap->a.a_uint_fast16_t = va_arg (args, /* uint_fast16_t */ int);
152 #else
153 ap->a.a_uint_fast16_t = va_arg (args, uint_fast16_t);
154 #endif
155 break;
156 case TYPE_INT_FAST32_T:
157 #if INT_FAST32_WIDTH < INT_WIDTH
158 ap->a.a_int_fast32_t = va_arg (args, /* int_fast32_t */ int);
159 #else
160 ap->a.a_int_fast32_t = va_arg (args, int_fast32_t);
161 #endif
162 break;
163 case TYPE_UINT_FAST32_T:
164 #if UINT_FAST32_WIDTH < INT_WIDTH
165 ap->a.a_uint_fast32_t = va_arg (args, /* uint_fast32_t */ int);
166 #else
167 ap->a.a_uint_fast32_t = va_arg (args, uint_fast32_t);
168 #endif
169 break;
170 case TYPE_INT_FAST64_T:
171 ap->a.a_int_fast64_t = va_arg (args, int_fast64_t);
172 break;
173 case TYPE_UINT_FAST64_T:
174 ap->a.a_uint_fast64_t = va_arg (args, uint_fast64_t);
175 break;
74 case TYPE_DOUBLE: 176 case TYPE_DOUBLE:
75 ap->a.a_double = va_arg (args, double); 177 ap->a.a_double = va_arg (args, double);
76 break; 178 break;
@@ -99,7 +201,6 @@ PRINTF_FETCHARGS (va_list args, arguments *a)
99 if (ap->a.a_string == NULL) 201 if (ap->a.a_string == NULL)
100 ap->a.a_string = "(NULL)"; 202 ap->a.a_string = "(NULL)";
101 break; 203 break;
102#if HAVE_WCHAR_T
103 case TYPE_WIDE_STRING: 204 case TYPE_WIDE_STRING:
104 ap->a.a_wide_string = va_arg (args, const wchar_t *); 205 ap->a.a_wide_string = va_arg (args, const wchar_t *);
105 /* A null pointer is an invalid argument for "%ls", but in practice 206 /* A null pointer is an invalid argument for "%ls", but in practice
@@ -117,7 +218,6 @@ PRINTF_FETCHARGS (va_list args, arguments *a)
117 ap->a.a_wide_string = wide_null_string; 218 ap->a.a_wide_string = wide_null_string;
118 } 219 }
119 break; 220 break;
120#endif
121 case TYPE_POINTER: 221 case TYPE_POINTER:
122 ap->a.a_pointer = va_arg (args, void *); 222 ap->a.a_pointer = va_arg (args, void *);
123 break; 223 break;
@@ -136,6 +236,30 @@ PRINTF_FETCHARGS (va_list args, arguments *a)
136 case TYPE_COUNT_LONGLONGINT_POINTER: 236 case TYPE_COUNT_LONGLONGINT_POINTER:
137 ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); 237 ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
138 break; 238 break;
239 case TYPE_COUNT_INT8_T_POINTER:
240 ap->a.a_count_int8_t_pointer = va_arg (args, int8_t *);
241 break;
242 case TYPE_COUNT_INT16_T_POINTER:
243 ap->a.a_count_int16_t_pointer = va_arg (args, int16_t *);
244 break;
245 case TYPE_COUNT_INT32_T_POINTER:
246 ap->a.a_count_int32_t_pointer = va_arg (args, int32_t *);
247 break;
248 case TYPE_COUNT_INT64_T_POINTER:
249 ap->a.a_count_int64_t_pointer = va_arg (args, int64_t *);
250 break;
251 case TYPE_COUNT_INT_FAST8_T_POINTER:
252 ap->a.a_count_int_fast8_t_pointer = va_arg (args, int_fast8_t *);
253 break;
254 case TYPE_COUNT_INT_FAST16_T_POINTER:
255 ap->a.a_count_int_fast16_t_pointer = va_arg (args, int_fast16_t *);
256 break;
257 case TYPE_COUNT_INT_FAST32_T_POINTER:
258 ap->a.a_count_int_fast32_t_pointer = va_arg (args, int_fast32_t *);
259 break;
260 case TYPE_COUNT_INT_FAST64_T_POINTER:
261 ap->a.a_count_int_fast64_t_pointer = va_arg (args, int_fast64_t *);
262 break;
139#if ENABLE_UNISTDIO 263#if ENABLE_UNISTDIO
140 /* The unistdio extensions. */ 264 /* The unistdio extensions. */
141 case TYPE_U8_STRING: 265 case TYPE_U8_STRING:
@@ -175,9 +299,19 @@ PRINTF_FETCHARGS (va_list args, arguments *a)
175 } 299 }
176 break; 300 break;
177#endif 301#endif
178 default: 302 case TYPE_NONE:
179 /* Unknown type. */ 303 /* Argument i is not used by any directive, but some argument with
304 number > i is used by a format directive. POSIX says that this
305 is invalid:
306 "When numbered argument specifications are used, specifying the
307 Nth argument requires that all the leading arguments, from the
308 first to the (N-1)th, are specified in the format string."
309 The reason is that we cannot know how many bytes to skip in the
310 va_arg sequence. */
180 return -1; 311 return -1;
312 default:
313 /* Unknown type. Should not happen. */
314 abort ();
181 } 315 }
182 return 0; 316 return 0;
183} 317}