wget/lib/wcrtomb.c

81 lines
2.3 KiB
C
Raw Permalink Normal View History

2022-05-14 03:18:11 +08:00
/* Convert wide character to multibyte character.
2024-04-30 19:15:39 +08:00
Copyright (C) 2008-2023 Free Software Foundation, Inc.
2022-05-14 03:18:11 +08:00
Written by Bruno Haible <bruno@clisp.org>, 2008.
2024-04-30 19:15:39 +08:00
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
2022-05-14 03:18:11 +08:00
2024-04-30 19:15:39 +08:00
This file is distributed in the hope that it will be useful,
2022-05-14 03:18:11 +08:00
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2024-04-30 19:15:39 +08:00
GNU Lesser General Public License for more details.
2022-05-14 03:18:11 +08:00
2024-04-30 19:15:39 +08:00
You should have received a copy of the GNU Lesser General Public License
2022-05-14 03:18:11 +08:00
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
/* Specification. */
#include <wchar.h>
#include <errno.h>
#include <stdlib.h>
size_t
wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
2024-04-30 19:15:39 +08:00
#undef wcrtomb
2022-05-14 03:18:11 +08:00
{
/* This implementation of wcrtomb supports only stateless encodings.
ps must be in the initial state. */
if (ps != NULL && !mbsinit (ps))
{
errno = EINVAL;
return (size_t)(-1);
}
2024-04-30 19:15:39 +08:00
#if !HAVE_WCRTOMB /* IRIX 6.5 */ \
|| WCRTOMB_RETVAL_BUG /* Solaris 11.3, MSVC */ \
|| WCRTOMB_C_LOCALE_BUG /* Android */
2022-05-14 03:18:11 +08:00
if (s == NULL)
/* We know the NUL wide character corresponds to the NUL character. */
return 1;
else
2024-04-30 19:15:39 +08:00
#endif
2022-05-14 03:18:11 +08:00
{
2024-04-30 19:15:39 +08:00
#if HAVE_WCRTOMB
# if WCRTOMB_C_LOCALE_BUG /* Android */
2022-05-14 03:18:11 +08:00
/* Implement consistently with mbrtowc(): through a 1:1 correspondence,
as in ISO-8859-1. */
if (wc >= 0 && wc <= 0xff)
{
*s = (unsigned char) wc;
return 1;
}
2024-04-30 19:15:39 +08:00
else
{
errno = EILSEQ;
return (size_t)(-1);
}
# else
return wcrtomb (s, wc, ps);
# endif
#else /* IRIX 6.5 */
/* Fallback for platforms that don't have wcrtomb().
Implement on top of wctomb().
This code is not multithread-safe. */
2022-05-14 03:18:11 +08:00
int ret = wctomb (s, wc);
if (ret >= 0)
return ret;
else
{
errno = EILSEQ;
return (size_t)(-1);
}
2024-04-30 19:15:39 +08:00
#endif
2022-05-14 03:18:11 +08:00
}
}