This patch applies the const-improved function macros idiom to libunistring. It's 30 times the same idiom.
2025-02-09 Bruno Haible <br...@clisp.org> unistr, unigbrk: Use const-improved function macros for 30 functions. Reported by Kang-Che Sung <explore...@gmail.com> in <https://lists.gnu.org/archive/html/bug-libunistring/2025-02/msg00000.html>. * lib/unistr.in.h (u*_check, u*_next, u*_prev): Define as macros that cast the result to a non-const pointer when the argument is a non-const pointer. (u*_chr, u*_strchr, u*_strrchr, u*_strpbrk, u*_strstr): Define as macros that cast the result to a const pointer when the argument is a const pointer. * lib/unistr/u8-check.c: Define _LIBUNISTRING_NO_CONST_GENERICS. * lib/unistr/u16-check.c: Likewise. * lib/unistr/u32-check.c: Likewise. * lib/unistr/u8-next.c: Likewise. * lib/unistr/u16-next.c: Likewise. * lib/unistr/u32-next.c: Likewise. * lib/unistr/u8-prev.c: Likewise. * lib/unistr/u16-prev.c: Likewise. * lib/unistr/u32-prev.c: Likewise. * lib/unistr/u8-chr.c: Likewise. * lib/unistr/u16-chr.c: Likewise. * lib/unistr/u32-chr.c: Likewise. * lib/unistr/u8-strchr.c: Likewise. * lib/unistr/u16-strchr.c: Likewise. * lib/unistr/u32-strchr.c: Likewise. * lib/unistr/u8-strrchr.c: Likewise. * lib/unistr/u16-strrchr.c: Likewise. * lib/unistr/u32-strrchr.c: Likewise. * lib/unistr/u8-strpbrk.c: Likewise. * lib/unistr/u16-strpbrk.c: Likewise. * lib/unistr/u32-strpbrk.c: Likewise. * lib/unistr/u8-strstr.c: Likewise. * lib/unistr/u16-strstr.c: Likewise. * lib/unistr/u32-strstr.c: Likewise. * lib/unigbrk.in.h (u*_grapheme_next, u*_grapheme_prev): Define as macros that cast the result to a non-const pointer when the argument is a non-const pointer. * lib/unigbrk/u8-grapheme-next.c: Define _LIBUNISTRING_NO_CONST_GENERICS. * lib/unigbrk/u16-grapheme-next.c: Likewise. * lib/unigbrk/u32-grapheme-next.c: Likewise. * lib/unigbrk/u8-grapheme-prev.c: Likewise. * lib/unigbrk/u16-grapheme-prev.c: Likewise. * lib/unigbrk/u32-grapheme-prev.c: Likewise. diff --git a/lib/unigbrk.in.h b/lib/unigbrk.in.h index e96025274d..19c3e0771b 100644 --- a/lib/unigbrk.in.h +++ b/lib/unigbrk.in.h @@ -110,6 +110,73 @@ extern const uint16_t * extern const uint32_t * u32_grapheme_next (const uint32_t *s, const uint32_t *end) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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_grapheme_next_template (T* s, const uint8_t *end); +template <> + inline uint8_t * u8_grapheme_next_template (uint8_t *s, const uint8_t *end) + { return const_cast<uint8_t *>(u8_grapheme_next (s, end)); } +template <> + inline const uint8_t * u8_grapheme_next_template (const uint8_t *s, const uint8_t *end) + { return u8_grapheme_next (s, end); } +# define u8_grapheme_next u8_grapheme_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_grapheme_next(s,end) (typeof ((s) + 0)) u8_grapheme_next ((s), (end)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u8_grapheme_next(s,end) \ + _Generic ((s), \ + uint8_t *: (uint8_t *) u8_grapheme_next ((s), (end)), \ + default : u8_grapheme_next ((s), (end))) +# endif +# endif +# ifdef __cplusplus +template <typename T> + T * u16_grapheme_next_template (T* s, const uint16_t *end); +template <> + inline uint16_t * u16_grapheme_next_template (uint16_t *s, const uint16_t *end) + { return const_cast<uint16_t *>(u16_grapheme_next (s, end)); } +template <> + inline const uint16_t * u16_grapheme_next_template (const uint16_t *s, const uint16_t *end) + { return u16_grapheme_next (s, end); } +# define u16_grapheme_next u16_grapheme_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_grapheme_next(s,end) (typeof ((s) + 0)) u16_grapheme_next ((s), (end)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u16_grapheme_next(s,end) \ + _Generic ((s), \ + uint16_t *: (uint16_t *) u16_grapheme_next ((s), (end)), \ + default : u16_grapheme_next ((s), (end))) +# endif +# endif +# ifdef __cplusplus +template <typename T> + T * u32_grapheme_next_template (T* s, const uint32_t *end); +template <> + inline uint32_t * u32_grapheme_next_template (uint32_t *s, const uint32_t *end) + { return const_cast<uint32_t *>(u32_grapheme_next (s, end)); } +template <> + inline const uint32_t * u32_grapheme_next_template (const uint32_t *s, const uint32_t *end) + { return u32_grapheme_next (s, end); } +# define u32_grapheme_next u32_grapheme_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_grapheme_next(s,end) (typeof ((s) + 0)) u32_grapheme_next ((s), (end)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_grapheme_next(s,end) \ + _Generic ((s), \ + uint32_t *: (uint32_t *) u32_grapheme_next ((s), (end)), \ + default : u32_grapheme_next ((s), (end))) +# endif +# endif +#endif /* Returns the start of the previous grapheme cluster before S, or NULL if the start of the string has been reached. @@ -124,6 +191,73 @@ extern const uint16_t * extern const uint32_t * u32_grapheme_prev (const uint32_t *s, const uint32_t *start) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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_grapheme_prev_template (T* s, const uint8_t *start); +template <> + inline uint8_t * u8_grapheme_prev_template (uint8_t *s, const uint8_t *start) + { return const_cast<uint8_t *>(u8_grapheme_prev (s, start)); } +template <> + inline const uint8_t * u8_grapheme_prev_template (const uint8_t *s, const uint8_t *start) + { return u8_grapheme_prev (s, start); } +# define u8_grapheme_prev u8_grapheme_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_grapheme_prev(s,start) (typeof ((s) + 0)) u8_grapheme_prev ((s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u8_grapheme_prev(s,start) \ + _Generic ((s), \ + uint8_t *: (uint8_t *) u8_grapheme_prev ((s), (start)), \ + default : u8_grapheme_prev ((s), (start))) +# endif +# endif +# ifdef __cplusplus +template <typename T> + T * u16_grapheme_prev_template (T* s, const uint16_t *start); +template <> + inline uint16_t * u16_grapheme_prev_template (uint16_t *s, const uint16_t *start) + { return const_cast<uint16_t *>(u16_grapheme_prev (s, start)); } +template <> + inline const uint16_t * u16_grapheme_prev_template (const uint16_t *s, const uint16_t *start) + { return u16_grapheme_prev (s, start); } +# define u16_grapheme_prev u16_grapheme_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_grapheme_prev(s,start) (typeof ((s) + 0)) u16_grapheme_prev ((s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u16_grapheme_prev(s,start) \ + _Generic ((s), \ + uint16_t *: (uint16_t *) u16_grapheme_prev ((s), (start)), \ + default : u16_grapheme_prev ((s), (start))) +# endif +# endif +# ifdef __cplusplus +template <typename T> + T * u32_grapheme_prev_template (T* s, const uint32_t *start); +template <> + inline uint32_t * u32_grapheme_prev_template (uint32_t *s, const uint32_t *start) + { return const_cast<uint32_t *>(u32_grapheme_prev (s, start)); } +template <> + inline const uint32_t * u32_grapheme_prev_template (const uint32_t *s, const uint32_t *start) + { return u32_grapheme_prev (s, start); } +# define u32_grapheme_prev u32_grapheme_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_grapheme_prev(s,start) (typeof ((s) + 0)) u32_grapheme_prev ((s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_grapheme_prev(s,start) \ + _Generic ((s), \ + uint32_t *: (uint32_t *) u32_grapheme_prev ((s), (start)), \ + default : u32_grapheme_prev ((s), (start))) +# endif +# endif +#endif /* Determine the grapheme cluster boundaries in S, and store the result at p[0..n-1]. p[i] = 1 means that a new grapheme cluster begins at s[i]. p[i] diff --git a/lib/unigbrk/u16-grapheme-next.c b/lib/unigbrk/u16-grapheme-next.c index 976cbd27de..b0e47e17c8 100644 --- a/lib/unigbrk/u16-grapheme-next.c +++ b/lib/unigbrk/u16-grapheme-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unigbrk/u16-grapheme-prev.c b/lib/unigbrk/u16-grapheme-prev.c index 47600bd433..02fe72f261 100644 --- a/lib/unigbrk/u16-grapheme-prev.c +++ b/lib/unigbrk/u16-grapheme-prev.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unigbrk/u32-grapheme-next.c b/lib/unigbrk/u32-grapheme-next.c index 35143967e1..28fc5052e5 100644 --- a/lib/unigbrk/u32-grapheme-next.c +++ b/lib/unigbrk/u32-grapheme-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unigbrk/u32-grapheme-prev.c b/lib/unigbrk/u32-grapheme-prev.c index 8f962b5aa1..c76fb9ab52 100644 --- a/lib/unigbrk/u32-grapheme-prev.c +++ b/lib/unigbrk/u32-grapheme-prev.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unigbrk/u8-grapheme-next.c b/lib/unigbrk/u8-grapheme-next.c index 95b6caba6a..b1d2e3dd3e 100644 --- a/lib/unigbrk/u8-grapheme-next.c +++ b/lib/unigbrk/u8-grapheme-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unigbrk/u8-grapheme-prev.c b/lib/unigbrk/u8-grapheme-prev.c index 13a5036e39..79748cf3fb 100644 --- a/lib/unigbrk/u8-grapheme-prev.c +++ b/lib/unigbrk/u8-grapheme-prev.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr.in.h b/lib/unistr.in.h index 221700b4a6..fd5e0067b2 100644 --- a/lib/unistr.in.h +++ b/lib/unistr.in.h @@ -81,6 +81,74 @@ extern const uint32_t * u32_check (const uint32_t *s, size_t n) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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); } +# define u8_check u8_check_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_check(s,n) (typeof ((s) + 0)) u8_check ((s), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_check u16_check_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_check(s,n) (typeof ((s) + 0)) u16_check ((s), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_check u32_check_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_check(s,n) (typeof ((s) + 0)) u32_check ((s), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_check(s,n) \ + _Generic ((s), \ + uint32_t *: (uint32_t *) u32_check ((s), (n)), \ + default : u32_check ((s), (n))) +# endif +# endif +#endif + /* Elementary string conversions. */ @@ -444,6 +512,73 @@ 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 +/* 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); } +# define u8_chr u8_chr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_chr(s,n,u) (typeof ((s) + 0)) u8_chr ((s), (n), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_chr u16_chr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_chr(s,n,u) (typeof ((s) + 0)) u16_chr ((s), (n), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_chr u32_chr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_chr(s,n,u) (typeof ((s) + 0)) u32_chr ((s), (n), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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 +#endif /* Count the number of Unicode characters in the N units from S. */ /* Similar to mbsnlen(). */ @@ -500,6 +635,73 @@ 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 +/* 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); } +# define u8_next u8_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_next(p,s) (typeof ((s) + 0)) u8_next ((p), (s)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_next u16_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_next(p,s) (typeof ((s) + 0)) u16_next ((p), (s)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_next u32_next_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_next(p,s) (typeof ((s) + 0)) u32_next ((p), (s)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_next(p,s) \ + _Generic ((s), \ + uint32_t *: (uint32_t *) u32_next ((p), (s)), \ + default : u32_next ((p), (s))) +# endif +# 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. @@ -510,6 +712,73 @@ 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 +/* 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); } +# define u8_prev u8_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_prev(p,s,start) (typeof ((s) + 0)) u8_prev ((p), (s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_prev u16_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_prev(p,s,start) (typeof ((s) + 0)) u16_prev ((p), (s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_prev u32_prev_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_prev(p,s,start) (typeof ((s) + 0)) u32_prev ((p), (s), (start)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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 +#endif /* Return the number of units in S. */ /* Similar to strlen(), wcslen(). */ @@ -656,6 +925,73 @@ extern uint16_t * extern uint32_t * u32_strchr (const uint32_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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); } +# define u8_strchr u8_strchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_strchr(s,u) (typeof ((s) + 0)) u8_strchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_strchr u16_strchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_strchr(s,u) (typeof ((s) + 0)) u16_strchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_strchr u32_strchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_strchr(s,u) (typeof ((s) + 0)) u32_strchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_strchr(s,u) \ + _Generic ((s), \ + uint32_t const *: (uint32_t const *) u32_strchr ((s), (u)), \ + default : u32_strchr ((s), (u))) +# endif +# endif +#endif /* Find the last occurrence of UC in STR. */ /* Similar to strrchr(), wcsrchr(). */ @@ -668,6 +1004,73 @@ extern uint16_t * extern uint32_t * u32_strrchr (const uint32_t *str, ucs4_t uc) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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); } +# define u8_strrchr u8_strrchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_strrchr(s,u) (typeof ((s) + 0)) u8_strrchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_strrchr u16_strrchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_strrchr(s,u) (typeof ((s) + 0)) u16_strrchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_strrchr u32_strrchr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_strrchr(s,u) (typeof ((s) + 0)) u32_strrchr ((s), (u)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_strrchr(s,u) \ + _Generic ((s), \ + uint32_t const *: (uint32_t const *) u32_strrchr ((s), (u)), \ + default : u32_strrchr ((s), (u))) +# endif +# endif +#endif /* Return the length of the initial segment of STR which consists entirely of Unicode characters not in REJECT. */ @@ -706,6 +1109,73 @@ extern uint16_t * extern uint32_t * u32_strpbrk (const uint32_t *str, const uint32_t *accept) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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); } +# define u8_strpbrk u8_strpbrk_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_strpbrk(s,a) (typeof ((s) + 0)) u8_strpbrk ((s), (a)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_strpbrk u16_strpbrk_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_strpbrk(s,a) (typeof ((s) + 0)) u16_strpbrk ((s), (a)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_strpbrk u32_strpbrk_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_strpbrk(s,a) (typeof ((s) + 0)) u32_strpbrk ((s), (a)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_strpbrk(s,a) \ + _Generic ((s), \ + uint32_t const *: (uint32_t const *) u32_strpbrk ((s), (a)), \ + default : u32_strpbrk ((s), (a))) +# endif +# endif +#endif /* Find the first occurrence of NEEDLE in HAYSTACK. */ /* Similar to strstr(), wcsstr(). */ @@ -718,6 +1188,73 @@ extern uint16_t * extern uint32_t * u32_strstr (const uint32_t *haystack, const uint32_t *needle) _UC_ATTRIBUTE_PURE; +#ifndef _LIBUNISTRING_NO_CONST_GENERICS +/* 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); } +# define u8_strstr u8_strstr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u8_strstr(h,n) (typeof ((h) + 0)) u8_strstr ((h), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u16_strstr u16_strstr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u16_strstr(h,n) (typeof ((h) + 0)) u16_strstr ((h), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# 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); } +# define u32_strstr u32_strstr_template +# else +# if __STDC_VERSION__ >= 202311 +# define u32_strstr(h,n) (typeof ((h) + 0)) u32_strstr ((h), (n)) +# elif ((__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) || (__clang_major__ >= 3) \ + || defined __ICC || defined __TINYC__) +# define u32_strstr(h,n) \ + _Generic ((h), \ + uint32_t const *: (uint32_t const *) u32_strstr ((h), (n)), \ + default : u32_strstr ((h), (n))) +# endif +# endif +#endif /* Test whether STR starts with PREFIX. */ extern bool diff --git a/lib/unistr/u16-check.c b/lib/unistr/u16-check.c index 15fe82e97c..485bb8ea5c 100644 --- a/lib/unistr/u16-check.c +++ b/lib/unistr/u16-check.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-chr.c b/lib/unistr/u16-chr.c index 26c9f7048e..6c7999ad33 100644 --- a/lib/unistr/u16-chr.c +++ b/lib/unistr/u16-chr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-next.c b/lib/unistr/u16-next.c index f975a725b5..d74ae22492 100644 --- a/lib/unistr/u16-next.c +++ b/lib/unistr/u16-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-prev.c b/lib/unistr/u16-prev.c index 073349d336..53823e0601 100644 --- a/lib/unistr/u16-prev.c +++ b/lib/unistr/u16-prev.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-strchr.c b/lib/unistr/u16-strchr.c index 2f094731c7..832c0e8ffe 100644 --- a/lib/unistr/u16-strchr.c +++ b/lib/unistr/u16-strchr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-strpbrk.c b/lib/unistr/u16-strpbrk.c index ef38ad3564..e9a65088ab 100644 --- a/lib/unistr/u16-strpbrk.c +++ b/lib/unistr/u16-strpbrk.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-strrchr.c b/lib/unistr/u16-strrchr.c index 52b07d1b81..6aa7c407cf 100644 --- a/lib/unistr/u16-strrchr.c +++ b/lib/unistr/u16-strrchr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u16-strstr.c b/lib/unistr/u16-strstr.c index 52f01551f3..6e0681dc5b 100644 --- a/lib/unistr/u16-strstr.c +++ b/lib/unistr/u16-strstr.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-check.c b/lib/unistr/u32-check.c index 67aced04ec..e6d95e989a 100644 --- a/lib/unistr/u32-check.c +++ b/lib/unistr/u32-check.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-chr.c b/lib/unistr/u32-chr.c index ee96f22009..956c33af26 100644 --- a/lib/unistr/u32-chr.c +++ b/lib/unistr/u32-chr.c @@ -15,6 +15,9 @@ 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/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-next.c b/lib/unistr/u32-next.c index 47b2415d55..9ed2ef134c 100644 --- a/lib/unistr/u32-next.c +++ b/lib/unistr/u32-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-prev.c b/lib/unistr/u32-prev.c index 007813a816..626be452b0 100644 --- a/lib/unistr/u32-prev.c +++ b/lib/unistr/u32-prev.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-strchr.c b/lib/unistr/u32-strchr.c index a1139f69ce..8b8abfd7a4 100644 --- a/lib/unistr/u32-strchr.c +++ b/lib/unistr/u32-strchr.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-strpbrk.c b/lib/unistr/u32-strpbrk.c index 1be2545128..f057dea0a9 100644 --- a/lib/unistr/u32-strpbrk.c +++ b/lib/unistr/u32-strpbrk.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-strrchr.c b/lib/unistr/u32-strrchr.c index 258935e846..10d5958c52 100644 --- a/lib/unistr/u32-strrchr.c +++ b/lib/unistr/u32-strrchr.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u32-strstr.c b/lib/unistr/u32-strstr.c index 68cd545b53..08b9745389 100644 --- a/lib/unistr/u32-strstr.c +++ b/lib/unistr/u32-strstr.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-check.c b/lib/unistr/u8-check.c index b4c7d580eb..e7c56f1e5c 100644 --- a/lib/unistr/u8-check.c +++ b/lib/unistr/u8-check.c @@ -15,6 +15,9 @@ 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/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-chr.c b/lib/unistr/u8-chr.c index 53a8a6603f..c34e1fe3e8 100644 --- a/lib/unistr/u8-chr.c +++ b/lib/unistr/u8-chr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-next.c b/lib/unistr/u8-next.c index 9068c567ad..3701701a5a 100644 --- a/lib/unistr/u8-next.c +++ b/lib/unistr/u8-next.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-prev.c b/lib/unistr/u8-prev.c index 7a309f6497..e9d0eec5e3 100644 --- a/lib/unistr/u8-prev.c +++ b/lib/unistr/u8-prev.c @@ -15,6 +15,9 @@ 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/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-strchr.c b/lib/unistr/u8-strchr.c index b39962e8d6..3ccf051646 100644 --- a/lib/unistr/u8-strchr.c +++ b/lib/unistr/u8-strchr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-strpbrk.c b/lib/unistr/u8-strpbrk.c index ff51858a4a..3adc03f97d 100644 --- a/lib/unistr/u8-strpbrk.c +++ b/lib/unistr/u8-strpbrk.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-strrchr.c b/lib/unistr/u8-strrchr.c index 6b6c12e54b..4f364fa682 100644 --- a/lib/unistr/u8-strrchr.c +++ b/lib/unistr/u8-strrchr.c @@ -24,6 +24,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */ diff --git a/lib/unistr/u8-strstr.c b/lib/unistr/u8-strstr.c index e7cd016381..eb30108ef0 100644 --- a/lib/unistr/u8-strstr.c +++ b/lib/unistr/u8-strstr.c @@ -23,6 +23,9 @@ License and of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. */ +/* Don't use the const-improved function macros in this compilation unit. */ +#define _LIBUNISTRING_NO_CONST_GENERICS + #include <config.h> /* Specification. */