1 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */ 2 /* A substitute <strings.h>. 3 4 Copyright (C) 2007-2013 Free Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 18 19 #ifndef _GL_STRINGS_H 20 21 #if __GNUC__ >= 3 22 #pragma GCC system_header 23 #endif 24 25 26 /* Minix 3.1.8 has a bug: <sys/types.h> must be included before <strings.h>. 27 But avoid namespace pollution on glibc systems. */ 28 #if defined __minix && !defined __GLIBC__ 29 # include <sys/types.h> 30 #endif 31 32 /* The include_next requires a split double-inclusion guard. */ 33 #if 1 34 # include_next <strings.h> 35 #endif 36 37 #ifndef _GL_STRINGS_H 38 #define _GL_STRINGS_H 39 40 #if ! 1 41 /* Get size_t. */ 42 # include <stddef.h> 43 #endif 44 45 46 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ 47 #ifndef _GL_CXXDEFS_H 48 #define _GL_CXXDEFS_H 49 50 /* The three most frequent use cases of these macros are: 51 52 * For providing a substitute for a function that is missing on some 53 platforms, but is declared and works fine on the platforms on which 54 it exists: 55 56 #if @GNULIB_FOO@ 57 # if !@HAVE_FOO@ 58 _GL_FUNCDECL_SYS (foo, ...); 59 # endif 60 _GL_CXXALIAS_SYS (foo, ...); 61 _GL_CXXALIASWARN (foo); 62 #elif defined GNULIB_POSIXCHECK 63 ... 64 #endif 65 66 * For providing a replacement for a function that exists on all platforms, 67 but is broken/insufficient and needs to be replaced on some platforms: 68 69 #if @GNULIB_FOO@ 70 # if @REPLACE_FOO@ 71 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 72 # undef foo 73 # define foo rpl_foo 74 # endif 75 _GL_FUNCDECL_RPL (foo, ...); 76 _GL_CXXALIAS_RPL (foo, ...); 77 # else 78 _GL_CXXALIAS_SYS (foo, ...); 79 # endif 80 _GL_CXXALIASWARN (foo); 81 #elif defined GNULIB_POSIXCHECK 82 ... 83 #endif 84 85 * For providing a replacement for a function that exists on some platforms 86 but is broken/insufficient and needs to be replaced on some of them and 87 is additionally either missing or undeclared on some other platforms: 88 89 #if @GNULIB_FOO@ 90 # if @REPLACE_FOO@ 91 # if !(defined __cplusplus && defined GNULIB_NAMESPACE) 92 # undef foo 93 # define foo rpl_foo 94 # endif 95 _GL_FUNCDECL_RPL (foo, ...); 96 _GL_CXXALIAS_RPL (foo, ...); 97 # else 98 # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ 99 _GL_FUNCDECL_SYS (foo, ...); 100 # endif 101 _GL_CXXALIAS_SYS (foo, ...); 102 # endif 103 _GL_CXXALIASWARN (foo); 104 #elif defined GNULIB_POSIXCHECK 105 ... 106 #endif 107 */ 108 109 /* _GL_EXTERN_C declaration; 110 performs the declaration with C linkage. */ 111 #if defined __cplusplus 112 # define _GL_EXTERN_C extern "C" 113 #else 114 # define _GL_EXTERN_C extern 115 #endif 116 117 /* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); 118 declares a replacement function, named rpl_func, with the given prototype, 119 consisting of return type, parameters, and attributes. 120 Example: 121 _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) 122 _GL_ARG_NONNULL ((1))); 123 */ 124 #define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ 125 _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) 126 #define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ 127 _GL_EXTERN_C rettype rpl_func parameters_and_attributes 128 129 /* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); 130 declares the system function, named func, with the given prototype, 131 consisting of return type, parameters, and attributes. 132 Example: 133 _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) 134 _GL_ARG_NONNULL ((1))); 135 */ 136 #define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ 137 _GL_EXTERN_C rettype func parameters_and_attributes 138 139 /* _GL_CXXALIAS_RPL (func, rettype, parameters); 140 declares a C++ alias called GNULIB_NAMESPACE::func 141 that redirects to rpl_func, if GNULIB_NAMESPACE is defined. 142 Example: 143 _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); 144 */ 145 #define _GL_CXXALIAS_RPL(func,rettype,parameters) \ 146 _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) 147 #if defined __cplusplus && defined GNULIB_NAMESPACE 148 # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ 149 namespace GNULIB_NAMESPACE \ 150 { \ 151 rettype (*const func) parameters = ::rpl_func; \ 152 } \ 153 _GL_EXTERN_C int _gl_cxxalias_dummy 154 #else 155 # define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ 156 _GL_EXTERN_C int _gl_cxxalias_dummy 157 #endif 158 159 /* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); 160 is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); 161 except that the C function rpl_func may have a slightly different 162 declaration. A cast is used to silence the "invalid conversion" error 163 that would otherwise occur. */ 164 #if defined __cplusplus && defined GNULIB_NAMESPACE 165 # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ 166 namespace GNULIB_NAMESPACE \ 167 { \ 168 rettype (*const func) parameters = \ 169 reinterpret_cast<rettype(*)parameters>(::rpl_func); \ 170 } \ 171 _GL_EXTERN_C int _gl_cxxalias_dummy 172 #else 173 # define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ 174 _GL_EXTERN_C int _gl_cxxalias_dummy 175 #endif 176 177 /* _GL_CXXALIAS_SYS (func, rettype, parameters); 178 declares a C++ alias called GNULIB_NAMESPACE::func 179 that redirects to the system provided function func, if GNULIB_NAMESPACE 180 is defined. 181 Example: 182 _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); 183 */ 184 #if defined __cplusplus && defined GNULIB_NAMESPACE 185 /* If we were to write 186 rettype (*const func) parameters = ::func; 187 like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls 188 better (remove an indirection through a 'static' pointer variable), 189 but then the _GL_CXXALIASWARN macro below would cause a warning not only 190 for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */ 191 # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ 192 namespace GNULIB_NAMESPACE \ 193 { \ 194 static rettype (*func) parameters = ::func; \ 195 } \ 196 _GL_EXTERN_C int _gl_cxxalias_dummy 197 #else 198 # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ 199 _GL_EXTERN_C int _gl_cxxalias_dummy 200 #endif 201 202 /* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); 203 is like _GL_CXXALIAS_SYS (func, rettype, parameters); 204 except that the C function func may have a slightly different declaration. 205 A cast is used to silence the "invalid conversion" error that would 206 otherwise occur. */ 207 #if defined __cplusplus && defined GNULIB_NAMESPACE 208 # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ 209 namespace GNULIB_NAMESPACE \ 210 { \ 211 static rettype (*func) parameters = \ 212 reinterpret_cast<rettype(*)parameters>(::func); \ 213 } \ 214 _GL_EXTERN_C int _gl_cxxalias_dummy 215 #else 216 # define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ 217 _GL_EXTERN_C int _gl_cxxalias_dummy 218 #endif 219 220 /* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); 221 is like _GL_CXXALIAS_SYS (func, rettype, parameters); 222 except that the C function is picked among a set of overloaded functions, 223 namely the one with rettype2 and parameters2. Two consecutive casts 224 are used to silence the "cannot find a match" and "invalid conversion" 225 errors that would otherwise occur. */ 226 #if defined __cplusplus && defined GNULIB_NAMESPACE 227 /* The outer cast must be a reinterpret_cast. 228 The inner cast: When the function is defined as a set of overloaded 229 functions, it works as a static_cast<>, choosing the designated variant. 230 When the function is defined as a single variant, it works as a 231 reinterpret_cast<>. The parenthesized cast syntax works both ways. */ 232 # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ 233 namespace GNULIB_NAMESPACE \ 234 { \ 235 static rettype (*func) parameters = \ 236 reinterpret_cast<rettype(*)parameters>( \ 237 (rettype2(*)parameters2)(::func)); \ 238 } \ 239 _GL_EXTERN_C int _gl_cxxalias_dummy 240 #else 241 # define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ 242 _GL_EXTERN_C int _gl_cxxalias_dummy 243 #endif 244 245 /* _GL_CXXALIASWARN (func); 246 causes a warning to be emitted when ::func is used but not when 247 GNULIB_NAMESPACE::func is used. func must be defined without overloaded 248 variants. */ 249 #if defined __cplusplus && defined GNULIB_NAMESPACE 250 # define _GL_CXXALIASWARN(func) \ 251 _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) 252 # define _GL_CXXALIASWARN_1(func,namespace) \ 253 _GL_CXXALIASWARN_2 (func, namespace) 254 /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, 255 we enable the warning only when not optimizing. */ 256 # if !__OPTIMIZE__ 257 # define _GL_CXXALIASWARN_2(func,namespace) \ 258 _GL_WARN_ON_USE (func, \ 259 "The symbol ::" #func " refers to the system function. " \ 260 "Use " #namespace "::" #func " instead.") 261 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 262 # define _GL_CXXALIASWARN_2(func,namespace) \ 263 extern __typeof__ (func) func 264 # else 265 # define _GL_CXXALIASWARN_2(func,namespace) \ 266 _GL_EXTERN_C int _gl_cxxalias_dummy 267 # endif 268 #else 269 # define _GL_CXXALIASWARN(func) \ 270 _GL_EXTERN_C int _gl_cxxalias_dummy 271 #endif 272 273 /* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); 274 causes a warning to be emitted when the given overloaded variant of ::func 275 is used but not when GNULIB_NAMESPACE::func is used. */ 276 #if defined __cplusplus && defined GNULIB_NAMESPACE 277 # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ 278 _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ 279 GNULIB_NAMESPACE) 280 # define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ 281 _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) 282 /* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>, 283 we enable the warning only when not optimizing. */ 284 # if !__OPTIMIZE__ 285 # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 286 _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ 287 "The symbol ::" #func " refers to the system function. " \ 288 "Use " #namespace "::" #func " instead.") 289 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 290 # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 291 extern __typeof__ (func) func 292 # else 293 # define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ 294 _GL_EXTERN_C int _gl_cxxalias_dummy 295 # endif 296 #else 297 # define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ 298 _GL_EXTERN_C int _gl_cxxalias_dummy 299 #endif 300 301 #endif /* _GL_CXXDEFS_H */ 302 303 /* The definition of _GL_ARG_NONNULL is copied here. */ 304 /* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools 305 that the values passed as arguments n, ..., m must be non-NULL pointers. 306 n = 1 stands for the first argument, n = 2 for the second argument etc. */ 307 #ifndef _GL_ARG_NONNULL 308 # if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3 309 # define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) 310 # else 311 # define _GL_ARG_NONNULL(params) 312 # endif 313 #endif 314 315 /* The definition of _GL_WARN_ON_USE is copied here. */ 316 #ifndef _GL_WARN_ON_USE 317 318 # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) 319 /* A compiler attribute is available in gcc versions 4.3.0 and later. */ 320 # define _GL_WARN_ON_USE(function, message) \ 321 extern __typeof__ (function) function __attribute__ ((__warning__ (message))) 322 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 323 /* Verify the existence of the function. */ 324 # define _GL_WARN_ON_USE(function, message) \ 325 extern __typeof__ (function) function 326 # else /* Unsupported. */ 327 # define _GL_WARN_ON_USE(function, message) \ 328 _GL_WARN_EXTERN_C int _gl_warn_on_use 329 # endif 330 #endif 331 332 /* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string") 333 is like _GL_WARN_ON_USE (function, "string"), except that the function is 334 declared with the given prototype, consisting of return type, parameters, 335 and attributes. 336 This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does 337 not work in this case. */ 338 #ifndef _GL_WARN_ON_USE_CXX 339 # if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) 340 # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ 341 extern rettype function parameters_and_attributes \ 342 __attribute__ ((__warning__ (msg))) 343 # elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING 344 /* Verify the existence of the function. */ 345 # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ 346 extern rettype function parameters_and_attributes 347 # else /* Unsupported. */ 348 # define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ 349 _GL_WARN_EXTERN_C int _gl_warn_on_use 350 # endif 351 #endif 352 353 /* _GL_WARN_EXTERN_C declaration; 354 performs the declaration with C linkage. */ 355 #ifndef _GL_WARN_EXTERN_C 356 # if defined __cplusplus 357 # define _GL_WARN_EXTERN_C extern "C" 358 # else 359 # define _GL_WARN_EXTERN_C extern 360 # endif 361 #endif 362 363 #ifdef __cplusplus 364 extern "C" { 365 #endif 366 367 368 /* Find the index of the least-significant set bit. */ 369 #if 0 370 # if !1 371 _GL_FUNCDECL_SYS (ffs, int, (int i)); 372 # endif 373 _GL_CXXALIAS_SYS (ffs, int, (int i)); 374 _GL_CXXALIASWARN (ffs); 375 #elif defined GNULIB_POSIXCHECK 376 # undef ffs 377 # if HAVE_RAW_DECL_FFS 378 _GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module"); 379 # endif 380 #endif 381 382 /* Compare strings S1 and S2, ignoring case, returning less than, equal to or 383 greater than zero if S1 is lexicographically less than, equal to or greater 384 than S2. 385 Note: This function does not work in multibyte locales. */ 386 #if ! 1 387 extern int strcasecmp (char const *s1, char const *s2) 388 _GL_ARG_NONNULL ((1, 2)); 389 #endif 390 #if defined GNULIB_POSIXCHECK 391 /* strcasecmp() does not work with multibyte strings: 392 POSIX says that it operates on "strings", and "string" in POSIX is defined 393 as a sequence of bytes, not of characters. */ 394 # undef strcasecmp 395 # if HAVE_RAW_DECL_STRCASECMP 396 _GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character " 397 "strings in multibyte locales - " 398 "use mbscasecmp if you care about " 399 "internationalization, or use c_strcasecmp , " 400 "gnulib module c-strcase) if you want a locale " 401 "independent function"); 402 # endif 403 #endif 404 405 /* Compare no more than N bytes of strings S1 and S2, ignoring case, 406 returning less than, equal to or greater than zero if S1 is 407 lexicographically less than, equal to or greater than S2. 408 Note: This function cannot work correctly in multibyte locales. */ 409 #if ! 1 410 extern int strncasecmp (char const *s1, char const *s2, size_t n) 411 _GL_ARG_NONNULL ((1, 2)); 412 #endif 413 #if defined GNULIB_POSIXCHECK 414 /* strncasecmp() does not work with multibyte strings: 415 POSIX says that it operates on "strings", and "string" in POSIX is defined 416 as a sequence of bytes, not of characters. */ 417 # undef strncasecmp 418 # if HAVE_RAW_DECL_STRNCASECMP 419 _GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character " 420 "strings in multibyte locales - " 421 "use mbsncasecmp or mbspcasecmp if you care about " 422 "internationalization, or use c_strncasecmp , " 423 "gnulib module c-strcase) if you want a locale " 424 "independent function"); 425 # endif 426 #endif 427 428 429 #ifdef __cplusplus 430 } 431 #endif 432 433 #endif /* _GL_STRING_H */ 434 #endif /* _GL_STRING_H */ 435