(root)/
glibc-2.38/
stdlib/
wctomb.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  /* Shared with __wctomb_chk.  */
      26  mbstate_t __wctomb_state attribute_hidden;
      27  
      28  /* Convert WCHAR into its multibyte character representation,
      29     putting this in S and returning its length.
      30  
      31     Attention: this function should NEVER be intentionally used.
      32     The interface is completely stupid.  The state is shared between
      33     all conversion functions.  You should use instead the restartable
      34     version `wcrtomb'.  */
      35  int
      36  wctomb (char *s, wchar_t wchar)
      37  {
      38    /* If S is NULL the function has to return null or not null
      39       depending on the encoding having a state depending encoding or
      40       not.  */
      41    if (s == NULL)
      42      {
      43        const struct gconv_fcts *fcts;
      44  
      45        /* Get the conversion functions.  */
      46        fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE));
      47  
      48        /* This is an extension in the Unix standard which does not directly
      49  	 violate ISO C.  */
      50        memset (&__wctomb_state, '\0', sizeof __wctomb_state);
      51  
      52        return fcts->tomb->__stateful;
      53      }
      54  
      55    return __wcrtomb (s, wchar, &__wctomb_state);
      56  }
      57  libc_hidden_def (wctomb)