realloc: more improvements for realloc (p, 0)
[gnulib.git] / tests / unistdio / test-u32-asnprintf1.h
blobaf78684891ad817fdd7e243eff145437bfca003b
1 /* Test of u32_[v]asnprintf() function.
2 Copyright (C) 2007, 2009-2024 Free Software Foundation, Inc.
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 3 of the License, or
7 (at your option) any later version.
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.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
19 static void
20 test_function (uint32_t * (*my_asnprintf) (uint32_t *, size_t *, const char *, ...))
22 uint32_t buf[8];
23 int size;
25 /* Test return value convention. */
27 for (size = 0; size <= 8; size++)
29 size_t length = size;
30 uint32_t *result = my_asnprintf (NULL, &length, "%d", 12345);
31 static const uint32_t expected[] =
32 { '1', '2', '3', '4', '5', 0 };
33 ASSERT (result != NULL);
34 ASSERT (u32_strcmp (result, expected) == 0);
35 ASSERT (length == 5);
36 free (result);
39 for (size = 0; size <= 8; size++)
41 static const uint32_t initializer[] =
42 { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F', 0 };
43 static const uint32_t expected[] =
44 { '1', '2', '3', '4', '5', 0 };
45 size_t length;
46 uint32_t *result;
48 u32_cpy (buf, initializer, 8);
49 length = size;
50 result = my_asnprintf (buf, &length, "%d", 12345);
51 ASSERT (result != NULL);
52 ASSERT (u32_strcmp (result, expected) == 0);
53 ASSERT (length == 5);
54 if (size < 6)
55 ASSERT (result != buf);
56 ASSERT (u32_cmp (buf + size, initializer + size, 8 - size) == 0);
57 if (result != buf)
58 free (result);
61 /* Verify that u32_[v]asnprintf() rejects a width > 2 GiB, < 4 GiB. */
63 size_t length;
64 uint32_t *s = my_asnprintf (NULL, &length, "x%03000000000dy\n", -17);
65 ASSERT (s == NULL);
66 ASSERT (errno == EOVERFLOW);
69 static const uint32_t arg[] = { '@', 0 };
70 size_t length;
71 uint32_t *s = my_asnprintf (NULL, &length, "x%03000000000llUy\n", arg);
72 ASSERT (s == NULL);
73 ASSERT (errno == EOVERFLOW);
76 /* Verify that u32_[v]asnprintf() rejects a width > 4 GiB. */
78 size_t length;
79 uint32_t *s =
80 my_asnprintf (NULL, &length,
81 "x%04294967306dy\n", /* 2^32 + 10 */
82 -17);
83 ASSERT (s == NULL);
84 ASSERT (errno == EOVERFLOW);
87 static const uint32_t arg[] = { '@', 0 };
88 size_t length;
89 uint32_t *s =
90 my_asnprintf (NULL, &length,
91 "x%04294967306llUy\n", /* 2^32 + 10 */
92 arg);
93 ASSERT (s == NULL);
94 ASSERT (errno == EOVERFLOW);
97 size_t length;
98 uint32_t *s =
99 my_asnprintf (NULL, &length,
100 "x%018446744073709551626dy\n", /* 2^64 + 10 */
101 -17);
102 ASSERT (s == NULL);
103 ASSERT (errno == EOVERFLOW);
106 static const uint32_t arg[] = { '@', 0 };
107 size_t length;
108 uint32_t *s =
109 my_asnprintf (NULL, &length,
110 "x%018446744073709551626llUy\n", /* 2^64 + 10 */
111 arg);
112 ASSERT (s == NULL);
113 ASSERT (errno == EOVERFLOW);