Imported Upstream version 1.3.14
[debian/gzip] / lib / wctype.in.h
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
4
5    Copyright (C) 2006-2009 Free Software Foundation, Inc.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software Foundation,
19    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
20
21 /* Written by Bruno Haible and Paul Eggert.  */
22
23 /*
24  * ISO C 99 <wctype.h> for platforms that lack it.
25  * <http://www.opengroup.org/susv3xbd/wctype.h.html>
26  *
27  * iswctype, towctrans, towlower, towupper, wctrans, wctype,
28  * wctrans_t, and wctype_t are not yet implemented.
29  */
30
31 #ifndef _GL_WCTYPE_H
32
33 #if __GNUC__ >= 3
34 @PRAGMA_SYSTEM_HEADER@
35 #endif
36
37 #if @HAVE_WINT_T@
38 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
39    Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
40    <wchar.h>.
41    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
42    included before <wchar.h>.  */
43 # include <stddef.h>
44 # include <stdio.h>
45 # include <time.h>
46 # include <wchar.h>
47 #endif
48
49 /* Include the original <wctype.h> if it exists.
50    BeOS 5 has the functions but no <wctype.h>.  */
51 /* The include_next requires a split double-inclusion guard.  */
52 #if @HAVE_WCTYPE_H@
53 # @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
54 #endif
55
56 #ifndef _GL_WCTYPE_H
57 #define _GL_WCTYPE_H
58
59 /* Define wint_t.  (Also done in wchar.in.h.)  */
60 #if !@HAVE_WINT_T@ && !defined wint_t
61 # define wint_t int
62 # ifndef WEOF
63 #  define WEOF -1
64 # endif
65 #endif
66
67 /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
68    Linux libc5 has <wctype.h> and the functions but they are broken.
69    Assume all 12 functions are implemented the same way, or not at all.  */
70 #if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
71
72 /* IRIX 5.3 has macros but no functions, its isw* macros refer to an
73    undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
74    refer to system functions like _iswctype that are not in the
75    standard C library.  Rather than try to get ancient buggy
76    implementations like this to work, just disable them.  */
77 #  undef iswalnum
78 #  undef iswalpha
79 #  undef iswblank
80 #  undef iswcntrl
81 #  undef iswdigit
82 #  undef iswgraph
83 #  undef iswlower
84 #  undef iswprint
85 #  undef iswpunct
86 #  undef iswspace
87 #  undef iswupper
88 #  undef iswxdigit
89 #  undef towlower
90 #  undef towupper
91
92 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
93 #  if @REPLACE_ISWCNTRL@
94 #   define iswalnum rpl_iswalnum
95 #   define iswalpha rpl_iswalpha
96 #   define iswblank rpl_iswblank
97 #   define iswcntrl rpl_iswcntrl
98 #   define iswdigit rpl_iswdigit
99 #   define iswgraph rpl_iswgraph
100 #   define iswlower rpl_iswlower
101 #   define iswprint rpl_iswprint
102 #   define iswpunct rpl_iswpunct
103 #   define iswspace rpl_iswspace
104 #   define iswupper rpl_iswupper
105 #   define iswxdigit rpl_iswxdigit
106 #   define towlower rpl_towlower
107 #   define towupper rpl_towupper
108 #  endif
109
110 static inline int
111 iswalnum (wint_t wc)
112 {
113   return ((wc >= '0' && wc <= '9')
114           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
115 }
116
117 static inline int
118 iswalpha (wint_t wc)
119 {
120   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
121 }
122
123 static inline int
124 iswblank (wint_t wc)
125 {
126   return wc == ' ' || wc == '\t';
127 }
128
129 static inline int
130 iswcntrl (wint_t wc)
131 {
132   return (wc & ~0x1f) == 0 || wc == 0x7f;
133 }
134
135 static inline int
136 iswdigit (wint_t wc)
137 {
138   return wc >= '0' && wc <= '9';
139 }
140
141 static inline int
142 iswgraph (wint_t wc)
143 {
144   return wc >= '!' && wc <= '~';
145 }
146
147 static inline int
148 iswlower (wint_t wc)
149 {
150   return wc >= 'a' && wc <= 'z';
151 }
152
153 static inline int
154 iswprint (wint_t wc)
155 {
156   return wc >= ' ' && wc <= '~';
157 }
158
159 static inline int
160 iswpunct (wint_t wc)
161 {
162   return (wc >= '!' && wc <= '~'
163           && !((wc >= '0' && wc <= '9')
164                || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
165 }
166
167 static inline int
168 iswspace (wint_t wc)
169 {
170   return (wc == ' ' || wc == '\t'
171           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
172 }
173
174 static inline int
175 iswupper (wint_t wc)
176 {
177   return wc >= 'A' && wc <= 'Z';
178 }
179
180 static inline int
181 iswxdigit (wint_t wc)
182 {
183   return ((wc >= '0' && wc <= '9')
184           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
185 }
186
187 static inline wint_t
188 towlower (wint_t wc)
189 {
190   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
191 }
192
193 static inline wint_t
194 towupper (wint_t wc)
195 {
196   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
197 }
198
199 # endif /* ! HAVE_ISWCNTRL */
200
201 # if defined __MINGW32__
202
203 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
204    The functions towlower and towupper are implemented in the MSVCRT library
205    to take a wchar_t argument and return a wchar_t result.  mingw declares
206    these functions to take a wint_t argument and return a wint_t result.
207    This means that:
208    1. When the user passes an argument outside the range 0x0000..0xFFFF, the
209       function will look only at the lower 16 bits.  This is allowed according
210       to POSIX.
211    2. The return value is returned in the lower 16 bits of the result register.
212       The upper 16 bits are random: whatever happened to be in that part of the
213       result register.  We need to fix this by adding a zero-extend from
214       wchar_t to wint_t after the call.  */
215
216 static inline wint_t
217 rpl_towlower (wint_t wc)
218 {
219   return (wint_t) (wchar_t) towlower (wc);
220 }
221 #  define towlower rpl_towlower
222
223 static inline wint_t
224 rpl_towupper (wint_t wc)
225 {
226   return (wint_t) (wchar_t) towupper (wc);
227 }
228 #  define towupper rpl_towupper
229
230 # endif
231
232 #endif /* _GL_WCTYPE_H */
233 #endif /* _GL_WCTYPE_H */