PatchworkOS  19e446b
A non-POSIX operating system.
Loading...
Searching...
No Matches
snprintf.c
Go to the documentation of this file.
1#include <stdio.h>
2
3int snprintf(char* _RESTRICT s, size_t n, const char* _RESTRICT format, ...)
4{
5 int rc;
6 va_list ap;
7 va_start(ap, format);
8 rc = vsnprintf(s, n, format, ap);
9 va_end(ap);
10 return rc;
11}
12
13#ifdef _KERNEL_
14#ifdef _TESTING_
15
16#include <kernel/log/log.h>
17#include <kernel/sched/clock.h>
18#include <kernel/utils/test.h>
19
20#include <limits.h>
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <time.h>
26
27#define sym2v(x) #x
28#define sym2s(x) sym2v(x)
29
30#define INT_MIN_DEZ_STR "2147483648"
31#define INT_MAX_DEZ_STR "2147483647"
32#define UINT_MAX_DEZ_STR "4294967295"
33#define INT_HEXDIG "fffffff"
34#define INT_hexdig "fffffff"
35#define INT_OCTDIG "37777777777"
36#define UINT_DIG 10
37#define INT_DIG 10
38#define INT_DIG_LESS1 "9"
39#define INT_DIG_PLUS1 "11"
40#define INT_DIG_PLUS2 "12"
41#define ULONG_DIG 20
42#define LONG_DIG 19
43#define LONG_MAX_DEZ_STR "9223372036854775807"
44#define LONG_MIN_DEZ_STR "9223372036854775808"
45#define ULONG_MAX_DEZ_STR "18446744073709551615"
46#define ULLONG_DIG 20
47#define LLONG_DIG 19
48#define LLONG_MAX_DEZ_STR "9223372036854775807"
49#define LLONG_MIN_DEZ_STR "9223372036854775808"
50#define ULLONG_MAX_DEZ_STR "18446744073709551615"
51
52#define _PRINT_TEST(rc, expected, ...) \
53 ({ \
54 char buffer[256]; \
55 int ret = snprintf(buffer, sizeof(buffer), __VA_ARGS__); \
56 if (ret != rc || strcmp(buffer, expected) != 0) \
57 { \
58 LOG_ERR("_PRINT_TEST failed at line %d: expected (%d, \"%s\"), got (%d, \"%s\")\n", __LINE__, rc, \
59 expected, ret, buffer); \
60 return ERR; \
61 } \
62 })
63
64static inline uint64_t _test_print_iter(void)
65{
66#if __GNUC__
67#pragma GCC diagnostic push
68#pragma GCC diagnostic ignored "-Wformat"
69#endif
70#if CHAR_MIN == -128
71 assert(CHAR_MIN == -128);
72 _PRINT_TEST(4, "-128", "%hhd", CHAR_MIN);
73 assert(CHAR_MAX == 127);
74 _PRINT_TEST(3, "127", "%hhd", CHAR_MAX);
75#else
76 assert(CHAR_MIN == 0);
77 _PRINT_TEST(1, "0", "%hhu", CHAR_MIN);
78 assert(CHAR_MAX == 255);
79 _PRINT_TEST(3, "255", "%hhu", CHAR_MAX);
80#endif
81 _PRINT_TEST(1, "0", "%hhd", 0);
82 assert(SHRT_MIN == -32768);
83 _PRINT_TEST(6, "-32768", "%hd", SHRT_MIN);
84 assert(SHRT_MAX == 32767);
85 _PRINT_TEST(5, "32767", "%hd", SHRT_MAX);
86 _PRINT_TEST(1, "0", "%hd", 0);
87 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%d", INT_MIN);
88 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%d", INT_MAX);
89 _PRINT_TEST(1, "0", "%d", 0);
90 _PRINT_TEST(LONG_DIG + 1, "-" LONG_MIN_DEZ_STR, "%ld", LONG_MIN);
91 _PRINT_TEST(LONG_DIG, LONG_MAX_DEZ_STR, "%ld", LONG_MAX);
92 _PRINT_TEST(1, "0", "%ld", 0l);
93 _PRINT_TEST(LLONG_DIG + 1, "-" LLONG_MIN_DEZ_STR, "%lld", LLONG_MIN);
94 _PRINT_TEST(LLONG_DIG, LLONG_MAX_DEZ_STR, "%lld", LLONG_MAX);
95 _PRINT_TEST(1, "0", "%lld", 0ll);
96 _PRINT_TEST(3, "255", "%hhu", UCHAR_MAX);
97 _PRINT_TEST(3, "255", "%hhu", (unsigned char)-1);
98 _PRINT_TEST(5, "65535", "%hu", USHRT_MAX);
99 _PRINT_TEST(5, "65535", "%hu", (unsigned short)-1);
100 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "%u", UINT_MAX);
101 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "%u", -1u);
102 _PRINT_TEST(ULONG_DIG, ULONG_MAX_DEZ_STR, "%lu", ULONG_MAX);
103 _PRINT_TEST(ULONG_DIG, ULONG_MAX_DEZ_STR, "%lu", -1ul);
104 _PRINT_TEST(ULLONG_DIG, ULLONG_MAX_DEZ_STR, "%llu", ULLONG_MAX);
105 _PRINT_TEST(ULLONG_DIG, ULLONG_MAX_DEZ_STR, "%llu", -1ull);
106 _PRINT_TEST((int)strlen(INT_HEXDIG) + 1, "f" INT_hexdig, "%x", UINT_MAX);
107 _PRINT_TEST((int)strlen(INT_HEXDIG) + 3, "0xf" INT_hexdig, "%#x", -1u);
108 _PRINT_TEST((int)strlen(INT_OCTDIG), INT_OCTDIG, "%o", UINT_MAX);
109 _PRINT_TEST((int)strlen(INT_OCTDIG) + 1, "0" INT_OCTDIG, "%#o", -1u);
110#if 0
111 /* TODO: This test case is broken, doesn't test what it was intended to. */
112 _PRINT_TEST( 5, "%.0#o", "%.0#o", 0 );
113#endif
114 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%+d", INT_MIN);
115 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+d", INT_MAX);
116 _PRINT_TEST(2, "+0", "%+d", 0);
117 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "%+u", UINT_MAX);
118 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "%+u", -1u);
119 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "% d", INT_MIN);
120 _PRINT_TEST(INT_DIG + 1, " " INT_MAX_DEZ_STR, "% d", INT_MAX);
121 _PRINT_TEST(2, " 0", "% d", 0);
122 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "% u", UINT_MAX);
123 _PRINT_TEST(UINT_DIG, UINT_MAX_DEZ_STR, "% u", -1u);
124 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" INT_DIG_LESS1 "d", INT_MIN);
125 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%" INT_DIG_LESS1 "d", INT_MAX);
126 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" sym2s(INT_DIG) "d", INT_MIN);
127 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%" sym2s(INT_DIG) "d", INT_MAX);
128 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%" INT_DIG_PLUS1 "d", INT_MIN);
129 _PRINT_TEST(INT_DIG + 1, " " INT_MAX_DEZ_STR, "%" INT_DIG_PLUS1 "d", INT_MAX);
130 _PRINT_TEST(INT_DIG + 2, " -" INT_MIN_DEZ_STR, "%" INT_DIG_PLUS2 "d", INT_MIN);
131 _PRINT_TEST(INT_DIG + 2, " " INT_MAX_DEZ_STR, "%" INT_DIG_PLUS2 "d", INT_MAX);
132 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" INT_DIG_LESS1 "d", INT_MIN);
133 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%-" INT_DIG_LESS1 "d", INT_MAX);
134 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" sym2s(INT_DIG) "d", INT_MIN);
135 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%-" sym2s(INT_DIG) "d", INT_MAX);
136 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-" INT_DIG_PLUS1 "d", INT_MIN);
137 _PRINT_TEST(INT_DIG + 1, INT_MAX_DEZ_STR " ", "%-" INT_DIG_PLUS1 "d", INT_MAX);
138 _PRINT_TEST(INT_DIG + 2, "-" INT_MIN_DEZ_STR " ", "%-" INT_DIG_PLUS2 "d", INT_MIN);
139 _PRINT_TEST(INT_DIG + 2, INT_MAX_DEZ_STR " ", "%-" INT_DIG_PLUS2 "d", INT_MAX);
140 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" INT_DIG_LESS1 "d", INT_MIN);
141 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%0" INT_DIG_LESS1 "d", INT_MAX);
142 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" sym2s(INT_DIG) "d", INT_MIN);
143 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%0" sym2s(INT_DIG) "d", INT_MAX);
144 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%0" INT_DIG_PLUS1 "d", INT_MIN);
145 _PRINT_TEST(INT_DIG + 1, "0" INT_MAX_DEZ_STR, "%0" INT_DIG_PLUS1 "d", INT_MAX);
146 _PRINT_TEST(INT_DIG + 2, "-0" INT_MIN_DEZ_STR, "%0" INT_DIG_PLUS2 "d", INT_MIN);
147 _PRINT_TEST(INT_DIG + 2, "00" INT_MAX_DEZ_STR, "%0" INT_DIG_PLUS2 "d", INT_MAX);
148 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" INT_DIG_LESS1 "d", INT_MIN);
149 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%-0" INT_DIG_LESS1 "d", INT_MAX);
150 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" sym2s(INT_DIG) "d", INT_MIN);
151 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%-0" sym2s(INT_DIG) "d", INT_MAX);
152 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%-0" INT_DIG_PLUS1 "d", INT_MIN);
153 _PRINT_TEST(INT_DIG + 1, INT_MAX_DEZ_STR " ", "%-0" INT_DIG_PLUS1 "d", INT_MAX);
154 _PRINT_TEST(INT_DIG + 2, "-" INT_MIN_DEZ_STR " ", "%-0" INT_DIG_PLUS2 "d", INT_MIN);
155 _PRINT_TEST(INT_DIG + 2, INT_MAX_DEZ_STR " ", "%-0" INT_DIG_PLUS2 "d", INT_MAX);
156 /* FIXME: This test not yet 32/64 bit agnostic */
157 _PRINT_TEST(30, " 00000000002147483647", "%030.20d", INT_MAX);
158 _PRINT_TEST((int)strlen(INT_HEXDIG) + 1, "f" INT_hexdig, "%.6x", UINT_MAX);
159 _PRINT_TEST((int)strlen(INT_HEXDIG) + 3, "0xf" INT_hexdig, "%#6.3x", UINT_MAX);
160 _PRINT_TEST((int)strlen(INT_HEXDIG) + 3, "0xf" INT_hexdig, "%#3.6x", UINT_MAX);
161 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%.6d", INT_MIN);
162 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%6.3d", INT_MIN);
163 _PRINT_TEST(INT_DIG + 1, "-" INT_MIN_DEZ_STR, "%3.6d", INT_MIN);
164 _PRINT_TEST(UINT_DIG, "0xf" INT_hexdig, "%#0.6x", UINT_MAX);
165 _PRINT_TEST(UINT_DIG, "0xf" INT_hexdig, "%#06.3x", UINT_MAX);
166 _PRINT_TEST(UINT_DIG, "0xf" INT_hexdig, "%#03.6x", UINT_MAX);
167 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%#0.6d", INT_MAX);
168 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%#06.3d", INT_MAX);
169 _PRINT_TEST(INT_DIG, INT_MAX_DEZ_STR, "%#03.6d", INT_MAX);
170 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+.6d", INT_MAX);
171 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+6.3d", INT_MAX);
172 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%#+3.6d", INT_MAX);
173 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+0.6d", INT_MAX);
174 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+06.3d", INT_MAX);
175 _PRINT_TEST(INT_DIG + 1, "+" INT_MAX_DEZ_STR, "%+03.6d", INT_MAX);
176#ifndef TEST_CONVERSION_ONLY
177 _PRINT_TEST(INT_DIG + 2, "- " INT_MAX_DEZ_STR, "- %d", INT_MAX);
178 _PRINT_TEST(INT_DIG * 2 + 6, "- " INT_MAX_DEZ_STR " % -" INT_MIN_DEZ_STR, "- %d %% %d", INT_MAX, INT_MIN);
179#endif
180 _PRINT_TEST(1, "x", "%c", 'x');
181 _PRINT_TEST(6, "abcdef", "%s", "abcdef");
182 _PRINT_TEST(18, "0x00000000deadbeef", "%p", (void*)0xdeadbeef);
183 _PRINT_TEST(6, " 0x1", "%#6x", 1);
184#ifndef TEST_CONVERSION_ONLY
185 {
186 int val1, val2;
187 _PRINT_TEST(9, "123456789", "123456%n789%n", &val1, &val2);
188 TEST_ASSERT(val1 == 6);
189 TEST_ASSERT(val2 == 9);
190 }
191#endif
192 /* Verify "unusual" combinations of length and signedness */
193 _PRINT_TEST(1, "1", "%tu", (ptrdiff_t)1); /* unsigned prtdiff_t */
194 _PRINT_TEST(2, "-1", "%jd", (intmax_t)-1); /* intmax_t */
195 _PRINT_TEST(1, "1", "%ju", (uintmax_t)1); /* uintmax_t */
196 _PRINT_TEST(1, "1", "%zd", (size_t)1); /* signed size_t */
197 /******************************************************************************
198 * NOTE: The following test cases are imported from the Tyndur project. They *
199 * are therefore under the license of said project, not CC0. *
200 * As said code comprises test cases, it does not form part of the *
201 * final compiled library, and has no bearing on its licensing. *
202 ******************************************************************************/
203 /*
204 * Copyright (c) 2011 The tyndur Project. All rights reserved.
205 *
206 * This code is derived from software contributed to the tyndur Project
207 * by Kevin Wolf.
208 *
209 * Redistribution and use in source and binary forms, with or without
210 * modification, are permitted provided that the following conditions
211 * are met:
212 * 1. Redistributions of source code must retain the above copyright
213 * notice, this list of conditions and the following disclaimer.
214 * 2. Redistributions in binary form must reproduce the above copyright
215 * notice, this list of conditions and the following disclaimer in the
216 * documentation and/or other materials provided with the distribution.
217 *
218 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
219 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
220 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
222 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
223 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
224 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
226 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
227 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
228 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
229 */
230#ifndef TEST_CONVERSION_ONLY
231 /* Ein String ohne alles */
232 _PRINT_TEST(12, "Hallo heimur", "Hallo heimur");
233#endif
234 /* Einfache Konvertierungen */
235 _PRINT_TEST(12, "Hallo heimur", "%s", "Hallo heimur");
236 _PRINT_TEST(4, "1024", "%d", 1024);
237 _PRINT_TEST(5, "-1024", "%d", -1024);
238 _PRINT_TEST(4, "1024", "%i", 1024);
239 _PRINT_TEST(5, "-1024", "%i", -1024);
240 _PRINT_TEST(4, "1024", "%u", 1024u);
241 _PRINT_TEST(10, "4294966272", "%u", -1024u);
242 _PRINT_TEST(3, "777", "%o", 0777u);
243 _PRINT_TEST(11, "37777777001", "%o", -0777u);
244 _PRINT_TEST(8, "1234abcd", "%x", 0x1234abcdu);
245 _PRINT_TEST(8, "edcb5433", "%x", -0x1234abcdu);
246 _PRINT_TEST(8, "1234ABCD", "%X", 0x1234abcdu);
247 _PRINT_TEST(8, "EDCB5433", "%X", -0x1234abcdu);
248 _PRINT_TEST(1, "x", "%c", 'x');
249 _PRINT_TEST(1, "%", "%%");
250 /* Mit %c kann man auch Nullbytes ausgeben */
251 _PRINT_TEST(1, "\0", "%c", '\0');
252 /* Vorzeichen erzwingen (Flag +) */
253 _PRINT_TEST(12, "Hallo heimur", "%+s", "Hallo heimur");
254 _PRINT_TEST(5, "+1024", "%+d", 1024);
255 _PRINT_TEST(5, "-1024", "%+d", -1024);
256 _PRINT_TEST(5, "+1024", "%+i", 1024);
257 _PRINT_TEST(5, "-1024", "%+i", -1024);
258 _PRINT_TEST(4, "1024", "%+u", 1024u);
259 _PRINT_TEST(10, "4294966272", "%+u", -1024u);
260 _PRINT_TEST(3, "777", "%+o", 0777u);
261 _PRINT_TEST(11, "37777777001", "%+o", -0777u);
262 _PRINT_TEST(8, "1234abcd", "%+x", 0x1234abcdu);
263 _PRINT_TEST(8, "edcb5433", "%+x", -0x1234abcdu);
264 _PRINT_TEST(8, "1234ABCD", "%+X", 0x1234abcdu);
265 _PRINT_TEST(8, "EDCB5433", "%+X", -0x1234abcdu);
266 _PRINT_TEST(1, "x", "%+c", 'x');
267 /* Vorzeichenplatzhalter erzwingen (Flag <space>) */
268 _PRINT_TEST(12, "Hallo heimur", "% s", "Hallo heimur");
269 _PRINT_TEST(5, " 1024", "% d", 1024);
270 _PRINT_TEST(5, "-1024", "% d", -1024);
271 _PRINT_TEST(5, " 1024", "% i", 1024);
272 _PRINT_TEST(5, "-1024", "% i", -1024);
273 _PRINT_TEST(4, "1024", "% u", 1024u);
274 _PRINT_TEST(10, "4294966272", "% u", -1024u);
275 _PRINT_TEST(3, "777", "% o", 0777u);
276 _PRINT_TEST(11, "37777777001", "% o", -0777u);
277 _PRINT_TEST(8, "1234abcd", "% x", 0x1234abcdu);
278 _PRINT_TEST(8, "edcb5433", "% x", -0x1234abcdu);
279 _PRINT_TEST(8, "1234ABCD", "% X", 0x1234abcdu);
280 _PRINT_TEST(8, "EDCB5433", "% X", -0x1234abcdu);
281 _PRINT_TEST(1, "x", "% c", 'x');
282 /* Flag + hat Vorrang über <space> */
283 _PRINT_TEST(12, "Hallo heimur", "%+ s", "Hallo heimur");
284 _PRINT_TEST(5, "+1024", "%+ d", 1024);
285 _PRINT_TEST(5, "-1024", "%+ d", -1024);
286 _PRINT_TEST(5, "+1024", "%+ i", 1024);
287 _PRINT_TEST(5, "-1024", "%+ i", -1024);
288 _PRINT_TEST(4, "1024", "%+ u", 1024u);
289 _PRINT_TEST(10, "4294966272", "%+ u", -1024u);
290 _PRINT_TEST(3, "777", "%+ o", 0777u);
291 _PRINT_TEST(11, "37777777001", "%+ o", -0777u);
292 _PRINT_TEST(8, "1234abcd", "%+ x", 0x1234abcdu);
293 _PRINT_TEST(8, "edcb5433", "%+ x", -0x1234abcdu);
294 _PRINT_TEST(8, "1234ABCD", "%+ X", 0x1234abcdu);
295 _PRINT_TEST(8, "EDCB5433", "%+ X", -0x1234abcdu);
296 _PRINT_TEST(1, "x", "%+ c", 'x');
297 /* Alternative Form */
298 _PRINT_TEST(4, "0777", "%#o", 0777u);
299 _PRINT_TEST(12, "037777777001", "%#o", -0777u);
300 _PRINT_TEST(10, "0x1234abcd", "%#x", 0x1234abcdu);
301 _PRINT_TEST(10, "0xedcb5433", "%#x", -0x1234abcdu);
302 _PRINT_TEST(10, "0X1234ABCD", "%#X", 0x1234abcdu);
303 _PRINT_TEST(10, "0XEDCB5433", "%#X", -0x1234abcdu);
304 _PRINT_TEST(1, "0", "%#o", 0u);
305 _PRINT_TEST(1, "0", "%#x", 0u);
306 _PRINT_TEST(1, "0", "%#X", 0u);
307 /* Feldbreite: Kleiner als Ausgabe */
308 _PRINT_TEST(12, "Hallo heimur", "%1s", "Hallo heimur");
309 _PRINT_TEST(4, "1024", "%1d", 1024);
310 _PRINT_TEST(5, "-1024", "%1d", -1024);
311 _PRINT_TEST(4, "1024", "%1i", 1024);
312 _PRINT_TEST(5, "-1024", "%1i", -1024);
313 _PRINT_TEST(4, "1024", "%1u", 1024u);
314 _PRINT_TEST(10, "4294966272", "%1u", -1024u);
315 _PRINT_TEST(3, "777", "%1o", 0777u);
316 _PRINT_TEST(11, "37777777001", "%1o", -0777u);
317 _PRINT_TEST(8, "1234abcd", "%1x", 0x1234abcdu);
318 _PRINT_TEST(8, "edcb5433", "%1x", -0x1234abcdu);
319 _PRINT_TEST(8, "1234ABCD", "%1X", 0x1234abcdu);
320 _PRINT_TEST(8, "EDCB5433", "%1X", -0x1234abcdu);
321 _PRINT_TEST(1, "x", "%1c", 'x');
322 /* Feldbreite: Größer als Ausgabe */
323 _PRINT_TEST(20, " Hallo", "%20s", "Hallo");
324 _PRINT_TEST(20, " 1024", "%20d", 1024);
325 _PRINT_TEST(20, " -1024", "%20d", -1024);
326 _PRINT_TEST(20, " 1024", "%20i", 1024);
327 _PRINT_TEST(20, " -1024", "%20i", -1024);
328 _PRINT_TEST(20, " 1024", "%20u", 1024u);
329 _PRINT_TEST(20, " 4294966272", "%20u", -1024u);
330 _PRINT_TEST(20, " 777", "%20o", 0777u);
331 _PRINT_TEST(20, " 37777777001", "%20o", -0777u);
332 _PRINT_TEST(20, " 1234abcd", "%20x", 0x1234abcdu);
333 _PRINT_TEST(20, " edcb5433", "%20x", -0x1234abcdu);
334 _PRINT_TEST(20, " 1234ABCD", "%20X", 0x1234abcdu);
335 _PRINT_TEST(20, " EDCB5433", "%20X", -0x1234abcdu);
336 _PRINT_TEST(20, " x", "%20c", 'x');
337 /* Feldbreite: Linksbündig */
338 _PRINT_TEST(20, "Hallo ", "%-20s", "Hallo");
339 _PRINT_TEST(20, "1024 ", "%-20d", 1024);
340 _PRINT_TEST(20, "-1024 ", "%-20d", -1024);
341 _PRINT_TEST(20, "1024 ", "%-20i", 1024);
342 _PRINT_TEST(20, "-1024 ", "%-20i", -1024);
343 _PRINT_TEST(20, "1024 ", "%-20u", 1024u);
344 _PRINT_TEST(20, "4294966272 ", "%-20u", -1024u);
345 _PRINT_TEST(20, "777 ", "%-20o", 0777u);
346 _PRINT_TEST(20, "37777777001 ", "%-20o", -0777u);
347 _PRINT_TEST(20, "1234abcd ", "%-20x", 0x1234abcdu);
348 _PRINT_TEST(20, "edcb5433 ", "%-20x", -0x1234abcdu);
349 _PRINT_TEST(20, "1234ABCD ", "%-20X", 0x1234abcdu);
350 _PRINT_TEST(20, "EDCB5433 ", "%-20X", -0x1234abcdu);
351 _PRINT_TEST(20, "x ", "%-20c", 'x');
352 /* Feldbreite: Padding mit 0 */
353 _PRINT_TEST(20, "00000000000000001024", "%020d", 1024);
354 _PRINT_TEST(20, "-0000000000000001024", "%020d", -1024);
355 _PRINT_TEST(20, "00000000000000001024", "%020i", 1024);
356 _PRINT_TEST(20, "-0000000000000001024", "%020i", -1024);
357 _PRINT_TEST(20, "00000000000000001024", "%020u", 1024u);
358 _PRINT_TEST(20, "00000000004294966272", "%020u", -1024u);
359 _PRINT_TEST(20, "00000000000000000777", "%020o", 0777u);
360 _PRINT_TEST(20, "00000000037777777001", "%020o", -0777u);
361 _PRINT_TEST(20, "0000000000001234abcd", "%020x", 0x1234abcdu);
362 _PRINT_TEST(20, "000000000000edcb5433", "%020x", -0x1234abcdu);
363 _PRINT_TEST(20, "0000000000001234ABCD", "%020X", 0x1234abcdu);
364 _PRINT_TEST(20, "000000000000EDCB5433", "%020X", -0x1234abcdu);
365 /* Feldbreite: Padding und alternative Form */
366 _PRINT_TEST(20, " 0777", "%#20o", 0777u);
367 _PRINT_TEST(20, " 037777777001", "%#20o", -0777u);
368 _PRINT_TEST(20, " 0x1234abcd", "%#20x", 0x1234abcdu);
369 _PRINT_TEST(20, " 0xedcb5433", "%#20x", -0x1234abcdu);
370 _PRINT_TEST(20, " 0X1234ABCD", "%#20X", 0x1234abcdu);
371 _PRINT_TEST(20, " 0XEDCB5433", "%#20X", -0x1234abcdu);
372 _PRINT_TEST(20, "00000000000000000777", "%#020o", 0777u);
373 _PRINT_TEST(20, "00000000037777777001", "%#020o", -0777u);
374 _PRINT_TEST(20, "0x00000000001234abcd", "%#020x", 0x1234abcdu);
375 _PRINT_TEST(20, "0x0000000000edcb5433", "%#020x", -0x1234abcdu);
376 _PRINT_TEST(20, "0X00000000001234ABCD", "%#020X", 0x1234abcdu);
377 _PRINT_TEST(20, "0X0000000000EDCB5433", "%#020X", -0x1234abcdu);
378 /* Feldbreite: - hat Vorrang vor 0 */
379 _PRINT_TEST(20, "Hallo ", "%0-20s", "Hallo");
380 _PRINT_TEST(20, "1024 ", "%0-20d", 1024);
381 _PRINT_TEST(20, "-1024 ", "%0-20d", -1024);
382 _PRINT_TEST(20, "1024 ", "%0-20i", 1024);
383 _PRINT_TEST(20, "-1024 ", "%0-20i", -1024);
384 _PRINT_TEST(20, "1024 ", "%0-20u", 1024u);
385 _PRINT_TEST(20, "4294966272 ", "%0-20u", -1024u);
386 _PRINT_TEST(20, "777 ", "%-020o", 0777u);
387 _PRINT_TEST(20, "37777777001 ", "%-020o", -0777u);
388 _PRINT_TEST(20, "1234abcd ", "%-020x", 0x1234abcdu);
389 _PRINT_TEST(20, "edcb5433 ", "%-020x", -0x1234abcdu);
390 _PRINT_TEST(20, "1234ABCD ", "%-020X", 0x1234abcdu);
391 _PRINT_TEST(20, "EDCB5433 ", "%-020X", -0x1234abcdu);
392 _PRINT_TEST(20, "x ", "%-020c", 'x');
393 /* Feldbreite: Aus Parameter */
394 _PRINT_TEST(20, " Hallo", "%*s", 20, "Hallo");
395 _PRINT_TEST(20, " 1024", "%*d", 20, 1024);
396 _PRINT_TEST(20, " -1024", "%*d", 20, -1024);
397 _PRINT_TEST(20, " 1024", "%*i", 20, 1024);
398 _PRINT_TEST(20, " -1024", "%*i", 20, -1024);
399 _PRINT_TEST(20, " 1024", "%*u", 20, 1024u);
400 _PRINT_TEST(20, " 4294966272", "%*u", 20, -1024u);
401 _PRINT_TEST(20, " 777", "%*o", 20, 0777u);
402 _PRINT_TEST(20, " 37777777001", "%*o", 20, -0777u);
403 _PRINT_TEST(20, " 1234abcd", "%*x", 20, 0x1234abcdu);
404 _PRINT_TEST(20, " edcb5433", "%*x", 20, -0x1234abcdu);
405 _PRINT_TEST(20, " 1234ABCD", "%*X", 20, 0x1234abcdu);
406 _PRINT_TEST(20, " EDCB5433", "%*X", 20, -0x1234abcdu);
407 _PRINT_TEST(20, " x", "%*c", 20, 'x');
408 /* Präzision / Mindestanzahl von Ziffern */
409 _PRINT_TEST(12, "Hallo heimur", "%.20s", "Hallo heimur");
410 _PRINT_TEST(20, "00000000000000001024", "%.20d", 1024);
411 _PRINT_TEST(21, "-00000000000000001024", "%.20d", -1024);
412 _PRINT_TEST(20, "00000000000000001024", "%.20i", 1024);
413 _PRINT_TEST(21, "-00000000000000001024", "%.20i", -1024);
414 _PRINT_TEST(20, "00000000000000001024", "%.20u", 1024u);
415 _PRINT_TEST(20, "00000000004294966272", "%.20u", -1024u);
416 _PRINT_TEST(20, "00000000000000000777", "%.20o", 0777u);
417 _PRINT_TEST(20, "00000000037777777001", "%.20o", -0777u);
418 _PRINT_TEST(20, "0000000000001234abcd", "%.20x", 0x1234abcdu);
419 _PRINT_TEST(20, "000000000000edcb5433", "%.20x", -0x1234abcdu);
420 _PRINT_TEST(20, "0000000000001234ABCD", "%.20X", 0x1234abcdu);
421 _PRINT_TEST(20, "000000000000EDCB5433", "%.20X", -0x1234abcdu);
422 /* Feldbreite und Präzision */
423 _PRINT_TEST(20, " Hallo", "%20.5s", "Hallo heimur");
424 _PRINT_TEST(20, " 01024", "%20.5d", 1024);
425 _PRINT_TEST(20, " -01024", "%20.5d", -1024);
426 _PRINT_TEST(20, " 01024", "%20.5i", 1024);
427 _PRINT_TEST(20, " -01024", "%20.5i", -1024);
428 _PRINT_TEST(20, " 01024", "%20.5u", 1024u);
429 _PRINT_TEST(20, " 4294966272", "%20.5u", -1024u);
430 _PRINT_TEST(20, " 00777", "%20.5o", 0777u);
431 _PRINT_TEST(20, " 37777777001", "%20.5o", -0777u);
432 _PRINT_TEST(20, " 1234abcd", "%20.5x", 0x1234abcdu);
433 _PRINT_TEST(20, " 00edcb5433", "%20.10x", -0x1234abcdu);
434 _PRINT_TEST(20, " 1234ABCD", "%20.5X", 0x1234abcdu);
435 _PRINT_TEST(20, " 00EDCB5433", "%20.10X", -0x1234abcdu);
436 /* Präzision: 0 wird ignoriert */
437 _PRINT_TEST(20, " 01024", "%020.5d", 1024);
438 _PRINT_TEST(20, " -01024", "%020.5d", -1024);
439 _PRINT_TEST(20, " 01024", "%020.5i", 1024);
440 _PRINT_TEST(20, " -01024", "%020.5i", -1024);
441 _PRINT_TEST(20, " 01024", "%020.5u", 1024u);
442 _PRINT_TEST(20, " 4294966272", "%020.5u", -1024u);
443 _PRINT_TEST(20, " 00777", "%020.5o", 0777u);
444 _PRINT_TEST(20, " 37777777001", "%020.5o", -0777u);
445 _PRINT_TEST(20, " 1234abcd", "%020.5x", 0x1234abcdu);
446 _PRINT_TEST(20, " 00edcb5433", "%020.10x", -0x1234abcdu);
447 _PRINT_TEST(20, " 1234ABCD", "%020.5X", 0x1234abcdu);
448 _PRINT_TEST(20, " 00EDCB5433", "%020.10X", -0x1234abcdu);
449 /* Präzision 0 */
450 _PRINT_TEST(0, "", "%.0s", "Hallo heimur");
451 _PRINT_TEST(20, " ", "%20.0s", "Hallo heimur");
452 _PRINT_TEST(0, "", "%.s", "Hallo heimur");
453 _PRINT_TEST(20, " ", "%20.s", "Hallo heimur");
454 _PRINT_TEST(20, " 1024", "%20.0d", 1024);
455 _PRINT_TEST(20, " -1024", "%20.d", -1024);
456 _PRINT_TEST(20, " ", "%20.d", 0);
457 _PRINT_TEST(20, " 1024", "%20.0i", 1024);
458 _PRINT_TEST(20, " -1024", "%20.i", -1024);
459 _PRINT_TEST(20, " ", "%20.i", 0);
460 _PRINT_TEST(20, " 1024", "%20.u", 1024u);
461 _PRINT_TEST(20, " 4294966272", "%20.0u", -1024u);
462 _PRINT_TEST(20, " ", "%20.u", 0u);
463 _PRINT_TEST(20, " 777", "%20.o", 0777u);
464 _PRINT_TEST(20, " 37777777001", "%20.0o", -0777u);
465 _PRINT_TEST(20, " ", "%20.o", 0u);
466 _PRINT_TEST(20, " 1234abcd", "%20.x", 0x1234abcdu);
467 _PRINT_TEST(20, " edcb5433", "%20.0x", -0x1234abcdu);
468 _PRINT_TEST(20, " ", "%20.x", 0u);
469 _PRINT_TEST(20, " 1234ABCD", "%20.X", 0x1234abcdu);
470 _PRINT_TEST(20, " EDCB5433", "%20.0X", -0x1234abcdu);
471 _PRINT_TEST(20, " ", "%20.X", 0u);
472 /* Negative Präzision wird ignoriert */
473 /* XXX glibc tut nicht, was ich erwartet habe, vorerst deaktiviert... */
474 /*
475 * Präzision und Feldbreite aus Parameter.
476 * + hat Vorrang vor <space>, - hat Vorrang vor 0 (das eh ignoriert wird,
477 * weil eine Präzision angegeben ist)
478 */
479 _PRINT_TEST(20, "Hallo ", "% -0+*.*s", 20, 5, "Hallo heimur");
480 _PRINT_TEST(20, "+01024 ", "% -0+*.*d", 20, 5, 1024);
481 _PRINT_TEST(20, "-01024 ", "% -0+*.*d", 20, 5, -1024);
482 _PRINT_TEST(20, "+01024 ", "% -0+*.*i", 20, 5, 1024);
483 _PRINT_TEST(20, "-01024 ", "% 0-+*.*i", 20, 5, -1024);
484 _PRINT_TEST(20, "01024 ", "% 0-+*.*u", 20, 5, 1024u);
485 _PRINT_TEST(20, "4294966272 ", "% 0-+*.*u", 20, 5, -1024u);
486 _PRINT_TEST(20, "00777 ", "%+ -0*.*o", 20, 5, 0777u);
487 _PRINT_TEST(20, "37777777001 ", "%+ -0*.*o", 20, 5, -0777u);
488 _PRINT_TEST(20, "1234abcd ", "%+ -0*.*x", 20, 5, 0x1234abcdu);
489 _PRINT_TEST(20, "00edcb5433 ", "%+ -0*.*x", 20, 10, -0x1234abcdu);
490 _PRINT_TEST(20, "1234ABCD ", "% -+0*.*X", 20, 5, 0x1234abcdu);
491 _PRINT_TEST(20, "00EDCB5433 ", "% -+0*.*X", 20, 10, -0x1234abcdu);
492#if __GNUC__
493#pragma GCC diagnostic pop
494#endif
495
496 return 0;
497}
498/******************************************************************************/
499
500TEST_DEFINE(print)
501{
502 for (int k = 0; k < 1; ++k)
503 {
504 TEST_ASSERT(_test_print_iter() != ERR);
505 }
506
507 return 0;
508}
509
510#endif
511#endif
#define _RESTRICT
Definition config.h:17
#define assert(expression)
Definition assert.h:29
static char format[MAX_NAME]
Definition screen.c:17
#define TEST_DEFINE(_name)
Define a test function to be run by TEST_ALL().
Definition test.h:71
#define TEST_ASSERT(cond)
Assert a condition in a test.
Definition test.h:82
#define ERR
Integer error value.
Definition ERR.h:17
__UINTMAX_TYPE__ uintmax_t
Definition inttypes.h:12
__INTMAX_TYPE__ intmax_t
Definition inttypes.h:11
#define SHRT_MAX
Definition limits.h:24
#define INT_MIN
Definition limits.h:27
#define LLONG_MAX
Definition limits.h:15
#define UCHAR_MAX
Definition limits.h:23
#define ULONG_MAX
Definition limits.h:32
#define LONG_MAX
Definition limits.h:28
#define CHAR_MIN
Definition limits.h:20
#define USHRT_MAX
Definition limits.h:30
#define CHAR_MAX
Definition limits.h:19
#define INT_MAX
Definition limits.h:26
#define ULLONG_MAX
Definition limits.h:16
#define UINT_MAX
Definition limits.h:31
#define SHRT_MIN
Definition limits.h:25
#define LONG_MIN
Definition limits.h:29
#define LLONG_MIN
Definition limits.h:14
__PTRDIFF_TYPE__ ptrdiff_t
Definition ptrdiff_t.h:4
int snprintf(char *_RESTRICT s, size_t n, const char *_RESTRICT format,...)
Definition snprintf.c:3
#define va_start(ap, parmN)
Definition stdarg.h:16
#define va_end(ap)
Definition stdarg.h:15
__builtin_va_list va_list
Definition stdarg.h:11
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC int vsnprintf(char *_RESTRICT s, size_t n, const char *_RESTRICT format, va_list arg)
Definition vsnprintf.c:31
_PUBLIC size_t strlen(const char *s)
Definition strlen.c:3