105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* A GNU-like <string.h>.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1995-1996, 2001-2012 Free Software Foundation, Inc.
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software; you can redistribute it and/or modify
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3, or (at your option)
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   any later version.
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _@GUARD_PREFIX@_STRING_H
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_SYSTEM_HEADER@
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang@PRAGMA_COLUMNS@
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The include_next requires a split double-inclusion guard.  */
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#@INCLUDE_NEXT@ @NEXT_STRING_H@
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _@GUARD_PREFIX@_STRING_H
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _@GUARD_PREFIX@_STRING_H
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* NetBSD 5.0 mis-defines NULL.  */
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stddef.h>
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* MirBSD defines mbslen as a macro.  */
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSLEN@ && defined __MirBSD__
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <wchar.h>
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The __attribute__ feature is available in gcc versions 2.5 and later.
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   The attribute __pure__ was added in gcc 2.96.  */
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_PURE /* empty */
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* But in any case avoid namespace pollution on glibc systems.  */
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    && ! defined __GLIBC__
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <unistd.h>
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_ARG_NONNULL is copied here.  */
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_WARN_ON_USE is copied here.  */
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the index of the least-significant set bit.  */
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_FFSL@
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !@HAVE_FFSL@
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (ffsl, int, (long int i));
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (ffsl, int, (long int i));
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (ffsl);
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef ffsl
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_FFSL
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the index of the least-significant set bit.  */
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_FFSLL@
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !@HAVE_FFSLL@
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (ffsll);
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef ffsll
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_FFSLL
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return the first instance of C within N bytes of S, or NULL.  */
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MEMCHR@
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_MEMCHR@
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define memchr rpl_memchr
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_MEMCHR@
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C" { const void * std::memchr (const void *, int, size_t); }
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { void * std::memchr (void *, int, size_t); }  */
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (memchr,
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void *, (void const *__s, int __c, size_t __n),
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void const *, (void const *__s, int __c, size_t __n));
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (memchr, void const *,
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   (void const *__s, int __c, size_t __n));
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (memchr);
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef memchr
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume memchr is always declared.  */
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module memchr for portability" );
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return the first occurrence of NEEDLE in HAYSTACK.  */
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MEMMEM@
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_MEMMEM@
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define memmem rpl_memmem
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (memmem, void *,
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void const *__haystack, size_t __haystack_len,
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   void const *__needle, size_t __needle_len)
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ATTRIBUTE_PURE
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 3)));
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (memmem, void *,
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void const *__haystack, size_t __haystack_len,
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   void const *__needle, size_t __needle_len));
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_DECL_MEMMEM@
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (memmem, void *,
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void const *__haystack, size_t __haystack_len,
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   void const *__needle, size_t __needle_len)
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ATTRIBUTE_PURE
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 3)));
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (memmem, void *,
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void const *__haystack, size_t __haystack_len,
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   void const *__needle, size_t __needle_len));
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (memmem);
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef memmem
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_MEMMEM
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module memmem-simple for portability, "
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "and module memmem for speed" );
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Copy N bytes of SRC to DEST, return pointer to bytes after the
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   last written byte.  */
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MEMPCPY@
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_MEMPCPY@
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (mempcpy, void *,
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void *restrict __dest, void const *restrict __src,
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n)
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mempcpy, void *,
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (void *restrict __dest, void const *restrict __src,
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n));
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mempcpy);
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef mempcpy
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_MEMPCPY
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module mempcpy for portability");
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Search backwards through a block for a byte (specified as an int).  */
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MEMRCHR@
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_DECL_MEMRCHR@
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { const void * std::memrchr (const void *, int, size_t); }
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { void * std::memrchr (void *, int, size_t); }  */
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (memrchr,
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void *, (void const *, int, size_t),
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void const *, (void const *, int, size_t));
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (memrchr);
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef memrchr
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_MEMRCHR
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module memrchr for portability");
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence of C in S.  More efficient than
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   memchr(S,C,N), at the expense of undefined behavior if C does not
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   occur within N bytes.  */
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_RAWMEMCHR@
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_RAWMEMCHR@
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ATTRIBUTE_PURE
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ARG_NONNULL ((1)));
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { const void * std::rawmemchr (const void *, int); }
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { void * std::rawmemchr (void *, int); }  */
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void *, (void const *__s, int __c_in),
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        void const *, (void const *__s, int __c_in));
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (rawmemchr);
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef rawmemchr
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_RAWMEMCHR
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module rawmemchr for portability");
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STPCPY@
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_STPCPY@
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (stpcpy, char *,
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src)
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (stpcpy, char *,
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src));
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (stpcpy);
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef stpcpy
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STPCPY
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module stpcpy for portability");
25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Copy no more than N bytes of SRC to DST, returning a pointer past the
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   last non-NUL byte written into DST.  */
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STPNCPY@
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STPNCPY@
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef stpncpy
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define stpncpy rpl_stpncpy
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (stpncpy, char *,
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src,
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n)
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (stpncpy, char *,
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src,
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n));
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_STPNCPY@
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (stpncpy, char *,
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src,
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n)
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (stpncpy, char *,
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict __dst, char const *restrict __src,
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   size_t __n));
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (stpncpy);
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef stpncpy
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STPNCPY
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module stpncpy for portability");
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined GNULIB_POSIXCHECK
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strchr() does not work with multibyte strings if the locale encoding is
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GB18030 and the character to be searched is a digit.  */
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strchr
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strchr is always declared.  */
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in some multibyte locales - "
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbschr if you care about internationalization");
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence of C in S or the final NUL byte.  */
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRCHRNUL@
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRCHRNUL@
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strchrnul rpl_strchrnul
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ATTRIBUTE_PURE
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ARG_NONNULL ((1)));
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strchrnul, char *,
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (const char *str, int ch));
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_STRCHRNUL@
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ATTRIBUTE_PURE
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                     _GL_ARG_NONNULL ((1)));
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { const char * std::strchrnul (const char *, int); }
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { char * std::strchrnul (char *, int); }  */
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (strchrnul,
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *, (char const *__s, int __c_in),
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char const *, (char const *__s, int __c_in));
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strchrnul);
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strchrnul
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRCHRNUL
34105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strchrnul for portability");
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Duplicate S, returning an identical malloc'd string.  */
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRDUP@
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRDUP@
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strdup
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strdup rpl_strdup
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /* strdup exists as a function and as a macro.  Get rid of the macro.  */
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strdup
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(@HAVE_DECL_STRDUP@ || defined strdup)
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strdup);
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strdup
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRDUP
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strdup, "strdup is unportable - "
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strdup for portability");
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Append no more than N characters from SRC onto DEST.  */
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRNCAT@
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRNCAT@
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strncat
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strncat rpl_strncat
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1, 2)));
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strncat);
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strncat
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRNCAT
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strncat, "strncat is unportable - "
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strncat for portability");
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return a newly allocated copy of at most N bytes of STRING.  */
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRNDUP@
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRNDUP@
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strndup
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strndup rpl_strndup
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n)
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n));
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_DECL_STRNDUP@
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n)
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n));
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strndup);
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strndup
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRNDUP
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strndup, "strndup is unportable - "
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strndup for portability");
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the length (number of bytes) of STRING, but scan at most
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MAXLEN bytes.  If no '\0' terminator is found in that many bytes,
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   return MAXLEN.  */
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRNLEN@
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRNLEN@
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strnlen
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strnlen rpl_strnlen
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__string, size_t __maxlen)
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__string, size_t __maxlen));
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_DECL_STRNLEN@
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strnlen);
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strnlen
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRNLEN
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strnlen for portability");
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined GNULIB_POSIXCHECK
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strcspn() assumes the second argument is a list of single-byte characters.
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Even in this simple case, it does not work with multibyte strings if the
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   locale encoding is GB18030 and one of the characters to be searched is a
45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   digit.  */
45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strcspn
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strcspn is always declared.  */
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in multibyte locales - "
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbscspn if you care about internationalization");
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence in S of any character in ACCEPT.  */
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRPBRK@
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_STRPBRK@
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1, 2)));
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C" { const char * strpbrk (const char *, const char *); }
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { char * strpbrk (char *, const char *); }  */
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (strpbrk,
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *, (char const *__s, char const *__accept),
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        const char *, (char const *__s, char const *__accept));
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strpbrk, char const *,
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   (char const *__s, char const *__accept));
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strpbrk);
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strpbrk() assumes the second argument is a list of single-byte characters.
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Even in this simple case, it does not work with multibyte strings if the
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   locale encoding is GB18030 and one of the characters to be searched is a
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   digit.  */
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef strpbrk
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in multibyte locales - "
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbspbrk if you care about internationalization");
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strpbrk
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRPBRK
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strpbrk for portability");
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined GNULIB_POSIXCHECK
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strspn() assumes the second argument is a list of single-byte characters.
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Even in this simple case, it cannot work with multibyte strings.  */
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strspn
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strspn is always declared.  */
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in multibyte locales - "
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbsspn if you care about internationalization");
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined GNULIB_POSIXCHECK
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strrchr() does not work with multibyte strings if the locale encoding is
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GB18030 and the character to be searched is a digit.  */
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strrchr
51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strrchr is always declared.  */
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in some multibyte locales - "
52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbsrchr if you care about internationalization");
52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If one is found, overwrite it with a NUL, and advance *STRINGP
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   to point to the next char after it.  Otherwise, set *STRINGP to NULL.
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If *STRINGP was already NULL, nothing happens.
52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return the old value of *STRINGP.
52805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This is a variant of strtok() that is multithread-safe and supports
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   empty fields.
53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It modifies the original string.
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: These functions cannot be used on constant strings.
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: The identity of the delimiting character is lost.
53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It doesn't work with multibyte strings unless all of the delimiter
53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           characters are ASCII characters < 0x30.
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   See also strtok_r().  */
53905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRSEP@
54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ! @HAVE_STRSEP@
54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strsep, char *,
54205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char **restrict __stringp, char const *restrict __delim)
54305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strsep, char *,
54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char **restrict __stringp, char const *restrict __delim));
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strsep);
54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
54905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef strsep
55005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "in multibyte locales - "
55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbssep if you care about internationalization");
55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strsep
55605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRSEP
55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strsep, "strsep is unportable - "
55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strsep for portability");
55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRSTR@
56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRSTR@
56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strstr rpl_strstr
56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1, 2)));
57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { const char * strstr (const char *, const char *); }
57405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { char * strstr (char *, const char *); }  */
57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (strstr,
57605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *, (const char *haystack, const char *needle),
57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        const char *, (const char *haystack, const char *needle));
57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
58105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strstr, const char *,
58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   (const char *haystack, const char *needle));
58405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strstr);
58605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strstr() does not work with multibyte strings if the locale encoding is
58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   different from UTF-8:
59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   POSIX says that it operates on "strings", and "string" in POSIX is defined
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   as a sequence of bytes, not of characters.  */
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strstr
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strstr is always declared.  */
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "work correctly on character strings in most "
59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "multibyte locales - "
59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbsstr if you care about internationalization, "
59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "or use strstr if you care about speed");
59905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
60005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   comparison.  */
60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRCASESTR@
60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRCASESTR@
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strcasestr rpl_strcasestr
60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strcasestr, char *,
60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (const char *haystack, const char *needle)
61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ATTRIBUTE_PURE
61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strcasestr, char *,
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (const char *haystack, const char *needle));
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_STRCASESTR@
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strcasestr, char *,
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (const char *haystack, const char *needle)
61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ATTRIBUTE_PURE
61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((1, 2)));
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* On some systems, this function is defined as an overloaded function:
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { const char * strcasestr (const char *, const char *); }
62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern "C++" { char * strcasestr (char *, const char *); }  */
62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST2 (strcasestr,
62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        char *, (const char *haystack, const char *needle),
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        const char *, (const char *haystack, const char *needle));
62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
63005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
63105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN1 (strcasestr, const char *,
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   (const char *haystack, const char *needle));
63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strcasestr);
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* strcasestr() does not work with multibyte strings:
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   It is a glibc extension, and glibc implements it only for unibyte
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   locales.  */
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strcasestr
64105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRCASESTR
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "strings in multibyte locales - "
64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbscasestr if you care about "
64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "internationalization, or use c-strcasestr if you want "
64605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "a locale independent function");
64705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
64805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
64905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Parse S into tokens separated by characters in DELIM.
65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If S is NULL, the saved pointer in SAVE_PTR is used as
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the next starting point.  For example:
65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        char s[] = "-abc-=-def";
65405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        char *sp;
65505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = strtok_r(NULL, "=", &sp);   // x = NULL
65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                // s = "abc\0-def\0"
65905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
66005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This is a variant of strtok() that is multithread-safe.
66105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
66205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   For the POSIX documentation for this function, see:
66305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   http://www.opengroup.org/susv3xsh/strtok.html
66405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
66505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It modifies the original string.
66605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: These functions cannot be used on constant strings.
66705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: The identity of the delimiting character is lost.
66805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It doesn't work with multibyte strings unless all of the delimiter
66905436638acc7c010349a69c3395f1a57c642dc62Ying Wang           characters are ASCII characters < 0x30.
67005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
67105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   See also strsep().  */
67205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRTOK_R@
67305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRTOK_R@
67405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
67505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strtok_r
67605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strtok_r rpl_strtok_r
67705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
67805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strtok_r, char *,
67905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict s, char const *restrict delim,
68005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   char **restrict save_ptr)
68105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((2, 3)));
68205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strtok_r, char *,
68305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict s, char const *restrict delim,
68405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   char **restrict save_ptr));
68505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
68605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
68705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strtok_r
68805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
68905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_DECL_STRTOK_R@
69005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strtok_r, char *,
69105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict s, char const *restrict delim,
69205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   char **restrict save_ptr)
69305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((2, 3)));
69405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
69505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strtok_r, char *,
69605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (char *restrict s, char const *restrict delim,
69705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                   char **restrict save_ptr));
69805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
69905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strtok_r);
70005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined GNULIB_POSIXCHECK
70105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
70205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "strings in multibyte locales - "
70305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use mbstok_r if you care about internationalization");
70405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
70505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
70605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strtok_r
70705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRTOK_R
70805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
70905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strtok_r for portability");
71005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
71105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
71205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
71305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
71405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The following functions are not specified by POSIX.  They are gnulib
71505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   extensions.  */
71605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
71705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSLEN@
71805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return the number of multibyte characters in the character string STRING.
71905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This considers multibyte characters, unlike strlen, which counts bytes.  */
72005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifdef __MirBSD__  /* MirBSD defines mbslen as a macro.  Override it.  */
72105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef mbslen
72205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
72305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @HAVE_MBSLEN@  /* AIX, OSF/1, MirBSD define mbslen already in libc.  */
72405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
72505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define mbslen rpl_mbslen
72605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
72705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
72805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
72905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
73005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
73105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
73205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
73305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
73405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
73505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
73605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
73705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mbslen);
73805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
73905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
74005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSNLEN@
74105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return the number of multibyte characters in the character string starting
74205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   at STRING and ending at STRING + LEN.  */
74305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
74405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
74505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1));
74605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
74705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
74805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSCHR@
74905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Locate the first single-byte character C in the character string STRING,
75005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and return a pointer to it.  Return NULL if C is not found in STRING.
75105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strchr(), this function works correctly in multibyte locales with
75205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   encodings such as GB18030.  */
75305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined __hpux
75405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
75505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define mbschr rpl_mbschr /* avoid collision with HP-UX function */
75605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
75705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
75805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
75905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
76005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
76105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
76205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
76305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ATTRIBUTE_PURE
76405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
76505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
76605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
76705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mbschr);
76805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
76905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
77005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSRCHR@
77105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Locate the last single-byte character C in the character string STRING,
77205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and return a pointer to it.  Return NULL if C is not found in STRING.
77305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strrchr(), this function works correctly in multibyte locales with
77405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   encodings such as GB18030.  */
77505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined __hpux || defined __INTERIX
77605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
77705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define mbsrchr rpl_mbsrchr /* avoid collision with system function */
77805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
77905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
78005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
78105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
78205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
78305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
78405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
78505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
78605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1)));
78705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
78805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
78905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mbsrchr);
79005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
79105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
79205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSSTR@
79305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence of the character string NEEDLE in the character
79405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   string HAYSTACK.  Return NULL if NEEDLE is not found in HAYSTACK.
79505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strstr(), this function works correctly in multibyte locales with
79605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   encodings different from UTF-8.  */
79705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
79805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
79905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
80005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
80105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
80205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSCASECMP@
80305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Compare the character strings S1 and S2, ignoring case, returning less than,
80405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   equal to or greater than zero if S1 is lexicographically less than, equal to
80505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   or greater than S2.
80605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Note: This function may, in multibyte locales, return 0 for strings of
80705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   different lengths!
80805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strcasecmp(), this function works correctly in multibyte locales.  */
80905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
81005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
81105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
81205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
81305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
81405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSNCASECMP@
81505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Compare the initial segment of the character string S1 consisting of at most
81605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   N characters with the initial segment of the character string S2 consisting
81705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   of at most N characters, ignoring case, returning less than, equal to or
81805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   greater than zero if the initial segment of S1 is lexicographically less
81905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   than, equal to or greater than the initial segment of S2.
82005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Note: This function may, in multibyte locales, return 0 for initial segments
82105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   of different lengths!
82205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strncasecmp(), this function works correctly in multibyte locales.
82305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   But beware that N is not a byte count but a character count!  */
82405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
82505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
82605436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
82705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
82805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
82905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSPCASECMP@
83005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Compare the initial segment of the character string STRING consisting of
83105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   at most mbslen (PREFIX) characters with the character string PREFIX,
83205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   ignoring case.  If the two match, return a pointer to the first byte
83305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   after this prefix in STRING.  Otherwise, return NULL.
83405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Note: This function may, in multibyte locales, return non-NULL if STRING
83505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is of smaller length than PREFIX!
83605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strncasecmp(), this function works correctly in multibyte
83705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   locales.  */
83805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
83905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
84005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
84105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
84205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
84305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSCASESTR@
84405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence of the character string NEEDLE in the character
84505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   string HAYSTACK, using case-insensitive comparison.
84605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Note: This function may, in multibyte locales, return success even if
84705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   strlen (haystack) < strlen (needle) !
84805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strcasestr(), this function works correctly in multibyte locales.  */
84905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
85005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
85105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
85205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
85305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
85405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSCSPN@
85505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence in the character string STRING of any character
85605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   in the character string ACCEPT.  Return the number of bytes from the
85705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   beginning of the string to this occurrence, or to the end of the string
85805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if none exists.
85905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strcspn(), this function works correctly in multibyte locales.  */
86005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
86105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
86205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
86305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
86405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
86505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSPBRK@
86605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence in the character string STRING of any character
86705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   in the character string ACCEPT.  Return the pointer to it, or NULL if none
86805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   exists.
86905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strpbrk(), this function works correctly in multibyte locales.  */
87005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined __hpux
87105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
87205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
87305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
87405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
87505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
87605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1, 2)));
87705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
87805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
87905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
88005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
88105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1, 2)));
88205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
88305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
88405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (mbspbrk);
88505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
88605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
88705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSSPN@
88805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Find the first occurrence in the character string STRING of any character
88905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   not in the character string REJECT.  Return the number of bytes from the
89005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   beginning of the string to this occurrence, or to the end of the string
89105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   if none exists.
89205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Unlike strspn(), this function works correctly in multibyte locales.  */
89305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
89405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ATTRIBUTE_PURE
89505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
89605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
89705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
89805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSSEP@
89905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Search the next delimiter (multibyte character listed in the character
90005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   string DELIM) starting at the character string *STRINGP.
90105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If one is found, overwrite it with a NUL, and advance *STRINGP to point
90205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   to the next multibyte character after it.  Otherwise, set *STRINGP to NULL.
90305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If *STRINGP was already NULL, nothing happens.
90405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Return the old value of *STRINGP.
90505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
90605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This is a variant of mbstok_r() that supports empty fields.
90705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
90805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It modifies the original string.
90905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: These functions cannot be used on constant strings.
91005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: The identity of the delimiting character is lost.
91105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
91205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   See also mbstok_r().  */
91305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
91405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((1, 2));
91505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
91605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
91705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_MBSTOK_R@
91805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Parse the character string STRING into tokens separated by characters in
91905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the character string DELIM.
92005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   If STRING is NULL, the saved pointer in SAVE_PTR is used as
92105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the next starting point.  For example:
92205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        char s[] = "-abc-=-def";
92305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        char *sp;
92405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = mbstok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
92505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = mbstok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
92605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        x = mbstok_r(NULL, "=", &sp);   // x = NULL
92705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                // s = "abc\0-def\0"
92805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
92905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: It modifies the original string.
93005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: These functions cannot be used on constant strings.
93105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Caveat: The identity of the delimiting character is lost.
93205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   See also mbssep().  */
93405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
93505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_ARG_NONNULL ((2, 3));
93605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
93705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
93805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Map any int, typically from errno, into an error message.  */
93905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRERROR@
94005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRERROR@
94105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
94205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strerror
94305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strerror rpl_strerror
94405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
94505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strerror, char *, (int));
94605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strerror, char *, (int));
94705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
94805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strerror, char *, (int));
94905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
95005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strerror);
95105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
95205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strerror
95305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume strerror is always declared.  */
95405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strerror, "strerror is unportable - "
95505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strerror to guarantee non-NULL result");
95605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
95705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
95805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Map any int, typically from errno, into an error message.  Multithread-safe.
95905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Uses the POSIX declaration, not the glibc declaration.  */
96005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRERROR_R@
96105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRERROR_R@
96205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
96305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef strerror_r
96405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strerror_r rpl_strerror_r
96505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
96605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
96705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((2)));
96805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
96905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
97005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !@HAVE_DECL_STRERROR_R@
97105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
97205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((2)));
97305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
97405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
97505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
97605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @HAVE_DECL_STRERROR_R@
97705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strerror_r);
97805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
97905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
98005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strerror_r
98105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRERROR_R
98205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
98305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strerror_r-posix for portability");
98405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
98505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
98605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
98705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRSIGNAL@
98805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if @REPLACE_STRSIGNAL@
98905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
99005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define strsignal rpl_strsignal
99105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
99205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
99305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
99405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
99505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if ! @HAVE_DECL_STRSIGNAL@
99605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
99705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
99805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Need to cast, because on Cygwin 1.5.x systems, the return type is
99905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   'const char *'.  */
100005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
100105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
100205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strsignal);
100305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
100405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strsignal
100505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRSIGNAL
100605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
100705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strsignal for portability");
100805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
100905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
101005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
101105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if @GNULIB_STRVERSCMP@
101205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !@HAVE_STRVERSCMP@
101305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
101405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ATTRIBUTE_PURE
101505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                   _GL_ARG_NONNULL ((1, 2)));
101605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
101705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
101805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (strverscmp);
101905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
102005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef strverscmp
102105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_STRVERSCMP
102205436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
102305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module strverscmp for portability");
102405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
102505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
102605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
102705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
102805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _@GUARD_PREFIX@_STRING_H */
102905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _@GUARD_PREFIX@_STRING_H */
1030