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