1 |
/* |
2 |
* ctype.h |
3 |
* |
4 |
* Functions for character classification and conversion. |
5 |
* |
6 |
* $Id: ctype.h,v e38eed5e2087 2016/07/09 20:53:41 keithmarshall $ |
7 |
* |
8 |
* Written by Colin Peters <colin@bird.fu.is.saga-u.ac.jp> |
9 |
* Copyright (C) 1997-2008, 2016, MinGW.org Project |
10 |
* |
11 |
* |
12 |
* Permission is hereby granted, free of charge, to any person obtaining a |
13 |
* copy of this software and associated documentation files (the "Software"), |
14 |
* to deal in the Software without restriction, including without limitation |
15 |
* the rights to use, copy, modify, merge, publish, distribute, sublicense, |
16 |
* and/or sell copies of the Software, and to permit persons to whom the |
17 |
* Software is furnished to do so, subject to the following conditions: |
18 |
* |
19 |
* The above copyright notice, this permission notice, and the following |
20 |
* disclaimer shall be included in all copies or substantial portions of |
21 |
* the Software. |
22 |
* |
23 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
24 |
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
25 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
26 |
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
27 |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
28 |
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR OTHER |
29 |
* DEALINGS IN THE SOFTWARE. |
30 |
* |
31 |
*/ |
32 |
#ifndef _CTYPE_H |
33 |
#pragma GCC system_header |
34 |
#define _CTYPE_H |
35 |
|
36 |
/* All MinGW headers must include <_mingw.h> |
37 |
*/ |
38 |
#include <_mingw.h> |
39 |
|
40 |
/* Although conflicting with both ISO-C and POSIX, Microsoft say that, |
41 |
* in addition to the single byte character classification API which is |
42 |
* properly declared here, this file should also declare elements of the |
43 |
* wide classification API, which is properly declared in <wctype.h> |
44 |
* |
45 |
* To avoid the burden of maintaining duplicate declarations, in two |
46 |
* locations, we keep the wide character declarations where ISO-C and |
47 |
* POSIX say they belong, in <wctype.h>, while accommodating Microsoft |
48 |
* compatibility by providing for selective inclusion of the relevant |
49 |
* elements of it here. (Note that we must do this early, because to |
50 |
* avoid duplication, we delegate the definition of common character |
51 |
* classification macros, with the exception of _LEADBYTE, which is |
52 |
* not required in both headers, to <wctype.h>). |
53 |
*/ |
54 |
#define __CTYPE_H_SOURCED__ |
55 |
#include <wctype.h> |
56 |
|
57 |
/* This is the one character classification macro, for which definition |
58 |
* is NOT delegated to <wctype.h> |
59 |
*/ |
60 |
#define _LEADBYTE 0x8000 |
61 |
|
62 |
#ifndef RC_INVOKED |
63 |
|
64 |
_BEGIN_C_DECLS |
65 |
|
66 |
_CRTIMP __cdecl __MINGW_NOTHROW int isalnum(int); |
67 |
_CRTIMP __cdecl __MINGW_NOTHROW int isalpha(int); |
68 |
_CRTIMP __cdecl __MINGW_NOTHROW int iscntrl(int); |
69 |
_CRTIMP __cdecl __MINGW_NOTHROW int isdigit(int); |
70 |
_CRTIMP __cdecl __MINGW_NOTHROW int isgraph(int); |
71 |
_CRTIMP __cdecl __MINGW_NOTHROW int islower(int); |
72 |
_CRTIMP __cdecl __MINGW_NOTHROW int isleadbyte (int); |
73 |
_CRTIMP __cdecl __MINGW_NOTHROW int isprint(int); |
74 |
_CRTIMP __cdecl __MINGW_NOTHROW int ispunct(int); |
75 |
_CRTIMP __cdecl __MINGW_NOTHROW int isspace(int); |
76 |
_CRTIMP __cdecl __MINGW_NOTHROW int isupper(int); |
77 |
_CRTIMP __cdecl __MINGW_NOTHROW int isxdigit(int); |
78 |
|
79 |
#if __STDC_VERSION__ >= 199901L || !defined __STRICT_ANSI__ |
80 |
__cdecl __MINGW_NOTHROW int isblank (int); |
81 |
#endif |
82 |
|
83 |
#ifndef __STRICT_ANSI__ |
84 |
_CRTIMP __cdecl __MINGW_NOTHROW int _isctype (int, int); |
85 |
#endif |
86 |
|
87 |
/* These are ISO-C conforming functions, with correct checking of |
88 |
* argument; they are exported by MSVCRT.DLL, and by CRTDLL.DLL as |
89 |
* such, and are NOT simply old-name mapped variants; however... |
90 |
*/ |
91 |
_CRTIMP __cdecl __MINGW_NOTHROW int tolower (int); |
92 |
_CRTIMP __cdecl __MINGW_NOTHROW int toupper (int); |
93 |
|
94 |
#ifndef __STRICT_ANSI__ |
95 |
/* ...Microsoft's beloved underscore decorated variants are also |
96 |
* exported. These are cheap non-standard versions: their return |
97 |
* values are undefined if the argument is not an ASCII character, |
98 |
* or is not of appropriate case for the requested conversion. |
99 |
* |
100 |
* Note that these appear to be approximately equivalent to POSIX |
101 |
* macros of the same names, (declared obsolescent in POSIX.1-2008), |
102 |
* but are implemented as DLL functions, rather than macros. |
103 |
*/ |
104 |
_CRTIMP __cdecl __MINGW_NOTHROW int _tolower (int); |
105 |
_CRTIMP __cdecl __MINGW_NOTHROW int _toupper (int); |
106 |
#endif |
107 |
|
108 |
#ifndef MB_CUR_MAX |
109 |
/* FIXME: also defined in stdlib.h; should be factored into ONE |
110 |
* location ONLY, and included into the other. |
111 |
*/ |
112 |
# ifdef __DECLSPEC_SUPPORTED |
113 |
# ifdef __MSVCRT__ |
114 |
# define MB_CUR_MAX __mb_cur_max |
115 |
__MINGW_IMPORT int __mb_cur_max; |
116 |
|
117 |
# else /* !__MSVCRT__ */ |
118 |
# define MB_CUR_MAX __mb_cur_max_dll |
119 |
__MINGW_IMPORT int __mb_cur_max_dll; |
120 |
# endif /* !__MSVCRT__ */ |
121 |
|
122 |
# else /* !__DECLSPEC_SUPPORTED */ |
123 |
# ifdef __MSVCRT__ |
124 |
# define MB_CUR_MAX (*_imp____mb_cur_max) |
125 |
extern int *_imp____mb_cur_max; |
126 |
|
127 |
# else /* !__MSVCRT__ */ |
128 |
# define MB_CUR_MAX (*_imp____mb_cur_max_dll) |
129 |
extern int *_imp____mb_cur_max_dll; |
130 |
# endif /* !__MSVCRT__ */ |
131 |
# endif /* __DECLSPEC_SUPPORTED */ |
132 |
#endif /* ! MB_CUR_MAX */ |
133 |
|
134 |
#ifdef __DECLSPEC_SUPPORTED |
135 |
# if __MSVCRT_VERSION__ <= __MSVCR70_DLL |
136 |
__MINGW_IMPORT unsigned short _ctype[]; |
137 |
# endif |
138 |
|
139 |
# ifdef __MSVCRT__ |
140 |
__MINGW_IMPORT unsigned short *_pctype; |
141 |
|
142 |
# else /* !__MSVCRT__ (implies CRTDLL) */ |
143 |
# define _pctype _pctype_dll |
144 |
__MINGW_IMPORT unsigned short *_pctype_dll; |
145 |
# endif |
146 |
|
147 |
#else /* !__DECLSPEC_SUPPORTED */ |
148 |
# if __MSVCRT_VERSION__ <= __MSVCR70_DLL |
149 |
# define _ctype (*_imp___ctype) |
150 |
extern unsigned short **_imp___ctype; |
151 |
# endif |
152 |
|
153 |
# ifdef __MSVCRT__ |
154 |
# define _pctype (*_imp___pctype) |
155 |
extern unsigned short **_imp___pctype; |
156 |
|
157 |
# else /* !__MSVCRT__ (implies CRTDLL) */ |
158 |
# define _pctype (*_imp___pctype_dll) |
159 |
extern unsigned short **_imp___pctype_dll; |
160 |
# endif /* CRTDLL */ |
161 |
#endif /* !__DECLSPEC_SUPPORTED */ |
162 |
|
163 |
/* Use inlines here rather than macros, because macros will upset |
164 |
* C++ usage (eg, ::isalnum), and so usually get undefined |
165 |
* |
166 |
* According to standard for SB chars, these function are defined only |
167 |
* for input values representable by unsigned char or EOF. |
168 |
* Thus, there is no range test. |
169 |
* This reproduces behaviour of MSVCRT.dll lib implemention for SB chars. |
170 |
* |
171 |
* If no MB char support is needed, these can be simplified even |
172 |
* more by command line define -DMB_CUR_MAX=1. The compiler will then |
173 |
* optimise away the constant condition. |
174 |
*/ |
175 |
|
176 |
#if !(defined (__NO_INLINE__) || defined (__NO_CTYPE_INLINES) \ |
177 |
|| defined (__STRICT_ANSI__)) |
178 |
|
179 |
/* Use simple lookup in single byte locales, else _isctype() |
180 |
*/ |
181 |
#define __ISCTYPE(c, mask) (MB_CUR_MAX == 1 ? (_pctype[c] & mask) : _isctype (c, mask)) |
182 |
|
183 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isalnum (int c) |
184 |
{ return __ISCTYPE(c, (_ALPHA|_DIGIT)); } |
185 |
|
186 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isalpha (int c) |
187 |
{ return __ISCTYPE(c, _ALPHA); } |
188 |
|
189 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int iscntrl (int c) |
190 |
{ return __ISCTYPE(c, _CONTROL); } |
191 |
|
192 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isdigit (int c) |
193 |
{ return __ISCTYPE(c, _DIGIT); } |
194 |
|
195 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isgraph (int c) |
196 |
{ return __ISCTYPE(c, (_PUNCT|_ALPHA|_DIGIT)); } |
197 |
|
198 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int islower (int c) |
199 |
{ return __ISCTYPE(c, _LOWER); } |
200 |
|
201 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isprint (int c) |
202 |
{ return __ISCTYPE(c, (_BLANK|_PUNCT|_ALPHA|_DIGIT)); } |
203 |
|
204 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int ispunct (int c) |
205 |
{ return __ISCTYPE(c, _PUNCT); } |
206 |
|
207 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isspace (int c) |
208 |
{ return __ISCTYPE(c, _SPACE); } |
209 |
|
210 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isupper (int c) |
211 |
{ return __ISCTYPE(c, _UPPER); } |
212 |
|
213 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isxdigit (int c) |
214 |
{ return __ISCTYPE(c, _HEX); } |
215 |
|
216 |
#if __STDC_VERSION__ >= 199901L || !defined __STRICT_ANSI__ |
217 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isblank (int c) |
218 |
{ return (__ISCTYPE(c, _BLANK) || c == '\t'); } |
219 |
#endif |
220 |
|
221 |
/* These reproduce the behaviour of their DLL exported namesakes, |
222 |
* and thus ARE the effective equivalents of the similarly named, |
223 |
* and now-obsolescent, POSIX macros. |
224 |
*/ |
225 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int _tolower (int c) |
226 |
{ return (c - 'A' + 'a'); } |
227 |
|
228 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int _toupper (int c) |
229 |
{ return (c - 'a' + 'A'); } |
230 |
|
231 |
/* TODO: is it worth inlining ANSI tolower(), and toupper()? |
232 |
* Probably only if we only want C-locale. |
233 |
*/ |
234 |
#endif /* _NO_CTYPE_INLINES */ |
235 |
|
236 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int isleadbyte (int c) |
237 |
{ return (_pctype[(unsigned char)(c)] & _LEADBYTE); } |
238 |
|
239 |
#ifndef __STRICT_ANSI__ |
240 |
__cdecl __MINGW_NOTHROW int __isascii (int); |
241 |
__cdecl __MINGW_NOTHROW int __toascii (int); |
242 |
__cdecl __MINGW_NOTHROW int __iscsymf (int); /* Valid as first character in a C symbol */ |
243 |
__cdecl __MINGW_NOTHROW int __iscsym (int); /* Valid character in C symbol (after first) */ |
244 |
|
245 |
#if !(defined (__NO_INLINE__) || defined (__NO_CTYPE_INLINES)) |
246 |
|
247 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int __isascii (int c) |
248 |
{ return ((c & ~0x7F) == 0); } |
249 |
|
250 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int __toascii (int c) |
251 |
{ return (c & 0x7F); } |
252 |
|
253 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int __iscsymf (int c) |
254 |
{ return (isalpha(c) || (c == '_')); } |
255 |
|
256 |
__CRT_INLINE __cdecl __MINGW_NOTHROW int __iscsym (int c) |
257 |
{ return (isalnum(c) || (c == '_')); } |
258 |
|
259 |
#endif /* !__NO_CTYPE_INLINES */ |
260 |
|
261 |
#ifndef _NO_OLDNAMES |
262 |
/* Not _CRTIMP */ |
263 |
__cdecl __MINGW_NOTHROW int isascii (int); |
264 |
__cdecl __MINGW_NOTHROW int toascii (int); |
265 |
__cdecl __MINGW_NOTHROW int iscsymf (int); |
266 |
__cdecl __MINGW_NOTHROW int iscsym (int); |
267 |
#endif /* !_NO_OLDNAMES */ |
268 |
|
269 |
#endif /* !__STRICT_ANSI__ */ |
270 |
|
271 |
_END_C_DECLS |
272 |
|
273 |
#endif /* ! RC_INVOKED */ |
274 |
|
275 |
#undef __CTYPE_H_SOURCED__ |
276 |
#endif /* !_CTYPE_H: $RCSfile: ctype.h,v $: end of file */ |