160484Sobrien/* $OpenBSD: test_mbrtowc.c,v 1.3 2020/03/09 09:29:10 dlg Exp $ */ 278828Sobrien/* 378828Sobrien * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org> 478828Sobrien * 560484Sobrien * Permission to use, copy, modify, and distribute this software for any 678828Sobrien * purpose with or without fee is hereby granted, provided that the above 778828Sobrien * copyright notice and this permission notice appear in all copies. 878828Sobrien * 978828Sobrien * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1078828Sobrien * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1178828Sobrien * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1278828Sobrien * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1378828Sobrien * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1478828Sobrien * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1578828Sobrien * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1678828Sobrien */ 1778828Sobrien 18218822Sdim#include <sys/types.h> 1978828Sobrien#include <err.h> 2078828Sobrien#include <errno.h> 2189857Sobrien#include <locale.h> 2289857Sobrien#include <stdlib.h> 2389857Sobrien#include <string.h> 2478828Sobrien#include <wchar.h> 2560484Sobrien 2689857Sobrienstatic mbstate_t mbs; 2789857Sobrien 2889857Sobrienvoid 2989857Sobrienonetest(const char *name, const char *in, size_t insz, 3089857Sobrien int outerr, size_t outsz, wint_t out) 3160484Sobrien{ 3260484Sobrien wchar_t wc; 3360484Sobrien size_t sz; 3460484Sobrien 3560484Sobrien sz = mbrtowc(&wc, in, insz, &mbs); 3660484Sobrien if (errno != outerr) 3760484Sobrien err(1, "%zu %s(%zd)", MB_CUR_MAX, name, insz); 3860484Sobrien if (sz != outsz || (out != WEOF && wc != out)) 3960484Sobrien errx(1, "%zu %s(%zd) = (%zd, %d) != (%zd, %d)", 4060484Sobrien MB_CUR_MAX, name, insz, sz, wc, outsz, out); 4160484Sobrien if (mbsinit(&mbs) == (insz && outsz == (size_t)-2)) 4260484Sobrien errx(1, "%zu %s(%zd) mbsinit", MB_CUR_MAX, name, insz); 4360484Sobrien if (errno == 0 && outerr == 0) 4460484Sobrien return; 4560484Sobrien errno = 0; 4660484Sobrien memset(&mbs, 0, sizeof(mbs)); 4789857Sobrien} 4860484Sobrien 4989857Sobrienint 5060484Sobrienmain(void) 5160484Sobrien{ 5260484Sobrien onetest("NUL", "", 0, 0, -2, WEOF); 5360484Sobrien onetest("NUL", "", 2, 0, 0, L'\0'); 5460484Sobrien onetest("BEL", "\a", 2, 0, 1, L'\a'); 5560484Sobrien onetest("A", "A", 2, 0, 1, L'A'); 5660484Sobrien onetest("DEL", "\177", 2, 0, 1, L'\177'); 5760484Sobrien onetest("CSI", "\233", 2, 0, 1, L'\233'); 5860484Sobrien 59 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) 60 errx(1, "setlocale(UTF-8) failed"); 61 62 onetest("NUL", "", 0, 0, -2, WEOF); 63 onetest("NUL", "", 8, 0, 0, L'\0'); 64 onetest("BEL", "\a", 8, 0, 1, L'\a'); 65 onetest("A", "A", 8, 0, 1, L'A'); 66 onetest("DEL", "\177", 8, 0, 1, L'\177'); 67 onetest("0x80", "\200", 8, EILSEQ, -1, WEOF); 68 onetest("0xc3", "\303", 1, 0, -2, WEOF); 69 onetest("U+00E9", "\251", 8, 0, 1, 0xe9); 70 onetest("0xec", "\354", 1, 0, -2, WEOF); 71 onetest("0xecbf", "\277", 1, 0, -2, WEOF); 72 onetest("U+CFFF", "\277", 8, 0, 1, 0xcfff); 73 74 if (setlocale(LC_CTYPE, "POSIX") == NULL) 75 errx(1, "setlocale(POSIX) failed"); 76 77 onetest("0xff", "\277", 2, 0, 1, L'\277'); 78 79 if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) 80 errx(1, "second setlocale(UTF-8) failed"); 81 82 onetest("U+13000", "\360\223\200\200", 8, 0, 4, 0x13000); 83 84 return 0; 85} 86