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 ? iswdigit ((wchar_t) wc) : 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 ? iswxdigit ((wchar_t) wc) : 0);
214 }
215 
216 _GL_WCTYPE_INLINE wint_t
217 rpl_towlower (wint_t wc)
218 {
219   return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc);
220 }
221 
222 _GL_WCTYPE_INLINE wint_t
223 rpl_towupper (wint_t wc)
224 {
225   return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc);
226 }
227 
228 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
229 #    undef iswalnum
230 #    undef iswalpha
231 #    undef iswblank
232 #    undef iswcntrl
233 #    undef iswdigit
234 #    undef iswgraph
235 #    undef iswlower
236 #    undef iswprint
237 #    undef iswpunct
238 #    undef iswspace
239 #    undef iswupper
240 #    undef iswxdigit
241 #    undef towlower
242 #    undef towupper
243 #    define iswalnum rpl_iswalnum
244 #    define iswalpha rpl_iswalpha
245 #    define iswblank rpl_iswblank
246 #    define iswcntrl rpl_iswcntrl
247 #    define iswdigit rpl_iswdigit
248 #    define iswgraph rpl_iswgraph
249 #    define iswlower rpl_iswlower
250 #    define iswprint rpl_iswprint
251 #    define iswpunct rpl_iswpunct
252 #    define iswspace rpl_iswspace
253 #    define iswupper rpl_iswupper
254 #    define iswxdigit rpl_iswxdigit
255 #    define towlower rpl_towlower
256 #    define towupper rpl_towupper
257 #   endif
258 
259 #  else
260 
261 /* IRIX 5.3 has macros but no functions, its isw* macros refer to an
262    undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
263    refer to system functions like _iswctype that are not in the
264    standard C library.  Rather than try to get ancient buggy
265    implementations like this to work, just disable them.  */
266 #   undef iswalnum
267 #   undef iswalpha
268 #   undef iswblank
269 #   undef iswcntrl
270 #   undef iswdigit
271 #   undef iswgraph
272 #   undef iswlower
273 #   undef iswprint
274 #   undef iswpunct
275 #   undef iswspace
276 #   undef iswupper
277 #   undef iswxdigit
278 #   undef towlower
279 #   undef towupper
280 
281 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
282 #   if @REPLACE_ISWCNTRL@
283 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
284 #     define iswalnum rpl_iswalnum
285 #     define iswalpha rpl_iswalpha
286 #     define iswblank rpl_iswblank
287 #     define iswcntrl rpl_iswcntrl
288 #     define iswdigit rpl_iswdigit
289 #     define iswgraph rpl_iswgraph
290 #     define iswlower rpl_iswlower
291 #     define iswprint rpl_iswprint
292 #     define iswpunct rpl_iswpunct
293 #     define iswspace rpl_iswspace
294 #     define iswupper rpl_iswupper
295 #     define iswxdigit rpl_iswxdigit
296 #    endif
297 #   endif
298 #   if @REPLACE_TOWLOWER@
299 #    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
300 #     define towlower rpl_towlower
301 #     define towupper rpl_towupper
302 #    endif
303 #   endif
304 
305 _GL_WCTYPE_INLINE int
306 #   if @REPLACE_ISWCNTRL@
307 rpl_iswalnum
308 #   else
309 iswalnum
310 #   endif
311          (wint_t wc)
312 {
313   return ((wc >= '0' && wc <= '9')
314           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
315 }
316 
317 _GL_WCTYPE_INLINE int
318 #   if @REPLACE_ISWCNTRL@
319 rpl_iswalpha
320 #   else
321 iswalpha
322 #   endif
323          (wint_t wc)
324 {
325   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
326 }
327 
328 _GL_WCTYPE_INLINE int
329 #   if @REPLACE_ISWCNTRL@
330 rpl_iswblank
331 #   else
332 iswblank
333 #   endif
334          (wint_t wc)
335 {
336   return wc == ' ' || wc == '\t';
337 }
338 
339 _GL_WCTYPE_INLINE int
340 #   if @REPLACE_ISWCNTRL@
341 rpl_iswcntrl
342 #   else
343 iswcntrl
344 #   endif
345         (wint_t wc)
346 {
347   return (wc & ~0x1f) == 0 || wc == 0x7f;
348 }
349 
350 _GL_WCTYPE_INLINE int
351 #   if @REPLACE_ISWCNTRL@
352 rpl_iswdigit
353 #   else
354 iswdigit
355 #   endif
356          (wint_t wc)
357 {
358   return wc >= '0' && wc <= '9';
359 }
360 
361 _GL_WCTYPE_INLINE int
362 #   if @REPLACE_ISWCNTRL@
363 rpl_iswgraph
364 #   else
365 iswgraph
366 #   endif
367          (wint_t wc)
368 {
369   return wc >= '!' && wc <= '~';
370 }
371 
372 _GL_WCTYPE_INLINE int
373 #   if @REPLACE_ISWCNTRL@
374 rpl_iswlower
375 #   else
376 iswlower
377 #   endif
378          (wint_t wc)
379 {
380   return wc >= 'a' && wc <= 'z';
381 }
382 
383 _GL_WCTYPE_INLINE int
384 #   if @REPLACE_ISWCNTRL@
385 rpl_iswprint
386 #   else
387 iswprint
388 #   endif
389          (wint_t wc)
390 {
391   return wc >= ' ' && wc <= '~';
392 }
393 
394 _GL_WCTYPE_INLINE int
395 #   if @REPLACE_ISWCNTRL@
396 rpl_iswpunct
397 #   else
398 iswpunct
399 #   endif
400          (wint_t wc)
401 {
402   return (wc >= '!' && wc <= '~'
403           && !((wc >= '0' && wc <= '9')
404                || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
405 }
406 
407 _GL_WCTYPE_INLINE int
408 #   if @REPLACE_ISWCNTRL@
409 rpl_iswspace
410 #   else
411 iswspace
412 #   endif
413          (wint_t wc)
414 {
415   return (wc == ' ' || wc == '\t'
416           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
417 }
418 
419 _GL_WCTYPE_INLINE int
420 #   if @REPLACE_ISWCNTRL@
421 rpl_iswupper
422 #   else
423 iswupper
424 #   endif
425          (wint_t wc)
426 {
427   return wc >= 'A' && wc <= 'Z';
428 }
429 
430 _GL_WCTYPE_INLINE int
431 #   if @REPLACE_ISWCNTRL@
432 rpl_iswxdigit
433 #   else
434 iswxdigit
435 #   endif
436           (wint_t wc)
437 {
438   return ((wc >= '0' && wc <= '9')
439           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
440 }
441 
442 _GL_WCTYPE_INLINE wint_t
443 #   if @REPLACE_TOWLOWER@
444 rpl_towlower
445 #   else
446 towlower
447 #   endif
448          (wint_t wc)
449 {
450   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
451 }
452 
453 _GL_WCTYPE_INLINE wint_t
454 #   if @REPLACE_TOWLOWER@
455 rpl_towupper
456 #   else
457 towupper
458 #   endif
459          (wint_t wc)
460 {
461   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
462 }
463 
464 #  endif
465 
466 # elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
467 /* Only the iswblank function is missing.  */
468 
469 #  if @REPLACE_ISWBLANK@
470 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
471 #    define iswblank rpl_iswblank
472 #   endif
473 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
474 #  else
475 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
476 #  endif
477 
478 # endif
479 
480 # if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@
481 
482 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
483    The functions towlower and towupper are implemented in the MSVCRT library
484    to take a wchar_t argument and return a wchar_t result.  mingw declares
485    these functions to take a wint_t argument and return a wint_t result.
486    This means that:
487    1. When the user passes an argument outside the range 0x0000..0xFFFF, the
488       function will look only at the lower 16 bits.  This is allowed according
489       to POSIX.
490    2. The return value is returned in the lower 16 bits of the result register.
491       The upper 16 bits are random: whatever happened to be in that part of the
492       result register.  We need to fix this by adding a zero-extend from
493       wchar_t to wint_t after the call.  */
494 
495 _GL_WCTYPE_INLINE wint_t
496 rpl_towlower (wint_t wc)
497 {
498   return (wint_t) (wchar_t) towlower (wc);
499 }
500 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
501 #   define towlower rpl_towlower
502 #  endif
503 
504 _GL_WCTYPE_INLINE wint_t
505 rpl_towupper (wint_t wc)
506 {
507   return (wint_t) (wchar_t) towupper (wc);
508 }
509 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
510 #   define towupper rpl_towupper
511 #  endif
512 
513 # endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */
514 
515 # define GNULIB_defined_wctype_functions 1
516 #endif
517 
518 #if @REPLACE_ISWCNTRL@
519 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
520 _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
521 _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
522 _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
523 _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
524 _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
525 _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
526 _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
527 _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
528 _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
529 _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
530 #else
531 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
532 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
533 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
534 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
535 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
536 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
537 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
538 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
539 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
540 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
541 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
542 #endif
543 #if __GLIBC__ >= 2
544 _GL_CXXALIASWARN (iswalnum);
545 _GL_CXXALIASWARN (iswalpha);
546 _GL_CXXALIASWARN (iswcntrl);
547 _GL_CXXALIASWARN (iswdigit);
548 _GL_CXXALIASWARN (iswgraph);
549 _GL_CXXALIASWARN (iswlower);
550 _GL_CXXALIASWARN (iswprint);
551 _GL_CXXALIASWARN (iswpunct);
552 _GL_CXXALIASWARN (iswspace);
553 _GL_CXXALIASWARN (iswupper);
554 _GL_CXXALIASWARN (iswxdigit);
555 #endif
556 
557 #if @GNULIB_ISWBLANK@
558 # if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
559 _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
560 # else
561 _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
562 # endif
563 # if __GLIBC__ >= 2
564 _GL_CXXALIASWARN (iswblank);
565 # endif
566 #endif
567 
568 #if !@HAVE_WCTYPE_T@
569 # if !GNULIB_defined_wctype_t
570 typedef void * wctype_t;
571 #  define GNULIB_defined_wctype_t 1
572 # endif
573 #endif
574 
575 /* Get a descriptor for a wide character property.  */
576 #if @GNULIB_WCTYPE@
577 # if !@HAVE_WCTYPE_T@
578 _GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
579 # endif
580 _GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
581 # if __GLIBC__ >= 2
582 _GL_CXXALIASWARN (wctype);
583 # endif
584 #elif defined GNULIB_POSIXCHECK
585 # undef wctype
586 # if HAVE_RAW_DECL_WCTYPE
587 _GL_WARN_ON_USE (wctype, "wctype is unportable - "
588                  "use gnulib module wctype for portability");
589 # endif
590 #endif
591 
592 /* Test whether a wide character has a given property.
593    The argument WC must be either a wchar_t value or WEOF.
594    The argument DESC must have been returned by the wctype() function.  */
595 #if @GNULIB_ISWCTYPE@
596 # if @GNULIB_OVERRIDES_WINT_T@
597 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
598 #   undef iswctype
599 #   define iswctype rpl_iswctype
600 #  endif
601 _GL_FUNCDECL_RPL (iswctype, int, (wint_t wc, wctype_t desc));
602 _GL_CXXALIAS_RPL (iswctype, int, (wint_t wc, wctype_t desc));
603 # else
604 #  if !@HAVE_WCTYPE_T@
605 _GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
606 #  endif
607 _GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
608 # endif
609 # if __GLIBC__ >= 2
610 _GL_CXXALIASWARN (iswctype);
611 # endif
612 #elif defined GNULIB_POSIXCHECK
613 # undef iswctype
614 # if HAVE_RAW_DECL_ISWCTYPE
615 _GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
616                  "use gnulib module iswctype for portability");
617 # endif
618 #endif
619 
620 #if @REPLACE_TOWLOWER@ || defined __MINGW32__
621 _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
622 _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
623 #else
624 _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
625 _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
626 #endif
627 #if __GLIBC__ >= 2
628 _GL_CXXALIASWARN (towlower);
629 _GL_CXXALIASWARN (towupper);
630 #endif
631 
632 #if !@HAVE_WCTRANS_T@
633 # if !GNULIB_defined_wctrans_t
634 typedef void * wctrans_t;
635 #  define GNULIB_defined_wctrans_t 1
636 # endif
637 #endif
638 
639 /* Get a descriptor for a wide character case conversion.  */
640 #if @GNULIB_WCTRANS@
641 # if !@HAVE_WCTRANS_T@
642 _GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
643 # endif
644 _GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
645 # if __GLIBC__ >= 2
646 _GL_CXXALIASWARN (wctrans);
647 # endif
648 #elif defined GNULIB_POSIXCHECK
649 # undef wctrans
650 # if HAVE_RAW_DECL_WCTRANS
651 _GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
652                  "use gnulib module wctrans for portability");
653 # endif
654 #endif
655 
656 /* Perform a given case conversion on a wide character.
657    The argument WC must be either a wchar_t value or WEOF.
658    The argument DESC must have been returned by the wctrans() function.  */
659 #if @GNULIB_TOWCTRANS@
660 # if !@HAVE_WCTRANS_T@
661 _GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
662 # endif
663 _GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
664 # if __GLIBC__ >= 2
665 _GL_CXXALIASWARN (towctrans);
666 # endif
667 #elif defined GNULIB_POSIXCHECK
668 # undef towctrans
669 # if HAVE_RAW_DECL_TOWCTRANS
670 _GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
671                  "use gnulib module towctrans for portability");
672 # endif
673 #endif
674 
675 _GL_INLINE_HEADER_END
676 
677 #endif /* _@GUARD_PREFIX@_WCTYPE_H */
678 #endif /* _@GUARD_PREFIX@_WCTYPE_H */
679 #endif
680