1 /* A GNU-like <string.h>.
3 Copyright (C) 1995-1996, 2001-2010 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
22 @PRAGMA_SYSTEM_HEADER@
25 /* The include_next requires a split double-inclusion guard. */
26 #@INCLUDE_NEXT@ @NEXT_STRING_H@
31 /* NetBSD 5.0 mis-defines NULL. */
34 /* MirBSD defines mbslen as a macro. */
35 #if @GNULIB_MBSLEN@ && defined __MirBSD__
40 /* This feature is available in gcc versions 2.5 and later. */
41 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
42 # define __attribute__(Spec) /* empty */
44 /* The attribute __pure__ was added in gcc 2.96. */
45 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
46 # define __pure__ /* empty */
51 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
53 /* The definition of _GL_ARG_NONNULL is copied here. */
55 /* The definition of _GL_WARN_ON_USE is copied here. */
58 /* Return the first instance of C within N bytes of S, or NULL. */
61 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
62 # define memchr rpl_memchr
64 _GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
65 __attribute__ ((__pure__))
66 _GL_ARG_NONNULL ((1)));
67 _GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
70 _GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
71 __attribute__ ((__pure__))
72 _GL_ARG_NONNULL ((1)));
74 /* On some systems, this function is defined as an overloaded function:
75 extern "C" { const void * std::memchr (const void *, int, size_t); }
76 extern "C++" { void * std::memchr (void *, int, size_t); } */
77 _GL_CXXALIAS_SYS_CAST2 (memchr,
78 void *, (void const *__s, int __c, size_t __n),
79 void const *, (void const *__s, int __c, size_t __n));
81 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
82 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
83 _GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
84 _GL_CXXALIASWARN1 (memchr, void const *,
85 (void const *__s, int __c, size_t __n));
87 _GL_CXXALIASWARN (memchr);
89 #elif defined GNULIB_POSIXCHECK
91 /* Assume memchr is always declared. */
92 _GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
93 "use gnulib module memchr for portability" );
96 /* Return the first occurrence of NEEDLE in HAYSTACK. */
99 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
100 # define memmem rpl_memmem
102 _GL_FUNCDECL_RPL (memmem, void *,
103 (void const *__haystack, size_t __haystack_len,
104 void const *__needle, size_t __needle_len)
105 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3)));
106 _GL_CXXALIAS_RPL (memmem, void *,
107 (void const *__haystack, size_t __haystack_len,
108 void const *__needle, size_t __needle_len));
110 # if ! @HAVE_DECL_MEMMEM@
111 _GL_FUNCDECL_SYS (memmem, void *,
112 (void const *__haystack, size_t __haystack_len,
113 void const *__needle, size_t __needle_len)
114 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 3)));
116 _GL_CXXALIAS_SYS (memmem, void *,
117 (void const *__haystack, size_t __haystack_len,
118 void const *__needle, size_t __needle_len));
120 _GL_CXXALIASWARN (memmem);
121 #elif defined GNULIB_POSIXCHECK
123 # if HAVE_RAW_DECL_MEMMEM
124 _GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
125 "use gnulib module memmem-simple for portability, "
126 "and module memmem for speed" );
130 /* Copy N bytes of SRC to DEST, return pointer to bytes after the
131 last written byte. */
133 # if ! @HAVE_MEMPCPY@
134 _GL_FUNCDECL_SYS (mempcpy, void *,
135 (void *restrict __dest, void const *restrict __src,
137 _GL_ARG_NONNULL ((1, 2)));
139 _GL_CXXALIAS_SYS (mempcpy, void *,
140 (void *restrict __dest, void const *restrict __src,
142 _GL_CXXALIASWARN (mempcpy);
143 #elif defined GNULIB_POSIXCHECK
145 # if HAVE_RAW_DECL_MEMPCPY
146 _GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
147 "use gnulib module mempcpy for portability");
151 /* Search backwards through a block for a byte (specified as an int). */
153 # if ! @HAVE_DECL_MEMRCHR@
154 _GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
155 __attribute__ ((__pure__))
156 _GL_ARG_NONNULL ((1)));
158 /* On some systems, this function is defined as an overloaded function:
159 extern "C++" { const void * std::memrchr (const void *, int, size_t); }
160 extern "C++" { void * std::memrchr (void *, int, size_t); } */
161 _GL_CXXALIAS_SYS_CAST2 (memrchr,
162 void *, (void const *, int, size_t),
163 void const *, (void const *, int, size_t));
164 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
165 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
166 _GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
167 _GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
169 _GL_CXXALIASWARN (memrchr);
171 #elif defined GNULIB_POSIXCHECK
173 # if HAVE_RAW_DECL_MEMRCHR
174 _GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
175 "use gnulib module memrchr for portability");
179 /* Find the first occurrence of C in S. More efficient than
180 memchr(S,C,N), at the expense of undefined behavior if C does not
181 occur within N bytes. */
182 #if @GNULIB_RAWMEMCHR@
183 # if ! @HAVE_RAWMEMCHR@
184 _GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
185 __attribute__ ((__pure__))
186 _GL_ARG_NONNULL ((1)));
188 /* On some systems, this function is defined as an overloaded function:
189 extern "C++" { const void * std::rawmemchr (const void *, int); }
190 extern "C++" { void * std::rawmemchr (void *, int); } */
191 _GL_CXXALIAS_SYS_CAST2 (rawmemchr,
192 void *, (void const *__s, int __c_in),
193 void const *, (void const *__s, int __c_in));
194 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
195 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
196 _GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
197 _GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
199 _GL_CXXALIASWARN (rawmemchr);
201 #elif defined GNULIB_POSIXCHECK
203 # if HAVE_RAW_DECL_RAWMEMCHR
204 _GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
205 "use gnulib module rawmemchr for portability");
209 /* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
212 _GL_FUNCDECL_SYS (stpcpy, char *,
213 (char *restrict __dst, char const *restrict __src)
214 _GL_ARG_NONNULL ((1, 2)));
216 _GL_CXXALIAS_SYS (stpcpy, char *,
217 (char *restrict __dst, char const *restrict __src));
218 _GL_CXXALIASWARN (stpcpy);
219 #elif defined GNULIB_POSIXCHECK
221 # if HAVE_RAW_DECL_STPCPY
222 _GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
223 "use gnulib module stpcpy for portability");
227 /* Copy no more than N bytes of SRC to DST, returning a pointer past the
228 last non-NUL byte written into DST. */
230 # if @REPLACE_STPNCPY@
231 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
232 # define stpncpy rpl_stpncpy
234 _GL_FUNCDECL_RPL (stpncpy, char *,
235 (char *restrict __dst, char const *restrict __src,
237 _GL_ARG_NONNULL ((1, 2)));
238 _GL_CXXALIAS_RPL (stpncpy, char *,
239 (char *restrict __dst, char const *restrict __src,
242 # if ! @HAVE_STPNCPY@
243 _GL_FUNCDECL_SYS (stpncpy, char *,
244 (char *restrict __dst, char const *restrict __src,
246 _GL_ARG_NONNULL ((1, 2)));
248 _GL_CXXALIAS_SYS (stpncpy, char *,
249 (char *restrict __dst, char const *restrict __src,
252 _GL_CXXALIASWARN (stpncpy);
253 #elif defined GNULIB_POSIXCHECK
255 # if HAVE_RAW_DECL_STPNCPY
256 _GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
257 "use gnulib module stpncpy for portability");
261 #if defined GNULIB_POSIXCHECK
262 /* strchr() does not work with multibyte strings if the locale encoding is
263 GB18030 and the character to be searched is a digit. */
265 /* Assume strchr is always declared. */
266 _GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
267 "in some multibyte locales - "
268 "use mbschr if you care about internationalization");
271 /* Find the first occurrence of C in S or the final NUL byte. */
272 #if @GNULIB_STRCHRNUL@
273 # if ! @HAVE_STRCHRNUL@
274 _GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
275 __attribute__ ((__pure__))
276 _GL_ARG_NONNULL ((1)));
278 /* On some systems, this function is defined as an overloaded function:
279 extern "C++" { const char * std::strchrnul (const char *, int); }
280 extern "C++" { char * std::strchrnul (char *, int); } */
281 _GL_CXXALIAS_SYS_CAST2 (strchrnul,
282 char *, (char const *__s, int __c_in),
283 char const *, (char const *__s, int __c_in));
284 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
285 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
286 _GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
287 _GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
289 _GL_CXXALIASWARN (strchrnul);
291 #elif defined GNULIB_POSIXCHECK
293 # if HAVE_RAW_DECL_STRCHRNUL
294 _GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
295 "use gnulib module strchrnul for portability");
299 /* Duplicate S, returning an identical malloc'd string. */
301 # if @REPLACE_STRDUP@
302 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
304 # define strdup rpl_strdup
306 _GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
307 _GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
309 # if !(@HAVE_DECL_STRDUP@ || defined strdup)
310 _GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
312 _GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
314 _GL_CXXALIASWARN (strdup);
315 #elif defined GNULIB_POSIXCHECK
317 # if HAVE_RAW_DECL_STRDUP
318 _GL_WARN_ON_USE (strdup, "strdup is unportable - "
319 "use gnulib module strdup for portability");
323 /* Append no more than N characters from SRC onto DEST. */
325 # if @REPLACE_STRNCAT@
326 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
328 # define strncat rpl_strncat
330 _GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
331 _GL_ARG_NONNULL ((1, 2)));
332 _GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
334 _GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
336 _GL_CXXALIASWARN (strncat);
337 #elif defined GNULIB_POSIXCHECK
339 # if HAVE_RAW_DECL_STRNCAT
340 _GL_WARN_ON_USE (strncat, "strncat is unportable - "
341 "use gnulib module strncat for portability");
345 /* Return a newly allocated copy of at most N bytes of STRING. */
347 # if @REPLACE_STRNDUP@
348 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
350 # define strndup rpl_strndup
352 _GL_FUNCDECL_RPL (strndup, char *, (char const *__string, size_t __n)
353 _GL_ARG_NONNULL ((1)));
354 _GL_CXXALIAS_RPL (strndup, char *, (char const *__string, size_t __n));
356 # if ! @HAVE_DECL_STRNDUP@
357 _GL_FUNCDECL_SYS (strndup, char *, (char const *__string, size_t __n)
358 _GL_ARG_NONNULL ((1)));
360 _GL_CXXALIAS_SYS (strndup, char *, (char const *__string, size_t __n));
362 _GL_CXXALIASWARN (strndup);
363 #elif defined GNULIB_POSIXCHECK
365 # if HAVE_RAW_DECL_STRNDUP
366 _GL_WARN_ON_USE (strndup, "strndup is unportable - "
367 "use gnulib module strndup for portability");
371 /* Find the length (number of bytes) of STRING, but scan at most
372 MAXLEN bytes. If no '\0' terminator is found in that many bytes,
375 # if ! @HAVE_DECL_STRNLEN@
376 _GL_FUNCDECL_SYS (strnlen, size_t, (char const *__string, size_t __maxlen)
377 __attribute__ ((__pure__))
378 _GL_ARG_NONNULL ((1)));
380 _GL_CXXALIAS_SYS (strnlen, size_t, (char const *__string, size_t __maxlen));
381 _GL_CXXALIASWARN (strnlen);
382 #elif defined GNULIB_POSIXCHECK
384 # if HAVE_RAW_DECL_STRNLEN
385 _GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
386 "use gnulib module strnlen for portability");
390 #if defined GNULIB_POSIXCHECK
391 /* strcspn() assumes the second argument is a list of single-byte characters.
392 Even in this simple case, it does not work with multibyte strings if the
393 locale encoding is GB18030 and one of the characters to be searched is a
396 /* Assume strcspn is always declared. */
397 _GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
398 "in multibyte locales - "
399 "use mbscspn if you care about internationalization");
402 /* Find the first occurrence in S of any character in ACCEPT. */
404 # if ! @HAVE_STRPBRK@
405 _GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
406 __attribute__ ((__pure__))
407 _GL_ARG_NONNULL ((1, 2)));
409 /* On some systems, this function is defined as an overloaded function:
410 extern "C" { const char * strpbrk (const char *, const char *); }
411 extern "C++" { char * strpbrk (char *, const char *); } */
412 _GL_CXXALIAS_SYS_CAST2 (strpbrk,
413 char *, (char const *__s, char const *__accept),
414 const char *, (char const *__s, char const *__accept));
415 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
416 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
417 _GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
418 _GL_CXXALIASWARN1 (strpbrk, char const *,
419 (char const *__s, char const *__accept));
421 _GL_CXXALIASWARN (strpbrk);
423 # if defined GNULIB_POSIXCHECK
424 /* strpbrk() assumes the second argument is a list of single-byte characters.
425 Even in this simple case, it does not work with multibyte strings if the
426 locale encoding is GB18030 and one of the characters to be searched is a
429 _GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
430 "in multibyte locales - "
431 "use mbspbrk if you care about internationalization");
433 #elif defined GNULIB_POSIXCHECK
435 # if HAVE_RAW_DECL_STRPBRK
436 _GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
437 "use gnulib module strpbrk for portability");
441 #if defined GNULIB_POSIXCHECK
442 /* strspn() assumes the second argument is a list of single-byte characters.
443 Even in this simple case, it cannot work with multibyte strings. */
445 /* Assume strspn is always declared. */
446 _GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
447 "in multibyte locales - "
448 "use mbsspn if you care about internationalization");
451 #if defined GNULIB_POSIXCHECK
452 /* strrchr() does not work with multibyte strings if the locale encoding is
453 GB18030 and the character to be searched is a digit. */
455 /* Assume strrchr is always declared. */
456 _GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
457 "in some multibyte locales - "
458 "use mbsrchr if you care about internationalization");
461 /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
462 If one is found, overwrite it with a NUL, and advance *STRINGP
463 to point to the next char after it. Otherwise, set *STRINGP to NULL.
464 If *STRINGP was already NULL, nothing happens.
465 Return the old value of *STRINGP.
467 This is a variant of strtok() that is multithread-safe and supports
470 Caveat: It modifies the original string.
471 Caveat: These functions cannot be used on constant strings.
472 Caveat: The identity of the delimiting character is lost.
473 Caveat: It doesn't work with multibyte strings unless all of the delimiter
474 characters are ASCII characters < 0x30.
476 See also strtok_r(). */
479 _GL_FUNCDECL_SYS (strsep, char *,
480 (char **restrict __stringp, char const *restrict __delim)
481 _GL_ARG_NONNULL ((1, 2)));
483 _GL_CXXALIAS_SYS (strsep, char *,
484 (char **restrict __stringp, char const *restrict __delim));
485 _GL_CXXALIASWARN (strsep);
486 # if defined GNULIB_POSIXCHECK
488 _GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
489 "in multibyte locales - "
490 "use mbssep if you care about internationalization");
492 #elif defined GNULIB_POSIXCHECK
494 # if HAVE_RAW_DECL_STRSEP
495 _GL_WARN_ON_USE (strsep, "strsep is unportable - "
496 "use gnulib module strsep for portability");
501 # if @REPLACE_STRSTR@
502 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
503 # define strstr rpl_strstr
505 _GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
506 __attribute__ ((__pure__))
507 _GL_ARG_NONNULL ((1, 2)));
508 _GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
510 /* On some systems, this function is defined as an overloaded function:
511 extern "C++" { const char * strstr (const char *, const char *); }
512 extern "C++" { char * strstr (char *, const char *); } */
513 _GL_CXXALIAS_SYS_CAST2 (strstr,
514 char *, (const char *haystack, const char *needle),
515 const char *, (const char *haystack, const char *needle));
517 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
518 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
519 _GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
520 _GL_CXXALIASWARN1 (strstr, const char *,
521 (const char *haystack, const char *needle));
523 _GL_CXXALIASWARN (strstr);
525 #elif defined GNULIB_POSIXCHECK
526 /* strstr() does not work with multibyte strings if the locale encoding is
527 different from UTF-8:
528 POSIX says that it operates on "strings", and "string" in POSIX is defined
529 as a sequence of bytes, not of characters. */
531 /* Assume strstr is always declared. */
532 _GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
533 "work correctly on character strings in most "
534 "multibyte locales - "
535 "use mbsstr if you care about internationalization, "
536 "or use strstr if you care about speed");
539 /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
541 #if @GNULIB_STRCASESTR@
542 # if @REPLACE_STRCASESTR@
543 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
544 # define strcasestr rpl_strcasestr
546 _GL_FUNCDECL_RPL (strcasestr, char *,
547 (const char *haystack, const char *needle)
548 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2)));
549 _GL_CXXALIAS_RPL (strcasestr, char *,
550 (const char *haystack, const char *needle));
552 # if ! @HAVE_STRCASESTR@
553 _GL_FUNCDECL_SYS (strcasestr, char *,
554 (const char *haystack, const char *needle)
555 __attribute__ ((__pure__)) _GL_ARG_NONNULL ((1, 2)));
557 /* On some systems, this function is defined as an overloaded function:
558 extern "C++" { const char * strcasestr (const char *, const char *); }
559 extern "C++" { char * strcasestr (char *, const char *); } */
560 _GL_CXXALIAS_SYS_CAST2 (strcasestr,
561 char *, (const char *haystack, const char *needle),
562 const char *, (const char *haystack, const char *needle));
564 # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 10 \
565 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
566 _GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
567 _GL_CXXALIASWARN1 (strcasestr, const char *,
568 (const char *haystack, const char *needle));
570 _GL_CXXALIASWARN (strcasestr);
572 #elif defined GNULIB_POSIXCHECK
573 /* strcasestr() does not work with multibyte strings:
574 It is a glibc extension, and glibc implements it only for unibyte
577 # if HAVE_RAW_DECL_STRCASESTR
578 _GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
579 "strings in multibyte locales - "
580 "use mbscasestr if you care about "
581 "internationalization, or use c-strcasestr if you want "
582 "a locale independent function");
586 /* Parse S into tokens separated by characters in DELIM.
587 If S is NULL, the saved pointer in SAVE_PTR is used as
588 the next starting point. For example:
589 char s[] = "-abc-=-def";
591 x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
592 x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
593 x = strtok_r(NULL, "=", &sp); // x = NULL
596 This is a variant of strtok() that is multithread-safe.
598 For the POSIX documentation for this function, see:
599 http://www.opengroup.org/susv3xsh/strtok.html
601 Caveat: It modifies the original string.
602 Caveat: These functions cannot be used on constant strings.
603 Caveat: The identity of the delimiting character is lost.
604 Caveat: It doesn't work with multibyte strings unless all of the delimiter
605 characters are ASCII characters < 0x30.
607 See also strsep(). */
608 #if @GNULIB_STRTOK_R@
609 # if @REPLACE_STRTOK_R@
610 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
612 # define strtok_r rpl_strtok_r
614 _GL_FUNCDECL_RPL (strtok_r, char *,
615 (char *restrict s, char const *restrict delim,
616 char **restrict save_ptr)
617 _GL_ARG_NONNULL ((2, 3)));
618 _GL_CXXALIAS_RPL (strtok_r, char *,
619 (char *restrict s, char const *restrict delim,
620 char **restrict save_ptr));
622 # if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
625 # if ! @HAVE_DECL_STRTOK_R@
626 _GL_FUNCDECL_SYS (strtok_r, char *,
627 (char *restrict s, char const *restrict delim,
628 char **restrict save_ptr)
629 _GL_ARG_NONNULL ((2, 3)));
631 _GL_CXXALIAS_SYS (strtok_r, char *,
632 (char *restrict s, char const *restrict delim,
633 char **restrict save_ptr));
635 _GL_CXXALIASWARN (strtok_r);
636 # if defined GNULIB_POSIXCHECK
637 _GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
638 "strings in multibyte locales - "
639 "use mbstok_r if you care about internationalization");
641 #elif defined GNULIB_POSIXCHECK
643 # if HAVE_RAW_DECL_STRTOK_R
644 _GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
645 "use gnulib module strtok_r for portability");
650 /* The following functions are not specified by POSIX. They are gnulib
654 /* Return the number of multibyte characters in the character string STRING.
655 This considers multibyte characters, unlike strlen, which counts bytes. */
656 # ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
659 # if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
660 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
661 # define mbslen rpl_mbslen
663 _GL_FUNCDECL_RPL (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1)));
664 _GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
666 _GL_FUNCDECL_SYS (mbslen, size_t, (const char *string) _GL_ARG_NONNULL ((1)));
667 _GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
669 _GL_CXXALIASWARN (mbslen);
673 /* Return the number of multibyte characters in the character string starting
674 at STRING and ending at STRING + LEN. */
675 _GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
676 _GL_ARG_NONNULL ((1));
680 /* Locate the first single-byte character C in the character string STRING,
681 and return a pointer to it. Return NULL if C is not found in STRING.
682 Unlike strchr(), this function works correctly in multibyte locales with
683 encodings such as GB18030. */
685 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
686 # define mbschr rpl_mbschr /* avoid collision with HP-UX function */
688 _GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
689 _GL_ARG_NONNULL ((1)));
690 _GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
692 _GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
693 _GL_ARG_NONNULL ((1)));
694 _GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
696 _GL_CXXALIASWARN (mbschr);
700 /* Locate the last single-byte character C in the character string STRING,
701 and return a pointer to it. Return NULL if C is not found in STRING.
702 Unlike strrchr(), this function works correctly in multibyte locales with
703 encodings such as GB18030. */
705 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
706 # define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */
708 _GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
709 _GL_ARG_NONNULL ((1)));
710 _GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
712 _GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
713 _GL_ARG_NONNULL ((1)));
714 _GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
716 _GL_CXXALIASWARN (mbsrchr);
720 /* Find the first occurrence of the character string NEEDLE in the character
721 string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
722 Unlike strstr(), this function works correctly in multibyte locales with
723 encodings different from UTF-8. */
724 _GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
725 _GL_ARG_NONNULL ((1, 2));
728 #if @GNULIB_MBSCASECMP@
729 /* Compare the character strings S1 and S2, ignoring case, returning less than,
730 equal to or greater than zero if S1 is lexicographically less than, equal to
732 Note: This function may, in multibyte locales, return 0 for strings of
734 Unlike strcasecmp(), this function works correctly in multibyte locales. */
735 _GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
736 _GL_ARG_NONNULL ((1, 2));
739 #if @GNULIB_MBSNCASECMP@
740 /* Compare the initial segment of the character string S1 consisting of at most
741 N characters with the initial segment of the character string S2 consisting
742 of at most N characters, ignoring case, returning less than, equal to or
743 greater than zero if the initial segment of S1 is lexicographically less
744 than, equal to or greater than the initial segment of S2.
745 Note: This function may, in multibyte locales, return 0 for initial segments
746 of different lengths!
747 Unlike strncasecmp(), this function works correctly in multibyte locales.
748 But beware that N is not a byte count but a character count! */
749 _GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
750 _GL_ARG_NONNULL ((1, 2));
753 #if @GNULIB_MBSPCASECMP@
754 /* Compare the initial segment of the character string STRING consisting of
755 at most mbslen (PREFIX) characters with the character string PREFIX,
756 ignoring case, returning less than, equal to or greater than zero if this
757 initial segment is lexicographically less than, equal to or greater than
759 Note: This function may, in multibyte locales, return 0 if STRING is of
760 smaller length than PREFIX!
761 Unlike strncasecmp(), this function works correctly in multibyte
763 _GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
764 _GL_ARG_NONNULL ((1, 2));
767 #if @GNULIB_MBSCASESTR@
768 /* Find the first occurrence of the character string NEEDLE in the character
769 string HAYSTACK, using case-insensitive comparison.
770 Note: This function may, in multibyte locales, return success even if
771 strlen (haystack) < strlen (needle) !
772 Unlike strcasestr(), this function works correctly in multibyte locales. */
773 _GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
774 _GL_ARG_NONNULL ((1, 2));
778 /* Find the first occurrence in the character string STRING of any character
779 in the character string ACCEPT. Return the number of bytes from the
780 beginning of the string to this occurrence, or to the end of the string
782 Unlike strcspn(), this function works correctly in multibyte locales. */
783 _GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
784 _GL_ARG_NONNULL ((1, 2));
788 /* Find the first occurrence in the character string STRING of any character
789 in the character string ACCEPT. Return the pointer to it, or NULL if none
791 Unlike strpbrk(), this function works correctly in multibyte locales. */
793 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
794 # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
796 _GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
797 _GL_ARG_NONNULL ((1, 2)));
798 _GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
800 _GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
801 _GL_ARG_NONNULL ((1, 2)));
802 _GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
804 _GL_CXXALIASWARN (mbspbrk);
808 /* Find the first occurrence in the character string STRING of any character
809 not in the character string REJECT. Return the number of bytes from the
810 beginning of the string to this occurrence, or to the end of the string
812 Unlike strspn(), this function works correctly in multibyte locales. */
813 _GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
814 _GL_ARG_NONNULL ((1, 2));
818 /* Search the next delimiter (multibyte character listed in the character
819 string DELIM) starting at the character string *STRINGP.
820 If one is found, overwrite it with a NUL, and advance *STRINGP to point
821 to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
822 If *STRINGP was already NULL, nothing happens.
823 Return the old value of *STRINGP.
825 This is a variant of mbstok_r() that supports empty fields.
827 Caveat: It modifies the original string.
828 Caveat: These functions cannot be used on constant strings.
829 Caveat: The identity of the delimiting character is lost.
831 See also mbstok_r(). */
832 _GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
833 _GL_ARG_NONNULL ((1, 2));
836 #if @GNULIB_MBSTOK_R@
837 /* Parse the character string STRING into tokens separated by characters in
838 the character string DELIM.
839 If STRING is NULL, the saved pointer in SAVE_PTR is used as
840 the next starting point. For example:
841 char s[] = "-abc-=-def";
843 x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
844 x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
845 x = mbstok_r(NULL, "=", &sp); // x = NULL
848 Caveat: It modifies the original string.
849 Caveat: These functions cannot be used on constant strings.
850 Caveat: The identity of the delimiting character is lost.
852 See also mbssep(). */
853 _GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
854 _GL_ARG_NONNULL ((2, 3));
857 /* Map any int, typically from errno, into an error message. */
858 #if @GNULIB_STRERROR@
859 # if @REPLACE_STRERROR@
860 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
862 # define strerror rpl_strerror
864 _GL_FUNCDECL_RPL (strerror, char *, (int));
865 _GL_CXXALIAS_RPL (strerror, char *, (int));
867 _GL_CXXALIAS_SYS (strerror, char *, (int));
869 _GL_CXXALIASWARN (strerror);
870 #elif defined GNULIB_POSIXCHECK
872 /* Assume strerror is always declared. */
873 _GL_WARN_ON_USE (strerror, "strerror is unportable - "
874 "use gnulib module strerror to guarantee non-NULL result");
877 #if @GNULIB_STRSIGNAL@
878 # if @REPLACE_STRSIGNAL@
879 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
880 # define strsignal rpl_strsignal
882 _GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
883 _GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
885 # if ! @HAVE_DECL_STRSIGNAL@
886 _GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
888 /* Need to cast, because on Cygwin 1.5.x systems, the return type is
890 _GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
892 _GL_CXXALIASWARN (strsignal);
893 #elif defined GNULIB_POSIXCHECK
895 # if HAVE_RAW_DECL_STRSIGNAL
896 _GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
897 "use gnulib module strsignal for portability");
901 #if @GNULIB_STRVERSCMP@
902 # if !@HAVE_STRVERSCMP@
903 _GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
904 _GL_ARG_NONNULL ((1, 2)));
906 _GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
907 _GL_CXXALIASWARN (strverscmp);
908 #elif defined GNULIB_POSIXCHECK
910 # if HAVE_RAW_DECL_STRVERSCMP
911 _GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
912 "use gnulib module strverscmp for portability");
917 #endif /* _GL_STRING_H */
918 #endif /* _GL_STRING_H */