(root)/
glibc-2.38/
stdlib/
mbtowc.c
       1  /* Copyright (C) 1991-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library 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 GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <stdlib.h>
      19  #include <string.h>
      20  #include <wchar.h>
      21  #include <gconv.h>
      22  #include <wcsmbs/wcsmbsload.h>
      23  
      24  
      25  /* Convert the multibyte character at S, which is no longer
      26     than N characters, to its `wchar_t' representation, placing
      27     this n *PWC and returning its length.
      28  
      29     Attention: this function should NEVER be intentionally used.
      30     The interface is completely stupid.  The state is shared between
      31     all conversion functions.  You should use instead the restartable
      32     version `mbrtowc'.  */
      33  int
      34  mbtowc (wchar_t *pwc, const char *s, size_t n)
      35  {
      36    int result;
      37    static mbstate_t state;
      38  
      39    /* If S is NULL the function has to return null or not null
      40       depending on the encoding having a state depending encoding or
      41       not.  */
      42    if (s == NULL)
      43      {
      44        const struct gconv_fcts *fcts;
      45  
      46        /* Get the conversion functions.  */
      47        fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE));
      48  
      49        /* This is an extension in the Unix standard which does not directly
      50  	 violate ISO C.  */
      51        memset (&state, '\0', sizeof state);
      52  
      53        result = fcts->towc->__stateful;
      54      }
      55    else if (*s == '\0')
      56      {
      57        if (pwc != NULL)
      58  	*pwc = L'\0';
      59        result = 0;
      60      }
      61    else
      62      {
      63        result = __mbrtowc (pwc, s, n, &state);
      64  
      65        /* The `mbrtowc' functions tell us more than we need.  Fold the -1
      66  	 and -2 result into -1.  */
      67        if (result < 0)
      68  	result = -1;
      69      }
      70  
      71    return result;
      72  }