(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-c32isupper.c
       1  /* Test of c32isupper() function.
       2     Copyright (C) 2020-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 <uchar.h>
      20  
      21  #include "signature.h"
      22  SIGNATURE_CHECK (c32isupper, int, (wint_t));
      23  
      24  #include <locale.h>
      25  #include <stdlib.h>
      26  #include <string.h>
      27  #include <wchar.h>
      28  
      29  #include "macros.h"
      30  
      31  /* Returns the value of c32isupper for the multibyte character s[0..n-1].  */
      32  static int
      33  for_character (const char *s, size_t n)
      34  {
      35    mbstate_t state;
      36    char32_t wc;
      37    size_t ret;
      38  
      39    memset (&state, '\0', sizeof (mbstate_t));
      40    wc = (char32_t) 0xBADFACE;
      41    ret = mbrtoc32 (&wc, s, n, &state);
      42    ASSERT (ret == n);
      43  
      44    return c32isupper (wc);
      45  }
      46  
      47  int
      48  main (int argc, char *argv[])
      49  {
      50    int is;
      51    char buf[4];
      52  
      53    /* configure should already have checked that the locale is supported.  */
      54    if (setlocale (LC_ALL, "") == NULL)
      55      return 1;
      56  
      57    /* Test WEOF.  */
      58    is = c32isupper (WEOF);
      59    ASSERT (is == 0);
      60  
      61    /* Test single-byte characters.
      62       POSIX specifies in
      63         <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html>
      64       that
      65         - in all locales, the uppercase characters include the A ... Z
      66           characters,
      67         - in the "POSIX" locale (which is usually the same as the "C" locale),
      68           the uppercase characters include only the ASCII A ... Z characters.
      69     */
      70    {
      71      int c;
      72  
      73      for (c = 0; c < 0x100; c++)
      74        switch (c)
      75          {
      76          case '\t': case '\v': case '\f':
      77          case ' ': case '!': case '"': case '#': case '%':
      78          case '&': case '\'': case '(': case ')': case '*':
      79          case '+': case ',': case '-': case '.': case '/':
      80          case '0': case '1': case '2': case '3': case '4':
      81          case '5': case '6': case '7': case '8': case '9':
      82          case ':': case ';': case '<': case '=': case '>':
      83          case '?':
      84          case 'A': case 'B': case 'C': case 'D': case 'E':
      85          case 'F': case 'G': case 'H': case 'I': case 'J':
      86          case 'K': case 'L': case 'M': case 'N': case 'O':
      87          case 'P': case 'Q': case 'R': case 'S': case 'T':
      88          case 'U': case 'V': case 'W': case 'X': case 'Y':
      89          case 'Z':
      90          case '[': case '\\': case ']': case '^': case '_':
      91          case 'a': case 'b': case 'c': case 'd': case 'e':
      92          case 'f': case 'g': case 'h': case 'i': case 'j':
      93          case 'k': case 'l': case 'm': case 'n': case 'o':
      94          case 'p': case 'q': case 'r': case 's': case 't':
      95          case 'u': case 'v': case 'w': case 'x': case 'y':
      96          case 'z': case '{': case '|': case '}': case '~':
      97            /* c is in the ISO C "basic character set".  */
      98            buf[0] = (unsigned char) c;
      99            is = for_character (buf, 1);
     100            switch (c)
     101              {
     102              case 'A': case 'B': case 'C': case 'D': case 'E':
     103              case 'F': case 'G': case 'H': case 'I': case 'J':
     104              case 'K': case 'L': case 'M': case 'N': case 'O':
     105              case 'P': case 'Q': case 'R': case 'S': case 'T':
     106              case 'U': case 'V': case 'W': case 'X': case 'Y':
     107              case 'Z':
     108                ASSERT (is != 0);
     109                break;
     110              default:
     111                ASSERT (is == 0);
     112                break;
     113              }
     114            break;
     115          }
     116    }
     117  
     118    if (argc > 1)
     119      switch (argv[1][0])
     120        {
     121        case '0':
     122          /* C locale; tested above.  */
     123          return 0;
     124  
     125        case '1':
     126          /* Locale encoding is ISO-8859-1 or ISO-8859-15.  */
     127          {
     128            /* U+00B2 SUPERSCRIPT TWO */
     129            is = for_character ("\262", 1);
     130            ASSERT (is == 0);
     131            /* U+00B5 MICRO SIGN */
     132            is = for_character ("\265", 1);
     133            ASSERT (is == 0);
     134            /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
     135            is = for_character ("\311", 1);
     136            ASSERT (is != 0);
     137          #if !defined __hpux
     138            /* U+00DF LATIN SMALL LETTER SHARP S */
     139            is = for_character ("\337", 1);
     140            ASSERT (is == 0);
     141          #endif
     142            /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
     143            is = for_character ("\351", 1);
     144            ASSERT (is == 0);
     145            /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     146            is = for_character ("\377", 1);
     147            ASSERT (is == 0);
     148          }
     149          return 0;
     150  
     151        case '2':
     152          /* Locale encoding is EUC-JP.  */
     153          {
     154          #if !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__)
     155            /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
     156            is = for_character ("\217\252\261", 3);
     157            ASSERT (is != 0);
     158          #endif
     159            /* U+00DF LATIN SMALL LETTER SHARP S */
     160            is = for_character ("\217\251\316", 3);
     161            ASSERT (is == 0);
     162            /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
     163            is = for_character ("\217\253\261", 3);
     164            ASSERT (is == 0);
     165            /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     166            is = for_character ("\217\253\363", 3);
     167            ASSERT (is == 0);
     168          #if !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__)
     169            /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     170            is = for_character ("\217\251\250", 3);
     171            ASSERT (is != 0);
     172          #endif
     173            /* U+0142 LATIN SMALL LETTER L WITH STROKE */
     174            is = for_character ("\217\251\310", 3);
     175            ASSERT (is == 0);
     176          #if !(defined __FreeBSD__ || defined __DragonFly__)
     177            /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
     178            is = for_character ("\247\273", 2);
     179            ASSERT (is != 0);
     180          #endif
     181            /* U+0449 CYRILLIC SMALL LETTER SHCHA */
     182            is = for_character ("\247\353", 2);
     183            ASSERT (is == 0);
     184            /* U+3073 HIRAGANA LETTER BI */
     185            is = for_character ("\244\323", 2);
     186            ASSERT (is == 0);
     187          #if !defined __DragonFly__
     188            /* U+FF27 FULLWIDTH LATIN CAPITAL LETTER G */
     189            is = for_character ("\243\307", 2);
     190            ASSERT (is != 0);
     191          #endif
     192          }
     193          return 0;
     194  
     195        case '3':
     196          /* Locale encoding is UTF-8.  */
     197          {
     198            /* U+00B2 SUPERSCRIPT TWO */
     199            is = for_character ("\302\262", 2);
     200            ASSERT (is == 0);
     201            /* U+00B5 MICRO SIGN */
     202            is = for_character ("\302\265", 2);
     203            ASSERT (is == 0);
     204            /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
     205            is = for_character ("\303\211", 2);
     206            ASSERT (is != 0);
     207            /* U+00DF LATIN SMALL LETTER SHARP S */
     208            is = for_character ("\303\237", 2);
     209            ASSERT (is == 0);
     210            /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
     211            is = for_character ("\303\251", 2);
     212            ASSERT (is == 0);
     213            /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     214            is = for_character ("\303\277", 2);
     215            ASSERT (is == 0);
     216            /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     217            is = for_character ("\305\201", 2);
     218            ASSERT (is != 0);
     219            /* U+0142 LATIN SMALL LETTER L WITH STROKE */
     220            is = for_character ("\305\202", 2);
     221            ASSERT (is == 0);
     222            /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
     223            is = for_character ("\320\251", 2);
     224            ASSERT (is != 0);
     225            /* U+0449 CYRILLIC SMALL LETTER SHCHA */
     226            is = for_character ("\321\211", 2);
     227            ASSERT (is == 0);
     228            /* U+05D5 HEBREW LETTER VAV */
     229            is = for_character ("\327\225", 2);
     230            ASSERT (is == 0);
     231            /* U+3073 HIRAGANA LETTER BI */
     232            is = for_character ("\343\201\263", 3);
     233            ASSERT (is == 0);
     234            /* U+3162 HANGUL LETTER YI */
     235            is = for_character ("\343\205\242", 3);
     236            ASSERT (is == 0);
     237            /* U+FF27 FULLWIDTH LATIN CAPITAL LETTER G */
     238            is = for_character ("\357\274\247", 3);
     239            ASSERT (is != 0);
     240            /* U+FFDB HALFWIDTH HANGUL LETTER YI */
     241            is = for_character ("\357\277\233", 3);
     242            ASSERT (is == 0);
     243          #if !(defined __FreeBSD__ || defined __DragonFly__ || defined __sun)
     244            /* U+10419 DESERET CAPITAL LETTER EF */
     245            is = for_character ("\360\220\220\231", 4);
     246            ASSERT (is != 0);
     247          #endif
     248            /* U+10441 DESERET SMALL LETTER EF */
     249            is = for_character ("\360\220\221\201", 4);
     250            ASSERT (is == 0);
     251            /* U+E0041 TAG LATIN CAPITAL LETTER A */
     252            is = for_character ("\363\240\201\201", 4);
     253            ASSERT (is == 0);
     254            /* U+E0061 TAG LATIN SMALL LETTER A */
     255            is = for_character ("\363\240\201\241", 4);
     256            ASSERT (is == 0);
     257          }
     258          return 0;
     259  
     260        case '4':
     261          /* Locale encoding is GB18030.  */
     262          #if (defined __GLIBC__ && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 13 && __GLIBC_MINOR__ <= 15) || (GL_CHAR32_T_IS_UNICODE && (defined __NetBSD__ || defined __sun))
     263          fputs ("Skipping test: The GB18030 converter in this system's iconv is broken.\n", stderr);
     264          return 77;
     265          #endif
     266          {
     267            /* U+00B2 SUPERSCRIPT TWO */
     268            is = for_character ("\201\060\205\065", 4);
     269            ASSERT (is == 0);
     270            /* U+00B5 MICRO SIGN */
     271            is = for_character ("\201\060\205\070", 4);
     272            ASSERT (is == 0);
     273          #if !(defined __FreeBSD__ || defined __DragonFly__ || defined __sun)
     274            /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
     275            is = for_character ("\201\060\207\067", 4);
     276            ASSERT (is != 0);
     277          #endif
     278            /* U+00DF LATIN SMALL LETTER SHARP S */
     279            is = for_character ("\201\060\211\070", 4);
     280            ASSERT (is == 0);
     281            /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
     282            is = for_character ("\250\246", 2);
     283            ASSERT (is == 0);
     284            /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
     285            is = for_character ("\201\060\213\067", 4);
     286            ASSERT (is == 0);
     287          #if !(defined __FreeBSD__ || defined __DragonFly__ || defined __sun)
     288            /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
     289            is = for_character ("\201\060\221\071", 4);
     290            ASSERT (is != 0);
     291          #endif
     292            /* U+0142 LATIN SMALL LETTER L WITH STROKE */
     293            is = for_character ("\201\060\222\060", 4);
     294            ASSERT (is == 0);
     295          #if !(defined __FreeBSD__ || defined __DragonFly__)
     296            /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
     297            is = for_character ("\247\273", 2);
     298            ASSERT (is != 0);
     299          #endif
     300            /* U+0449 CYRILLIC SMALL LETTER SHCHA */
     301            is = for_character ("\247\353", 2);
     302            ASSERT (is == 0);
     303            /* U+05D5 HEBREW LETTER VAV */
     304            is = for_character ("\201\060\371\067", 4);
     305            ASSERT (is == 0);
     306            /* U+3073 HIRAGANA LETTER BI */
     307            is = for_character ("\244\323", 2);
     308            ASSERT (is == 0);
     309            /* U+3162 HANGUL LETTER YI */
     310            is = for_character ("\201\071\256\062", 4);
     311            ASSERT (is == 0);
     312          #if !defined __DragonFly__
     313            /* U+FF27 FULLWIDTH LATIN CAPITAL LETTER G */
     314            is = for_character ("\243\307", 2);
     315            ASSERT (is != 0);
     316          #endif
     317            /* U+FFDB HALFWIDTH HANGUL LETTER YI */
     318            is = for_character ("\204\061\241\071", 4);
     319            ASSERT (is == 0);
     320          #if !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__ || defined __sun)
     321            /* U+10419 DESERET CAPITAL LETTER EF */
     322            is = for_character ("\220\060\351\071", 4);
     323            ASSERT (is != 0);
     324          #endif
     325            /* U+10441 DESERET SMALL LETTER EF */
     326            is = for_character ("\220\060\355\071", 4);
     327            ASSERT (is == 0);
     328            /* U+E0041 TAG LATIN CAPITAL LETTER A */
     329            is = for_character ("\323\066\234\063", 4);
     330            ASSERT (is == 0);
     331            /* U+E0061 TAG LATIN SMALL LETTER A */
     332            is = for_character ("\323\066\237\065", 4);
     333            ASSERT (is == 0);
     334          }
     335          return 0;
     336  
     337        }
     338  
     339    return 1;
     340  }