4 * Functions for testing character types and converting characters.
6 * This file is part of the Mingw32 package.
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.
23 * $Date: 2005/04/17 13:14:29 $
30 /* All the headers include this file. */
33 #define __need_wchar_t
37 #endif /* Not RC_INVOKED */
41 * The following flags are used to tell iswctype and _isctype what character
42 * types you are looking for.
47 #define _SPACE 0x0008 /* HT LF VT FF CR SP */
49 #define _CONTROL 0x0020
50 #define _BLANK 0x0040 /* this is SP only, not SP and HT as in C99 */
52 #define _LEADBYTE 0x8000
74 #ifndef __STRICT_ANSI__
75 int _isctype (int, int);
78 /* These are the ANSI versions, with correct checking of argument */
83 * NOTE: The above are not old name type wrappers, but functions exported
84 * explicitly by MSVCRT/CRTDLL. However, underscored versions are also
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
96 /* Also defined in stdlib.h */
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
[];
109 __MINGW_IMPORT
unsigned short* _pctype
;
111 __MINGW_IMPORT
unsigned short* _pctype_dll
;
112 #define _pctype _pctype_dll
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 */
157 #define WEOF (wchar_t)(0xFFFF)
160 #ifndef _WCTYPE_T_DEFINED
161 typedef wchar_t wctype_t;
162 #define _WCTYPE_T_DEFINED
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__
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 */
221 #endif /* Not _NO_OLDNAMES */
223 #endif /* Not __STRICT_ANSI__ */
229 #endif /* Not RC_INVOKED */
231 #endif /* Not _CTYPE_H_ */