1*926b03a6Sriastradh /* $NetBSD: t_mbrtoc8.c,v 1.3 2024/08/20 17:43:09 riastradh Exp $ */ 2c4e44ee2Sriastradh 3c4e44ee2Sriastradh /*- 4c4e44ee2Sriastradh * Copyright (c) 2002 Tim J. Robbins 5c4e44ee2Sriastradh * All rights reserved. 6c4e44ee2Sriastradh * 7c4e44ee2Sriastradh * Copyright (c) 2013 Ed Schouten <ed@FreeBSD.org> 8c4e44ee2Sriastradh * All rights reserved. 9c4e44ee2Sriastradh * 10c4e44ee2Sriastradh * Redistribution and use in source and binary forms, with or without 11c4e44ee2Sriastradh * modification, are permitted provided that the following conditions 12c4e44ee2Sriastradh * are met: 13c4e44ee2Sriastradh * 1. Redistributions of source code must retain the above copyright 14c4e44ee2Sriastradh * notice, this list of conditions and the following disclaimer. 15c4e44ee2Sriastradh * 2. Redistributions in binary form must reproduce the above copyright 16c4e44ee2Sriastradh * notice, this list of conditions and the following disclaimer in the 17c4e44ee2Sriastradh * documentation and/or other materials provided with the distribution. 18c4e44ee2Sriastradh * 19c4e44ee2Sriastradh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20c4e44ee2Sriastradh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21c4e44ee2Sriastradh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22c4e44ee2Sriastradh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23c4e44ee2Sriastradh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24c4e44ee2Sriastradh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25c4e44ee2Sriastradh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26c4e44ee2Sriastradh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27c4e44ee2Sriastradh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28c4e44ee2Sriastradh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29c4e44ee2Sriastradh * SUCH DAMAGE. 30c4e44ee2Sriastradh */ 31c4e44ee2Sriastradh /* 32c4e44ee2Sriastradh * Test program for mbrtoc8() as specified by C23. 33c4e44ee2Sriastradh */ 34c4e44ee2Sriastradh 35c4e44ee2Sriastradh #include <sys/cdefs.h> 36*926b03a6Sriastradh __RCSID("$NetBSD: t_mbrtoc8.c,v 1.3 2024/08/20 17:43:09 riastradh Exp $"); 37c4e44ee2Sriastradh 38c4e44ee2Sriastradh #include <errno.h> 39c4e44ee2Sriastradh #include <inttypes.h> 40c4e44ee2Sriastradh #include <limits.h> 41c4e44ee2Sriastradh #include <locale.h> 42c4e44ee2Sriastradh #include <string.h> 43c4e44ee2Sriastradh #include <uchar.h> 44c4e44ee2Sriastradh 45c4e44ee2Sriastradh #include <atf-c.h> 46c4e44ee2Sriastradh 47c4e44ee2Sriastradh static void 48c4e44ee2Sriastradh require_lc_ctype(const char *locale_name) 49c4e44ee2Sriastradh { 50c4e44ee2Sriastradh char *lc_ctype_set; 51c4e44ee2Sriastradh 52c4e44ee2Sriastradh lc_ctype_set = setlocale(LC_CTYPE, locale_name); 53c4e44ee2Sriastradh if (lc_ctype_set == NULL) 54c4e44ee2Sriastradh atf_tc_fail("setlocale(LC_CTYPE, \"%s\") failed; errno=%d", 55c4e44ee2Sriastradh locale_name, errno); 56c4e44ee2Sriastradh 57c4e44ee2Sriastradh ATF_REQUIRE_EQ_MSG(strcmp(lc_ctype_set, locale_name), 0, 58c4e44ee2Sriastradh "lc_ctype_set=%s locale_name=%s", lc_ctype_set, locale_name); 59c4e44ee2Sriastradh } 60c4e44ee2Sriastradh 61c4e44ee2Sriastradh static mbstate_t s; 62c4e44ee2Sriastradh static char8_t c8; 63c4e44ee2Sriastradh 64c4e44ee2Sriastradh ATF_TC_WITHOUT_HEAD(mbrtoc8_c_locale_test); 65c4e44ee2Sriastradh ATF_TC_BODY(mbrtoc8_c_locale_test, tc) 66c4e44ee2Sriastradh { 67c4e44ee2Sriastradh size_t n; 68c4e44ee2Sriastradh 69c4e44ee2Sriastradh require_lc_ctype("C"); 70c4e44ee2Sriastradh 71c4e44ee2Sriastradh /* Null wide character, internal state. */ 72c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n); 73c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 74c4e44ee2Sriastradh 75c4e44ee2Sriastradh /* Null wide character. */ 76c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 77c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n); 78c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 79c4e44ee2Sriastradh 80c4e44ee2Sriastradh /* Latin letter A, internal state. */ 81c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n); 82c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n); 83c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 84c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'A'); 85c4e44ee2Sriastradh 86c4e44ee2Sriastradh /* Latin letter A. */ 87c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 88c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n); 89c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 90c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'A'); 91c4e44ee2Sriastradh 92c4e44ee2Sriastradh /* Incomplete character sequence. */ 93c4e44ee2Sriastradh c8 = 'z'; 94c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 95c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2, 96c4e44ee2Sriastradh "n=%zu", n); 97c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8, 98c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'z'); 99c4e44ee2Sriastradh 100c4e44ee2Sriastradh /* Check that mbrtoc8() doesn't access the buffer when n == 0. */ 101c4e44ee2Sriastradh c8 = 'z'; 102c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 103c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2, 104c4e44ee2Sriastradh "n=%zu", n); 105c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8, 106c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'z'); 107c4e44ee2Sriastradh 108c4e44ee2Sriastradh /* Check that mbrtoc8() doesn't read ahead too aggressively. */ 109c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 110c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "AB", 2, &s)), 1, "n=%zu", n); 111c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 112c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'A'); 113c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "C", 1, &s)), 1, "n=%zu", n); 114c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'C', "c8=0x%"PRIx8" 'C'=0x%"PRIx8, 115c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'C'); 116c4e44ee2Sriastradh 117c4e44ee2Sriastradh } 118c4e44ee2Sriastradh 11990094827Sriastradh ATF_TC_WITHOUT_HEAD(mbrtoc8_iso2022jp_locale_test); 12090094827Sriastradh ATF_TC_BODY(mbrtoc8_iso2022jp_locale_test, tc) 12190094827Sriastradh { 12290094827Sriastradh size_t n; 12390094827Sriastradh 12490094827Sriastradh require_lc_ctype("ja_JP.ISO-2022-JP"); 12590094827Sriastradh 12690094827Sriastradh /* Null wide character, internal state. */ 12790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n); 12890094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 12990094827Sriastradh 13090094827Sriastradh /* Null wide character. */ 13190094827Sriastradh memset(&s, 0, sizeof(s)); 13290094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n); 13390094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 13490094827Sriastradh 13590094827Sriastradh /* Latin letter A, internal state. */ 13690094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n); 13790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n); 13890094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 13990094827Sriastradh (uint8_t)c8, (uint8_t)'A'); 14090094827Sriastradh 14190094827Sriastradh /* Latin letter A. */ 14290094827Sriastradh memset(&s, 0, sizeof(s)); 14390094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n); 14490094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 14590094827Sriastradh (uint8_t)c8, (uint8_t)'A'); 14690094827Sriastradh 14790094827Sriastradh /* Incomplete character sequence. */ 14890094827Sriastradh c8 = 'z'; 14990094827Sriastradh memset(&s, 0, sizeof(s)); 15090094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2, 15190094827Sriastradh "n=%zu", n); 15290094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8, 15390094827Sriastradh (uint8_t)c8, (uint8_t)'z'); 15490094827Sriastradh 15590094827Sriastradh /* Check that mbrtoc8() doesn't access the buffer when n == 0. */ 15690094827Sriastradh c8 = 'z'; 15790094827Sriastradh memset(&s, 0, sizeof(s)); 15890094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2, 15990094827Sriastradh "n=%zu", n); 16090094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8, 16190094827Sriastradh (uint8_t)c8, (uint8_t)'z'); 16290094827Sriastradh 16390094827Sriastradh /* Check that mbrtoc8() doesn't read ahead too aggressively. */ 16490094827Sriastradh memset(&s, 0, sizeof(s)); 16590094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "AB", 2, &s)), 1, "n=%zu", n); 16690094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 16790094827Sriastradh (uint8_t)c8, (uint8_t)'A'); 16890094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "C", 1, &s)), 1, "n=%zu", n); 16990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'C', "c8=0x%"PRIx8" 'C'=0x%"PRIx8, 17090094827Sriastradh (uint8_t)c8, (uint8_t)'C'); 17190094827Sriastradh 17290094827Sriastradh /* Incomplete character sequence (shift sequence only). */ 17390094827Sriastradh memset(&s, 0, sizeof(s)); 17490094827Sriastradh c8 = 0; 17590094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J", 3, &s)), (size_t)-2, 17690094827Sriastradh "n=%zu", n); 17790094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 17890094827Sriastradh 17990094827Sriastradh /* Same as above, but complete (U+00A5 YEN SIGN). */ 18090094827Sriastradh memset(&s, 0, sizeof(s)); 18190094827Sriastradh c8 = 0; 18290094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J\x5c", 4, &s)), 4, 18390094827Sriastradh "n=%zu", n); 18490094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8); 18590094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 18690094827Sriastradh "n=%zu", n); 18790094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8); 18890094827Sriastradh 18990094827Sriastradh /* Test restarting behaviour. */ 19090094827Sriastradh memset(&s, 0, sizeof(s)); 19190094827Sriastradh c8 = 0; 19290094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-2, 19390094827Sriastradh "n=%zu", n); 19490094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 19590094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "J\x5c", 2, &s)), 2, "n=%zu", n); 19690094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8); 19790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 19890094827Sriastradh "n=%zu", n); 19990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8); 20090094827Sriastradh 20190094827Sriastradh /* 20290094827Sriastradh * Test shift sequence state in various increments: 20390094827Sriastradh * 1. U+0042 LATIN CAPITAL LETTER A 20490094827Sriastradh * 2. (shift ISO/IEC 646:JP) U+00A5 YEN SIGN 20590094827Sriastradh * 3. U+00A5 YEN SIGN 20690094827Sriastradh * 4. (shift JIS X 0208) U+30A2 KATAKANA LETTER A 20790094827Sriastradh * 5. U+30A2 KATAKANA LETTER A 20890094827Sriastradh * 6. (shift to initial state) U+0000 NUL 20990094827Sriastradh */ 21090094827Sriastradh memset(&s, 0, sizeof(s)); 21190094827Sriastradh c8 = 0; 21290094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A\x1b(J", 4, &s)), 1, "n=%zu", n); 21390094827Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8, (uint8_t)c8); 21490094827Sriastradh c8 = 0; 21590094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(J", 3, &s)), (size_t)-2, 21690094827Sriastradh "n=%zu", n); 21790094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 21890094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x5c", 2, &s)), 1, 21990094827Sriastradh "n=%zu", n); 22090094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8); 22190094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x1b$", 3, &s)), (size_t)-3, 22290094827Sriastradh "n=%zu", n); 22390094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8); 22490094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x5c\x1b$", 3, &s)), 1, 22590094827Sriastradh "n=%zu", n); 22690094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8); 22790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b", 1, &s)), (size_t)-3, 22890094827Sriastradh "n=%zu", n); 22990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa5, "c8=0x%"PRIx8, (uint8_t)c8); 23090094827Sriastradh c8 = 0xff; 23190094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b", 1, &s)), (size_t)-2, 23290094827Sriastradh "n=%zu", n); 23390094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xff, "c8=0x%"PRIx8, (uint8_t)c8); 23490094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "$B\x25\x22", 4, &s)), 4, 23590094827Sriastradh "n=%zu", n); 23690094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xe3, "c8=0x%"PRIx8, (uint8_t)c8); 23790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-3, 23890094827Sriastradh "n=%zu", n); 23990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8); 24090094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-3, 24190094827Sriastradh "n=%zu", n); 24290094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa2, "c8=0x%"PRIx8, (uint8_t)c8); 24390094827Sriastradh c8 = 0; 24490094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x25", 1, &s)), (size_t)-2, 24590094827Sriastradh "n=%zu", n); 24690094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 24790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x22\x1b(B\x00", 5, &s)), 1, 24890094827Sriastradh "n=%zu", n); 24990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xe3, "c8=0x%"PRIx8, (uint8_t)c8); 25090094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-3, 25190094827Sriastradh "n=%zu", n); 25290094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8); 25390094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-3, 25490094827Sriastradh "n=%zu", n); 25590094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa2, "c8=0x%"PRIx8, (uint8_t)c8); 25690094827Sriastradh c8 = 0; 25790094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x1b(", 2, &s)), (size_t)-2, 25890094827Sriastradh "n=%zu", n); 25990094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 26090094827Sriastradh c8 = 42; 26190094827Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "B\x00", 2, &s)), 0, "n=%zu", n); 26290094827Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 26390094827Sriastradh } 26490094827Sriastradh 265c4e44ee2Sriastradh ATF_TC_WITHOUT_HEAD(mbrtoc8_iso_8859_1_test); 266c4e44ee2Sriastradh ATF_TC_BODY(mbrtoc8_iso_8859_1_test, tc) 267c4e44ee2Sriastradh { 268c4e44ee2Sriastradh size_t n; 269c4e44ee2Sriastradh 270c4e44ee2Sriastradh require_lc_ctype("en_US.ISO8859-1"); 271c4e44ee2Sriastradh 272c4e44ee2Sriastradh /* Currency sign. */ 273c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 274c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xa4", 1, &s)), 1, "n=%zu", n); 275c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc2, "c8=0x%"PRIx8, (uint8_t)c8); 276c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 277c4e44ee2Sriastradh "n=%zu", n); 278c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa4, "c8=0x%"PRIx8, (uint8_t)c8); 279c4e44ee2Sriastradh } 280c4e44ee2Sriastradh 281c4e44ee2Sriastradh ATF_TC_WITHOUT_HEAD(mbrtoc8_iso_8859_15_test); 282c4e44ee2Sriastradh ATF_TC_BODY(mbrtoc8_iso_8859_15_test, tc) 283c4e44ee2Sriastradh { 284c4e44ee2Sriastradh size_t n; 285c4e44ee2Sriastradh 286c4e44ee2Sriastradh require_lc_ctype("en_US.ISO8859-15"); 287c4e44ee2Sriastradh 288c4e44ee2Sriastradh /* Euro sign. */ 289c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 290c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xa4", 1, &s)), 1, "n=%zu", n); 291c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xe2, "c8=0x%"PRIx8, (uint8_t)c8); 292c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 293c4e44ee2Sriastradh "n=%zu", n); 294c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x82, "c8=0x%"PRIx8, (uint8_t)c8); 295c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 296c4e44ee2Sriastradh "n=%zu", n); 297c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xac, "c8=0x%"PRIx8, (uint8_t)c8); 298c4e44ee2Sriastradh } 299c4e44ee2Sriastradh 300c4e44ee2Sriastradh ATF_TC_WITHOUT_HEAD(mbrtoc8_utf_8_test); 301c4e44ee2Sriastradh ATF_TC_BODY(mbrtoc8_utf_8_test, tc) 302c4e44ee2Sriastradh { 303c4e44ee2Sriastradh size_t n; 304c4e44ee2Sriastradh 305c4e44ee2Sriastradh require_lc_ctype("en_US.UTF-8"); 306c4e44ee2Sriastradh 307c4e44ee2Sriastradh /* Null wide character, internal state. */ 308c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n); 309c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, NULL)), 0, "n=%zu", n); 310c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 311c4e44ee2Sriastradh 312c4e44ee2Sriastradh /* Null wide character. */ 313c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 314c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 1, &s)), 0, "n=%zu", n); 315c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 316c4e44ee2Sriastradh 317c4e44ee2Sriastradh /* Latin letter A, internal state. */ 318c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(NULL, 0, 0, NULL)), 0, "n=%zu", n); 319c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, NULL)), 1, "n=%zu", n); 320c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 321c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'A'); 322c4e44ee2Sriastradh 323c4e44ee2Sriastradh /* Latin letter A. */ 324c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 325c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "A", 1, &s)), 1, "n=%zu", n); 326c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'A', "c8=0x%"PRIx8" 'A'=0x%"PRIx8, 327c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'A'); 328c4e44ee2Sriastradh 329c4e44ee2Sriastradh /* Incomplete character sequence (zero length). */ 330c4e44ee2Sriastradh c8 = 'z'; 331c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 332c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-2, 333c4e44ee2Sriastradh "n=%zu", n); 334c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 'z', "c8=0x%"PRIx8" 'z'=0x%"PRIx8, 335c4e44ee2Sriastradh (uint8_t)c8, (uint8_t)'z'); 336c4e44ee2Sriastradh 337c4e44ee2Sriastradh /* Incomplete character sequence (truncated double-byte). */ 338c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 339c4e44ee2Sriastradh c8 = 0; 340c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3", 1, &s)), (size_t)-2, 341c4e44ee2Sriastradh "n=%zu", n); 342c4e44ee2Sriastradh 343c4e44ee2Sriastradh /* Same as above, but complete. */ 344c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 345c4e44ee2Sriastradh c8 = 0; 346c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3\x84", 2, &s)), 2, 347c4e44ee2Sriastradh "n=%zu", n); 348c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8); 349c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 350c4e44ee2Sriastradh "n=%zu", n); 351c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x84, "c8=0x%"PRIx8, (uint8_t)c8); 352c4e44ee2Sriastradh 353c4e44ee2Sriastradh /* Test restarting behaviour. */ 354c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 355c4e44ee2Sriastradh c8 = 0; 356c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3", 1, &s)), (size_t)-2, 357c4e44ee2Sriastradh "n=%zu", n); 358c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0, "c8=0x%"PRIx8, (uint8_t)c8); 359c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xb7", 1, &s)), 1, "n=%zu", n); 360c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8); 361c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 362c4e44ee2Sriastradh "n=%zu", n); 363c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xb7, "c8=0x%"PRIx8, (uint8_t)c8); 364c4e44ee2Sriastradh 365c4e44ee2Sriastradh /* Four-byte sequence. */ 366c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 367c4e44ee2Sriastradh c8 = 0; 368c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xf0\x9f\x92\xa9", 4, &s)), 4, 369c4e44ee2Sriastradh "n=%zu", n); 370c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xf0, "c8=0x%"PRIx8, (uint8_t)c8); 371c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 372c4e44ee2Sriastradh "n=%zu", n); 373c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x9f, "c8=0x%"PRIx8, (uint8_t)c8); 374c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 375c4e44ee2Sriastradh "n=%zu", n); 376c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x92, "c8=0x%"PRIx8, (uint8_t)c8); 377c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 378c4e44ee2Sriastradh "n=%zu", n); 379c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa9, "c8=0x%"PRIx8, (uint8_t)c8); 380c4e44ee2Sriastradh 381c4e44ee2Sriastradh /* Letter e with acute, precomposed. */ 382c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 383c4e44ee2Sriastradh c8 = 0; 384c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xc3\xa9", 2, &s)), 2, 385c4e44ee2Sriastradh "n=%zu", n); 386c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xc3, "c8=0x%"PRIx8, (uint8_t)c8); 387c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 388c4e44ee2Sriastradh "n=%zu", n); 389c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xa9, "c8=0x%"PRIx8, (uint8_t)c8); 390c4e44ee2Sriastradh 391c4e44ee2Sriastradh /* Letter e with acute, combined. */ 392c4e44ee2Sriastradh memset(&s, 0, sizeof(s)); 393c4e44ee2Sriastradh c8 = 0; 394c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\x65\xcc\x81", 3, &s)), 1, 395c4e44ee2Sriastradh "n=%zu", n); 396c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x65, "c8=0x%"PRIx8, (uint8_t)c8); 397c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "\xcc\x81", 2, &s)), 2, 398c4e44ee2Sriastradh "n=%zu", n); 399c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0xcc, "c8=0x%"PRIx8, (uint8_t)c8); 400c4e44ee2Sriastradh ATF_CHECK_EQ_MSG((n = mbrtoc8(&c8, "", 0, &s)), (size_t)-3, 401c4e44ee2Sriastradh "n=%zu", n); 402c4e44ee2Sriastradh ATF_CHECK_EQ_MSG(c8, 0x81, "c8=0x%"PRIx8, (uint8_t)c8); 403c4e44ee2Sriastradh } 404c4e44ee2Sriastradh 405c4e44ee2Sriastradh ATF_TP_ADD_TCS(tp) 406c4e44ee2Sriastradh { 407c4e44ee2Sriastradh 408c4e44ee2Sriastradh ATF_TP_ADD_TC(tp, mbrtoc8_c_locale_test); 40990094827Sriastradh ATF_TP_ADD_TC(tp, mbrtoc8_iso2022jp_locale_test); 410c4e44ee2Sriastradh ATF_TP_ADD_TC(tp, mbrtoc8_iso_8859_1_test); 411c4e44ee2Sriastradh ATF_TP_ADD_TC(tp, mbrtoc8_iso_8859_15_test); 412c4e44ee2Sriastradh ATF_TP_ADD_TC(tp, mbrtoc8_utf_8_test); 413c4e44ee2Sriastradh 414c4e44ee2Sriastradh return (atf_no_error()); 415c4e44ee2Sriastradh } 416