1106686Stjr/*- 2128005Stjr * Copyright (c) 2002-2004 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 mbtowc(), as specified by IEEE Std. 1003.1-2001 and 29106686Stjr * ISO/IEC 9899:1990. 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 <limits.h> 39106686Stjr#include <locale.h> 40106686Stjr#include <stdio.h> 41106686Stjr#include <stdlib.h> 42106686Stjr#include <string.h> 43106686Stjr 44290532Sngie#include <atf-c.h> 45290532Sngie 46290532SngieATF_TC_WITHOUT_HEAD(mbtowc_test); 47290532SngieATF_TC_BODY(mbtowc_test, tc) 48106686Stjr{ 49291178Sngie char buf[MB_LEN_MAX + 1]; 50106686Stjr wchar_t wc; 51106686Stjr 52290532Sngie /* C/POSIX locale. */ 53106686Stjr 54290532Sngie ATF_REQUIRE(MB_CUR_MAX == 1); 55137587Snik 56106686Stjr /* No shift states in C locale. */ 57290532Sngie ATF_REQUIRE(mbtowc(NULL, NULL, 0) == 0); 58106686Stjr 59106686Stjr /* Null wide character. */ 60106686Stjr wc = 0xcccc; 61106686Stjr memset(buf, 0, sizeof(buf)); 62290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 1) == 0); 63290532Sngie ATF_REQUIRE(wc == 0); 64106686Stjr 65106686Stjr /* Latin letter A. */ 66106686Stjr buf[0] = 'A'; 67290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 1) == 1); 68290532Sngie ATF_REQUIRE(wc == L'A'); 69106686Stjr 70106686Stjr /* Incomplete character sequence. */ 71106686Stjr wc = L'z'; 72106686Stjr buf[0] = '\0'; 73290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 0) == -1); 74290532Sngie ATF_REQUIRE(wc == L'z'); 75290532Sngie ATF_REQUIRE(mbtowc(NULL, NULL, 0) == 0); 76106686Stjr 77290532Sngie /* Japanese (EUC) locale. */ 78106686Stjr 79290532Sngie ATF_REQUIRE(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0); 80290532Sngie ATF_REQUIRE(MB_CUR_MAX > 1); 81106686Stjr 82106686Stjr /* Null wide character */ 83106686Stjr memset(buf, 0xcc, sizeof(buf)); 84106686Stjr buf[0] = 0; 85106686Stjr wc = 0xcccc; 86290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 1) == 0); 87290532Sngie ATF_REQUIRE(wc == 0); 88106686Stjr 89106686Stjr /* Latin letter A. */ 90106686Stjr buf[0] = 'A'; 91290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 1) == 1); 92290532Sngie ATF_REQUIRE(wc == L'A'); 93106686Stjr 94106686Stjr /* Incomplete character sequence (zero length). */ 95106686Stjr wc = L'z'; 96106686Stjr buf[0] = '\0'; 97290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 0) == -1); 98290532Sngie ATF_REQUIRE(wc == L'z'); 99290532Sngie ATF_REQUIRE(mbtowc(NULL, NULL, 0) == 0); 100106686Stjr 101106686Stjr /* Incomplete character sequence (truncated double-byte). */ 102106686Stjr memset(buf, 0xcc, sizeof(buf)); 103106686Stjr buf[0] = 0xa3; 104106686Stjr buf[1] = 0x00; 105106686Stjr wc = L'z'; 106290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 1) == -1); 107290532Sngie ATF_REQUIRE(wc == L'z'); 108290532Sngie ATF_REQUIRE(mbtowc(NULL, NULL, 0) == 0); 109106686Stjr 110106686Stjr /* Same as above, but complete. */ 111106686Stjr buf[1] = 0xc1; 112290532Sngie ATF_REQUIRE(mbtowc(&wc, buf, 2) == 2); 113290532Sngie ATF_REQUIRE(wc == 0xa3c1); 114290532Sngie} 115106686Stjr 116290532SngieATF_TP_ADD_TCS(tp) 117290532Sngie{ 118106686Stjr 119290532Sngie ATF_TP_ADD_TC(tp, mbtowc_test); 120290532Sngie 121290532Sngie return (atf_no_error()); 122106686Stjr} 123