t_mbrtoc8.c revision 1.3.6.2 1 1.3.6.2 perseant /* $NetBSD: t_mbrtoc8.c,v 1.3.6.2 2025/08/02 05:58:05 perseant Exp $ */
2 1.3.6.2 perseant
3 1.3.6.2 perseant /*-
4 1.3.6.2 perseant * Copyright (c) 2002 Tim J. Robbins
5 1.3.6.2 perseant * All rights reserved.
6 1.3.6.2 perseant *
7 1.3.6.2 perseant * Copyright (c) 2013 Ed Schouten <ed (at) FreeBSD.org>
8 1.3.6.2 perseant * All rights reserved.
9 1.3.6.2 perseant *
10 1.3.6.2 perseant * Redistribution and use in source and binary forms, with or without
11 1.3.6.2 perseant * modification, are permitted provided that the following conditions
12 1.3.6.2 perseant * are met:
13 1.3.6.2 perseant * 1. Redistributions of source code must retain the above copyright
14 1.3.6.2 perseant * notice, this list of conditions and the following disclaimer.
15 1.3.6.2 perseant * 2. Redistributions in binary form must reproduce the above copyright
16 1.3.6.2 perseant * notice, this list of conditions and the following disclaimer in the
17 1.3.6.2 perseant * documentation and/or other materials provided with the distribution.
18 1.3.6.2 perseant *
19 1.3.6.2 perseant * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 1.3.6.2 perseant * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 1.3.6.2 perseant * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 1.3.6.2 perseant * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 1.3.6.2 perseant * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 1.3.6.2 perseant * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 1.3.6.2 perseant * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 1.3.6.2 perseant * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 1.3.6.2 perseant * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 1.3.6.2 perseant * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 1.3.6.2 perseant * SUCH DAMAGE.
30 1.3.6.2 perseant */
31 1.3.6.2 perseant /*
32 1.3.6.2 perseant * Test program for mbrtoc8() as specified by C23.
33 1.3.6.2 perseant */
34 1.3.6.2 perseant
35 1.3.6.2 perseant #include <sys/cdefs.h>
36 1.3.6.2 perseant __RCSID("$NetBSD: t_mbrtoc8.c,v 1.3.6.2 2025/08/02 05:58:05 perseant Exp $");
37 1.3.6.2 perseant
38 1.3.6.2 perseant #include <errno.h>
39 1.3.6.2 perseant #include <inttypes.h>
40 1.3.6.2 perseant #include <limits.h>
41 1.3.6.2 perseant #include <locale.h>
42 1.3.6.2 perseant #include <string.h>
43 1.3.6.2 perseant #include <uchar.h>
44 1.3.6.2 perseant
45 1.3.6.2 perseant #include <atf-c.h>
46 1.3.6.2 perseant
47 1.3.6.2 perseant static void
48 1.3.6.2 perseant require_lc_ctype(const char *locale_name)
49 1.3.6.2 perseant {
50 1.3.6.2 perseant char *lc_ctype_set;
51 1.3.6.2 perseant
52 1.3.6.2 perseant lc_ctype_set = setlocale(LC_CTYPE, locale_name);
53 1.3.6.2 perseant if (lc_ctype_set == NULL)
54 1.3.6.2 perseant atf_tc_fail("setlocale(LC_CTYPE, \"%s\") failed; errno=%d",
55 1.3.6.2 perseant locale_name, errno);
56 1.3.6.2 perseant
57 1.3.6.2 perseant ATF_REQUIRE_EQ_MSG(strcmp(lc_ctype_set, locale_name), 0,
58 1.3.6.2 perseant "lc_ctype_set=%s locale_name=%s", lc_ctype_set, locale_name);
59 1.3.6.2 perseant }
60 1.3.6.2 perseant
61 1.3.6.2 perseant static mbstate_t s;
62 1.3.6.2 perseant static char8_t c8;
63 1.3.6.2 perseant
64 1.3.6.2 perseant ATF_TC_WITHOUT_HEAD(mbrtoc8_c_locale_test);
65 1.3.6.2 perseant ATF_TC_BODY(mbrtoc8_c_locale_test, tc)
66 1.3.6.2 perseant {
67 1.3.6.2 perseant size_t n;
68 1.3.6.2 perseant
69 1.3.6.2 perseant require_lc_ctype("C");
70 1.3.6.2 perseant
71 1.3.6.2 perseant /* Null wide character, internal state. */
72 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n);
73 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
74 1.3.6.2 perseant
75 1.3.6.2 perseant /* Null wide character. */
76 1.3.6.2 perseant memset(&s, 0, sizeof(s));
77 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n);
78 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
79 1.3.6.2 perseant
80 1.3.6.2 perseant /* Latin letter A, internal state. */
81 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n);
82 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n);
83 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
84 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
85 1.3.6.2 perseant
86 1.3.6.2 perseant /* Latin letter A. */
87 1.3.6.2 perseant memset(&s, 0, sizeof(s));
88 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n);
89 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
90 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
91 1.3.6.2 perseant
92 1.3.6.2 perseant /* Incomplete character sequence. */
93 1.3.6.2 perseant c8 = 'z';
94 1.3.6.2 perseant memset(&s, 0, sizeof(s));
95 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2,
96 1.3.6.2 perseant "n=%zu", n);
97 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8,
98 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'z');
99 1.3.6.2 perseant
100 1.3.6.2 perseant /* Check that mbrtoc8() doesn't access the buffer when n == 0. */
101 1.3.6.2 perseant c8 = 'z';
102 1.3.6.2 perseant memset(&s, 0, sizeof(s));
103 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2,
104 1.3.6.2 perseant "n=%zu", n);
105 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8,
106 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'z');
107 1.3.6.2 perseant
108 1.3.6.2 perseant /* Check that mbrtoc8() doesn't read ahead too aggressively. */
109 1.3.6.2 perseant memset(&s, 0, sizeof(s));
110 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "AB", 2, &s)), 1, "n=%zu", n);
111 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
112 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
113 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "C", 1, &s)), 1, "n=%zu", n);
114 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'C', "c8=0x%"PRIx8" 'C'=0x%"PRIx8,
115 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'C');
116 1.3.6.2 perseant
117 1.3.6.2 perseant }
118 1.3.6.2 perseant
119 1.3.6.2 perseant ATF_TC_WITHOUT_HEAD(mbrtoc8_iso2022jp_locale_test);
120 1.3.6.2 perseant ATF_TC_BODY(mbrtoc8_iso2022jp_locale_test, tc)
121 1.3.6.2 perseant {
122 1.3.6.2 perseant size_t n;
123 1.3.6.2 perseant
124 1.3.6.2 perseant require_lc_ctype("ja_JP.ISO-2022-JP");
125 1.3.6.2 perseant
126 1.3.6.2 perseant /* Null wide character, internal state. */
127 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n);
128 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
129 1.3.6.2 perseant
130 1.3.6.2 perseant /* Null wide character. */
131 1.3.6.2 perseant memset(&s, 0, sizeof(s));
132 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n);
133 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
134 1.3.6.2 perseant
135 1.3.6.2 perseant /* Latin letter A, internal state. */
136 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n);
137 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n);
138 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
139 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
140 1.3.6.2 perseant
141 1.3.6.2 perseant /* Latin letter A. */
142 1.3.6.2 perseant memset(&s, 0, sizeof(s));
143 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n);
144 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
145 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
146 1.3.6.2 perseant
147 1.3.6.2 perseant /* Incomplete character sequence. */
148 1.3.6.2 perseant c8 = 'z';
149 1.3.6.2 perseant memset(&s, 0, sizeof(s));
150 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2,
151 1.3.6.2 perseant "n=%zu", n);
152 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8,
153 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'z');
154 1.3.6.2 perseant
155 1.3.6.2 perseant /* Check that mbrtoc8() doesn't access the buffer when n == 0. */
156 1.3.6.2 perseant c8 = 'z';
157 1.3.6.2 perseant memset(&s, 0, sizeof(s));
158 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2,
159 1.3.6.2 perseant "n=%zu", n);
160 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8,
161 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'z');
162 1.3.6.2 perseant
163 1.3.6.2 perseant /* Check that mbrtoc8() doesn't read ahead too aggressively. */
164 1.3.6.2 perseant memset(&s, 0, sizeof(s));
165 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "AB", 2, &s)), 1, "n=%zu", n);
166 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
167 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
168 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "C", 1, &s)), 1, "n=%zu", n);
169 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'C', "c8=0x%"PRIx8" 'C'=0x%"PRIx8,
170 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'C');
171 1.3.6.2 perseant
172 1.3.6.2 perseant /* Incomplete character sequence (shift sequence only). */
173 1.3.6.2 perseant memset(&s, 0, sizeof(s));
174 1.3.6.2 perseant c8 = 0;
175 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J", 3, &s)), (size_t)-2,
176 1.3.6.2 perseant "n=%zu", n);
177 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
178 1.3.6.2 perseant
179 1.3.6.2 perseant /* Same as above, but complete (U+00A5 YEN SIGN). */
180 1.3.6.2 perseant memset(&s, 0, sizeof(s));
181 1.3.6.2 perseant c8 = 0;
182 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J\x5c", 4, &s)), 4,
183 1.3.6.2 perseant "n=%zu", n);
184 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8);
185 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
186 1.3.6.2 perseant "n=%zu", n);
187 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8);
188 1.3.6.2 perseant
189 1.3.6.2 perseant /* Test restarting behaviour. */
190 1.3.6.2 perseant memset(&s, 0, sizeof(s));
191 1.3.6.2 perseant c8 = 0;
192 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-2,
193 1.3.6.2 perseant "n=%zu", n);
194 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
195 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "J\x5c", 2, &s)), 2, "n=%zu", n);
196 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8);
197 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
198 1.3.6.2 perseant "n=%zu", n);
199 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8);
200 1.3.6.2 perseant
201 1.3.6.2 perseant /*
202 1.3.6.2 perseant * Test shift sequence state in various increments:
203 1.3.6.2 perseant * 1. U+0042 LATIN CAPITAL LETTER A
204 1.3.6.2 perseant * 2. (shift ISO/IEC 646:JP) U+00A5 YEN SIGN
205 1.3.6.2 perseant * 3. U+00A5 YEN SIGN
206 1.3.6.2 perseant * 4. (shift JIS X 0208) U+30A2 KATAKANA LETTER A
207 1.3.6.2 perseant * 5. U+30A2 KATAKANA LETTER A
208 1.3.6.2 perseant * 6. (shift to initial state) U+0000 NUL
209 1.3.6.2 perseant */
210 1.3.6.2 perseant memset(&s, 0, sizeof(s));
211 1.3.6.2 perseant c8 = 0;
212 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A\x1b(J", 4, &s)), 1, "n=%zu", n);
213 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8, (uint8_t)c8);
214 1.3.6.2 perseant c8 = 0;
215 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J", 3, &s)), (size_t)-2,
216 1.3.6.2 perseant "n=%zu", n);
217 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
218 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x5c", 2, &s)), 1,
219 1.3.6.2 perseant "n=%zu", n);
220 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8);
221 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x1b$", 3, &s)), (size_t)-3,
222 1.3.6.2 perseant "n=%zu", n);
223 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8);
224 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x1b$", 3, &s)), 1,
225 1.3.6.2 perseant "n=%zu", n);
226 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8);
227 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b", 1, &s)), (size_t)-3,
228 1.3.6.2 perseant "n=%zu", n);
229 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8);
230 1.3.6.2 perseant c8 = 0xff;
231 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b", 1, &s)), (size_t)-2,
232 1.3.6.2 perseant "n=%zu", n);
233 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xff, "c8=0x%"PRIx8, (uint8_t)c8);
234 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "$B\x25\x22", 4, &s)), 4,
235 1.3.6.2 perseant "n=%zu", n);
236 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xe3, "c8=0x%"PRIx8, (uint8_t)c8);
237 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-3,
238 1.3.6.2 perseant "n=%zu", n);
239 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8);
240 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-3,
241 1.3.6.2 perseant "n=%zu", n);
242 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa2, "c8=0x%"PRIx8, (uint8_t)c8);
243 1.3.6.2 perseant c8 = 0;
244 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-2,
245 1.3.6.2 perseant "n=%zu", n);
246 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
247 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x22\x1b(B\x00", 5, &s)), 1,
248 1.3.6.2 perseant "n=%zu", n);
249 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xe3, "c8=0x%"PRIx8, (uint8_t)c8);
250 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-3,
251 1.3.6.2 perseant "n=%zu", n);
252 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8);
253 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-3,
254 1.3.6.2 perseant "n=%zu", n);
255 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa2, "c8=0x%"PRIx8, (uint8_t)c8);
256 1.3.6.2 perseant c8 = 0;
257 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-2,
258 1.3.6.2 perseant "n=%zu", n);
259 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
260 1.3.6.2 perseant c8 = 42;
261 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "B\x00", 2, &s)), 0, "n=%zu", n);
262 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
263 1.3.6.2 perseant }
264 1.3.6.2 perseant
265 1.3.6.2 perseant ATF_TC_WITHOUT_HEAD(mbrtoc8_iso_8859_1_test);
266 1.3.6.2 perseant ATF_TC_BODY(mbrtoc8_iso_8859_1_test, tc)
267 1.3.6.2 perseant {
268 1.3.6.2 perseant size_t n;
269 1.3.6.2 perseant
270 1.3.6.2 perseant require_lc_ctype("en_US.ISO8859-1");
271 1.3.6.2 perseant
272 1.3.6.2 perseant /* Currency sign. */
273 1.3.6.2 perseant memset(&s, 0, sizeof(s));
274 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xa4", 1, &s)), 1, "n=%zu", n);
275 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8);
276 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
277 1.3.6.2 perseant "n=%zu", n);
278 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa4, "c8=0x%"PRIx8, (uint8_t)c8);
279 1.3.6.2 perseant }
280 1.3.6.2 perseant
281 1.3.6.2 perseant ATF_TC_WITHOUT_HEAD(mbrtoc8_iso_8859_15_test);
282 1.3.6.2 perseant ATF_TC_BODY(mbrtoc8_iso_8859_15_test, tc)
283 1.3.6.2 perseant {
284 1.3.6.2 perseant size_t n;
285 1.3.6.2 perseant
286 1.3.6.2 perseant require_lc_ctype("en_US.ISO8859-15");
287 1.3.6.2 perseant
288 1.3.6.2 perseant /* Euro sign. */
289 1.3.6.2 perseant memset(&s, 0, sizeof(s));
290 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xa4", 1, &s)), 1, "n=%zu", n);
291 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xe2, "c8=0x%"PRIx8, (uint8_t)c8);
292 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
293 1.3.6.2 perseant "n=%zu", n);
294 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8);
295 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
296 1.3.6.2 perseant "n=%zu", n);
297 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xac, "c8=0x%"PRIx8, (uint8_t)c8);
298 1.3.6.2 perseant }
299 1.3.6.2 perseant
300 1.3.6.2 perseant ATF_TC_WITHOUT_HEAD(mbrtoc8_utf_8_test);
301 1.3.6.2 perseant ATF_TC_BODY(mbrtoc8_utf_8_test, tc)
302 1.3.6.2 perseant {
303 1.3.6.2 perseant size_t n;
304 1.3.6.2 perseant
305 1.3.6.2 perseant require_lc_ctype("en_US.UTF-8");
306 1.3.6.2 perseant
307 1.3.6.2 perseant /* Null wide character, internal state. */
308 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n);
309 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n);
310 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
311 1.3.6.2 perseant
312 1.3.6.2 perseant /* Null wide character. */
313 1.3.6.2 perseant memset(&s, 0, sizeof(s));
314 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n);
315 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
316 1.3.6.2 perseant
317 1.3.6.2 perseant /* Latin letter A, internal state. */
318 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n);
319 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n);
320 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
321 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
322 1.3.6.2 perseant
323 1.3.6.2 perseant /* Latin letter A. */
324 1.3.6.2 perseant memset(&s, 0, sizeof(s));
325 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n);
326 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8,
327 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'A');
328 1.3.6.2 perseant
329 1.3.6.2 perseant /* Incomplete character sequence (zero length). */
330 1.3.6.2 perseant c8 = 'z';
331 1.3.6.2 perseant memset(&s, 0, sizeof(s));
332 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2,
333 1.3.6.2 perseant "n=%zu", n);
334 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8,
335 1.3.6.2 perseant (uint8_t)c8, (uint8_t)'z');
336 1.3.6.2 perseant
337 1.3.6.2 perseant /* Incomplete character sequence (truncated double-byte). */
338 1.3.6.2 perseant memset(&s, 0, sizeof(s));
339 1.3.6.2 perseant c8 = 0;
340 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3", 1, &s)), (size_t)-2,
341 1.3.6.2 perseant "n=%zu", n);
342 1.3.6.2 perseant
343 1.3.6.2 perseant /* Same as above, but complete. */
344 1.3.6.2 perseant memset(&s, 0, sizeof(s));
345 1.3.6.2 perseant c8 = 0;
346 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3\x84", 2, &s)), 2,
347 1.3.6.2 perseant "n=%zu", n);
348 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8);
349 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
350 1.3.6.2 perseant "n=%zu", n);
351 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x84, "c8=0x%"PRIx8, (uint8_t)c8);
352 1.3.6.2 perseant
353 1.3.6.2 perseant /* Test restarting behaviour. */
354 1.3.6.2 perseant memset(&s, 0, sizeof(s));
355 1.3.6.2 perseant c8 = 0;
356 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3", 1, &s)), (size_t)-2,
357 1.3.6.2 perseant "n=%zu", n);
358 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8);
359 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xb7", 1, &s)), 1, "n=%zu", n);
360 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8);
361 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
362 1.3.6.2 perseant "n=%zu", n);
363 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xb7, "c8=0x%"PRIx8, (uint8_t)c8);
364 1.3.6.2 perseant
365 1.3.6.2 perseant /* Four-byte sequence. */
366 1.3.6.2 perseant memset(&s, 0, sizeof(s));
367 1.3.6.2 perseant c8 = 0;
368 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xf0\x9f\x92\xa9", 4, &s)), 4,
369 1.3.6.2 perseant "n=%zu", n);
370 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xf0, "c8=0x%"PRIx8, (uint8_t)c8);
371 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
372 1.3.6.2 perseant "n=%zu", n);
373 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x9f, "c8=0x%"PRIx8, (uint8_t)c8);
374 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
375 1.3.6.2 perseant "n=%zu", n);
376 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x92, "c8=0x%"PRIx8, (uint8_t)c8);
377 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
378 1.3.6.2 perseant "n=%zu", n);
379 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa9, "c8=0x%"PRIx8, (uint8_t)c8);
380 1.3.6.2 perseant
381 1.3.6.2 perseant /* Letter e with acute, precomposed. */
382 1.3.6.2 perseant memset(&s, 0, sizeof(s));
383 1.3.6.2 perseant c8 = 0;
384 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3\xa9", 2, &s)), 2,
385 1.3.6.2 perseant "n=%zu", n);
386 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8);
387 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
388 1.3.6.2 perseant "n=%zu", n);
389 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xa9, "c8=0x%"PRIx8, (uint8_t)c8);
390 1.3.6.2 perseant
391 1.3.6.2 perseant /* Letter e with acute, combined. */
392 1.3.6.2 perseant memset(&s, 0, sizeof(s));
393 1.3.6.2 perseant c8 = 0;
394 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x65\xcc\x81", 3, &s)), 1,
395 1.3.6.2 perseant "n=%zu", n);
396 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x65, "c8=0x%"PRIx8, (uint8_t)c8);
397 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xcc\x81", 2, &s)), 2,
398 1.3.6.2 perseant "n=%zu", n);
399 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0xcc, "c8=0x%"PRIx8, (uint8_t)c8);
400 1.3.6.2 perseant ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3,
401 1.3.6.2 perseant "n=%zu", n);
402 1.3.6.2 perseant ATF_CHECK_EQ_MSG(c8, 0x81, "c8=0x%"PRIx8, (uint8_t)c8);
403 1.3.6.2 perseant }
404 1.3.6.2 perseant
405 1.3.6.2 perseant ATF_TP_ADD_TCS(tp)
406 1.3.6.2 perseant {
407 1.3.6.2 perseant
408 1.3.6.2 perseant ATF_TP_ADD_TC(tp, mbrtoc8_c_locale_test);
409 1.3.6.2 perseant ATF_TP_ADD_TC(tp, mbrtoc8_iso2022jp_locale_test);
410 1.3.6.2 perseant ATF_TP_ADD_TC(tp, mbrtoc8_iso_8859_1_test);
411 1.3.6.2 perseant ATF_TP_ADD_TC(tp, mbrtoc8_iso_8859_15_test);
412 1.3.6.2 perseant ATF_TP_ADD_TC(tp, mbrtoc8_utf_8_test);
413 1.3.6.2 perseant
414 1.3.6.2 perseant return (atf_no_error());
415 1.3.6.2 perseant }
416