xref: /haiku/src/tests/system/libroot/posix/tst-wcrtomb.c (revision 1deede7388b04dbeec5af85cae7164735ea9e70d)
1 /* Copyright (C) 2000 Free Software Foundation, Inc.
2  This file is part of the GNU C Library.
3  Contributed by Ulrich Drepper <drepper@redhat.com>, 2000.
4 
5  The GNU C Library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9 
10  The GNU C Library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with the GNU C Library; if not, write to the Free
17  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18  02111-1307 USA.  */
19 
20 #include <locale.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <wchar.h>
25 
26 static int check_ascii(const char *locname);
27 
28 
29 int
30 main(void)
31 {
32 	int result = 0;
33 
34 	/* Check mapping of ASCII range for some character sets which have
35 	 ASCII as a subset.  For those the wide char generated must have
36 	 the same value.  */
37 	setlocale(LC_ALL, "C");
38 	result |= check_ascii(setlocale(LC_ALL, NULL));
39 
40 	setlocale(LC_ALL, "de_DE.UTF-8");
41 	result |= check_ascii(setlocale(LC_ALL, NULL));
42 
43 	setlocale(LC_ALL, "ja_JP.EUC-JP");
44 	result |= check_ascii(setlocale(LC_ALL, NULL));
45 
46 	return result;
47 }
48 
49 
50 static int
51 check_ascii(const char *locname)
52 {
53 	wchar_t wc;
54 	int res = 0;
55 
56 	printf("Testing locale \"%s\":\n", locname);
57 
58 	for (wc = 0; wc <= 127; ++wc) {
59 		char buf[2 * MB_CUR_MAX];
60 		mbstate_t s;
61 		size_t n;
62 
63 		memset(buf, '\xff', sizeof(buf));
64 		memset(&s, '\0', sizeof(s));
65 
66 		n = wcrtomb(buf, wc, &s);
67 		if (n == (size_t) - 1) {
68 			printf("%s: '\\x%x': encoding error\n", locname, (int) wc);
69 			++res;
70 		} else if (n == 0) {
71 			printf("%s: '\\x%x': 0 returned\n", locname, (int) wc);
72 			++res;
73 		} else if (n != 1) {
74 			printf("%s: '\\x%x': not 1 returned\n", locname, (int) wc);
75 			++res;
76 		} else if (wc != (wchar_t) buf[0]) {
77 			printf("%s: L'\\x%x': buf[0] != '\\x%x'\n", locname, (int) wc,
78 				(int) wc);
79 			++res;
80 		}
81 	}
82 
83 	printf(res == 1 ? "%d error\n" : "%d errors\n", res);
84 
85 	return res != 0;
86 }
87