x86-64: Make ABI for long double compatible with GCC.
[tinycc/kirr.git] / win32 / include / ctype.h
blob0c416a6e16ba3694d3ed46800af65c53d15188af
1 /*
2 * ctype.h
4 * Functions for testing character types and converting characters.
6 * This file is part of the Mingw32 package.
8 * Contributors:
9 * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 * $Revision: 1.2 $
22 * $Author: bellard $
23 * $Date: 2005/04/17 13:14:29 $
27 #ifndef _CTYPE_H_
28 #define _CTYPE_H_
30 /* All the headers include this file. */
31 #include <_mingw.h>
33 #define __need_wchar_t
34 #define __need_wint_t
35 #ifndef RC_INVOKED
36 #include <stddef.h>
37 #endif /* Not RC_INVOKED */
41 * The following flags are used to tell iswctype and _isctype what character
42 * types you are looking for.
44 #define _UPPER 0x0001
45 #define _LOWER 0x0002
46 #define _DIGIT 0x0004
47 #define _SPACE 0x0008 /* HT LF VT FF CR SP */
48 #define _PUNCT 0x0010
49 #define _CONTROL 0x0020
50 #define _BLANK 0x0040 /* this is SP only, not SP and HT as in C99 */
51 #define _HEX 0x0080
52 #define _LEADBYTE 0x8000
54 #define _ALPHA 0x0103
56 #ifndef RC_INVOKED
58 #ifdef __cplusplus
59 extern "C" {
60 #endif
62 int isalnum(int);
63 int isalpha(int);
64 int iscntrl(int);
65 int isdigit(int);
66 int isgraph(int);
67 int islower(int);
68 int isprint(int);
69 int ispunct(int);
70 int isspace(int);
71 int isupper(int);
72 int isxdigit(int);
74 #ifndef __STRICT_ANSI__
75 int _isctype (int, int);
76 #endif
78 /* These are the ANSI versions, with correct checking of argument */
79 int tolower(int);
80 int toupper(int);
83 * NOTE: The above are not old name type wrappers, but functions exported
84 * explicitly by MSVCRT/CRTDLL. However, underscored versions are also
85 * exported.
87 #ifndef __STRICT_ANSI__
89 * These are the cheap non-std versions: The return values are undefined
90 * if the argument is not ASCII char or is not of appropriate case
91 */
92 int _tolower(int);
93 int _toupper(int);
94 #endif
96 /* Also defined in stdlib.h */
97 #ifndef MB_CUR_MAX
98 # ifdef __MSVCRT__
99 # define MB_CUR_MAX __mb_cur_max
100 __MINGW_IMPORT int __mb_cur_max;
101 # else /* not __MSVCRT */
102 # define MB_CUR_MAX __mb_cur_max_dll
103 __MINGW_IMPORT int __mb_cur_max_dll;
104 # endif /* not __MSVCRT */
105 #endif /* MB_CUR_MAX */
107 __MINGW_IMPORT unsigned short _ctype[];
108 #ifdef __MSVCRT__
109 __MINGW_IMPORT unsigned short* _pctype;
110 #else /* CRTDLL */
111 __MINGW_IMPORT unsigned short* _pctype_dll;
112 #define _pctype _pctype_dll
113 #endif
116 * Use inlines here rather than macros, because macros will upset
117 * C++ usage (eg, ::isalnum), and so usually get undefined
119 * According to standard for SB chars, these function are defined only
120 * for input values representable by unsigned char or EOF.
121 * Thus, there is no range test.
122 * This reproduces behaviour of MSVCRT.dll lib implemention for SB chars.
124 * If no MB char support is needed, these can be simplified even
125 * more by command line define -DMB_CUR_MAX=1. The compiler will then
126 * optimise away the constant condition.
130 #if ! (defined (__NO_CTYPE_INLINES) || defined (__STRICT_ANSI__ ))
131 /* use simple lookup if SB locale, else _isctype() */
132 #define __ISCTYPE(c, mask) (MB_CUR_MAX == 1 ? (_pctype[c] & mask) : _isctype(c, mask))
133 extern __inline__ int isalnum(int c) {return __ISCTYPE(c, (_ALPHA|_DIGIT));}
134 extern __inline__ int isalpha(int c) {return __ISCTYPE(c, _ALPHA);}
135 extern __inline__ int iscntrl(int c) {return __ISCTYPE(c, _CONTROL);}
136 extern __inline__ int isdigit(int c) {return __ISCTYPE(c, _DIGIT);}
137 extern __inline__ int isgraph(int c) {return __ISCTYPE(c, (_PUNCT|_ALPHA|_DIGIT));}
138 extern __inline__ int islower(int c) {return __ISCTYPE(c, _LOWER);}
139 extern __inline__ int isprint(int c) {return __ISCTYPE(c, (_BLANK|_PUNCT|_ALPHA|_DIGIT));}
140 extern __inline__ int ispunct(int c) {return __ISCTYPE(c, _PUNCT);}
141 extern __inline__ int isspace(int c) {return __ISCTYPE(c, _SPACE);}
142 extern __inline__ int isupper(int c) {return __ISCTYPE(c, _UPPER);}
143 extern __inline__ int isxdigit(int c) {return __ISCTYPE(c, _HEX);}
145 /* these reproduce behaviour of lib underscored versions */
146 extern __inline__ int _tolower(int c) {return ( c -'A'+'a');}
147 extern __inline__ int _toupper(int c) {return ( c -'a'+'A');}
149 /* TODO? Is it worth inlining ANSI tolower, toupper? Probably only
150 if we only want C-locale. */
152 #endif /* _NO_CTYPE_INLINES */
154 /* Wide character equivalents */
156 #ifndef WEOF
157 #define WEOF (wchar_t)(0xFFFF)
158 #endif
160 #ifndef _WCTYPE_T_DEFINED
161 typedef wchar_t wctype_t;
162 #define _WCTYPE_T_DEFINED
163 #endif
165 int iswalnum(wint_t);
166 int iswalpha(wint_t);
167 int iswascii(wint_t);
168 int iswcntrl(wint_t);
169 int iswctype(wint_t, wctype_t);
170 int is_wctype(wint_t, wctype_t); /* Obsolete! */
171 int iswdigit(wint_t);
172 int iswgraph(wint_t);
173 int iswlower(wint_t);
174 int iswprint(wint_t);
175 int iswpunct(wint_t);
176 int iswspace(wint_t);
177 int iswupper(wint_t);
178 int iswxdigit(wint_t);
180 wchar_t towlower(wchar_t);
181 wchar_t towupper(wchar_t);
183 int isleadbyte (int);
185 /* Also in wctype.h */
186 #if ! (defined(__NO_CTYPE_INLINES) || defined(__WCTYPE_INLINES_DEFINED))
187 #define __WCTYPE_INLINES_DEFINED
188 extern __inline__ int iswalnum(wint_t wc) {return (iswctype(wc,_ALPHA|_DIGIT));}
189 extern __inline__ int iswalpha(wint_t wc) {return (iswctype(wc,_ALPHA));}
190 extern __inline__ int iswascii(wint_t wc) {return (((unsigned)wc & 0x7F) ==0);}
191 extern __inline__ int iswcntrl(wint_t wc) {return (iswctype(wc,_CONTROL));}
192 extern __inline__ int iswdigit(wint_t wc) {return (iswctype(wc,_DIGIT));}
193 extern __inline__ int iswgraph(wint_t wc) {return (iswctype(wc,_PUNCT|_ALPHA|_DIGIT));}
194 extern __inline__ int iswlower(wint_t wc) {return (iswctype(wc,_LOWER));}
195 extern __inline__ int iswprint(wint_t wc) {return (iswctype(wc,_BLANK|_PUNCT|_ALPHA|_DIGIT));}
196 extern __inline__ int iswpunct(wint_t wc) {return (iswctype(wc,_PUNCT));}
197 extern __inline__ int iswspace(wint_t wc) {return (iswctype(wc,_SPACE));}
198 extern __inline__ int iswupper(wint_t wc) {return (iswctype(wc,_UPPER));}
199 extern __inline__ int iswxdigit(wint_t wc) {return (iswctype(wc,_HEX));}
200 extern __inline__ int isleadbyte(int c) {return (_pctype[(unsigned char)(c)] & _LEADBYTE);}
201 #endif /* !(defined(__NO_CTYPE_INLINES) || defined(__WCTYPE_INLINES_DEFINED)) */
203 #ifndef __STRICT_ANSI__
204 int __isascii (int);
205 int __toascii (int);
206 int __iscsymf (int); /* Valid first character in C symbol */
207 int __iscsym (int); /* Valid character in C symbol (after first) */
209 #ifndef __NO_CTYPE_INLINES
210 extern __inline__ int __isascii(int c) {return (((unsigned)c & ~0x7F) == 0);}
211 extern __inline__ int __toascii(int c) {return (c & 0x7F);}
212 extern __inline__ int __iscsymf(int c) {return (isalpha(c) || (c == '_'));}
213 extern __inline__ int __iscsym(int c) {return (isalnum(c) || (c == '_'));}
214 #endif /* __NO_CTYPE_INLINES */
216 #ifndef _NO_OLDNAMES
217 int isascii (int);
218 int toascii (int);
219 int iscsymf (int);
220 int iscsym (int);
221 #endif /* Not _NO_OLDNAMES */
223 #endif /* Not __STRICT_ANSI__ */
225 #ifdef __cplusplus
227 #endif
229 #endif /* Not RC_INVOKED */
231 #endif /* Not _CTYPE_H_ */