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
*/

Reply via email to