(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-btoc32.c
       1  /* Test of conversion of unibyte character to 32-bit wide character.
       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  /* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
      18  
      19  #include <config.h>
      20  
      21  #include <uchar.h>
      22  
      23  #include "signature.h"
      24  SIGNATURE_CHECK (btoc32, wint_t, (int));
      25  
      26  #include <locale.h>
      27  #include <stdio.h>
      28  #include <wchar.h>
      29  
      30  #include "macros.h"
      31  
      32  int
      33  main (int argc, char *argv[])
      34  {
      35    int c;
      36  
      37    /* configure should already have checked that the locale is supported.  */
      38    if (setlocale (LC_ALL, "") == NULL)
      39      return 1;
      40  
      41    ASSERT (btoc32 (EOF) == WEOF);
      42  
      43  #ifdef __ANDROID__
      44    /* On Android ≥ 5.0, the default locale is the "C.UTF-8" locale, not the
      45       "C" locale.  Furthermore, when you attempt to set the "C" or "POSIX"
      46       locale via setlocale(), what you get is a "C" locale with UTF-8 encoding,
      47       that is, effectively the "C.UTF-8" locale.  */
      48    if (argc > 1 && strcmp (argv[1], "1") == 0 && MB_CUR_MAX > 1)
      49      argv[1] = "3";
      50  #endif
      51  
      52    if (argc > 1)
      53      switch (argv[1][0])
      54        {
      55        case '1':
      56          /* C or POSIX locale.  */
      57          for (c = 0; c < 0x100; c++)
      58            if (c != 0)
      59              {
      60                /* We are testing all nonnull bytes.  */
      61                wint_t wc = btoc32 (c);
      62                /* POSIX:2018 says regarding btowc: "In the POSIX locale, btowc()
      63                   shall not return WEOF if c has a value in the range 0 to 255
      64                   inclusive."  It is reasonable to expect btoc32 to behave in
      65                   the same way.  */
      66                if (c < 0x80)
      67                  /* c is an ASCII character.  */
      68                  ASSERT (wc == c);
      69                else
      70                  /* On most platforms, the bytes 0x80..0xFF map to U+0080..U+00FF.
      71                     But on musl libc, the bytes 0x80..0xFF map to U+DF80..U+DFFF.  */
      72                  ASSERT (wc == c || wc == 0xDF00 + c);
      73              }
      74          return 0;
      75  
      76        case '2':
      77          /* Locale encoding is ISO-8859-1 or ISO-8859-15.  */
      78          for (c = 0; c < 0x80; c++)
      79            ASSERT (btoc32 (c) == c);
      80          for (c = 0xA0; c < 0x100; c++)
      81            ASSERT (btoc32 (c) != WEOF);
      82          return 0;
      83  
      84        case '3':
      85          /* Locale encoding is UTF-8.  */
      86          for (c = 0; c < 0x80; c++)
      87            ASSERT (btoc32 (c) == c);
      88          for (c = 0x80; c < 0x100; c++)
      89            ASSERT (btoc32 (c) == WEOF);
      90          return 0;
      91        }
      92  
      93    return 1;
      94  }