pkg-monitoring-plugins/gl/wcrtomb.c

81 lines
2.3 KiB
C
Raw Normal View History

/* Convert wide character to multibyte character.
2023-10-18 07:29:37 +00:00
Copyright (C) 2008-2023 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2008.
2023-10-18 07:29:37 +00: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.
2023-10-18 07:29:37 +00:00
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2023-10-18 07:29:37 +00:00
GNU Lesser General Public License for more details.
2023-10-18 07:29:37 +00:00
You should have received a copy of the GNU Lesser General Public License
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)
2023-10-18 07:29:37 +00:00
#undef wcrtomb
{
2023-10-18 07:29:37 +00: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);
}
2023-10-18 07:29:37 +00:00
#if !HAVE_WCRTOMB /* IRIX 6.5 */ \
|| WCRTOMB_RETVAL_BUG /* Solaris 11.3, MSVC */ \
|| WCRTOMB_C_LOCALE_BUG /* Android */
if (s == NULL)
/* We know the NUL wide character corresponds to the NUL character. */
return 1;
else
2023-10-18 07:29:37 +00:00
#endif
{
2023-10-18 07:29:37 +00:00
#if HAVE_WCRTOMB
# if WCRTOMB_C_LOCALE_BUG /* Android */
/* 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;
}
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. */
int ret = wctomb (s, wc);
if (ret >= 0)
2013-11-26 22:57:29 +00:00
return ret;
else
2013-11-26 22:57:29 +00:00
{
errno = EILSEQ;
return (size_t)(-1);
}
2023-10-18 07:29:37 +00:00
#endif
}
}