diff options
Diffstat (limited to 'gl/strings.in.h')
| -rw-r--r-- | gl/strings.in.h | 154 |
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@ |
| 75 | extern 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@ |
| 98 | extern 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 | } |
