1
/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
3
Copyright (C) 2006-2010 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 General Public License as published by
7
the Free Software Foundation; either version 3, 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 General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software Foundation,
17
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19
/* Written by Bruno Haible and Paul Eggert. */
22
* ISO C 99 <wctype.h> for platforms that lack it.
23
* <http://www.opengroup.org/susv3xbd/wctype.h.html>
25
* iswctype, towctrans, towlower, towupper, wctrans, wctype,
26
* wctrans_t, and wctype_t are not yet implemented.
32
@PRAGMA_SYSTEM_HEADER@
36
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
37
Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
39
BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
40
included before <wchar.h>. */
47
/* Include the original <wctype.h> if it exists.
48
BeOS 5 has the functions but no <wctype.h>. */
49
/* The include_next requires a split double-inclusion guard. */
51
# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
57
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
59
/* The definition of _GL_WARN_ON_USE is copied here. */
61
/* Define wint_t and WEOF. (Also done in wchar.in.h.) */
62
#if !@HAVE_WINT_T@ && !defined wint_t
69
# define WEOF ((wint_t) -1)
74
/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
75
Linux libc5 has <wctype.h> and the functions but they are broken.
76
Assume all 11 functions (all isw* except iswblank) are implemented the
77
same way, or not at all. */
78
#if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
80
/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
81
undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
82
refer to system functions like _iswctype that are not in the
83
standard C library. Rather than try to get ancient buggy
84
implementations like this to work, just disable them. */
100
/* Linux libc5 has <wctype.h> and the functions but they are broken. */
101
# if @REPLACE_ISWCNTRL@
102
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
103
# define iswalnum rpl_iswalnum
104
# define iswalpha rpl_iswalpha
105
# define iswblank rpl_iswblank
106
# define iswcntrl rpl_iswcntrl
107
# define iswdigit rpl_iswdigit
108
# define iswgraph rpl_iswgraph
109
# define iswlower rpl_iswlower
110
# define iswprint rpl_iswprint
111
# define iswpunct rpl_iswpunct
112
# define iswspace rpl_iswspace
113
# define iswupper rpl_iswupper
114
# define iswxdigit rpl_iswxdigit
115
# define towlower rpl_towlower
116
# define towupper rpl_towupper
121
# if @REPLACE_ISWCNTRL@
128
return ((wc >= '0' && wc <= '9')
129
|| ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
133
# if @REPLACE_ISWCNTRL@
140
return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
144
# if @REPLACE_ISWCNTRL@
151
return wc == ' ' || wc == '\t';
155
# if @REPLACE_ISWCNTRL@
162
return (wc & ~0x1f) == 0 || wc == 0x7f;
166
# if @REPLACE_ISWCNTRL@
173
return wc >= '0' && wc <= '9';
177
# if @REPLACE_ISWCNTRL@
184
return wc >= '!' && wc <= '~';
188
# if @REPLACE_ISWCNTRL@
195
return wc >= 'a' && wc <= 'z';
199
# if @REPLACE_ISWCNTRL@
206
return wc >= ' ' && wc <= '~';
210
# if @REPLACE_ISWCNTRL@
217
return (wc >= '!' && wc <= '~'
218
&& !((wc >= '0' && wc <= '9')
219
|| ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
223
# if @REPLACE_ISWCNTRL@
230
return (wc == ' ' || wc == '\t'
231
|| wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
235
# if @REPLACE_ISWCNTRL@
242
return wc >= 'A' && wc <= 'Z';
246
# if @REPLACE_ISWCNTRL@
253
return ((wc >= '0' && wc <= '9')
254
|| ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
258
# if @REPLACE_ISWCNTRL@
265
return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
269
# if @REPLACE_ISWCNTRL@
276
return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
279
#elif ! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@
280
/* Only the iswblank function is missing. */
282
# if @REPLACE_ISWBLANK@
283
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
284
# define iswblank rpl_iswblank
289
# if @REPLACE_ISWBLANK@
296
return wc == ' ' || wc == '\t';
301
#if defined __MINGW32__
303
/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
304
The functions towlower and towupper are implemented in the MSVCRT library
305
to take a wchar_t argument and return a wchar_t result. mingw declares
306
these functions to take a wint_t argument and return a wint_t result.
308
1. When the user passes an argument outside the range 0x0000..0xFFFF, the
309
function will look only at the lower 16 bits. This is allowed according
311
2. The return value is returned in the lower 16 bits of the result register.
312
The upper 16 bits are random: whatever happened to be in that part of the
313
result register. We need to fix this by adding a zero-extend from
314
wchar_t to wint_t after the call. */
317
rpl_towlower (wint_t wc)
319
return (wint_t) (wchar_t) towlower (wc);
321
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
322
# define towlower rpl_towlower
326
rpl_towupper (wint_t wc)
328
return (wint_t) (wchar_t) towupper (wc);
330
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
331
# define towupper rpl_towupper
334
#endif /* __MINGW32__ */
336
#if @REPLACE_ISWCNTRL@
337
_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
338
_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
339
_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
340
_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
341
_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
342
_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
343
_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
344
_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
345
_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
346
_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
347
_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
348
_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
350
_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
351
_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
352
# if @REPLACE_ISWBLANK@
353
_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
355
_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
357
_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
358
_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
359
_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
360
_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
361
_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
362
_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
363
_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
364
_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
365
_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
367
_GL_CXXALIASWARN (iswalnum);
368
_GL_CXXALIASWARN (iswalpha);
369
_GL_CXXALIASWARN (iswblank);
370
_GL_CXXALIASWARN (iswcntrl);
371
_GL_CXXALIASWARN (iswdigit);
372
_GL_CXXALIASWARN (iswgraph);
373
_GL_CXXALIASWARN (iswlower);
374
_GL_CXXALIASWARN (iswprint);
375
_GL_CXXALIASWARN (iswpunct);
376
_GL_CXXALIASWARN (iswspace);
377
_GL_CXXALIASWARN (iswupper);
378
_GL_CXXALIASWARN (iswxdigit);
380
#if @REPLACE_ISWCNTRL@ || defined __MINGW32__
381
_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
382
_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
384
_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
385
_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
387
_GL_CXXALIASWARN (towlower);
388
_GL_CXXALIASWARN (towupper);
391
#endif /* _GL_WCTYPE_H */
392
#endif /* _GL_WCTYPE_H */