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