Home | History | Annotate | Download | only in include
      1 /* Copyright (C) 1991-1993,1995-2004,2007,2009 Free Software Foundation, Inc.
      2    This file is part of the GNU C Library.
      3 
      4    The GNU C Library is free software; you can redistribute it and/or
      5    modify it under the terms of the GNU Lesser General Public
      6    License as published by the Free Software Foundation; either
      7    version 2.1 of the License, or (at your option) any later version.
      8 
      9    The GNU C Library is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    Lesser General Public License for more details.
     13 
     14    You should have received a copy of the GNU Lesser General Public
     15    License along with the GNU C Library; if not, write to the Free
     16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     17    02111-1307 USA.  */
     18 
     19 /*
     20  *	ISO C99 Standard: 7.21 String handling	<string.h>
     21  */
     22 
     23 #ifndef	_STRING_H
     24 #define	_STRING_H	1
     25 
     26 #include <features.h>
     27 
     28 __BEGIN_DECLS
     29 
     30 /* Get size_t and NULL from <stddef.h>.  */
     31 #define	__need_size_t
     32 #define	__need_NULL
     33 #include <stddef.h>
     34 
     35 /* Tell the caller that we provide correct C++ prototypes.  */
     36 #if defined __cplusplus && __GNUC_PREREQ (4, 4)
     37 # define __CORRECT_ISO_CPP_STRING_H_PROTO
     38 #endif
     39 
     40 
     41 __BEGIN_NAMESPACE_STD
     42 /* Copy N bytes of SRC to DEST.  */
     43 extern void *memcpy (void *__restrict __dest,
     44 		     __const void *__restrict __src, size_t __n)
     45      __THROW __nonnull ((1, 2));
     46 /* Copy N bytes of SRC to DEST, guaranteeing
     47    correct behavior for overlapping strings.  */
     48 extern void *memmove (void *__dest, __const void *__src, size_t __n)
     49      __THROW __nonnull ((1, 2));
     50 __END_NAMESPACE_STD
     51 
     52 /* Copy no more than N bytes of SRC to DEST, stopping when C is found.
     53    Return the position in DEST one byte past where C was copied,
     54    or NULL if C was not found in the first N bytes of SRC.  */
     55 #if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN
     56 extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
     57 		      int __c, size_t __n)
     58      __THROW __nonnull ((1, 2));
     59 #endif /* SVID.  */
     60 
     61 
     62 __BEGIN_NAMESPACE_STD
     63 /* Set N bytes of S to C.  */
     64 extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
     65 
     66 /* Compare N bytes of S1 and S2.  */
     67 extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
     68      __THROW __attribute_pure__ __nonnull ((1, 2));
     69 
     70 /* Search N bytes of S for C.  */
     71 #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
     72 extern "C++"
     73 {
     74 extern void *memchr (void *__s, int __c, size_t __n)
     75       __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
     76 extern __const void *memchr (__const void *__s, int __c, size_t __n)
     77       __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));
     78 
     79 # ifdef __OPTIMIZE__
     80 __extern_always_inline void *
     81 memchr (void *__s, int __c, size_t __n) __THROW
     82 {
     83   return __builtin_memchr (__s, __c, __n);
     84 }
     85 
     86 __extern_always_inline __const void *
     87 memchr (__const void *__s, int __c, size_t __n) __THROW
     88 {
     89   return __builtin_memchr (__s, __c, __n);
     90 }
     91 # endif
     92 }
     93 #else
     94 extern void *memchr (__const void *__s, int __c, size_t __n)
     95       __THROW __attribute_pure__ __nonnull ((1));
     96 #endif
     97 __END_NAMESPACE_STD
     98 
     99 #ifdef __USE_GNU
    100 /* Search in S for C.  This is similar to `memchr' but there is no
    101    length limit.  */
    102 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    103 extern "C++" void *rawmemchr (void *__s, int __c)
    104      __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1));
    105 extern "C++" __const void *rawmemchr (__const void *__s, int __c)
    106      __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1));
    107 # else
    108 extern void *rawmemchr (__const void *__s, int __c)
    109      __THROW __attribute_pure__ __nonnull ((1));
    110 # endif
    111 
    112 /* Search N bytes of S for the final occurrence of C.  */
    113 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    114 extern "C++" void *memrchr (void *__s, int __c, size_t __n)
    115       __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1));
    116 extern "C++" __const void *memrchr (__const void *__s, int __c, size_t __n)
    117       __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1));
    118 # else
    119 extern void *memrchr (__const void *__s, int __c, size_t __n)
    120       __THROW __attribute_pure__ __nonnull ((1));
    121 # endif
    122 #endif
    123 
    124 
    125 __BEGIN_NAMESPACE_STD
    126 /* Copy SRC to DEST.  */
    127 extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
    128      __THROW __nonnull ((1, 2));
    129 /* Copy no more than N characters of SRC to DEST.  */
    130 extern char *strncpy (char *__restrict __dest,
    131 		      __const char *__restrict __src, size_t __n)
    132      __THROW __nonnull ((1, 2));
    133 
    134 /* Append SRC onto DEST.  */
    135 extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
    136      __THROW __nonnull ((1, 2));
    137 /* Append no more than N characters from SRC onto DEST.  */
    138 extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
    139 		      size_t __n) __THROW __nonnull ((1, 2));
    140 
    141 /* Compare S1 and S2.  */
    142 extern int strcmp (__const char *__s1, __const char *__s2)
    143      __THROW __attribute_pure__ __nonnull ((1, 2));
    144 /* Compare N characters of S1 and S2.  */
    145 extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
    146      __THROW __attribute_pure__ __nonnull ((1, 2));
    147 
    148 /* Compare the collated forms of S1 and S2.  */
    149 extern int strcoll (__const char *__s1, __const char *__s2)
    150      __THROW __attribute_pure__ __nonnull ((1, 2));
    151 /* Put a transformation of SRC into no more than N bytes of DEST.  */
    152 extern size_t strxfrm (char *__restrict __dest,
    153 		       __const char *__restrict __src, size_t __n)
    154      __THROW __nonnull ((2));
    155 __END_NAMESPACE_STD
    156 
    157 #ifdef __USE_XOPEN2K8
    158 /* The following functions are equivalent to the both above but they
    159    take the locale they use for the collation as an extra argument.
    160    This is not standardsized but something like will come.  */
    161 # include <xlocale.h>
    162 
    163 /* Compare the collated forms of S1 and S2 using rules from L.  */
    164 extern int strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
    165      __THROW __attribute_pure__ __nonnull ((1, 2, 3));
    166 /* Put a transformation of SRC into no more than N bytes of DEST.  */
    167 extern size_t strxfrm_l (char *__dest, __const char *__src, size_t __n,
    168 			 __locale_t __l) __THROW __nonnull ((2, 4));
    169 #endif
    170 
    171 #if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
    172 /* Duplicate S, returning an identical malloc'd string.  */
    173 extern char *strdup (__const char *__s)
    174      __THROW __attribute_malloc__ __nonnull ((1));
    175 #endif
    176 
    177 /* Return a malloc'd copy of at most N bytes of STRING.  The
    178    resultant string is terminated even if no null terminator
    179    appears before STRING[N].  */
    180 #if defined __USE_XOPEN2K8
    181 extern char *strndup (__const char *__string, size_t __n)
    182      __THROW __attribute_malloc__ __nonnull ((1));
    183 #endif
    184 
    185 #if defined __USE_GNU && defined __GNUC__
    186 /* Duplicate S, returning an identical alloca'd string.  */
    187 # define strdupa(s)							      \
    188   (__extension__							      \
    189     ({									      \
    190       __const char *__old = (s);					      \
    191       size_t __len = strlen (__old) + 1;				      \
    192       char *__new = (char *) __builtin_alloca (__len);			      \
    193       (char *) memcpy (__new, __old, __len);				      \
    194     }))
    195 
    196 /* Return an alloca'd copy of at most N bytes of string.  */
    197 # define strndupa(s, n)							      \
    198   (__extension__							      \
    199     ({									      \
    200       __const char *__old = (s);					      \
    201       size_t __len = strnlen (__old, (n));				      \
    202       char *__new = (char *) __builtin_alloca (__len + 1);		      \
    203       __new[__len] = '\0';						      \
    204       (char *) memcpy (__new, __old, __len);				      \
    205     }))
    206 #endif
    207 
    208 __BEGIN_NAMESPACE_STD
    209 /* Find the first occurrence of C in S.  */
    210 #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    211 extern "C++"
    212 {
    213 extern char *strchr (char *__s, int __c)
    214      __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1));
    215 extern __const char *strchr (__const char *__s, int __c)
    216      __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1));
    217 
    218 # ifdef __OPTIMIZE__
    219 __extern_always_inline char *
    220 strchr (char *__s, int __c) __THROW
    221 {
    222   return __builtin_strchr (__s, __c);
    223 }
    224 
    225 __extern_always_inline __const char *
    226 strchr (__const char *__s, int __c) __THROW
    227 {
    228   return __builtin_strchr (__s, __c);
    229 }
    230 # endif
    231 }
    232 #else
    233 extern char *strchr (__const char *__s, int __c)
    234      __THROW __attribute_pure__ __nonnull ((1));
    235 #endif
    236 /* Find the last occurrence of C in S.  */
    237 #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    238 extern "C++"
    239 {
    240 extern char *strrchr (char *__s, int __c)
    241      __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1));
    242 extern __const char *strrchr (__const char *__s, int __c)
    243      __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1));
    244 
    245 # ifdef __OPTIMIZE__
    246 __extern_always_inline char *
    247 strrchr (char *__s, int __c) __THROW
    248 {
    249   return __builtin_strrchr (__s, __c);
    250 }
    251 
    252 __extern_always_inline __const char *
    253 strrchr (__const char *__s, int __c) __THROW
    254 {
    255   return __builtin_strrchr (__s, __c);
    256 }
    257 # endif
    258 }
    259 #else
    260 extern char *strrchr (__const char *__s, int __c)
    261      __THROW __attribute_pure__ __nonnull ((1));
    262 #endif
    263 __END_NAMESPACE_STD
    264 
    265 #ifdef __USE_GNU
    266 /* This function is similar to `strchr'.  But it returns a pointer to
    267    the closing NUL byte in case C is not found in S.  */
    268 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    269 extern "C++" char *strchrnul (char *__s, int __c)
    270      __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1));
    271 extern "C++" __const char *strchrnul (__const char *__s, int __c)
    272      __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1));
    273 # else
    274 extern char *strchrnul (__const char *__s, int __c)
    275      __THROW __attribute_pure__ __nonnull ((1));
    276 # endif
    277 #endif
    278 
    279 __BEGIN_NAMESPACE_STD
    280 /* Return the length of the initial segment of S which
    281    consists entirely of characters not in REJECT.  */
    282 extern size_t strcspn (__const char *__s, __const char *__reject)
    283      __THROW __attribute_pure__ __nonnull ((1, 2));
    284 /* Return the length of the initial segment of S which
    285    consists entirely of characters in ACCEPT.  */
    286 extern size_t strspn (__const char *__s, __const char *__accept)
    287      __THROW __attribute_pure__ __nonnull ((1, 2));
    288 /* Find the first occurrence in S of any character in ACCEPT.  */
    289 #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    290 extern "C++"
    291 {
    292 extern char *strpbrk (char *__s, __const char *__accept)
    293      __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2));
    294 extern __const char *strpbrk (__const char *__s, __const char *__accept)
    295      __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2));
    296 
    297 # ifdef __OPTIMIZE__
    298 __extern_always_inline char *
    299 strpbrk (char *__s, __const char *__accept) __THROW
    300 {
    301   return __builtin_strpbrk (__s, __accept);
    302 }
    303 
    304 __extern_always_inline __const char *
    305 strpbrk (__const char *__s, __const char *__accept) __THROW
    306 {
    307   return __builtin_strpbrk (__s, __accept);
    308 }
    309 # endif
    310 }
    311 #else
    312 extern char *strpbrk (__const char *__s, __const char *__accept)
    313      __THROW __attribute_pure__ __nonnull ((1, 2));
    314 #endif
    315 /* Find the first occurrence of NEEDLE in HAYSTACK.  */
    316 #ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    317 extern "C++"
    318 {
    319 extern char *strstr (char *__haystack, __const char *__needle)
    320      __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));
    321 extern __const char *strstr (__const char *__haystack,
    322 			     __const char *__needle)
    323      __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));
    324 
    325 # ifdef __OPTIMIZE__
    326 __extern_always_inline char *
    327 strstr (char *__haystack, __const char *__needle) __THROW
    328 {
    329   return __builtin_strstr (__haystack, __needle);
    330 }
    331 
    332 __extern_always_inline __const char *
    333 strstr (__const char *__haystack, __const char *__needle) __THROW
    334 {
    335   return __builtin_strstr (__haystack, __needle);
    336 }
    337 # endif
    338 }
    339 #else
    340 extern char *strstr (__const char *__haystack, __const char *__needle)
    341      __THROW __attribute_pure__ __nonnull ((1, 2));
    342 #endif
    343 
    344 
    345 /* Divide S into tokens separated by characters in DELIM.  */
    346 extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
    347      __THROW __nonnull ((2));
    348 __END_NAMESPACE_STD
    349 
    350 /* Divide S into tokens separated by characters in DELIM.  Information
    351    passed between calls are stored in SAVE_PTR.  */
    352 extern char *__strtok_r (char *__restrict __s,
    353 			 __const char *__restrict __delim,
    354 			 char **__restrict __save_ptr)
    355      __THROW __nonnull ((2, 3));
    356 #if defined __USE_POSIX || defined __USE_MISC
    357 extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
    358 		       char **__restrict __save_ptr)
    359      __THROW __nonnull ((2, 3));
    360 #endif
    361 
    362 #ifdef __USE_GNU
    363 /* Similar to `strstr' but this function ignores the case of both strings.  */
    364 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    365 extern "C++" char *strcasestr (char *__haystack, __const char *__needle)
    366      __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2));
    367 extern "C++" __const char *strcasestr (__const char *__haystack,
    368 				       __const char *__needle)
    369      __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2));
    370 # else
    371 extern char *strcasestr (__const char *__haystack, __const char *__needle)
    372      __THROW __attribute_pure__ __nonnull ((1, 2));
    373 # endif
    374 #endif
    375 
    376 #ifdef __USE_GNU
    377 /* Find the first occurrence of NEEDLE in HAYSTACK.
    378    NEEDLE is NEEDLELEN bytes long;
    379    HAYSTACK is HAYSTACKLEN bytes long.  */
    380 extern void *memmem (__const void *__haystack, size_t __haystacklen,
    381 		     __const void *__needle, size_t __needlelen)
    382      __THROW __attribute_pure__ __nonnull ((1, 3));
    383 
    384 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
    385    last written byte.  */
    386 extern void *__mempcpy (void *__restrict __dest,
    387 			__const void *__restrict __src, size_t __n)
    388      __THROW __nonnull ((1, 2));
    389 extern void *mempcpy (void *__restrict __dest,
    390 		      __const void *__restrict __src, size_t __n)
    391      __THROW __nonnull ((1, 2));
    392 #endif
    393 
    394 
    395 __BEGIN_NAMESPACE_STD
    396 /* Return the length of S.  */
    397 extern size_t strlen (__const char *__s)
    398      __THROW __attribute_pure__ __nonnull ((1));
    399 __END_NAMESPACE_STD
    400 
    401 #ifdef	__USE_XOPEN2K8
    402 /* Find the length of STRING, but scan at most MAXLEN characters.
    403    If no '\0' terminator is found in that many characters, return MAXLEN.  */
    404 extern size_t strnlen (__const char *__string, size_t __maxlen)
    405      __THROW __attribute_pure__ __nonnull ((1));
    406 #endif
    407 
    408 
    409 __BEGIN_NAMESPACE_STD
    410 /* Return a string describing the meaning of the `errno' code in ERRNUM.  */
    411 extern char *strerror (int __errnum) __THROW;
    412 __END_NAMESPACE_STD
    413 #if defined __USE_XOPEN2K || defined __USE_MISC
    414 /* Reentrant version of `strerror'.
    415    There are 2 flavors of `strerror_r', GNU which returns the string
    416    and may or may not use the supplied temporary buffer and POSIX one
    417    which fills the string into the buffer.
    418    To use the POSIX version, -D_XOPEN_SOURCE=600 or -D_POSIX_C_SOURCE=200112L
    419    without -D_GNU_SOURCE is needed, otherwise the GNU version is
    420    preferred.  */
    421 # if defined __USE_XOPEN2K && !defined __USE_GNU
    422 /* Fill BUF with a string describing the meaning of the `errno' code in
    423    ERRNUM.  */
    424 #  ifdef __REDIRECT_NTH
    425 extern int __REDIRECT_NTH (strerror_r,
    426 			   (int __errnum, char *__buf, size_t __buflen),
    427 			   __xpg_strerror_r) __nonnull ((2));
    428 #  else
    429 extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
    430      __THROW __nonnull ((2));
    431 #   define strerror_r __xpg_strerror_r
    432 #  endif
    433 # else
    434 /* If a temporary buffer is required, at most BUFLEN bytes of BUF will be
    435    used.  */
    436 extern char *strerror_r (int __errnum, char *__buf, size_t __buflen)
    437      __THROW __nonnull ((2));
    438 # endif
    439 #endif
    440 
    441 #ifdef __USE_XOPEN2K8
    442 /* Translate error number to string according to the locale L.  */
    443 extern char *strerror_l (int __errnum, __locale_t __l) __THROW;
    444 #endif
    445 
    446 
    447 /* We define this function always since `bzero' is sometimes needed when
    448    the namespace rules does not allow this.  */
    449 extern void __bzero (void *__s, size_t __n) __THROW __nonnull ((1));
    450 
    451 #ifdef __USE_BSD
    452 /* Copy N bytes of SRC to DEST (like memmove, but args reversed).  */
    453 extern void bcopy (__const void *__src, void *__dest, size_t __n)
    454      __THROW __nonnull ((1, 2));
    455 
    456 /* Set N bytes of S to 0.  */
    457 extern void bzero (void *__s, size_t __n) __THROW __nonnull ((1));
    458 
    459 /* Compare N bytes of S1 and S2 (same as memcmp).  */
    460 extern int bcmp (__const void *__s1, __const void *__s2, size_t __n)
    461      __THROW __attribute_pure__ __nonnull ((1, 2));
    462 
    463 /* Find the first occurrence of C in S (same as strchr).  */
    464 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    465 extern "C++"
    466 {
    467 extern char *index (char *__s, int __c)
    468      __THROW __asm ("index") __attribute_pure__ __nonnull ((1));
    469 extern __const char *index (__const char *__s, int __c)
    470      __THROW __asm ("index") __attribute_pure__ __nonnull ((1));
    471 
    472 #  if defined __OPTIMIZE__ && !defined __CORRECT_ISO_CPP_STRINGS_H_PROTO
    473 __extern_always_inline char *
    474 index (char *__s, int __c) __THROW
    475 {
    476   return __builtin_index (__s, __c);
    477 }
    478 
    479 __extern_always_inline __const char *
    480 index (__const char *__s, int __c) __THROW
    481 {
    482   return __builtin_index (__s, __c);
    483 }
    484 #  endif
    485 }
    486 # else
    487 extern char *index (__const char *__s, int __c)
    488      __THROW __attribute_pure__ __nonnull ((1));
    489 # endif
    490 
    491 /* Find the last occurrence of C in S (same as strrchr).  */
    492 # ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    493 extern "C++"
    494 {
    495 extern char *rindex (char *__s, int __c)
    496      __THROW __asm ("rindex") __attribute_pure__ __nonnull ((1));
    497 extern __const char *rindex (__const char *__s, int __c)
    498      __THROW __asm ("rindex") __attribute_pure__ __nonnull ((1));
    499 
    500 #  if defined __OPTIMIZE__ && !defined __CORRECT_ISO_CPP_STRINGS_H_PROTO
    501 __extern_always_inline char *
    502 rindex (char *__s, int __c) __THROW
    503 {
    504   return __builtin_rindex (__s, __c);
    505 }
    506 
    507 __extern_always_inline __const char *
    508 rindex (__const char *__s, int __c) __THROW
    509 {
    510   return __builtin_rindex (__s, __c);
    511 }
    512 #endif
    513 }
    514 # else
    515 extern char *rindex (__const char *__s, int __c)
    516      __THROW __attribute_pure__ __nonnull ((1));
    517 # endif
    518 
    519 /* Return the position of the first bit set in I, or 0 if none are set.
    520    The least-significant bit is position 1, the most-significant 32.  */
    521 extern int ffs (int __i) __THROW __attribute__ ((__const__));
    522 
    523 /* The following two functions are non-standard but necessary for non-32 bit
    524    platforms.  */
    525 # ifdef	__USE_GNU
    526 extern int ffsl (long int __l) __THROW __attribute__ ((__const__));
    527 #  ifdef __GNUC__
    528 __extension__ extern int ffsll (long long int __ll)
    529      __THROW __attribute__ ((__const__));
    530 #  endif
    531 # endif
    532 
    533 /* Compare S1 and S2, ignoring case.  */
    534 extern int strcasecmp (__const char *__s1, __const char *__s2)
    535      __THROW __attribute_pure__ __nonnull ((1, 2));
    536 
    537 /* Compare no more than N chars of S1 and S2, ignoring case.  */
    538 extern int strncasecmp (__const char *__s1, __const char *__s2, size_t __n)
    539      __THROW __attribute_pure__ __nonnull ((1, 2));
    540 #endif /* Use BSD.  */
    541 
    542 #ifdef	__USE_GNU
    543 /* Again versions of a few functions which use the given locale instead
    544    of the global one.  */
    545 extern int strcasecmp_l (__const char *__s1, __const char *__s2,
    546 			 __locale_t __loc)
    547      __THROW __attribute_pure__ __nonnull ((1, 2, 3));
    548 
    549 extern int strncasecmp_l (__const char *__s1, __const char *__s2,
    550 			  size_t __n, __locale_t __loc)
    551      __THROW __attribute_pure__ __nonnull ((1, 2, 4));
    552 #endif
    553 
    554 #ifdef	__USE_BSD
    555 /* Return the next DELIM-delimited token from *STRINGP,
    556    terminating it with a '\0', and update *STRINGP to point past it.  */
    557 extern char *strsep (char **__restrict __stringp,
    558 		     __const char *__restrict __delim)
    559      __THROW __nonnull ((1, 2));
    560 #endif
    561 
    562 #ifdef	__USE_XOPEN2K8
    563 /* Return a string describing the meaning of the signal number in SIG.  */
    564 extern char *strsignal (int __sig) __THROW;
    565 
    566 /* Copy SRC to DEST, returning the address of the terminating '\0' in DEST.  */
    567 extern char *__stpcpy (char *__restrict __dest, __const char *__restrict __src)
    568      __THROW __nonnull ((1, 2));
    569 extern char *stpcpy (char *__restrict __dest, __const char *__restrict __src)
    570      __THROW __nonnull ((1, 2));
    571 
    572 /* Copy no more than N characters of SRC to DEST, returning the address of
    573    the last character written into DEST.  */
    574 extern char *__stpncpy (char *__restrict __dest,
    575 			__const char *__restrict __src, size_t __n)
    576      __THROW __nonnull ((1, 2));
    577 extern char *stpncpy (char *__restrict __dest,
    578 		      __const char *__restrict __src, size_t __n)
    579      __THROW __nonnull ((1, 2));
    580 #endif
    581 
    582 #ifdef	__USE_GNU
    583 /* Compare S1 and S2 as strings holding name & indices/version numbers.  */
    584 extern int strverscmp (__const char *__s1, __const char *__s2)
    585      __THROW __attribute_pure__ __nonnull ((1, 2));
    586 
    587 /* Sautee STRING briskly.  */
    588 extern char *strfry (char *__string) __THROW __nonnull ((1));
    589 
    590 /* Frobnicate N bytes of S.  */
    591 extern void *memfrob (void *__s, size_t __n) __THROW __nonnull ((1));
    592 
    593 # ifndef basename
    594 /* Return the file name within directory of FILENAME.  We don't
    595    declare the function if the `basename' macro is available (defined
    596    in <libgen.h>) which makes the XPG version of this function
    597    available.  */
    598 #  ifdef __CORRECT_ISO_CPP_STRING_H_PROTO
    599 extern "C++" char *basename (char *__filename)
    600      __THROW __asm ("basename") __nonnull ((1));
    601 extern "C++" __const char *basename (__const char *__filename)
    602      __THROW __asm ("basename") __nonnull ((1));
    603 #  else
    604 extern char *basename (__const char *__filename) __THROW __nonnull ((1));
    605 #  endif
    606 # endif
    607 #endif
    608 
    609 
    610 #if defined __GNUC__ && __GNUC__ >= 2
    611 # if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ \
    612      && !defined __NO_INLINE__ && !defined __cplusplus
    613 /* When using GNU CC we provide some optimized versions of selected
    614    functions from this header.  There are two kinds of optimizations:
    615 
    616    - machine-dependent optimizations, most probably using inline
    617      assembler code; these might be quite expensive since the code
    618      size can increase significantly.
    619      These optimizations are not used unless the symbol
    620 	__USE_STRING_INLINES
    621      is defined before including this header.
    622 
    623    - machine-independent optimizations which do not increase the
    624      code size significantly and which optimize mainly situations
    625      where one or more arguments are compile-time constants.
    626      These optimizations are used always when the compiler is
    627      taught to optimize.
    628 
    629    One can inhibit all optimizations by defining __NO_STRING_INLINES.  */
    630 
    631 /* Get the machine-dependent optimizations (if any).  */
    632 #  include <bits/string.h>
    633 
    634 /* These are generic optimizations which do not add too much inline code.  */
    635 #  include <bits/string2.h>
    636 # endif
    637 
    638 # if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
    639 /* Functions with security checks.  */
    640 #  include <bits/string3.h>
    641 # endif
    642 #endif
    643 
    644 __END_DECLS
    645 
    646 #endif /* string.h  */
    647