summaryrefslogtreecommitdiffstats
path: root/gl/wchar.in.h
diff options
context:
space:
mode:
Diffstat (limited to 'gl/wchar.in.h')
-rw-r--r--gl/wchar.in.h376
1 files changed, 360 insertions, 16 deletions
diff --git a/gl/wchar.in.h b/gl/wchar.in.h
index 09c9185..a33a10f 100644
--- a/gl/wchar.in.h
+++ b/gl/wchar.in.h
@@ -1,6 +1,6 @@
1/* A substitute for ISO C99 <wchar.h>, for platforms that have issues. 1/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
2 2
3 Copyright (C) 2007-2023 Free Software Foundation, Inc. 3 Copyright (C) 2007-2024 Free Software Foundation, Inc.
4 4
5 This file is free software: you can redistribute it and/or modify 5 This file is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as 6 it under the terms of the GNU Lesser General Public License as
@@ -84,6 +84,13 @@
84#ifndef _@GUARD_PREFIX@_WCHAR_H 84#ifndef _@GUARD_PREFIX@_WCHAR_H
85#define _@GUARD_PREFIX@_WCHAR_H 85#define _@GUARD_PREFIX@_WCHAR_H
86 86
87/* This file uses _GL_ATTRIBUTE_DEALLOC, _GL_ATTRIBUTE_MALLOC,
88 _GL_ATTRIBUTE_NOTHROW, _GL_ATTRIBUTE_PURE, GNULIB_POSIXCHECK,
89 HAVE_RAW_DECL_*. */
90#if !_GL_CONFIG_H_INCLUDED
91 #error "Please include config.h first."
92#endif
93
87/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers 94/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
88 that can be freed by passing them as the Ith argument to the 95 that can be freed by passing them as the Ith argument to the
89 function F. */ 96 function F. */
@@ -130,6 +137,28 @@
130# endif 137# endif
131#endif 138#endif
132 139
140/* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
141 */
142#ifndef _GL_ATTRIBUTE_NOTHROW
143# if defined __cplusplus
144# if (__GNUC__ + (__GNUC_MINOR__ >= 8) > 2) || __clang_major >= 4
145# if __cplusplus >= 201103L
146# define _GL_ATTRIBUTE_NOTHROW noexcept (true)
147# else
148# define _GL_ATTRIBUTE_NOTHROW throw ()
149# endif
150# else
151# define _GL_ATTRIBUTE_NOTHROW
152# endif
153# else
154# if (__GNUC__ + (__GNUC_MINOR__ >= 3) > 3) || defined __clang__
155# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
156# else
157# define _GL_ATTRIBUTE_NOTHROW
158# endif
159# endif
160#endif
161
133/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ 162/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
134 163
135/* The definition of _GL_ARG_NONNULL is copied here. */ 164/* The definition of _GL_ARG_NONNULL is copied here. */
@@ -188,7 +217,11 @@ typedef int rpl_mbstate_t;
188# if (@REPLACE_FREE@ && !defined free \ 217# if (@REPLACE_FREE@ && !defined free \
189 && !(defined __cplusplus && defined GNULIB_NAMESPACE)) 218 && !(defined __cplusplus && defined GNULIB_NAMESPACE))
190/* We can't do '#define free rpl_free' here. */ 219/* We can't do '#define free rpl_free' here. */
220# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
221_GL_EXTERN_C void rpl_free (void *) _GL_ATTRIBUTE_NOTHROW;
222# else
191_GL_EXTERN_C void rpl_free (void *); 223_GL_EXTERN_C void rpl_free (void *);
224# endif
192# undef _GL_ATTRIBUTE_DEALLOC_FREE 225# undef _GL_ATTRIBUTE_DEALLOC_FREE
193# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (rpl_free, 1) 226# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (rpl_free, 1)
194# else 227# else
@@ -200,7 +233,7 @@ _GL_EXTERN_C
200 void __cdecl free (void *); 233 void __cdecl free (void *);
201# else 234# else
202# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2) 235# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
203_GL_EXTERN_C void free (void *) throw (); 236_GL_EXTERN_C void free (void *) _GL_ATTRIBUTE_NOTHROW;
204# else 237# else
205_GL_EXTERN_C void free (void *); 238_GL_EXTERN_C void free (void *);
206# endif 239# endif
@@ -215,13 +248,20 @@ _GL_EXTERN_C
215 void __cdecl free (void *); 248 void __cdecl free (void *);
216# else 249# else
217# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2) 250# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
218_GL_EXTERN_C void free (void *) throw (); 251_GL_EXTERN_C void free (void *) _GL_ATTRIBUTE_NOTHROW;
219# else 252# else
220_GL_EXTERN_C void free (void *); 253_GL_EXTERN_C void free (void *);
221# endif 254# endif
222# endif 255# endif
223#endif 256#endif
224 257
258
259#if @GNULIB_MBSZERO@
260/* Get memset(). */
261# include <string.h>
262#endif
263
264
225/* Convert a single-byte character to a wide character. */ 265/* Convert a single-byte character to a wide character. */
226#if @GNULIB_BTOWC@ 266#if @GNULIB_BTOWC@
227# if @REPLACE_BTOWC@ 267# if @REPLACE_BTOWC@
@@ -278,7 +318,7 @@ _GL_WARN_ON_USE (wctob, "wctob is unportable - "
278#endif 318#endif
279 319
280 320
281/* Test whether *PS is in the initial state. */ 321/* Test whether *PS is in an initial state. */
282#if @GNULIB_MBSINIT@ 322#if @GNULIB_MBSINIT@
283# if @REPLACE_MBSINIT@ 323# if @REPLACE_MBSINIT@
284# if !(defined __cplusplus && defined GNULIB_NAMESPACE) 324# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
@@ -305,6 +345,208 @@ _GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
305#endif 345#endif
306 346
307 347
348/* Put *PS into an initial state. */
349#if @GNULIB_MBSZERO@
350/* ISO C 23 ยง 7.31.6.(3) says that zeroing an mbstate_t is a way to put the
351 mbstate_t into an initial state. However, on many platforms an mbstate_t
352 is large, and it is possible - as an optimization - to get away with zeroing
353 only part of it. So, instead of
354
355 mbstate_t state = { 0 };
356
357 or
358
359 mbstate_t state;
360 memset (&state, 0, sizeof (mbstate_t));
361
362 we can write this faster code:
363
364 mbstate_t state;
365 mbszero (&state);
366 */
367/* _GL_MBSTATE_INIT_SIZE describes how mbsinit() behaves: It is the number of
368 bytes at the beginning of an mbstate_t that need to be zero, for mbsinit()
369 to return true.
370 _GL_MBSTATE_ZERO_SIZE is the number of bytes at the beginning of an mbstate_t
371 that need to be zero,
372 - for mbsinit() to return true, and
373 - for all other multibyte-aware functions to operate properly.
374 0 < _GL_MBSTATE_INIT_SIZE <= _GL_MBSTATE_ZERO_SIZE <= sizeof (mbstate_t).
375 These values are determined by source code inspection, where possible, and
376 by running the gnulib unit tests.
377 We need _GL_MBSTATE_INIT_SIZE because if we define _GL_MBSTATE_ZERO_SIZE
378 without considering what mbsinit() does, we get test failures such as
379 assertion "mbsinit (&iter->state)" failed
380 */
381# if GNULIB_defined_mbstate_t /* AIX, IRIX */
382/* mbstate_t has at least 4 bytes. They are used as coded in
383 gnulib/lib/mbrtowc.c. */
384# define _GL_MBSTATE_INIT_SIZE 1
385/* define _GL_MBSTATE_ZERO_SIZE 4
386 does not work: it causes test failures.
387 So, use the safe fallback value, below. */
388# elif __GLIBC__ + (__GLIBC_MINOR__ >= 2) > 2 /* glibc */
389/* mbstate_t is defined in <bits/types/__mbstate_t.h>.
390 For more details, see glibc/iconv/skeleton.c. */
391# define _GL_MBSTATE_INIT_SIZE 4 /* sizeof (((mbstate_t) {0}).__count) */
392# define _GL_MBSTATE_ZERO_SIZE /* 8 */ sizeof (mbstate_t)
393# elif defined MUSL_LIBC /* musl libc */
394/* mbstate_t is defined in <bits/alltypes.h>.
395 It is an opaque aligned 8-byte struct, of which at most the first
396 4 bytes are used.
397 For more details, see src/multibyte/mbrtowc.c. */
398# define _GL_MBSTATE_INIT_SIZE 4 /* sizeof (unsigned) */
399# define _GL_MBSTATE_ZERO_SIZE 4
400# elif defined __APPLE__ && defined __MACH__ /* macOS */
401/* On macOS, mbstate_t is defined in <machine/_types.h>.
402 It is an opaque aligned 128-byte struct, of which at most the first
403 12 bytes are used.
404 For more details, see the __mbsinit implementations in
405 Libc-<version>/locale/FreeBSD/
406 {ascii,none,euc,mskanji,big5,gb2312,gbk,gb18030,utf8,utf2}.c. */
407/* File INIT_SIZE ZERO_SIZE
408 ascii.c 0 0
409 none.c 0 0
410 euc.c 12 12
411 mskanji.c 4 4
412 big5.c 4 4
413 gb2312.c 4 6
414 gbk.c 4 4
415 gb18030.c 4 8
416 utf8.c 8 10
417 utf2.c 8 12 */
418# define _GL_MBSTATE_INIT_SIZE 12
419# define _GL_MBSTATE_ZERO_SIZE 12
420# elif defined __FreeBSD__ /* FreeBSD */
421/* On FreeBSD, mbstate_t is defined in src/sys/sys/_types.h.
422 It is an opaque aligned 128-byte struct, of which at most the first
423 12 bytes are used.
424 For more details, see the __mbsinit implementations in
425 src/lib/libc/locale/
426 {ascii,none,euc,mskanji,big5,gb2312,gbk,gb18030,utf8}.c. */
427/* File INIT_SIZE ZERO_SIZE
428 ascii.c 0 0
429 none.c 0 0
430 euc.c 12 12
431 mskanji.c 4 4
432 big5.c 4 4
433 gb2312.c 4 6
434 gbk.c 4 4
435 gb18030.c 4 8
436 utf8.c 8 12 */
437# define _GL_MBSTATE_INIT_SIZE 12
438# define _GL_MBSTATE_ZERO_SIZE 12
439# elif defined __NetBSD__ /* NetBSD */
440/* On NetBSD, mbstate_t is defined in src/sys/sys/ansi.h.
441 It is an opaque aligned 128-byte struct, of which at most the first
442 28 bytes are used.
443 For more details, see the *State types in
444 src/lib/libc/citrus/modules/citrus_*.c
445 (ignoring citrus_{hz,iso2022,utf7,viqr,zw}.c, since these implement
446 stateful encodings, not usable as locale encodings). */
447/* File ZERO_SIZE
448 citrus/citrus_none.c 0
449 citrus/modules/citrus_euc.c 8
450 citrus/modules/citrus_euctw.c 8
451 citrus/modules/citrus_mskanji.c 8
452 citrus/modules/citrus_big5.c 8
453 citrus/modules/citrus_gbk2k.c 8
454 citrus/modules/citrus_dechanyu.c 8
455 citrus/modules/citrus_johab.c 6
456 citrus/modules/citrus_utf8.c 12 */
457/* But 12 is not the correct value for _GL_MBSTATE_ZERO_SIZE: we get test
458 failures for values < 28. */
459# define _GL_MBSTATE_ZERO_SIZE 28
460# elif defined __OpenBSD__ /* OpenBSD */
461/* On OpenBSD, mbstate_t is defined in src/sys/sys/_types.h.
462 It is an opaque aligned 128-byte struct, of which at most the first
463 12 bytes are used.
464 For more details, see src/lib/libc/citrus/citrus_*.c. */
465/* File INIT_SIZE ZERO_SIZE
466 citrus_none.c 0 0
467 citrus_utf8.c 12 12 */
468# define _GL_MBSTATE_INIT_SIZE 12
469# define _GL_MBSTATE_ZERO_SIZE 12
470# elif defined __minix /* Minix */
471/* On Minix, mbstate_t is defined in sys/sys/ansi.h.
472 It is an opaque aligned 128-byte struct.
473 For more details, see the *State types in
474 lib/libc/citrus/citrus_*.c. */
475/* File INIT_SIZE ZERO_SIZE
476 citrus_none.c 0 0 */
477/* But 1 is not the correct value for _GL_MBSTATE_ZERO_SIZE: we get test
478 failures for values < 4. */
479# define _GL_MBSTATE_ZERO_SIZE 4
480# elif defined __sun /* Solaris */
481/* On Solaris, mbstate_t is defined in <wchar_impl.h>.
482 It is an opaque aligned 24-byte or 32-byte struct, of which at most the first
483 20 or 28 bytes are used.
484 For more details on OpenSolaris derivatives, see the *State types in
485 illumos-gate/usr/src/lib/libc/port/locale/
486 {none,euc,mskanji,big5,gb2312,gbk,gb18030,utf8}.c. */
487/* File INIT_SIZE ZERO_SIZE
488 none.c 0 0
489 euc.c 12 12
490 mskanji.c 4 4
491 big5.c 4 4
492 gb2312.c 4 6
493 gbk.c 4 4
494 gb18030.c 4 8
495 utf8.c 12 12 */
496/* But 12 is not the correct value for _GL_MBSTATE_ZERO_SIZE: we get test
497 failures
498 - in OpenIndiana and OmniOS: for values < 16,
499 - in Solaris 10 and 11: for values < 20 (in 32-bit mode)
500 or < 28 (in 64-bit mode).
501 Since we don't have a good way to distinguish the OpenSolaris derivatives
502 from the proprietary Solaris versions, and can't inspect the Solaris source
503 code, use the safe fallback values, below. */
504# elif defined __CYGWIN__ /* Cygwin */
505/* On Cygwin, mbstate_t is defined in <sys/_types.h>.
506 For more details, see newlib/libc/stdlib/mbtowc_r.c and
507 winsup/cygwin/strfuncs.cc. */
508# define _GL_MBSTATE_INIT_SIZE 4 /* sizeof (int) */
509# define _GL_MBSTATE_ZERO_SIZE 8
510# elif defined _WIN32 && !defined __CYGWIN__ /* Native Windows. */
511/* MSVC defines 'mbstate_t' as an aligned 8-byte struct.
512 On mingw, 'mbstate_t' is sometimes defined as 'int', sometimes defined
513 as an aligned 8-byte struct, of which the first 4 bytes matter.
514 Use the safe values, below. */
515# elif defined __ANDROID__ /* Android */
516/* Android defines 'mbstate_t' in <bits/mbstate_t.h>.
517 It is an opaque 4-byte or 8-byte struct.
518 For more details, see
519 bionic/libc/private/bionic_mbstate.h
520 bionic/libc/bionic/mbrtoc32.cpp
521 bionic/libc/bionic/mbrtoc16.cpp
522 */
523# define _GL_MBSTATE_INIT_SIZE 4
524# define _GL_MBSTATE_ZERO_SIZE 4
525# endif
526/* Use safe values as defaults. */
527# ifndef _GL_MBSTATE_INIT_SIZE
528# define _GL_MBSTATE_INIT_SIZE sizeof (mbstate_t)
529# endif
530# ifndef _GL_MBSTATE_ZERO_SIZE
531# define _GL_MBSTATE_ZERO_SIZE sizeof (mbstate_t)
532# endif
533_GL_BEGIN_C_LINKAGE
534# if defined IN_MBSZERO
535_GL_EXTERN_INLINE
536# else
537_GL_INLINE
538# endif
539_GL_ARG_NONNULL ((1)) void
540mbszero (mbstate_t *ps)
541{
542 memset (ps, 0, _GL_MBSTATE_ZERO_SIZE);
543}
544_GL_END_C_LINKAGE
545_GL_CXXALIAS_SYS (mbszero, void, (mbstate_t *ps));
546_GL_CXXALIASWARN (mbszero);
547#endif
548
549
308/* Convert a multibyte character to a wide character. */ 550/* Convert a multibyte character to a wide character. */
309#if @GNULIB_MBRTOWC@ 551#if @GNULIB_MBRTOWC@
310# if @REPLACE_MBRTOWC@ 552# if @REPLACE_MBRTOWC@
@@ -441,7 +683,9 @@ _GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
441 const char **restrict srcp, size_t srclen, size_t len, 683 const char **restrict srcp, size_t srclen, size_t len,
442 mbstate_t *restrict ps)); 684 mbstate_t *restrict ps));
443# endif 685# endif
686# if __GLIBC__ >= 2
444_GL_CXXALIASWARN (mbsnrtowcs); 687_GL_CXXALIASWARN (mbsnrtowcs);
688# endif
445#elif defined GNULIB_POSIXCHECK 689#elif defined GNULIB_POSIXCHECK
446# undef mbsnrtowcs 690# undef mbsnrtowcs
447# if HAVE_RAW_DECL_MBSNRTOWCS 691# if HAVE_RAW_DECL_MBSNRTOWCS
@@ -629,13 +873,25 @@ _GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - "
629 873
630/* Compare N wide characters of S1 and S2. */ 874/* Compare N wide characters of S1 and S2. */
631#if @GNULIB_WMEMCMP@ 875#if @GNULIB_WMEMCMP@
632# if !@HAVE_WMEMCMP@ 876# if @REPLACE_WMEMCMP@
877# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
878# undef wmemcmp
879# define wmemcmp rpl_wmemcmp
880# endif
881_GL_FUNCDECL_RPL (wmemcmp, int,
882 (const wchar_t *s1, const wchar_t *s2, size_t n)
883 _GL_ATTRIBUTE_PURE);
884_GL_CXXALIAS_RPL (wmemcmp, int,
885 (const wchar_t *s1, const wchar_t *s2, size_t n));
886# else
887# if !@HAVE_WMEMCMP@
633_GL_FUNCDECL_SYS (wmemcmp, int, 888_GL_FUNCDECL_SYS (wmemcmp, int,
634 (const wchar_t *s1, const wchar_t *s2, size_t n) 889 (const wchar_t *s1, const wchar_t *s2, size_t n)
635 _GL_ATTRIBUTE_PURE); 890 _GL_ATTRIBUTE_PURE);
636# endif 891# endif
637_GL_CXXALIAS_SYS (wmemcmp, int, 892_GL_CXXALIAS_SYS (wmemcmp, int,
638 (const wchar_t *s1, const wchar_t *s2, size_t n)); 893 (const wchar_t *s1, const wchar_t *s2, size_t n));
894# endif
639# if __GLIBC__ >= 2 895# if __GLIBC__ >= 2
640_GL_CXXALIASWARN (wmemcmp); 896_GL_CXXALIASWARN (wmemcmp);
641# endif 897# endif
@@ -694,14 +950,27 @@ _GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - "
694/* Copy N wide characters of SRC to DEST. 950/* Copy N wide characters of SRC to DEST.
695 Return pointer to wide characters after the last written wide character. */ 951 Return pointer to wide characters after the last written wide character. */
696#if @GNULIB_WMEMPCPY@ 952#if @GNULIB_WMEMPCPY@
697# if !@HAVE_WMEMPCPY@ 953# if @REPLACE_WMEMPCPY@
954# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
955# undef wmempcpy
956# define wmempcpy rpl_wmempcpy
957# endif
958_GL_FUNCDECL_RPL (wmempcpy, wchar_t *,
959 (wchar_t *restrict dest,
960 const wchar_t *restrict src, size_t n));
961_GL_CXXALIAS_RPL (wmempcpy, wchar_t *,
962 (wchar_t *restrict dest,
963 const wchar_t *restrict src, size_t n));
964# else
965# if !@HAVE_WMEMPCPY@
698_GL_FUNCDECL_SYS (wmempcpy, wchar_t *, 966_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
699 (wchar_t *restrict dest, 967 (wchar_t *restrict dest,
700 const wchar_t *restrict src, size_t n)); 968 const wchar_t *restrict src, size_t n));
701# endif 969# endif
702_GL_CXXALIAS_SYS (wmempcpy, wchar_t *, 970_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
703 (wchar_t *restrict dest, 971 (wchar_t *restrict dest,
704 const wchar_t *restrict src, size_t n)); 972 const wchar_t *restrict src, size_t n));
973# endif
705# if __GLIBC__ >= 2 974# if __GLIBC__ >= 2
706_GL_CXXALIASWARN (wmempcpy); 975_GL_CXXALIASWARN (wmempcpy);
707# endif 976# endif
@@ -901,11 +1170,21 @@ _GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - "
901 1170
902/* Compare S1 and S2. */ 1171/* Compare S1 and S2. */
903#if @GNULIB_WCSCMP@ 1172#if @GNULIB_WCSCMP@
904# if !@HAVE_WCSCMP@ 1173# if @REPLACE_WCSCMP@
1174# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1175# undef wcscmp
1176# define wcscmp rpl_wcscmp
1177# endif
1178_GL_FUNCDECL_RPL (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)
1179 _GL_ATTRIBUTE_PURE);
1180_GL_CXXALIAS_RPL (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
1181# else
1182# if !@HAVE_WCSCMP@
905_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2) 1183_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)
906 _GL_ATTRIBUTE_PURE); 1184 _GL_ATTRIBUTE_PURE);
907# endif 1185# endif
908_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)); 1186_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
1187# endif
909# if __GLIBC__ >= 2 1188# if __GLIBC__ >= 2
910_GL_CXXALIASWARN (wcscmp); 1189_GL_CXXALIASWARN (wcscmp);
911# endif 1190# endif
@@ -920,13 +1199,25 @@ _GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - "
920 1199
921/* Compare no more than N wide characters of S1 and S2. */ 1200/* Compare no more than N wide characters of S1 and S2. */
922#if @GNULIB_WCSNCMP@ 1201#if @GNULIB_WCSNCMP@
923# if !@HAVE_WCSNCMP@ 1202# if @REPLACE_WCSNCMP@
1203# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1204# undef wcsncmp
1205# define wcsncmp rpl_wcsncmp
1206# endif
1207_GL_FUNCDECL_RPL (wcsncmp, int,
1208 (const wchar_t *s1, const wchar_t *s2, size_t n)
1209 _GL_ATTRIBUTE_PURE);
1210_GL_CXXALIAS_RPL (wcsncmp, int,
1211 (const wchar_t *s1, const wchar_t *s2, size_t n));
1212# else
1213# if !@HAVE_WCSNCMP@
924_GL_FUNCDECL_SYS (wcsncmp, int, 1214_GL_FUNCDECL_SYS (wcsncmp, int,
925 (const wchar_t *s1, const wchar_t *s2, size_t n) 1215 (const wchar_t *s1, const wchar_t *s2, size_t n)
926 _GL_ATTRIBUTE_PURE); 1216 _GL_ATTRIBUTE_PURE);
927# endif 1217# endif
928_GL_CXXALIAS_SYS (wcsncmp, int, 1218_GL_CXXALIAS_SYS (wcsncmp, int,
929 (const wchar_t *s1, const wchar_t *s2, size_t n)); 1219 (const wchar_t *s1, const wchar_t *s2, size_t n));
1220# endif
930# if __GLIBC__ >= 2 1221# if __GLIBC__ >= 2
931_GL_CXXALIASWARN (wcsncmp); 1222_GL_CXXALIASWARN (wcsncmp);
932# endif 1223# endif
@@ -1035,9 +1326,16 @@ _GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
1035 namespace, not in the global namespace. So, force a declaration in 1326 namespace, not in the global namespace. So, force a declaration in
1036 the global namespace. */ 1327 the global namespace. */
1037# if !@HAVE_WCSDUP@ || (defined __sun && defined __cplusplus) || __GNUC__ >= 11 1328# if !@HAVE_WCSDUP@ || (defined __sun && defined __cplusplus) || __GNUC__ >= 11
1329# if __GLIBC__ + (__GLIBC_MINOR__ >= 2) > 2
1330_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1331 (const wchar_t *s)
1332 _GL_ATTRIBUTE_NOTHROW
1333 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1334# else
1038_GL_FUNCDECL_SYS (wcsdup, wchar_t *, 1335_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1039 (const wchar_t *s) 1336 (const wchar_t *s)
1040 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE); 1337 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1338# endif
1041# endif 1339# endif
1042_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s)); 1340_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
1043# endif 1341# endif
@@ -1045,9 +1343,16 @@ _GL_CXXALIASWARN (wcsdup);
1045#else 1343#else
1046# if __GNUC__ >= 11 && !defined wcsdup 1344# if __GNUC__ >= 11 && !defined wcsdup
1047/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free. */ 1345/* For -Wmismatched-dealloc: Associate wcsdup with free or rpl_free. */
1346# if __GLIBC__ + (__GLIBC_MINOR__ >= 2) > 2
1048_GL_FUNCDECL_SYS (wcsdup, wchar_t *, 1347_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1049 (const wchar_t *s) 1348 (const wchar_t *s)
1349 _GL_ATTRIBUTE_NOTHROW
1050 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE); 1350 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1351# else
1352_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1353 (const wchar_t *s)
1354 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1355# endif
1051# endif 1356# endif
1052# if defined GNULIB_POSIXCHECK 1357# if defined GNULIB_POSIXCHECK
1053# undef wcsdup 1358# undef wcsdup
@@ -1066,9 +1371,16 @@ _GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
1066# endif 1371# endif
1067_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s)); 1372_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
1068# else 1373# else
1374# if __GLIBC__ + (__GLIBC_MINOR__ >= 2) > 2
1069_GL_FUNCDECL_SYS (wcsdup, wchar_t *, 1375_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1070 (const wchar_t *s) 1376 (const wchar_t *s)
1377 _GL_ATTRIBUTE_NOTHROW
1071 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE); 1378 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1379# else
1380_GL_FUNCDECL_SYS (wcsdup, wchar_t *,
1381 (const wchar_t *s)
1382 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
1383# endif
1072# if @HAVE_DECL_WCSDUP@ 1384# if @HAVE_DECL_WCSDUP@
1073_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s)); 1385_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
1074# endif 1386# endif
@@ -1140,7 +1452,7 @@ _GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - "
1140#endif 1452#endif
1141 1453
1142 1454
1143/* Return the length of the initial segmet of WCS which consists entirely 1455/* Return the length of the initial segment of WCS which consists entirely
1144 of wide characters not in REJECT. */ 1456 of wide characters not in REJECT. */
1145#if @GNULIB_WCSCSPN@ 1457#if @GNULIB_WCSCSPN@
1146# if !@HAVE_WCSCSPN@ 1458# if !@HAVE_WCSCSPN@
@@ -1160,7 +1472,7 @@ _GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - "
1160#endif 1472#endif
1161 1473
1162 1474
1163/* Return the length of the initial segmet of WCS which consists entirely 1475/* Return the length of the initial segment of WCS which consists entirely
1164 of wide characters in ACCEPT. */ 1476 of wide characters in ACCEPT. */
1165#if @GNULIB_WCSSPN@ 1477#if @GNULIB_WCSSPN@
1166# if !@HAVE_WCSSPN@ 1478# if !@HAVE_WCSSPN@
@@ -1215,12 +1527,25 @@ _GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - "
1215 1527
1216/* Find the first occurrence of NEEDLE in HAYSTACK. */ 1528/* Find the first occurrence of NEEDLE in HAYSTACK. */
1217#if @GNULIB_WCSSTR@ 1529#if @GNULIB_WCSSTR@
1218# if !@HAVE_WCSSTR@ 1530# if @REPLACE_WCSSTR@
1531# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
1532# undef wcsstr
1533# define wcsstr rpl_wcsstr
1534# endif
1535_GL_FUNCDECL_RPL (wcsstr, wchar_t *,
1536 (const wchar_t *restrict haystack,
1537 const wchar_t *restrict needle)
1538 _GL_ATTRIBUTE_PURE);
1539_GL_CXXALIAS_RPL (wcsstr, wchar_t *,
1540 (const wchar_t *restrict haystack,
1541 const wchar_t *restrict needle));
1542# else
1543# if !@HAVE_WCSSTR@
1219_GL_FUNCDECL_SYS (wcsstr, wchar_t *, 1544_GL_FUNCDECL_SYS (wcsstr, wchar_t *,
1220 (const wchar_t *restrict haystack, 1545 (const wchar_t *restrict haystack,
1221 const wchar_t *restrict needle) 1546 const wchar_t *restrict needle)
1222 _GL_ATTRIBUTE_PURE); 1547 _GL_ATTRIBUTE_PURE);
1223# endif 1548# endif
1224 /* On some systems, this function is defined as an overloaded function: 1549 /* On some systems, this function is defined as an overloaded function:
1225 extern "C++" { 1550 extern "C++" {
1226 const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *); 1551 const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *);
@@ -1231,6 +1556,7 @@ _GL_CXXALIAS_SYS_CAST2 (wcsstr,
1231 (const wchar_t *restrict, const wchar_t *restrict), 1556 (const wchar_t *restrict, const wchar_t *restrict),
1232 const wchar_t *, 1557 const wchar_t *,
1233 (const wchar_t *restrict, const wchar_t *restrict)); 1558 (const wchar_t *restrict, const wchar_t *restrict));
1559# endif
1234# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \ 1560# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
1235 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) 1561 && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
1236_GL_CXXALIASWARN1 (wcsstr, wchar_t *, 1562_GL_CXXALIASWARN1 (wcsstr, wchar_t *,
@@ -1358,6 +1684,24 @@ _GL_WARN_ON_USE (wcsftime, "wcsftime is unportable - "
1358#endif 1684#endif
1359 1685
1360 1686
1687#if @GNULIB_WGETCWD@ && (defined _WIN32 && !defined __CYGWIN__)
1688/* Gets the name of the current working directory.
1689 (a) If BUF is non-NULL, it is assumed to have room for SIZE wide characters.
1690 This function stores the working directory (NUL-terminated) in BUF and
1691 returns BUF.
1692 (b) If BUF is NULL, an array is allocated with 'malloc'. The array is SIZE
1693 wide characters long, unless SIZE == 0, in which case it is as big as
1694 necessary.
1695 If the directory couldn't be determined or SIZE was too small, this function
1696 returns NULL and sets errno. For a directory of length LEN, SIZE should be
1697 >= LEN + 3 in case (a) or >= LEN + 1 in case (b).
1698 Possible errno values include:
1699 - ERANGE if SIZE is too small.
1700 - ENOMEM if the memory could no be allocated. */
1701_GL_FUNCDECL_SYS (wgetcwd, wchar_t *, (wchar_t *buf, size_t size));
1702#endif
1703
1704
1361#endif /* _@GUARD_PREFIX@_WCHAR_H */ 1705#endif /* _@GUARD_PREFIX@_WCHAR_H */
1362#endif /* _@GUARD_PREFIX@_WCHAR_H */ 1706#endif /* _@GUARD_PREFIX@_WCHAR_H */
1363#endif 1707#endif