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