wcsrtombs_test.c revision 137587
190075Sobrien/*-
2102780Skan * Copyright (c) 2002 Tim J. Robbins
390075Sobrien * All rights reserved.
490075Sobrien *
5132718Skan * Redistribution and use in source and binary forms, with or without
690075Sobrien * modification, are permitted provided that the following conditions
7132718Skan * are met:
890075Sobrien * 1. Redistributions of source code must retain the above copyright
990075Sobrien *    notice, this list of conditions and the following disclaimer.
1090075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1190075Sobrien *    notice, this list of conditions and the following disclaimer in the
12132718Skan *    documentation and/or other materials provided with the distribution.
1390075Sobrien *
1490075Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1590075Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1690075Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1790075Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18132718Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1990075Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2090075Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2190075Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2290075Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2390075Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24132718Skan * SUCH DAMAGE.
25132718Skan */
2690075Sobrien
2790075Sobrien/*
2890075Sobrien * Test program for wcsrtombs(), as specified by IEEE Std. 1003.1-2001 and
2990075Sobrien * ISO/IEC 9899:1999.
3090075Sobrien *
3190075Sobrien * The function is tested with both the "C" ("POSIX") LC_CTYPE setting and
32132718Skan * "ja_JP.eucJP". Other encodings are not tested.
33132718Skan */
3490075Sobrien
35132718Skan#include <sys/cdefs.h>
3690075Sobrien__FBSDID("$FreeBSD: head/tools/regression/lib/libc/locale/test-wcsrtombs.c 137587 2004-11-11 19:47:55Z nik $");
37132718Skan
38132718Skan#include <assert.h>
39132718Skan#include <errno.h>
40132718Skan#include <limits.h>
41132718Skan#include <locale.h>
42132718Skan#include <stdio.h>
43132718Skan#include <stdlib.h>
44132718Skan#include <string.h>
4590075Sobrien#include <wchar.h>
4690075Sobrien
47132718Skanint
48132718Skanmain(int argc, char *argv[])
4990075Sobrien{
5090075Sobrien	wchar_t srcbuf[128];
5190075Sobrien	char dstbuf[128];
5290075Sobrien	wchar_t *src;
5390075Sobrien	mbstate_t s;
5490075Sobrien
5590075Sobrien	/*
56132718Skan	 * C/POSIX locale.
57132718Skan	 */
58132718Skan
59132718Skan	printf("1..1\n");
60132718Skan
61132718Skan	/* Simple null terminated string. */
62132718Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
63132718Skan	wcscpy(srcbuf, L"hello");
64132718Skan	memset(dstbuf, 0xcc, sizeof(dstbuf));
6590075Sobrien	src = srcbuf;
66102780Skan	memset(&s, 0, sizeof(s));
6790075Sobrien	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, sizeof(dstbuf),
6890075Sobrien	    &s) == 5);
6990075Sobrien	assert(strcmp(dstbuf, "hello") == 0);
7090075Sobrien	assert((unsigned char)dstbuf[6] == 0xcc);
71117395Skan	assert(src == NULL);
72117395Skan
7390075Sobrien	/* Not enough space in destination buffer. */
7490075Sobrien	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
75117395Skan	wcscpy(srcbuf, L"hello");
76117395Skan	memset(dstbuf, 0xcc, sizeof(dstbuf));
77117395Skan	src = srcbuf;
78117395Skan	memset(&s, 0, sizeof(s));
79117395Skan	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, 4,
80117395Skan	    &s) == 4);
81117395Skan	assert(memcmp(dstbuf, "hell", 4) == 0);
82117395Skan	assert((unsigned char)dstbuf[5] == 0xcc);
83117395Skan	assert(src == srcbuf + 4);
84117395Skan
85117395Skan	/* Null terminated string, internal dest. buffer */
86117395Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
87117395Skan	wcscpy(srcbuf, L"hello");
88117395Skan	src = srcbuf;
89117395Skan	memset(&s, 0, sizeof(s));
90117395Skan	assert(wcsrtombs(NULL, (const wchar_t **)&src, sizeof(dstbuf),
9190075Sobrien	    &s) == 5);
9290075Sobrien
9390075Sobrien	/* Null terminated string, internal state. */
9490075Sobrien	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
9590075Sobrien	wcscpy(srcbuf, L"hello");
9690075Sobrien	memset(dstbuf, 0xcc, sizeof(dstbuf));
9790075Sobrien	src = srcbuf;
9890075Sobrien	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, sizeof(dstbuf),
9990075Sobrien	    NULL) == 5);
10090075Sobrien	assert(strcmp(dstbuf, "hello") == 0);
101117395Skan	assert((unsigned char)dstbuf[6] == 0xcc);
102117395Skan	assert(src == NULL);
103117395Skan
104117395Skan	/* Null terminated string, internal state, internal dest. buffer. */
105132718Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
106132718Skan	wcscpy(srcbuf, L"hello");
107132718Skan	src = srcbuf;
108132718Skan	assert(wcsrtombs(NULL, (const wchar_t **)&src, 0, NULL) == 5);
109132718Skan
110132718Skan	/* Empty source buffer. */
111117395Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
112117395Skan	srcbuf[0] = L'\0';
113117395Skan	memset(dstbuf, 0xcc, sizeof(dstbuf));
114117395Skan	src = srcbuf;
115132718Skan	memset(&s, 0, sizeof(s));
116132718Skan	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, sizeof(dstbuf),
11790075Sobrien	    &s) == 0);
118117395Skan	assert(dstbuf[0] == L'\0');
119117395Skan
120117395Skan	/* Zero length destination buffer. */
121117395Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
122117395Skan	wcscpy(srcbuf, L"hello");
123117395Skan	memset(dstbuf, 0xcc, sizeof(dstbuf));
124132718Skan	src = srcbuf;
125132718Skan	memset(&s, 0, sizeof(s));
126132718Skan	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, 0, &s) == 0);
127132718Skan	assert((unsigned char)dstbuf[0] == 0xcc);
128132718Skan
129117395Skan	/*
130117395Skan	 * Japanese (EUC) locale.
131117395Skan	 */
132117395Skan
133117395Skan	assert(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0);
134117395Skan	assert(MB_CUR_MAX > 1);
135117395Skan
136117395Skan	wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));
13790075Sobrien	srcbuf[0] = 0xA3C1;
13890075Sobrien	srcbuf[1] = 0x0020;
13990075Sobrien	srcbuf[2] = 0x0042;
14090075Sobrien	srcbuf[3] = 0x0020;
14190075Sobrien	srcbuf[4] = 0xA3C3;
14290075Sobrien	srcbuf[5] = 0x0000;
14390075Sobrien	memset(dstbuf, 0xcc, sizeof(dstbuf));
14490075Sobrien	src = srcbuf;
14590075Sobrien	memset(&s, 0, sizeof(s));
14690075Sobrien	assert(wcsrtombs(dstbuf, (const wchar_t **)&src, sizeof(dstbuf),
14790075Sobrien	    &s) == 7);
14890075Sobrien	assert(strcmp(dstbuf, "\xA3\xC1 B \xA3\xC3") == 0);
14990075Sobrien	assert((unsigned char)dstbuf[8] == 0xcc);
15090075Sobrien	assert(src == NULL);
15190075Sobrien
15290075Sobrien	printf("ok 1 - wcsrtombs()\n");
15390075Sobrien
15490075Sobrien	return (0);
15590075Sobrien}
15690075Sobrien