xref: /Universal-ctags/gnulib/wcrtomb.c (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI /* Convert wide character to multibyte character.
2*820c1a8dSHiroo HAYASHI    Copyright (C) 2008-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHI    Written by Bruno Haible <bruno@clisp.org>, 2008.
4*820c1a8dSHiroo HAYASHI 
5*820c1a8dSHiroo HAYASHI    This file is free software: you can redistribute it and/or modify
6*820c1a8dSHiroo HAYASHI    it under the terms of the GNU Lesser General Public License as
7*820c1a8dSHiroo HAYASHI    published by the Free Software Foundation; either version 2.1 of the
8*820c1a8dSHiroo HAYASHI    License, or (at your option) any later version.
9*820c1a8dSHiroo HAYASHI 
10*820c1a8dSHiroo HAYASHI    This file is distributed in the hope that it will be useful,
11*820c1a8dSHiroo HAYASHI    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*820c1a8dSHiroo HAYASHI    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*820c1a8dSHiroo HAYASHI    GNU Lesser General Public License for more details.
14*820c1a8dSHiroo HAYASHI 
15*820c1a8dSHiroo HAYASHI    You should have received a copy of the GNU Lesser General Public License
16*820c1a8dSHiroo HAYASHI    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
17*820c1a8dSHiroo HAYASHI 
18*820c1a8dSHiroo HAYASHI #include <config.h>
19*820c1a8dSHiroo HAYASHI 
20*820c1a8dSHiroo HAYASHI /* Specification.  */
21*820c1a8dSHiroo HAYASHI #include <wchar.h>
22*820c1a8dSHiroo HAYASHI 
23*820c1a8dSHiroo HAYASHI #include <errno.h>
24*820c1a8dSHiroo HAYASHI #include <stdlib.h>
25*820c1a8dSHiroo HAYASHI 
26*820c1a8dSHiroo HAYASHI 
27*820c1a8dSHiroo HAYASHI size_t
wcrtomb(char * s,wchar_t wc,mbstate_t * ps)28*820c1a8dSHiroo HAYASHI wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
29*820c1a8dSHiroo HAYASHI #undef wcrtomb
30*820c1a8dSHiroo HAYASHI {
31*820c1a8dSHiroo HAYASHI   /* This implementation of wcrtomb supports only stateless encodings.
32*820c1a8dSHiroo HAYASHI      ps must be in the initial state.  */
33*820c1a8dSHiroo HAYASHI   if (ps != NULL && !mbsinit (ps))
34*820c1a8dSHiroo HAYASHI     {
35*820c1a8dSHiroo HAYASHI       errno = EINVAL;
36*820c1a8dSHiroo HAYASHI       return (size_t)(-1);
37*820c1a8dSHiroo HAYASHI     }
38*820c1a8dSHiroo HAYASHI 
39*820c1a8dSHiroo HAYASHI #if !HAVE_WCRTOMB                       /* IRIX 6.5 */ \
40*820c1a8dSHiroo HAYASHI     || WCRTOMB_RETVAL_BUG               /* Solaris 11.3, MSVC */ \
41*820c1a8dSHiroo HAYASHI     || WCRTOMB_C_LOCALE_BUG             /* Android */
42*820c1a8dSHiroo HAYASHI   if (s == NULL)
43*820c1a8dSHiroo HAYASHI     /* We know the NUL wide character corresponds to the NUL character.  */
44*820c1a8dSHiroo HAYASHI     return 1;
45*820c1a8dSHiroo HAYASHI   else
46*820c1a8dSHiroo HAYASHI #endif
47*820c1a8dSHiroo HAYASHI     {
48*820c1a8dSHiroo HAYASHI #if HAVE_WCRTOMB
49*820c1a8dSHiroo HAYASHI # if WCRTOMB_C_LOCALE_BUG               /* Android */
50*820c1a8dSHiroo HAYASHI       /* Implement consistently with mbrtowc(): through a 1:1 correspondence,
51*820c1a8dSHiroo HAYASHI          as in ISO-8859-1.  */
52*820c1a8dSHiroo HAYASHI       if (wc >= 0 && wc <= 0xff)
53*820c1a8dSHiroo HAYASHI         {
54*820c1a8dSHiroo HAYASHI           *s = (unsigned char) wc;
55*820c1a8dSHiroo HAYASHI           return 1;
56*820c1a8dSHiroo HAYASHI         }
57*820c1a8dSHiroo HAYASHI       else
58*820c1a8dSHiroo HAYASHI         {
59*820c1a8dSHiroo HAYASHI           errno = EILSEQ;
60*820c1a8dSHiroo HAYASHI           return (size_t)(-1);
61*820c1a8dSHiroo HAYASHI         }
62*820c1a8dSHiroo HAYASHI # else
63*820c1a8dSHiroo HAYASHI       return wcrtomb (s, wc, ps);
64*820c1a8dSHiroo HAYASHI # endif
65*820c1a8dSHiroo HAYASHI #else                                   /* IRIX 6.5 */
66*820c1a8dSHiroo HAYASHI       /* Fallback for platforms that don't have wcrtomb().
67*820c1a8dSHiroo HAYASHI          Implement on top of wctomb().
68*820c1a8dSHiroo HAYASHI          This code is not multithread-safe.  */
69*820c1a8dSHiroo HAYASHI       int ret = wctomb (s, wc);
70*820c1a8dSHiroo HAYASHI 
71*820c1a8dSHiroo HAYASHI       if (ret >= 0)
72*820c1a8dSHiroo HAYASHI         return ret;
73*820c1a8dSHiroo HAYASHI       else
74*820c1a8dSHiroo HAYASHI         {
75*820c1a8dSHiroo HAYASHI           errno = EILSEQ;
76*820c1a8dSHiroo HAYASHI           return (size_t)(-1);
77*820c1a8dSHiroo HAYASHI         }
78*820c1a8dSHiroo HAYASHI #endif
79*820c1a8dSHiroo HAYASHI     }
80*820c1a8dSHiroo HAYASHI }
81