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