1 /* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
3 Copyright (C) 2007-2014 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 Lesser 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 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program; if not, see <http://www.gnu.org/licenses/>. */
18 /* Written by Eric Blake. */
21 * ISO C 99 <wchar.h> for platforms that have issues.
22 * <http://www.opengroup.org/susv3xbd/wchar.h.html>
24 * For now, this just ensures proper prerequisite inclusion order and
25 * the declaration of wcwidth().
29 @PRAGMA_SYSTEM_HEADER@
33 #if defined __need_mbstate_t || defined __need_wint_t || (defined __hpux && ((defined _INTTYPES_INCLUDED && !defined strtoimax) || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) || defined _GL_ALREADY_INCLUDING_WCHAR_H
34 /* Special invocation convention:
35 - Inside glibc and uClibc header files.
36 - On HP-UX 11.00 we have a sequence of nested includes
37 <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>,
38 once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h>
39 and once directly. In both situations 'wint_t' is not yet defined,
40 therefore we cannot provide the function overrides; instead include only
41 the system's <wchar.h>.
42 - On IRIX 6.5, similarly, we have an include <wchar.h> -> <wctype.h>, and
43 the latter includes <wchar.h>. But here, we have no way to detect whether
44 <wctype.h> is completely included or is still being included. */
46 #@INCLUDE_NEXT@ @NEXT_WCHAR_H@
49 /* Normal invocation convention. */
51 #ifndef _@GUARD_PREFIX@_WCHAR_H
53 #define _GL_ALREADY_INCLUDING_WCHAR_H
56 # include <features.h> /* for __GLIBC__ */
59 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
61 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
62 included before <wchar.h>.
63 In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
65 But avoid namespace pollution on glibc systems. */
66 #if !(defined __GLIBC__ && !defined __UCLIBC__)
74 /* Include the original <wchar.h> if it exists.
75 Some builds of uClibc lack it. */
76 /* The include_next requires a split double-inclusion guard. */
78 # @INCLUDE_NEXT@ @NEXT_WCHAR_H@
81 #undef _GL_ALREADY_INCLUDING_WCHAR_H
83 #ifndef _@GUARD_PREFIX@_WCHAR_H
84 #define _@GUARD_PREFIX@_WCHAR_H
86 /* The __attribute__ feature is available in gcc versions 2.5 and later.
87 The attribute __pure__ was added in gcc 2.96. */
88 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
89 # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
91 # define _GL_ATTRIBUTE_PURE /* empty */
94 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
96 /* The definition of _GL_ARG_NONNULL is copied here. */
98 /* The definition of _GL_WARN_ON_USE is copied here. */
101 /* Define wint_t and WEOF. (Also done in wctype.in.h.) */
102 #if !@HAVE_WINT_T@ && !defined wint_t
108 /* MSVC defines wint_t as 'unsigned short' in <crtdefs.h>.
109 This is too small: ISO C 99 section 7.24.1.(2) says that wint_t must be
110 "unchanged by default argument promotions". Override it. */
111 # if defined _MSC_VER
112 # if !GNULIB_defined_wint_t
113 # include <crtdefs.h>
114 typedef unsigned int rpl_wint_t;
116 # define wint_t rpl_wint_t
117 # define GNULIB_defined_wint_t 1
121 # define WEOF ((wint_t) -1)
126 /* Override mbstate_t if it is too small.
127 On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
128 implementing mbrtowc for encodings like UTF-8. */
129 #if !(@HAVE_MBSINIT@ && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
130 # if !GNULIB_defined_mbstate_t
131 typedef int rpl_mbstate_t;
133 # define mbstate_t rpl_mbstate_t
134 # define GNULIB_defined_mbstate_t 1
139 /* Convert a single-byte character to a wide character. */
142 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
144 # define btowc rpl_btowc
146 _GL_FUNCDECL_RPL (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
147 _GL_CXXALIAS_RPL (btowc, wint_t, (int c));
150 _GL_FUNCDECL_SYS (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
152 _GL_CXXALIAS_SYS (btowc, wint_t, (int c));
154 _GL_CXXALIASWARN (btowc);
155 #elif defined GNULIB_POSIXCHECK
157 # if HAVE_RAW_DECL_BTOWC
158 _GL_WARN_ON_USE (btowc, "btowc is unportable - "
159 "use gnulib module btowc for portability");
164 /* Convert a wide character to a single-byte character. */
167 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
169 # define wctob rpl_wctob
171 _GL_FUNCDECL_RPL (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
172 _GL_CXXALIAS_RPL (wctob, int, (wint_t wc));
174 # if !defined wctob && !@HAVE_DECL_WCTOB@
175 /* wctob is provided by gnulib, or wctob exists but is not declared. */
176 _GL_FUNCDECL_SYS (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
178 _GL_CXXALIAS_SYS (wctob, int, (wint_t wc));
180 _GL_CXXALIASWARN (wctob);
181 #elif defined GNULIB_POSIXCHECK
183 # if HAVE_RAW_DECL_WCTOB
184 _GL_WARN_ON_USE (wctob, "wctob is unportable - "
185 "use gnulib module wctob for portability");
190 /* Test whether *PS is in the initial state. */
192 # if @REPLACE_MBSINIT@
193 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
195 # define mbsinit rpl_mbsinit
197 _GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps));
198 _GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps));
201 _GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps));
203 _GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps));
205 _GL_CXXALIASWARN (mbsinit);
206 #elif defined GNULIB_POSIXCHECK
208 # if HAVE_RAW_DECL_MBSINIT
209 _GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
210 "use gnulib module mbsinit for portability");
215 /* Convert a multibyte character to a wide character. */
217 # if @REPLACE_MBRTOWC@
218 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
220 # define mbrtowc rpl_mbrtowc
222 _GL_FUNCDECL_RPL (mbrtowc, size_t,
223 (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
224 _GL_CXXALIAS_RPL (mbrtowc, size_t,
225 (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
228 _GL_FUNCDECL_SYS (mbrtowc, size_t,
229 (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
231 _GL_CXXALIAS_SYS (mbrtowc, size_t,
232 (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps));
234 _GL_CXXALIASWARN (mbrtowc);
235 #elif defined GNULIB_POSIXCHECK
237 # if HAVE_RAW_DECL_MBRTOWC
238 _GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - "
239 "use gnulib module mbrtowc for portability");
244 /* Recognize a multibyte character. */
246 # if @REPLACE_MBRLEN@
247 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
249 # define mbrlen rpl_mbrlen
251 _GL_FUNCDECL_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
252 _GL_CXXALIAS_RPL (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
255 _GL_FUNCDECL_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
257 _GL_CXXALIAS_SYS (mbrlen, size_t, (const char *s, size_t n, mbstate_t *ps));
259 _GL_CXXALIASWARN (mbrlen);
260 #elif defined GNULIB_POSIXCHECK
262 # if HAVE_RAW_DECL_MBRLEN
263 _GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - "
264 "use gnulib module mbrlen for portability");
269 /* Convert a string to a wide string. */
270 #if @GNULIB_MBSRTOWCS@
271 # if @REPLACE_MBSRTOWCS@
272 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
274 # define mbsrtowcs rpl_mbsrtowcs
276 _GL_FUNCDECL_RPL (mbsrtowcs, size_t,
277 (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
278 _GL_ARG_NONNULL ((2)));
279 _GL_CXXALIAS_RPL (mbsrtowcs, size_t,
280 (wchar_t *dest, const char **srcp, size_t len,
283 # if !@HAVE_MBSRTOWCS@
284 _GL_FUNCDECL_SYS (mbsrtowcs, size_t,
285 (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
286 _GL_ARG_NONNULL ((2)));
288 _GL_CXXALIAS_SYS (mbsrtowcs, size_t,
289 (wchar_t *dest, const char **srcp, size_t len,
292 _GL_CXXALIASWARN (mbsrtowcs);
293 #elif defined GNULIB_POSIXCHECK
295 # if HAVE_RAW_DECL_MBSRTOWCS
296 _GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - "
297 "use gnulib module mbsrtowcs for portability");
302 /* Convert a string to a wide string. */
303 #if @GNULIB_MBSNRTOWCS@
304 # if @REPLACE_MBSNRTOWCS@
305 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
307 # define mbsnrtowcs rpl_mbsnrtowcs
309 _GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
310 (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
312 _GL_ARG_NONNULL ((2)));
313 _GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
314 (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
317 # if !@HAVE_MBSNRTOWCS@
318 _GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
319 (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
321 _GL_ARG_NONNULL ((2)));
323 _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
324 (wchar_t *dest, const char **srcp, size_t srclen, size_t len,
327 _GL_CXXALIASWARN (mbsnrtowcs);
328 #elif defined GNULIB_POSIXCHECK
330 # if HAVE_RAW_DECL_MBSNRTOWCS
331 _GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - "
332 "use gnulib module mbsnrtowcs for portability");
337 /* Convert a wide character to a multibyte character. */
339 # if @REPLACE_WCRTOMB@
340 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
342 # define wcrtomb rpl_wcrtomb
344 _GL_FUNCDECL_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
345 _GL_CXXALIAS_RPL (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
348 _GL_FUNCDECL_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
350 _GL_CXXALIAS_SYS (wcrtomb, size_t, (char *s, wchar_t wc, mbstate_t *ps));
352 _GL_CXXALIASWARN (wcrtomb);
353 #elif defined GNULIB_POSIXCHECK
355 # if HAVE_RAW_DECL_WCRTOMB
356 _GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - "
357 "use gnulib module wcrtomb for portability");
362 /* Convert a wide string to a string. */
363 #if @GNULIB_WCSRTOMBS@
364 # if @REPLACE_WCSRTOMBS@
365 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
367 # define wcsrtombs rpl_wcsrtombs
369 _GL_FUNCDECL_RPL (wcsrtombs, size_t,
370 (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
371 _GL_ARG_NONNULL ((2)));
372 _GL_CXXALIAS_RPL (wcsrtombs, size_t,
373 (char *dest, const wchar_t **srcp, size_t len,
376 # if !@HAVE_WCSRTOMBS@
377 _GL_FUNCDECL_SYS (wcsrtombs, size_t,
378 (char *dest, const wchar_t **srcp, size_t len, mbstate_t *ps)
379 _GL_ARG_NONNULL ((2)));
381 _GL_CXXALIAS_SYS (wcsrtombs, size_t,
382 (char *dest, const wchar_t **srcp, size_t len,
385 _GL_CXXALIASWARN (wcsrtombs);
386 #elif defined GNULIB_POSIXCHECK
388 # if HAVE_RAW_DECL_WCSRTOMBS
389 _GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - "
390 "use gnulib module wcsrtombs for portability");
395 /* Convert a wide string to a string. */
396 #if @GNULIB_WCSNRTOMBS@
397 # if @REPLACE_WCSNRTOMBS@
398 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
400 # define wcsnrtombs rpl_wcsnrtombs
402 _GL_FUNCDECL_RPL (wcsnrtombs, size_t,
403 (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
405 _GL_ARG_NONNULL ((2)));
406 _GL_CXXALIAS_RPL (wcsnrtombs, size_t,
407 (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
410 # if !@HAVE_WCSNRTOMBS@
411 _GL_FUNCDECL_SYS (wcsnrtombs, size_t,
412 (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
414 _GL_ARG_NONNULL ((2)));
416 _GL_CXXALIAS_SYS (wcsnrtombs, size_t,
417 (char *dest, const wchar_t **srcp, size_t srclen, size_t len,
420 _GL_CXXALIASWARN (wcsnrtombs);
421 #elif defined GNULIB_POSIXCHECK
423 # if HAVE_RAW_DECL_WCSNRTOMBS
424 _GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - "
425 "use gnulib module wcsnrtombs for portability");
430 /* Return the number of screen columns needed for WC. */
432 # if @REPLACE_WCWIDTH@
433 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
435 # define wcwidth rpl_wcwidth
437 _GL_FUNCDECL_RPL (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
438 _GL_CXXALIAS_RPL (wcwidth, int, (wchar_t));
440 # if !@HAVE_DECL_WCWIDTH@
441 /* wcwidth exists but is not declared. */
442 _GL_FUNCDECL_SYS (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
444 _GL_CXXALIAS_SYS (wcwidth, int, (wchar_t));
446 _GL_CXXALIASWARN (wcwidth);
447 #elif defined GNULIB_POSIXCHECK
449 # if HAVE_RAW_DECL_WCWIDTH
450 _GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - "
451 "use gnulib module wcwidth for portability");
456 /* Search N wide characters of S for C. */
459 _GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n)
462 /* On some systems, this function is defined as an overloaded function:
464 const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t);
465 wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t);
467 _GL_CXXALIAS_SYS_CAST2 (wmemchr,
468 wchar_t *, (const wchar_t *, wchar_t, size_t),
469 const wchar_t *, (const wchar_t *, wchar_t, size_t));
470 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
471 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
472 _GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
473 _GL_CXXALIASWARN1 (wmemchr, const wchar_t *,
474 (const wchar_t *s, wchar_t c, size_t n));
476 _GL_CXXALIASWARN (wmemchr);
478 #elif defined GNULIB_POSIXCHECK
480 # if HAVE_RAW_DECL_WMEMCHR
481 _GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - "
482 "use gnulib module wmemchr for portability");
487 /* Compare N wide characters of S1 and S2. */
490 _GL_FUNCDECL_SYS (wmemcmp, int,
491 (const wchar_t *s1, const wchar_t *s2, size_t n)
494 _GL_CXXALIAS_SYS (wmemcmp, int,
495 (const wchar_t *s1, const wchar_t *s2, size_t n));
496 _GL_CXXALIASWARN (wmemcmp);
497 #elif defined GNULIB_POSIXCHECK
499 # if HAVE_RAW_DECL_WMEMCMP
500 _GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - "
501 "use gnulib module wmemcmp for portability");
506 /* Copy N wide characters of SRC to DEST. */
509 _GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
510 (wchar_t *dest, const wchar_t *src, size_t n));
512 _GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
513 (wchar_t *dest, const wchar_t *src, size_t n));
514 _GL_CXXALIASWARN (wmemcpy);
515 #elif defined GNULIB_POSIXCHECK
517 # if HAVE_RAW_DECL_WMEMCPY
518 _GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - "
519 "use gnulib module wmemcpy for portability");
524 /* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for
525 overlapping memory areas. */
526 #if @GNULIB_WMEMMOVE@
527 # if !@HAVE_WMEMMOVE@
528 _GL_FUNCDECL_SYS (wmemmove, wchar_t *,
529 (wchar_t *dest, const wchar_t *src, size_t n));
531 _GL_CXXALIAS_SYS (wmemmove, wchar_t *,
532 (wchar_t *dest, const wchar_t *src, size_t n));
533 _GL_CXXALIASWARN (wmemmove);
534 #elif defined GNULIB_POSIXCHECK
536 # if HAVE_RAW_DECL_WMEMMOVE
537 _GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - "
538 "use gnulib module wmemmove for portability");
543 /* Set N wide characters of S to C. */
546 _GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
548 _GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
549 _GL_CXXALIASWARN (wmemset);
550 #elif defined GNULIB_POSIXCHECK
552 # if HAVE_RAW_DECL_WMEMSET
553 _GL_WARN_ON_USE (wmemset, "wmemset is unportable - "
554 "use gnulib module wmemset for portability");
559 /* Return the number of wide characters in S. */
562 _GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s) _GL_ATTRIBUTE_PURE);
564 _GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s));
565 _GL_CXXALIASWARN (wcslen);
566 #elif defined GNULIB_POSIXCHECK
568 # if HAVE_RAW_DECL_WCSLEN
569 _GL_WARN_ON_USE (wcslen, "wcslen is unportable - "
570 "use gnulib module wcslen for portability");
575 /* Return the number of wide characters in S, but at most MAXLEN. */
578 _GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)
581 _GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen));
582 _GL_CXXALIASWARN (wcsnlen);
583 #elif defined GNULIB_POSIXCHECK
585 # if HAVE_RAW_DECL_WCSNLEN
586 _GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - "
587 "use gnulib module wcsnlen for portability");
592 /* Copy SRC to DEST. */
595 _GL_FUNCDECL_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
597 _GL_CXXALIAS_SYS (wcscpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
598 _GL_CXXALIASWARN (wcscpy);
599 #elif defined GNULIB_POSIXCHECK
601 # if HAVE_RAW_DECL_WCSCPY
602 _GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - "
603 "use gnulib module wcscpy for portability");
608 /* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */
611 _GL_FUNCDECL_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
613 _GL_CXXALIAS_SYS (wcpcpy, wchar_t *, (wchar_t *dest, const wchar_t *src));
614 _GL_CXXALIASWARN (wcpcpy);
615 #elif defined GNULIB_POSIXCHECK
617 # if HAVE_RAW_DECL_WCPCPY
618 _GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - "
619 "use gnulib module wcpcpy for portability");
624 /* Copy no more than N wide characters of SRC to DEST. */
627 _GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
628 (wchar_t *dest, const wchar_t *src, size_t n));
630 _GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
631 (wchar_t *dest, const wchar_t *src, size_t n));
632 _GL_CXXALIASWARN (wcsncpy);
633 #elif defined GNULIB_POSIXCHECK
635 # if HAVE_RAW_DECL_WCSNCPY
636 _GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - "
637 "use gnulib module wcsncpy for portability");
642 /* Copy no more than N characters of SRC to DEST, returning the address of
643 the last character written into DEST. */
646 _GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
647 (wchar_t *dest, const wchar_t *src, size_t n));
649 _GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
650 (wchar_t *dest, const wchar_t *src, size_t n));
651 _GL_CXXALIASWARN (wcpncpy);
652 #elif defined GNULIB_POSIXCHECK
654 # if HAVE_RAW_DECL_WCPNCPY
655 _GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - "
656 "use gnulib module wcpncpy for portability");
661 /* Append SRC onto DEST. */
664 _GL_FUNCDECL_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
666 _GL_CXXALIAS_SYS (wcscat, wchar_t *, (wchar_t *dest, const wchar_t *src));
667 _GL_CXXALIASWARN (wcscat);
668 #elif defined GNULIB_POSIXCHECK
670 # if HAVE_RAW_DECL_WCSCAT
671 _GL_WARN_ON_USE (wcscat, "wcscat is unportable - "
672 "use gnulib module wcscat for portability");
677 /* Append no more than N wide characters of SRC onto DEST. */
680 _GL_FUNCDECL_SYS (wcsncat, wchar_t *,
681 (wchar_t *dest, const wchar_t *src, size_t n));
683 _GL_CXXALIAS_SYS (wcsncat, wchar_t *,
684 (wchar_t *dest, const wchar_t *src, size_t n));
685 _GL_CXXALIASWARN (wcsncat);
686 #elif defined GNULIB_POSIXCHECK
688 # if HAVE_RAW_DECL_WCSNCAT
689 _GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - "
690 "use gnulib module wcsncat for portability");
695 /* Compare S1 and S2. */
698 _GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)
701 _GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
702 _GL_CXXALIASWARN (wcscmp);
703 #elif defined GNULIB_POSIXCHECK
705 # if HAVE_RAW_DECL_WCSCMP
706 _GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - "
707 "use gnulib module wcscmp for portability");
712 /* Compare no more than N wide characters of S1 and S2. */
715 _GL_FUNCDECL_SYS (wcsncmp, int,
716 (const wchar_t *s1, const wchar_t *s2, size_t n)
719 _GL_CXXALIAS_SYS (wcsncmp, int,
720 (const wchar_t *s1, const wchar_t *s2, size_t n));
721 _GL_CXXALIASWARN (wcsncmp);
722 #elif defined GNULIB_POSIXCHECK
724 # if HAVE_RAW_DECL_WCSNCMP
725 _GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - "
726 "use gnulib module wcsncmp for portability");
731 /* Compare S1 and S2, ignoring case. */
732 #if @GNULIB_WCSCASECMP@
733 # if !@HAVE_WCSCASECMP@
734 _GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)
737 _GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2));
738 _GL_CXXALIASWARN (wcscasecmp);
739 #elif defined GNULIB_POSIXCHECK
741 # if HAVE_RAW_DECL_WCSCASECMP
742 _GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - "
743 "use gnulib module wcscasecmp for portability");
748 /* Compare no more than N chars of S1 and S2, ignoring case. */
749 #if @GNULIB_WCSNCASECMP@
750 # if !@HAVE_WCSNCASECMP@
751 _GL_FUNCDECL_SYS (wcsncasecmp, int,
752 (const wchar_t *s1, const wchar_t *s2, size_t n)
755 _GL_CXXALIAS_SYS (wcsncasecmp, int,
756 (const wchar_t *s1, const wchar_t *s2, size_t n));
757 _GL_CXXALIASWARN (wcsncasecmp);
758 #elif defined GNULIB_POSIXCHECK
760 # if HAVE_RAW_DECL_WCSNCASECMP
761 _GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - "
762 "use gnulib module wcsncasecmp for portability");
767 /* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE
768 category of the current locale. */
771 _GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
773 _GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
774 _GL_CXXALIASWARN (wcscoll);
775 #elif defined GNULIB_POSIXCHECK
777 # if HAVE_RAW_DECL_WCSCOLL
778 _GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - "
779 "use gnulib module wcscoll for portability");
784 /* Transform S2 into array pointed to by S1 such that if wcscmp is applied
785 to two transformed strings the result is the as applying 'wcscoll' to the
789 _GL_FUNCDECL_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
791 _GL_CXXALIAS_SYS (wcsxfrm, size_t, (wchar_t *s1, const wchar_t *s2, size_t n));
792 _GL_CXXALIASWARN (wcsxfrm);
793 #elif defined GNULIB_POSIXCHECK
795 # if HAVE_RAW_DECL_WCSXFRM
796 _GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - "
797 "use gnulib module wcsxfrm for portability");
802 /* Duplicate S, returning an identical malloc'd string. */
805 _GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
807 _GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
808 _GL_CXXALIASWARN (wcsdup);
809 #elif defined GNULIB_POSIXCHECK
811 # if HAVE_RAW_DECL_WCSDUP
812 _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
813 "use gnulib module wcsdup for portability");
818 /* Find the first occurrence of WC in WCS. */
821 _GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
824 /* On some systems, this function is defined as an overloaded function:
826 const wchar_t * std::wcschr (const wchar_t *, wchar_t);
827 wchar_t * std::wcschr (wchar_t *, wchar_t);
829 _GL_CXXALIAS_SYS_CAST2 (wcschr,
830 wchar_t *, (const wchar_t *, wchar_t),
831 const wchar_t *, (const wchar_t *, wchar_t));
832 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
833 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
834 _GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc));
835 _GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
837 _GL_CXXALIASWARN (wcschr);
839 #elif defined GNULIB_POSIXCHECK
841 # if HAVE_RAW_DECL_WCSCHR
842 _GL_WARN_ON_USE (wcschr, "wcschr is unportable - "
843 "use gnulib module wcschr for portability");
848 /* Find the last occurrence of WC in WCS. */
851 _GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
854 /* On some systems, this function is defined as an overloaded function:
856 const wchar_t * std::wcsrchr (const wchar_t *, wchar_t);
857 wchar_t * std::wcsrchr (wchar_t *, wchar_t);
859 _GL_CXXALIAS_SYS_CAST2 (wcsrchr,
860 wchar_t *, (const wchar_t *, wchar_t),
861 const wchar_t *, (const wchar_t *, wchar_t));
862 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
863 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
864 _GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc));
865 _GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
867 _GL_CXXALIASWARN (wcsrchr);
869 #elif defined GNULIB_POSIXCHECK
871 # if HAVE_RAW_DECL_WCSRCHR
872 _GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - "
873 "use gnulib module wcsrchr for portability");
878 /* Return the length of the initial segmet of WCS which consists entirely
879 of wide characters not in REJECT. */
882 _GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)
885 _GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject));
886 _GL_CXXALIASWARN (wcscspn);
887 #elif defined GNULIB_POSIXCHECK
889 # if HAVE_RAW_DECL_WCSCSPN
890 _GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - "
891 "use gnulib module wcscspn for portability");
896 /* Return the length of the initial segmet of WCS which consists entirely
897 of wide characters in ACCEPT. */
900 _GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)
903 _GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept));
904 _GL_CXXALIASWARN (wcsspn);
905 #elif defined GNULIB_POSIXCHECK
907 # if HAVE_RAW_DECL_WCSSPN
908 _GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - "
909 "use gnulib module wcsspn for portability");
914 /* Find the first occurrence in WCS of any character in ACCEPT. */
917 _GL_FUNCDECL_SYS (wcspbrk, wchar_t *,
918 (const wchar_t *wcs, const wchar_t *accept)
921 /* On some systems, this function is defined as an overloaded function:
923 const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *);
924 wchar_t * std::wcspbrk (wchar_t *, const wchar_t *);
926 _GL_CXXALIAS_SYS_CAST2 (wcspbrk,
927 wchar_t *, (const wchar_t *, const wchar_t *),
928 const wchar_t *, (const wchar_t *, const wchar_t *));
929 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
930 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
931 _GL_CXXALIASWARN1 (wcspbrk, wchar_t *,
932 (wchar_t *wcs, const wchar_t *accept));
933 _GL_CXXALIASWARN1 (wcspbrk, const wchar_t *,
934 (const wchar_t *wcs, const wchar_t *accept));
936 _GL_CXXALIASWARN (wcspbrk);
938 #elif defined GNULIB_POSIXCHECK
940 # if HAVE_RAW_DECL_WCSPBRK
941 _GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - "
942 "use gnulib module wcspbrk for portability");
947 /* Find the first occurrence of NEEDLE in HAYSTACK. */
950 _GL_FUNCDECL_SYS (wcsstr, wchar_t *,
951 (const wchar_t *haystack, const wchar_t *needle)
954 /* On some systems, this function is defined as an overloaded function:
956 const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *);
957 wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
959 _GL_CXXALIAS_SYS_CAST2 (wcsstr,
960 wchar_t *, (const wchar_t *, const wchar_t *),
961 const wchar_t *, (const wchar_t *, const wchar_t *));
962 # if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
963 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
964 _GL_CXXALIASWARN1 (wcsstr, wchar_t *,
965 (wchar_t *haystack, const wchar_t *needle));
966 _GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
967 (const wchar_t *haystack, const wchar_t *needle));
969 _GL_CXXALIASWARN (wcsstr);
971 #elif defined GNULIB_POSIXCHECK
973 # if HAVE_RAW_DECL_WCSSTR
974 _GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - "
975 "use gnulib module wcsstr for portability");
980 /* Divide WCS into tokens separated by characters in DELIM. */
983 _GL_FUNCDECL_SYS (wcstok, wchar_t *,
984 (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
986 _GL_CXXALIAS_SYS (wcstok, wchar_t *,
987 (wchar_t *wcs, const wchar_t *delim, wchar_t **ptr));
988 _GL_CXXALIASWARN (wcstok);
989 #elif defined GNULIB_POSIXCHECK
991 # if HAVE_RAW_DECL_WCSTOK
992 _GL_WARN_ON_USE (wcstok, "wcstok is unportable - "
993 "use gnulib module wcstok for portability");
998 /* Determine number of column positions required for first N wide
999 characters (or fewer if S ends before this) in S. */
1000 #if @GNULIB_WCSWIDTH@
1001 # if @REPLACE_WCSWIDTH@
1002 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1004 # define wcswidth rpl_wcswidth
1006 _GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n)
1007 _GL_ATTRIBUTE_PURE);
1008 _GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n));
1010 # if !@HAVE_WCSWIDTH@
1011 _GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n)
1012 _GL_ATTRIBUTE_PURE);
1014 _GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n));
1016 _GL_CXXALIASWARN (wcswidth);
1017 #elif defined GNULIB_POSIXCHECK
1019 # if HAVE_RAW_DECL_WCSWIDTH
1020 _GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - "
1021 "use gnulib module wcswidth for portability");
1026 #endif /* _@GUARD_PREFIX@_WCHAR_H */
1027 #endif /* _@GUARD_PREFIX@_WCHAR_H */