(root)/
gettext-0.22.4/
gettext-tools/
gnulib-lib/
btoc32.c
       1  /* Convert unibyte character to 32-bit wide character.
       2     Copyright (C) 2020-2023 Free Software Foundation, Inc.
       3  
       4     This file is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU Lesser General Public License as
       6     published by the Free Software Foundation; either version 2.1 of the
       7     License, or (at your option) any later version.
       8  
       9     This file 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 Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser 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>, 2020.  */
      18  
      19  #include <config.h>
      20  
      21  #define IN_BTOC32
      22  /* Specification.  */
      23  #include <uchar.h>
      24  
      25  #include <stdio.h>
      26  #include <string.h>
      27  #include <wchar.h>
      28  
      29  #if GL_CHAR32_T_IS_UNICODE
      30  # include "lc-charset-unicode.h"
      31  #endif
      32  
      33  #if _GL_WCHAR_T_IS_UCS4
      34  _GL_EXTERN_INLINE
      35  #endif
      36  wint_t
      37  btoc32 (int c)
      38  {
      39  #if HAVE_WORKING_MBRTOC32 && !_GL_WCHAR_T_IS_UCS4
      40    /* The char32_t encoding of a multibyte character may be different than its
      41       wchar_t encoding.  */
      42    if (c != EOF)
      43      {
      44        mbstate_t state;
      45        char s[1];
      46        char32_t wc;
      47  
      48        mbszero (&state);
      49        s[0] = (unsigned char) c;
      50        if (mbrtoc32 (&wc, s, 1, &state) <= 1)
      51          return wc;
      52      }
      53    return WEOF;
      54  #else
      55    /* In all known locale encodings, unibyte characters correspond only to
      56       characters in the BMP.  */
      57    wint_t wc = btowc (c);
      58  # if GL_CHAR32_T_IS_UNICODE && GL_CHAR32_T_VS_WCHAR_T_NEEDS_CONVERSION
      59    if (wc != WEOF && wc != 0)
      60      {
      61        wc = locale_encoding_to_unicode (wc);
      62        if (wc == 0)
      63          return WEOF;
      64      }
      65  # endif
      66    return wc;
      67  #endif
      68  }