]> git.cworth.org Git - tar/blob - gnu/wctype.in.h
Imported Upstream version 1.24
[tar] / gnu / 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-2010 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 @PRAGMA_COLUMNS@
37
38 #if @HAVE_WINT_T@
39 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
40    Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
41    <wchar.h>.
42    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
43    included before <wchar.h>.  */
44 # include <stddef.h>
45 # include <stdio.h>
46 # include <time.h>
47 # include <wchar.h>
48 #endif
49
50 /* Include the original <wctype.h> if it exists.
51    BeOS 5 has the functions but no <wctype.h>.  */
52 /* The include_next requires a split double-inclusion guard.  */
53 #if @HAVE_WCTYPE_H@
54 # @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
55 #endif
56
57 #ifndef _GL_WCTYPE_H
58 #define _GL_WCTYPE_H
59
60 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
61
62 /* The definition of _GL_WARN_ON_USE is copied here.  */
63
64 /* Define wint_t and WEOF.  (Also done in wchar.in.h.)  */
65 #if !@HAVE_WINT_T@ && !defined wint_t
66 # define wint_t int
67 # ifndef WEOF
68 #  define WEOF -1
69 # endif
70 #else
71 # ifndef WEOF
72 #  define WEOF ((wint_t) -1)
73 # endif
74 #endif
75
76
77 /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
78    Linux libc5 has <wctype.h> and the functions but they are broken.
79    Assume all 11 functions (all isw* except iswblank) are implemented the
80    same way, or not at all.  */
81 #if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
82
83 /* IRIX 5.3 has macros but no functions, its isw* macros refer to an
84    undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
85    refer to system functions like _iswctype that are not in the
86    standard C library.  Rather than try to get ancient buggy
87    implementations like this to work, just disable them.  */
88 # undef iswalnum
89 # undef iswalpha
90 # undef iswblank
91 # undef iswcntrl
92 # undef iswdigit
93 # undef iswgraph
94 # undef iswlower
95 # undef iswprint
96 # undef iswpunct
97 # undef iswspace
98 # undef iswupper
99 # undef iswxdigit
100 # undef towlower
101 # undef towupper
102
103 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
104 # if @REPLACE_ISWCNTRL@
105 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
106 #   define iswalnum rpl_iswalnum
107 #   define iswalpha rpl_iswalpha
108 #   define iswblank rpl_iswblank
109 #   define iswcntrl rpl_iswcntrl
110 #   define iswdigit rpl_iswdigit
111 #   define iswgraph rpl_iswgraph
112 #   define iswlower rpl_iswlower
113 #   define iswprint rpl_iswprint
114 #   define iswpunct rpl_iswpunct
115 #   define iswspace rpl_iswspace
116 #   define iswupper rpl_iswupper
117 #   define iswxdigit rpl_iswxdigit
118 #   define towlower rpl_towlower
119 #   define towupper rpl_towupper
120 #  endif
121 # endif
122
123 static inline int
124 # if @REPLACE_ISWCNTRL@
125 rpl_iswalnum
126 # else
127 iswalnum
128 # endif
129          (wint_t wc)
130 {
131   return ((wc >= '0' && wc <= '9')
132           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
133 }
134
135 static inline int
136 # if @REPLACE_ISWCNTRL@
137 rpl_iswalpha
138 # else
139 iswalpha
140 # endif
141          (wint_t wc)
142 {
143   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
144 }
145
146 static inline int
147 # if @REPLACE_ISWCNTRL@
148 rpl_iswblank
149 # else
150 iswblank
151 # endif
152          (wint_t wc)
153 {
154   return wc == ' ' || wc == '\t';
155 }
156
157 static inline int
158 # if @REPLACE_ISWCNTRL@
159 rpl_iswcntrl
160 # else
161 iswcntrl
162 # endif
163         (wint_t wc)
164 {
165   return (wc & ~0x1f) == 0 || wc == 0x7f;
166 }
167
168 static inline int
169 # if @REPLACE_ISWCNTRL@
170 rpl_iswdigit
171 # else
172 iswdigit
173 # endif
174          (wint_t wc)
175 {
176   return wc >= '0' && wc <= '9';
177 }
178
179 static inline int
180 # if @REPLACE_ISWCNTRL@
181 rpl_iswgraph
182 # else
183 iswgraph
184 # endif
185          (wint_t wc)
186 {
187   return wc >= '!' && wc <= '~';
188 }
189
190 static inline int
191 # if @REPLACE_ISWCNTRL@
192 rpl_iswlower
193 # else
194 iswlower
195 # endif
196          (wint_t wc)
197 {
198   return wc >= 'a' && wc <= 'z';
199 }
200
201 static inline int
202 # if @REPLACE_ISWCNTRL@
203 rpl_iswprint
204 # else
205 iswprint
206 # endif
207          (wint_t wc)
208 {
209   return wc >= ' ' && wc <= '~';
210 }
211
212 static inline int
213 # if @REPLACE_ISWCNTRL@
214 rpl_iswpunct
215 # else
216 iswpunct
217 # endif
218          (wint_t wc)
219 {
220   return (wc >= '!' && wc <= '~'
221           && !((wc >= '0' && wc <= '9')
222                || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
223 }
224
225 static inline int
226 # if @REPLACE_ISWCNTRL@
227 rpl_iswspace
228 # else
229 iswspace
230 # endif
231          (wint_t wc)
232 {
233   return (wc == ' ' || wc == '\t'
234           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
235 }
236
237 static inline int
238 # if @REPLACE_ISWCNTRL@
239 rpl_iswupper
240 # else
241 iswupper
242 # endif
243          (wint_t wc)
244 {
245   return wc >= 'A' && wc <= 'Z';
246 }
247
248 static inline int
249 # if @REPLACE_ISWCNTRL@
250 rpl_iswxdigit
251 # else
252 iswxdigit
253 # endif
254           (wint_t wc)
255 {
256   return ((wc >= '0' && wc <= '9')
257           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
258 }
259
260 static inline wint_t
261 # if @REPLACE_ISWCNTRL@
262 rpl_towlower
263 # else
264 towlower
265 # endif
266          (wint_t wc)
267 {
268   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
269 }
270
271 static inline wint_t
272 # if @REPLACE_ISWCNTRL@
273 rpl_towupper
274 # else
275 towupper
276 # endif
277          (wint_t wc)
278 {
279   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
280 }
281
282 #elif ! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@
283 /* Only the iswblank function is missing.  */
284
285 # if @REPLACE_ISWBLANK@
286 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
287 #   define iswblank rpl_iswblank
288 #  endif
289 # endif
290
291 static inline int
292 # if @REPLACE_ISWBLANK@
293 rpl_iswblank
294 # else
295 iswblank
296 # endif
297          (wint_t wc)
298 {
299   return wc == ' ' || wc == '\t';
300 }
301
302 #endif
303
304 #if defined __MINGW32__
305
306 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
307    The functions towlower and towupper are implemented in the MSVCRT library
308    to take a wchar_t argument and return a wchar_t result.  mingw declares
309    these functions to take a wint_t argument and return a wint_t result.
310    This means that:
311    1. When the user passes an argument outside the range 0x0000..0xFFFF, the
312       function will look only at the lower 16 bits.  This is allowed according
313       to POSIX.
314    2. The return value is returned in the lower 16 bits of the result register.
315       The upper 16 bits are random: whatever happened to be in that part of the
316       result register.  We need to fix this by adding a zero-extend from
317       wchar_t to wint_t after the call.  */
318
319 static inline wint_t
320 rpl_towlower (wint_t wc)
321 {
322   return (wint_t) (wchar_t) towlower (wc);
323 }
324 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
325 #  define towlower rpl_towlower
326 # endif
327
328 static inline wint_t
329 rpl_towupper (wint_t wc)
330 {
331   return (wint_t) (wchar_t) towupper (wc);
332 }
333 # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
334 #  define towupper rpl_towupper
335 # endif
336
337 #endif /* __MINGW32__ */
338
339 #if @REPLACE_ISWCNTRL@
340 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
341 _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
342 _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
343 _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
344 _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
345 _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
346 _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
347 _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
348 _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
349 _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
350 _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
351 _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
352 #else
353 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
354 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
355 # if @REPLACE_ISWBLANK@
356 _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
357 # else
358 _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
359 # endif
360 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
361 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
362 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
363 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
364 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
365 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
366 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
367 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
368 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
369 #endif
370 _GL_CXXALIASWARN (iswalnum);
371 _GL_CXXALIASWARN (iswalpha);
372 _GL_CXXALIASWARN (iswblank);
373 _GL_CXXALIASWARN (iswcntrl);
374 _GL_CXXALIASWARN (iswdigit);
375 _GL_CXXALIASWARN (iswgraph);
376 _GL_CXXALIASWARN (iswlower);
377 _GL_CXXALIASWARN (iswprint);
378 _GL_CXXALIASWARN (iswpunct);
379 _GL_CXXALIASWARN (iswspace);
380 _GL_CXXALIASWARN (iswupper);
381 _GL_CXXALIASWARN (iswxdigit);
382
383 #if @REPLACE_ISWCNTRL@ || defined __MINGW32__
384 _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
385 _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
386 #else
387 _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
388 _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
389 #endif
390 _GL_CXXALIASWARN (towlower);
391 _GL_CXXALIASWARN (towupper);
392
393
394 #endif /* _GL_WCTYPE_H */
395 #endif /* _GL_WCTYPE_H */