summaryrefslogtreecommitdiffstats
path: root/gl/strings.in.h
diff options
context:
space:
mode:
Diffstat (limited to 'gl/strings.in.h')
-rw-r--r--gl/strings.in.h150
1 files changed, 130 insertions, 20 deletions
diff --git a/gl/strings.in.h b/gl/strings.in.h
index 2b3e062a..40c891d7 100644
--- a/gl/strings.in.h
+++ b/gl/strings.in.h
@@ -1,6 +1,6 @@
1/* A substitute <strings.h>. 1/* A substitute <strings.h>.
2 2
3 Copyright (C) 2007-2024 Free Software Foundation, Inc. 3 Copyright (C) 2007-2025 Free Software Foundation, Inc.
4 4
5 This file is free software: you can redistribute it and/or modify 5 This file is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as 6 it under the terms of the GNU Lesser General Public License as
@@ -36,7 +36,7 @@
36#ifndef _@GUARD_PREFIX@_STRINGS_H 36#ifndef _@GUARD_PREFIX@_STRINGS_H
37#define _@GUARD_PREFIX@_STRINGS_H 37#define _@GUARD_PREFIX@_STRINGS_H
38 38
39/* This file uses GNULIB_POSIXCHECK, HAVE_RAW_DECL_*. */ 39/* This file uses _GL_ARG_NONNULL, GNULIB_POSIXCHECK, HAVE_RAW_DECL_*. */
40#if !_GL_CONFIG_H_INCLUDED 40#if !_GL_CONFIG_H_INCLUDED
41 #error "Please include config.h first." 41 #error "Please include config.h first."
42#endif 42#endif
@@ -46,6 +46,16 @@
46# include <stddef.h> 46# include <stddef.h>
47#endif 47#endif
48 48
49#if @GNULIB_STRCASECMP_L@ || @GNULIB_STRNCASECMP_L@
50/* Get locale_t. */
51# include <locale.h>
52# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ < 10) \
53 || (defined __APPLE__ && defined __MACH__))
54/* Get the declaration of strcasecmp_l. */
55# include <string.h>
56# endif
57#endif
58
49 59
50/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ 60/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
51 61
@@ -58,10 +68,10 @@ extern "C" {
58#endif 68#endif
59 69
60 70
61 /* Find the index of the least-significant set bit. */
62#if @GNULIB_FFS@ 71#if @GNULIB_FFS@
72/* Find the index of the least-significant set bit. */
63# if !@HAVE_FFS@ 73# if !@HAVE_FFS@
64_GL_FUNCDECL_SYS (ffs, int, (int i)); 74_GL_FUNCDECL_SYS (ffs, int, (int i), );
65# endif 75# endif
66_GL_CXXALIAS_SYS (ffs, int, (int i)); 76_GL_CXXALIAS_SYS (ffs, int, (int i));
67_GL_CXXALIASWARN (ffs); 77_GL_CXXALIASWARN (ffs);
@@ -72,52 +82,152 @@ _GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
72# endif 82# endif
73#endif 83#endif
74 84
85#if @GNULIB_STRCASECMP@
75/* Compare strings S1 and S2, ignoring case, returning less than, equal to or 86/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
76 greater than zero if S1 is lexicographically less than, equal to or greater 87 greater than zero if S1 is lexicographically less than, equal to or greater
77 than S2. 88 than S2.
78 Note: This function does not work in multibyte locales. */ 89 Note: This function does not work in multibyte locales. */
79#if ! @HAVE_STRCASECMP@ 90# if @REPLACE_STRCASECMP@
80extern int strcasecmp (char const *s1, char const *s2) 91# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
81 _GL_ARG_NONNULL ((1, 2)); 92# undef strcasecmp
82#endif 93# define strcasecmp rpl_strcasecmp
83#if defined GNULIB_POSIXCHECK 94# endif
95_GL_FUNCDECL_RPL (strcasecmp, int, (const char *, const char *),
96 _GL_ARG_NONNULL ((1, 2)));
97_GL_CXXALIAS_RPL (strcasecmp, int, (const char *, const char *));
98# else
99# if !@HAVE_STRCASECMP@
100_GL_FUNCDECL_SYS (strcasecmp, int, (const char *, const char *),
101 _GL_ARG_NONNULL ((1, 2)));
102# endif
103_GL_CXXALIAS_SYS (strcasecmp, int, (const char *, const char *));
104# endif
105# if __GLIBC__ >= 2
106_GL_CXXALIASWARN (strcasecmp);
107# endif
108#elif defined GNULIB_POSIXCHECK
84/* strcasecmp() does not work with multibyte strings: 109/* strcasecmp() does not work with multibyte strings:
85 POSIX says that it operates on "strings", and "string" in POSIX is defined 110 POSIX says that it operates on "strings", and "string" in POSIX is defined
86 as a sequence of bytes, not of characters. */ 111 as a sequence of bytes, not of characters. */
87# undef strcasecmp 112# undef strcasecmp
88# if HAVE_RAW_DECL_STRCASECMP 113# if HAVE_RAW_DECL_STRCASECMP
89_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character " 114_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
90 "strings in multibyte locales - " 115 "strings in multibyte locales and is unportable - "
91 "use mbscasecmp if you care about " 116 "use mbscasecmp if you care about "
92 "internationalization, or use c_strcasecmp , " 117 "internationalization, or use c_strcasecmp "
93 "gnulib module c-strcase) if you want a locale " 118 "(gnulib module c-strcasecmp) if you want a locale "
94 "independent function"); 119 "independent function");
95# endif 120# endif
96#endif 121#endif
97 122
123#if @GNULIB_STRCASECMP_L@
124# if @REPLACE_STRCASECMP_L@
125# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
126# undef strcasecmp_l
127# define strcasecmp_l rpl_strcasecmp_l
128# endif
129_GL_FUNCDECL_RPL (strcasecmp_l, int,
130 (const char *s1, const char *s2, locale_t locale),
131 _GL_ARG_NONNULL ((1, 2, 3)));
132_GL_CXXALIAS_RPL (strcasecmp_l, int,
133 (const char *s1, const char *s2, locale_t locale));
134# else
135# if !@HAVE_STRCASECMP_L@
136_GL_FUNCDECL_SYS (strcasecmp_l, int,
137 (const char *s1, const char *s2, locale_t locale),
138 _GL_ARG_NONNULL ((1, 2, 3)));
139# endif
140_GL_CXXALIAS_SYS (strcasecmp_l, int,
141 (const char *s1, const char *s2, locale_t locale));
142# endif
143# if __GLIBC__ >= 2
144_GL_CXXALIASWARN (strcasecmp_l);
145# endif
146#elif defined GNULIB_POSIXCHECK
147/* strcasecmp_l() does not work with multibyte strings:
148 POSIX says that it operates on "strings", and "string" in POSIX is defined
149 as a sequence of bytes, not of characters. */
150# undef strcasecmp_l
151# if HAVE_RAW_DECL_STRCASECMP_L
152_GL_WARN_ON_USE (strcasecmp_l, "strcasecmp_l cannot work correctly on "
153 "character strings in multibyte locales and is unportable - "
154 "use gnulib module strcasecmp_l for portability");
155# endif
156#endif
157
158#if @GNULIB_STRNCASECMP@
98/* Compare no more than N bytes of strings S1 and S2, ignoring case, 159/* Compare no more than N bytes of strings S1 and S2, ignoring case,
99 returning less than, equal to or greater than zero if S1 is 160 returning less than, equal to or greater than zero if S1 is
100 lexicographically less than, equal to or greater than S2. 161 lexicographically less than, equal to or greater than S2.
101 Note: This function cannot work correctly in multibyte locales. */ 162 Note: This function cannot work correctly in multibyte locales. */
102#if ! @HAVE_DECL_STRNCASECMP@ 163# if @REPLACE_STRNCASECMP@
103extern int strncasecmp (char const *s1, char const *s2, size_t n) 164# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
104 _GL_ARG_NONNULL ((1, 2)); 165# undef strncasecmp
105#endif 166# define strncasecmp rpl_strncasecmp
106#if defined GNULIB_POSIXCHECK 167# endif
168_GL_FUNCDECL_RPL (strncasecmp, int, (const char *, const char *, size_t),
169 _GL_ARG_NONNULL ((1, 2)));
170_GL_CXXALIAS_RPL (strncasecmp, int, (const char *, const char *, size_t));
171# else
172# if !@HAVE_DECL_STRNCASECMP@
173_GL_FUNCDECL_SYS (strncasecmp, int, (const char *, const char *, size_t),
174 _GL_ARG_NONNULL ((1, 2)));
175# endif
176_GL_CXXALIAS_SYS (strncasecmp, int, (const char *, const char *, size_t));
177# endif
178# if __GLIBC__ >= 2
179_GL_CXXALIASWARN (strncasecmp);
180# endif
181#elif defined GNULIB_POSIXCHECK
107/* strncasecmp() does not work with multibyte strings: 182/* strncasecmp() does not work with multibyte strings:
108 POSIX says that it operates on "strings", and "string" in POSIX is defined 183 POSIX says that it operates on "strings", and "string" in POSIX is defined
109 as a sequence of bytes, not of characters. */ 184 as a sequence of bytes, not of characters. */
110# undef strncasecmp 185# undef strncasecmp
111# if HAVE_RAW_DECL_STRNCASECMP 186# if HAVE_RAW_DECL_STRNCASECMP
112_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character " 187_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
113 "strings in multibyte locales - " 188 "strings in multibyte locales and is unportable - "
114 "use mbsncasecmp or mbspcasecmp if you care about " 189 "use mbsncasecmp or mbspcasecmp if you care about "
115 "internationalization, or use c_strncasecmp , " 190 "internationalization, or use c_strncasecmp "
116 "gnulib module c-strcase) if you want a locale " 191 "(gnulib module c-strncasecmp) if you want a locale "
117 "independent function"); 192 "independent function");
118# endif 193# endif
119#endif 194#endif
120 195
196#if @GNULIB_STRNCASECMP_L@
197# if @REPLACE_STRNCASECMP_L@
198# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
199# undef strncasecmp_l
200# define strncasecmp_l rpl_strncasecmp_l
201# endif
202_GL_FUNCDECL_RPL (strncasecmp_l, int,
203 (const char *s1, const char *s2, size_t n, locale_t locale),
204 _GL_ARG_NONNULL ((1, 2, 4)));
205_GL_CXXALIAS_RPL (strncasecmp_l, int,
206 (const char *s1, const char *s2, size_t n, locale_t locale));
207# else
208# if !@HAVE_STRNCASECMP_L@
209_GL_FUNCDECL_SYS (strncasecmp_l, int,
210 (const char *s1, const char *s2, size_t n, locale_t locale),
211 _GL_ARG_NONNULL ((1, 2, 4)));
212# endif
213_GL_CXXALIAS_SYS (strncasecmp_l, int,
214 (const char *s1, const char *s2, size_t n, locale_t locale));
215# endif
216# if __GLIBC__ >= 2
217_GL_CXXALIASWARN (strncasecmp_l);
218# endif
219#elif defined GNULIB_POSIXCHECK
220/* strncasecmp_l() does not work with multibyte strings:
221 POSIX says that it operates on "strings", and "string" in POSIX is defined
222 as a sequence of bytes, not of characters. */
223# undef strncasecmp_l
224# if HAVE_RAW_DECL_STRNCASECMP_L
225_GL_WARN_ON_USE (strncasecmp_l, "strncasecmp_l cannot work correctly on "
226 "character strings in multibyte locales and is unportable - "
227 "use gnulib module strncasecmp_l for portability");
228# endif
229#endif
230
121 231
122#ifdef __cplusplus 232#ifdef __cplusplus
123} 233}