I still see a test failure on FreeBSD 13.2, in the zh_CN.GB18030 locale.
The cause is a partial but not complete upper/lower mapping of 'ü' in
this locale, as evidenced by the attached file. This patch fixes it.
2023-07-23 Bruno Haible <[email protected]>
fnmatch tests: Avoid a test failure on FreeBSD.
* tests/test-fnmatch.c (main): In a GB18030 locale, test the towupper()
mapping of 'ö', not of 'ü'.
diff --git a/tests/test-fnmatch.c b/tests/test-fnmatch.c
index 5d5535fda5..b6ffc65539 100644
--- a/tests/test-fnmatch.c
+++ b/tests/test-fnmatch.c
@@ -941,7 +941,7 @@ main (int argc, char *argv[])
mbstate_t state;
wchar_t wc;
memset (&state, 0, sizeof (mbstate_t));
- if (mbrtowc (&wc, "\250\271", 2, &state) == 2
+ if (mbrtowc (&wc, "\201\060\213\062", 4, &state) == 4
&& towupper (wc) != wc)
{
ASSERT (fnmatch ("\201\060\213\062zg\250\271r",
"\201\060\211\060ZG\201\060\211\065R", FNM_CASEFOLD) == 0);
#include <fnmatch.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include <wctype.h>
int main (int argc, char *argv[]) {
if (setlocale (LC_ALL, "zh_CN.GB18030") == NULL)
return 1;
mbstate_t state;
wchar_t wc1;
wchar_t wc2;
wchar_t wc3;
wchar_t wc4;
memset (&state, 0, sizeof (mbstate_t));
printf ("mbrtowc (&wc1) -> %d\n", (int) mbrtowc (&wc1, "\201\060\213\062", 4, &state));
memset (&state, 0, sizeof (mbstate_t));
printf ("mbrtowc (&wc2) -> %d\n", (int) mbrtowc (&wc2, "\201\060\211\060", 4, &state));
memset (&state, 0, sizeof (mbstate_t));
printf ("mbrtowc (&wc3) -> %d\n", (int) mbrtowc (&wc3, "\250\271", 2, &state));
memset (&state, 0, sizeof (mbstate_t));
printf ("mbrtowc (&wc4) -> %d\n", (int) mbrtowc (&wc4, "\201\060\211\065", 4, &state));
printf ("wc1 = 0x%04X, tolower -> 0x%04X, toupper -> 0x%04X\n",
(unsigned int) wc1, (unsigned int) towlower (wc1), (unsigned int) towupper (wc1));
printf ("wc2 = 0x%04X, tolower -> 0x%04X, toupper -> 0x%04X\n",
(unsigned int) wc2, (unsigned int) towlower (wc2), (unsigned int) towupper (wc2));
printf ("wc3 = 0x%04X, tolower -> 0x%04X, toupper -> 0x%04X\n",
(unsigned int) wc3, (unsigned int) towlower (wc3), (unsigned int) towupper (wc3));
printf ("wc4 = 0x%04X, tolower -> 0x%04X, toupper -> 0x%04X\n",
(unsigned int) wc4, (unsigned int) towlower (wc4), (unsigned int) towupper (wc4));
printf ("fnmatch (wc1 wc3, wc2 wc4, FNM_CASEFOLD) -> %d\n",
fnmatch ("\201\060\213\062zg\250\271r", "\201\060\211\060ZG\201\060\211\065R", FNM_CASEFOLD));
}
/* Output:
FreeBSD 13.2, locale "zh_CN.GB18030":
mbrtowc (&wc1) -> 4
mbrtowc (&wc2) -> 4
mbrtowc (&wc3) -> 2
mbrtowc (&wc4) -> 4
wc1 = 0x1308B32, tolower -> 0x1308B32, toupper -> 0x1308B32
wc2 = 0x1308930, tolower -> 0x1308930, toupper -> 0x1308930
wc3 = 0xA8B9, tolower -> 0xA8B9, toupper -> 0x1308935
wc4 = 0x1308935, tolower -> 0x1308935, toupper -> 0x1308935
fnmatch (wc1 wc3, wc2 wc4, FNM_CASEFOLD) -> 1
NetBSD 9.3, locale "zh_CN.GB18030":
mbrtowc (&wc1) -> 4
mbrtowc (&wc2) -> 4
mbrtowc (&wc3) -> 2
mbrtowc (&wc4) -> 4
wc1 = 0x81308B32, tolower -> 0x81308B32, toupper -> 0x81308930
wc2 = 0x81308930, tolower -> 0x81308B32, toupper -> 0x81308930
wc3 = 0xA8B9, tolower -> 0xA8B9, toupper -> 0x81308935
wc4 = 0x81308935, tolower -> 0xA8B9, toupper -> 0x81308935
fnmatch (wc1 wc3, wc2 wc4, FNM_CASEFOLD) -> 1
Solaris 11.4, locale "zh_CN.GB18030":
mbrtowc (&wc1) -> 4
mbrtowc (&wc2) -> 4
mbrtowc (&wc3) -> 2
mbrtowc (&wc4) -> 4
wc1 = 0x5EEA, tolower -> 0x5EEA, toupper -> 0x5EEA
wc2 = 0x5ED4, tolower -> 0x5ED4, toupper -> 0x5ED4
wc3 = 0x1E6A, tolower -> 0x1E6A, toupper -> 0x1E6A
wc4 = 0x5ED9, tolower -> 0x5ED9, toupper -> 0x5ED9
fnmatch (wc1 wc3, wc2 wc4, FNM_CASEFOLD) -> 1
*/