truncate: New module.
[gnulib/ericb.git] / tests / test-mbrtowc.c
blobddbe2431dc9ad00bf309a07ac660829e3113f00e
1 /* Test of conversion of multibyte character to wide character.
2 Copyright (C) 2008-2017 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 <http://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2008. */
19 #include <config.h>
21 #include <wchar.h>
23 #include "signature.h"
24 SIGNATURE_CHECK (mbrtowc, size_t, (wchar_t *, char const *, size_t,
25 mbstate_t *));
27 #include <locale.h>
28 #include <stdio.h>
29 #include <string.h>
31 #include "macros.h"
33 int
34 main (int argc, char *argv[])
36 mbstate_t state;
37 wchar_t wc;
38 size_t ret;
40 /* configure should already have checked that the locale is supported. */
41 if (setlocale (LC_ALL, "") == NULL)
42 return 1;
44 /* Test zero-length input. */
46 memset (&state, '\0', sizeof (mbstate_t));
47 wc = (wchar_t) 0xBADFACE;
48 ret = mbrtowc (&wc, "x", 0, &state);
49 ASSERT (ret == (size_t)(-2));
50 ASSERT (mbsinit (&state));
53 /* Test NUL byte input. */
55 memset (&state, '\0', sizeof (mbstate_t));
56 wc = (wchar_t) 0xBADFACE;
57 ret = mbrtowc (&wc, "", 1, &state);
58 ASSERT (ret == 0);
59 ASSERT (wc == 0);
60 ASSERT (mbsinit (&state));
61 ret = mbrtowc (NULL, "", 1, &state);
62 ASSERT (ret == 0);
63 ASSERT (mbsinit (&state));
66 /* Test single-byte input. */
68 int c;
69 char buf[1];
71 memset (&state, '\0', sizeof (mbstate_t));
72 for (c = 0; c < 0x100; c++)
73 switch (c)
75 default:
76 if (! (c && 1 < argc && argv[1][0] == '5'))
77 break;
78 /* Fall through. */
79 case '\t': case '\v': case '\f':
80 case ' ': case '!': case '"': case '#': case '%':
81 case '&': case '\'': case '(': case ')': case '*':
82 case '+': case ',': case '-': case '.': case '/':
83 case '0': case '1': case '2': case '3': case '4':
84 case '5': case '6': case '7': case '8': case '9':
85 case ':': case ';': case '<': case '=': case '>':
86 case '?':
87 case 'A': case 'B': case 'C': case 'D': case 'E':
88 case 'F': case 'G': case 'H': case 'I': case 'J':
89 case 'K': case 'L': case 'M': case 'N': case 'O':
90 case 'P': case 'Q': case 'R': case 'S': case 'T':
91 case 'U': case 'V': case 'W': case 'X': case 'Y':
92 case 'Z':
93 case '[': case '\\': case ']': case '^': case '_':
94 case 'a': case 'b': case 'c': case 'd': case 'e':
95 case 'f': case 'g': case 'h': case 'i': case 'j':
96 case 'k': case 'l': case 'm': case 'n': case 'o':
97 case 'p': case 'q': case 'r': case 's': case 't':
98 case 'u': case 'v': case 'w': case 'x': case 'y':
99 case 'z': case '{': case '|': case '}': case '~':
100 /* c is in the ISO C "basic character set", or argv[1] starts
101 with '5' so we are testing all nonnull bytes. */
102 buf[0] = c;
103 wc = (wchar_t) 0xBADFACE;
104 ret = mbrtowc (&wc, buf, 1, &state);
105 ASSERT (ret == 1);
106 ASSERT (wc == c);
107 ASSERT (mbsinit (&state));
108 ret = mbrtowc (NULL, buf, 1, &state);
109 ASSERT (ret == 1);
110 ASSERT (mbsinit (&state));
111 break;
115 /* Test special calling convention, passing a NULL pointer. */
117 memset (&state, '\0', sizeof (mbstate_t));
118 wc = (wchar_t) 0xBADFACE;
119 ret = mbrtowc (&wc, NULL, 5, &state);
120 ASSERT (ret == 0);
121 ASSERT (wc == (wchar_t) 0xBADFACE);
122 ASSERT (mbsinit (&state));
125 if (argc > 1)
126 switch (argv[1][0])
128 case '1':
129 /* Locale encoding is ISO-8859-1 or ISO-8859-15. */
131 char input[] = "B\374\337er"; /* "Büßer" */
132 memset (&state, '\0', sizeof (mbstate_t));
134 wc = (wchar_t) 0xBADFACE;
135 ret = mbrtowc (&wc, input, 1, &state);
136 ASSERT (ret == 1);
137 ASSERT (wc == 'B');
138 ASSERT (mbsinit (&state));
139 input[0] = '\0';
141 wc = (wchar_t) 0xBADFACE;
142 ret = mbrtowc (&wc, input + 1, 1, &state);
143 ASSERT (ret == 1);
144 ASSERT (wctob (wc) == (unsigned char) '\374');
145 ASSERT (mbsinit (&state));
146 input[1] = '\0';
148 /* Test support of NULL first argument. */
149 ret = mbrtowc (NULL, input + 2, 3, &state);
150 ASSERT (ret == 1);
151 ASSERT (mbsinit (&state));
153 wc = (wchar_t) 0xBADFACE;
154 ret = mbrtowc (&wc, input + 2, 3, &state);
155 ASSERT (ret == 1);
156 ASSERT (wctob (wc) == (unsigned char) '\337');
157 ASSERT (mbsinit (&state));
158 input[2] = '\0';
160 wc = (wchar_t) 0xBADFACE;
161 ret = mbrtowc (&wc, input + 3, 2, &state);
162 ASSERT (ret == 1);
163 ASSERT (wc == 'e');
164 ASSERT (mbsinit (&state));
165 input[3] = '\0';
167 wc = (wchar_t) 0xBADFACE;
168 ret = mbrtowc (&wc, input + 4, 1, &state);
169 ASSERT (ret == 1);
170 ASSERT (wc == 'r');
171 ASSERT (mbsinit (&state));
173 return 0;
175 case '2':
176 /* Locale encoding is UTF-8. */
178 char input[] = "B\303\274\303\237er"; /* "Büßer" */
179 memset (&state, '\0', sizeof (mbstate_t));
181 wc = (wchar_t) 0xBADFACE;
182 ret = mbrtowc (&wc, input, 1, &state);
183 ASSERT (ret == 1);
184 ASSERT (wc == 'B');
185 ASSERT (mbsinit (&state));
186 input[0] = '\0';
188 wc = (wchar_t) 0xBADFACE;
189 ret = mbrtowc (&wc, input + 1, 1, &state);
190 ASSERT (ret == (size_t)(-2));
191 ASSERT (wc == (wchar_t) 0xBADFACE);
192 ASSERT (!mbsinit (&state));
193 input[1] = '\0';
195 wc = (wchar_t) 0xBADFACE;
196 ret = mbrtowc (&wc, input + 2, 5, &state);
197 ASSERT (ret == 1);
198 ASSERT (wctob (wc) == EOF);
199 ASSERT (mbsinit (&state));
200 input[2] = '\0';
202 /* Test support of NULL first argument. */
203 ret = mbrtowc (NULL, input + 3, 4, &state);
204 ASSERT (ret == 2);
205 ASSERT (mbsinit (&state));
207 wc = (wchar_t) 0xBADFACE;
208 ret = mbrtowc (&wc, input + 3, 4, &state);
209 ASSERT (ret == 2);
210 ASSERT (wctob (wc) == EOF);
211 ASSERT (mbsinit (&state));
212 input[3] = '\0';
213 input[4] = '\0';
215 wc = (wchar_t) 0xBADFACE;
216 ret = mbrtowc (&wc, input + 5, 2, &state);
217 ASSERT (ret == 1);
218 ASSERT (wc == 'e');
219 ASSERT (mbsinit (&state));
220 input[5] = '\0';
222 wc = (wchar_t) 0xBADFACE;
223 ret = mbrtowc (&wc, input + 6, 1, &state);
224 ASSERT (ret == 1);
225 ASSERT (wc == 'r');
226 ASSERT (mbsinit (&state));
228 return 0;
230 case '3':
231 /* Locale encoding is EUC-JP. */
233 char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
234 memset (&state, '\0', sizeof (mbstate_t));
236 wc = (wchar_t) 0xBADFACE;
237 ret = mbrtowc (&wc, input, 1, &state);
238 ASSERT (ret == 1);
239 ASSERT (wc == '<');
240 ASSERT (mbsinit (&state));
241 input[0] = '\0';
243 wc = (wchar_t) 0xBADFACE;
244 ret = mbrtowc (&wc, input + 1, 2, &state);
245 ASSERT (ret == 2);
246 ASSERT (wctob (wc) == EOF);
247 ASSERT (mbsinit (&state));
248 input[1] = '\0';
249 input[2] = '\0';
251 wc = (wchar_t) 0xBADFACE;
252 ret = mbrtowc (&wc, input + 3, 1, &state);
253 ASSERT (ret == (size_t)(-2));
254 ASSERT (wc == (wchar_t) 0xBADFACE);
255 ASSERT (!mbsinit (&state));
256 input[3] = '\0';
258 wc = (wchar_t) 0xBADFACE;
259 ret = mbrtowc (&wc, input + 4, 4, &state);
260 ASSERT (ret == 1);
261 ASSERT (wctob (wc) == EOF);
262 ASSERT (mbsinit (&state));
263 input[4] = '\0';
265 /* Test support of NULL first argument. */
266 ret = mbrtowc (NULL, input + 5, 3, &state);
267 ASSERT (ret == 2);
268 ASSERT (mbsinit (&state));
270 wc = (wchar_t) 0xBADFACE;
271 ret = mbrtowc (&wc, input + 5, 3, &state);
272 ASSERT (ret == 2);
273 ASSERT (wctob (wc) == EOF);
274 ASSERT (mbsinit (&state));
275 input[5] = '\0';
276 input[6] = '\0';
278 wc = (wchar_t) 0xBADFACE;
279 ret = mbrtowc (&wc, input + 7, 1, &state);
280 ASSERT (ret == 1);
281 ASSERT (wc == '>');
282 ASSERT (mbsinit (&state));
284 return 0;
286 case '4':
287 /* Locale encoding is GB18030. */
289 char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
290 memset (&state, '\0', sizeof (mbstate_t));
292 wc = (wchar_t) 0xBADFACE;
293 ret = mbrtowc (&wc, input, 1, &state);
294 ASSERT (ret == 1);
295 ASSERT (wc == 'B');
296 ASSERT (mbsinit (&state));
297 input[0] = '\0';
299 wc = (wchar_t) 0xBADFACE;
300 ret = mbrtowc (&wc, input + 1, 1, &state);
301 ASSERT (ret == (size_t)(-2));
302 ASSERT (wc == (wchar_t) 0xBADFACE);
303 ASSERT (!mbsinit (&state));
304 input[1] = '\0';
306 wc = (wchar_t) 0xBADFACE;
307 ret = mbrtowc (&wc, input + 2, 7, &state);
308 ASSERT (ret == 1);
309 ASSERT (wctob (wc) == EOF);
310 ASSERT (mbsinit (&state));
311 input[2] = '\0';
313 /* Test support of NULL first argument. */
314 ret = mbrtowc (NULL, input + 3, 6, &state);
315 ASSERT (ret == 4);
316 ASSERT (mbsinit (&state));
318 wc = (wchar_t) 0xBADFACE;
319 ret = mbrtowc (&wc, input + 3, 6, &state);
320 ASSERT (ret == 4);
321 ASSERT (wctob (wc) == EOF);
322 ASSERT (mbsinit (&state));
323 input[3] = '\0';
324 input[4] = '\0';
325 input[5] = '\0';
326 input[6] = '\0';
328 wc = (wchar_t) 0xBADFACE;
329 ret = mbrtowc (&wc, input + 7, 2, &state);
330 ASSERT (ret == 1);
331 ASSERT (wc == 'e');
332 ASSERT (mbsinit (&state));
333 input[5] = '\0';
335 wc = (wchar_t) 0xBADFACE;
336 ret = mbrtowc (&wc, input + 8, 1, &state);
337 ASSERT (ret == 1);
338 ASSERT (wc == 'r');
339 ASSERT (mbsinit (&state));
341 return 0;
343 case '5':
344 /* C locale; tested above. */
345 return 0;
348 return 1;