diff options
Diffstat (limited to 'lib/string.in.h')
| -rw-r--r-- | lib/string.in.h | 735 | 
1 files changed, 521 insertions, 214 deletions
diff --git a/lib/string.in.h b/lib/string.in.h index 35407658..75deca01 100644 --- a/lib/string.in.h +++ b/lib/string.in.h @@ -1,6 +1,6 @@  /* A GNU-like <string.h>. -   Copyright (C) 1995-1996, 2001-2009 Free Software Foundation, Inc. +   Copyright (C) 1995-1996, 2001-2010 Free Software Foundation, Inc.     This program is free software; you can redistribute it and/or modify     it under the terms of the GNU Lesser General Public License as published by @@ -31,6 +31,11 @@  /* NetBSD 5.0 mis-defines NULL.  */  #include <stddef.h> +/* MirBSD defines mbslen as a macro.  */ +#if @GNULIB_MBSLEN@ && defined __MirBSD__ +# include <wchar.h> +#endif +  #ifndef __attribute__  /* This feature is available in gcc versions 2.5 and later.  */  # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) @@ -43,75 +48,132 @@  #endif -/* The definition of GL_LINK_WARNING is copied here.  */ +/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */ +/* The definition of _GL_ARG_NONNULL is copied here.  */ -#ifdef __cplusplus -extern "C" { -#endif +/* The definition of _GL_WARN_ON_USE is copied here.  */  /* Return the first instance of C within N bytes of S, or NULL.  */  #if @GNULIB_MEMCHR@  # if @REPLACE_MEMCHR@ -#  define memchr rpl_memchr -extern void *memchr (void const *__s, int __c, size_t __n) -  __attribute__ ((__pure__)); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define memchr rpl_memchr +#  endif +_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n) +                                  __attribute__ ((__pure__)) +                                  _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n)); +# else +#  if ! @HAVE_MEMCHR@ +_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n) +                                  __attribute__ ((__pure__)) +                                  _GL_ARG_NONNULL ((1))); +#  endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C" { const void * std::memchr (const void *, int, size_t); } +       extern "C++" { void * std::memchr (void *, int, size_t); }  */ +_GL_CXXALIAS_SYS_CAST2 (memchr, +                        void *, (void const *__s, int __c, size_t __n), +                        void const *, (void const *__s, int __c, size_t __n)); +# endif +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n)); +_GL_CXXALIASWARN1 (memchr, void const *, +                   (void const *__s, int __c, size_t __n)); +# else +_GL_CXXALIASWARN (memchr);  # endif  #elif defined GNULIB_POSIXCHECK  # undef memchr -# define memchr(s,c,n) \ -    (GL_LINK_WARNING ("memchr has platform-specific bugs - " \ -                      "use gnulib module memchr for portability" ), \ -     memchr (s, c, n)) +/* Assume memchr is always declared.  */ +_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - " +                 "use gnulib module memchr for portability" );  #endif  /* Return the first occurrence of NEEDLE in HAYSTACK.  */  #if @GNULIB_MEMMEM@  # if @REPLACE_MEMMEM@ -#  define memmem rpl_memmem -# endif -# if ! @HAVE_DECL_MEMMEM@ || @REPLACE_MEMMEM@ -extern void *memmem (void const *__haystack, size_t __haystack_len, -		     void const *__needle, size_t __needle_len) -  __attribute__ ((__pure__)); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define memmem rpl_memmem +#  endif +_GL_FUNCDECL_RPL (memmem, void *, +                  (void const *__haystack, size_t __haystack_len, +                   void const *__needle, size_t __needle_len) +                  __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); +_GL_CXXALIAS_RPL (memmem, void *, +                  (void const *__haystack, size_t __haystack_len, +                   void const *__needle, size_t __needle_len)); +# else +#  if ! @HAVE_DECL_MEMMEM@ +_GL_FUNCDECL_SYS (memmem, void *, +                  (void const *__haystack, size_t __haystack_len, +                   void const *__needle, size_t __needle_len) +                  __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3))); +#  endif +_GL_CXXALIAS_SYS (memmem, void *, +                  (void const *__haystack, size_t __haystack_len, +                   void const *__needle, size_t __needle_len));  # endif +_GL_CXXALIASWARN (memmem);  #elif defined GNULIB_POSIXCHECK  # undef memmem -# define memmem(a,al,b,bl) \ -    (GL_LINK_WARNING ("memmem is unportable and often quadratic - " \ -                      "use gnulib module memmem-simple for portability, " \ -                      "and module memmem for speed" ), \ -     memmem (a, al, b, bl)) +# if HAVE_RAW_DECL_MEMMEM +_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - " +                 "use gnulib module memmem-simple for portability, " +                 "and module memmem for speed" ); +# endif  #endif  /* Copy N bytes of SRC to DEST, return pointer to bytes after the     last written byte.  */  #if @GNULIB_MEMPCPY@  # if ! @HAVE_MEMPCPY@ -extern void *mempcpy (void *restrict __dest, void const *restrict __src, -		      size_t __n); +_GL_FUNCDECL_SYS (mempcpy, void *, +                  (void *restrict __dest, void const *restrict __src, +                   size_t __n) +                  _GL_ARG_NONNULL ((1, 2)));  # endif +_GL_CXXALIAS_SYS (mempcpy, void *, +                  (void *restrict __dest, void const *restrict __src, +                   size_t __n)); +_GL_CXXALIASWARN (mempcpy);  #elif defined GNULIB_POSIXCHECK  # undef mempcpy -# define mempcpy(a,b,n) \ -    (GL_LINK_WARNING ("mempcpy is unportable - " \ -                      "use gnulib module mempcpy for portability"), \ -     mempcpy (a, b, n)) +# if HAVE_RAW_DECL_MEMPCPY +_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - " +                 "use gnulib module mempcpy for portability"); +# endif  #endif  /* Search backwards through a block for a byte (specified as an int).  */  #if @GNULIB_MEMRCHR@  # if ! @HAVE_DECL_MEMRCHR@ -extern void *memrchr (void const *, int, size_t) -  __attribute__ ((__pure__)); +_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t) +                                   __attribute__ ((__pure__)) +                                   _GL_ARG_NONNULL ((1))); +# endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C++" { const void * std::memrchr (const void *, int, size_t); } +       extern "C++" { void * std::memrchr (void *, int, size_t); }  */ +_GL_CXXALIAS_SYS_CAST2 (memrchr, +                        void *, (void const *, int, size_t), +                        void const *, (void const *, int, size_t)); +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t)); +_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t)); +# else +_GL_CXXALIASWARN (memrchr);  # endif  #elif defined GNULIB_POSIXCHECK  # undef memrchr -# define memrchr(a,b,c) \ -    (GL_LINK_WARNING ("memrchr is unportable - " \ -                      "use gnulib module memrchr for portability"), \ -     memrchr (a, b, c)) +# if HAVE_RAW_DECL_MEMRCHR +_GL_WARN_ON_USE (memrchr, "memrchr is unportable - " +                 "use gnulib module memrchr for portability"); +# endif  #endif  /* Find the first occurrence of C in S.  More efficient than @@ -119,119 +181,221 @@ extern void *memrchr (void const *, int, size_t)     occur within N bytes.  */  #if @GNULIB_RAWMEMCHR@  # if ! @HAVE_RAWMEMCHR@ -extern void *rawmemchr (void const *__s, int __c_in) -  __attribute__ ((__pure__)); +_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in) +                                     __attribute__ ((__pure__)) +                                     _GL_ARG_NONNULL ((1))); +# endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C++" { const void * std::rawmemchr (const void *, int); } +       extern "C++" { void * std::rawmemchr (void *, int); }  */ +_GL_CXXALIAS_SYS_CAST2 (rawmemchr, +                        void *, (void const *__s, int __c_in), +                        void const *, (void const *__s, int __c_in)); +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in)); +_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in)); +# else +_GL_CXXALIASWARN (rawmemchr);  # endif  #elif defined GNULIB_POSIXCHECK  # undef rawmemchr -# define rawmemchr(a,b) \ -    (GL_LINK_WARNING ("rawmemchr is unportable - " \ -                      "use gnulib module rawmemchr for portability"), \ -     rawmemchr (a, b)) +# if HAVE_RAW_DECL_RAWMEMCHR +_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - " +                 "use gnulib module rawmemchr for portability"); +# endif  #endif  /* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */  #if @GNULIB_STPCPY@  # if ! @HAVE_STPCPY@ -extern char *stpcpy (char *restrict __dst, char const *restrict __src); +_GL_FUNCDECL_SYS (stpcpy, char *, +                  (char *restrict __dst, char const *restrict __src) +                  _GL_ARG_NONNULL ((1, 2)));  # endif +_GL_CXXALIAS_SYS (stpcpy, char *, +                  (char *restrict __dst, char const *restrict __src)); +_GL_CXXALIASWARN (stpcpy);  #elif defined GNULIB_POSIXCHECK  # undef stpcpy -# define stpcpy(a,b) \ -    (GL_LINK_WARNING ("stpcpy is unportable - " \ -                      "use gnulib module stpcpy for portability"), \ -     stpcpy (a, b)) +# if HAVE_RAW_DECL_STPCPY +_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - " +                 "use gnulib module stpcpy for portability"); +# endif  #endif  /* Copy no more than N bytes of SRC to DST, returning a pointer past the     last non-NUL byte written into DST.  */  #if @GNULIB_STPNCPY@ -# if ! @HAVE_STPNCPY@ -#  define stpncpy gnu_stpncpy -extern char *stpncpy (char *restrict __dst, char const *restrict __src, -		      size_t __n); +# if @REPLACE_STPNCPY@ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define stpncpy rpl_stpncpy +#  endif +_GL_FUNCDECL_RPL (stpncpy, char *, +                  (char *restrict __dst, char const *restrict __src, +                   size_t __n) +                  _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (stpncpy, char *, +                  (char *restrict __dst, char const *restrict __src, +                   size_t __n)); +# else +#  if ! @HAVE_STPNCPY@ +_GL_FUNCDECL_SYS (stpncpy, char *, +                  (char *restrict __dst, char const *restrict __src, +                   size_t __n) +                  _GL_ARG_NONNULL ((1, 2))); +#  endif +_GL_CXXALIAS_SYS (stpncpy, char *, +                  (char *restrict __dst, char const *restrict __src, +                   size_t __n));  # endif +_GL_CXXALIASWARN (stpncpy);  #elif defined GNULIB_POSIXCHECK  # undef stpncpy -# define stpncpy(a,b,n) \ -    (GL_LINK_WARNING ("stpncpy is unportable - " \ -                      "use gnulib module stpncpy for portability"), \ -     stpncpy (a, b, n)) +# if HAVE_RAW_DECL_STPNCPY +_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - " +                 "use gnulib module stpncpy for portability"); +# endif  #endif  #if defined GNULIB_POSIXCHECK  /* strchr() does not work with multibyte strings if the locale encoding is     GB18030 and the character to be searched is a digit.  */  # undef strchr -# define strchr(s,c) \ -    (GL_LINK_WARNING ("strchr cannot work correctly on character strings " \ -                      "in some multibyte locales - " \ -                      "use mbschr if you care about internationalization"), \ -     strchr (s, c)) +/* Assume strchr is always declared.  */ +_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings " +                 "in some multibyte locales - " +                 "use mbschr if you care about internationalization");  #endif  /* Find the first occurrence of C in S or the final NUL byte.  */  #if @GNULIB_STRCHRNUL@  # if ! @HAVE_STRCHRNUL@ -extern char *strchrnul (char const *__s, int __c_in) -  __attribute__ ((__pure__)); +_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in) +                                     __attribute__ ((__pure__)) +                                     _GL_ARG_NONNULL ((1))); +# endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C++" { const char * std::strchrnul (const char *, int); } +       extern "C++" { char * std::strchrnul (char *, int); }  */ +_GL_CXXALIAS_SYS_CAST2 (strchrnul, +                        char *, (char const *__s, int __c_in), +                        char const *, (char const *__s, int __c_in)); +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in)); +_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in)); +# else +_GL_CXXALIASWARN (strchrnul);  # endif  #elif defined GNULIB_POSIXCHECK  # undef strchrnul -# define strchrnul(a,b) \ -    (GL_LINK_WARNING ("strchrnul is unportable - " \ -                      "use gnulib module strchrnul for portability"), \ -     strchrnul (a, b)) +# if HAVE_RAW_DECL_STRCHRNUL +_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - " +                 "use gnulib module strchrnul for portability"); +# endif  #endif  /* Duplicate S, returning an identical malloc'd string.  */  #if @GNULIB_STRDUP@  # if @REPLACE_STRDUP@ -#  undef strdup -#  define strdup rpl_strdup -# endif -# if !(@HAVE_DECL_STRDUP@ || defined strdup) || @REPLACE_STRDUP@ -extern char *strdup (char const *__s); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strdup +#   define strdup rpl_strdup +#  endif +_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strdup, char *, (char const *__s)); +# else +#  if !(@HAVE_DECL_STRDUP@ || defined strdup) +_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1))); +#  endif +_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));  # endif +_GL_CXXALIASWARN (strdup);  #elif defined GNULIB_POSIXCHECK  # undef strdup -# define strdup(a) \ -    (GL_LINK_WARNING ("strdup is unportable - " \ -                      "use gnulib module strdup for portability"), \ -     strdup (a)) +# if HAVE_RAW_DECL_STRDUP +_GL_WARN_ON_USE (strdup, "strdup is unportable - " +                 "use gnulib module strdup for portability"); +# endif +#endif + +/* Append no more than N characters from SRC onto DEST.  */ +#if @GNULIB_STRNCAT@ +# if @REPLACE_STRNCAT@ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strncat +#   define strncat rpl_strncat +#  endif +_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n) +                                   _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n)); +# else +_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n)); +# endif +_GL_CXXALIASWARN (strncat); +#elif defined GNULIB_POSIXCHECK +# undef strncat +# if HAVE_RAW_DECL_STRNCAT +_GL_WARN_ON_USE (strncat, "strncat is unportable - " +                 "use gnulib module strncat for portability"); +# endif  #endif  /* Return a newly allocated copy of at most N bytes of STRING.  */  #if @GNULIB_STRNDUP@ -# if ! @HAVE_STRNDUP@ -#  undef strndup -#  define strndup rpl_strndup -# endif -# if ! @HAVE_STRNDUP@ || ! @HAVE_DECL_STRNDUP@ -extern char *strndup (char const *__string, size_t __n); +# if @REPLACE_STRNDUP@ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strndup +#   define strndup rpl_strndup +#  endif +_GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n) +                                   _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n)); +# else +#  if ! @HAVE_DECL_STRNDUP@ +_GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n) +                                   _GL_ARG_NONNULL ((1))); +#  endif +_GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n));  # endif +_GL_CXXALIASWARN (strndup);  #elif defined GNULIB_POSIXCHECK  # undef strndup -# define strndup(a,n) \ -    (GL_LINK_WARNING ("strndup is unportable - " \ -                      "use gnulib module strndup for portability"), \ -     strndup (a, n)) +# if HAVE_RAW_DECL_STRNDUP +_GL_WARN_ON_USE (strndup, "strndup is unportable - " +                 "use gnulib module strndup for portability"); +# endif  #endif  /* Find the length (number of bytes) of STRING, but scan at most     MAXLEN bytes.  If no '\0' terminator is found in that many bytes,     return MAXLEN.  */  #if @GNULIB_STRNLEN@ -# if ! @HAVE_DECL_STRNLEN@ -extern size_t strnlen (char const *__string, size_t __maxlen) -  __attribute__ ((__pure__)); +# if @REPLACE_STRNLEN@ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strnlen +#   define strnlen rpl_strnlen +#  endif +_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen) +                                   __attribute__ ((__pure__)) +                                   _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)); +# else +#  if ! @HAVE_DECL_STRNLEN@ +_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen) +                                   __attribute__ ((__pure__)) +                                   _GL_ARG_NONNULL ((1))); +#  endif +_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));  # endif +_GL_CXXALIASWARN (strnlen);  #elif defined GNULIB_POSIXCHECK  # undef strnlen -# define strnlen(a,n) \ -    (GL_LINK_WARNING ("strnlen is unportable - " \ -                      "use gnulib module strnlen for portability"), \ -     strnlen (a, n)) +# if HAVE_RAW_DECL_STRNLEN +_GL_WARN_ON_USE (strnlen, "strnlen is unportable - " +                 "use gnulib module strnlen for portability"); +# endif  #endif  #if defined GNULIB_POSIXCHECK @@ -240,18 +404,32 @@ extern size_t strnlen (char const *__string, size_t __maxlen)     locale encoding is GB18030 and one of the characters to be searched is a     digit.  */  # undef strcspn -# define strcspn(s,a) \ -    (GL_LINK_WARNING ("strcspn cannot work correctly on character strings " \ -                      "in multibyte locales - " \ -                      "use mbscspn if you care about internationalization"), \ -     strcspn (s, a)) +/* Assume strcspn is always declared.  */ +_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings " +                 "in multibyte locales - " +                 "use mbscspn if you care about internationalization");  #endif  /* Find the first occurrence in S of any character in ACCEPT.  */  #if @GNULIB_STRPBRK@  # if ! @HAVE_STRPBRK@ -extern char *strpbrk (char const *__s, char const *__accept) -  __attribute__ ((__pure__)); +_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept) +                                   __attribute__ ((__pure__)) +                                   _GL_ARG_NONNULL ((1, 2))); +# endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C" { const char * strpbrk (const char *, const char *); } +       extern "C++" { char * strpbrk (char *, const char *); }  */ +_GL_CXXALIAS_SYS_CAST2 (strpbrk, +                        char *, (char const *__s, char const *__accept), +                        const char *, (char const *__s, char const *__accept)); +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept)); +_GL_CXXALIASWARN1 (strpbrk, char const *, +                   (char const *__s, char const *__accept)); +# else +_GL_CXXALIASWARN (strpbrk);  # endif  # if defined GNULIB_POSIXCHECK  /* strpbrk() assumes the second argument is a list of single-byte characters. @@ -259,40 +437,36 @@ extern char *strpbrk (char const *__s, char const *__accept)     locale encoding is GB18030 and one of the characters to be searched is a     digit.  */  #  undef strpbrk -#  define strpbrk(s,a) \ -     (GL_LINK_WARNING ("strpbrk cannot work correctly on character strings " \ -                       "in multibyte locales - " \ -                       "use mbspbrk if you care about internationalization"), \ -      strpbrk (s, a)) +_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings " +                 "in multibyte locales - " +                 "use mbspbrk if you care about internationalization");  # endif  #elif defined GNULIB_POSIXCHECK  # undef strpbrk -# define strpbrk(s,a) \ -    (GL_LINK_WARNING ("strpbrk is unportable - " \ -                      "use gnulib module strpbrk for portability"), \ -     strpbrk (s, a)) +# if HAVE_RAW_DECL_STRPBRK +_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - " +                 "use gnulib module strpbrk for portability"); +# endif  #endif  #if defined GNULIB_POSIXCHECK  /* strspn() assumes the second argument is a list of single-byte characters.     Even in this simple case, it cannot work with multibyte strings.  */  # undef strspn -# define strspn(s,a) \ -    (GL_LINK_WARNING ("strspn cannot work correctly on character strings " \ -                      "in multibyte locales - " \ -                      "use mbsspn if you care about internationalization"), \ -     strspn (s, a)) +/* Assume strspn is always declared.  */ +_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings " +                 "in multibyte locales - " +                 "use mbsspn if you care about internationalization");  #endif  #if defined GNULIB_POSIXCHECK  /* strrchr() does not work with multibyte strings if the locale encoding is     GB18030 and the character to be searched is a digit.  */  # undef strrchr -# define strrchr(s,c) \ -    (GL_LINK_WARNING ("strrchr cannot work correctly on character strings " \ -                      "in some multibyte locales - " \ -                      "use mbsrchr if you care about internationalization"), \ -     strrchr (s, c)) +/* Assume strrchr is always declared.  */ +_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings " +                 "in some multibyte locales - " +                 "use mbsrchr if you care about internationalization");  #endif  /* Search the next delimiter (char listed in DELIM) starting at *STRINGP. @@ -313,29 +487,51 @@ extern char *strpbrk (char const *__s, char const *__accept)     See also strtok_r().  */  #if @GNULIB_STRSEP@  # if ! @HAVE_STRSEP@ -extern char *strsep (char **restrict __stringp, char const *restrict __delim); +_GL_FUNCDECL_SYS (strsep, char *, +                  (char **restrict __stringp, char const *restrict __delim) +                  _GL_ARG_NONNULL ((1, 2)));  # endif +_GL_CXXALIAS_SYS (strsep, char *, +                  (char **restrict __stringp, char const *restrict __delim)); +_GL_CXXALIASWARN (strsep);  # if defined GNULIB_POSIXCHECK  #  undef strsep -#  define strsep(s,d) \ -     (GL_LINK_WARNING ("strsep cannot work correctly on character strings " \ -                       "in multibyte locales - " \ -                       "use mbssep if you care about internationalization"), \ -      strsep (s, d)) +_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings " +                 "in multibyte locales - " +                 "use mbssep if you care about internationalization");  # endif  #elif defined GNULIB_POSIXCHECK  # undef strsep -# define strsep(s,d) \ -    (GL_LINK_WARNING ("strsep is unportable - " \ -                      "use gnulib module strsep for portability"), \ -     strsep (s, d)) +# if HAVE_RAW_DECL_STRSEP +_GL_WARN_ON_USE (strsep, "strsep is unportable - " +                 "use gnulib module strsep for portability"); +# endif  #endif  #if @GNULIB_STRSTR@  # if @REPLACE_STRSTR@ -#  define strstr rpl_strstr -char *strstr (const char *haystack, const char *needle) -  __attribute__ ((__pure__)); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define strstr rpl_strstr +#  endif +_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle) +                                  __attribute__ ((__pure__)) +                                  _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle)); +# else +  /* On some systems, this function is defined as an overloaded function: +       extern "C++" { const char * strstr (const char *, const char *); } +       extern "C++" { char * strstr (char *, const char *); }  */ +_GL_CXXALIAS_SYS_CAST2 (strstr, +                        char *, (const char *haystack, const char *needle), +                        const char *, (const char *haystack, const char *needle)); +# endif +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle)); +_GL_CXXALIASWARN1 (strstr, const char *, +                   (const char *haystack, const char *needle)); +# else +_GL_CXXALIASWARN (strstr);  # endif  #elif defined GNULIB_POSIXCHECK  /* strstr() does not work with multibyte strings if the locale encoding is @@ -343,48 +539,70 @@ char *strstr (const char *haystack, const char *needle)     POSIX says that it operates on "strings", and "string" in POSIX is defined     as a sequence of bytes, not of characters.  */  # undef strstr -# define strstr(a,b) \ -    (GL_LINK_WARNING ("strstr is quadratic on many systems, and cannot " \ -                      "work correctly on character strings in most "    \ -                      "multibyte locales - " \ -                      "use mbsstr if you care about internationalization, " \ -                      "or use strstr if you care about speed"), \ -     strstr (a, b)) +/* Assume strstr is always declared.  */ +_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot " +                 "work correctly on character strings in most " +                 "multibyte locales - " +                 "use mbsstr if you care about internationalization, " +                 "or use strstr if you care about speed");  #endif  /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive     comparison.  */  #if @GNULIB_STRCASESTR@  # if @REPLACE_STRCASESTR@ -#  define strcasestr rpl_strcasestr +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define strcasestr rpl_strcasestr +#  endif +_GL_FUNCDECL_RPL (strcasestr, char *, +                  (const char *haystack, const char *needle) +                  __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (strcasestr, char *, +                  (const char *haystack, const char *needle)); +# else +#  if ! @HAVE_STRCASESTR@ +_GL_FUNCDECL_SYS (strcasestr, char *, +                  (const char *haystack, const char *needle) +                  __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2))); +#  endif +  /* On some systems, this function is defined as an overloaded function: +       extern "C++" { const char * strcasestr (const char *, const char *); } +       extern "C++" { char * strcasestr (char *, const char *); }  */ +_GL_CXXALIAS_SYS_CAST2 (strcasestr, +                        char *, (const char *haystack, const char *needle), +                        const char *, (const char *haystack, const char *needle));  # endif -# if ! @HAVE_STRCASESTR@ || @REPLACE_STRCASESTR@ -extern char *strcasestr (const char *haystack, const char *needle) -  __attribute__ ((__pure__)); +# if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \ +     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle)); +_GL_CXXALIASWARN1 (strcasestr, const char *, +                   (const char *haystack, const char *needle)); +# else +_GL_CXXALIASWARN (strcasestr);  # endif  #elif defined GNULIB_POSIXCHECK  /* strcasestr() does not work with multibyte strings:     It is a glibc extension, and glibc implements it only for unibyte     locales.  */  # undef strcasestr -# define strcasestr(a,b) \ -    (GL_LINK_WARNING ("strcasestr does work correctly on character strings " \ -                      "in multibyte locales - " \ -                      "use mbscasestr if you care about " \ -                      "internationalization, or use c-strcasestr if you want " \ -                      "a locale independent function"), \ -     strcasestr (a, b)) +# if HAVE_RAW_DECL_STRCASESTR +_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character " +                 "strings in multibyte locales - " +                 "use mbscasestr if you care about " +                 "internationalization, or use c-strcasestr if you want " +                 "a locale independent function"); +# endif  #endif  /* Parse S into tokens separated by characters in DELIM.     If S is NULL, the saved pointer in SAVE_PTR is used as     the next starting point.  For example: -	char s[] = "-abc-=-def"; -	char *sp; -	x = strtok_r(s, "-", &sp);	// x = "abc", sp = "=-def" -	x = strtok_r(NULL, "-=", &sp);	// x = "def", sp = NULL -	x = strtok_r(NULL, "=", &sp);	// x = NULL -		// s = "abc\0-def\0" +        char s[] = "-abc-=-def"; +        char *sp; +        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def" +        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL +        x = strtok_r(NULL, "=", &sp);   // x = NULL +                // s = "abc\0-def\0"     This is a variant of strtok() that is multithread-safe. @@ -399,24 +617,44 @@ extern char *strcasestr (const char *haystack, const char *needle)     See also strsep().  */  #if @GNULIB_STRTOK_R@ -# if ! @HAVE_DECL_STRTOK_R@ -extern char *strtok_r (char *restrict s, char const *restrict delim, -		       char **restrict save_ptr); +# if @REPLACE_STRTOK_R@ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strtok_r +#   define strtok_r rpl_strtok_r +#  endif +_GL_FUNCDECL_RPL (strtok_r, char *, +                  (char *restrict s, char const *restrict delim, +                   char **restrict save_ptr) +                  _GL_ARG_NONNULL ((2, 3))); +_GL_CXXALIAS_RPL (strtok_r, char *, +                  (char *restrict s, char const *restrict delim, +                   char **restrict save_ptr)); +# else +#  if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK +#   undef strtok_r +#  endif +#  if ! @HAVE_DECL_STRTOK_R@ +_GL_FUNCDECL_SYS (strtok_r, char *, +                  (char *restrict s, char const *restrict delim, +                   char **restrict save_ptr) +                  _GL_ARG_NONNULL ((2, 3))); +#  endif +_GL_CXXALIAS_SYS (strtok_r, char *, +                  (char *restrict s, char const *restrict delim, +                   char **restrict save_ptr));  # endif +_GL_CXXALIASWARN (strtok_r);  # if defined GNULIB_POSIXCHECK -#  undef strtok_r -#  define strtok_r(s,d,p) \ -     (GL_LINK_WARNING ("strtok_r cannot work correctly on character strings " \ -                       "in multibyte locales - " \ -                       "use mbstok_r if you care about internationalization"), \ -      strtok_r (s, d, p)) +_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character " +                 "strings in multibyte locales - " +                 "use mbstok_r if you care about internationalization");  # endif  #elif defined GNULIB_POSIXCHECK  # undef strtok_r -# define strtok_r(s,d,p) \ -    (GL_LINK_WARNING ("strtok_r is unportable - " \ -                      "use gnulib module strtok_r for portability"), \ -     strtok_r (s, d, p)) +# if HAVE_RAW_DECL_STRTOK_R +_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - " +                 "use gnulib module strtok_r for portability"); +# endif  #endif @@ -426,13 +664,27 @@ extern char *strtok_r (char *restrict s, char const *restrict delim,  #if @GNULIB_MBSLEN@  /* Return the number of multibyte characters in the character string STRING.     This considers multibyte characters, unlike strlen, which counts bytes.  */ -extern size_t mbslen (const char *string); +# ifdef __MirBSD__  /* MirBSD defines mbslen as a macro.  Override it.  */ +#  undef mbslen +# endif +# if @HAVE_MBSLEN@  /* AIX, OSF/1, MirBSD define mbslen already in libc.  */ +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define mbslen rpl_mbslen +#  endif +_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string)); +# else +_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string)); +# endif +_GL_CXXALIASWARN (mbslen);  #endif  #if @GNULIB_MBSNLEN@  /* Return the number of multibyte characters in the character string starting     at STRING and ending at STRING + LEN.  */ -extern size_t mbsnlen (const char *string, size_t len); +_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len) +     _GL_ARG_NONNULL ((1));  #endif  #if @GNULIB_MBSCHR@ @@ -440,8 +692,19 @@ extern size_t mbsnlen (const char *string, size_t len);     and return a pointer to it.  Return NULL if C is not found in STRING.     Unlike strchr(), this function works correctly in multibyte locales with     encodings such as GB18030.  */ -# define mbschr rpl_mbschr /* avoid collision with HP-UX function */ -extern char * mbschr (const char *string, int c); +# if defined __hpux +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define mbschr rpl_mbschr /* avoid collision with HP-UX function */ +#  endif +_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c) +                                  _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c)); +# else +_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c) +                                  _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c)); +# endif +_GL_CXXALIASWARN (mbschr);  #endif  #if @GNULIB_MBSRCHR@ @@ -449,8 +712,19 @@ extern char * mbschr (const char *string, int c);     and return a pointer to it.  Return NULL if C is not found in STRING.     Unlike strrchr(), this function works correctly in multibyte locales with     encodings such as GB18030.  */ -# define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */ -extern char * mbsrchr (const char *string, int c); +# if defined __hpux +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */ +#  endif +_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c) +                                   _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c)); +# else +_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c) +                                   _GL_ARG_NONNULL ((1))); +_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c)); +# endif +_GL_CXXALIASWARN (mbsrchr);  #endif  #if @GNULIB_MBSSTR@ @@ -458,7 +732,8 @@ extern char * mbsrchr (const char *string, int c);     string HAYSTACK.  Return NULL if NEEDLE is not found in HAYSTACK.     Unlike strstr(), this function works correctly in multibyte locales with     encodings different from UTF-8.  */ -extern char * mbsstr (const char *haystack, const char *needle); +_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSCASECMP@ @@ -468,7 +743,8 @@ extern char * mbsstr (const char *haystack, const char *needle);     Note: This function may, in multibyte locales, return 0 for strings of     different lengths!     Unlike strcasecmp(), this function works correctly in multibyte locales.  */ -extern int mbscasecmp (const char *s1, const char *s2); +_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSNCASECMP@ @@ -481,7 +757,8 @@ extern int mbscasecmp (const char *s1, const char *s2);     of different lengths!     Unlike strncasecmp(), this function works correctly in multibyte locales.     But beware that N is not a byte count but a character count!  */ -extern int mbsncasecmp (const char *s1, const char *s2, size_t n); +_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSPCASECMP@ @@ -494,7 +771,8 @@ extern int mbsncasecmp (const char *s1, const char *s2, size_t n);     smaller length than PREFIX!     Unlike strncasecmp(), this function works correctly in multibyte     locales.  */ -extern char * mbspcasecmp (const char *string, const char *prefix); +_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSCASESTR@ @@ -503,7 +781,8 @@ extern char * mbspcasecmp (const char *string, const char *prefix);     Note: This function may, in multibyte locales, return success even if     strlen (haystack) < strlen (needle) !     Unlike strcasestr(), this function works correctly in multibyte locales.  */ -extern char * mbscasestr (const char *haystack, const char *needle); +_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSCSPN@ @@ -512,7 +791,8 @@ extern char * mbscasestr (const char *haystack, const char *needle);     beginning of the string to this occurrence, or to the end of the string     if none exists.     Unlike strcspn(), this function works correctly in multibyte locales.  */ -extern size_t mbscspn (const char *string, const char *accept); +_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSPBRK@ @@ -520,8 +800,19 @@ extern size_t mbscspn (const char *string, const char *accept);     in the character string ACCEPT.  Return the pointer to it, or NULL if none     exists.     Unlike strpbrk(), this function works correctly in multibyte locales.  */ -# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ -extern char * mbspbrk (const char *string, const char *accept); +# if defined __hpux +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */ +#  endif +_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept) +                                   _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept)); +# else +_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept) +                                   _GL_ARG_NONNULL ((1, 2))); +_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept)); +# endif +_GL_CXXALIASWARN (mbspbrk);  #endif  #if @GNULIB_MBSSPN@ @@ -530,7 +821,8 @@ extern char * mbspbrk (const char *string, const char *accept);     beginning of the string to this occurrence, or to the end of the string     if none exists.     Unlike strspn(), this function works correctly in multibyte locales.  */ -extern size_t mbsspn (const char *string, const char *reject); +_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSSEP@ @@ -548,7 +840,8 @@ extern size_t mbsspn (const char *string, const char *reject);     Caveat: The identity of the delimiting character is lost.     See also mbstok_r().  */ -extern char * mbssep (char **stringp, const char *delim); +_GL_EXTERN_C char * mbssep (char **stringp, const char *delim) +     _GL_ARG_NONNULL ((1, 2));  #endif  #if @GNULIB_MBSTOK_R@ @@ -556,67 +849,81 @@ extern char * mbssep (char **stringp, const char *delim);     the character string DELIM.     If STRING is NULL, the saved pointer in SAVE_PTR is used as     the next starting point.  For example: -	char s[] = "-abc-=-def"; -	char *sp; -	x = mbstok_r(s, "-", &sp);	// x = "abc", sp = "=-def" -	x = mbstok_r(NULL, "-=", &sp);	// x = "def", sp = NULL -	x = mbstok_r(NULL, "=", &sp);	// x = NULL -		// s = "abc\0-def\0" +        char s[] = "-abc-=-def"; +        char *sp; +        x = mbstok_r(s, "-", &sp);      // x = "abc", sp = "=-def" +        x = mbstok_r(NULL, "-=", &sp);  // x = "def", sp = NULL +        x = mbstok_r(NULL, "=", &sp);   // x = NULL +                // s = "abc\0-def\0"     Caveat: It modifies the original string.     Caveat: These functions cannot be used on constant strings.     Caveat: The identity of the delimiting character is lost.     See also mbssep().  */ -extern char * mbstok_r (char *string, const char *delim, char **save_ptr); +_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr) +     _GL_ARG_NONNULL ((2, 3));  #endif  /* Map any int, typically from errno, into an error message.  */  #if @GNULIB_STRERROR@  # if @REPLACE_STRERROR@ -#  undef strerror -#  define strerror rpl_strerror -extern char *strerror (int); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   undef strerror +#   define strerror rpl_strerror +#  endif +_GL_FUNCDECL_RPL (strerror, char *, (int)); +_GL_CXXALIAS_RPL (strerror, char *, (int)); +# else +_GL_CXXALIAS_SYS (strerror, char *, (int));  # endif +_GL_CXXALIASWARN (strerror);  #elif defined GNULIB_POSIXCHECK  # undef strerror -# define strerror(e) \ -    (GL_LINK_WARNING ("strerror is unportable - " \ -                      "use gnulib module strerror to guarantee non-NULL result"), \ -     strerror (e)) +/* Assume strerror is always declared.  */ +_GL_WARN_ON_USE (strerror, "strerror is unportable - " +                 "use gnulib module strerror to guarantee non-NULL result");  #endif  #if @GNULIB_STRSIGNAL@  # if @REPLACE_STRSIGNAL@ -#  define strsignal rpl_strsignal -# endif -# if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@ -extern char *strsignal (int __sig); +#  if !(defined __cplusplus && defined GNULIB_NAMESPACE) +#   define strsignal rpl_strsignal +#  endif +_GL_FUNCDECL_RPL (strsignal, char *, (int __sig)); +_GL_CXXALIAS_RPL (strsignal, char *, (int __sig)); +# else +#  if ! @HAVE_DECL_STRSIGNAL@ +_GL_FUNCDECL_SYS (strsignal, char *, (int __sig)); +#  endif +/* Need to cast, because on Cygwin 1.5.x systems, the return type is +   'const char *'.  */ +_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));  # endif +_GL_CXXALIASWARN (strsignal);  #elif defined GNULIB_POSIXCHECK  # undef strsignal -# define strsignal(a) \ -    (GL_LINK_WARNING ("strsignal is unportable - " \ -                      "use gnulib module strsignal for portability"), \ -     strsignal (a)) +# if HAVE_RAW_DECL_STRSIGNAL +_GL_WARN_ON_USE (strsignal, "strsignal is unportable - " +                 "use gnulib module strsignal for portability"); +# endif  #endif  #if @GNULIB_STRVERSCMP@  # if !@HAVE_STRVERSCMP@ -extern int strverscmp (const char *, const char *); +_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *) +                                   _GL_ARG_NONNULL ((1, 2)));  # endif +_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *)); +_GL_CXXALIASWARN (strverscmp);  #elif defined GNULIB_POSIXCHECK  # undef strverscmp -# define strverscmp(a, b) \ -    (GL_LINK_WARNING ("strverscmp is unportable - " \ -                      "use gnulib module strverscmp for portability"), \ -     strverscmp (a, b)) +# if HAVE_RAW_DECL_STRVERSCMP +_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - " +                 "use gnulib module strverscmp for portability"); +# endif  #endif -#ifdef __cplusplus -} -#endif -  #endif /* _GL_STRING_H */  #endif /* _GL_STRING_H */  | 
