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.h151
1 files changed, 128 insertions, 23 deletions
diff --git a/gl/strings.in.h b/gl/strings.in.h
index 2b3e062a..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-2024 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,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,66 +68,161 @@ 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);
68#elif defined GNULIB_POSIXCHECK 78#elif defined GNULIB_POSIXCHECK
69# undef ffs
70# if HAVE_RAW_DECL_FFS 79# if HAVE_RAW_DECL_FFS
71_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");
72# endif 81# endif
73#endif 82#endif
74 83
84#if @GNULIB_STRCASECMP@
75/* 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
76 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
77 than S2. 87 than S2.
78 Note: This function does not work in multibyte locales. */ 88 Note: This function does not work in multibyte locales. */
79#if ! @HAVE_STRCASECMP@ 89# if @REPLACE_STRCASECMP@
80extern int strcasecmp (char const *s1, char const *s2) 90# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
81 _GL_ARG_NONNULL ((1, 2)); 91# undef strcasecmp
82#endif 92# define strcasecmp rpl_strcasecmp
83#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
84/* strcasecmp() does not work with multibyte strings: 108/* strcasecmp() does not work with multibyte strings:
85 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
86 as a sequence of bytes, not of characters. */ 110 as a sequence of bytes, not of characters. */
87# undef strcasecmp
88# if HAVE_RAW_DECL_STRCASECMP 111# if HAVE_RAW_DECL_STRCASECMP
89_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character " 112_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
90 "strings in multibyte locales - " 113 "strings in multibyte locales and is unportable - "
91 "use mbscasecmp if you care about " 114 "use mbscasecmp if you care about "
92 "internationalization, or use c_strcasecmp , " 115 "internationalization, or use c_strcasecmp "
93 "gnulib module c-strcase) if you want a locale " 116 "(gnulib module c-strcasecmp) if you want a locale "
94 "independent function"); 117 "independent function");
95# endif 118# endif
96#endif 119#endif
97 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@
98/* 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,
99 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
100 lexicographically less than, equal to or greater than S2. 158 lexicographically less than, equal to or greater than S2.
101 Note: This function cannot work correctly in multibyte locales. */ 159 Note: This function cannot work correctly in multibyte locales. */
102#if ! @HAVE_DECL_STRNCASECMP@ 160# if @REPLACE_STRNCASECMP@
103extern int strncasecmp (char const *s1, char const *s2, size_t n) 161# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
104 _GL_ARG_NONNULL ((1, 2)); 162# undef strncasecmp
105#endif 163# define strncasecmp rpl_strncasecmp
106#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
107/* strncasecmp() does not work with multibyte strings: 179/* strncasecmp() does not work with multibyte strings:
108 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
109 as a sequence of bytes, not of characters. */ 181 as a sequence of bytes, not of characters. */
110# undef strncasecmp
111# if HAVE_RAW_DECL_STRNCASECMP 182# if HAVE_RAW_DECL_STRNCASECMP
112_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character " 183_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
113 "strings in multibyte locales - " 184 "strings in multibyte locales and is unportable - "
114 "use mbsncasecmp or mbspcasecmp if you care about " 185 "use mbsncasecmp or mbspcasecmp if you care about "
115 "internationalization, or use c_strncasecmp , " 186 "internationalization, or use c_strncasecmp "
116 "gnulib module c-strcase) if you want a locale " 187 "(gnulib module c-strncasecmp) if you want a locale "
117 "independent function"); 188 "independent function");
118# endif 189# endif
119#endif 190#endif
120 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
121 226
122#ifdef __cplusplus 227#ifdef __cplusplus
123} 228}