diff options
Diffstat (limited to 'src/regress/lib/libc/locale')
-rw-r--r-- | src/regress/lib/libc/locale/Makefile | 5 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/check_isw/Makefile | 8 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/check_isw/check_isw.c | 147 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/mbrtowc/Makefile | 5 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c | 85 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/setlocale/Makefile | 8 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/setlocale/setlocale.c | 125 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/uselocale/Makefile | 10 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/uselocale/uselocale.c | 481 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/wcrtomb/Makefile | 5 | ||||
-rw-r--r-- | src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c | 85 |
11 files changed, 0 insertions, 964 deletions
diff --git a/src/regress/lib/libc/locale/Makefile b/src/regress/lib/libc/locale/Makefile deleted file mode 100644 index 550f176d4c..0000000000 --- a/src/regress/lib/libc/locale/Makefile +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.7 2020/01/13 15:35:57 bluhm Exp $ | ||
2 | |||
3 | SUBDIR = check_isw mbrtowc setlocale uselocale wcrtomb | ||
4 | |||
5 | .include <bsd.subdir.mk> | ||
diff --git a/src/regress/lib/libc/locale/check_isw/Makefile b/src/regress/lib/libc/locale/check_isw/Makefile deleted file mode 100644 index cd79d6cb7f..0000000000 --- a/src/regress/lib/libc/locale/check_isw/Makefile +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $ | ||
2 | |||
3 | PROG = check_isw | ||
4 | |||
5 | run-regress-${PROG}: ${PROG} | ||
6 | ./${PROG} >/dev/null | ||
7 | |||
8 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libc/locale/check_isw/check_isw.c b/src/regress/lib/libc/locale/check_isw/check_isw.c deleted file mode 100644 index 718f387883..0000000000 --- a/src/regress/lib/libc/locale/check_isw/check_isw.c +++ /dev/null | |||
@@ -1,147 +0,0 @@ | |||
1 | /* $OpenBSD: check_isw.c,v 1.2 2017/07/27 15:08:37 bluhm Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2005 Marc Espie <espie@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | /* This checks consistency of the isw* functions with the default <ctype> | ||
19 | * functions. | ||
20 | */ | ||
21 | |||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <ctype.h> | ||
25 | #include <wchar.h> | ||
26 | #include <wctype.h> | ||
27 | |||
28 | int bad = 0; | ||
29 | |||
30 | void | ||
31 | check_bool(int v1, int v2, char msg) | ||
32 | { | ||
33 | if (!v1 != !v2) { | ||
34 | printf("%c", msg); | ||
35 | bad++; | ||
36 | } | ||
37 | } | ||
38 | |||
39 | void | ||
40 | check_value(int v1, int v2, char msg) | ||
41 | { | ||
42 | if (v1 != v2) { | ||
43 | printf("%c", msg); | ||
44 | bad++; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | void | ||
49 | test1() | ||
50 | { | ||
51 | int i; | ||
52 | |||
53 | for (i = 0; i < 256; i++) { | ||
54 | printf(" %02x: ", i); | ||
55 | check_bool(isalnum(i), iswalnum(i), '1'); | ||
56 | check_bool(isalpha(i), iswalpha(i), '2'); | ||
57 | check_bool(isblank(i), iswblank(i), '3'); | ||
58 | check_bool(iscntrl(i), iswcntrl(i), '4'); | ||
59 | check_bool(isdigit(i), iswdigit(i), '5'); | ||
60 | check_bool(isgraph(i), iswgraph(i), '6'); | ||
61 | check_bool(islower(i), iswlower(i), '6'); | ||
62 | check_bool(isprint(i), iswprint(i), '7'); | ||
63 | check_bool(ispunct(i), iswpunct(i), '8'); | ||
64 | check_bool(isspace(i), iswspace(i), '9'); | ||
65 | check_bool(isupper(i), iswupper(i), 'a'); | ||
66 | check_bool(isxdigit(i), iswxdigit(i), 'b'); | ||
67 | check_value(tolower(i), towlower(i), 'c'); | ||
68 | check_value(toupper(i), towupper(i), 'd'); | ||
69 | if (i % 8 == 7) | ||
70 | printf("\n"); | ||
71 | } | ||
72 | printf("\n"); | ||
73 | } | ||
74 | |||
75 | void | ||
76 | test2() | ||
77 | { | ||
78 | unsigned char *s; | ||
79 | unsigned char *buf; | ||
80 | int i, j; | ||
81 | size_t n; | ||
82 | wchar_t c, d; | ||
83 | mbstate_t state; | ||
84 | |||
85 | s = malloc(256); | ||
86 | if (!s) { | ||
87 | bad++; | ||
88 | return; | ||
89 | } | ||
90 | buf = malloc(MB_CUR_MAX); | ||
91 | if (!buf) { | ||
92 | bad++; | ||
93 | free(s); | ||
94 | return; | ||
95 | } | ||
96 | for (i = 0; i < 256; i++) | ||
97 | s[i] = i+1; | ||
98 | |||
99 | j = 0; | ||
100 | mbrtowc(NULL, NULL, 1, &state); | ||
101 | printf(" %02x: ", 0); | ||
102 | |||
103 | while ((n = mbrtowc(&c, s+j, 256-j, &state)) == 1) { | ||
104 | printf(" %02x: ", s[j]); | ||
105 | check_bool(isalnum(s[j]), iswalnum(c), '1'); | ||
106 | check_bool(isalpha(s[j]), iswalpha(c), '2'); | ||
107 | check_bool(isblank(s[j]), iswblank(c), '3'); | ||
108 | check_bool(iscntrl(s[j]), iswcntrl(c), '4'); | ||
109 | check_bool(isdigit(s[j]), iswdigit(c), '5'); | ||
110 | check_bool(isgraph(s[j]), iswgraph(c), '6'); | ||
111 | check_bool(islower(s[j]), iswlower(c), '6'); | ||
112 | check_bool(isprint(s[j]), iswprint(c), '7'); | ||
113 | check_bool(ispunct(s[j]), iswpunct(c), '8'); | ||
114 | check_bool(isspace(s[j]), iswspace(c), '9'); | ||
115 | check_bool(isupper(s[j]), iswupper(c), 'a'); | ||
116 | check_bool(isxdigit(s[j]), iswxdigit(c), 'b'); | ||
117 | d = towlower(c); | ||
118 | if (wctomb(buf, d) == 1) { | ||
119 | check_value(tolower(s[j]), buf[0], 'c'); | ||
120 | } else { | ||
121 | bad++; | ||
122 | } | ||
123 | d = towupper(c); | ||
124 | if (wctomb(buf, d) == 1) { | ||
125 | check_value(toupper(s[j]), buf[0], 'c'); | ||
126 | } else { | ||
127 | bad++; | ||
128 | } | ||
129 | if (s[j] % 8 == 7) | ||
130 | printf("\n"); | ||
131 | j++; | ||
132 | } | ||
133 | if (n != 0 || j != 255) { | ||
134 | bad++; | ||
135 | } | ||
136 | free(s); | ||
137 | free(buf); | ||
138 | } | ||
139 | |||
140 | |||
141 | int | ||
142 | main() | ||
143 | { | ||
144 | test1(); | ||
145 | test2(); | ||
146 | return bad !=0; | ||
147 | } | ||
diff --git a/src/regress/lib/libc/locale/mbrtowc/Makefile b/src/regress/lib/libc/locale/mbrtowc/Makefile deleted file mode 100644 index 5436383911..0000000000 --- a/src/regress/lib/libc/locale/mbrtowc/Makefile +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $ | ||
2 | |||
3 | PROG = test_mbrtowc | ||
4 | |||
5 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c b/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c deleted file mode 100644 index 7455f68439..0000000000 --- a/src/regress/lib/libc/locale/mbrtowc/test_mbrtowc.c +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* $OpenBSD: test_mbrtowc.c,v 1.3 2020/03/09 09:29:10 dlg Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <sys/types.h> | ||
19 | #include <err.h> | ||
20 | #include <errno.h> | ||
21 | #include <locale.h> | ||
22 | #include <stdlib.h> | ||
23 | #include <string.h> | ||
24 | #include <wchar.h> | ||
25 | |||
26 | static mbstate_t mbs; | ||
27 | |||
28 | void | ||
29 | onetest(const char *name, const char *in, size_t insz, | ||
30 | int outerr, size_t outsz, wint_t out) | ||
31 | { | ||
32 | wchar_t wc; | ||
33 | size_t sz; | ||
34 | |||
35 | sz = mbrtowc(&wc, in, insz, &mbs); | ||
36 | if (errno != outerr) | ||
37 | err(1, "%zu %s(%zd)", MB_CUR_MAX, name, insz); | ||
38 | if (sz != outsz || (out != WEOF && wc != out)) | ||
39 | errx(1, "%zu %s(%zd) = (%zd, %d) != (%zd, %d)", | ||
40 | MB_CUR_MAX, name, insz, sz, wc, outsz, out); | ||
41 | if (mbsinit(&mbs) == (insz && outsz == (size_t)-2)) | ||
42 | errx(1, "%zu %s(%zd) mbsinit", MB_CUR_MAX, name, insz); | ||
43 | if (errno == 0 && outerr == 0) | ||
44 | return; | ||
45 | errno = 0; | ||
46 | memset(&mbs, 0, sizeof(mbs)); | ||
47 | } | ||
48 | |||
49 | int | ||
50 | main(void) | ||
51 | { | ||
52 | onetest("NUL", "", 0, 0, -2, WEOF); | ||
53 | onetest("NUL", "", 2, 0, 0, L'\0'); | ||
54 | onetest("BEL", "\a", 2, 0, 1, L'\a'); | ||
55 | onetest("A", "A", 2, 0, 1, L'A'); | ||
56 | onetest("DEL", "\177", 2, 0, 1, L'\177'); | ||
57 | onetest("CSI", "\233", 2, 0, 1, L'\233'); | ||
58 | |||
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 | } | ||
diff --git a/src/regress/lib/libc/locale/setlocale/Makefile b/src/regress/lib/libc/locale/setlocale/Makefile deleted file mode 100644 index 966f7926e5..0000000000 --- a/src/regress/lib/libc/locale/setlocale/Makefile +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $ | ||
2 | |||
3 | PROG = setlocale | ||
4 | |||
5 | run-regress-${PROG}: ${PROG} | ||
6 | env -i LC_ALL=fr_FR.UTF-8 ./${PROG} | ||
7 | |||
8 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libc/locale/setlocale/setlocale.c b/src/regress/lib/libc/locale/setlocale/setlocale.c deleted file mode 100644 index 82245df5c5..0000000000 --- a/src/regress/lib/libc/locale/setlocale/setlocale.c +++ /dev/null | |||
@@ -1,125 +0,0 @@ | |||
1 | /* $OpenBSD: setlocale.c,v 1.4 2018/03/29 16:34:25 schwarze Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2015 Sebastien Marie <semarie@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <err.h> | ||
19 | #include <locale.h> | ||
20 | #include <stdlib.h> | ||
21 | #include <stdio.h> | ||
22 | #include <string.h> | ||
23 | #include <ctype.h> | ||
24 | |||
25 | /* | ||
26 | * test helpers for __LINE__ | ||
27 | */ | ||
28 | #define test_setlocale(_e, _c, _l) _test_setlocale(_e, _c, _l, __LINE__) | ||
29 | #define test_MB_CUR_MAX(_e) _test_MB_CUR_MAX(_e, __LINE__) | ||
30 | #define test_isalpha(_e, _c) _test_isalpha(_e, _c, __LINE__) | ||
31 | |||
32 | |||
33 | static void | ||
34 | _test_setlocale(char *expected, int category, char *locale, int line) | ||
35 | { | ||
36 | char *result = setlocale(category, locale); | ||
37 | |||
38 | if ((expected == NULL) || (result == NULL)) { | ||
39 | if (expected == result) | ||
40 | return; | ||
41 | |||
42 | errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]", | ||
43 | line, category, locale, result, expected); | ||
44 | } | ||
45 | |||
46 | if (strcmp(expected, result) != 0) | ||
47 | errx(1, "[%d] setlocale(%d, \"%s\")=\"%s\" [expected: \"%s\"]", | ||
48 | line, category, locale, result, expected); | ||
49 | } | ||
50 | |||
51 | static void | ||
52 | _test_MB_CUR_MAX(size_t expected, int line) | ||
53 | { | ||
54 | if (MB_CUR_MAX != expected) | ||
55 | errx(1, "[%d] MB_CUR_MAX=%ld [expected %ld]", | ||
56 | line, MB_CUR_MAX, expected); | ||
57 | } | ||
58 | |||
59 | static void | ||
60 | _test_isalpha(int expected, int c, int line) | ||
61 | { | ||
62 | int result = isalpha(c); | ||
63 | if (!!result != expected) | ||
64 | errx(1, "[%d] isalpha(%d)=%d [expected %d]", | ||
65 | line, c, result, expected); | ||
66 | } | ||
67 | |||
68 | int | ||
69 | main(int argc, char *argv[]) | ||
70 | { | ||
71 | /* check initial state (should be "C") */ | ||
72 | test_setlocale("C", LC_ALL, NULL); /* check */ | ||
73 | test_MB_CUR_MAX(1); | ||
74 | test_isalpha(0, 0xe9); /* iso-8859-1 eacute */ | ||
75 | |||
76 | /* load from env */ | ||
77 | /* NOTE: we don't support non-C locales for some categories */ | ||
78 | test_setlocale("fr_FR.UTF-8", LC_CTYPE, ""); /* set */ | ||
79 | test_setlocale("fr_FR.UTF-8", LC_MESSAGES, ""); /* set */ | ||
80 | test_MB_CUR_MAX(4); | ||
81 | test_isalpha(0, 0xe9); /* iso-8859-1 eacute */ | ||
82 | |||
83 | test_setlocale("C", LC_MESSAGES, "C"); /* set */ | ||
84 | test_MB_CUR_MAX(4); | ||
85 | test_setlocale("C/fr_FR.UTF-8/C/C/C/C", LC_ALL, NULL); /* check */ | ||
86 | |||
87 | test_setlocale("C", LC_CTYPE, "C"); /* set */ | ||
88 | test_MB_CUR_MAX(1); | ||
89 | test_setlocale("C", LC_ALL, NULL); /* check */ | ||
90 | |||
91 | /* check for errors on checking */ | ||
92 | test_setlocale("C", LC_ALL, "C"); /* reset */ | ||
93 | test_setlocale(NULL, -1, NULL); | ||
94 | test_setlocale(NULL, _LC_LAST, NULL); | ||
95 | test_setlocale(NULL, _LC_LAST+0xff, NULL); | ||
96 | test_setlocale("C", LC_ALL, NULL); /* check */ | ||
97 | |||
98 | /* check for errors on setting */ | ||
99 | test_setlocale(NULL, -1, ""); | ||
100 | test_setlocale(NULL, _LC_LAST, ""); | ||
101 | test_setlocale(NULL, _LC_LAST+0xff, ""); | ||
102 | test_setlocale("C", LC_ALL, NULL); /* check */ | ||
103 | |||
104 | /* no codeset, fallback to ASCII */ | ||
105 | test_setlocale("C", LC_ALL, "C"); /* reset */ | ||
106 | test_setlocale("invalid", LC_CTYPE, "invalid"); /* set */ | ||
107 | test_setlocale("invalid", LC_CTYPE, NULL); | ||
108 | test_MB_CUR_MAX(1); | ||
109 | test_isalpha(0, 0xe9); /* iso-8859-1 eacute */ | ||
110 | |||
111 | /* with codeset */ | ||
112 | test_setlocale("C", LC_ALL, "C"); /* reset */ | ||
113 | test_setlocale("invalid.UTF-8", LC_CTYPE, "invalid.UTF-8"); /* set */ | ||
114 | test_setlocale("invalid.UTF-8", LC_CTYPE, NULL); | ||
115 | test_setlocale("C/invalid.UTF-8/C/C/C/C", LC_ALL, NULL); | ||
116 | test_MB_CUR_MAX(4); | ||
117 | |||
118 | /* with invalid codeset (is an error) */ | ||
119 | test_setlocale("C", LC_ALL, "C"); /* reset */ | ||
120 | test_setlocale(NULL, LC_CTYPE, "fr_FR.invalid"); /* set */ | ||
121 | test_setlocale("C", LC_CTYPE, NULL); | ||
122 | test_MB_CUR_MAX(1); | ||
123 | |||
124 | return (EXIT_SUCCESS); | ||
125 | } | ||
diff --git a/src/regress/lib/libc/locale/uselocale/Makefile b/src/regress/lib/libc/locale/uselocale/Makefile deleted file mode 100644 index a10471bcf6..0000000000 --- a/src/regress/lib/libc/locale/uselocale/Makefile +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.3 2017/08/16 01:40:30 schwarze Exp $ | ||
2 | |||
3 | PROG = uselocale | ||
4 | CFLAGS += -Wno-macro-redefined -Wno-int-to-pointer-cast | ||
5 | LDFLAGS += -pthread | ||
6 | |||
7 | run-regress-${PROG}: ${PROG} | ||
8 | ./${PROG} | ||
9 | |||
10 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libc/locale/uselocale/uselocale.c b/src/regress/lib/libc/locale/uselocale/uselocale.c deleted file mode 100644 index 4759eff46c..0000000000 --- a/src/regress/lib/libc/locale/uselocale/uselocale.c +++ /dev/null | |||
@@ -1,481 +0,0 @@ | |||
1 | /* $OpenBSD: uselocale.c,v 1.9 2024/02/05 06:48:04 anton Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2017, 2022 Ingo Schwarze <schwarze@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <ctype.h> | ||
19 | #include <err.h> | ||
20 | #include <errno.h> | ||
21 | #include <langinfo.h> | ||
22 | #include <locale.h> | ||
23 | #include <pthread.h> | ||
24 | #include <stdlib.h> | ||
25 | #include <string.h> | ||
26 | #include <wchar.h> | ||
27 | #include <wctype.h> | ||
28 | |||
29 | /* Keep in sync with /usr/src/lib/libc/locale/rune.h. */ | ||
30 | #define _LOCALE_NONE (locale_t)0 | ||
31 | #define _LOCALE_C (locale_t)1 | ||
32 | #define _LOCALE_UTF8 (locale_t)2 | ||
33 | #define _LOCALE_BAD (locale_t)3 | ||
34 | |||
35 | /* Options for switch_thread() below. */ | ||
36 | #define SWITCH_SIGNAL 1 /* Call pthread_cond_signal(3). */ | ||
37 | #define SWITCH_WAIT 2 /* Call pthread_cond_timedwait(3). */ | ||
38 | |||
39 | /* Options for TESTFUNC(). */ | ||
40 | #define TOPT_ERR (1 << 0) | ||
41 | |||
42 | /* | ||
43 | * Generate one test function for a specific interface. | ||
44 | * Fn = function name | ||
45 | * Ft = function return type | ||
46 | * FUNCPARA = function parameter list with types and names | ||
47 | * FUNCARGS = function argument list, names only, no types | ||
48 | * Af = format string to print the arguments | ||
49 | * Rf = format string to print the return value | ||
50 | * Op = options for the test function, see above | ||
51 | * line = source code line number in this test file | ||
52 | * ee = expected error number | ||
53 | * er = expected return value | ||
54 | * ar = actual return value | ||
55 | * errno = actual error number (global) | ||
56 | */ | ||
57 | #define TESTFUNC(Fn, Ft, Af, Rf, Op) \ | ||
58 | static void \ | ||
59 | _test_##Fn(int line, int ee, Ft er, FUNCPARA) \ | ||
60 | { \ | ||
61 | Ft ar; \ | ||
62 | errno = 0; \ | ||
63 | ar = Fn(FUNCARGS); \ | ||
64 | if (ar != er) \ | ||
65 | errx(1, "[%d] %s(" Af ")=" Rf " [exp: " Rf "]", \ | ||
66 | line, #Fn, FUNCARGS, ar, er); \ | ||
67 | if (Op & TOPT_ERR && errno != ee) \ | ||
68 | errx(1, "[%d] %s(" Af ") errno=%d [exp: %d]", \ | ||
69 | line, #Fn, FUNCARGS, errno, ee); \ | ||
70 | } | ||
71 | |||
72 | #define STRTESTFUNC(Fn, Af) \ | ||
73 | static void \ | ||
74 | _test_##Fn(int line, int ee, const char *er, FUNCPARA) \ | ||
75 | { \ | ||
76 | const char *ar; \ | ||
77 | errno = 0; \ | ||
78 | ar = Fn(FUNCARGS); \ | ||
79 | if (er == NULL) \ | ||
80 | er = "NULL"; \ | ||
81 | if (ar == NULL) \ | ||
82 | ar = "NULL"; \ | ||
83 | if (strcmp((const char *)er, (const char *)ar) != 0) \ | ||
84 | errx(1, "[%d] %s(" Af ")=%s [exp: %s]", \ | ||
85 | line, #Fn, FUNCARGS, ar, er); \ | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Test functions for all tested interfaces. | ||
90 | */ | ||
91 | #define FUNCPARA int mask, const char *locname | ||
92 | #define FUNCARGS mask, locname, _LOCALE_NONE | ||
93 | TESTFUNC(newlocale, locale_t, "%d, %s, %p", "%p", TOPT_ERR) | ||
94 | |||
95 | #define FUNCPARA locale_t locale | ||
96 | #define FUNCARGS locale | ||
97 | TESTFUNC(duplocale, locale_t, "%p", "%p", TOPT_ERR) | ||
98 | TESTFUNC(uselocale, locale_t, "%p", "%p", TOPT_ERR) | ||
99 | |||
100 | #define FUNCPARA int category, char *locname | ||
101 | #define FUNCARGS category, locname | ||
102 | STRTESTFUNC(setlocale, "%d, %s") | ||
103 | |||
104 | #define FUNCPARA nl_item item | ||
105 | #define FUNCARGS item | ||
106 | STRTESTFUNC(nl_langinfo, "%ld") | ||
107 | |||
108 | #define FUNCPARA nl_item item, locale_t locale | ||
109 | #define FUNCARGS item, locale | ||
110 | STRTESTFUNC(nl_langinfo_l, "%ld, %p") | ||
111 | |||
112 | #define FUNCPARA int c | ||
113 | #define FUNCARGS c | ||
114 | TESTFUNC(isalpha, int, "0x%.2x", "%d", 0) | ||
115 | TESTFUNC(tolower, int, "0x%.2x", "0x%.2x", 0) | ||
116 | |||
117 | #define FUNCPARA int c, locale_t locale | ||
118 | #define FUNCARGS c, locale | ||
119 | TESTFUNC(isalpha_l, int, "0x%.2x, %p", "%d", 0) | ||
120 | TESTFUNC(tolower_l, int, "0x%.2x, %p", "0x%.2x", 0) | ||
121 | |||
122 | #define FUNCPARA wint_t wc | ||
123 | #define FUNCARGS wc | ||
124 | TESTFUNC(iswalpha, int, "U+%.4X", "%d", 0) | ||
125 | TESTFUNC(towupper, wint_t, "U+%.4X", "U+%.4X", 0) | ||
126 | |||
127 | #define FUNCPARA wint_t wc, locale_t locale | ||
128 | #define FUNCARGS wc, locale | ||
129 | TESTFUNC(iswalpha_l, int, "U+%.4X, %p", "%d", 0) | ||
130 | TESTFUNC(towupper_l, wint_t, "U+%.4X, %p", "U+%.4X", 0) | ||
131 | |||
132 | #define FUNCPARA wint_t wc, wctype_t charclass | ||
133 | #define FUNCARGS wc, charclass | ||
134 | TESTFUNC(iswctype, int, "U+%.4X, %p", "%d", 0) | ||
135 | |||
136 | #define FUNCPARA wint_t wc, wctype_t charclass, locale_t locale | ||
137 | #define FUNCARGS wc, charclass, locale | ||
138 | TESTFUNC(iswctype_l, int, "U+%.4X, %p, %p", "%d", 0) | ||
139 | |||
140 | #define FUNCPARA wint_t wc, wctrans_t charmap | ||
141 | #define FUNCARGS wc, charmap | ||
142 | TESTFUNC(towctrans, wint_t, "U+%.4X, %p", "U+%.4X", 0) | ||
143 | |||
144 | #define FUNCPARA wint_t wc, wctrans_t charmap, locale_t locale | ||
145 | #define FUNCARGS wc, charmap, locale | ||
146 | TESTFUNC(towctrans_l, wint_t, "U+%.4X, %p, %p", "U+%.4X", 0) | ||
147 | |||
148 | #define FUNCPARA const wchar_t *s1, const wchar_t *s2 | ||
149 | #define FUNCARGS s1, s2 | ||
150 | TESTFUNC(wcscasecmp, int, "%ls, %ls", "%d", 0) | ||
151 | |||
152 | #define FUNCPARA const wchar_t *s1, const wchar_t *s2, locale_t locale | ||
153 | #define FUNCARGS s1, s2, locale | ||
154 | TESTFUNC(wcscasecmp_l, int, "%ls, %ls, %p", "%d", 0) | ||
155 | |||
156 | #define FUNCPARA const wchar_t *s1, const wchar_t *s2, size_t len | ||
157 | #define FUNCARGS s1, s2, len | ||
158 | TESTFUNC(wcsncasecmp, int, "%ls, %ls, %zu", "%d", 0) | ||
159 | |||
160 | #define FUNCPARA const wchar_t *s1, const wchar_t *s2, size_t len, \ | ||
161 | locale_t locale | ||
162 | #define FUNCARGS s1, s2, len, locale | ||
163 | TESTFUNC(wcsncasecmp_l, int, "%ls, %ls, %zu, %p", "%d", 0) | ||
164 | |||
165 | static void | ||
166 | _test_MB_CUR_MAX(int line, int ee, size_t ar) | ||
167 | { | ||
168 | if (MB_CUR_MAX != ar) | ||
169 | errx(1, "[%d] MB_CUR_MAX=%zd [exp: %zd]", | ||
170 | line, MB_CUR_MAX, ar); | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * Test macros: | ||
175 | * TEST_R(funcname, er, arguments) if you expect errno == 0. | ||
176 | * TEST_ER(funcname, ee, er, arguments) otherwise. | ||
177 | */ | ||
178 | #define TEST_R(Fn, ...) _test_##Fn(__LINE__, 0, __VA_ARGS__) | ||
179 | #define TEST_ER(Fn, ...) _test_##Fn(__LINE__, __VA_ARGS__) | ||
180 | |||
181 | static pthread_mutex_t mtx; | ||
182 | static pthread_mutexattr_t mtxattr; | ||
183 | static pthread_cond_t cond; | ||
184 | |||
185 | /* | ||
186 | * SWITCH_SIGNAL wakes the other thread. | ||
187 | * SWITCH_WAIT goes to sleep. | ||
188 | * Both can be combined. | ||
189 | * The step argument is used for error reporting only. | ||
190 | */ | ||
191 | static void | ||
192 | switch_thread(int step, int flags) | ||
193 | { | ||
194 | struct timespec t; | ||
195 | int irc; | ||
196 | |||
197 | if (flags & SWITCH_SIGNAL) { | ||
198 | if ((irc = pthread_cond_signal(&cond)) != 0) | ||
199 | errc(1, irc, "pthread_cond_signal(%d)", step); | ||
200 | } | ||
201 | if (flags & SWITCH_WAIT) { | ||
202 | if ((irc = pthread_mutex_trylock(&mtx)) != 0) | ||
203 | errc(1, irc, "pthread_mutex_trylock(%d)", step); | ||
204 | t.tv_sec = time(NULL) + 2; | ||
205 | t.tv_nsec = 0; | ||
206 | if ((irc = pthread_cond_timedwait(&cond, &mtx, &t)) != 0) | ||
207 | errc(1, irc, "pthread_cond_timedwait(%d)", step); | ||
208 | if ((irc = pthread_mutex_unlock(&mtx)) != 0) | ||
209 | errc(1, irc, "pthread_mutex_unlock(%d)", step); | ||
210 | } | ||
211 | } | ||
212 | |||
213 | static void * | ||
214 | child_func(void *arg) | ||
215 | { | ||
216 | const wchar_t s1[] = { 0x00C7, 0x00E0, 0x0000 }; | ||
217 | const wchar_t s2[] = { 0x00E7, 0x00C0, 0x0000 }; | ||
218 | const wchar_t s3[] = { 0x00C9, 0x0074, 0x00C9, 0x0000 }; | ||
219 | const wchar_t s4[] = { 0x00E9, 0x0054, 0x00CC, 0x0000 }; | ||
220 | wctype_t wctyg, wctyu, wctyc; | ||
221 | wctrans_t wctrg, wctru, wctrc; | ||
222 | char *sego, *segc, *selo, *selc; | ||
223 | |||
224 | /* Test invalid newlocale(3) arguments. */ | ||
225 | TEST_ER(newlocale, EINVAL, _LOCALE_NONE, LC_CTYPE_MASK, NULL); | ||
226 | TEST_R(MB_CUR_MAX, 1); | ||
227 | TEST_ER(newlocale, EINVAL, _LOCALE_NONE, LC_ALL_MASK + 1, "C.UTF-8"); | ||
228 | TEST_R(MB_CUR_MAX, 1); | ||
229 | TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_COLLATE_MASK, "C.INV"); | ||
230 | TEST_R(MB_CUR_MAX, 1); | ||
231 | setenv("LC_TIME", "C.INV", 1); | ||
232 | TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_TIME_MASK, ""); | ||
233 | unsetenv("LC_TIME"); | ||
234 | TEST_R(MB_CUR_MAX, 1); | ||
235 | setenv("LC_CTYPE", "C.INV", 1); | ||
236 | TEST_ER(newlocale, ENOENT, _LOCALE_NONE, LC_CTYPE_MASK, ""); | ||
237 | TEST_R(MB_CUR_MAX, 1); | ||
238 | |||
239 | /* Test duplocale(3). */ | ||
240 | TEST_ER(duplocale, EINVAL, _LOCALE_NONE, _LOCALE_UTF8); | ||
241 | TEST_R(duplocale, _LOCALE_C, _LOCALE_C); | ||
242 | TEST_R(duplocale, _LOCALE_C, LC_GLOBAL_LOCALE); | ||
243 | |||
244 | /* Test premature UTF-8 uselocale(3). */ | ||
245 | TEST_ER(uselocale, EINVAL, _LOCALE_NONE, _LOCALE_UTF8); | ||
246 | TEST_R(MB_CUR_MAX, 1); | ||
247 | TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE); | ||
248 | |||
249 | /* Test UTF-8 initialization. */ | ||
250 | setenv("LC_CTYPE", "C.UTF-8", 1); | ||
251 | TEST_R(newlocale, _LOCALE_UTF8, LC_CTYPE_MASK, ""); | ||
252 | unsetenv("LC_CTYPE"); | ||
253 | TEST_R(MB_CUR_MAX, 1); | ||
254 | TEST_R(duplocale, _LOCALE_UTF8, _LOCALE_UTF8); | ||
255 | |||
256 | /* Test invalid uselocale(3) argument. */ | ||
257 | TEST_ER(uselocale, EINVAL, _LOCALE_NONE, _LOCALE_BAD); | ||
258 | TEST_R(MB_CUR_MAX, 1); | ||
259 | TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE); | ||
260 | TEST_R(nl_langinfo, "US-ASCII", CODESET); | ||
261 | TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8); | ||
262 | TEST_R(iswalpha, 0, 0x00E9); | ||
263 | TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8); | ||
264 | TEST_R(towupper, 0x00E9, 0x00E9); | ||
265 | TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8); | ||
266 | TEST_R(wcscasecmp, *s1 - *s2, s1, s2); | ||
267 | TEST_R(wcscasecmp_l, 0, s1, s2, _LOCALE_UTF8); | ||
268 | |||
269 | /* Test switching the thread locale. */ | ||
270 | TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_UTF8); | ||
271 | TEST_R(MB_CUR_MAX, 4); | ||
272 | TEST_R(uselocale, _LOCALE_UTF8, _LOCALE_NONE); | ||
273 | TEST_R(nl_langinfo, "UTF-8", CODESET); | ||
274 | TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8); | ||
275 | TEST_R(nl_langinfo_l, "US-ASCII", CODESET, _LOCALE_C); | ||
276 | TEST_R(isalpha, _CTYPE_L, 0x65); /* e */ | ||
277 | TEST_R(isalpha_l, _CTYPE_L, 0x65, _LOCALE_UTF8); | ||
278 | TEST_R(isalpha_l, _CTYPE_L, 0x65, _LOCALE_C); | ||
279 | TEST_R(isalpha_l, _CTYPE_L, 0x65, _LOCALE_C); | ||
280 | TEST_R(isalpha, 0, 0x30); /* 0 */ | ||
281 | TEST_R(isalpha_l, 0, 0x30, _LOCALE_UTF8); | ||
282 | TEST_R(isalpha_l, 0, 0x30, _LOCALE_C); | ||
283 | TEST_R(tolower, 0x61, 0x41); /* A */ | ||
284 | TEST_R(tolower_l, 0x61, 0x41, _LOCALE_UTF8); | ||
285 | TEST_R(tolower_l, 0x61, 0x41, _LOCALE_C); | ||
286 | TEST_R(tolower, 0x40, 0x40); /* @ */ | ||
287 | TEST_R(tolower_l, 0x40, 0x40, _LOCALE_UTF8); | ||
288 | TEST_R(tolower_l, 0x40, 0x40, _LOCALE_C); | ||
289 | TEST_R(iswalpha, 1, 0x00E9); /* e accent aigu */ | ||
290 | TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8); | ||
291 | TEST_R(iswalpha_l, 0, 0x00E9, _LOCALE_C); | ||
292 | TEST_R(iswalpha, 1, 0x0153); /* ligature oe */ | ||
293 | TEST_R(iswalpha_l, 1, 0x0153, _LOCALE_UTF8); | ||
294 | TEST_R(iswalpha_l, 0, 0x0153, _LOCALE_C); | ||
295 | TEST_R(iswalpha, 0, 0x2200); /* for all */ | ||
296 | TEST_R(iswalpha_l, 0, 0x2200, _LOCALE_UTF8); | ||
297 | TEST_R(iswalpha_l, 0, 0x2200, _LOCALE_C); | ||
298 | TEST_R(towupper, 0x00C9, 0x00E9); | ||
299 | TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8); | ||
300 | TEST_R(towupper_l, 0x00E9, 0x00E9, _LOCALE_C); | ||
301 | TEST_R(towupper, 0x0152, 0x0153); | ||
302 | TEST_R(towupper_l, 0x0152, 0x0153, _LOCALE_UTF8); | ||
303 | TEST_R(towupper_l, 0x0153, 0x0153, _LOCALE_C); | ||
304 | TEST_R(towupper, 0x2205, 0x2205); | ||
305 | TEST_R(towupper_l, 0x2205, 0x2205, _LOCALE_UTF8); | ||
306 | TEST_R(towupper_l, 0x2205, 0x2205, _LOCALE_C); | ||
307 | wctyg = wctype("upper"); | ||
308 | if (wctyg == NULL) | ||
309 | errx(1, "wctype(upper) == NULL"); | ||
310 | wctyu = wctype_l("upper", _LOCALE_UTF8); | ||
311 | if (wctyu == NULL) | ||
312 | errx(1, "wctype_l(upper, UTF-8) == NULL"); | ||
313 | if (wctyg != wctyu) | ||
314 | errx(1, "wctype global != UTF-8"); | ||
315 | wctyc = wctype_l("upper", _LOCALE_C); | ||
316 | if (wctyc == NULL) | ||
317 | errx(1, "wctype_l(upper, C) == NULL"); | ||
318 | TEST_R(iswctype, 1, 0x00D0, wctyg); /* Eth */ | ||
319 | TEST_R(iswctype_l, 1, 0x00D0, wctyu, _LOCALE_UTF8); | ||
320 | TEST_R(iswctype_l, 0, 0x00D0, wctyc, _LOCALE_C); | ||
321 | TEST_R(iswctype, 1, 0x0393, wctyg); /* Gamma */ | ||
322 | TEST_R(iswctype_l, 1, 0x0393, wctyu, _LOCALE_UTF8); | ||
323 | TEST_R(iswctype_l, 0, 0x0393, wctyc, _LOCALE_C); | ||
324 | TEST_R(iswctype, 0, 0x2205, wctyg); /* empty set */ | ||
325 | TEST_R(iswctype_l, 0, 0x2205, wctyu, _LOCALE_UTF8); | ||
326 | TEST_R(iswctype_l, 0, 0x2205, wctyc, _LOCALE_C); | ||
327 | wctrg = wctrans("tolower"); | ||
328 | if (wctrg == NULL) | ||
329 | errx(1, "wctrans(tolower) == NULL"); | ||
330 | wctru = wctrans_l("tolower", _LOCALE_UTF8); | ||
331 | if (wctru == NULL) | ||
332 | errx(1, "wctrans(tolower, UTF-8) == NULL"); | ||
333 | if (wctrg != wctru) | ||
334 | errx(1, "wctrans global != UTF-8"); | ||
335 | wctrc = wctrans_l("tolower", _LOCALE_C); | ||
336 | if (wctrc == NULL) | ||
337 | errx(1, "wctrans(tolower, C) == NULL"); | ||
338 | TEST_R(towctrans, 0x00FE, 0x00DE, wctrg); /* Thorn */ | ||
339 | TEST_R(towctrans_l, 0x00FE, 0x00DE, wctru, _LOCALE_UTF8); | ||
340 | TEST_R(towctrans_l, 0x00DE, 0x00DE, wctrc, _LOCALE_C); | ||
341 | TEST_R(towctrans, 0x03C6, 0x03A6, wctrg); /* Phi */ | ||
342 | TEST_R(towctrans_l, 0x03C6, 0x03A6, wctru, _LOCALE_UTF8); | ||
343 | TEST_R(towctrans_l, 0x03A6, 0x03A6, wctrc, _LOCALE_C); | ||
344 | TEST_R(towctrans, 0x2207, 0x2207, wctrg); /* Nabla */ | ||
345 | TEST_R(towctrans_l, 0x2207, 0x2207, wctru, _LOCALE_UTF8); | ||
346 | TEST_R(towctrans_l, 0x2207, 0x2207, wctrc, _LOCALE_C); | ||
347 | TEST_R(wcscasecmp, 0, s1, s2); | ||
348 | TEST_R(wcscasecmp_l, 0, s1, s2, _LOCALE_UTF8); | ||
349 | TEST_R(wcscasecmp_l, *s1 - *s2, s1, s2, _LOCALE_C); | ||
350 | TEST_R(wcsncasecmp, 0, s3, s4, 2); | ||
351 | TEST_R(wcsncasecmp_l, 0, s3, s4, 2, _LOCALE_UTF8); | ||
352 | TEST_R(wcsncasecmp_l, *s3 - *s4, s3, s4, 2, _LOCALE_C); | ||
353 | |||
354 | /* Test non-ctype newlocale(3). */ | ||
355 | TEST_R(newlocale, _LOCALE_C, LC_MESSAGES_MASK, "en_US.UTF-8"); | ||
356 | |||
357 | /* Test strerror(3). */ | ||
358 | sego = strerror(EPERM); | ||
359 | segc = strdup(sego); | ||
360 | selo = strerror_l(ENOENT, _LOCALE_C); | ||
361 | selc = strdup(selo); | ||
362 | if (strcmp(sego, segc) != 0) | ||
363 | errx(1, "child: strerror_l clobbered strerror"); | ||
364 | free(segc); | ||
365 | sego = strerror(ESRCH); | ||
366 | if (strcmp(selo, selc) != 0) | ||
367 | errx(1, "child: strerror clobbered strerror_l"); | ||
368 | |||
369 | /* Temporarily switch to the main thread. */ | ||
370 | switch_thread(2, SWITCH_SIGNAL | SWITCH_WAIT); | ||
371 | if (strcmp(selo, selc) != 0) | ||
372 | errx(1, "child: main clobbered strerror_l"); | ||
373 | free(selc); | ||
374 | |||
375 | /* Check that the C locale works even while all is set to UTF-8. */ | ||
376 | TEST_R(nl_langinfo_l, "US-ASCII", CODESET, _LOCALE_C); | ||
377 | TEST_R(iswalpha_l, 0, 0x00E9, _LOCALE_C); | ||
378 | TEST_R(towupper_l, 0x00E9, 0x00E9, _LOCALE_C); | ||
379 | TEST_R(wcscasecmp_l, *s1 - *s2, s1, s2, _LOCALE_C); | ||
380 | |||
381 | /* Test displaying the global locale while a local one is set. */ | ||
382 | TEST_R(setlocale, "C/C.UTF-8/C/C/C/C", LC_ALL, NULL); | ||
383 | |||
384 | /* Test switching the thread locale back. */ | ||
385 | TEST_R(MB_CUR_MAX, 4); | ||
386 | TEST_R(duplocale, _LOCALE_UTF8, LC_GLOBAL_LOCALE); | ||
387 | TEST_R(uselocale, _LOCALE_UTF8, _LOCALE_C); | ||
388 | TEST_R(MB_CUR_MAX, 1); | ||
389 | TEST_R(uselocale, _LOCALE_C, _LOCALE_NONE); | ||
390 | |||
391 | /* Check that UTF-8 works even with a C thread locale. */ | ||
392 | TEST_R(nl_langinfo, "US-ASCII", CODESET); | ||
393 | TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8); | ||
394 | TEST_R(iswalpha, 0, 0x0153); | ||
395 | TEST_R(iswalpha_l, 1, 0x0153, _LOCALE_UTF8); | ||
396 | TEST_R(towupper, 0x0153, 0x0153); | ||
397 | TEST_R(towupper_l, 0x0152, 0x0153, _LOCALE_UTF8); | ||
398 | TEST_R(wcsncasecmp, *s3 - *s4, s3, s4, 2); | ||
399 | TEST_R(wcsncasecmp_l, 0, s3, s4, 2, _LOCALE_UTF8); | ||
400 | |||
401 | /* Test switching back to the global locale. */ | ||
402 | TEST_R(uselocale, _LOCALE_C, LC_GLOBAL_LOCALE); | ||
403 | TEST_R(MB_CUR_MAX, 4); | ||
404 | TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE); | ||
405 | |||
406 | /* Check that the global locale takes effect even in a thread. */ | ||
407 | TEST_R(nl_langinfo, "UTF-8", CODESET); | ||
408 | TEST_R(iswalpha, 1, 0x0153); | ||
409 | TEST_R(towupper, 0x0152, 0x0153); | ||
410 | TEST_R(wcscasecmp, 0, s1, s2); | ||
411 | |||
412 | /* Hand control back to the main thread. */ | ||
413 | switch_thread(4, SWITCH_SIGNAL); | ||
414 | return NULL; | ||
415 | } | ||
416 | |||
417 | int | ||
418 | main(void) | ||
419 | { | ||
420 | pthread_t child_thread; | ||
421 | char *sego, *segc, *selo, *selc; | ||
422 | int irc; | ||
423 | |||
424 | /* Initialize environment. */ | ||
425 | unsetenv("LC_ALL"); | ||
426 | unsetenv("LC_COLLATE"); | ||
427 | unsetenv("LC_CTYPE"); | ||
428 | unsetenv("LC_MONETARY"); | ||
429 | unsetenv("LC_NUMERIC"); | ||
430 | unsetenv("LC_TIME"); | ||
431 | unsetenv("LC_MESSAGES"); | ||
432 | unsetenv("LANG"); | ||
433 | |||
434 | if ((irc = pthread_mutexattr_init(&mtxattr)) != 0) | ||
435 | errc(1, irc, "pthread_mutexattr_init"); | ||
436 | if ((irc = pthread_mutexattr_settype(&mtxattr, | ||
437 | PTHREAD_MUTEX_STRICT_NP)) != 0) | ||
438 | errc(1, irc, "pthread_mutexattr_settype"); | ||
439 | if ((irc = pthread_mutex_init(&mtx, &mtxattr)) != 0) | ||
440 | errc(1, irc, "pthread_mutex_init"); | ||
441 | if ((irc = pthread_cond_init(&cond, NULL)) != 0) | ||
442 | errc(1, irc, "pthread_cond_init"); | ||
443 | |||
444 | /* First let the child do some tests. */ | ||
445 | if ((irc = pthread_create(&child_thread, NULL, child_func, NULL)) != 0) | ||
446 | errc(1, irc, "pthread_create"); | ||
447 | switch_thread(1, SWITCH_WAIT); | ||
448 | |||
449 | /* Check that the global locale is undisturbed. */ | ||
450 | TEST_R(setlocale, "C", LC_ALL, NULL); | ||
451 | TEST_R(MB_CUR_MAX, 1); | ||
452 | |||
453 | /* Check that *_l(3) works without any locale installed. */ | ||
454 | TEST_R(nl_langinfo_l, "UTF-8", CODESET, _LOCALE_UTF8); | ||
455 | TEST_R(iswalpha_l, 1, 0x00E9, _LOCALE_UTF8); | ||
456 | TEST_R(towupper_l, 0x00C9, 0x00E9, _LOCALE_UTF8); | ||
457 | |||
458 | /* Test setting the globale locale. */ | ||
459 | TEST_R(setlocale, "C.UTF-8", LC_CTYPE, "C.UTF-8"); | ||
460 | TEST_R(MB_CUR_MAX, 4); | ||
461 | TEST_R(uselocale, LC_GLOBAL_LOCALE, _LOCALE_NONE); | ||
462 | |||
463 | /* Test strerror(3). */ | ||
464 | sego = strerror(EINTR); | ||
465 | segc = strdup(sego); | ||
466 | selo = strerror_l(EIO, _LOCALE_C); | ||
467 | selc = strdup(selo); | ||
468 | if (strcmp(sego, segc) != 0) | ||
469 | errx(1, "main: strerror_l clobbered strerror"); | ||
470 | free(segc); | ||
471 | sego = strerror(ENXIO); | ||
472 | if (strcmp(selo, selc) != 0) | ||
473 | errx(1, "main: strerror clobbered strerror_l"); | ||
474 | free(selc); | ||
475 | |||
476 | /* Let the child do some more tests, then clean up. */ | ||
477 | switch_thread(3, SWITCH_SIGNAL); | ||
478 | if ((irc = pthread_join(child_thread, NULL)) != 0) | ||
479 | errc(1, irc, "pthread_join"); | ||
480 | return 0; | ||
481 | } | ||
diff --git a/src/regress/lib/libc/locale/wcrtomb/Makefile b/src/regress/lib/libc/locale/wcrtomb/Makefile deleted file mode 100644 index b09cecc454..0000000000 --- a/src/regress/lib/libc/locale/wcrtomb/Makefile +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | # $OpenBSD: Makefile,v 1.2 2017/07/27 15:08:37 bluhm Exp $ | ||
2 | |||
3 | PROG = test_wcrtomb | ||
4 | |||
5 | .include <bsd.regress.mk> | ||
diff --git a/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c b/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c deleted file mode 100644 index ee0e14b69d..0000000000 --- a/src/regress/lib/libc/locale/wcrtomb/test_wcrtomb.c +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* $OpenBSD: test_wcrtomb.c,v 1.3 2021/07/03 12:04:53 schwarze Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <sys/types.h> | ||
19 | #include <err.h> | ||
20 | #include <errno.h> | ||
21 | #include <limits.h> | ||
22 | #include <locale.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <string.h> | ||
25 | #include <wchar.h> | ||
26 | |||
27 | static mbstate_t mbs; | ||
28 | |||
29 | void | ||
30 | onetest(const char *name, const wchar_t wcin, int outerr, const char *out) | ||
31 | { | ||
32 | char buf[MB_LEN_MAX]; | ||
33 | size_t sz, outsz; | ||
34 | |||
35 | memset(buf, 0, MB_LEN_MAX); | ||
36 | outsz = out == NULL ? (size_t)-1 : *out == '\0' ? 1 : strlen(out); | ||
37 | sz = wcrtomb(buf, wcin, &mbs); | ||
38 | if (errno != outerr) | ||
39 | err(1, "%zu %s U+%04X", MB_CUR_MAX, name, wcin); | ||
40 | if (sz != outsz || (out != NULL && strncmp(buf, out, sz))) | ||
41 | errx(1, "%zu %s U+%04X: %4.4s(%zd) != %4.4s(%zd)", | ||
42 | MB_CUR_MAX, name, wcin, buf, sz, | ||
43 | out == NULL ? "(NULL)" : out, outsz); | ||
44 | if (mbsinit(&mbs) == 0) | ||
45 | errx(1, "%zu %s U+%04X mbsinit", MB_CUR_MAX, name, wcin); | ||
46 | if (errno == 0 && outerr == 0) | ||
47 | return; | ||
48 | errno = 0; | ||
49 | memset(&mbs, 0, sizeof(mbs)); | ||
50 | } | ||
51 | |||
52 | int | ||
53 | main(void) | ||
54 | { | ||
55 | onetest("NUL", L'\0', 0, ""); | ||
56 | onetest("BEL", L'\a', 0, "\a"); | ||
57 | onetest("A", L'A', 0, "A"); | ||
58 | onetest("DEL", L'\177', 0, "\177"); | ||
59 | onetest("CSI", L'\233', 0, "\233"); | ||
60 | onetest("0x100", 0x100, EILSEQ, NULL); | ||
61 | |||
62 | if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) | ||
63 | errx(1, "setlocale(UTF-8) failed"); | ||
64 | |||
65 | onetest("NUL", L'\0', 0, ""); | ||
66 | onetest("BEL", L'\a', 0, "\a"); | ||
67 | onetest("A", L'A', 0, "A"); | ||
68 | onetest("DEL", L'\177', 0, "\177"); | ||
69 | onetest("CSI", L'\233', 0, "\302\233"); | ||
70 | onetest("0xe9", 0xe9, 0, "\303\251"); | ||
71 | onetest("0xcfff", 0xcfff, 0, "\354\277\277"); | ||
72 | onetest("0xd800", 0xd800, EILSEQ, NULL); | ||
73 | |||
74 | if (setlocale(LC_CTYPE, "POSIX") == NULL) | ||
75 | errx(1, "setlocale(POSIX) failed"); | ||
76 | |||
77 | onetest("0xff", L'\377', 0, "\377"); | ||
78 | |||
79 | if (setlocale(LC_CTYPE, "en_US.UTF-8") == NULL) | ||
80 | errx(1, "second setlocale(UTF-8) failed"); | ||
81 | |||
82 | onetest("U+13000", 0x13000, 0, "\360\223\200\200"); | ||
83 | |||
84 | return 0; | ||
85 | } | ||