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