1 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
2 
3    Copyright (C) 2006-2020 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, see <https://www.gnu.org/licenses/>.  */
17 
18 /* Written by Bruno Haible and Paul Eggert.  */
19 
20 /*
21  * ISO C 99 <wctype.h> for platforms that lack it.
22  * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wctype.h.html>
23  *
24  * iswctype, towctrans, towlower, towupper, wctrans, wctype,
25  * wctrans_t, and wctype_t are not yet implemented.
26  */
27 
28 #if __GNUC__ >= 3
29 @PRAGMA_SYSTEM_HEADER@
30 #endif
31 @PRAGMA_COLUMNS@
32 
33 #if (defined __MINGW32__ && defined __CTYPE_H_SOURCED__)
34 
35 /* Special invocation convention:
36    - With MinGW 3.22, when <ctype.h> includes <wctype.h>, only some part of
37      <wctype.h> is being processed, which doesn't include the idempotency
38      guard.   */
39 
40 #@INCLUDE_NEXT@ @NEXT_WCTYPE_H@
41 
42 #else
43 /* Normal invocation convention.  */
44 
45 #ifndef _@GUARD_PREFIX@_WCTYPE_H
46 
47 #if @HAVE_WINT_T@
48 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
49    Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
50    <wchar.h>.
51    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
52    included before <wchar.h>.  */
53 # include <stddef.h>
54 # include <stdio.h>
55 # include <time.h>
56 # include <wchar.h>
57 #endif
58 
59 /* Native Windows (mingw, MSVC) have declarations of towupper, towlower, and
60    isw* functions in <ctype.h>, <wchar.h> as well as in <wctype.h>.  Include
61    <ctype.h>, <wchar.h> in advance to avoid rpl_ prefix being added to the
62    declarations.  */
63 #if defined _WIN32 && ! defined __CYGWIN__
64 # include <ctype.h>
65 # include <wchar.h>
66 #endif
67 
68 /* Include the original <wctype.h> if it exists.
69    BeOS 5 has the functions but no <wctype.h>.  */
70 /* The include_next requires a split double-inclusion guard.  */
71 #if @HAVE_WCTYPE_H@
72 # @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
73 #endif
74 
75 #ifndef _@GUARD_PREFIX@_WCTYPE_H
76 #define _@GUARD_PREFIX@_WCTYPE_H
77 
78 #ifndef _GL_INLINE_HEADER_BEGIN
79  #error "Please include config.h first."
80 #endif
81 _GL_INLINE_HEADER_BEGIN
82 #ifndef _GL_WCTYPE_INLINE
83 # define _GL_WCTYPE_INLINE _GL_INLINE
84 #endif
85 
86 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
87 
88 /* The definition of _GL_WARN_ON_USE is copied here.  */
89 
90 /* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
91    #defines a number of identifiers in the application namespace.  Revert
92    these #defines.  */
93 #ifdef __sun
94 # undef multibyte
95 # undef eucw1
96 # undef eucw2
97 # undef eucw3
98 # undef scrw1
99 # undef scrw2
100 # undef scrw3
101 #endif
102 
103 /* Define wint_t and WEOF.  (Also done in wchar.in.h.)  */
104 #if !@HAVE_WINT_T@ && !defined wint_t
105 # define wint_t int
106 # ifndef WEOF
107 #  define WEOF -1
108 # endif
109 #else
110 /* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
111    <stddef.h>.  This is too small: ISO C 99 section 7.24.1.(2) says that
112    wint_t must be "unchanged by default argument promotions".  Override it.  */
113 # if @GNULIB_OVERRIDES_WINT_T@
114 #  if !GNULIB_defined_wint_t
115 #   if @HAVE_CRTDEFS_H@
116 #    include <crtdefs.h>
117 #   else
118 #    include <stddef.h>
119 #   endif
120 typedef unsigned int rpl_wint_t;
121 #   undef wint_t
122 #   define wint_t rpl_wint_t
123 #   define GNULIB_defined_wint_t 1
124 #  endif
125 # endif
126 # ifndef WEOF
127 #  define WEOF ((wint_t) -1)
128 # endif
129 #endif
130 
131 
132 #if !GNULIB_defined_wctype_functions
133 
134 /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
135    Linux libc5 has <wctype.h> and the functions but they are broken.
136    mingw and MSVC have <wctype.h> and the functions but they take a wchar_t
137    as argument, not an rpl_wint_t.
138    Assume all 11 functions (all isw* except iswblank) are implemented the
139    same way, or not at all.  */
140 # if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
141 
142 #  if @GNULIB_OVERRIDES_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
143 
144 _GL_WCTYPE_INLINE int
145 rpl_iswalnum (wint_t wc)
146 {
147   return ((wchar_t) wc == wc ? iswalnum ((wchar_t) wc) : 0);
148 }
149 
150 _GL_WCTYPE_INLINE int
151 rpl_iswalpha (wint_t wc)
152 {
153   return ((wchar_t) wc == wc ? iswalpha ((wchar_t) wc) : 0);
154 }
155 
156 _GL_WCTYPE_INLINE int
157 rpl_iswblank (wint_t wc)
158 {
159   return ((wchar_t) wc == wc ? iswblank ((wchar_t) wc) : 0);
160 }
161 
162 _GL_WCTYPE_INLINE int
163 rpl_iswcntrl (wint_t wc)
164 {
165   return ((wchar_t) wc == wc ? iswcntrl ((wchar_t) wc) : 0);
166 }
167 
168 _GL_WCTYPE_INLINE int
169 rpl_iswdigit (wint_t wc)
170 {
171   return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
172 }
173 
174 _GL_WCTYPE_INLINE int
175 rpl_iswgraph (wint_t wc)
176 {
177   return ((wchar_t) wc == wc ? iswgraph ((wchar_t) wc) : 0);
178 }
179 
180 _GL_WCTYPE_INLINE int
181 rpl_iswlower (wint_t wc)
182 {
183   return ((wchar_t) wc == wc ? iswlower ((wchar_t) wc) : 0);
184 }
185 
186 _GL_WCTYPE_INLINE int
187 rpl_iswprint (wint_t wc)
188 {
189   return ((wchar_t) wc == wc ? iswprint ((wchar_t) wc) : 0);
190 }
191 
192 _GL_WCTYPE_INLINE int
193 rpl_iswpunct (wint_t wc)
194 {
195   return ((wchar_t) wc == wc ? iswpunct ((wchar_t) wc) : 0);
196 }
197 
198 _GL_WCTYPE_INLINE int
199 rpl_iswspace (wint_t wc)
200 {
201   return ((wchar_t) wc == wc ? iswspace ((wchar_t) wc) : 0);
202 }
203 
204 _GL_WCTYPE_INLINE int
205 rpl_iswupper (wint_t wc)
206 {
207   return ((wchar_t) wc == wc ? iswupper ((wchar_t) wc) : 0);
208 }
209 
210 _GL_WCTYPE_INLINE int
211 rpl_iswxdigit (wint_t wc)
212 {
213   return ((wchar_t) wc == wc
214           ? (wc >= '0' && wc <= '9')
215             || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
216           : 0);
217 }
218 
219 _GL_WCTYPE_INLINE wint_t
220 rpl_towlower (wint_t wc)
221 {
222   return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc);
223 }
224 
225 _GL_WCTYPE_INLINE wint_t
226 rpl_towupper (wint_t wc)
227 {
228   return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc);
229 }
230 
231 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
232 #    undef iswalnum
233 #    undef iswalpha
234 #    undef iswblank
235 #    undef iswcntrl
236 #    undef iswdigit
237 #    undef iswgraph
238 #    undef iswlower
239 #    undef iswprint
240 #    undef iswpunct
241 #    undef iswspace
242 #    undef iswupper
243 #    undef iswxdigit
244 #    undef towlower
245 #    undef towupper
246 #    define iswalnum rpl_iswalnum
247 #    define iswalpha rpl_iswalpha
248 #    define iswblank rpl_iswblank
249 #    define iswcntrl rpl_iswcntrl
250 #    define iswdigit rpl_iswdigit
251 #    define iswgraph rpl_iswgraph
252 #    define iswlower rpl_iswlower
253 #    define iswprint rpl_iswprint
254 #    define iswpunct rpl_iswpunct
255 #    define iswspace rpl_iswspace
256 #    define iswupper rpl_iswupper
257 #    define iswxdigit rpl_iswxdigit
258 #    define towlower rpl_towlower
259 #    define towupper rpl_towupper
260 #   endif
261 
262 #  else
263 
264 /* IRIX 5.3 has macros but no functions, its isw* macros refer to an
265    undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
266    refer to system functions like _iswctype that are not in the
267    standard C library.  Rather than try to get ancient buggy
268    implementations like this to work, just disable them.  */
269 #   undef iswalnum
270 #   undef iswalpha
271 #   undef iswblank
272 #   undef iswcntrl
273 #   undef iswdigit
274 #   undef iswgraph
275 #   undef iswlower
276 #   undef iswprint
277 #   undef iswpunct
278 #   undef iswspace
279 #   undef iswupper
280 #   undef iswxdigit
281 #   undef towlower
282 #   undef towupper
283 
284 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
285 #   if @REPLACE_ISWCNTRL@
286 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
287 #     define iswalnum rpl_iswalnum
288 #     define iswalpha rpl_iswalpha
289 #     define iswblank rpl_iswblank
290 #     define iswcntrl rpl_iswcntrl
291 #     define iswdigit rpl_iswdigit
292 #     define iswgraph rpl_iswgraph
293 #     define iswlower rpl_iswlower
294 #     define iswprint rpl_iswprint
295 #     define iswpunct rpl_iswpunct
296 #     define iswspace rpl_iswspace
297 #     define iswupper rpl_iswupper
298 #     define iswxdigit rpl_iswxdigit
299 #    endif
300 #   endif
301 #   if @REPLACE_TOWLOWER@
302 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
303 #     define towlower rpl_towlower
304 #     define towupper rpl_towupper
305 #    endif
306 #   endif
307 
308 _GL_WCTYPE_INLINE int
309 #   if @REPLACE_ISWCNTRL@
310 rpl_iswalnum
311 #   else
312 iswalnum
313 #   endif
314          (wint_t wc)
315 {
316   return ((wc >= '0' && wc <= '9')
317           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
318 }
319 
320 _GL_WCTYPE_INLINE int
321 #   if @REPLACE_ISWCNTRL@
322 rpl_iswalpha
323 #   else
324 iswalpha
325 #   endif
326          (wint_t wc)
327 {
328   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
329 }
330 
331 _GL_WCTYPE_INLINE int
332 #   if @REPLACE_ISWCNTRL@
333 rpl_iswblank
334 #   else
335 iswblank
336 #   endif
337          (wint_t wc)
338 {
339   return wc == ' ' || wc == '\t';
340 }
341 
342 _GL_WCTYPE_INLINE int
343 #   if @REPLACE_ISWCNTRL@
344 rpl_iswcntrl
345 #   else
346 iswcntrl
347 #   endif
348         (wint_t wc)
349 {
350   return (wc & ~0x1f) == 0 || wc == 0x7f;
351 }
352 
353 _GL_WCTYPE_INLINE int
354 #   if @REPLACE_ISWDIGIT@
355 rpl_iswdigit
356 #   else
357 iswdigit
358 #   endif
359          (wint_t wc)
360 {
361   return wc >= '0' && wc <= '9';
362 }
363 
364 _GL_WCTYPE_INLINE int
365 #   if @REPLACE_ISWCNTRL@
366 rpl_iswgraph
367 #   else
368 iswgraph
369 #   endif
370          (wint_t wc)
371 {
372   return wc >= '!' && wc <= '~';
373 }
374 
375 _GL_WCTYPE_INLINE int
376 #   if @REPLACE_ISWCNTRL@
377 rpl_iswlower
378 #   else
379 iswlower
380 #   endif
381          (wint_t wc)
382 {
383   return wc >= 'a' && wc <= 'z';
384 }
385 
386 _GL_WCTYPE_INLINE int
387 #   if @REPLACE_ISWCNTRL@
388 rpl_iswprint
389 #   else
390 iswprint
391 #   endif
392          (wint_t wc)
393 {
394   return wc >= ' ' && wc <= '~';
395 }
396 
397 _GL_WCTYPE_INLINE int
398 #   if @REPLACE_ISWCNTRL@
399 rpl_iswpunct
400 #   else
401 iswpunct
402 #   endif
403          (wint_t wc)
404 {
405   return (wc >= '!' && wc <= '~'
406           && !((wc >= '0' && wc <= '9')
407                || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
408 }
409 
410 _GL_WCTYPE_INLINE int
411 #   if @REPLACE_ISWCNTRL@
412 rpl_iswspace
413 #   else
414 iswspace
415 #   endif
416          (wint_t wc)
417 {
418   return (wc == ' ' || wc == '\t'
419           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
420 }
421 
422 _GL_WCTYPE_INLINE int
423 #   if @REPLACE_ISWCNTRL@
424 rpl_iswupper
425 #   else
426 iswupper
427 #   endif
428          (wint_t wc)
429 {
430   return wc >= 'A' && wc <= 'Z';
431 }
432 
433 _GL_WCTYPE_INLINE int
434 #   if @REPLACE_ISWXDIGIT@
435 rpl_iswxdigit
436 #   else
437 iswxdigit
438 #   endif
439           (wint_t wc)
440 {
441   return ((wc >= '0' && wc <= '9')
442           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
443 }
444 
445 _GL_WCTYPE_INLINE wint_t
446 #   if @REPLACE_TOWLOWER@
447 rpl_towlower
448 #   else
449 towlower
450 #   endif
451          (wint_t wc)
452 {
453   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
454 }
455 
456 _GL_WCTYPE_INLINE wint_t
457 #   if @REPLACE_TOWLOWER@
458 rpl_towupper
459 #   else
460 towupper
461 #   endif
462          (wint_t wc)
463 {
464   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
465 }
466 
467 #  endif
468 
469 # else
470 /* Only some of the functions are missing or broken.  */
471 
472 #  if @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
473 /* Only the iswblank function is missing.  */
474 #   if @REPLACE_ISWBLANK@
475 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
476 #     define iswblank rpl_iswblank
477 #    endif
478 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
479 #   else
480 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
481 #   endif
482 #  endif
483 
484 #  if @GNULIB_ISWDIGIT@
485 #   if @REPLACE_ISWDIGIT@
486 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
487 #     undef iswdigit
488 #     define iswdigit rpl_iswdigit
489 #    endif
490 _GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
491 #   endif
492 #  endif
493 
494 #  if @GNULIB_ISWXDIGIT@
495 #   if @REPLACE_ISWXDIGIT@
496 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
497 #     undef iswxdigit
498 #     define iswxdigit rpl_iswxdigit
499 #    endif
500 _GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
501 #   endif
502 #  endif
503 
504 # endif
505 
506 # if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@
507 
508 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
509    The functions towlower and towupper are implemented in the MSVCRT library
510    to take a wchar_t argument and return a wchar_t result.  mingw declares
511    these functions to take a wint_t argument and return a wint_t result.
512    This means that:
513    1. When the user passes an argument outside the range 0x0000..0xFFFF, the
514       function will look only at the lower 16 bits.  This is allowed according
515       to POSIX.
516    2. The return value is returned in the lower 16 bits of the result register.
517       The upper 16 bits are random: whatever happened to be in that part of the
518       result register.  We need to fix this by adding a zero-extend from
519       wchar_t to wint_t after the call.  */
520 
521 _GL_WCTYPE_INLINE wint_t
522 rpl_towlower (wint_t wc)
523 {
524   return (wint_t) (wchar_t) towlower (wc);
525 }
526 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
527 #   define towlower rpl_towlower
528 #  endif
529 
530 _GL_WCTYPE_INLINE wint_t
531 rpl_towupper (wint_t wc)
532 {
533   return (wint_t) (wchar_t) towupper (wc);
534 }
535 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
536 #   define towupper rpl_towupper
537 #  endif
538 
539 # endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */
540 
541 # define GNULIB_defined_wctype_functions 1
542 #endif
543 
544 #if @REPLACE_ISWCNTRL@
545 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
546 #else
547 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
548 #endif
549 #if @REPLACE_ISWCNTRL@
550 _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
551 #else
552 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
553 #endif
554 #if @REPLACE_ISWCNTRL@
555 _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
556 #else
557 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
558 #endif
559 #if @GNULIB_ISWDIGIT@
560 # if @REPLACE_ISWDIGIT@
561 _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
562 # else
563 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
564 # endif
565 #endif
566 #if @REPLACE_ISWCNTRL@
567 _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
568 #else
569 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
570 #endif
571 #if @REPLACE_ISWCNTRL@
572 _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
573 #else
574 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
575 #endif
576 #if @REPLACE_ISWCNTRL@
577 _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
578 #else
579 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
580 #endif
581 #if @REPLACE_ISWCNTRL@
582 _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
583 #else
584 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
585 #endif
586 #if @REPLACE_ISWCNTRL@
587 _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
588 #else
589 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
590 #endif
591 #if @REPLACE_ISWCNTRL@
592 _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
593 #else
594 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
595 #endif
596 #if @GNULIB_ISWXDIGIT@
597 # if @REPLACE_ISWXDIGIT@
598 _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
599 # else
600 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
601 # endif
602 #endif
603 #if __GLIBC__ >= 2
604 _GL_CXXALIASWARN (iswalnum);
605 _GL_CXXALIASWARN (iswalpha);
606 _GL_CXXALIASWARN (iswcntrl);
607 _GL_CXXALIASWARN (iswdigit);
608 _GL_CXXALIASWARN (iswgraph);
609 _GL_CXXALIASWARN (iswlower);
610 _GL_CXXALIASWARN (iswprint);
611 _GL_CXXALIASWARN (iswpunct);
612 _GL_CXXALIASWARN (iswspace);
613 _GL_CXXALIASWARN (iswupper);
614 _GL_CXXALIASWARN (iswxdigit);
615 #endif
616 
617 #if @GNULIB_ISWBLANK@
618 # if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
619 _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
620 # else
621 _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
622 # endif
623 # if __GLIBC__ >= 2
624 _GL_CXXALIASWARN (iswblank);
625 # endif
626 #endif
627 
628 #if !@HAVE_WCTYPE_T@
629 # if !GNULIB_defined_wctype_t
630 typedef void * wctype_t;
631 #  define GNULIB_defined_wctype_t 1
632 # endif
633 #endif
634 
635 /* Get a descriptor for a wide character property.  */
636 #if @GNULIB_WCTYPE@
637 # if !@HAVE_WCTYPE_T@
638 _GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
639 # endif
640 _GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
641 # if __GLIBC__ >= 2
642 _GL_CXXALIASWARN (wctype);
643 # endif
644 #elif defined GNULIB_POSIXCHECK
645 # undef wctype
646 # if HAVE_RAW_DECL_WCTYPE
647 _GL_WARN_ON_USE (wctype, "wctype is unportable - "
648                  "use gnulib module wctype for portability");
649 # endif
650 #endif
651 
652 /* Test whether a wide character has a given property.
653    The argument WC must be either a wchar_t value or WEOF.
654    The argument DESC must have been returned by the wctype() function.  */
655 #if @GNULIB_ISWCTYPE@
656 # if @GNULIB_OVERRIDES_WINT_T@
657 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
658 #   undef iswctype
659 #   define iswctype rpl_iswctype
660 #  endif
661 _GL_FUNCDECL_RPL (iswctype, int, (wint_t wc, wctype_t desc));
662 _GL_CXXALIAS_RPL (iswctype, int, (wint_t wc, wctype_t desc));
663 # else
664 #  if !@HAVE_WCTYPE_T@
665 _GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
666 #  endif
667 _GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
668 # endif
669 # if __GLIBC__ >= 2
670 _GL_CXXALIASWARN (iswctype);
671 # endif
672 #elif defined GNULIB_POSIXCHECK
673 # undef iswctype
674 # if HAVE_RAW_DECL_ISWCTYPE
675 _GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
676                  "use gnulib module iswctype for portability");
677 # endif
678 #endif
679 
680 #if @REPLACE_TOWLOWER@ || defined __MINGW32__
681 _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
682 _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
683 #else
684 _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
685 _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
686 #endif
687 #if __GLIBC__ >= 2
688 _GL_CXXALIASWARN (towlower);
689 _GL_CXXALIASWARN (towupper);
690 #endif
691 
692 #if !@HAVE_WCTRANS_T@
693 # if !GNULIB_defined_wctrans_t
694 typedef void * wctrans_t;
695 #  define GNULIB_defined_wctrans_t 1
696 # endif
697 #endif
698 
699 /* Get a descriptor for a wide character case conversion.  */
700 #if @GNULIB_WCTRANS@
701 # if !@HAVE_WCTRANS_T@
702 _GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
703 # endif
704 _GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
705 # if __GLIBC__ >= 2
706 _GL_CXXALIASWARN (wctrans);
707 # endif
708 #elif defined GNULIB_POSIXCHECK
709 # undef wctrans
710 # if HAVE_RAW_DECL_WCTRANS
711 _GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
712                  "use gnulib module wctrans for portability");
713 # endif
714 #endif
715 
716 /* Perform a given case conversion on a wide character.
717    The argument WC must be either a wchar_t value or WEOF.
718    The argument DESC must have been returned by the wctrans() function.  */
719 #if @GNULIB_TOWCTRANS@
720 # if !@HAVE_WCTRANS_T@
721 _GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
722 # endif
723 _GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
724 # if __GLIBC__ >= 2
725 _GL_CXXALIASWARN (towctrans);
726 # endif
727 #elif defined GNULIB_POSIXCHECK
728 # undef towctrans
729 # if HAVE_RAW_DECL_TOWCTRANS
730 _GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
731                  "use gnulib module towctrans for portability");
732 # endif
733 #endif
734 
735 _GL_INLINE_HEADER_END
736 
737 #endif /* _@GUARD_PREFIX@_WCTYPE_H */
738 #endif /* _@GUARD_PREFIX@_WCTYPE_H */
739 #endif
740