Home | History | Annotate | Line # | Download | only in locale
t_mbstowcs.c revision 1.2
      1  1.2  perseant /* $NetBSD: t_mbstowcs.c,v 1.2 2017/07/12 17:32:51 perseant Exp $ */
      2  1.1    jruoho 
      3  1.1    jruoho /*-
      4  1.1    jruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5  1.1    jruoho  * All rights reserved.
      6  1.1    jruoho  *
      7  1.1    jruoho  * Redistribution and use in source and binary forms, with or without
      8  1.1    jruoho  * modification, are permitted provided that the following conditions
      9  1.1    jruoho  * are met:
     10  1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     11  1.1    jruoho  *    notice, this list of conditions and the following disclaimer.
     12  1.1    jruoho  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1    jruoho  *    notice, this list of conditions and the following disclaimer in the
     14  1.1    jruoho  *    documentation and/or other materials provided with the distribution.
     15  1.1    jruoho  *
     16  1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  1.1    jruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  1.1    jruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  1.1    jruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  1.1    jruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1    jruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1    jruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1    jruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1    jruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1    jruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1    jruoho  * POSSIBILITY OF SUCH DAMAGE.
     27  1.1    jruoho  */
     28  1.1    jruoho 
     29  1.1    jruoho /*-
     30  1.1    jruoho  * Copyright (c)2003 Citrus Project,
     31  1.1    jruoho  * All rights reserved.
     32  1.1    jruoho  *
     33  1.1    jruoho  * Redistribution and use in source and binary forms, with or without
     34  1.1    jruoho  * modification, are permitted provided that the following conditions
     35  1.1    jruoho  * are met:
     36  1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     37  1.1    jruoho  *    notice, this list of conditions and the following disclaimer.
     38  1.1    jruoho  * 2. Redistributions in binary form must reproduce the above copyright
     39  1.1    jruoho  *    notice, this list of conditions and the following disclaimer in the
     40  1.1    jruoho  *    documentation and/or other materials provided with the distribution.
     41  1.1    jruoho  *
     42  1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     43  1.1    jruoho  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     44  1.1    jruoho  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     45  1.1    jruoho  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     46  1.1    jruoho  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     47  1.1    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     48  1.1    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     49  1.1    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     50  1.1    jruoho  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     51  1.1    jruoho  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     52  1.1    jruoho  * SUCH DAMAGE.
     53  1.1    jruoho  */
     54  1.1    jruoho 
     55  1.1    jruoho #include <sys/cdefs.h>
     56  1.1    jruoho __COPYRIGHT("@(#) Copyright (c) 2011\
     57  1.1    jruoho  The NetBSD Foundation, inc. All rights reserved.");
     58  1.2  perseant __RCSID("$NetBSD: t_mbstowcs.c,v 1.2 2017/07/12 17:32:51 perseant Exp $");
     59  1.1    jruoho 
     60  1.1    jruoho #include <errno.h>
     61  1.1    jruoho #include <locale.h>
     62  1.1    jruoho #include <stdio.h>
     63  1.1    jruoho #include <stdlib.h>
     64  1.1    jruoho #include <string.h>
     65  1.1    jruoho #include <vis.h>
     66  1.1    jruoho #include <wchar.h>
     67  1.1    jruoho 
     68  1.1    jruoho #include <atf-c.h>
     69  1.1    jruoho 
     70  1.1    jruoho #define REQUIRE_ERRNO(x, v) \
     71  1.1    jruoho 	ATF_REQUIRE_MSG((x) != (v), "%s: %s", #x, strerror(errno))
     72  1.1    jruoho 
     73  1.1    jruoho #define SIZE 256
     74  1.1    jruoho 
     75  1.1    jruoho static struct test {
     76  1.1    jruoho 	const char *locale;
     77  1.1    jruoho 	const char *data;
     78  1.1    jruoho 	wchar_t wchars[64];
     79  1.1    jruoho 	int widths[64];
     80  1.1    jruoho 	int width;
     81  1.1    jruoho } tests[] = {
     82  1.1    jruoho {
     83  1.1    jruoho 	"en_US.UTF-8",
     84  1.1    jruoho 	"[\001\177][\302\200\337\277][\340\240\200\357\277\277][\360\220\200"
     85  1.1    jruoho 	"\200\367\277\277\277][\370\210\200\200\200\373\277\277\277\277][\374"
     86  1.1    jruoho 	"\204\200\200\200\200\375\277\277\277\277\277]",
     87  1.1    jruoho 	{
     88  1.1    jruoho 		0x5B, 0x01, 0x7F, 0x5D, 0x5B, 0x80, 0x07FF, 0x5D, 0x5B, 0x0800,
     89  1.1    jruoho 		0xFFFF, 0x5D, 0x5B, 0x10000, 0x1FFFFF, 0x5D, 0x5B, 0x200000,
     90  1.1    jruoho 		0x3FFFFFF, 0x5D, 0x5B, 0x4000000, 0x7FFFFFFF, 0x5D, 0x0A
     91  1.1    jruoho 	},
     92  1.1    jruoho 	{	 1, -1, -1,  1,  1, -1, -1,  1,  1, -1, -1,  1,  1, -1, -1,
     93  1.1    jruoho 		 1,  1, -1, -1,  1,  1, -1, -1,  1, -1
     94  1.1    jruoho 	},
     95  1.1    jruoho 	-1
     96  1.1    jruoho }, {
     97  1.1    jruoho 	"ja_JP.ISO2022-JP",
     98  1.1    jruoho 	"\033$B#J#I#S$G$9!#\033(Baaaa\033$B$\"$$$&$($*\033(B",
     99  1.1    jruoho 	{
    100  1.2  perseant #ifdef __STDC_ISO_10646__
    101  1.2  perseant 		0xFF2A, 0xFF29, 0xFF33, 0x3067, 0x3059,
    102  1.2  perseant 		0x3002, 0x61, 0x61, 0x61, 0x61, 0x3042, 0x3044,
    103  1.2  perseant 		0x3046, 0x3048, 0x304A, 0x0A
    104  1.2  perseant #else
    105  1.1    jruoho 		0x4200234A, 0x42002349, 0x42002353, 0x42002447, 0x42002439,
    106  1.1    jruoho 		0x42002123, 0x61, 0x61, 0x61, 0x61, 0x42002422, 0x42002424,
    107  1.1    jruoho 		0x42002426, 0x42002428, 0x4200242A, 0x0A
    108  1.2  perseant #endif
    109  1.1    jruoho 	},
    110  1.1    jruoho 	{ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, -1 },
    111  1.1    jruoho 	26
    112  1.1    jruoho }, {
    113  1.1    jruoho 	"ja_JP.SJIS",
    114  1.1    jruoho 	"\202r\202i\202h\202r\202\305\202\267\201Baaaa\202\240\202\242"
    115  1.1    jruoho 	"\202\244\202\246\202\250",
    116  1.1    jruoho 	{
    117  1.2  perseant #ifdef __STDC_ISO_10646__
    118  1.2  perseant 		0xFF33, 0xFF2A, 0xFF29, 0xFF33, 0x3067, 0x3059, 0x3002, 0x61,
    119  1.2  perseant 		0x61, 0x61, 0x61, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x0A
    120  1.2  perseant #else
    121  1.1    jruoho 		0x8272, 0x8269, 0x8268, 0x8272, 0x82C5, 0x82B7, 0x8142, 0x61,
    122  1.1    jruoho 		0x61, 0x61, 0x61, 0x82A0, 0x82A2, 0x82A4, 0x82A6, 0x82A8, 0x0A
    123  1.2  perseant #endif
    124  1.1    jruoho 	},
    125  1.1    jruoho 	{ 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, -1 },
    126  1.1    jruoho 	28
    127  1.1    jruoho }, {
    128  1.1    jruoho 	"ja_JP.eucJP",
    129  1.1    jruoho 	"\243\305\243\325\243\303\244\307\244\271\241\243aaaa\244\242\244"
    130  1.1    jruoho 	"\244\244\246\244\250\244\252",
    131  1.1    jruoho 	{
    132  1.2  perseant #ifdef __STDC_ISO_10646__
    133  1.2  perseant 		0xFF25, 0xFF35, 0xFF23, 0x3067, 0x3059, 0x3002, 0x61, 0x61, 0x61,
    134  1.2  perseant 		0x61, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x0A
    135  1.2  perseant #else
    136  1.1    jruoho 		0xA3C5, 0xA3D5, 0xA3C3, 0xA4C7, 0xA4B9, 0xA1A3, 0x61, 0x61, 0x61,
    137  1.1    jruoho 		0x61, 0xA4A2, 0xA4A4, 0xA4A6, 0xA4A8, 0xA4AA, 0x0A
    138  1.2  perseant #endif
    139  1.1    jruoho 	},
    140  1.1    jruoho 	{ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, -1 },
    141  1.1    jruoho 	26
    142  1.1    jruoho }, {
    143  1.1    jruoho 	NULL,
    144  1.1    jruoho 	NULL,
    145  1.1    jruoho 	{},
    146  1.1    jruoho 	{},
    147  1.1    jruoho 	0
    148  1.1    jruoho }
    149  1.1    jruoho };
    150  1.1    jruoho 
    151  1.1    jruoho ATF_TC(mbstowcs_basic);
    152  1.1    jruoho ATF_TC_HEAD(mbstowcs_basic, tc)
    153  1.1    jruoho {
    154  1.1    jruoho 	atf_tc_set_md_var(tc, "descr",
    155  1.1    jruoho 		"Checks wide character functions with different locales");
    156  1.1    jruoho }
    157  1.1    jruoho ATF_TC_BODY(mbstowcs_basic, tc)
    158  1.1    jruoho {
    159  1.1    jruoho 	struct test *t;
    160  1.1    jruoho 
    161  1.1    jruoho 	for (t = &tests[0]; t->data != NULL; ++t) {
    162  1.1    jruoho 		wchar_t	wbuf[SIZE];
    163  1.1    jruoho 		char buf[SIZE];
    164  1.1    jruoho 		char visbuf[SIZE];
    165  1.1    jruoho 		char *str;
    166  1.1    jruoho 		int i;
    167  1.1    jruoho 
    168  1.1    jruoho 		ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
    169  1.1    jruoho 		ATF_REQUIRE(setlocale(LC_CTYPE, t->locale) != NULL);
    170  1.1    jruoho 
    171  1.1    jruoho 		(void)strvis(visbuf, t->data, VIS_WHITE | VIS_OCTAL);
    172  1.1    jruoho 		(void)printf("Checking string: \"%s\"\n", visbuf);
    173  1.1    jruoho 
    174  1.1    jruoho 		ATF_REQUIRE((str = setlocale(LC_ALL, NULL)) != NULL);
    175  1.1    jruoho 		(void)printf("Using locale: %s\n", str);
    176  1.1    jruoho 
    177  1.1    jruoho 		REQUIRE_ERRNO((ssize_t)mbstowcs(wbuf, t->data, SIZE-1), -1);
    178  1.1    jruoho 		REQUIRE_ERRNO((ssize_t)wcstombs(buf, wbuf, SIZE-1), -1);
    179  1.1    jruoho 
    180  1.1    jruoho 		if (strcmp(buf, t->data) != 0) {
    181  1.1    jruoho 			(void)strvis(visbuf, buf, VIS_WHITE | VIS_OCTAL);
    182  1.1    jruoho 			(void)printf("Conversion to wcs and back failed: "
    183  1.1    jruoho 				"\"%s\"\n", visbuf);
    184  1.1    jruoho 			atf_tc_fail("Test failed");
    185  1.1    jruoho 		}
    186  1.1    jruoho 
    187  1.1    jruoho 		/* The output here is implementation-dependent. */
    188  1.1    jruoho 
    189  1.1    jruoho 		for (i = 0; wbuf[i] != 0; ++i) {
    190  1.1    jruoho 			if (wbuf[i] == t->wchars[i] &&
    191  1.1    jruoho 			    wcwidth(wbuf[i]) == t->widths[i])
    192  1.1    jruoho 				continue;
    193  1.1    jruoho 
    194  1.1    jruoho 			(void)printf("At position %d:\n", i);
    195  1.1    jruoho 			(void)printf("  expected: 0x%04X (%d)\n",
    196  1.1    jruoho 				t->wchars[i], t->widths[i]);
    197  1.1    jruoho 			(void)printf("  got     : 0x%04X (%d)\n", wbuf[i],
    198  1.1    jruoho 				wcwidth(wbuf[i]));
    199  1.1    jruoho 			atf_tc_fail("Test failed");
    200  1.1    jruoho 		}
    201  1.1    jruoho 
    202  1.1    jruoho 		if (wcswidth(wbuf, SIZE-1) != t->width) {
    203  1.1    jruoho 			(void)printf("Incorrect wcswidth:\n");
    204  1.1    jruoho 			(void)printf("  expected: %d\n", t->width);
    205  1.1    jruoho 			(void)printf("  got     : %d\n", wcswidth(wbuf, SIZE-1));
    206  1.1    jruoho 			atf_tc_fail("Test failed");
    207  1.1    jruoho 		}
    208  1.1    jruoho 
    209  1.1    jruoho 		(void)printf("Ok.\n");
    210  1.1    jruoho 	}
    211  1.1    jruoho }
    212  1.1    jruoho 
    213  1.1    jruoho ATF_TP_ADD_TCS(tp)
    214  1.1    jruoho {
    215  1.1    jruoho 	ATF_TP_ADD_TC(tp, mbstowcs_basic);
    216  1.1    jruoho 
    217  1.1    jruoho 	return atf_no_error();
    218  1.1    jruoho }
    219