1106686Stjr/*- 2106686Stjr * Copyright (c) 2002 Tim J. Robbins 3106686Stjr * All rights reserved. 4106686Stjr * 5106686Stjr * Redistribution and use in source and binary forms, with or without 6106686Stjr * modification, are permitted provided that the following conditions 7106686Stjr * are met: 8106686Stjr * 1. Redistributions of source code must retain the above copyright 9106686Stjr * notice, this list of conditions and the following disclaimer. 10106686Stjr * 2. Redistributions in binary form must reproduce the above copyright 11106686Stjr * notice, this list of conditions and the following disclaimer in the 12106686Stjr * documentation and/or other materials provided with the distribution. 13106686Stjr * 14106686Stjr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15106686Stjr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16106686Stjr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17106686Stjr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18106686Stjr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19106686Stjr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20106686Stjr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21106686Stjr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22106686Stjr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23106686Stjr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24106686Stjr * SUCH DAMAGE. 25106686Stjr */ 26106686Stjr 27106686Stjr/* 28106686Stjr * Test program for wcstombs(), as specified by IEEE Std. 1003.1-2001 and 29106686Stjr * ISO/IEC 9899:1999. 30106686Stjr * 31106686Stjr * The function is tested with both the "C" ("POSIX") LC_CTYPE setting and 32106686Stjr * "ja_JP.eucJP". Other encodings are not tested. 33106686Stjr */ 34106686Stjr 35106686Stjr#include <sys/cdefs.h> 36106686Stjr__FBSDID("$FreeBSD$"); 37106686Stjr 38106686Stjr#include <errno.h> 39106686Stjr#include <limits.h> 40106686Stjr#include <locale.h> 41106686Stjr#include <stdio.h> 42106686Stjr#include <stdlib.h> 43106686Stjr#include <string.h> 44106686Stjr#include <wchar.h> 45106686Stjr 46290532Sngie#include <atf-c.h> 47290532Sngie 48290532SngieATF_TC_WITHOUT_HEAD(wcstombs_test); 49290532SngieATF_TC_BODY(wcstombs_test, tc) 50106686Stjr{ 51106686Stjr wchar_t srcbuf[128]; 52106686Stjr char dstbuf[128]; 53106686Stjr 54290532Sngie /* C/POSIX locale. */ 55106686Stjr 56106686Stjr /* Simple null terminated string. */ 57106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 58106686Stjr wcscpy(srcbuf, L"hello"); 59106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 60290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, sizeof(dstbuf)) == 5); 61290532Sngie ATF_REQUIRE(strcmp(dstbuf, "hello") == 0); 62290532Sngie ATF_REQUIRE((unsigned char)dstbuf[6] == 0xcc); 63106686Stjr 64106686Stjr /* Not enough space in destination buffer. */ 65106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 66106686Stjr wcscpy(srcbuf, L"hello"); 67106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 68290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, 4) == 4); 69290532Sngie ATF_REQUIRE(memcmp(dstbuf, "hell", 4) == 0); 70290532Sngie ATF_REQUIRE((unsigned char)dstbuf[5] == 0xcc); 71106686Stjr 72106686Stjr /* Null terminated string, internal dest. buffer */ 73106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 74106686Stjr wcscpy(srcbuf, L"hello"); 75290532Sngie ATF_REQUIRE(wcstombs(NULL, srcbuf, sizeof(dstbuf)) == 5); 76106686Stjr 77106686Stjr /* Null terminated string, internal state. */ 78106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 79106686Stjr wcscpy(srcbuf, L"hello"); 80106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 81290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, sizeof(dstbuf)) == 5); 82290532Sngie ATF_REQUIRE(strcmp(dstbuf, "hello") == 0); 83290532Sngie ATF_REQUIRE((unsigned char)dstbuf[6] == 0xcc); 84106686Stjr 85106686Stjr /* Null terminated string, internal state, internal dest. buffer. */ 86106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 87106686Stjr wcscpy(srcbuf, L"hello"); 88290532Sngie ATF_REQUIRE(wcstombs(NULL, srcbuf, 0) == 5); 89106686Stjr 90106686Stjr /* Empty source buffer. */ 91106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 92106686Stjr srcbuf[0] = L'\0'; 93106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 94290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, sizeof(dstbuf)) == 0); 95290532Sngie ATF_REQUIRE(dstbuf[0] == L'\0'); 96106686Stjr 97106686Stjr /* Zero length destination buffer. */ 98106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 99106686Stjr wcscpy(srcbuf, L"hello"); 100106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 101290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, 0) == 0); 102290532Sngie ATF_REQUIRE((unsigned char)dstbuf[0] == 0xcc); 103106686Stjr 104106686Stjr /* 105106686Stjr * Japanese (EUC) locale. 106106686Stjr */ 107106686Stjr 108290532Sngie ATF_REQUIRE(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0); 109290532Sngie ATF_REQUIRE(MB_CUR_MAX > 1); 110106686Stjr 111106686Stjr wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf)); 112106686Stjr srcbuf[0] = 0xA3C1; 113106686Stjr srcbuf[1] = 0x0020; 114106686Stjr srcbuf[2] = 0x0042; 115106686Stjr srcbuf[3] = 0x0020; 116106686Stjr srcbuf[4] = 0xA3C3; 117106686Stjr srcbuf[5] = 0x0000; 118106686Stjr memset(dstbuf, 0xcc, sizeof(dstbuf)); 119290532Sngie ATF_REQUIRE(wcstombs(dstbuf, srcbuf, sizeof(dstbuf)) == 7); 120290532Sngie ATF_REQUIRE(strcmp(dstbuf, "\xA3\xC1 B \xA3\xC3") == 0); 121290532Sngie ATF_REQUIRE((unsigned char)dstbuf[8] == 0xcc); 122290532Sngie} 123106686Stjr 124290532SngieATF_TP_ADD_TCS(tp) 125290532Sngie{ 126106686Stjr 127290532Sngie ATF_TP_ADD_TC(tp, wcstombs_test); 128290532Sngie 129290532Sngie return (atf_no_error()); 130106686Stjr} 131