Protect gcc-isms with __extension__. Avoid always-true test to avoid warning.
[kopensolaris-gnu/glibc.git] / wctype / wctype.h
1 /* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 /*
20  *      ISO C Standard, Amendment 1, 7.15:
21  *      Wide-character classification and mapping utilities  <wctype.h>
22  */
23
24 #ifndef _WCTYPE_H
25
26 #ifndef __need_iswxxx
27 # define _WCTYPE_H      1
28
29 # include <features.h>
30 # include <bits/types.h>
31
32 /* We try to get wint_t from <stddef.h>, but not all GCC versions define it
33    there.  So define it ourselves if it remains undefined.  */
34 # define __need_wint_t
35 # include <stddef.h>
36 # ifndef _WINT_T
37 /* Integral type unchanged by default argument promotions that can
38    hold any value corresponding to members of the extended character
39    set, as well as at least one value that does not correspond to any
40    member of the extended character set.  */
41 #  define _WINT_T
42 typedef unsigned int wint_t;
43 # endif
44
45 /* Constant expression of type `wint_t' whose value does not correspond
46    to any member of the extended character set.  */
47 # ifndef WEOF
48 #  define WEOF (0xffffffffu)
49 # endif
50 #endif
51 #undef __need_iswxxx
52
53
54 /* The following part is also used in the <wcsmbs.h> header when compiled
55    in the Unix98 compatibility mode.  */
56 #ifndef __iswxxx_defined
57 # define __iswxxx_defined       1
58
59 /* Scalar type that can hold values which represent locale-specific
60    character classifications.  */
61 typedef unsigned long int wctype_t;
62
63 # ifndef _ISwbit
64 /* The characteristics are stored always in network byte order (big
65    endian).  We define the bit value interpretations here dependent on the
66    machine's byte order.  */
67
68 #  include <endian.h>
69 #  if __BYTE_ORDER == __BIG_ENDIAN
70 #   define _ISwbit(bit) (1 << (bit))
71 #  else /* __BYTE_ORDER == __LITTLE_ENDIAN */
72 #   define _ISwbit(bit) \
73         ((bit) < 8 ? (int) (1UL << ((bit) + 24))                              \
74          : ((bit) < 16 ? (int) (1UL << ((bit) + 8))                           \
75             : ((bit) < 24 ? (int) (1UL << ((bit) - 8 ))                       \
76                : (int) (1UL << ((bit) - 24 )))))
77 #  endif
78
79 enum
80 {
81   _ISwupper = _ISwbit (0),      /* UPPERCASE.  */
82   _ISwlower = _ISwbit (1),      /* lowercase.  */
83   _ISwalpha = _ISwbit (2),      /* Alphabetic.  */
84   _ISwdigit = _ISwbit (3),      /* Numeric.  */
85   _ISwxdigit = _ISwbit (4),     /* Hexadecimal numeric.  */
86   _ISwspace = _ISwbit (5),      /* Whitespace.  */
87   _ISwprint = _ISwbit (6),      /* Printing.  */
88   _ISwgraph = _ISwbit (7),      /* Graphical.  */
89   _ISwblank = _ISwbit (8),      /* Blank (usually SPC and TAB).  */
90   _ISwcntrl = _ISwbit (9),      /* Control character.  */
91   _ISwpunct = _ISwbit (10),     /* Punctuation.  */
92   _ISwalnum = _ISwbit (11)      /* Alphanumeric.  */
93 };
94 # endif /* Not _ISwbit  */
95
96
97 __BEGIN_DECLS
98
99 /*
100  * Wide-character classification functions: 7.15.2.1.
101  */
102
103 /* Test for any wide character for which `iswalpha' or `iswdigit' is
104    true.  */
105 extern int iswalnum (wint_t __wc) __THROW;
106
107 /* Test for any wide character for which `iswupper' or 'iswlower' is
108    true, or any wide character that is one of a locale-specific set of
109    wide-characters for which none of `iswcntrl', `iswdigit',
110    `iswpunct', or `iswspace' is true.  */
111 extern int iswalpha (wint_t __wc) __THROW;
112
113 /* Test for any control wide character.  */
114 extern int iswcntrl (wint_t __wc) __THROW;
115
116 /* Test for any wide character that corresponds to a decimal-digit
117    character.  */
118 extern int iswdigit (wint_t __wc) __THROW;
119
120 /* Test for any wide character for which `iswprint' is true and
121    `iswspace' is false.  */
122 extern int iswgraph (wint_t __wc) __THROW;
123
124 /* Test for any wide character that corresponds to a lowercase letter
125    or is one of a locale-specific set of wide characters for which
126    none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
127 extern int iswlower (wint_t __wc) __THROW;
128
129 /* Test for any printing wide character.  */
130 extern int iswprint (wint_t __wc) __THROW;
131
132 /* Test for any printing wide character that is one of a
133    locale-specific et of wide characters for which neither `iswspace'
134    nor `iswalnum' is true.  */
135 extern int iswpunct (wint_t __wc) __THROW;
136
137 /* Test for any wide character that corresponds to a locale-specific
138    set of wide characters for which none of `iswalnum', `iswgraph', or
139    `iswpunct' is true.  */
140 extern int iswspace (wint_t __wc) __THROW;
141
142 /* Test for any wide character that corresponds to an uppercase letter
143    or is one of a locale-specific set of wide character for which none
144    of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
145 extern int iswupper (wint_t __wc) __THROW;
146
147 /* Test for any wide character that corresponds to a hexadecimal-digit
148    character equivalent to that performed be the functions described
149    in the previous subclause.  */
150 extern int iswxdigit (wint_t __wc) __THROW;
151
152 /* Test for any wide character that corresponds to a standard blank
153    wide character or a locale-specific set of wide characters for
154    which `iswalnum' is false.  */
155 # ifdef __USE_GNU
156 extern int iswblank (wint_t __wc) __THROW;
157 # endif
158
159 /*
160  * Extensible wide-character classification functions: 7.15.2.2.
161  */
162
163 /* Construct value that describes a class of wide characters identified
164    by the string argument PROPERTY.  */
165 extern wctype_t __wctype (__const char *__property) __THROW;
166 extern wctype_t wctype (__const char *__property) __THROW;
167
168 /* Determine whether the wide-character WC has the property described by
169    DESC.  */
170 extern int __iswctype (wint_t __wc, wctype_t __desc) __THROW;
171 extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
172
173 #if __GNUC__ >= 2 && defined __OPTIMIZE__
174 /* The tables are always organized in a way which allows direct access
175    for single byte characters.  */
176 extern unsigned int *__ctype32_b;
177
178 # define iswalnum(wc) \
179   (__extension__                                                              \
180     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
181      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalnum) : iswalnum (wc)))
182 # define iswalpha(wc) \
183   (__extension__                                                              \
184     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
185      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwalpha) : iswalpha (wc)))
186 # define iswcntrl(wc) \
187   (__extension__                                                              \
188     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
189      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwcntrl) : iswcntrl (wc)))
190 # define iswdigit(wc) \
191   (__extension__                                                              \
192     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
193      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwdigit) : iswdigit (wc)))
194 # define iswlower(wc) \
195   (__extension__                                                              \
196     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
197      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwlower) : iswlower (wc)))
198 # define iswgraph(wc) \
199   (__extension__                                                              \
200     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
201      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwgraph) : iswgraph (wc)))
202 # define iswprint(wc) \
203   (__extension__                                                              \
204     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
205      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwprint) : iswprint (wc)))
206 # define iswpunct(wc) \
207   (__extension__                                                              \
208     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
209      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwpunct) : iswpunct (wc)))
210 # define iswspace(wc) \
211   (__extension__                                                              \
212     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
213      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwspace) : iswspace (wc)))
214 # define iswupper(wc) \
215   (__extension__                                                              \
216     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
217      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwupper) : iswupper (wc)))
218 # define iswxdigit(wc) \
219   (__extension__                                                              \
220     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
221      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwxdigit) : iswxdigit (wc)))
222
223 # ifdef __USE_GNU
224 #  define iswblank(wc) \
225   (__extension__                                                              \
226     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
227      ? (int) (__ctype32_b[(wint_t) (wc)] & _ISwblank) : iswblank (wc)))
228 # endif
229
230 # define iswctype(wc, desc) \
231   (__extension__                                                              \
232     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
233      ? (int) (__ctype32_b[(wint_t) (wc)] & desc) : iswctype (wc, desc)))
234
235 #endif  /* gcc && optimizing */
236
237 /*
238  * Wide-character case-mapping functions: 7.15.3.1.
239  */
240
241 /* Scalar type that can hold values which represent locale-specific
242    character mappings.  */
243 typedef __const __int32_t *wctrans_t;
244
245 /* Converts an uppercase letter to the corresponding lowercase letter.  */
246 extern wint_t towlower (wint_t __wc) __THROW;
247
248 /* Converts an lowercase letter to the corresponding uppercase letter.  */
249 extern wint_t towupper (wint_t __wc) __THROW;
250
251 /* Map the wide character WC using the mapping described by DESC.  */
252 extern wint_t __towctrans (wint_t __wc, wctrans_t __desc) __THROW;
253
254 #if __GNUC__ >= 2 && defined __OPTIMIZE__
255 /* The tables are always organized in a way which allows direct access
256    for single byte characters.  */
257 extern const wint_t *__ctype32_tolower;
258 extern const wint_t *__ctype32_toupper;
259
260 # define towlower(wc) \
261   (__extension__                                                              \
262     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
263      ? (wint_t) __ctype32_tolower[(wint_t) (wc)] : towlower (wc)))
264
265 # define towupper(wc) \
266   (__extension__                                                              \
267     (__builtin_constant_p (wc) && (wint_t) (wc) <= L'\xff'                    \
268      ? (wint_t) __ctype32_toupper[(wint_t) (wc)] : towupper (wc)))
269
270 #endif  /* gcc && optimizing */
271
272 __END_DECLS
273
274 #endif  /* need iswxxx.  */
275
276
277 /* The remaining definitions and declarations must not appear in the
278    <wcsmbs.h> header.  */
279 #ifdef _WCTYPE_H
280
281 /*
282  * Extensible wide-character mapping functions: 7.15.3.2.
283  */
284
285 __BEGIN_DECLS
286
287 /* Construct value that describes a mapping between wide characters
288    identified by the string argument PROPERTY.  */
289 extern wctrans_t wctrans (__const char *__property) __THROW;
290
291 /* Map the wide character WC using the mapping described by DESC.  */
292 extern wint_t towctrans (wint_t __wc, wctrans_t __desc) __THROW;
293
294 # ifdef __USE_GNU
295 /* Declare the interface to extended locale model.  */
296 #  include <xlocale.h>
297
298 /* Test for any wide character for which `iswalpha' or `iswdigit' is
299    true.  */
300 extern int __iswalnum_l (wint_t __wc, __locale_t __locale) __THROW;
301
302 /* Test for any wide character for which `iswupper' or 'iswlower' is
303    true, or any wide character that is one of a locale-specific set of
304    wide-characters for which none of `iswcntrl', `iswdigit',
305    `iswpunct', or `iswspace' is true.  */
306 extern int __iswalpha_l (wint_t __wc, __locale_t __locale) __THROW;
307
308 /* Test for any control wide character.  */
309 extern int __iswcntrl_l (wint_t __wc, __locale_t __locale) __THROW;
310
311 /* Test for any wide character that corresponds to a decimal-digit
312    character.  */
313 extern int __iswdigit_l (wint_t __wc, __locale_t __locale) __THROW;
314
315 /* Test for any wide character for which `iswprint' is true and
316    `iswspace' is false.  */
317 extern int __iswgraph_l (wint_t __wc, __locale_t __locale) __THROW;
318
319 /* Test for any wide character that corresponds to a lowercase letter
320    or is one of a locale-specific set of wide characters for which
321    none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
322 extern int __iswlower_l (wint_t __wc, __locale_t __locale) __THROW;
323
324 /* Test for any printing wide character.  */
325 extern int __iswprint_l (wint_t __wc, __locale_t __locale) __THROW;
326
327 /* Test for any printing wide character that is one of a
328    locale-specific et of wide characters for which neither `iswspace'
329    nor `iswalnum' is true.  */
330 extern int __iswpunct_l (wint_t __wc, __locale_t __locale) __THROW;
331
332 /* Test for any wide character that corresponds to a locale-specific
333    set of wide characters for which none of `iswalnum', `iswgraph', or
334    `iswpunct' is true.  */
335 extern int __iswspace_l (wint_t __wc, __locale_t __locale) __THROW;
336
337 /* Test for any wide character that corresponds to an uppercase letter
338    or is one of a locale-specific set of wide character for which none
339    of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
340 extern int __iswupper_l (wint_t __wc, __locale_t __locale) __THROW;
341
342 /* Test for any wide character that corresponds to a hexadecimal-digit
343    character equivalent to that performed be the functions described
344    in the previous subclause.  */
345 extern int __iswxdigit_l (wint_t __wc, __locale_t __locale) __THROW;
346
347 /* Test for any wide character that corresponds to a standard blank
348    wide character or a locale-specific set of wide characters for
349    which `iswalnum' is false.  */
350 extern int __iswblank_l (wint_t __wc, __locale_t __locale) __THROW;
351
352 /* Construct value that describes a class of wide characters identified
353    by the string argument PROPERTY.  */
354 extern wctype_t __wctype_l (__const char *__property, __locale_t __locale)
355      __THROW;
356
357 /* Determine whether the wide-character WC has the property described by
358    DESC.  */
359 extern int __iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
360      __THROW;
361
362
363 /*
364  * Wide-character case-mapping functions.
365  */
366
367 /* Converts an uppercase letter to the corresponding lowercase letter.  */
368 extern wint_t __towlower_l (wint_t __wc, __locale_t __locale) __THROW;
369
370 /* Converts an lowercase letter to the corresponding uppercase letter.  */
371 extern wint_t __towupper_l (wint_t __wc, __locale_t __locale) __THROW;
372
373 /* Map the wide character WC using the mapping described by DESC.  */
374 extern wint_t __towctrans_l (wint_t __wc, wctrans_t __desc,
375                              __locale_t __locale) __THROW;
376
377 # endif /* Use GNU.  */
378
379 __END_DECLS
380
381 #endif  /* __WCTYPE_H defined.  */
382
383 #endif /* wctype.h  */