1/* Copyright (C) 1991-2020 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, see 
16 <https://www.gnu.org/licenses/>. */ 
17 
18/* 
19 * ISO C99 Standard: 7.21 String handling <string.h> 
20 */ 
21 
22#ifndef _STRING_H 
23#define _STRING_H 1 
24 
25#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION 
26#include <bits/libc-header-start.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 || __glibc_clang_prereq (3, 5)) 
38# define __CORRECT_ISO_CPP_STRING_H_PROTO 
39#endif 
40 
41 
42/* Copy N bytes of SRC to DEST. */ 
43extern void *memcpy (void *__restrict __dest, const void *__restrict __src
44 size_t __n) __THROW __nonnull ((1, 2)); 
45/* Copy N bytes of SRC to DEST, guaranteeing 
46 correct behavior for overlapping strings. */ 
47extern void *memmove (void *__dest, const void *__src, size_t __n
48 __THROW __nonnull ((1, 2)); 
49 
50/* Copy no more than N bytes of SRC to DEST, stopping when C is found. 
51 Return the position in DEST one byte past where C was copied, 
52 or NULL if C was not found in the first N bytes of SRC. */ 
53#if defined __USE_MISC || defined __USE_XOPEN || __GLIBC_USE (ISOC2X) 
54extern void *memccpy (void *__restrict __dest, const void *__restrict __src
55 int __c, size_t __n
56 __THROW __nonnull ((1, 2)); 
57#endif /* Misc || X/Open. */ 
58 
59 
60/* Set N bytes of S to C. */ 
61extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1)); 
62 
63/* Compare N bytes of S1 and S2. */ 
64extern int memcmp (const void *__s1, const void *__s2, size_t __n
65 __THROW __attribute_pure__ __nonnull ((1, 2)); 
66 
67/* Search N bytes of S for C. */ 
68#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
69extern "C++" 
70
71extern void *memchr (void *__s, int __c, size_t __n
72 __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1)); 
73extern const void *memchr (const void *__s, int __c, size_t __n
74 __THROW __asm ("memchr") __attribute_pure__ __nonnull ((1)); 
75 
76# ifdef __OPTIMIZE__ 
77__extern_always_inline void
78memchr (void *__s, int __c, size_t __n) __THROW 
79
80 return __builtin_memchr (__s, __c, __n); 
81
82 
83__extern_always_inline const void
84memchr (const void *__s, int __c, size_t __n) __THROW 
85
86 return __builtin_memchr (__s, __c, __n); 
87
88# endif 
89
90#else 
91extern void *memchr (const void *__s, int __c, size_t __n) 
92 __THROW __attribute_pure__ __nonnull ((1)); 
93#endif 
94 
95#ifdef __USE_GNU 
96/* Search in S for C. This is similar to `memchr' but there is no 
97 length limit. */ 
98# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
99extern "C++" void *rawmemchr (void *__s, int __c
100 __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1)); 
101extern "C++" const void *rawmemchr (const void *__s, int __c
102 __THROW __asm ("rawmemchr") __attribute_pure__ __nonnull ((1)); 
103# else 
104extern void *rawmemchr (const void *__s, int __c) 
105 __THROW __attribute_pure__ __nonnull ((1)); 
106# endif 
107 
108/* Search N bytes of S for the final occurrence of C. */ 
109# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
110extern "C++" void *memrchr (void *__s, int __c, size_t __n
111 __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1)); 
112extern "C++" const void *memrchr (const void *__s, int __c, size_t __n
113 __THROW __asm ("memrchr") __attribute_pure__ __nonnull ((1)); 
114# else 
115extern void *memrchr (const void *__s, int __c, size_t __n) 
116 __THROW __attribute_pure__ __nonnull ((1)); 
117# endif 
118#endif 
119 
120 
121/* Copy SRC to DEST. */ 
122extern char *strcpy (char *__restrict __dest, const char *__restrict __src
123 __THROW __nonnull ((1, 2)); 
124/* Copy no more than N characters of SRC to DEST. */ 
125extern char *strncpy (char *__restrict __dest
126 const char *__restrict __src, size_t __n
127 __THROW __nonnull ((1, 2)); 
128 
129/* Append SRC onto DEST. */ 
130extern char *strcat (char *__restrict __dest, const char *__restrict __src
131 __THROW __nonnull ((1, 2)); 
132/* Append no more than N characters from SRC onto DEST. */ 
133extern char *strncat (char *__restrict __dest, const char *__restrict __src
134 size_t __n) __THROW __nonnull ((1, 2)); 
135 
136/* Compare S1 and S2. */ 
137extern int strcmp (const char *__s1, const char *__s2
138 __THROW __attribute_pure__ __nonnull ((1, 2)); 
139/* Compare N characters of S1 and S2. */ 
140extern int strncmp (const char *__s1, const char *__s2, size_t __n
141 __THROW __attribute_pure__ __nonnull ((1, 2)); 
142 
143/* Compare the collated forms of S1 and S2. */ 
144extern int strcoll (const char *__s1, const char *__s2
145 __THROW __attribute_pure__ __nonnull ((1, 2)); 
146/* Put a transformation of SRC into no more than N bytes of DEST. */ 
147extern size_t strxfrm (char *__restrict __dest
148 const char *__restrict __src, size_t __n
149 __THROW __nonnull ((2)); 
150 
151#ifdef __USE_XOPEN2K8 
152/* POSIX.1-2008 extended locale interface (see locale.h). */ 
153# include <bits/types/locale_t.h> 
154 
155/* Compare the collated forms of S1 and S2, using sorting rules from L. */ 
156extern int strcoll_l (const char *__s1, const char *__s2, locale_t __l
157 __THROW __attribute_pure__ __nonnull ((1, 2, 3)); 
158/* Put a transformation of SRC into no more than N bytes of DEST, 
159 using sorting rules from L. */ 
160extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n
161 locale_t __l) __THROW __nonnull ((2, 4)); 
162#endif 
163 
164#if (defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 \ 
165 || __GLIBC_USE (LIB_EXT2) || __GLIBC_USE (ISOC2X)) 
166/* Duplicate S, returning an identical malloc'd string. */ 
167extern char *strdup (const char *__s
168 __THROW __attribute_malloc__ __nonnull ((1)); 
169#endif 
170 
171/* Return a malloc'd copy of at most N bytes of STRING. The 
172 resultant string is terminated even if no null terminator 
173 appears before STRING[N]. */ 
174#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2) || __GLIBC_USE (ISOC2X) 
175extern char *strndup (const char *__string, size_t __n
176 __THROW __attribute_malloc__ __nonnull ((1)); 
177#endif 
178 
179#if defined __USE_GNU && defined __GNUC__ 
180/* Duplicate S, returning an identical alloca'd string. */ 
181# define strdupa(s) \ 
182 (__extension__ \ 
183 ({ \ 
184 const char *__old = (s); \ 
185 size_t __len = strlen (__old) + 1; \ 
186 char *__new = (char *) __builtin_alloca (__len); \ 
187 (char *) memcpy (__new, __old, __len); \ 
188 })) 
189 
190/* Return an alloca'd copy of at most N bytes of string. */ 
191# define strndupa(s, n) \ 
192 (__extension__ \ 
193 ({ \ 
194 const char *__old = (s); \ 
195 size_t __len = strnlen (__old, (n)); \ 
196 char *__new = (char *) __builtin_alloca (__len + 1); \ 
197 __new[__len] = '\0'; \ 
198 (char *) memcpy (__new, __old, __len); \ 
199 })) 
200#endif 
201 
202/* Find the first occurrence of C in S. */ 
203#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
204extern "C++" 
205
206extern char *strchr (char *__s, int __c
207 __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1)); 
208extern const char *strchr (const char *__s, int __c
209 __THROW __asm ("strchr") __attribute_pure__ __nonnull ((1)); 
210 
211# ifdef __OPTIMIZE__ 
212__extern_always_inline char
213strchr (char *__s, int __c) __THROW 
214
215 return __builtin_strchr (__s, __c); 
216
217 
218__extern_always_inline const char
219strchr (const char *__s, int __c) __THROW 
220
221 return __builtin_strchr (__s, __c); 
222
223# endif 
224
225#else 
226extern char *strchr (const char *__s, int __c) 
227 __THROW __attribute_pure__ __nonnull ((1)); 
228#endif 
229/* Find the last occurrence of C in S. */ 
230#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
231extern "C++" 
232
233extern char *strrchr (char *__s, int __c
234 __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1)); 
235extern const char *strrchr (const char *__s, int __c
236 __THROW __asm ("strrchr") __attribute_pure__ __nonnull ((1)); 
237 
238# ifdef __OPTIMIZE__ 
239__extern_always_inline char
240strrchr (char *__s, int __c) __THROW 
241
242 return __builtin_strrchr (__s, __c); 
243
244 
245__extern_always_inline const char
246strrchr (const char *__s, int __c) __THROW 
247
248 return __builtin_strrchr (__s, __c); 
249
250# endif 
251
252#else 
253extern char *strrchr (const char *__s, int __c) 
254 __THROW __attribute_pure__ __nonnull ((1)); 
255#endif 
256 
257#ifdef __USE_GNU 
258/* This function is similar to `strchr'. But it returns a pointer to 
259 the closing NUL byte in case C is not found in S. */ 
260# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
261extern "C++" char *strchrnul (char *__s, int __c
262 __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1)); 
263extern "C++" const char *strchrnul (const char *__s, int __c
264 __THROW __asm ("strchrnul") __attribute_pure__ __nonnull ((1)); 
265# else 
266extern char *strchrnul (const char *__s, int __c) 
267 __THROW __attribute_pure__ __nonnull ((1)); 
268# endif 
269#endif 
270 
271/* Return the length of the initial segment of S which 
272 consists entirely of characters not in REJECT. */ 
273extern size_t strcspn (const char *__s, const char *__reject
274 __THROW __attribute_pure__ __nonnull ((1, 2)); 
275/* Return the length of the initial segment of S which 
276 consists entirely of characters in ACCEPT. */ 
277extern size_t strspn (const char *__s, const char *__accept
278 __THROW __attribute_pure__ __nonnull ((1, 2)); 
279/* Find the first occurrence in S of any character in ACCEPT. */ 
280#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
281extern "C++" 
282
283extern char *strpbrk (char *__s, const char *__accept
284 __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2)); 
285extern const char *strpbrk (const char *__s, const char *__accept
286 __THROW __asm ("strpbrk") __attribute_pure__ __nonnull ((1, 2)); 
287 
288# ifdef __OPTIMIZE__ 
289__extern_always_inline char
290strpbrk (char *__s, const char *__accept) __THROW 
291
292 return __builtin_strpbrk (__s, __accept); 
293
294 
295__extern_always_inline const char
296strpbrk (const char *__s, const char *__accept) __THROW 
297
298 return __builtin_strpbrk (__s, __accept); 
299
300# endif 
301
302#else 
303extern char *strpbrk (const char *__s, const char *__accept) 
304 __THROW __attribute_pure__ __nonnull ((1, 2)); 
305#endif 
306/* Find the first occurrence of NEEDLE in HAYSTACK. */ 
307#ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
308extern "C++" 
309
310extern char *strstr (char *__haystack, const char *__needle
311 __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2)); 
312extern const char *strstr (const char *__haystack, const char *__needle
313 __THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2)); 
314 
315# ifdef __OPTIMIZE__ 
316__extern_always_inline char
317strstr (char *__haystack, const char *__needle) __THROW 
318
319 return __builtin_strstr (__haystack, __needle); 
320
321 
322__extern_always_inline const char
323strstr (const char *__haystack, const char *__needle) __THROW 
324
325 return __builtin_strstr (__haystack, __needle); 
326
327# endif 
328
329#else 
330extern char *strstr (const char *__haystack, const char *__needle) 
331 __THROW __attribute_pure__ __nonnull ((1, 2)); 
332#endif 
333 
334 
335/* Divide S into tokens separated by characters in DELIM. */ 
336extern char *strtok (char *__restrict __s, const char *__restrict __delim
337 __THROW __nonnull ((2)); 
338 
339/* Divide S into tokens separated by characters in DELIM. Information 
340 passed between calls are stored in SAVE_PTR. */ 
341extern char *__strtok_r (char *__restrict __s
342 const char *__restrict __delim
343 char **__restrict __save_ptr
344 __THROW __nonnull ((2, 3)); 
345#ifdef __USE_POSIX 
346extern char *strtok_r (char *__restrict __s, const char *__restrict __delim
347 char **__restrict __save_ptr
348 __THROW __nonnull ((2, 3)); 
349#endif 
350 
351#ifdef __USE_GNU 
352/* Similar to `strstr' but this function ignores the case of both strings. */ 
353# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
354extern "C++" char *strcasestr (char *__haystack, const char *__needle
355 __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2)); 
356extern "C++" const char *strcasestr (const char *__haystack
357 const char *__needle
358 __THROW __asm ("strcasestr") __attribute_pure__ __nonnull ((1, 2)); 
359# else 
360extern char *strcasestr (const char *__haystack, const char *__needle) 
361 __THROW __attribute_pure__ __nonnull ((1, 2)); 
362# endif 
363#endif 
364 
365#ifdef __USE_GNU 
366/* Find the first occurrence of NEEDLE in HAYSTACK. 
367 NEEDLE is NEEDLELEN bytes long; 
368 HAYSTACK is HAYSTACKLEN bytes long. */ 
369extern void *memmem (const void *__haystack, size_t __haystacklen
370 const void *__needle, size_t __needlelen
371 __THROW __attribute_pure__ __nonnull ((1, 3)); 
372 
373/* Copy N bytes of SRC to DEST, return pointer to bytes after the 
374 last written byte. */ 
375extern void *__mempcpy (void *__restrict __dest
376 const void *__restrict __src, size_t __n
377 __THROW __nonnull ((1, 2)); 
378extern void *mempcpy (void *__restrict __dest
379 const void *__restrict __src, size_t __n
380 __THROW __nonnull ((1, 2)); 
381#endif 
382 
383 
384/* Return the length of S. */ 
385extern size_t strlen (const char *__s
386 __THROW __attribute_pure__ __nonnull ((1)); 
387 
388#ifdef __USE_XOPEN2K8 
389/* Find the length of STRING, but scan at most MAXLEN characters. 
390 If no '\0' terminator is found in that many characters, return MAXLEN. */ 
391extern size_t strnlen (const char *__string, size_t __maxlen
392 __THROW __attribute_pure__ __nonnull ((1)); 
393#endif 
394 
395 
396/* Return a string describing the meaning of the `errno' code in ERRNUM. */ 
397extern char *strerror (int __errnum) __THROW
398#ifdef __USE_XOPEN2K 
399/* Reentrant version of `strerror'. 
400 There are 2 flavors of `strerror_r', GNU which returns the string 
401 and may or may not use the supplied temporary buffer and POSIX one 
402 which fills the string into the buffer. 
403 To use the POSIX version, -D_XOPEN_SOURCE=600 or -D_POSIX_C_SOURCE=200112L 
404 without -D_GNU_SOURCE is needed, otherwise the GNU version is 
405 preferred. */ 
406# if defined __USE_XOPEN2K && !defined __USE_GNU 
407/* Fill BUF with a string describing the meaning of the `errno' code in 
408 ERRNUM. */ 
409# ifdef __REDIRECT_NTH 
410extern int __REDIRECT_NTH (strerror_r, 
411 (int __errnum, char *__buf, size_t __buflen), 
412 __xpg_strerror_r) __nonnull ((2)); 
413# else 
414extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen) 
415 __THROW __nonnull ((2)); 
416# define strerror_r __xpg_strerror_r 
417# endif 
418# else 
419/* If a temporary buffer is required, at most BUFLEN bytes of BUF will be 
420 used. */ 
421extern char *strerror_r (int __errnum, char *__buf, size_t __buflen
422 __THROW __nonnull ((2)) __wur
423# endif 
424#endif 
425 
426#ifdef __USE_XOPEN2K8 
427/* Translate error number to string according to the locale L. */ 
428extern char *strerror_l (int __errnum, locale_t __l) __THROW
429#endif 
430 
431#ifdef __USE_MISC 
432# include <strings.h> 
433 
434/* Set N bytes of S to 0. The compiler will not delete a call to this 
435 function, even if S is dead after the call. */ 
436extern void explicit_bzero (void *__s, size_t __n) __THROW __nonnull ((1)); 
437 
438/* Return the next DELIM-delimited token from *STRINGP, 
439 terminating it with a '\0', and update *STRINGP to point past it. */ 
440extern char *strsep (char **__restrict __stringp
441 const char *__restrict __delim
442 __THROW __nonnull ((1, 2)); 
443#endif 
444 
445#ifdef __USE_XOPEN2K8 
446/* Return a string describing the meaning of the signal number in SIG. */ 
447extern char *strsignal (int __sig) __THROW
448 
449/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ 
450extern char *__stpcpy (char *__restrict __dest, const char *__restrict __src
451 __THROW __nonnull ((1, 2)); 
452extern char *stpcpy (char *__restrict __dest, const char *__restrict __src
453 __THROW __nonnull ((1, 2)); 
454 
455/* Copy no more than N characters of SRC to DEST, returning the address of 
456 the last character written into DEST. */ 
457extern char *__stpncpy (char *__restrict __dest
458 const char *__restrict __src, size_t __n
459 __THROW __nonnull ((1, 2)); 
460extern char *stpncpy (char *__restrict __dest
461 const char *__restrict __src, size_t __n
462 __THROW __nonnull ((1, 2)); 
463#endif 
464 
465#ifdef __USE_GNU 
466/* Compare S1 and S2 as strings holding name & indices/version numbers. */ 
467extern int strverscmp (const char *__s1, const char *__s2
468 __THROW __attribute_pure__ __nonnull ((1, 2)); 
469 
470/* Sautee STRING briskly. */ 
471extern char *strfry (char *__string) __THROW __nonnull ((1)); 
472 
473/* Frobnicate N bytes of S. */ 
474extern void *memfrob (void *__s, size_t __n) __THROW __nonnull ((1)); 
475 
476# ifndef basename 
477/* Return the file name within directory of FILENAME. We don't 
478 declare the function if the `basename' macro is available (defined 
479 in <libgen.h>) which makes the XPG version of this function 
480 available. */ 
481# ifdef __CORRECT_ISO_CPP_STRING_H_PROTO 
482extern "C++" char *basename (char *__filename
483 __THROW __asm ("basename") __nonnull ((1)); 
484extern "C++" const char *basename (const char *__filename
485 __THROW __asm ("basename") __nonnull ((1)); 
486# else 
487extern char *basename (const char *__filename) __THROW __nonnull ((1)); 
488# endif 
489# endif 
490#endif 
491 
492#if __GNUC_PREREQ (3,4) 
493# if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function 
494/* Functions with security checks. */ 
495# include <bits/string_fortified.h> 
496# endif 
497#endif 
498 
499__END_DECLS 
500 
501#endif /* string.h */ 
502