Update Gnulib to the latest git version
[deliverable/binutils-gdb.git] / gnulib / import / string.in.h
CommitLineData
f6ea5628
DJ
1/* A GNU-like <string.h>.
2
c0c3707f 3 Copyright (C) 1995-1996, 2001-2019 Free Software Foundation, Inc.
f6ea5628
DJ
4
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
4c38e0a4 7 the Free Software Foundation; either version 3, or (at your option)
f6ea5628
DJ
8 any later version.
9
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.
14
15 You should have received a copy of the GNU General Public License
c0c3707f 16 along with this program; if not, see <https://www.gnu.org/licenses/>. */
f6ea5628 17
f434ba03
PA
18#if __GNUC__ >= 3
19@PRAGMA_SYSTEM_HEADER@
20#endif
770d76d7 21@PRAGMA_COLUMNS@
f434ba03 22
4a626d0a
PA
23#if defined _GL_ALREADY_INCLUDING_STRING_H
24/* Special invocation convention:
25 - On OS X/NetBSD we have a sequence of nested includes
26 <string.h> -> <strings.h> -> "string.h"
27 In this situation system _chk variants due to -D_FORTIFY_SOURCE
28 might be used after any replacements defined here. */
29
30#@INCLUDE_NEXT@ @NEXT_STRING_H@
31
32#else
33/* Normal invocation convention. */
34
35#ifndef _@GUARD_PREFIX@_STRING_H
36
37#define _GL_ALREADY_INCLUDING_STRING_H
38
f6ea5628
DJ
39/* The include_next requires a split double-inclusion guard. */
40#@INCLUDE_NEXT@ @NEXT_STRING_H@
41
4a626d0a
PA
42#undef _GL_ALREADY_INCLUDING_STRING_H
43
770d76d7
PA
44#ifndef _@GUARD_PREFIX@_STRING_H
45#define _@GUARD_PREFIX@_STRING_H
f6ea5628 46
f434ba03
PA
47/* NetBSD 5.0 mis-defines NULL. */
48#include <stddef.h>
49
50/* MirBSD defines mbslen as a macro. */
51#if @GNULIB_MBSLEN@ && defined __MirBSD__
52# include <wchar.h>
53#endif
f6ea5628 54
770d76d7
PA
55/* The __attribute__ feature is available in gcc versions 2.5 and later.
56 The attribute __pure__ was added in gcc 2.96. */
57#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
58# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
59#else
60# define _GL_ATTRIBUTE_PURE /* empty */
f6ea5628
DJ
61#endif
62
770d76d7
PA
63/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>. */
64/* But in any case avoid namespace pollution on glibc systems. */
65#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
66 && ! defined __GLIBC__
67# include <unistd.h>
68#endif
f6ea5628 69
f434ba03
PA
70/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
71
72/* The definition of _GL_ARG_NONNULL is copied here. */
73
74/* The definition of _GL_WARN_ON_USE is copied here. */
75
76
c0c3707f
CB
77/* Clear a block of memory. The compiler will not delete a call to
78 this function, even if the block is dead after the call. */
79#if @GNULIB_EXPLICIT_BZERO@
80# if ! @HAVE_EXPLICIT_BZERO@
81_GL_FUNCDECL_SYS (explicit_bzero, void,
82 (void *__dest, size_t __n) _GL_ARG_NONNULL ((1)));
83# endif
84_GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n));
85_GL_CXXALIASWARN (explicit_bzero);
86#elif defined GNULIB_POSIXCHECK
87# undef explicit_bzero
88# if HAVE_RAW_DECL_EXPLICIT_BZERO
89_GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - "
90 "use gnulib module explicit_bzero for portability");
91# endif
92#endif
93
770d76d7
PA
94/* Find the index of the least-significant set bit. */
95#if @GNULIB_FFSL@
96# if !@HAVE_FFSL@
97_GL_FUNCDECL_SYS (ffsl, int, (long int i));
98# endif
99_GL_CXXALIAS_SYS (ffsl, int, (long int i));
100_GL_CXXALIASWARN (ffsl);
101#elif defined GNULIB_POSIXCHECK
102# undef ffsl
103# if HAVE_RAW_DECL_FFSL
104_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
105# endif
106#endif
107
108
109/* Find the index of the least-significant set bit. */
110#if @GNULIB_FFSLL@
111# if !@HAVE_FFSLL@
112_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
113# endif
114_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
115_GL_CXXALIASWARN (ffsll);
116#elif defined GNULIB_POSIXCHECK
117# undef ffsll
118# if HAVE_RAW_DECL_FFSLL
119_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
120# endif
121#endif
122
123
f434ba03
PA
124/* Return the first instance of C within N bytes of S, or NULL. */
125#if @GNULIB_MEMCHR@
126# if @REPLACE_MEMCHR@
127# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
128# define memchr rpl_memchr
129# endif
130_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
770d76d7 131 _GL_ATTRIBUTE_PURE
f434ba03
PA
132 _GL_ARG_NONNULL ((1)));
133_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
134# else
135# if ! @HAVE_MEMCHR@
136_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
770d76d7 137 _GL_ATTRIBUTE_PURE
f434ba03
PA
138 _GL_ARG_NONNULL ((1)));
139# endif
140 /* On some systems, this function is defined as an overloaded function:
141 extern "C" { const void * std::memchr (const void *, int, size_t); }
142 extern "C++" { void * std::memchr (void *, int, size_t); } */
143_GL_CXXALIAS_SYS_CAST2 (memchr,
144 void *, (void const *__s, int __c, size_t __n),
145 void const *, (void const *__s, int __c, size_t __n));
146# endif
770d76d7 147# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
148 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
149_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
150_GL_CXXALIASWARN1 (memchr, void const *,
151 (void const *__s, int __c, size_t __n));
c0c3707f 152# elif __GLIBC__ >= 2
f434ba03
PA
153_GL_CXXALIASWARN (memchr);
154# endif
155#elif defined GNULIB_POSIXCHECK
156# undef memchr
157/* Assume memchr is always declared. */
158_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
159 "use gnulib module memchr for portability" );
f6ea5628
DJ
160#endif
161
f6ea5628
DJ
162/* Return the first occurrence of NEEDLE in HAYSTACK. */
163#if @GNULIB_MEMMEM@
164# if @REPLACE_MEMMEM@
f434ba03
PA
165# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
166# define memmem rpl_memmem
167# endif
168_GL_FUNCDECL_RPL (memmem, void *,
169 (void const *__haystack, size_t __haystack_len,
170 void const *__needle, size_t __needle_len)
770d76d7
PA
171 _GL_ATTRIBUTE_PURE
172 _GL_ARG_NONNULL ((1, 3)));
f434ba03
PA
173_GL_CXXALIAS_RPL (memmem, void *,
174 (void const *__haystack, size_t __haystack_len,
175 void const *__needle, size_t __needle_len));
176# else
177# if ! @HAVE_DECL_MEMMEM@
178_GL_FUNCDECL_SYS (memmem, void *,
179 (void const *__haystack, size_t __haystack_len,
180 void const *__needle, size_t __needle_len)
770d76d7
PA
181 _GL_ATTRIBUTE_PURE
182 _GL_ARG_NONNULL ((1, 3)));
f434ba03
PA
183# endif
184_GL_CXXALIAS_SYS (memmem, void *,
185 (void const *__haystack, size_t __haystack_len,
186 void const *__needle, size_t __needle_len));
f6ea5628 187# endif
f434ba03 188_GL_CXXALIASWARN (memmem);
f6ea5628
DJ
189#elif defined GNULIB_POSIXCHECK
190# undef memmem
f434ba03
PA
191# if HAVE_RAW_DECL_MEMMEM
192_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
193 "use gnulib module memmem-simple for portability, "
194 "and module memmem for speed" );
195# endif
f6ea5628
DJ
196#endif
197
198/* Copy N bytes of SRC to DEST, return pointer to bytes after the
199 last written byte. */
200#if @GNULIB_MEMPCPY@
201# if ! @HAVE_MEMPCPY@
f434ba03
PA
202_GL_FUNCDECL_SYS (mempcpy, void *,
203 (void *restrict __dest, void const *restrict __src,
204 size_t __n)
205 _GL_ARG_NONNULL ((1, 2)));
f6ea5628 206# endif
f434ba03
PA
207_GL_CXXALIAS_SYS (mempcpy, void *,
208 (void *restrict __dest, void const *restrict __src,
209 size_t __n));
210_GL_CXXALIASWARN (mempcpy);
f6ea5628
DJ
211#elif defined GNULIB_POSIXCHECK
212# undef mempcpy
f434ba03
PA
213# if HAVE_RAW_DECL_MEMPCPY
214_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
215 "use gnulib module mempcpy for portability");
216# endif
f6ea5628
DJ
217#endif
218
219/* Search backwards through a block for a byte (specified as an int). */
220#if @GNULIB_MEMRCHR@
221# if ! @HAVE_DECL_MEMRCHR@
f434ba03 222_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
770d76d7 223 _GL_ATTRIBUTE_PURE
f434ba03
PA
224 _GL_ARG_NONNULL ((1)));
225# endif
226 /* On some systems, this function is defined as an overloaded function:
227 extern "C++" { const void * std::memrchr (const void *, int, size_t); }
228 extern "C++" { void * std::memrchr (void *, int, size_t); } */
229_GL_CXXALIAS_SYS_CAST2 (memrchr,
230 void *, (void const *, int, size_t),
231 void const *, (void const *, int, size_t));
770d76d7 232# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
233 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
234_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
235_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
236# else
237_GL_CXXALIASWARN (memrchr);
f6ea5628
DJ
238# endif
239#elif defined GNULIB_POSIXCHECK
240# undef memrchr
f434ba03
PA
241# if HAVE_RAW_DECL_MEMRCHR
242_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
243 "use gnulib module memrchr for portability");
244# endif
245#endif
246
247/* Find the first occurrence of C in S. More efficient than
248 memchr(S,C,N), at the expense of undefined behavior if C does not
249 occur within N bytes. */
250#if @GNULIB_RAWMEMCHR@
251# if ! @HAVE_RAWMEMCHR@
252_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
770d76d7 253 _GL_ATTRIBUTE_PURE
f434ba03
PA
254 _GL_ARG_NONNULL ((1)));
255# endif
256 /* On some systems, this function is defined as an overloaded function:
257 extern "C++" { const void * std::rawmemchr (const void *, int); }
258 extern "C++" { void * std::rawmemchr (void *, int); } */
259_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
260 void *, (void const *__s, int __c_in),
261 void const *, (void const *__s, int __c_in));
770d76d7 262# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
263 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
264_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
265_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
266# else
267_GL_CXXALIASWARN (rawmemchr);
268# endif
269#elif defined GNULIB_POSIXCHECK
270# undef rawmemchr
271# if HAVE_RAW_DECL_RAWMEMCHR
272_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
273 "use gnulib module rawmemchr for portability");
274# endif
f6ea5628
DJ
275#endif
276
277/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
278#if @GNULIB_STPCPY@
279# if ! @HAVE_STPCPY@
f434ba03
PA
280_GL_FUNCDECL_SYS (stpcpy, char *,
281 (char *restrict __dst, char const *restrict __src)
282 _GL_ARG_NONNULL ((1, 2)));
f6ea5628 283# endif
f434ba03
PA
284_GL_CXXALIAS_SYS (stpcpy, char *,
285 (char *restrict __dst, char const *restrict __src));
286_GL_CXXALIASWARN (stpcpy);
f6ea5628
DJ
287#elif defined GNULIB_POSIXCHECK
288# undef stpcpy
f434ba03
PA
289# if HAVE_RAW_DECL_STPCPY
290_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
291 "use gnulib module stpcpy for portability");
292# endif
f6ea5628
DJ
293#endif
294
295/* Copy no more than N bytes of SRC to DST, returning a pointer past the
296 last non-NUL byte written into DST. */
297#if @GNULIB_STPNCPY@
f434ba03
PA
298# if @REPLACE_STPNCPY@
299# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
770d76d7 300# undef stpncpy
f434ba03
PA
301# define stpncpy rpl_stpncpy
302# endif
303_GL_FUNCDECL_RPL (stpncpy, char *,
304 (char *restrict __dst, char const *restrict __src,
305 size_t __n)
306 _GL_ARG_NONNULL ((1, 2)));
307_GL_CXXALIAS_RPL (stpncpy, char *,
308 (char *restrict __dst, char const *restrict __src,
309 size_t __n));
310# else
311# if ! @HAVE_STPNCPY@
312_GL_FUNCDECL_SYS (stpncpy, char *,
313 (char *restrict __dst, char const *restrict __src,
314 size_t __n)
315 _GL_ARG_NONNULL ((1, 2)));
316# endif
317_GL_CXXALIAS_SYS (stpncpy, char *,
318 (char *restrict __dst, char const *restrict __src,
319 size_t __n));
f6ea5628 320# endif
f434ba03 321_GL_CXXALIASWARN (stpncpy);
f6ea5628
DJ
322#elif defined GNULIB_POSIXCHECK
323# undef stpncpy
f434ba03
PA
324# if HAVE_RAW_DECL_STPNCPY
325_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
326 "use gnulib module stpncpy for portability");
327# endif
f6ea5628
DJ
328#endif
329
330#if defined GNULIB_POSIXCHECK
331/* strchr() does not work with multibyte strings if the locale encoding is
332 GB18030 and the character to be searched is a digit. */
333# undef strchr
f434ba03
PA
334/* Assume strchr is always declared. */
335_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
336 "in some multibyte locales - "
337 "use mbschr if you care about internationalization");
f6ea5628
DJ
338#endif
339
340/* Find the first occurrence of C in S or the final NUL byte. */
341#if @GNULIB_STRCHRNUL@
770d76d7
PA
342# if @REPLACE_STRCHRNUL@
343# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
344# define strchrnul rpl_strchrnul
345# endif
346_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
347 _GL_ATTRIBUTE_PURE
348 _GL_ARG_NONNULL ((1)));
349_GL_CXXALIAS_RPL (strchrnul, char *,
350 (const char *str, int ch));
351# else
352# if ! @HAVE_STRCHRNUL@
f434ba03 353_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
770d76d7 354 _GL_ATTRIBUTE_PURE
f434ba03 355 _GL_ARG_NONNULL ((1)));
770d76d7 356# endif
f434ba03
PA
357 /* On some systems, this function is defined as an overloaded function:
358 extern "C++" { const char * std::strchrnul (const char *, int); }
359 extern "C++" { char * std::strchrnul (char *, int); } */
360_GL_CXXALIAS_SYS_CAST2 (strchrnul,
361 char *, (char const *__s, int __c_in),
362 char const *, (char const *__s, int __c_in));
770d76d7
PA
363# endif
364# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
365 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
366_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
367_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
368# else
369_GL_CXXALIASWARN (strchrnul);
f6ea5628
DJ
370# endif
371#elif defined GNULIB_POSIXCHECK
372# undef strchrnul
f434ba03
PA
373# if HAVE_RAW_DECL_STRCHRNUL
374_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
375 "use gnulib module strchrnul for portability");
376# endif
f6ea5628
DJ
377#endif
378
379/* Duplicate S, returning an identical malloc'd string. */
380#if @GNULIB_STRDUP@
f434ba03
PA
381# if @REPLACE_STRDUP@
382# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
383# undef strdup
384# define strdup rpl_strdup
385# endif
386_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
387_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
388# else
770d76d7
PA
389# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
390 /* strdup exists as a function and as a macro. Get rid of the macro. */
391# undef strdup
392# endif
f434ba03
PA
393# if !(@HAVE_DECL_STRDUP@ || defined strdup)
394_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
395# endif
396_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
f6ea5628 397# endif
f434ba03 398_GL_CXXALIASWARN (strdup);
f6ea5628
DJ
399#elif defined GNULIB_POSIXCHECK
400# undef strdup
f434ba03
PA
401# if HAVE_RAW_DECL_STRDUP
402_GL_WARN_ON_USE (strdup, "strdup is unportable - "
403 "use gnulib module strdup for portability");
404# endif
405#endif
406
407/* Append no more than N characters from SRC onto DEST. */
408#if @GNULIB_STRNCAT@
409# if @REPLACE_STRNCAT@
410# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
411# undef strncat
412# define strncat rpl_strncat
413# endif
414_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
415 _GL_ARG_NONNULL ((1, 2)));
416_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
417# else
418_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
419# endif
c0c3707f 420# if __GLIBC__ >= 2
f434ba03 421_GL_CXXALIASWARN (strncat);
c0c3707f 422# endif
f434ba03
PA
423#elif defined GNULIB_POSIXCHECK
424# undef strncat
425# if HAVE_RAW_DECL_STRNCAT
426_GL_WARN_ON_USE (strncat, "strncat is unportable - "
427 "use gnulib module strncat for portability");
428# endif
f6ea5628
DJ
429#endif
430
431/* Return a newly allocated copy of at most N bytes of STRING. */
432#if @GNULIB_STRNDUP@
f434ba03
PA
433# if @REPLACE_STRNDUP@
434# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
435# undef strndup
436# define strndup rpl_strndup
437# endif
49e4877c 438_GL_FUNCDECL_RPL (strndup, char *, (char const *__s, size_t __n)
f434ba03 439 _GL_ARG_NONNULL ((1)));
49e4877c 440_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
f434ba03
PA
441# else
442# if ! @HAVE_DECL_STRNDUP@
49e4877c 443_GL_FUNCDECL_SYS (strndup, char *, (char const *__s, size_t __n)
f434ba03
PA
444 _GL_ARG_NONNULL ((1)));
445# endif
49e4877c 446_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
f6ea5628 447# endif
f434ba03 448_GL_CXXALIASWARN (strndup);
f6ea5628
DJ
449#elif defined GNULIB_POSIXCHECK
450# undef strndup
f434ba03
PA
451# if HAVE_RAW_DECL_STRNDUP
452_GL_WARN_ON_USE (strndup, "strndup is unportable - "
453 "use gnulib module strndup for portability");
454# endif
f6ea5628
DJ
455#endif
456
457/* Find the length (number of bytes) of STRING, but scan at most
458 MAXLEN bytes. If no '\0' terminator is found in that many bytes,
459 return MAXLEN. */
460#if @GNULIB_STRNLEN@
f434ba03
PA
461# if @REPLACE_STRNLEN@
462# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
463# undef strnlen
464# define strnlen rpl_strnlen
465# endif
49e4877c 466_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
770d76d7 467 _GL_ATTRIBUTE_PURE
f434ba03 468 _GL_ARG_NONNULL ((1)));
49e4877c 469_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
f434ba03
PA
470# else
471# if ! @HAVE_DECL_STRNLEN@
49e4877c 472_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
770d76d7 473 _GL_ATTRIBUTE_PURE
f434ba03
PA
474 _GL_ARG_NONNULL ((1)));
475# endif
49e4877c 476_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
f6ea5628 477# endif
f434ba03 478_GL_CXXALIASWARN (strnlen);
f6ea5628
DJ
479#elif defined GNULIB_POSIXCHECK
480# undef strnlen
f434ba03
PA
481# if HAVE_RAW_DECL_STRNLEN
482_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
483 "use gnulib module strnlen for portability");
484# endif
f6ea5628
DJ
485#endif
486
487#if defined GNULIB_POSIXCHECK
488/* strcspn() assumes the second argument is a list of single-byte characters.
489 Even in this simple case, it does not work with multibyte strings if the
490 locale encoding is GB18030 and one of the characters to be searched is a
491 digit. */
492# undef strcspn
f434ba03
PA
493/* Assume strcspn is always declared. */
494_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
495 "in multibyte locales - "
496 "use mbscspn if you care about internationalization");
f6ea5628
DJ
497#endif
498
499/* Find the first occurrence in S of any character in ACCEPT. */
500#if @GNULIB_STRPBRK@
501# if ! @HAVE_STRPBRK@
f434ba03 502_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
770d76d7 503 _GL_ATTRIBUTE_PURE
f434ba03
PA
504 _GL_ARG_NONNULL ((1, 2)));
505# endif
506 /* On some systems, this function is defined as an overloaded function:
507 extern "C" { const char * strpbrk (const char *, const char *); }
508 extern "C++" { char * strpbrk (char *, const char *); } */
509_GL_CXXALIAS_SYS_CAST2 (strpbrk,
510 char *, (char const *__s, char const *__accept),
511 const char *, (char const *__s, char const *__accept));
770d76d7 512# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
513 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
514_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
515_GL_CXXALIASWARN1 (strpbrk, char const *,
516 (char const *__s, char const *__accept));
c0c3707f 517# elif __GLIBC__ >= 2
f434ba03 518_GL_CXXALIASWARN (strpbrk);
f6ea5628
DJ
519# endif
520# if defined GNULIB_POSIXCHECK
521/* strpbrk() assumes the second argument is a list of single-byte characters.
522 Even in this simple case, it does not work with multibyte strings if the
523 locale encoding is GB18030 and one of the characters to be searched is a
524 digit. */
525# undef strpbrk
f434ba03
PA
526_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
527 "in multibyte locales - "
528 "use mbspbrk if you care about internationalization");
f6ea5628
DJ
529# endif
530#elif defined GNULIB_POSIXCHECK
531# undef strpbrk
f434ba03
PA
532# if HAVE_RAW_DECL_STRPBRK
533_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
534 "use gnulib module strpbrk for portability");
535# endif
f6ea5628
DJ
536#endif
537
538#if defined GNULIB_POSIXCHECK
539/* strspn() assumes the second argument is a list of single-byte characters.
540 Even in this simple case, it cannot work with multibyte strings. */
541# undef strspn
f434ba03
PA
542/* Assume strspn is always declared. */
543_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
544 "in multibyte locales - "
545 "use mbsspn if you care about internationalization");
f6ea5628
DJ
546#endif
547
548#if defined GNULIB_POSIXCHECK
549/* strrchr() does not work with multibyte strings if the locale encoding is
550 GB18030 and the character to be searched is a digit. */
551# undef strrchr
f434ba03
PA
552/* Assume strrchr is always declared. */
553_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
554 "in some multibyte locales - "
555 "use mbsrchr if you care about internationalization");
f6ea5628
DJ
556#endif
557
558/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
559 If one is found, overwrite it with a NUL, and advance *STRINGP
560 to point to the next char after it. Otherwise, set *STRINGP to NULL.
561 If *STRINGP was already NULL, nothing happens.
562 Return the old value of *STRINGP.
563
564 This is a variant of strtok() that is multithread-safe and supports
565 empty fields.
566
567 Caveat: It modifies the original string.
568 Caveat: These functions cannot be used on constant strings.
569 Caveat: The identity of the delimiting character is lost.
570 Caveat: It doesn't work with multibyte strings unless all of the delimiter
571 characters are ASCII characters < 0x30.
572
573 See also strtok_r(). */
574#if @GNULIB_STRSEP@
575# if ! @HAVE_STRSEP@
f434ba03
PA
576_GL_FUNCDECL_SYS (strsep, char *,
577 (char **restrict __stringp, char const *restrict __delim)
578 _GL_ARG_NONNULL ((1, 2)));
f6ea5628 579# endif
f434ba03
PA
580_GL_CXXALIAS_SYS (strsep, char *,
581 (char **restrict __stringp, char const *restrict __delim));
582_GL_CXXALIASWARN (strsep);
f6ea5628
DJ
583# if defined GNULIB_POSIXCHECK
584# undef strsep
f434ba03
PA
585_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
586 "in multibyte locales - "
587 "use mbssep if you care about internationalization");
f6ea5628
DJ
588# endif
589#elif defined GNULIB_POSIXCHECK
590# undef strsep
f434ba03
PA
591# if HAVE_RAW_DECL_STRSEP
592_GL_WARN_ON_USE (strsep, "strsep is unportable - "
593 "use gnulib module strsep for portability");
594# endif
f6ea5628
DJ
595#endif
596
597#if @GNULIB_STRSTR@
598# if @REPLACE_STRSTR@
f434ba03
PA
599# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
600# define strstr rpl_strstr
601# endif
602_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
770d76d7 603 _GL_ATTRIBUTE_PURE
f434ba03
PA
604 _GL_ARG_NONNULL ((1, 2)));
605_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
606# else
607 /* On some systems, this function is defined as an overloaded function:
608 extern "C++" { const char * strstr (const char *, const char *); }
609 extern "C++" { char * strstr (char *, const char *); } */
610_GL_CXXALIAS_SYS_CAST2 (strstr,
611 char *, (const char *haystack, const char *needle),
612 const char *, (const char *haystack, const char *needle));
613# endif
770d76d7 614# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
615 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
616_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
617_GL_CXXALIASWARN1 (strstr, const char *,
618 (const char *haystack, const char *needle));
c0c3707f 619# elif __GLIBC__ >= 2
f434ba03 620_GL_CXXALIASWARN (strstr);
f6ea5628
DJ
621# endif
622#elif defined GNULIB_POSIXCHECK
623/* strstr() does not work with multibyte strings if the locale encoding is
624 different from UTF-8:
625 POSIX says that it operates on "strings", and "string" in POSIX is defined
626 as a sequence of bytes, not of characters. */
627# undef strstr
f434ba03
PA
628/* Assume strstr is always declared. */
629_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
630 "work correctly on character strings in most "
631 "multibyte locales - "
632 "use mbsstr if you care about internationalization, "
633 "or use strstr if you care about speed");
f6ea5628
DJ
634#endif
635
636/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
637 comparison. */
638#if @GNULIB_STRCASESTR@
639# if @REPLACE_STRCASESTR@
f434ba03
PA
640# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
641# define strcasestr rpl_strcasestr
642# endif
643_GL_FUNCDECL_RPL (strcasestr, char *,
644 (const char *haystack, const char *needle)
770d76d7
PA
645 _GL_ATTRIBUTE_PURE
646 _GL_ARG_NONNULL ((1, 2)));
f434ba03
PA
647_GL_CXXALIAS_RPL (strcasestr, char *,
648 (const char *haystack, const char *needle));
649# else
650# if ! @HAVE_STRCASESTR@
651_GL_FUNCDECL_SYS (strcasestr, char *,
652 (const char *haystack, const char *needle)
770d76d7
PA
653 _GL_ATTRIBUTE_PURE
654 _GL_ARG_NONNULL ((1, 2)));
f434ba03
PA
655# endif
656 /* On some systems, this function is defined as an overloaded function:
657 extern "C++" { const char * strcasestr (const char *, const char *); }
658 extern "C++" { char * strcasestr (char *, const char *); } */
659_GL_CXXALIAS_SYS_CAST2 (strcasestr,
660 char *, (const char *haystack, const char *needle),
661 const char *, (const char *haystack, const char *needle));
f6ea5628 662# endif
770d76d7 663# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
f434ba03
PA
664 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
665_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
666_GL_CXXALIASWARN1 (strcasestr, const char *,
667 (const char *haystack, const char *needle));
668# else
669_GL_CXXALIASWARN (strcasestr);
f6ea5628
DJ
670# endif
671#elif defined GNULIB_POSIXCHECK
672/* strcasestr() does not work with multibyte strings:
673 It is a glibc extension, and glibc implements it only for unibyte
674 locales. */
675# undef strcasestr
f434ba03
PA
676# if HAVE_RAW_DECL_STRCASESTR
677_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
678 "strings in multibyte locales - "
679 "use mbscasestr if you care about "
680 "internationalization, or use c-strcasestr if you want "
681 "a locale independent function");
682# endif
f6ea5628
DJ
683#endif
684
685/* Parse S into tokens separated by characters in DELIM.
686 If S is NULL, the saved pointer in SAVE_PTR is used as
687 the next starting point. For example:
f434ba03
PA
688 char s[] = "-abc-=-def";
689 char *sp;
690 x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
691 x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
692 x = strtok_r(NULL, "=", &sp); // x = NULL
693 // s = "abc\0-def\0"
f6ea5628
DJ
694
695 This is a variant of strtok() that is multithread-safe.
696
697 For the POSIX documentation for this function, see:
c0c3707f 698 https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
f6ea5628
DJ
699
700 Caveat: It modifies the original string.
701 Caveat: These functions cannot be used on constant strings.
702 Caveat: The identity of the delimiting character is lost.
703 Caveat: It doesn't work with multibyte strings unless all of the delimiter
704 characters are ASCII characters < 0x30.
705
706 See also strsep(). */
707#if @GNULIB_STRTOK_R@
f434ba03
PA
708# if @REPLACE_STRTOK_R@
709# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
710# undef strtok_r
711# define strtok_r rpl_strtok_r
712# endif
713_GL_FUNCDECL_RPL (strtok_r, char *,
714 (char *restrict s, char const *restrict delim,
715 char **restrict save_ptr)
716 _GL_ARG_NONNULL ((2, 3)));
717_GL_CXXALIAS_RPL (strtok_r, char *,
718 (char *restrict s, char const *restrict delim,
719 char **restrict save_ptr));
720# else
721# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
722# undef strtok_r
723# endif
724# if ! @HAVE_DECL_STRTOK_R@
725_GL_FUNCDECL_SYS (strtok_r, char *,
726 (char *restrict s, char const *restrict delim,
727 char **restrict save_ptr)
728 _GL_ARG_NONNULL ((2, 3)));
729# endif
730_GL_CXXALIAS_SYS (strtok_r, char *,
731 (char *restrict s, char const *restrict delim,
732 char **restrict save_ptr));
f6ea5628 733# endif
f434ba03 734_GL_CXXALIASWARN (strtok_r);
f6ea5628 735# if defined GNULIB_POSIXCHECK
f434ba03
PA
736_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
737 "strings in multibyte locales - "
738 "use mbstok_r if you care about internationalization");
f6ea5628
DJ
739# endif
740#elif defined GNULIB_POSIXCHECK
741# undef strtok_r
f434ba03
PA
742# if HAVE_RAW_DECL_STRTOK_R
743_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
744 "use gnulib module strtok_r for portability");
745# endif
f6ea5628
DJ
746#endif
747
748
749/* The following functions are not specified by POSIX. They are gnulib
750 extensions. */
751
752#if @GNULIB_MBSLEN@
753/* Return the number of multibyte characters in the character string STRING.
754 This considers multibyte characters, unlike strlen, which counts bytes. */
f434ba03
PA
755# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
756# undef mbslen
757# endif
758# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
759# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
760# define mbslen rpl_mbslen
761# endif
770d76d7
PA
762_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
763 _GL_ATTRIBUTE_PURE
764 _GL_ARG_NONNULL ((1)));
f434ba03
PA
765_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
766# else
770d76d7
PA
767_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
768 _GL_ATTRIBUTE_PURE
769 _GL_ARG_NONNULL ((1)));
f434ba03
PA
770_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
771# endif
772_GL_CXXALIASWARN (mbslen);
f6ea5628
DJ
773#endif
774
775#if @GNULIB_MBSNLEN@
776/* Return the number of multibyte characters in the character string starting
777 at STRING and ending at STRING + LEN. */
f434ba03 778_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
770d76d7 779 _GL_ATTRIBUTE_PURE
f434ba03 780 _GL_ARG_NONNULL ((1));
f6ea5628
DJ
781#endif
782
783#if @GNULIB_MBSCHR@
784/* Locate the first single-byte character C in the character string STRING,
785 and return a pointer to it. Return NULL if C is not found in STRING.
786 Unlike strchr(), this function works correctly in multibyte locales with
787 encodings such as GB18030. */
f434ba03
PA
788# if defined __hpux
789# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
790# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
791# endif
792_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
770d76d7 793 _GL_ATTRIBUTE_PURE
f434ba03
PA
794 _GL_ARG_NONNULL ((1)));
795_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
796# else
797_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
770d76d7 798 _GL_ATTRIBUTE_PURE
f434ba03
PA
799 _GL_ARG_NONNULL ((1)));
800_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
801# endif
802_GL_CXXALIASWARN (mbschr);
f6ea5628
DJ
803#endif
804
805#if @GNULIB_MBSRCHR@
806/* Locate the last single-byte character C in the character string STRING,
807 and return a pointer to it. Return NULL if C is not found in STRING.
808 Unlike strrchr(), this function works correctly in multibyte locales with
809 encodings such as GB18030. */
770d76d7 810# if defined __hpux || defined __INTERIX
f434ba03 811# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
770d76d7 812# define mbsrchr rpl_mbsrchr /* avoid collision with system function */
f434ba03
PA
813# endif
814_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
770d76d7 815 _GL_ATTRIBUTE_PURE
f434ba03
PA
816 _GL_ARG_NONNULL ((1)));
817_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
818# else
819_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
770d76d7 820 _GL_ATTRIBUTE_PURE
f434ba03
PA
821 _GL_ARG_NONNULL ((1)));
822_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
823# endif
824_GL_CXXALIASWARN (mbsrchr);
f6ea5628
DJ
825#endif
826
827#if @GNULIB_MBSSTR@
828/* Find the first occurrence of the character string NEEDLE in the character
829 string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
830 Unlike strstr(), this function works correctly in multibyte locales with
831 encodings different from UTF-8. */
f434ba03 832_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
770d76d7 833 _GL_ATTRIBUTE_PURE
f434ba03 834 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
835#endif
836
837#if @GNULIB_MBSCASECMP@
838/* Compare the character strings S1 and S2, ignoring case, returning less than,
839 equal to or greater than zero if S1 is lexicographically less than, equal to
840 or greater than S2.
841 Note: This function may, in multibyte locales, return 0 for strings of
842 different lengths!
843 Unlike strcasecmp(), this function works correctly in multibyte locales. */
f434ba03 844_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
770d76d7 845 _GL_ATTRIBUTE_PURE
f434ba03 846 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
847#endif
848
849#if @GNULIB_MBSNCASECMP@
850/* Compare the initial segment of the character string S1 consisting of at most
851 N characters with the initial segment of the character string S2 consisting
852 of at most N characters, ignoring case, returning less than, equal to or
853 greater than zero if the initial segment of S1 is lexicographically less
854 than, equal to or greater than the initial segment of S2.
855 Note: This function may, in multibyte locales, return 0 for initial segments
856 of different lengths!
857 Unlike strncasecmp(), this function works correctly in multibyte locales.
858 But beware that N is not a byte count but a character count! */
f434ba03 859_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
770d76d7 860 _GL_ATTRIBUTE_PURE
f434ba03 861 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
862#endif
863
864#if @GNULIB_MBSPCASECMP@
865/* Compare the initial segment of the character string STRING consisting of
866 at most mbslen (PREFIX) characters with the character string PREFIX,
770d76d7
PA
867 ignoring case. If the two match, return a pointer to the first byte
868 after this prefix in STRING. Otherwise, return NULL.
869 Note: This function may, in multibyte locales, return non-NULL if STRING
870 is of smaller length than PREFIX!
f6ea5628
DJ
871 Unlike strncasecmp(), this function works correctly in multibyte
872 locales. */
f434ba03 873_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
770d76d7 874 _GL_ATTRIBUTE_PURE
f434ba03 875 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
876#endif
877
878#if @GNULIB_MBSCASESTR@
879/* Find the first occurrence of the character string NEEDLE in the character
880 string HAYSTACK, using case-insensitive comparison.
881 Note: This function may, in multibyte locales, return success even if
882 strlen (haystack) < strlen (needle) !
883 Unlike strcasestr(), this function works correctly in multibyte locales. */
f434ba03 884_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
770d76d7 885 _GL_ATTRIBUTE_PURE
f434ba03 886 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
887#endif
888
889#if @GNULIB_MBSCSPN@
890/* Find the first occurrence in the character string STRING of any character
891 in the character string ACCEPT. Return the number of bytes from the
892 beginning of the string to this occurrence, or to the end of the string
893 if none exists.
894 Unlike strcspn(), this function works correctly in multibyte locales. */
f434ba03 895_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
770d76d7 896 _GL_ATTRIBUTE_PURE
f434ba03 897 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
898#endif
899
900#if @GNULIB_MBSPBRK@
901/* Find the first occurrence in the character string STRING of any character
902 in the character string ACCEPT. Return the pointer to it, or NULL if none
903 exists.
904 Unlike strpbrk(), this function works correctly in multibyte locales. */
f434ba03
PA
905# if defined __hpux
906# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
907# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
908# endif
909_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
770d76d7 910 _GL_ATTRIBUTE_PURE
f434ba03
PA
911 _GL_ARG_NONNULL ((1, 2)));
912_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
913# else
914_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
770d76d7 915 _GL_ATTRIBUTE_PURE
f434ba03
PA
916 _GL_ARG_NONNULL ((1, 2)));
917_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
918# endif
919_GL_CXXALIASWARN (mbspbrk);
f6ea5628
DJ
920#endif
921
922#if @GNULIB_MBSSPN@
923/* Find the first occurrence in the character string STRING of any character
924 not in the character string REJECT. Return the number of bytes from the
925 beginning of the string to this occurrence, or to the end of the string
926 if none exists.
927 Unlike strspn(), this function works correctly in multibyte locales. */
f434ba03 928_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
770d76d7 929 _GL_ATTRIBUTE_PURE
f434ba03 930 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
931#endif
932
933#if @GNULIB_MBSSEP@
934/* Search the next delimiter (multibyte character listed in the character
935 string DELIM) starting at the character string *STRINGP.
936 If one is found, overwrite it with a NUL, and advance *STRINGP to point
937 to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
938 If *STRINGP was already NULL, nothing happens.
939 Return the old value of *STRINGP.
940
941 This is a variant of mbstok_r() that supports empty fields.
942
943 Caveat: It modifies the original string.
944 Caveat: These functions cannot be used on constant strings.
945 Caveat: The identity of the delimiting character is lost.
946
947 See also mbstok_r(). */
f434ba03
PA
948_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
949 _GL_ARG_NONNULL ((1, 2));
f6ea5628
DJ
950#endif
951
952#if @GNULIB_MBSTOK_R@
953/* Parse the character string STRING into tokens separated by characters in
954 the character string DELIM.
955 If STRING is NULL, the saved pointer in SAVE_PTR is used as
956 the next starting point. For example:
f434ba03
PA
957 char s[] = "-abc-=-def";
958 char *sp;
959 x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
960 x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
961 x = mbstok_r(NULL, "=", &sp); // x = NULL
962 // s = "abc\0-def\0"
f6ea5628
DJ
963
964 Caveat: It modifies the original string.
965 Caveat: These functions cannot be used on constant strings.
966 Caveat: The identity of the delimiting character is lost.
967
968 See also mbssep(). */
f434ba03
PA
969_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
970 _GL_ARG_NONNULL ((2, 3));
f6ea5628
DJ
971#endif
972
973/* Map any int, typically from errno, into an error message. */
974#if @GNULIB_STRERROR@
975# if @REPLACE_STRERROR@
f434ba03
PA
976# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
977# undef strerror
978# define strerror rpl_strerror
979# endif
980_GL_FUNCDECL_RPL (strerror, char *, (int));
981_GL_CXXALIAS_RPL (strerror, char *, (int));
982# else
983_GL_CXXALIAS_SYS (strerror, char *, (int));
f6ea5628 984# endif
c0c3707f 985# if __GLIBC__ >= 2
f434ba03 986_GL_CXXALIASWARN (strerror);
c0c3707f 987# endif
f6ea5628
DJ
988#elif defined GNULIB_POSIXCHECK
989# undef strerror
f434ba03
PA
990/* Assume strerror is always declared. */
991_GL_WARN_ON_USE (strerror, "strerror is unportable - "
992 "use gnulib module strerror to guarantee non-NULL result");
f6ea5628
DJ
993#endif
994
770d76d7
PA
995/* Map any int, typically from errno, into an error message. Multithread-safe.
996 Uses the POSIX declaration, not the glibc declaration. */
997#if @GNULIB_STRERROR_R@
998# if @REPLACE_STRERROR_R@
999# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1000# undef strerror_r
1001# define strerror_r rpl_strerror_r
1002# endif
1003_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
1004 _GL_ARG_NONNULL ((2)));
1005_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
1006# else
1007# if !@HAVE_DECL_STRERROR_R@
1008_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
1009 _GL_ARG_NONNULL ((2)));
1010# endif
1011_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
1012# endif
1013# if @HAVE_DECL_STRERROR_R@
1014_GL_CXXALIASWARN (strerror_r);
1015# endif
1016#elif defined GNULIB_POSIXCHECK
1017# undef strerror_r
1018# if HAVE_RAW_DECL_STRERROR_R
1019_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
1020 "use gnulib module strerror_r-posix for portability");
1021# endif
1022#endif
1023
f6ea5628
DJ
1024#if @GNULIB_STRSIGNAL@
1025# if @REPLACE_STRSIGNAL@
f434ba03
PA
1026# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1027# define strsignal rpl_strsignal
1028# endif
1029_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
1030_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
1031# else
1032# if ! @HAVE_DECL_STRSIGNAL@
1033_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
1034# endif
1035/* Need to cast, because on Cygwin 1.5.x systems, the return type is
1036 'const char *'. */
1037_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
f6ea5628 1038# endif
f434ba03 1039_GL_CXXALIASWARN (strsignal);
f6ea5628
DJ
1040#elif defined GNULIB_POSIXCHECK
1041# undef strsignal
f434ba03
PA
1042# if HAVE_RAW_DECL_STRSIGNAL
1043_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
1044 "use gnulib module strsignal for portability");
1045# endif
f6ea5628
DJ
1046#endif
1047
f434ba03
PA
1048#if @GNULIB_STRVERSCMP@
1049# if !@HAVE_STRVERSCMP@
1050_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
770d76d7 1051 _GL_ATTRIBUTE_PURE
f434ba03
PA
1052 _GL_ARG_NONNULL ((1, 2)));
1053# endif
1054_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
1055_GL_CXXALIASWARN (strverscmp);
1056#elif defined GNULIB_POSIXCHECK
1057# undef strverscmp
1058# if HAVE_RAW_DECL_STRVERSCMP
1059_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
1060 "use gnulib module strverscmp for portability");
1061# endif
f6ea5628
DJ
1062#endif
1063
f434ba03 1064
770d76d7
PA
1065#endif /* _@GUARD_PREFIX@_STRING_H */
1066#endif /* _@GUARD_PREFIX@_STRING_H */
4a626d0a 1067#endif
This page took 1.082089 seconds and 4 git commands to generate.