Path: blob/main/lib/libc/tests/locale/mbsnrtowcs_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 mbsnrtowcs().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(mbsnrtowcs_test);44ATF_TC_BODY(mbsnrtowcs_test, tc)45{46char srcbuf[128];47wchar_t dstbuf[128];48char *src;49mbstate_t s;5051/* C/POSIX locale. */5253/* Simple null terminated string. */54memset(srcbuf, 0xcc, sizeof(srcbuf));55strcpy(srcbuf, "hello");56wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));57src = srcbuf;58memset(&s, 0, sizeof(s));59ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 6, sizeof(dstbuf) /60sizeof(*dstbuf), &s) == 5);61ATF_REQUIRE(wcscmp(dstbuf, L"hello") == 0);62ATF_REQUIRE(dstbuf[6] == 0xcccc);63ATF_REQUIRE(src == NULL);6465/* Simple null terminated string, stopping early. */66memset(srcbuf, 0xcc, sizeof(srcbuf));67strcpy(srcbuf, "hello");68wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));69src = srcbuf;70memset(&s, 0, sizeof(s));71ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 4, sizeof(dstbuf) /72sizeof(*dstbuf), &s) == 4);73ATF_REQUIRE(wmemcmp(dstbuf, L"hell", 4) == 0);74ATF_REQUIRE(dstbuf[5] == 0xcccc);75ATF_REQUIRE(src == srcbuf + 4);7677/* Not enough space in destination buffer. */78memset(srcbuf, 0xcc, sizeof(srcbuf));79strcpy(srcbuf, "hello");80wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));81src = srcbuf;82memset(&s, 0, sizeof(s));83ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 6, 4, &s) == 4);84ATF_REQUIRE(wmemcmp(dstbuf, L"hell", 4) == 0);85ATF_REQUIRE(dstbuf[5] == 0xcccc);86ATF_REQUIRE(src == srcbuf + 4);8788/* Null terminated string, internal dest. buffer */89memset(srcbuf, 0xcc, sizeof(srcbuf));90strcpy(srcbuf, "hello");91src = srcbuf;92memset(&s, 0, sizeof(s));93ATF_REQUIRE(mbsnrtowcs(NULL, (const char **)&src, 6, 0, &s) == 5);9495/* Null terminated string, internal dest. buffer, stopping early */96memset(srcbuf, 0xcc, sizeof(srcbuf));97strcpy(srcbuf, "hello");98src = srcbuf;99memset(&s, 0, sizeof(s));100ATF_REQUIRE(mbsnrtowcs(NULL, (const char **)&src, 4, 0, &s) == 4);101102/* Null terminated string, internal state. */103memset(srcbuf, 0xcc, sizeof(srcbuf));104strcpy(srcbuf, "hello");105wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));106src = srcbuf;107ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 6, sizeof(dstbuf) /108sizeof(*dstbuf), NULL) == 5);109ATF_REQUIRE(wcscmp(dstbuf, L"hello") == 0);110ATF_REQUIRE(dstbuf[6] == 0xcccc);111ATF_REQUIRE(src == NULL);112113/* Null terminated string, internal state, internal dest. buffer. */114memset(srcbuf, 0xcc, sizeof(srcbuf));115strcpy(srcbuf, "hello");116src = srcbuf;117ATF_REQUIRE(mbsnrtowcs(NULL, (const char **)&src, 6, 0, NULL) == 5);118119/* Empty source buffer. */120memset(srcbuf, 0xcc, sizeof(srcbuf));121srcbuf[0] = '\0';122src = srcbuf;123memset(&s, 0, sizeof(s));124wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));125ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 1, 1, &s) == 0);126ATF_REQUIRE(dstbuf[0] == 0);127ATF_REQUIRE(dstbuf[1] == 0xcccc);128ATF_REQUIRE(src == NULL);129130/* Zero length destination buffer. */131memset(srcbuf, 0xcc, sizeof(srcbuf));132strcpy(srcbuf, "hello");133src = srcbuf;134memset(&s, 0, sizeof(s));135wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));136ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 1, 0, &s) == 0);137ATF_REQUIRE(dstbuf[0] == 0xcccc);138ATF_REQUIRE(src == srcbuf);139140/* Zero length source buffer. */141memset(srcbuf, 0xcc, sizeof(srcbuf));142src = srcbuf;143memset(&s, 0, sizeof(s));144wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));145ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 0, 1, &s) == 0);146ATF_REQUIRE(dstbuf[0] == 0xcccc);147ATF_REQUIRE(src == srcbuf);148149/*150* Japanese (EUC) locale.151*/152153ATF_REQUIRE(strcmp(setlocale(LC_CTYPE, "ja_JP.eucJP"), "ja_JP.eucJP") == 0);154ATF_REQUIRE(MB_CUR_MAX > 1);155156memset(srcbuf, 0xcc, sizeof(srcbuf));157strcpy(srcbuf, "\xA3\xC1 B \xA3\xC3");158src = srcbuf;159memset(&s, 0, sizeof(s));160wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));161ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 8, sizeof(dstbuf) /162sizeof(*dstbuf), &s) == 5);163ATF_REQUIRE(dstbuf[0] == 0xA3C1 && dstbuf[1] == 0x20 && dstbuf[2] == 0x42 &&164dstbuf[3] == 0x20 && dstbuf[4] == 0xA3C3 && dstbuf[5] == 0);165ATF_REQUIRE(src == NULL);166167/* Partial character. */168memset(srcbuf, 0xcc, sizeof(srcbuf));169strcpy(srcbuf, "\xA3\xC1 B \xA3\xC3");170src = srcbuf;171memset(&s, 0, sizeof(s));172wmemset(dstbuf, 0xcccc, sizeof(dstbuf) / sizeof(*dstbuf));173ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 6, sizeof(dstbuf) /174sizeof(*dstbuf), &s) == 4);175ATF_REQUIRE(src == srcbuf + 6);176ATF_REQUIRE(!mbsinit(&s));177ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 1, sizeof(dstbuf) /178sizeof(*dstbuf), &s) == 1);179ATF_REQUIRE(src == srcbuf + 7);180ATF_REQUIRE(mbsnrtowcs(dstbuf, (const char **)&src, 1, sizeof(dstbuf) /181sizeof(*dstbuf), &s) == 0);182ATF_REQUIRE(src == NULL);183}184185ATF_TP_ADD_TCS(tp)186{187188ATF_TP_ADD_TC(tp, mbsnrtowcs_test);189190return (atf_no_error());191}192193194