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