test-mbrtowc.c revision 259065
1257097Srpaulo/*- 2257097Srpaulo * Copyright (c) 2002 Tim J. Robbins 3257097Srpaulo * All rights reserved. 4257097Srpaulo * 5257097Srpaulo * Redistribution and use in source and binary forms, with or without 6257097Srpaulo * modification, are permitted provided that the following conditions 7257097Srpaulo * are met: 8260024Sjmmv * 1. Redistributions of source code must retain the above copyright 9260024Sjmmv * notice, this list of conditions and the following disclaimer. 10257097Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11260024Sjmmv * notice, this list of conditions and the following disclaimer in the 12260024Sjmmv * documentation and/or other materials provided with the distribution. 13257097Srpaulo * 14260024Sjmmv * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15260024Sjmmv * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16260024Sjmmv * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17260024Sjmmv * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18260024Sjmmv * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19260024Sjmmv * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20275504Sngie * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21275504Sngie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22260024Sjmmv * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23260024Sjmmv * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24260024Sjmmv * SUCH DAMAGE. 25262951Sjmmv */ 26262951Sjmmv 27262951Sjmmv/* 28262951Sjmmv * Test program for mbrtowc(), as specified by IEEE Std. 1003.1-2001 and 29262951Sjmmv * ISO/IEC 9899:1999. 30262951Sjmmv * 31262951Sjmmv * The function is tested with both the "C" ("POSIX") LC_CTYPE setting and 32264996Sjmmv * "ja_JP.eucJP". Other encodings are not tested. 33264996Sjmmv */ 34262951Sjmmv 35262951Sjmmv#include <sys/cdefs.h> 36262951Sjmmv__FBSDID("$FreeBSD: releng/10.0/tools/regression/lib/libc/locale/test-mbrtowc.c 137587 2004-11-11 19:47:55Z nik $"); 37262951Sjmmv 38262951Sjmmv#include <assert.h> 39262951Sjmmv#include <errno.h> 40262951Sjmmv#include <limits.h> 41262951Sjmmv#include <locale.h> 42262951Sjmmv#include <stdio.h> 43262951Sjmmv#include <stdlib.h> 44262951Sjmmv#include <string.h> 45262951Sjmmv#include <wchar.h> 46262951Sjmmv 47262951Sjmmvint 48262951Sjmmvmain(int argc, char *argv[]) 49262951Sjmmv{ 50276490Sngie mbstate_t s; 51276490Sngie size_t len; 52262951Sjmmv wchar_t wc; 53262951Sjmmv char buf[MB_LEN_MAX + 1]; 54262951Sjmmv 55265037Sjmmv /* 56265037Sjmmv * C/POSIX locale. 57265037Sjmmv */ 58265037Sjmmv 59265037Sjmmv printf("1..1\n"); 60265037Sjmmv 61265037Sjmmv assert(MB_CUR_MAX == 1); 62265037Sjmmv 63265037Sjmmv /* Null wide character, internal state. */ 64265037Sjmmv memset(buf, 0xcc, sizeof(buf)); 65265037Sjmmv buf[0] = 0; 66265037Sjmmv assert(mbrtowc(&wc, buf, 1, NULL) == 0); 67265037Sjmmv assert(wc == 0); 68265037Sjmmv 69265037Sjmmv /* Null wide character. */ 70265037Sjmmv memset(&s, 0, sizeof(s)); 71265037Sjmmv assert(mbrtowc(&wc, buf, 1, &s) == 0); 72265037Sjmmv assert(wc == 0); 73276490Sngie 74276490Sngie /* Latin letter A, internal state. */ 75265037Sjmmv assert(mbrtowc(NULL, 0, 0, NULL) == 0); 76265037Sjmmv buf[0] = 'A'; 77260024Sjmmv assert(mbrtowc(&wc, buf, 1, NULL) == 1); 78260024Sjmmv assert(wc == L'A'); 79260024Sjmmv 80262849Sjmmv /* Latin letter A. */ 81262849Sjmmv memset(&s, 0, sizeof(s)); 82260024Sjmmv assert(mbrtowc(&wc, buf, 1, &s) == 1); 83260024Sjmmv assert(wc == L'A'); 84262849Sjmmv 85262849Sjmmv /* Incomplete character sequence. */ 86260024Sjmmv wc = L'z'; 87260024Sjmmv memset(&s, 0, sizeof(s)); 88260024Sjmmv assert(mbrtowc(&wc, buf, 0, &s) == (size_t)-2); 89260024Sjmmv assert(wc == L'z'); 90260024Sjmmv 91260024Sjmmv /* Check that mbrtowc() doesn't access the buffer when n == 0. */ 92270285Sngie wc = L'z'; 93270285Sngie memset(&s, 0, sizeof(s)); 94276492Sngie buf[0] = '\0'; 95276492Sngie assert(mbrtowc(&wc, buf, 0, &s) == (size_t)-2); 96276492Sngie assert(wc == L'z'); 97276492Sngie 98276492Sngie /* 99276492Sngie * Japanese (EUC) locale. 100270724Sngie */ 101270724Sngie 102260024Sjmmv assert(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0); 103260024Sjmmv assert(MB_CUR_MAX > 1); 104260024Sjmmv 105260024Sjmmv /* Null wide character, internal state. */ 106260024Sjmmv assert(mbrtowc(NULL, 0, 0, NULL) == 0); 107271298Sngie memset(buf, 0xcc, sizeof(buf)); 108271298Sngie buf[0] = 0; 109260024Sjmmv assert(mbrtowc(&wc, buf, 1, NULL) == 0); 110260024Sjmmv assert(wc == 0); 111264996Sjmmv 112264996Sjmmv /* Null wide character. */ 113264996Sjmmv memset(&s, 0, sizeof(s)); 114270242Sasomers assert(mbrtowc(&wc, buf, 1, &s) == 0); 115270242Sasomers assert(wc == 0); 116264996Sjmmv 117264996Sjmmv /* Latin letter A, internal state. */ 118264996Sjmmv assert(mbrtowc(NULL, 0, 0, NULL) == 0); 119264996Sjmmv buf[0] = 'A'; 120264996Sjmmv assert(mbrtowc(&wc, buf, 1, NULL) == 1); 121265037Sjmmv assert(wc == L'A'); 122265037Sjmmv 123265037Sjmmv /* Latin letter A. */ 124265037Sjmmv memset(&s, 0, sizeof(s)); 125265037Sjmmv assert(mbrtowc(&wc, buf, 1, &s) == 1); 126265037Sjmmv assert(wc == L'A'); 127265037Sjmmv 128265037Sjmmv /* Incomplete character sequence (zero length). */ 129265037Sjmmv wc = L'z'; 130265037Sjmmv memset(&s, 0, sizeof(s)); 131260037Sjmmv assert(mbrtowc(&wc, buf, 0, &s) == (size_t)-2); 132260037Sjmmv assert(wc == L'z'); 133260037Sjmmv 134260037Sjmmv /* Incomplete character sequence (truncated double-byte). */ 135260037Sjmmv memset(buf, 0xcc, sizeof(buf)); 136260037Sjmmv buf[0] = 0xa3; 137260037Sjmmv buf[1] = 0x00; 138260037Sjmmv memset(&s, 0, sizeof(s)); 139260037Sjmmv wc = 0; 140260037Sjmmv assert(mbrtowc(&wc, buf, 1, &s) == (size_t)-2); 141261857Sasomers 142261857Sasomers /* Same as above, but complete. */ 143261857Sasomers buf[1] = 0xc1; 144265586Sasomers memset(&s, 0, sizeof(s)); 145265586Sasomers wc = 0; 146275504Sngie assert(mbrtowc(&wc, buf, 2, &s) == 2); 147275504Sngie assert(wc == 0xa3c1); 148275504Sngie 149275504Sngie /* Test restarting behaviour. */ 150275504Sngie memset(buf, 0xcc, sizeof(buf)); 151275504Sngie buf[0] = 0xa3; 152275504Sngie memset(&s, 0, sizeof(s)); 153275504Sngie wc = 0; 154275504Sngie assert(mbrtowc(&wc, buf, 1, &s) == (size_t)-2); 155275504Sngie assert(wc == 0); 156275504Sngie buf[0] = 0xc1; 157275504Sngie assert(mbrtowc(&wc, buf, 1, &s) == 1); 158275504Sngie assert(wc == 0xa3c1); 159275504Sngie 160275504Sngie printf("ok 1 - mbrtowc()\n"); 161275504Sngie 162275504Sngie return (0); 163275504Sngie} 164275504Sngie