wctype-h: Avoid namespace pollution on Solaris 2.6.
[gnulib.git] / lib / wctype.in.h
1 /* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
2
3    Copyright (C) 2006-2011 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 2, 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, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 /* Written by Bruno Haible and Paul Eggert.  */
20
21 /*
22  * ISO C 99 <wctype.h> for platforms that lack it.
23  * <http://www.opengroup.org/susv3xbd/wctype.h.html>
24  *
25  * iswctype, towctrans, towlower, towupper, wctrans, wctype,
26  * wctrans_t, and wctype_t are not yet implemented.
27  */
28
29 #ifndef _GL_WCTYPE_H
30
31 #if __GNUC__ >= 3
32 @PRAGMA_SYSTEM_HEADER@
33 #endif
34 @PRAGMA_COLUMNS@
35
36 #if @HAVE_WINT_T@
37 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.
38    Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
39    <wchar.h>.
40    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
41    included before <wchar.h>.  */
42 # include <stddef.h>
43 # include <stdio.h>
44 # include <time.h>
45 # include <wchar.h>
46 #endif
47
48 /* Include the original <wctype.h> if it exists.
49    BeOS 5 has the functions but no <wctype.h>.  */
50 /* The include_next requires a split double-inclusion guard.  */
51 #if @HAVE_WCTYPE_H@
52 # @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
53 #endif
54
55 #ifndef _GL_WCTYPE_H
56 #define _GL_WCTYPE_H
57
58 /* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
59
60 /* The definition of _GL_WARN_ON_USE is copied here.  */
61
62 /* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
63    #defines a number of identifiers in the application namespace.  Revert
64    these #defines.  */
65 #ifdef __sun
66 # undef multibyte
67 # undef eucw1
68 # undef eucw2
69 # undef eucw3
70 # undef scrw1
71 # undef scrw2
72 # undef scrw3
73 #endif
74
75 /* Define wint_t and WEOF.  (Also done in wchar.in.h.)  */
76 #if !@HAVE_WINT_T@ && !defined wint_t
77 # define wint_t int
78 # ifndef WEOF
79 #  define WEOF -1
80 # endif
81 #else
82 # ifndef WEOF
83 #  define WEOF ((wint_t) -1)
84 # endif
85 #endif
86
87
88 #if !GNULIB_defined_wctype_functions
89
90 /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
91    Linux libc5 has <wctype.h> and the functions but they are broken.
92    Assume all 11 functions (all isw* except iswblank) are implemented the
93    same way, or not at all.  */
94 # if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
95
96 /* IRIX 5.3 has macros but no functions, its isw* macros refer to an
97    undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
98    refer to system functions like _iswctype that are not in the
99    standard C library.  Rather than try to get ancient buggy
100    implementations like this to work, just disable them.  */
101 #  undef iswalnum
102 #  undef iswalpha
103 #  undef iswblank
104 #  undef iswcntrl
105 #  undef iswdigit
106 #  undef iswgraph
107 #  undef iswlower
108 #  undef iswprint
109 #  undef iswpunct
110 #  undef iswspace
111 #  undef iswupper
112 #  undef iswxdigit
113 #  undef towlower
114 #  undef towupper
115
116 /* Linux libc5 has <wctype.h> and the functions but they are broken.  */
117 #  if @REPLACE_ISWCNTRL@
118 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
119 #    define iswalnum rpl_iswalnum
120 #    define iswalpha rpl_iswalpha
121 #    define iswblank rpl_iswblank
122 #    define iswcntrl rpl_iswcntrl
123 #    define iswdigit rpl_iswdigit
124 #    define iswgraph rpl_iswgraph
125 #    define iswlower rpl_iswlower
126 #    define iswprint rpl_iswprint
127 #    define iswpunct rpl_iswpunct
128 #    define iswspace rpl_iswspace
129 #    define iswupper rpl_iswupper
130 #    define iswxdigit rpl_iswxdigit
131 #    define towlower rpl_towlower
132 #    define towupper rpl_towupper
133 #   endif
134 #  endif
135
136 static inline int
137 #  if @REPLACE_ISWCNTRL@
138 rpl_iswalnum
139 #  else
140 iswalnum
141 #  endif
142          (wint_t wc)
143 {
144   return ((wc >= '0' && wc <= '9')
145           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
146 }
147
148 static inline int
149 #  if @REPLACE_ISWCNTRL@
150 rpl_iswalpha
151 #  else
152 iswalpha
153 #  endif
154          (wint_t wc)
155 {
156   return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
157 }
158
159 static inline int
160 #  if @REPLACE_ISWCNTRL@
161 rpl_iswblank
162 #  else
163 iswblank
164 #  endif
165          (wint_t wc)
166 {
167   return wc == ' ' || wc == '\t';
168 }
169
170 static inline int
171 #  if @REPLACE_ISWCNTRL@
172 rpl_iswcntrl
173 #  else
174 iswcntrl
175 #  endif
176         (wint_t wc)
177 {
178   return (wc & ~0x1f) == 0 || wc == 0x7f;
179 }
180
181 static inline int
182 #  if @REPLACE_ISWCNTRL@
183 rpl_iswdigit
184 #  else
185 iswdigit
186 #  endif
187          (wint_t wc)
188 {
189   return wc >= '0' && wc <= '9';
190 }
191
192 static inline int
193 #  if @REPLACE_ISWCNTRL@
194 rpl_iswgraph
195 #  else
196 iswgraph
197 #  endif
198          (wint_t wc)
199 {
200   return wc >= '!' && wc <= '~';
201 }
202
203 static inline int
204 #  if @REPLACE_ISWCNTRL@
205 rpl_iswlower
206 #  else
207 iswlower
208 #  endif
209          (wint_t wc)
210 {
211   return wc >= 'a' && wc <= 'z';
212 }
213
214 static inline int
215 #  if @REPLACE_ISWCNTRL@
216 rpl_iswprint
217 #  else
218 iswprint
219 #  endif
220          (wint_t wc)
221 {
222   return wc >= ' ' && wc <= '~';
223 }
224
225 static inline int
226 #  if @REPLACE_ISWCNTRL@
227 rpl_iswpunct
228 #  else
229 iswpunct
230 #  endif
231          (wint_t wc)
232 {
233   return (wc >= '!' && wc <= '~'
234           && !((wc >= '0' && wc <= '9')
235                || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
236 }
237
238 static inline int
239 #  if @REPLACE_ISWCNTRL@
240 rpl_iswspace
241 #  else
242 iswspace
243 #  endif
244          (wint_t wc)
245 {
246   return (wc == ' ' || wc == '\t'
247           || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
248 }
249
250 static inline int
251 #  if @REPLACE_ISWCNTRL@
252 rpl_iswupper
253 #  else
254 iswupper
255 #  endif
256          (wint_t wc)
257 {
258   return wc >= 'A' && wc <= 'Z';
259 }
260
261 static inline int
262 #  if @REPLACE_ISWCNTRL@
263 rpl_iswxdigit
264 #  else
265 iswxdigit
266 #  endif
267           (wint_t wc)
268 {
269   return ((wc >= '0' && wc <= '9')
270           || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
271 }
272
273 static inline wint_t
274 #  if @REPLACE_ISWCNTRL@
275 rpl_towlower
276 #  else
277 towlower
278 #  endif
279          (wint_t wc)
280 {
281   return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
282 }
283
284 static inline wint_t
285 #  if @REPLACE_ISWCNTRL@
286 rpl_towupper
287 #  else
288 towupper
289 #  endif
290          (wint_t wc)
291 {
292   return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
293 }
294
295 # elif @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
296 /* Only the iswblank function is missing.  */
297
298 #  if @REPLACE_ISWBLANK@
299 #   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
300 #    define iswblank rpl_iswblank
301 #   endif
302 _GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
303 #  else
304 _GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
305 #  endif
306
307 # endif
308
309 # if defined __MINGW32__
310
311 /* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
312    The functions towlower and towupper are implemented in the MSVCRT library
313    to take a wchar_t argument and return a wchar_t result.  mingw declares
314    these functions to take a wint_t argument and return a wint_t result.
315    This means that:
316    1. When the user passes an argument outside the range 0x0000..0xFFFF, the
317       function will look only at the lower 16 bits.  This is allowed according
318       to POSIX.
319    2. The return value is returned in the lower 16 bits of the result register.
320       The upper 16 bits are random: whatever happened to be in that part of the
321       result register.  We need to fix this by adding a zero-extend from
322       wchar_t to wint_t after the call.  */
323
324 static inline wint_t
325 rpl_towlower (wint_t wc)
326 {
327   return (wint_t) (wchar_t) towlower (wc);
328 }
329 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
330 #   define towlower rpl_towlower
331 #  endif
332
333 static inline wint_t
334 rpl_towupper (wint_t wc)
335 {
336   return (wint_t) (wchar_t) towupper (wc);
337 }
338 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
339 #   define towupper rpl_towupper
340 #  endif
341
342 # endif /* __MINGW32__ */
343
344 # define GNULIB_defined_wctype_functions 1
345 #endif
346
347 #if @REPLACE_ISWCNTRL@
348 _GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
349 _GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
350 _GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
351 _GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
352 _GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
353 _GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
354 _GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
355 _GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
356 _GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
357 _GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
358 _GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
359 #else
360 _GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
361 _GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
362 _GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
363 _GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
364 _GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
365 _GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
366 _GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
367 _GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
368 _GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
369 _GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
370 _GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
371 #endif
372 _GL_CXXALIASWARN (iswalnum);
373 _GL_CXXALIASWARN (iswalpha);
374 _GL_CXXALIASWARN (iswcntrl);
375 _GL_CXXALIASWARN (iswdigit);
376 _GL_CXXALIASWARN (iswgraph);
377 _GL_CXXALIASWARN (iswlower);
378 _GL_CXXALIASWARN (iswprint);
379 _GL_CXXALIASWARN (iswpunct);
380 _GL_CXXALIASWARN (iswspace);
381 _GL_CXXALIASWARN (iswupper);
382 _GL_CXXALIASWARN (iswxdigit);
383
384 #if @GNULIB_ISWBLANK@
385 # if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
386 _GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
387 # else
388 _GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
389 # endif
390 _GL_CXXALIASWARN (iswblank);
391 #endif
392
393 #if !@HAVE_WCTYPE_T@
394 # if !GNULIB_defined_wctype_t
395 typedef void * wctype_t;
396 #  define GNULIB_defined_wctype_t 1
397 # endif
398 #endif
399
400 /* Get a descriptor for a wide character property.  */
401 #if @GNULIB_WCTYPE@
402 # if !@HAVE_WCTYPE_T@
403 _GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
404 # endif
405 _GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
406 _GL_CXXALIASWARN (wctype);
407 #elif defined GNULIB_POSIXCHECK
408 # undef wctype
409 # if HAVE_RAW_DECL_WCTYPE
410 _GL_WARN_ON_USE (wctype, "wctype is unportable - "
411                  "use gnulib module wctype for portability");
412 # endif
413 #endif
414
415 /* Test whether a wide character has a given property.
416    The argument WC must be either a wchar_t value or WEOF.
417    The argument DESC must have been returned by the wctype() function.  */
418 #if @GNULIB_ISWCTYPE@
419 # if !@HAVE_WCTYPE_T@
420 _GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
421 # endif
422 _GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
423 _GL_CXXALIASWARN (iswctype);
424 #elif defined GNULIB_POSIXCHECK
425 # undef iswctype
426 # if HAVE_RAW_DECL_ISWCTYPE
427 _GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
428                  "use gnulib module iswctype for portability");
429 # endif
430 #endif
431
432 #if @REPLACE_ISWCNTRL@ || defined __MINGW32__
433 _GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
434 _GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
435 #else
436 _GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
437 _GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
438 #endif
439 _GL_CXXALIASWARN (towlower);
440 _GL_CXXALIASWARN (towupper);
441
442 #if !@HAVE_WCTRANS_T@
443 # if !GNULIB_defined_wctrans_t
444 typedef void * wctrans_t;
445 #  define GNULIB_defined_wctrans_t 1
446 # endif
447 #endif
448
449 /* Get a descriptor for a wide character case conversion.  */
450 #if @GNULIB_WCTRANS@
451 # if !@HAVE_WCTRANS_T@
452 _GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
453 # endif
454 _GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
455 _GL_CXXALIASWARN (wctrans);
456 #elif defined GNULIB_POSIXCHECK
457 # undef wctrans
458 # if HAVE_RAW_DECL_WCTRANS
459 _GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
460                  "use gnulib module wctrans for portability");
461 # endif
462 #endif
463
464 /* Perform a given case conversion on a wide character.
465    The argument WC must be either a wchar_t value or WEOF.
466    The argument DESC must have been returned by the wctrans() function.  */
467 #if @GNULIB_TOWCTRANS@
468 # if !@HAVE_WCTRANS_T@
469 _GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
470 # endif
471 _GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
472 _GL_CXXALIASWARN (towctrans);
473 #elif defined GNULIB_POSIXCHECK
474 # undef towctrans
475 # if HAVE_RAW_DECL_TOWCTRANS
476 _GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
477                  "use gnulib module towctrans for portability");
478 # endif
479 #endif
480
481
482 #endif /* _GL_WCTYPE_H */
483 #endif /* _GL_WCTYPE_H */