1*16d86563SAlexander Pyhalov /*
2*16d86563SAlexander Pyhalov  * CDDL HEADER START
3*16d86563SAlexander Pyhalov  *
4*16d86563SAlexander Pyhalov  * The contents of this file are subject to the terms of the
5*16d86563SAlexander Pyhalov  * Common Development and Distribution License (the "License").
6*16d86563SAlexander Pyhalov  * You may not use this file except in compliance with the License.
7*16d86563SAlexander Pyhalov  *
8*16d86563SAlexander Pyhalov  * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
9*16d86563SAlexander Pyhalov  * or http://www.opensolaris.org/os/licensing.
10*16d86563SAlexander Pyhalov  * See the License for the specific language governing permissions
11*16d86563SAlexander Pyhalov  * and limitations under the License.
12*16d86563SAlexander Pyhalov  *
13*16d86563SAlexander Pyhalov  * When distributing Covered Code, include this CDDL HEADER in each
14*16d86563SAlexander Pyhalov  * file and include the License file at src/OPENSOLARIS.LICENSE.
15*16d86563SAlexander Pyhalov  * If applicable, add the following below this CDDL HEADER, with the
16*16d86563SAlexander Pyhalov  * fields enclosed by brackets "[]" replaced with your own identifying
17*16d86563SAlexander Pyhalov  * information: Portions Copyright [yyyy] [name of copyright owner]
18*16d86563SAlexander Pyhalov  *
19*16d86563SAlexander Pyhalov  * CDDL HEADER END
20*16d86563SAlexander Pyhalov  */
21*16d86563SAlexander Pyhalov /*
22*16d86563SAlexander Pyhalov  * Copyright (c) 1999 by Sun Microsystems, Inc.
23*16d86563SAlexander Pyhalov  * All rights reserved.
24*16d86563SAlexander Pyhalov  */
25*16d86563SAlexander Pyhalov 
26*16d86563SAlexander Pyhalov 
27*16d86563SAlexander Pyhalov /*
28*16d86563SAlexander Pyhalov  * For example,
29*16d86563SAlexander Pyhalov  *               UCS -> UTF-8 -> IBM -> UTF-8
30*16d86563SAlexander Pyhalov  *                (1)     (2)     (3)	 (4)
31*16d86563SAlexander Pyhalov  *               tmp    source   result  tmp
32*16d86563SAlexander Pyhalov  *                           output     (1) (2) (3)line by line
33*16d86563SAlexander Pyhalov  *                           comparing  (2) (4)
34*16d86563SAlexander Pyhalov  */
35*16d86563SAlexander Pyhalov 
36*16d86563SAlexander Pyhalov #include <stdio.h>
37*16d86563SAlexander Pyhalov #include <libgen.h>
38*16d86563SAlexander Pyhalov #include <stdlib.h>
39*16d86563SAlexander Pyhalov #include <unistd.h>
40*16d86563SAlexander Pyhalov #include <locale.h>
41*16d86563SAlexander Pyhalov #include <iconv.h>
42*16d86563SAlexander Pyhalov #include <string.h>
43*16d86563SAlexander Pyhalov #include <errno.h>
44*16d86563SAlexander Pyhalov #include <stdarg.h>
45*16d86563SAlexander Pyhalov #include <sys/types.h>
46*16d86563SAlexander Pyhalov #include <sys/wait.h>
47*16d86563SAlexander Pyhalov 
48*16d86563SAlexander Pyhalov char *	ME;
49*16d86563SAlexander Pyhalov int	status;
50*16d86563SAlexander Pyhalov int	flag_display = 1;
51*16d86563SAlexander Pyhalov int	flag_bubun = 1;
52*16d86563SAlexander Pyhalov 
53*16d86563SAlexander Pyhalov 
54*16d86563SAlexander Pyhalov void
usage(int status)55*16d86563SAlexander Pyhalov usage(int status)
56*16d86563SAlexander Pyhalov {
57*16d86563SAlexander Pyhalov 	fprintf(stderr, "Usage: %s [-b] [-d] to-code\n", ME);
58*16d86563SAlexander Pyhalov 	exit(status);
59*16d86563SAlexander Pyhalov }
60*16d86563SAlexander Pyhalov 
61*16d86563SAlexander Pyhalov 
62*16d86563SAlexander Pyhalov void
chkprint(char * format,...)63*16d86563SAlexander Pyhalov chkprint(char *format, ...)
64*16d86563SAlexander Pyhalov {
65*16d86563SAlexander Pyhalov 	va_list		ap;
66*16d86563SAlexander Pyhalov 	va_start(ap, format);
67*16d86563SAlexander Pyhalov 
68*16d86563SAlexander Pyhalov 	if (0 != flag_display)  {
69*16d86563SAlexander Pyhalov 		(void) vfprintf(stdout, format, ap);
70*16d86563SAlexander Pyhalov 	}
71*16d86563SAlexander Pyhalov 	va_end(ap);
72*16d86563SAlexander Pyhalov }
73*16d86563SAlexander Pyhalov 
74*16d86563SAlexander Pyhalov 
75*16d86563SAlexander Pyhalov void
validate(uint_t i,iconv_t cd,iconv_t cd2,iconv_t cd3)76*16d86563SAlexander Pyhalov validate(uint_t i, iconv_t cd, iconv_t cd2, iconv_t cd3)
77*16d86563SAlexander Pyhalov {
78*16d86563SAlexander Pyhalov 	char		source_buf[1024];
79*16d86563SAlexander Pyhalov 	char		result_buf[1024];
80*16d86563SAlexander Pyhalov 	char		tmp_buf[1024];
81*16d86563SAlexander Pyhalov 	char *		source;
82*16d86563SAlexander Pyhalov 	char *		result;
83*16d86563SAlexander Pyhalov 	char *		tmp;
84*16d86563SAlexander Pyhalov 	size_t		source_len;
85*16d86563SAlexander Pyhalov 	size_t		result_len;
86*16d86563SAlexander Pyhalov 	size_t		result_len2;
87*16d86563SAlexander Pyhalov 	size_t		tmp_len;
88*16d86563SAlexander Pyhalov 	size_t		s;
89*16d86563SAlexander Pyhalov 	int		j;
90*16d86563SAlexander Pyhalov 	ushort_t	*shortp;
91*16d86563SAlexander Pyhalov 	uint_t	*intp;
92*16d86563SAlexander Pyhalov 
93*16d86563SAlexander Pyhalov 
94*16d86563SAlexander Pyhalov #define PREPARE_ILLEGALUTF8 \
95*16d86563SAlexander Pyhalov 	if (i == 0xfffe) { \
96*16d86563SAlexander Pyhalov 		source_buf[0] = 0xef; \
97*16d86563SAlexander Pyhalov 		source_buf[1] = 0xbf; \
98*16d86563SAlexander Pyhalov 		source_buf[2] = 0xbe; \
99*16d86563SAlexander Pyhalov 		source_buf[3] = 0x00; \
100*16d86563SAlexander Pyhalov 		source = source_buf;  \
101*16d86563SAlexander Pyhalov 		source_len = 3; \
102*16d86563SAlexander Pyhalov 		chkprint("U+%04x\t** %x **", i, 0xefbfbe); \
103*16d86563SAlexander Pyhalov 	} else if (i == 0xffff) { \
104*16d86563SAlexander Pyhalov 		source_buf[0] = 0xef; \
105*16d86563SAlexander Pyhalov 		source_buf[1] = 0xbf; \
106*16d86563SAlexander Pyhalov 		source_buf[2] = 0xbf; \
107*16d86563SAlexander Pyhalov 		source_buf[3] = 0x00; \
108*16d86563SAlexander Pyhalov 		source = source_buf;  \
109*16d86563SAlexander Pyhalov 		source_len = 3; \
110*16d86563SAlexander Pyhalov 		chkprint("U+%04x\t** %x **", i, 0xefbfbf); \
111*16d86563SAlexander Pyhalov 	} else if (i > 0x7fffffff) { \
112*16d86563SAlexander Pyhalov 		source_buf[0] = 0x0; \
113*16d86563SAlexander Pyhalov 		source_buf[1] = 0x0; \
114*16d86563SAlexander Pyhalov 		source_buf[2] = 0x0; \
115*16d86563SAlexander Pyhalov 		source_buf[3] = 0x0; \
116*16d86563SAlexander Pyhalov 		source_buf[4] = 0x0; \
117*16d86563SAlexander Pyhalov 		source_buf[5] = 0xfe; \
118*16d86563SAlexander Pyhalov 		source_buf[6] = 0x0; \
119*16d86563SAlexander Pyhalov 		source = source_buf;  \
120*16d86563SAlexander Pyhalov 		source_len = 7; \
121*16d86563SAlexander Pyhalov 		chkprint("U+%04x\t** %x **", i, 0xfe); \
122*16d86563SAlexander Pyhalov 	}
123*16d86563SAlexander Pyhalov 
124*16d86563SAlexander Pyhalov #define DATASIZE 4
125*16d86563SAlexander Pyhalov 	/*
126*16d86563SAlexander Pyhalov 	shortp = (ushort_t*)&tmp_buf[0];
127*16d86563SAlexander Pyhalov 	*shortp = 0xfeff;
128*16d86563SAlexander Pyhalov 	shortp = (ushort_t*)&tmp_buf[2];
129*16d86563SAlexander Pyhalov 	*shortp = i;
130*16d86563SAlexander Pyhalov 	*/
131*16d86563SAlexander Pyhalov 	/* chkprint("U+");  */ \
132*16d86563SAlexander Pyhalov 	/*	for( j = 0; j < tmp_len ; j++)  */ \
133*16d86563SAlexander Pyhalov 	/* 	chkprint("%02x", (uchar_t)tmp[j]); */ \
134*16d86563SAlexander Pyhalov 	/*
135*16d86563SAlexander Pyhalov 	shortp = (ushort_t*)&tmp_buf[0]; \
136*16d86563SAlexander Pyhalov 	*shortp = i; \
137*16d86563SAlexander Pyhalov 	*/
138*16d86563SAlexander Pyhalov 
139*16d86563SAlexander Pyhalov #define PREPAREUTF8 \
140*16d86563SAlexander Pyhalov 	tmp = tmp_buf; \
141*16d86563SAlexander Pyhalov 	tmp_len = DATASIZE; \
142*16d86563SAlexander Pyhalov 	intp = (uint_t*)&tmp_buf[0]; \
143*16d86563SAlexander Pyhalov 	*intp = i; \
144*16d86563SAlexander Pyhalov 	source = source_buf; \
145*16d86563SAlexander Pyhalov 	source_len = sizeof (source_buf); \
146*16d86563SAlexander Pyhalov 	\
147*16d86563SAlexander Pyhalov 	chkprint("U+%04x", i); \
148*16d86563SAlexander Pyhalov 	s = iconv(cd2, (const char**)&tmp, &tmp_len, &source, &source_len); \
149*16d86563SAlexander Pyhalov 	if (s != 0) { \
150*16d86563SAlexander Pyhalov 		chkprint(" \n stopped \n"); \
151*16d86563SAlexander Pyhalov 		fprintf(stderr, "fail to convert Unicode to UTF-8\n"); \
152*16d86563SAlexander Pyhalov 		exit (status); \
153*16d86563SAlexander Pyhalov 	} \
154*16d86563SAlexander Pyhalov 	chkprint("\t0x"); \
155*16d86563SAlexander Pyhalov 	for( j = 0; j < sizeof (source_buf) - source_len; j++) \
156*16d86563SAlexander Pyhalov 		chkprint("%02x", (uchar_t)source_buf[j]); \
157*16d86563SAlexander Pyhalov 	source_len = sizeof (source_buf) - source_len; \
158*16d86563SAlexander Pyhalov 	source = &source_buf[0];
159*16d86563SAlexander Pyhalov 
160*16d86563SAlexander Pyhalov #define	COMPARE_ERROR \
161*16d86563SAlexander Pyhalov 	chkprint("\t-> 0x");\
162*16d86563SAlexander Pyhalov 	for (j = 0; j <  sizeof (tmp_buf) - tmp_len; j++) { \
163*16d86563SAlexander Pyhalov 		chkprint("%02x", (uchar_t)tmp_buf[j]);\
164*16d86563SAlexander Pyhalov 	} \
165*16d86563SAlexander Pyhalov 	chkprint("\n warning \n"); \
166*16d86563SAlexander Pyhalov 	fprintf(stderr, " Converting answer is not the same for  (U+%04x)\n", \
167*16d86563SAlexander Pyhalov 		i);
168*16d86563SAlexander Pyhalov 
169*16d86563SAlexander Pyhalov #define COMPARE \
170*16d86563SAlexander Pyhalov 	tmp = tmp_buf; \
171*16d86563SAlexander Pyhalov 	tmp_len = sizeof (tmp_buf); \
172*16d86563SAlexander Pyhalov 	result = result_buf; \
173*16d86563SAlexander Pyhalov 	result_len2 = sizeof (result_buf) - result_len; \
174*16d86563SAlexander Pyhalov 	s = iconv(cd3, (const char**)&result, &result_len2, &tmp, &tmp_len); \
175*16d86563SAlexander Pyhalov 	if (s != 0) { \
176*16d86563SAlexander Pyhalov 		chkprint(" \n WARNING \n"); \
177*16d86563SAlexander Pyhalov 		fprintf(stderr, "fail to convert Orignal Codeset to UTF-8\n",\
178*16d86563SAlexander Pyhalov 		i); \
179*16d86563SAlexander Pyhalov 		fprintf(stderr, "errno=%d %d %d\n", \
180*16d86563SAlexander Pyhalov 			errno, \
181*16d86563SAlexander Pyhalov 			sizeof (result_buf) - result_len - result_len2, \
182*16d86563SAlexander Pyhalov 			result - result_buf); \
183*16d86563SAlexander Pyhalov 		exit (status); \
184*16d86563SAlexander Pyhalov 	} \
185*16d86563SAlexander Pyhalov 	chkprint("\t"); \
186*16d86563SAlexander Pyhalov 	if (sizeof (tmp_buf) - tmp_len != source_len) { \
187*16d86563SAlexander Pyhalov 		COMPARE_ERROR \
188*16d86563SAlexander Pyhalov 	} else { \
189*16d86563SAlexander Pyhalov 		for (j = 0; j < source_len; j++) { \
190*16d86563SAlexander Pyhalov 			if ((uchar_t)tmp_buf[j] != (uchar_t)source_buf[j]) { \
191*16d86563SAlexander Pyhalov 				COMPARE_ERROR \
192*16d86563SAlexander Pyhalov 			} \
193*16d86563SAlexander Pyhalov 		}\
194*16d86563SAlexander Pyhalov 	}
195*16d86563SAlexander Pyhalov 
196*16d86563SAlexander Pyhalov 
197*16d86563SAlexander Pyhalov 	/*
198*16d86563SAlexander Pyhalov 	 *	LOGIC START
199*16d86563SAlexander Pyhalov 	 */
200*16d86563SAlexander Pyhalov 
201*16d86563SAlexander Pyhalov 	if (i == 0xfffe || i == 0xffff || i > 0x7fffffff) {
202*16d86563SAlexander Pyhalov 		PREPARE_ILLEGALUTF8
203*16d86563SAlexander Pyhalov 	} else {
204*16d86563SAlexander Pyhalov 		PREPAREUTF8
205*16d86563SAlexander Pyhalov 	}
206*16d86563SAlexander Pyhalov 
207*16d86563SAlexander Pyhalov 	result = result_buf;
208*16d86563SAlexander Pyhalov 	result_len = sizeof (result_buf);
209*16d86563SAlexander Pyhalov 	tmp_len = source_len; /* save to compare source data */
210*16d86563SAlexander Pyhalov 	s = iconv(cd,  (const char**)&source, &source_len, &result,
211*16d86563SAlexander Pyhalov 		&result_len);
212*16d86563SAlexander Pyhalov 
213*16d86563SAlexander Pyhalov 	status = 1;
214*16d86563SAlexander Pyhalov 	if (i == 0xfffe || i == 0xffff || i > 0x7fffffff) {
215*16d86563SAlexander Pyhalov 		if ((((size_t)0) == s) ||
216*16d86563SAlexander Pyhalov 			(errno != EILSEQ)) {
217*16d86563SAlexander Pyhalov 			fprintf(stderr, "EILSEQ expected for 0x%x: %d %d %d\n",
218*16d86563SAlexander Pyhalov 			i,
219*16d86563SAlexander Pyhalov 			errno,
220*16d86563SAlexander Pyhalov 		        source_len,
221*16d86563SAlexander Pyhalov 			source - source_buf);
222*16d86563SAlexander Pyhalov 		}
223*16d86563SAlexander Pyhalov 	}
224*16d86563SAlexander Pyhalov 	if (((size_t)(0)) == s) {
225*16d86563SAlexander Pyhalov 		if ((source_len != 0) ||
226*16d86563SAlexander Pyhalov 			((source - source_buf) != tmp_len) ||
227*16d86563SAlexander Pyhalov 			((result - result_buf + result_len) !=
228*16d86563SAlexander Pyhalov 			sizeof (result_buf))) {
229*16d86563SAlexander Pyhalov 			fprintf(stderr, ": %d %d %d\n",
230*16d86563SAlexander Pyhalov 				errno,
231*16d86563SAlexander Pyhalov 				source_len,
232*16d86563SAlexander Pyhalov 				source - source_buf);
233*16d86563SAlexander Pyhalov 			exit(status);
234*16d86563SAlexander Pyhalov 		}
235*16d86563SAlexander Pyhalov 		chkprint("\t0x");
236*16d86563SAlexander Pyhalov 		for( j = 0; j < sizeof (result_buf) - result_len ; j++)
237*16d86563SAlexander Pyhalov 			chkprint("%02x", (uchar_t)result_buf[j]);
238*16d86563SAlexander Pyhalov 		source_len = tmp_len;
239*16d86563SAlexander Pyhalov 		COMPARE
240*16d86563SAlexander Pyhalov 		chkprint("\n");
241*16d86563SAlexander Pyhalov 		return;
242*16d86563SAlexander Pyhalov 	}
243*16d86563SAlexander Pyhalov 
244*16d86563SAlexander Pyhalov 	status += 1;
245*16d86563SAlexander Pyhalov 	if (((size_t)(-1)) == s) {
246*16d86563SAlexander Pyhalov 		if (errno == EILSEQ) {
247*16d86563SAlexander Pyhalov 			if (((source - source_buf) !=
248*16d86563SAlexander Pyhalov 				(tmp_len - source_len)) ||
249*16d86563SAlexander Pyhalov 				((result - result_buf + result_len) !=
250*16d86563SAlexander Pyhalov 				sizeof (result_buf))) {
251*16d86563SAlexander Pyhalov 				fprintf(stderr, ": %d %d %d\n",
252*16d86563SAlexander Pyhalov 					errno,
253*16d86563SAlexander Pyhalov 					source_len,
254*16d86563SAlexander Pyhalov 					source - source_buf);
255*16d86563SAlexander Pyhalov 				exit(status);
256*16d86563SAlexander Pyhalov 			}
257*16d86563SAlexander Pyhalov 			chkprint("\tEILSEQ\n", i);
258*16d86563SAlexander Pyhalov 			return;
259*16d86563SAlexander Pyhalov 		}
260*16d86563SAlexander Pyhalov 		fprintf(stderr, "Error for source U+%04x: %d %d %d %d %d\n",
261*16d86563SAlexander Pyhalov 			i,
262*16d86563SAlexander Pyhalov 			errno,
263*16d86563SAlexander Pyhalov 			(DATASIZE) - source_len, /* not converted size */
264*16d86563SAlexander Pyhalov 			source - source_buf,
265*16d86563SAlexander Pyhalov 			(sizeof (result_buf)) - result_len,
266*16d86563SAlexander Pyhalov 			result - result_buf);
267*16d86563SAlexander Pyhalov 		exit(status);
268*16d86563SAlexander Pyhalov 	}
269*16d86563SAlexander Pyhalov 
270*16d86563SAlexander Pyhalov 	status += 1;
271*16d86563SAlexander Pyhalov 	exit(status);
272*16d86563SAlexander Pyhalov }
273*16d86563SAlexander Pyhalov 
main(int argc,char ** argv)274*16d86563SAlexander Pyhalov main(int argc, char ** argv)
275*16d86563SAlexander Pyhalov {
276*16d86563SAlexander Pyhalov 	int		r;
277*16d86563SAlexander Pyhalov 	char *		p;
278*16d86563SAlexander Pyhalov 	iconv_t		cd;
279*16d86563SAlexander Pyhalov 	iconv_t		cd2;
280*16d86563SAlexander Pyhalov 	iconv_t		cd3;
281*16d86563SAlexander Pyhalov 	uint_t		i, j, k;
282*16d86563SAlexander Pyhalov 
283*16d86563SAlexander Pyhalov 	ME = basename(argv[0]);
284*16d86563SAlexander Pyhalov 	setlocale(LC_ALL, "");
285*16d86563SAlexander Pyhalov 	status = 100;
286*16d86563SAlexander Pyhalov 
287*16d86563SAlexander Pyhalov 
288*16d86563SAlexander Pyhalov 	for (j = 1;  j < argc; j++) {
289*16d86563SAlexander Pyhalov 		if (argv[j][0] != '-')
290*16d86563SAlexander Pyhalov 			break;
291*16d86563SAlexander Pyhalov 		for (k = 1; ; k++) {
292*16d86563SAlexander Pyhalov 			if (argv[j][k] == '\0')
293*16d86563SAlexander Pyhalov 				break;
294*16d86563SAlexander Pyhalov 			if (argv[j][k] == 'b') {
295*16d86563SAlexander Pyhalov 				flag_bubun = 0;
296*16d86563SAlexander Pyhalov 				continue;
297*16d86563SAlexander Pyhalov 			}
298*16d86563SAlexander Pyhalov 			if (argv[j][k] == 'd') {
299*16d86563SAlexander Pyhalov 				flag_display = 0;
300*16d86563SAlexander Pyhalov 				continue;
301*16d86563SAlexander Pyhalov 			}
302*16d86563SAlexander Pyhalov 		}
303*16d86563SAlexander Pyhalov 	}
304*16d86563SAlexander Pyhalov 	if (j >= argc) usage(-1);
305*16d86563SAlexander Pyhalov 
306*16d86563SAlexander Pyhalov 	chkprint( "#UCS-4\tUTF-8\t* %s *\n", argv[j]);
307*16d86563SAlexander Pyhalov 
308*16d86563SAlexander Pyhalov 	cd = iconv_open( argv[j], "UTF-8"); /* to, from */
309*16d86563SAlexander Pyhalov 	if (((iconv_t)(-1)) == cd) {
310*16d86563SAlexander Pyhalov 		perror("iconv_open");
311*16d86563SAlexander Pyhalov 		exit(status);
312*16d86563SAlexander Pyhalov 	}
313*16d86563SAlexander Pyhalov 
314*16d86563SAlexander Pyhalov 	cd2 = iconv_open("UTF-8", "UCS-4");
315*16d86563SAlexander Pyhalov 	if (((iconv_t)(-1)) == cd2) {
316*16d86563SAlexander Pyhalov 		perror("iconv_open for UTF-8");
317*16d86563SAlexander Pyhalov 		exit(status);
318*16d86563SAlexander Pyhalov 	}
319*16d86563SAlexander Pyhalov 
320*16d86563SAlexander Pyhalov 	cd3 = iconv_open("UTF-8", argv[j]);
321*16d86563SAlexander Pyhalov 	if (((iconv_t)(-1)) == cd3) {
322*16d86563SAlexander Pyhalov 		perror("iconv_open for reverse");
323*16d86563SAlexander Pyhalov 		exit(status);
324*16d86563SAlexander Pyhalov 	}
325*16d86563SAlexander Pyhalov 
326*16d86563SAlexander Pyhalov 
327*16d86563SAlexander Pyhalov 	/*
328*16d86563SAlexander Pyhalov 	 *	main logic
329*16d86563SAlexander Pyhalov 	 */
330*16d86563SAlexander Pyhalov 	if (flag_bubun) {
331*16d86563SAlexander Pyhalov 		for (i = 0; i <= 0xff; i++)
332*16d86563SAlexander Pyhalov 			validate(i, cd, cd2, cd3);
333*16d86563SAlexander Pyhalov 		validate(0x100, cd, cd2, cd3);
334*16d86563SAlexander Pyhalov 		validate(0x3ff, cd, cd2, cd3);
335*16d86563SAlexander Pyhalov 		validate(0x400, cd, cd2, cd3);
336*16d86563SAlexander Pyhalov 		validate(0xfff, cd, cd2, cd3);
337*16d86563SAlexander Pyhalov 		validate(0x1000, cd, cd2, cd3);
338*16d86563SAlexander Pyhalov 		validate(0x3fff, cd, cd2, cd3);
339*16d86563SAlexander Pyhalov 		validate(0x4000, cd, cd2, cd3);
340*16d86563SAlexander Pyhalov 		validate(0xfffd, cd, cd2, cd3);
341*16d86563SAlexander Pyhalov 		validate(0xfffe, cd, cd2, cd3);    /* error */
342*16d86563SAlexander Pyhalov 		validate(0xffff, cd, cd2, cd3);    /* error */
343*16d86563SAlexander Pyhalov 		validate(0x10000, cd, cd2, cd3);
344*16d86563SAlexander Pyhalov 		validate(0x3ffff, cd, cd2, cd3);
345*16d86563SAlexander Pyhalov 		validate(0x40000, cd, cd2, cd3);
346*16d86563SAlexander Pyhalov 		validate(0xfffff, cd, cd2, cd3);
347*16d86563SAlexander Pyhalov 		validate(0x100000, cd, cd2, cd3);
348*16d86563SAlexander Pyhalov 		validate(0x1fffff, cd, cd2, cd3);
349*16d86563SAlexander Pyhalov 		validate(0x200000, cd, cd2, cd3);
350*16d86563SAlexander Pyhalov 		validate(0x3fffff, cd, cd2, cd3);
351*16d86563SAlexander Pyhalov 		validate(0x400000, cd, cd2, cd3);
352*16d86563SAlexander Pyhalov 		validate(0xffffff, cd, cd2, cd3);
353*16d86563SAlexander Pyhalov 		validate(0x1000000, cd, cd2, cd3);
354*16d86563SAlexander Pyhalov 		validate(0x3ffffff, cd, cd2, cd3);
355*16d86563SAlexander Pyhalov 		validate(0x4000000, cd, cd2, cd3);
356*16d86563SAlexander Pyhalov 		validate(0xfffffff, cd, cd2, cd3);
357*16d86563SAlexander Pyhalov 		validate(0x10000000, cd, cd2, cd3);
358*16d86563SAlexander Pyhalov 		validate(0x7fffffff, cd, cd2, cd3);
359*16d86563SAlexander Pyhalov 		validate(0x80000000, cd, cd2, cd3); /* error */
360*16d86563SAlexander Pyhalov 	} else {
361*16d86563SAlexander Pyhalov 		int	k;
362*16d86563SAlexander Pyhalov 		for (i = 0, k = 0; i <= 0x80000000; i++, k++) {
363*16d86563SAlexander Pyhalov 			validate(i, cd, cd2, cd3);
364*16d86563SAlexander Pyhalov 			if ((k == 0x1000000) &&
365*16d86563SAlexander Pyhalov 				(0 == flag_display)) {
366*16d86563SAlexander Pyhalov 				printf(" i < 0x%x: checked\n", i);
367*16d86563SAlexander Pyhalov 				k = 0;
368*16d86563SAlexander Pyhalov 			}
369*16d86563SAlexander Pyhalov 
370*16d86563SAlexander Pyhalov 		}
371*16d86563SAlexander Pyhalov 	}
372*16d86563SAlexander Pyhalov 
373*16d86563SAlexander Pyhalov 	status = 200;
374*16d86563SAlexander Pyhalov 	r = iconv_close(cd);
375*16d86563SAlexander Pyhalov 	if (-1 == r) {
376*16d86563SAlexander Pyhalov 		perror("iconv_close");
377*16d86563SAlexander Pyhalov 		exit(status);
378*16d86563SAlexander Pyhalov 	}
379*16d86563SAlexander Pyhalov 
380*16d86563SAlexander Pyhalov 	r = iconv_close(cd2);
381*16d86563SAlexander Pyhalov 	if (-1 == r) {
382*16d86563SAlexander Pyhalov 		perror("iconv_close for UTF-8");
383*16d86563SAlexander Pyhalov 		exit(status);
384*16d86563SAlexander Pyhalov 	}
385*16d86563SAlexander Pyhalov 
386*16d86563SAlexander Pyhalov 	r = iconv_close(cd3);
387*16d86563SAlexander Pyhalov 	if (-1 == r) {
388*16d86563SAlexander Pyhalov 		perror("iconv_close for reverse");
389*16d86563SAlexander Pyhalov 		exit(status);
390*16d86563SAlexander Pyhalov 	}
391*16d86563SAlexander Pyhalov 
392*16d86563SAlexander Pyhalov 	return (0);
393*16d86563SAlexander Pyhalov }
394