summaryrefslogtreecommitdiff
path: root/lib/unistr.in.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unistr.in.h')
-rw-r--r--lib/unistr.in.h587
1 files changed, 586 insertions, 1 deletions
diff --git a/lib/unistr.in.h b/lib/unistr.in.h
index 314013c8..9a8edadf 100644
--- a/lib/unistr.in.h
+++ b/lib/unistr.in.h
@@ -1,5 +1,5 @@
/* Elementary Unicode string functions.
- Copyright (C) 2001-2002, 2005-2024 Free Software Foundation, Inc.
+ Copyright (C) 2001-2002, 2005-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
@@ -87,6 +87,80 @@ extern const uint32_t *
u32_check (const uint32_t *s, size_t n)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_check_template (T* s, size_t n);
+template <>
+ inline uint8_t * u8_check_template (uint8_t *s, size_t n)
+ { return const_cast<uint8_t *>(u8_check (s, n)); }
+template <>
+ inline const uint8_t * u8_check_template (const uint8_t *s, size_t n)
+ { return u8_check (s, n); }
+# undef u8_check
+# define u8_check u8_check_template
+# elif !defined u8_check
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_check(s,n) \
+ _Generic ((s), \
+ uint8_t *: (uint8_t *) u8_check ((s), (n)), \
+ default : u8_check ((s), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_check_template (T* s, size_t n);
+template <>
+ inline uint16_t * u16_check_template (uint16_t *s, size_t n)
+ { return const_cast<uint16_t *>(u16_check (s, n)); }
+template <>
+ inline const uint16_t * u16_check_template (const uint16_t *s, size_t n)
+ { return u16_check (s, n); }
+# undef u16_check
+# define u16_check u16_check_template
+# elif !defined u16_check
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_check(s,n) \
+ _Generic ((s), \
+ uint16_t *: (uint16_t *) u16_check ((s), (n)), \
+ default : u16_check ((s), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_check_template (T* s, size_t n);
+template <>
+ inline uint32_t * u32_check_template (uint32_t *s, size_t n)
+ { return const_cast<uint32_t *>(u32_check (s, n)); }
+template <>
+ inline const uint32_t * u32_check_template (const uint32_t *s, size_t n)
+ { return u32_check (s, n); }
+# undef u32_check
+# define u32_check u32_check_template
+# elif !defined u32_check
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_check(s,n) \
+ _Generic ((s), \
+ uint32_t *: (uint32_t *) u32_check ((s), (n)), \
+ default : u32_check ((s), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
+
/* Elementary string conversions. */
@@ -450,6 +524,79 @@ extern uint16_t *
extern uint32_t *
u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_chr_template (T* str, size_t n, ucs4_t uc);
+template <>
+ inline uint8_t * u8_chr_template (uint8_t *str, size_t n, ucs4_t uc)
+ { return u8_chr (str, n, uc); }
+template <>
+ inline const uint8_t * u8_chr_template (const uint8_t *str, size_t n, ucs4_t uc)
+ { return u8_chr (str, n, uc); }
+# undef u8_chr
+# define u8_chr u8_chr_template
+# elif !defined u8_chr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_chr(s,n,u) \
+ _Generic ((s), \
+ uint8_t const *: (uint8_t const *) u8_chr ((s), (n), (u)), \
+ default : u8_chr ((s), (n), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_chr_template (T* str, size_t n, ucs4_t uc);
+template <>
+ inline uint16_t * u16_chr_template (uint16_t *str, size_t n, ucs4_t uc)
+ { return u16_chr (str, n, uc); }
+template <>
+ inline const uint16_t * u16_chr_template (const uint16_t *str, size_t n, ucs4_t uc)
+ { return u16_chr (str, n, uc); }
+# undef u16_chr
+# define u16_chr u16_chr_template
+# elif !defined u16_chr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_chr(s,n,u) \
+ _Generic ((s), \
+ uint16_t const *: (uint16_t const *) u16_chr ((s), (n), (u)), \
+ default : u16_chr ((s), (n), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_chr_template (T* str, size_t n, ucs4_t uc);
+template <>
+ inline uint32_t * u32_chr_template (uint32_t *str, size_t n, ucs4_t uc)
+ { return u32_chr (str, n, uc); }
+template <>
+ inline const uint32_t * u32_chr_template (const uint32_t *str, size_t n, ucs4_t uc)
+ { return u32_chr (str, n, uc); }
+# undef u32_chr
+# define u32_chr u32_chr_template
+# elif !defined u32_chr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_chr(s,n,u) \
+ _Generic ((s), \
+ uint32_t const *: (uint32_t const *) u32_chr ((s), (n), (u)), \
+ default : u32_chr ((s), (n), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Count the number of Unicode characters in the N units from S. */
/* Similar to mbsnlen(). */
@@ -506,6 +653,79 @@ extern const uint16_t *
u16_next (ucs4_t *puc, const uint16_t *s);
extern const uint32_t *
u32_next (ucs4_t *puc, const uint32_t *s);
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_next_template (ucs4_t *puc, T* s);
+template <>
+ inline uint8_t * u8_next_template (ucs4_t *puc, uint8_t *s)
+ { return const_cast<uint8_t *>(u8_next (puc, s)); }
+template <>
+ inline const uint8_t * u8_next_template (ucs4_t *puc, const uint8_t *s)
+ { return u8_next (puc, s); }
+# undef u8_next
+# define u8_next u8_next_template
+# elif !defined u8_next
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_next(p,s) \
+ _Generic ((s), \
+ uint8_t *: (uint8_t *) u8_next ((p), (s)), \
+ default : u8_next ((p), (s)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_next_template (ucs4_t *puc, T* s);
+template <>
+ inline uint16_t * u16_next_template (ucs4_t *puc, uint16_t *s)
+ { return const_cast<uint16_t *>(u16_next (puc, s)); }
+template <>
+ inline const uint16_t * u16_next_template (ucs4_t *puc, const uint16_t *s)
+ { return u16_next (puc, s); }
+# undef u16_next
+# define u16_next u16_next_template
+# elif !defined u16_next
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_next(p,s) \
+ _Generic ((s), \
+ uint16_t *: (uint16_t *) u16_next ((p), (s)), \
+ default : u16_next ((p), (s)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_next_template (ucs4_t *puc, T* s);
+template <>
+ inline uint32_t * u32_next_template (ucs4_t *puc, uint32_t *s)
+ { return const_cast<uint32_t *>(u32_next (puc, s)); }
+template <>
+ inline const uint32_t * u32_next_template (ucs4_t *puc, const uint32_t *s)
+ { return u32_next (puc, s); }
+# undef u32_next
+# define u32_next u32_next_template
+# elif !defined u32_next
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_next(p,s) \
+ _Generic ((s), \
+ uint32_t *: (uint32_t *) u32_next ((p), (s)), \
+ default : u32_next ((p), (s)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Backward iteration step. Advances the pointer to point to the previous
character, or returns NULL if the beginning of the string had been reached.
@@ -516,6 +736,79 @@ extern const uint16_t *
u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
extern const uint32_t *
u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_prev_template (ucs4_t *puc, T* s, const uint8_t *start);
+template <>
+ inline uint8_t * u8_prev_template (ucs4_t *puc, uint8_t *s, const uint8_t *start)
+ { return const_cast<uint8_t *>(u8_prev (puc, s, start)); }
+template <>
+ inline const uint8_t * u8_prev_template (ucs4_t *puc, const uint8_t *s, const uint8_t *start)
+ { return u8_prev (puc, s, start); }
+# undef u8_prev
+# define u8_prev u8_prev_template
+# elif !defined u8_prev
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_prev(p,s,start) \
+ _Generic ((s), \
+ uint8_t *: (uint8_t *) u8_prev ((p), (s), (start)), \
+ default : u8_prev ((p), (s), (start)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_prev_template (ucs4_t *puc, T* s, const uint16_t *start);
+template <>
+ inline uint16_t * u16_prev_template (ucs4_t *puc, uint16_t *s, const uint16_t *start)
+ { return const_cast<uint16_t *>(u16_prev (puc, s, start)); }
+template <>
+ inline const uint16_t * u16_prev_template (ucs4_t *puc, const uint16_t *s, const uint16_t *start)
+ { return u16_prev (puc, s, start); }
+# undef u16_prev
+# define u16_prev u16_prev_template
+# elif !defined u16_prev
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_prev(p,s,start) \
+ _Generic ((s), \
+ uint16_t *: (uint16_t *) u16_prev ((p), (s), (start)), \
+ default : u16_prev ((p), (s), (start)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_prev_template (ucs4_t *puc, T* s, const uint32_t *start);
+template <>
+ inline uint32_t * u32_prev_template (ucs4_t *puc, uint32_t *s, const uint32_t *start)
+ { return const_cast<uint32_t *>(u32_prev (puc, s, start)); }
+template <>
+ inline const uint32_t * u32_prev_template (ucs4_t *puc, const uint32_t *s, const uint32_t *start)
+ { return u32_prev (puc, s, start); }
+# undef u32_prev
+# define u32_prev u32_prev_template
+# elif !defined u32_prev
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_prev(p,s,start) \
+ _Generic ((s), \
+ uint32_t *: (uint32_t *) u32_prev ((p), (s), (start)), \
+ default : u32_prev ((p), (s), (start)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Return the number of units in S. */
/* Similar to strlen(), wcslen(). */
@@ -662,6 +955,79 @@ extern uint16_t *
extern uint32_t *
u32_strchr (const uint32_t *str, ucs4_t uc)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_strchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint8_t * u8_strchr_template (uint8_t *str, ucs4_t uc)
+ { return u8_strchr (str, uc); }
+template <>
+ inline const uint8_t * u8_strchr_template (const uint8_t *str, ucs4_t uc)
+ { return u8_strchr (str, uc); }
+# undef u8_strchr
+# define u8_strchr u8_strchr_template
+# elif !defined u8_strchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_strchr(s,u) \
+ _Generic ((s), \
+ uint8_t const *: (uint8_t const *) u8_strchr ((s), (u)), \
+ default : u8_strchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_strchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint16_t * u16_strchr_template (uint16_t *str, ucs4_t uc)
+ { return u16_strchr (str, uc); }
+template <>
+ inline const uint16_t * u16_strchr_template (const uint16_t *str, ucs4_t uc)
+ { return u16_strchr (str, uc); }
+# undef u16_strchr
+# define u16_strchr u16_strchr_template
+# elif !defined u16_strchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_strchr(s,u) \
+ _Generic ((s), \
+ uint16_t const *: (uint16_t const *) u16_strchr ((s), (u)), \
+ default : u16_strchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_strchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint32_t * u32_strchr_template (uint32_t *str, ucs4_t uc)
+ { return u32_strchr (str, uc); }
+template <>
+ inline const uint32_t * u32_strchr_template (const uint32_t *str, ucs4_t uc)
+ { return u32_strchr (str, uc); }
+# undef u32_strchr
+# define u32_strchr u32_strchr_template
+# elif !defined u32_strchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_strchr(s,u) \
+ _Generic ((s), \
+ uint32_t const *: (uint32_t const *) u32_strchr ((s), (u)), \
+ default : u32_strchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Find the last occurrence of UC in STR. */
/* Similar to strrchr(), wcsrchr(). */
@@ -674,6 +1040,79 @@ extern uint16_t *
extern uint32_t *
u32_strrchr (const uint32_t *str, ucs4_t uc)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_strrchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint8_t * u8_strrchr_template (uint8_t *str, ucs4_t uc)
+ { return u8_strrchr (str, uc); }
+template <>
+ inline const uint8_t * u8_strrchr_template (const uint8_t *str, ucs4_t uc)
+ { return u8_strrchr (str, uc); }
+# undef u8_strrchr
+# define u8_strrchr u8_strrchr_template
+# elif !defined u8_strrchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_strrchr(s,u) \
+ _Generic ((s), \
+ uint8_t const *: (uint8_t const *) u8_strrchr ((s), (u)), \
+ default : u8_strrchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_strrchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint16_t * u16_strrchr_template (uint16_t *str, ucs4_t uc)
+ { return u16_strrchr (str, uc); }
+template <>
+ inline const uint16_t * u16_strrchr_template (const uint16_t *str, ucs4_t uc)
+ { return u16_strrchr (str, uc); }
+# undef u16_strrchr
+# define u16_strrchr u16_strrchr_template
+# elif !defined u16_strrchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_strrchr(s,u) \
+ _Generic ((s), \
+ uint16_t const *: (uint16_t const *) u16_strrchr ((s), (u)), \
+ default : u16_strrchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_strrchr_template (T* str, ucs4_t uc);
+template <>
+ inline uint32_t * u32_strrchr_template (uint32_t *str, ucs4_t uc)
+ { return u32_strrchr (str, uc); }
+template <>
+ inline const uint32_t * u32_strrchr_template (const uint32_t *str, ucs4_t uc)
+ { return u32_strrchr (str, uc); }
+# undef u32_strrchr
+# define u32_strrchr u32_strrchr_template
+# elif !defined u32_strrchr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_strrchr(s,u) \
+ _Generic ((s), \
+ uint32_t const *: (uint32_t const *) u32_strrchr ((s), (u)), \
+ default : u32_strrchr ((s), (u)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Return the length of the initial segment of STR which consists entirely
of Unicode characters not in REJECT. */
@@ -712,6 +1151,79 @@ extern uint16_t *
extern uint32_t *
u32_strpbrk (const uint32_t *str, const uint32_t *accept)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_strpbrk_template (T* str, const uint8_t *accept);
+template <>
+ inline uint8_t * u8_strpbrk_template (uint8_t *str, const uint8_t *accept)
+ { return u8_strpbrk (str, accept); }
+template <>
+ inline const uint8_t * u8_strpbrk_template (const uint8_t *str, const uint8_t *accept)
+ { return u8_strpbrk (str, accept); }
+# undef u8_strpbrk
+# define u8_strpbrk u8_strpbrk_template
+# elif !defined u8_strpbrk
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_strpbrk(s,a) \
+ _Generic ((s), \
+ uint8_t const *: (uint8_t const *) u8_strpbrk ((s), (a)), \
+ default : u8_strpbrk ((s), (a)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_strpbrk_template (T* str, const uint16_t *accept);
+template <>
+ inline uint16_t * u16_strpbrk_template (uint16_t *str, const uint16_t *accept)
+ { return u16_strpbrk (str, accept); }
+template <>
+ inline const uint16_t * u16_strpbrk_template (const uint16_t *str, const uint16_t *accept)
+ { return u16_strpbrk (str, accept); }
+# undef u16_strpbrk
+# define u16_strpbrk u16_strpbrk_template
+# elif !defined u16_strpbrk
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_strpbrk(s,a) \
+ _Generic ((s), \
+ uint16_t const *: (uint16_t const *) u16_strpbrk ((s), (a)), \
+ default : u16_strpbrk ((s), (a)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_strpbrk_template (T* str, const uint32_t *accept);
+template <>
+ inline uint32_t * u32_strpbrk_template (uint32_t *str, const uint32_t *accept)
+ { return u32_strpbrk (str, accept); }
+template <>
+ inline const uint32_t * u32_strpbrk_template (const uint32_t *str, const uint32_t *accept)
+ { return u32_strpbrk (str, accept); }
+# undef u32_strpbrk
+# define u32_strpbrk u32_strpbrk_template
+# elif !defined u32_strpbrk
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_strpbrk(s,a) \
+ _Generic ((s), \
+ uint32_t const *: (uint32_t const *) u32_strpbrk ((s), (a)), \
+ default : u32_strpbrk ((s), (a)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Find the first occurrence of NEEDLE in HAYSTACK. */
/* Similar to strstr(), wcsstr(). */
@@ -724,6 +1236,79 @@ extern uint16_t *
extern uint32_t *
u32_strstr (const uint32_t *haystack, const uint32_t *needle)
_UC_ATTRIBUTE_PURE;
+#ifndef _LIBUNISTRING_NO_CONST_GENERICS
+# ifdef __cplusplus
+}
+# endif
+/* Don't silently convert a 'const uintN_t *' to a 'uintN_t *'. Programmers
+ want compiler warnings for 'const' related mistakes. */
+# ifdef __cplusplus
+template <typename T>
+ T * u8_strstr_template (T* haystack, const uint8_t *needle);
+template <>
+ inline uint8_t * u8_strstr_template (uint8_t *haystack, const uint8_t *needle)
+ { return u8_strstr (haystack, needle); }
+template <>
+ inline const uint8_t * u8_strstr_template (const uint8_t *haystack, const uint8_t *needle)
+ { return u8_strstr (haystack, needle); }
+# undef u8_strstr
+# define u8_strstr u8_strstr_template
+# elif !defined u8_strstr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u8_strstr(h,n) \
+ _Generic ((h), \
+ uint8_t const *: (uint8_t const *) u8_strstr ((h), (n)), \
+ default : u8_strstr ((h), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u16_strstr_template (T* haystack, const uint16_t *needle);
+template <>
+ inline uint16_t * u16_strstr_template (uint16_t *haystack, const uint16_t *needle)
+ { return u16_strstr (haystack, needle); }
+template <>
+ inline const uint16_t * u16_strstr_template (const uint16_t *haystack, const uint16_t *needle)
+ { return u16_strstr (haystack, needle); }
+# undef u16_strstr
+# define u16_strstr u16_strstr_template
+# elif !defined u16_strstr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u16_strstr(h,n) \
+ _Generic ((h), \
+ uint16_t const *: (uint16_t const *) u16_strstr ((h), (n)), \
+ default : u16_strstr ((h), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+template <typename T>
+ T * u32_strstr_template (T* haystack, const uint32_t *needle);
+template <>
+ inline uint32_t * u32_strstr_template (uint32_t *haystack, const uint32_t *needle)
+ { return u32_strstr (haystack, needle); }
+template <>
+ inline const uint32_t * u32_strstr_template (const uint32_t *haystack, const uint32_t *needle)
+ { return u32_strstr (haystack, needle); }
+# undef u32_strstr
+# define u32_strstr u32_strstr_template
+# elif !defined u32_strstr
+# if ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \
+ || defined __ICC || defined __TINYC__ \
+ || (__STDC_VERSION__ >= 201112L && !(defined __GNUC__ || defined __clang__)))
+# define u32_strstr(h,n) \
+ _Generic ((h), \
+ uint32_t const *: (uint32_t const *) u32_strstr ((h), (n)), \
+ default : u32_strstr ((h), (n)))
+# endif
+# endif
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
/* Test whether STR starts with PREFIX. */
extern bool