(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-fnmatch-w32.c
       1  /* Test of fnmatch string matching function.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  #include <fnmatch.h>
      20  
      21  #include <locale.h>
      22  #include <stdio.h>
      23  #include <stdlib.h>
      24  #include <string.h>
      25  #include <wchar.h>
      26  
      27  #include "localcharset.h"
      28  #include "macros.h"
      29  
      30  #if defined _WIN32 && !defined __CYGWIN__
      31  
      32  static int
      33  test_one_locale (const char *name, int codepage)
      34  {
      35  # if 1
      36    /* Portable code to set the locale.  */
      37    {
      38      char name_with_codepage[1024];
      39  
      40      sprintf (name_with_codepage, "%s.%d", name, codepage);
      41  
      42      /* Set the locale.  */
      43      if (setlocale (LC_ALL, name_with_codepage) == NULL)
      44        return 77;
      45    }
      46  # else
      47    /* Hacky way to set a locale.codepage combination that setlocale() refuses
      48       to set.  */
      49    {
      50      /* Codepage of the current locale, set with setlocale().
      51         Not necessarily the same as GetACP().  */
      52      extern __declspec(dllimport) unsigned int __lc_codepage;
      53  
      54      /* Set the locale.  */
      55      if (setlocale (LC_ALL, name) == NULL)
      56        return 77;
      57  
      58      /* Clobber the codepage and MB_CUR_MAX, both set by setlocale().  */
      59      __lc_codepage = codepage;
      60      switch (codepage)
      61        {
      62        case 1252:
      63        case 1256:
      64          MB_CUR_MAX = 1;
      65          break;
      66        case 932:
      67        case 950:
      68        case 936:
      69          MB_CUR_MAX = 2;
      70          break;
      71        case 54936:
      72        case 65001:
      73          MB_CUR_MAX = 4;
      74          break;
      75        }
      76  
      77      /* Test whether the codepage is really available.  */
      78      mbstate_t state;
      79      wchar_t wc;
      80      memset (&state, '\0', sizeof (mbstate_t));
      81      if (mbrtowc (&wc, " ", 1, &state) == (size_t)(-1))
      82        return 77;
      83    }
      84  # endif
      85  
      86    switch (codepage)
      87      {
      88      case 1252:
      89        /* Locale encoding is CP1252, an extension of ISO-8859-1.  */
      90  
      91        ASSERT (fnmatch ("x?y", "x\374y", 0) == 0); /* "xüy" */
      92        ASSERT (fnmatch ("x?y", "x\337y", 0) == 0); /* "xßy" */
      93        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
      94        ASSERT (fnmatch ("x[[:alnum:]]y", "x\330y", 0) == 0);
      95        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
      96        ASSERT (fnmatch ("x[[:alpha:]]y", "x\330y", 0) == 0);
      97        /* U+00B8 CEDILLA */
      98        ASSERT (fnmatch ("x[[:graph:]]y", "x\270y", 0) == 0);
      99        /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     100        ASSERT (fnmatch ("x[[:lower:]]y", "x\377y", 0) == 0);
     101        /* U+00B8 CEDILLA */
     102        ASSERT (fnmatch ("x[[:print:]]y", "x\270y", 0) == 0);
     103        /* U+00BF INVERTED QUESTION MARK */
     104        ASSERT (fnmatch ("x[[:punct:]]y", "x\277y", 0) == 0);
     105        /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
     106        ASSERT (fnmatch ("x[[:upper:]]y", "x\311y", 0) == 0);
     107        /* U+00D7 MULTIPLICATION SIGN */
     108        ASSERT (fnmatch ("x[[:alnum:]]y", "x\327y", 0) == FNM_NOMATCH);
     109        /* U+00D7 MULTIPLICATION SIGN */
     110        ASSERT (fnmatch ("x[[:alpha:]]y", "x\327y", 0) == FNM_NOMATCH);
     111        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     112        ASSERT (fnmatch ("x[[:blank:]]y", "x\330y", 0) == FNM_NOMATCH);
     113        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     114        ASSERT (fnmatch ("x[[:cntrl:]]y", "x\330y", 0) == FNM_NOMATCH);
     115        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     116        ASSERT (fnmatch ("x[[:digit:]]y", "x\330y", 0) == FNM_NOMATCH);
     117        /* U+00B2 SUPERSCRIPT TWO */
     118        ASSERT (fnmatch ("x[[:lower:]]y", "x\262y", 0) == FNM_NOMATCH);
     119        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     120        ASSERT (fnmatch ("x[[:punct:]]y", "x\330y", 0) == FNM_NOMATCH);
     121        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     122        ASSERT (fnmatch ("x[[:space:]]y", "x\330y", 0) == FNM_NOMATCH);
     123        /* U+00B2 SUPERSCRIPT TWO */
     124        ASSERT (fnmatch ("x[[:upper:]]y", "x\262y", 0) == FNM_NOMATCH);
     125        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     126        ASSERT (fnmatch ("x[[:xdigit:]]y", "x\330y", 0) == FNM_NOMATCH);
     127  
     128        #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
     129        /* "Höhle" */
     130        ASSERT (fnmatch ("H\366hle", "H\326hLe", FNM_CASEFOLD) == 0);
     131        ASSERT (fnmatch ("H\326hLe", "H\366hle", FNM_CASEFOLD) == 0);
     132        ASSERT (fnmatch ("H\326hle", "H\366hLe", FNM_CASEFOLD) == 0);
     133        ASSERT (fnmatch ("H\366hLe", "H\326hle", FNM_CASEFOLD) == 0);
     134        #endif
     135  
     136        return 0;
     137  
     138      case 1256:
     139        /* Locale encoding is CP1256, not the same as ISO-8859-6.  */
     140  
     141        ASSERT (fnmatch ("x?y", "x\302y", 0) == 0); /* "xآy" */
     142        ASSERT (fnmatch ("x?y", "x\341y", 0) == 0); /* "xلy" */
     143        ASSERT (fnmatch ("x?y", "x\346y", 0) == 0); /* "xوy" */
     144  
     145        return 0;
     146  
     147      case 65001:
     148        /* Locale encoding is CP65001 = UTF-8.  */
     149        if (strcmp (locale_charset (), "UTF-8") != 0)
     150          return 77;
     151  
     152        ASSERT (fnmatch ("x?y", "x\303\274y", 0) == 0); /* "xüy" */
     153        ASSERT (fnmatch ("x?y", "x\303\237y", 0) == 0); /* "xßy" */
     154        ASSERT (fnmatch ("x?y", "x\360\237\230\213y", 0) == 0); /* "x😋y" */
     155        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     156        ASSERT (fnmatch ("x[[:alnum:]]y", "x\305\201y", 0) == 0);
     157        /* U+10330 GOTHIC LETTER AHSA */
     158        ASSERT (fnmatch ("x[[:alnum:]]y", "x\360\220\214\260y", 0) == 0);
     159        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     160        ASSERT (fnmatch ("x[[:alpha:]]y", "x\305\201y", 0) == 0);
     161        /* U+10330 GOTHIC LETTER AHSA */
     162        ASSERT (fnmatch ("x[[:alpha:]]y", "x\360\220\214\260y", 0) == 0);
     163        /* U+00B8 CEDILLA */
     164        ASSERT (fnmatch ("x[[:graph:]]y", "x\302\270y", 0) == 0);
     165        /* U+20000 <CJK Ideograph> */
     166        ASSERT (fnmatch ("x[[:graph:]]y", "x\360\240\200\200y", 0) == 0);
     167        /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     168        ASSERT (fnmatch ("x[[:lower:]]y", "x\303\277y", 0) == 0);
     169        /* U+10441 DESERET SMALL LETTER EF */
     170        ASSERT (fnmatch ("x[[:lower:]]y", "x\360\220\221\201y", 0) == 0);
     171        /* U+00B8 CEDILLA */
     172        ASSERT (fnmatch ("x[[:print:]]y", "x\302\270y", 0) == 0);
     173        /* U+20000 <CJK Ideograph> */
     174        ASSERT (fnmatch ("x[[:print:]]y", "x\360\240\200\200y", 0) == 0);
     175        /* U+00BF INVERTED QUESTION MARK */
     176        ASSERT (fnmatch ("x[[:punct:]]y", "x\302\277y", 0) == 0);
     177        /* U+1D100 MUSICAL SYMBOL SINGLE BARLINE */
     178        ASSERT (fnmatch ("x[[:punct:]]y", "x\360\235\204\200y", 0) == 0);
     179        /* U+3000 IDEOGRAPHIC SPACE */
     180        ASSERT (fnmatch ("x[[:space:]]y", "x\343\200\200y", 0) == 0);
     181        /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
     182        ASSERT (fnmatch ("x[[:upper:]]y", "x\320\251y", 0) == 0);
     183        /* U+10419 DESERET CAPITAL LETTER EF */
     184        ASSERT (fnmatch ("x[[:upper:]]y", "x\360\220\220\231y", 0) == 0);
     185        /* U+00D7 MULTIPLICATION SIGN */
     186        ASSERT (fnmatch ("x[[:alnum:]]y", "x\303\227y", 0) == FNM_NOMATCH);
     187        /* U+00D7 MULTIPLICATION SIGN */
     188        ASSERT (fnmatch ("x[[:alpha:]]y", "x\303\227y", 0) == FNM_NOMATCH);
     189        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     190        ASSERT (fnmatch ("x[[:blank:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     191        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     192        ASSERT (fnmatch ("x[[:cntrl:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     193        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     194        ASSERT (fnmatch ("x[[:digit:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     195        /* U+2002 EN SPACE */
     196        ASSERT (fnmatch ("x[[:graph:]]y", "x\342\200\202y", 0) == FNM_NOMATCH);
     197        /* U+00B2 SUPERSCRIPT TWO */
     198        ASSERT (fnmatch ("x[[:lower:]]y", "x\302\262y", 0) == FNM_NOMATCH);
     199        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     200        ASSERT (fnmatch ("x[[:punct:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     201        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     202        ASSERT (fnmatch ("x[[:space:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     203        /* U+00B2 SUPERSCRIPT TWO */
     204        ASSERT (fnmatch ("x[[:upper:]]y", "x\302\262y", 0) == FNM_NOMATCH);
     205        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     206        ASSERT (fnmatch ("x[[:xdigit:]]y", "x\305\201y", 0) == FNM_NOMATCH);
     207  
     208        #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
     209        /* "özgür" */
     210        {
     211          /* Some platforms, e.g. MSVC 14, lack the upper/lower mappings for
     212             these wide characters in the *.65001 locales.  */
     213          mbstate_t state;
     214          wchar_t wc;
     215          memset (&state, 0, sizeof (mbstate_t));
     216          if (mbrtowc (&wc, "\303\274", 2, &state) == 2
     217              && towupper (wc) != wc)
     218            {
     219              ASSERT (fnmatch ("\303\266zg\303\274r", "\303\226ZG\303\234R", FNM_CASEFOLD) == 0);
     220              ASSERT (fnmatch ("\303\226ZG\303\234R", "\303\266zg\303\274r", FNM_CASEFOLD) == 0);
     221              ASSERT (fnmatch ("\303\266Zg\303\234r", "\303\226zG\303\274R", FNM_CASEFOLD) == 0);
     222              ASSERT (fnmatch ("\303\226zG\303\274R", "\303\266Zg\303\234r", FNM_CASEFOLD) == 0);
     223            }
     224        }
     225        #endif
     226  
     227        return 0;
     228  
     229      case 932:
     230        /* Locale encoding is CP932, similar to Shift_JIS.  */
     231  
     232        ASSERT (fnmatch ("x?y", "x\223\372y", 0) == 0); /* "x日y" */
     233        ASSERT (fnmatch ("x?y", "x\226\173y", 0) == 0); /* "x本y" */
     234        ASSERT (fnmatch ("x?y", "x\214\352y", 0) == 0); /* "x語y" */
     235  
     236        return 0;
     237  
     238      case 950:
     239        /* Locale encoding is CP950, similar to Big5.  */
     240  
     241        ASSERT (fnmatch ("x?y", "x\244\351y", 0) == 0); /* "x日y" */
     242        ASSERT (fnmatch ("x?y", "x\245\273y", 0) == 0); /* "x本y" */
     243        ASSERT (fnmatch ("x?y", "x\273\171y", 0) == 0); /* "x語y" */
     244  
     245        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     246        ASSERT (fnmatch ("x[[:alnum:]]y", "x\242\365y", 0) == 0);
     247        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     248        ASSERT (fnmatch ("x[[:alpha:]]y", "x\242\365y", 0) == 0);
     249        /* U+3001 IDEOGRAPHIC COMMA */
     250        ASSERT (fnmatch ("x[[:graph:]]y", "x\241\102y", 0) == 0);
     251        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     252        ASSERT (fnmatch ("x[[:lower:]]y", "x\242\365y", 0) == 0);
     253        /* U+3001 IDEOGRAPHIC COMMA */
     254        ASSERT (fnmatch ("x[[:print:]]y", "x\241\102y", 0) == 0);
     255        /* U+00D7 MULTIPLICATION SIGN */
     256        ASSERT (fnmatch ("x[[:punct:]]y", "x\241\321y", 0) == 0);
     257        /* U+3000 IDEOGRAPHIC SPACE */
     258        ASSERT (fnmatch ("x[[:space:]]y", "x\241\100y", 0) == 0);
     259        /* U+FF2D FULLWIDTH LATIN CAPITAL LETTER M */
     260        ASSERT (fnmatch ("x[[:upper:]]y", "x\242\333y", 0) == 0);
     261  
     262        #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
     263        /* "α-ω" */
     264        ASSERT (fnmatch ("\243\134-\243\163", "\243\104-\243\133", FNM_CASEFOLD) == 0);
     265        ASSERT (fnmatch ("\243\104-\243\133", "\243\134-\243\163", FNM_CASEFOLD) == 0);
     266        ASSERT (fnmatch ("\243\134-\243\133", "\243\104-\243\163", FNM_CASEFOLD) == 0);
     267        ASSERT (fnmatch ("\243\104-\243\163", "\243\134-\243\133", FNM_CASEFOLD) == 0);
     268        #endif
     269  
     270        return 0;
     271  
     272      case 936:
     273        /* Locale encoding is CP936 = GBK, an extension of GB2312.  */
     274  
     275        ASSERT (fnmatch ("x?y", "x\310\325y", 0) == 0); /* "x日y" */
     276        ASSERT (fnmatch ("x?y", "x\261\276y", 0) == 0); /* "x本y" */
     277        ASSERT (fnmatch ("x?y", "x\325\132y", 0) == 0); /* "x語y" */
     278  
     279        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     280        ASSERT (fnmatch ("x[[:alnum:]]y", "x\243\355y", 0) == 0);
     281        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     282        ASSERT (fnmatch ("x[[:alpha:]]y", "x\243\355y", 0) == 0);
     283        /* U+3001 IDEOGRAPHIC COMMA */
     284        ASSERT (fnmatch ("x[[:graph:]]y", "x\241\242y", 0) == 0);
     285        /* U+FF4D FULLWIDTH LATIN SMALL LETTER M */
     286        ASSERT (fnmatch ("x[[:lower:]]y", "x\243\355y", 0) == 0);
     287        /* U+3001 IDEOGRAPHIC COMMA */
     288        ASSERT (fnmatch ("x[[:print:]]y", "x\241\242y", 0) == 0);
     289        /* U+00D7 MULTIPLICATION SIGN */
     290        ASSERT (fnmatch ("x[[:punct:]]y", "x\241\301y", 0) == 0);
     291        /* U+3000 IDEOGRAPHIC SPACE */
     292        ASSERT (fnmatch ("x[[:space:]]y", "x\241\241y", 0) == 0);
     293        /* U+FF2D FULLWIDTH LATIN CAPITAL LETTER M */
     294        ASSERT (fnmatch ("x[[:upper:]]y", "x\243\315y", 0) == 0);
     295  
     296        #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
     297        /* "α-ω" */
     298        ASSERT (fnmatch ("\246\301-\246\330", "\246\241-\246\270", FNM_CASEFOLD) == 0);
     299        ASSERT (fnmatch ("\246\241-\246\270", "\246\301-\246\330", FNM_CASEFOLD) == 0);
     300        ASSERT (fnmatch ("\246\301-\246\270", "\246\241-\246\330", FNM_CASEFOLD) == 0);
     301        ASSERT (fnmatch ("\246\241-\246\330", "\246\301-\246\270", FNM_CASEFOLD) == 0);
     302        #endif
     303  
     304        return 0;
     305  
     306      case 54936:
     307        /* Locale encoding is CP54936 = GB18030.  */
     308        if (strcmp (locale_charset (), "GB18030") != 0)
     309          return 77;
     310  
     311        ASSERT (fnmatch ("x?y", "x\250\271y", 0) == 0); /* "xüy" */
     312        ASSERT (fnmatch ("x?y", "x\201\060\211\070y", 0) == 0); /* "xßy" */
     313        ASSERT (fnmatch ("x?y", "x\224\071\375\067y", 0) == 0); /* "x😋y" */
     314        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     315        ASSERT (fnmatch ("x[[:alnum:]]y", "x\201\060\221\071y", 0) == 0);
     316        /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     317        ASSERT (fnmatch ("x[[:alpha:]]y", "x\201\060\221\071y", 0) == 0);
     318        /* U+00B8 CEDILLA */
     319        ASSERT (fnmatch ("x[[:graph:]]y", "x\201\060\206\060y", 0) == 0);
     320        /* U+20000 <CJK Ideograph> */
     321        ASSERT (fnmatch ("x[[:graph:]]y", "x\225\062\202\066y", 0) == 0);
     322        /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     323        ASSERT (fnmatch ("x[[:lower:]]y", "x\201\060\213\067y", 0) == 0);
     324        /* U+10441 DESERET SMALL LETTER EF */
     325        ASSERT (fnmatch ("x[[:lower:]]y", "x\220\060\355\071y", 0) == 0);
     326        /* U+00B8 CEDILLA */
     327        ASSERT (fnmatch ("x[[:print:]]y", "x\201\060\206\060y", 0) == 0);
     328        /* U+20000 <CJK Ideograph> */
     329        ASSERT (fnmatch ("x[[:print:]]y", "x\225\062\202\066y", 0) == 0);
     330        /* U+00D7 MULTIPLICATION SIGN */
     331        ASSERT (fnmatch ("x[[:punct:]]y", "x\241\301y", 0) == 0);
     332        /* U+1D100 MUSICAL SYMBOL SINGLE BARLINE */
     333        ASSERT (fnmatch ("x[[:punct:]]y", "x\224\062\273\064y", 0) == 0);
     334        /* U+3000 IDEOGRAPHIC SPACE */
     335        ASSERT (fnmatch ("x[[:space:]]y", "x\241\241y", 0) == 0);
     336        /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
     337        ASSERT (fnmatch ("x[[:upper:]]y", "x\247\273y", 0) == 0);
     338        /* U+10419 DESERET CAPITAL LETTER EF */
     339        ASSERT (fnmatch ("x[[:upper:]]y", "x\220\060\351\071y", 0) == 0);
     340        /* U+3001 IDEOGRAPHIC COMMA */
     341        ASSERT (fnmatch ("x[[:alnum:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     342        /* U+3001 IDEOGRAPHIC COMMA */
     343        ASSERT (fnmatch ("x[[:alpha:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     344        /* U+3001 IDEOGRAPHIC COMMA */
     345        ASSERT (fnmatch ("x[[:blank:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     346        /* U+3001 IDEOGRAPHIC COMMA */
     347        ASSERT (fnmatch ("x[[:cntrl:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     348        /* U+3001 IDEOGRAPHIC COMMA */
     349        ASSERT (fnmatch ("x[[:digit:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     350        /* U+3000 IDEOGRAPHIC SPACE */
     351        ASSERT (fnmatch ("x[[:graph:]]y", "x\241\241y", 0) == FNM_NOMATCH);
     352        /* U+3001 IDEOGRAPHIC COMMA */
     353        ASSERT (fnmatch ("x[[:lower:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     354        /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
     355        ASSERT (fnmatch ("x[[:punct:]]y", "x\201\060\211\061y", 0) == FNM_NOMATCH);
     356        /* U+3001 IDEOGRAPHIC COMMA */
     357        ASSERT (fnmatch ("x[[:space:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     358        /* U+3001 IDEOGRAPHIC COMMA */
     359        ASSERT (fnmatch ("x[[:upper:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     360        /* U+3001 IDEOGRAPHIC COMMA */
     361        ASSERT (fnmatch ("x[[:xdigit:]]y", "x\241\242y", 0) == FNM_NOMATCH);
     362  
     363        #if GNULIB_FNMATCH_GNU && defined FNM_CASEFOLD
     364        /* "özgür" */
     365        ASSERT (fnmatch ("\201\060\213\062zg\250\271r", "\201\060\211\060ZG\201\060\211\065R", FNM_CASEFOLD) == 0);
     366        ASSERT (fnmatch ("\201\060\211\060ZG\201\060\211\065R", "\201\060\213\062zg\250\271r", FNM_CASEFOLD) == 0);
     367        ASSERT (fnmatch ("\201\060\213\062Zg\201\060\211\065r", "\201\060\211\060zG\250\271R", FNM_CASEFOLD) == 0);
     368        ASSERT (fnmatch ("\201\060\211\060zG\250\271R", "\201\060\213\062Zg\201\060\211\065r", FNM_CASEFOLD) == 0);
     369        #endif
     370  
     371        return 0;
     372  
     373      default:
     374        return 1;
     375      }
     376  }
     377  
     378  int
     379  main (int argc, char *argv[])
     380  {
     381    int codepage = atoi (argv[argc - 1]);
     382    int result;
     383    int i;
     384  
     385    result = 77;
     386    for (i = 1; i < argc - 1; i++)
     387      {
     388        int ret = test_one_locale (argv[i], codepage);
     389  
     390        if (ret != 77)
     391          result = ret;
     392      }
     393  
     394    if (result == 77)
     395      {
     396        fprintf (stderr, "Skipping test: found no locale with codepage %d\n",
     397                 codepage);
     398      }
     399    return result;
     400  }
     401  
     402  #else
     403  
     404  int
     405  main (int argc, char *argv[])
     406  {
     407    fputs ("Skipping test: not a native Windows system\n", stderr);
     408    return 77;
     409  }
     410  
     411  #endif