xref: /haiku/src/tests/system/libroot/posix/tst-btowc.c (revision 2222d0559df303a9846a2fad53741f8b20b14d7c)
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 <wchar.h>
23 
24 /* Currently selected locale.  */
25 static const char *current_locale;
26 
27 
28 /* Test which should succeed.  */
29 static int
30 ok_test(int c, wint_t expwc)
31 {
32 	wint_t wc = btowc(c);
33 
34 	if (wc != expwc) {
35 		printf(
36 			"%s: btowc('%c') failed, returned L'\\x%x' instead of L'\\x%x'\n",
37 			current_locale, c, wc, expwc);
38 		return 1;
39 	}
40 
41 	return 0;
42 }
43 
44 
45 /* Test which should fail.  */
46 static int
47 fail_test(int c)
48 {
49 	wint_t wc = btowc(c);
50 
51 	if (wc != WEOF) {
52 		printf("%s: btowc('%c') succeded, returned L'\\x%x' instead of WEOF\n",
53 			current_locale, c, wc);
54 		return 1;
55 	}
56 
57 	return 0;
58 }
59 
60 
61 /* Test EOF handling.  */
62 static int
63 eof_test(void)
64 {
65 	wint_t wc = btowc(EOF);
66 	if (wc != WEOF) {
67 		printf("%s: btowc(EOF) returned L'\\x%x', not WEOF\n", current_locale,
68 			wc);
69 	}
70 
71 	return 0;
72 }
73 
74 
75 /* Test the btowc() function for a few locales with known character sets.  */
76 int
77 main(void)
78 {
79 	int totalResult = 0;
80 
81 	printf("WEOF=0x%08x\n", WEOF);
82 	printf("WCHAR_MIN=0x%08lx\n", WCHAR_MIN);
83 	printf("WCHAR_MAX=0x%08lx\n", WCHAR_MAX);
84 
85 	current_locale = setlocale(LC_ALL, "C");
86 	if (current_locale == NULL) {
87 		puts("cannot set locale \"C\"");
88 		totalResult = 1;
89 	} else {
90 		int c;
91 		int result = 0;
92 
93 		for (c = 0; c < 128; ++c)
94 			result |= ok_test(c, c);
95 
96 		for (c = 128; c < 256; ++c)
97 			result |= fail_test(c);
98 
99 		result |= eof_test();
100 		totalResult |= result;
101 
102 		if (result == 0)
103 			printf("locale '%s' ok\n", current_locale);
104 	}
105 
106 	current_locale = setlocale(LC_ALL, "en_US.ANSI_X3.4-1968");
107 	if (current_locale == NULL) {
108 		puts("cannot set locale \"en_US.ANSI_X3.4-1968\"");
109 		totalResult = 1;
110 	} else {
111 		int c;
112 		int result = 0;
113 
114 		for (c = 0; c < 128; ++c)
115 			result |= ok_test(c, c);
116 
117 		for (c = 128; c < 256; ++c)
118 			result |= fail_test(c);
119 
120 		result |= eof_test();
121 		totalResult |= result;
122 
123 		if (result == 0)
124 			printf("locale '%s' ok\n", current_locale);
125 	}
126 
127 	current_locale = setlocale(LC_ALL, "de_DE.ISO-8859-1");
128 	if (current_locale == NULL) {
129 		puts("cannot set locale \"de_DE.ISO-8859-1\"");
130 		totalResult = 1;
131 	} else {
132 		int c;
133 		int result = 0;
134 
135 		for (c = 0; c < 256; ++c)
136 			result |= ok_test(c, c);
137 
138 		result |= eof_test();
139 		totalResult |= result;
140 
141 		if (result == 0)
142 			printf("locale '%s' ok\n", current_locale);
143 	}
144 
145 	current_locale = setlocale(LC_ALL, "de_DE.UTF-8");
146 	if (current_locale == NULL) {
147 		puts("cannot set locale \"de_DE.UTF-8\"");
148 		totalResult = 1;
149 	} else {
150 		int c;
151 		int result = 0;
152 
153 		for (c = 0; c < 128; ++c)
154 			result |= ok_test(c, c);
155 
156 		for (c = 128; c < 256; ++c)
157 			result |= fail_test(c);
158 
159 		result |= eof_test();
160 		totalResult |= result;
161 
162 		if (result == 0)
163 			printf("locale '%s' ok\n", current_locale);
164 	}
165 
166 	current_locale = setlocale(LC_ALL, "hr_HR.ISO-8859-2");
167 	if (current_locale == NULL) {
168 		puts("cannot set locale \"hr_HR.ISO-8859-2\"");
169 		totalResult = 1;
170 	} else {
171 		static const wint_t upper_half[] = { 0x0104, 0x02D8, 0x0141, 0x00A4,
172 			0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179,
173 			0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4,
174 			0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A,
175 			0x02DD, 0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4,
176 			0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A,
177 			0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4,
178 			0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC,
179 			0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4,
180 			0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B,
181 			0x00ED, 0x00EE, 0x010F, 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4,
182 			0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC,
183 			0x00FD, 0x0163, 0x02D9 };
184 		int c;
185 		int result = 0;
186 
187 		for (c = 0; c < 161; ++c)
188 			result |= ok_test(c, c);
189 
190 		for (c = 161; c < 256; ++c)
191 			result |= ok_test(c, upper_half[c - 161]);
192 
193 		result |= eof_test();
194 		totalResult |= result;
195 
196 		if (result == 0)
197 			printf("locale '%s' ok\n", current_locale);
198 	}
199 
200 	if (totalResult == 0)
201 		puts("all OK");
202 
203 	return totalResult;
204 }
205