blob: 9c76cc98786a82e7387ffceaf93ba47dd48b5909 [file] [log] [blame]
/* <uchar.h> substitute - 16-bit and 32-bit wide character types.
Copyright (C) 2019-2020 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>, 2019. */
/*
* ISO C 11 <uchar.h> for platforms that lack it.
*/
#ifndef _@GUARD_PREFIX@_UCHAR_H
#if __GNUC__ >= 3
@PRAGMA_SYSTEM_HEADER@
#endif
@PRAGMA_COLUMNS@
#if @HAVE_UCHAR_H@
# @INCLUDE_NEXT@ @NEXT_UCHAR_H@
#endif
/* Get uint_least16_t, uint_least32_t. */
#include <stdint.h>
/* Get mbstate_t, size_t. */
#include <wchar.h>
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
#if !@HAVE_UCHAR_H@
/* A 16-bit variant of wchar_t.
Note: This type does *NOT* denote UTF-16 units. (Only on platforms
on which __STDC_UTF_16__ is defined.) */
typedef uint_least16_t char16_t;
/* A 32-bit variant of wchar_t.
Note: This type does *NOT* denote UTF-32 code points. (Only on platforms
on which __STDC_UTF_32__ is defined.) */
typedef uint_least32_t char32_t;
#endif
/* Define if a 'char32_t' can hold more characters than a 'wchar_t'. */
#if @SMALL_WCHAR_T@ /* 32-bit AIX, Cygwin, native Windows */
# define _GL_LARGE_CHAR32_T 1
#endif
/* Convert a single-byte character to a 32-bit wide character. */
#if @GNULIB_BTOC32@
_GL_FUNCDECL_SYS (btoc32, wint_t, (int c) _GL_ATTRIBUTE_PURE);
_GL_CXXALIAS_SYS (btoc32, wint_t, (int c));
_GL_CXXALIASWARN (btoc32);
#endif
/* Test a specific property of a 32-bit wide character. */
#if @GNULIB_C32ISALNUM@
_GL_FUNCDECL_SYS (c32isalnum, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isalnum, int, (wint_t wc));
_GL_CXXALIASWARN (c32isalnum);
#endif
#if @GNULIB_C32ISALPHA@
_GL_FUNCDECL_SYS (c32isalpha, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isalpha, int, (wint_t wc));
_GL_CXXALIASWARN (c32isalpha);
#endif
#if @GNULIB_C32ISBLANK@
_GL_FUNCDECL_SYS (c32isblank, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isblank, int, (wint_t wc));
_GL_CXXALIASWARN (c32isblank);
#endif
#if @GNULIB_C32ISCNTRL@
_GL_FUNCDECL_SYS (c32iscntrl, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32iscntrl, int, (wint_t wc));
_GL_CXXALIASWARN (c32iscntrl);
#endif
#if @GNULIB_C32ISDIGIT@
_GL_FUNCDECL_SYS (c32isdigit, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isdigit, int, (wint_t wc));
_GL_CXXALIASWARN (c32isdigit);
#endif
#if @GNULIB_C32ISGRAPH@
_GL_FUNCDECL_SYS (c32isgraph, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isgraph, int, (wint_t wc));
_GL_CXXALIASWARN (c32isgraph);
#endif
#if @GNULIB_C32ISLOWER@
_GL_FUNCDECL_SYS (c32islower, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32islower, int, (wint_t wc));
_GL_CXXALIASWARN (c32islower);
#endif
#if @GNULIB_C32ISPRINT@
_GL_FUNCDECL_SYS (c32isprint, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isprint, int, (wint_t wc));
_GL_CXXALIASWARN (c32isprint);
#endif
#if @GNULIB_C32ISPUNCT@
_GL_FUNCDECL_SYS (c32ispunct, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32ispunct, int, (wint_t wc));
_GL_CXXALIASWARN (c32ispunct);
#endif
#if @GNULIB_C32ISSPACE@
_GL_FUNCDECL_SYS (c32isspace, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isspace, int, (wint_t wc));
_GL_CXXALIASWARN (c32isspace);
#endif
#if @GNULIB_C32ISUPPER@
_GL_FUNCDECL_SYS (c32isupper, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isupper, int, (wint_t wc));
_GL_CXXALIASWARN (c32isupper);
#endif
#if @GNULIB_C32ISXDIGIT@
_GL_FUNCDECL_SYS (c32isxdigit, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32isxdigit, int, (wint_t wc));
_GL_CXXALIASWARN (c32isxdigit);
#endif
/* Converts a 32-bit wide character to a multibyte character. */
#if @GNULIB_C32RTOMB@
# if @REPLACE_C32RTOMB@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef c32rtomb
# define c32rtomb rpl_c32rtomb
# endif
_GL_FUNCDECL_RPL (c32rtomb, size_t, (char *s, char32_t wc, mbstate_t *ps));
_GL_CXXALIAS_RPL (c32rtomb, size_t, (char *s, char32_t wc, mbstate_t *ps));
# else
# if !@HAVE_C32RTOMB@
_GL_FUNCDECL_SYS (c32rtomb, size_t, (char *s, char32_t wc, mbstate_t *ps));
# endif
_GL_CXXALIAS_SYS (c32rtomb, size_t, (char *s, char32_t wc, mbstate_t *ps));
# endif
_GL_CXXALIASWARN (c32rtomb);
#elif defined GNULIB_POSIXCHECK
# undef c32rtomb
# if HAVE_RAW_DECL_C32RTOMB
_GL_WARN_ON_USE (mbrtoc32, "c32rtomb is not portable - "
"use gnulib module c32rtomb for portability");
# endif
#endif
/* Convert a 32-bit wide string to a string. */
#if @GNULIB_C32SNRTOMBS@
_GL_FUNCDECL_SYS (c32snrtombs, size_t,
(char *dest, const char32_t **srcp, size_t srclen, size_t len,
mbstate_t *ps)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (c32snrtombs, size_t,
(char *dest, const char32_t **srcp, size_t srclen, size_t len,
mbstate_t *ps));
_GL_CXXALIASWARN (c32snrtombs);
#endif
/* Convert a 32-bit wide string to a string. */
#if @GNULIB_C32SRTOMBS@
_GL_FUNCDECL_SYS (c32srtombs, size_t,
(char *dest, const char32_t **srcp, size_t len, mbstate_t *ps)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (c32srtombs, size_t,
(char *dest, const char32_t **srcp, size_t len,
mbstate_t *ps));
_GL_CXXALIASWARN (c32srtombs);
#endif
/* Convert a 32-bit wide string to a string. */
#if @GNULIB_C32STOMBS@
_GL_FUNCDECL_SYS (c32stombs, size_t,
(char *dest, const char32_t *src, size_t len)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (c32stombs, size_t,
(char *dest, const char32_t *src, size_t len));
_GL_CXXALIASWARN (c32stombs);
#endif
/* Converts a 32-bit wide character to unibyte character.
Returns the single-byte representation of WC if it exists,
or EOF otherwise. */
#if @GNULIB_C32TOB@
_GL_FUNCDECL_SYS (c32tob, int, (wint_t wc));
_GL_CXXALIAS_SYS (c32tob, int, (wint_t wc));
_GL_CXXALIASWARN (c32tob);
#endif
/* Converts a multibyte character to a 32-bit wide character. */
#if @GNULIB_MBRTOC32@
# if @REPLACE_MBRTOC32@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef mbrtoc32
# define mbrtoc32 rpl_mbrtoc32
# endif
_GL_FUNCDECL_RPL (mbrtoc32, size_t,
(char32_t *pc, const char *s, size_t n, mbstate_t *ps));
_GL_CXXALIAS_RPL (mbrtoc32, size_t,
(char32_t *pc, const char *s, size_t n, mbstate_t *ps));
# else
# if !@HAVE_MBRTOC32@
_GL_FUNCDECL_SYS (mbrtoc32, size_t,
(char32_t *pc, const char *s, size_t n, mbstate_t *ps));
# endif
_GL_CXXALIAS_SYS (mbrtoc32, size_t,
(char32_t *pc, const char *s, size_t n, mbstate_t *ps));
# endif
_GL_CXXALIASWARN (mbrtoc32);
#elif defined GNULIB_POSIXCHECK
# undef mbrtoc32
# if HAVE_RAW_DECL_MBRTOC32
_GL_WARN_ON_USE (mbrtoc32, "mbrtoc32 is not portable - "
"use gnulib module mbrtoc32 for portability");
# endif
#endif
/* Convert a string to a 32-bit wide string. */
#if @GNULIB_MBSNRTOC32S@
_GL_FUNCDECL_SYS (mbsnrtoc32s, size_t,
(char32_t *dest, const char **srcp, size_t srclen, size_t len,
mbstate_t *ps)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (mbsnrtoc32s, size_t,
(char32_t *dest, const char **srcp, size_t srclen, size_t len,
mbstate_t *ps));
_GL_CXXALIASWARN (mbsnrtoc32s);
#endif
/* Convert a string to a 32-bit wide string. */
#if @GNULIB_MBSRTOC32S@
_GL_FUNCDECL_SYS (mbsrtoc32s, size_t,
(char32_t *dest, const char **srcp, size_t len, mbstate_t *ps)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (mbsrtoc32s, size_t,
(char32_t *dest, const char **srcp, size_t len,
mbstate_t *ps));
_GL_CXXALIASWARN (mbsrtoc32s);
#endif
/* Convert a string to a 32-bit wide string. */
#if @GNULIB_MBSTOC32S@
_GL_FUNCDECL_SYS (mbstoc32s, size_t,
(char32_t *dest, const char *src, size_t len)
_GL_ARG_NONNULL ((2)));
_GL_CXXALIAS_SYS (mbstoc32s, size_t,
(char32_t *dest, const char *src, size_t len));
_GL_CXXALIASWARN (mbstoc32s);
#endif
#endif /* _@GUARD_PREFIX@_UCHAR_H */