Path: blob/main/lib/libc/tests/locale/wcsnrtombs_test.c
39491 views
/*-1* Copyright (c) 2002-2004 Tim J. Robbins2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526/*27* Test program for wcsnrtombs().28*29* The function is tested with both the "C" ("POSIX") LC_CTYPE setting and30* "ja_JP.eucJP". Other encodings are not tested.31*/3233#include <errno.h>34#include <limits.h>35#include <locale.h>36#include <stdio.h>37#include <stdlib.h>38#include <string.h>39#include <wchar.h>4041#include <atf-c.h>4243ATF_TC_WITHOUT_HEAD(wcsnrtombs_test);44ATF_TC_BODY(wcsnrtombs_test, tc)45{46wchar_t srcbuf[128];47char dstbuf[128];48wchar_t *src;49mbstate_t s;5051/* C/POSIX locale. */5253/* Simple null terminated string. */54wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));55wcscpy(srcbuf, L"hello");56memset(dstbuf, 0xcc, sizeof(dstbuf));57src = srcbuf;58memset(&s, 0, sizeof(s));59ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, sizeof(dstbuf),60&s) == 5);61ATF_REQUIRE(strcmp(dstbuf, "hello") == 0);62ATF_REQUIRE((unsigned char)dstbuf[6] == 0xcc);63ATF_REQUIRE(src == NULL);6465/* Simple null terminated string, stopping early. */66wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));67wcscpy(srcbuf, L"hello");68memset(dstbuf, 0xcc, sizeof(dstbuf));69src = srcbuf;70memset(&s, 0, sizeof(s));71ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 4, sizeof(dstbuf),72&s) == 4);73ATF_REQUIRE(memcmp(dstbuf, "hell", 4) == 0);74ATF_REQUIRE((unsigned char)dstbuf[5] == 0xcc);75ATF_REQUIRE(src == srcbuf + 4);7677/* Not enough space in destination buffer. */78wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));79wcscpy(srcbuf, L"hello");80memset(dstbuf, 0xcc, sizeof(dstbuf));81src = srcbuf;82memset(&s, 0, sizeof(s));83ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, 4,84&s) == 4);85ATF_REQUIRE(memcmp(dstbuf, "hell", 4) == 0);86ATF_REQUIRE((unsigned char)dstbuf[5] == 0xcc);87ATF_REQUIRE(src == srcbuf + 4);8889/* Null terminated string, internal dest. buffer */90wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));91wcscpy(srcbuf, L"hello");92src = srcbuf;93memset(&s, 0, sizeof(s));94ATF_REQUIRE(wcsnrtombs(NULL, (const wchar_t **)&src, 6, sizeof(dstbuf),95&s) == 5);9697/* Null terminated string, internal dest. buffer, stopping early. */98wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));99wcscpy(srcbuf, L"hello");100src = srcbuf;101memset(&s, 0, sizeof(s));102ATF_REQUIRE(wcsnrtombs(NULL, (const wchar_t **)&src, 4, sizeof(dstbuf),103&s) == 4);104105/* Null terminated string, internal state. */106wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));107wcscpy(srcbuf, L"hello");108memset(dstbuf, 0xcc, sizeof(dstbuf));109src = srcbuf;110ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, sizeof(dstbuf),111NULL) == 5);112ATF_REQUIRE(strcmp(dstbuf, "hello") == 0);113ATF_REQUIRE((unsigned char)dstbuf[6] == 0xcc);114ATF_REQUIRE(src == NULL);115116/* Null terminated string, internal state, internal dest. buffer. */117wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));118wcscpy(srcbuf, L"hello");119src = srcbuf;120ATF_REQUIRE(wcsnrtombs(NULL, (const wchar_t **)&src, 6, 0, NULL) == 5);121122/* Empty source buffer. */123wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));124srcbuf[0] = L'\0';125memset(dstbuf, 0xcc, sizeof(dstbuf));126src = srcbuf;127memset(&s, 0, sizeof(s));128ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 1, sizeof(dstbuf),129&s) == 0);130ATF_REQUIRE(dstbuf[0] == L'\0');131132/* Zero length destination buffer. */133wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));134wcscpy(srcbuf, L"hello");135memset(dstbuf, 0xcc, sizeof(dstbuf));136src = srcbuf;137memset(&s, 0, sizeof(s));138ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, 0, &s) == 0);139ATF_REQUIRE((unsigned char)dstbuf[0] == 0xcc);140141/* Zero length source buffer. */142wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));143memset(dstbuf, 0xcc, sizeof(dstbuf));144src = srcbuf;145memset(&s, 0, sizeof(s));146ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 0, sizeof(dstbuf),147&s) == 0);148ATF_REQUIRE((unsigned char)dstbuf[0] == 0xcc);149ATF_REQUIRE(src == srcbuf);150151/*152* Japanese (EUC) locale.153*/154155ATF_REQUIRE(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0);156ATF_REQUIRE(MB_CUR_MAX > 1);157158wmemset(srcbuf, 0xcc, sizeof(srcbuf) / sizeof(*srcbuf));159srcbuf[0] = 0xA3C1;160srcbuf[1] = 0x0020;161srcbuf[2] = 0x0042;162srcbuf[3] = 0x0020;163srcbuf[4] = 0xA3C3;164srcbuf[5] = 0x0000;165memset(dstbuf, 0xcc, sizeof(dstbuf));166src = srcbuf;167memset(&s, 0, sizeof(s));168ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, sizeof(dstbuf),169&s) == 7);170ATF_REQUIRE(strcmp(dstbuf, "\xA3\xC1 B \xA3\xC3") == 0);171ATF_REQUIRE((unsigned char)dstbuf[8] == 0xcc);172ATF_REQUIRE(src == NULL);173174/* Stopping early. */175memset(dstbuf, 0xcc, sizeof(dstbuf));176src = srcbuf;177memset(&s, 0, sizeof(s));178ATF_REQUIRE(wcsnrtombs(dstbuf, (const wchar_t **)&src, 6, 6,179&s) == 5);180ATF_REQUIRE(memcmp(dstbuf, "\xA3\xC1 B ", 5) == 0);181ATF_REQUIRE((unsigned char)dstbuf[5] == 0xcc);182ATF_REQUIRE(src == srcbuf + 4);183}184185ATF_TP_ADD_TCS(tp)186{187188ATF_TP_ADD_TC(tp, wcsnrtombs_test);189190return (atf_no_error());191}192193194