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