/home/ntakagi/work/STLport-5.1.5/src/ctype.cppGo to the documentation of this file.00001 /* 00002 * Copyright (c) 1999 00003 * Silicon Graphics Computer Systems, Inc. 00004 * 00005 * Copyright (c) 1999 00006 * Boris Fomitchev 00007 * 00008 * This material is provided "as is", with absolutely no warranty expressed 00009 * or implied. Any use is at your own risk. 00010 * 00011 * Permission to use or copy this software for any purpose is hereby granted 00012 * without fee, provided the above notices are retained on all copies. 00013 * Permission to modify the code and to distribute modified code is granted, 00014 * provided the above notices are retained, and a notice that the code was 00015 * modified is included with the above copyright notice. 00016 * 00017 */ 00018 00019 #include "stlport_prefix.h" 00020 00021 #include <algorithm> 00022 #include <locale> 00023 #include <functional> 00024 00025 #include "c_locale.h" 00026 00027 _STLP_BEGIN_NAMESPACE 00028 00029 //---------------------------------------------------------------------- 00030 // ctype<char> 00031 00032 // The classic table: static data members. 00033 00034 #if !defined(_STLP_STATIC_CONST_INIT_BUG) && !(defined(__MRC__) || defined(__SC__)) 00035 //*TY 02/25/2000 - added workaround for MPW compilers; they confuse on in-class static const 00036 const size_t ctype<char>::table_size; 00037 #endif 00038 00039 // This macro is specifically for platforms where isprint() relies 00040 // on separate flag 00041 00042 #define PRINTFLAG ctype_base::mask( _Locale_PRINT & ~(_Locale_UPPER | _Locale_LOWER | _Locale_ALPHA | _Locale_DIGIT | _Locale_PUNCT | _Locale_SPACE | _Locale_XDIGIT )) 00043 00044 const ctype_base::mask* 00045 ctype<char>::classic_table() _STLP_NOTHROW { 00046 /* Ctype table for the ASCII character set. 00047 * There are 257 entries in this table. The first is EOF (-1). 00048 * That is, the "table" seen by ctype<char> member functions is 00049 * _S_classic_table + 1. 00050 */ 00051 /* The following static assert check that alpha is not defined as upper | lower. 00052 * STLport flags character like 'a' with alpha | lower, if alpha is badly configure 00053 * then 'a' will also be seen as upper which is wrong. 00054 */ 00055 #if !defined (__MWERKS__) 00056 /* CodeWarrior 8 don't understabd this */ 00057 _STLP_STATIC_ASSERT((alpha & (lower | upper)) == 0) 00058 #endif 00059 00060 static const ctype_base::mask _S_classic_table[table_size] = 00061 { 00062 cntrl /* null */, 00063 cntrl /* ^A */, 00064 cntrl /* ^B */, 00065 cntrl /* ^C */, 00066 cntrl /* ^D */, 00067 cntrl /* ^E */, 00068 cntrl /* ^F */, 00069 cntrl /* ^G */, 00070 cntrl /* ^H */, 00071 ctype_base::mask(space | cntrl) /* tab */, 00072 ctype_base::mask(space | cntrl) /* LF */, 00073 ctype_base::mask(space | cntrl) /* ^K */, 00074 ctype_base::mask(space | cntrl) /* FF */, 00075 ctype_base::mask(space | cntrl) /* ^M */, 00076 cntrl /* ^N */, 00077 cntrl /* ^O */, 00078 cntrl /* ^P */, 00079 cntrl /* ^Q */, 00080 cntrl /* ^R */, 00081 cntrl /* ^S */, 00082 cntrl /* ^T */, 00083 cntrl /* ^U */, 00084 cntrl /* ^V */, 00085 cntrl /* ^W */, 00086 cntrl /* ^X */, 00087 cntrl /* ^Y */, 00088 cntrl /* ^Z */, 00089 cntrl /* esc */, 00090 cntrl /* ^\ */, 00091 cntrl /* ^] */, 00092 cntrl /* ^^ */, 00093 cntrl /* ^_ */, 00094 ctype_base::mask (space | PRINTFLAG) /* */, 00095 ctype_base::mask (punct | PRINTFLAG ) /* ! */, 00096 ctype_base::mask (punct | PRINTFLAG ) /* " */, 00097 ctype_base::mask (punct | PRINTFLAG ) /* # */, 00098 ctype_base::mask (punct | PRINTFLAG ) /* $ */, 00099 ctype_base::mask (punct | PRINTFLAG ) /* % */, 00100 ctype_base::mask (punct | PRINTFLAG ) /* & */, 00101 ctype_base::mask (punct | PRINTFLAG ) /* ' */, 00102 ctype_base::mask (punct | PRINTFLAG ) /* ( */, 00103 ctype_base::mask (punct | PRINTFLAG ) /* ) */, 00104 ctype_base::mask (punct | PRINTFLAG ) /* * */, 00105 ctype_base::mask (punct | PRINTFLAG ) /* + */, 00106 ctype_base::mask (punct | PRINTFLAG ) /* , */, 00107 ctype_base::mask (punct | PRINTFLAG ) /* - */, 00108 ctype_base::mask (punct | PRINTFLAG ) /* . */, 00109 ctype_base::mask (punct | PRINTFLAG ) /* / */, 00110 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 0 */, 00111 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 1 */, 00112 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 2 */, 00113 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 3 */, 00114 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 4 */, 00115 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 5 */, 00116 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 6 */, 00117 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 7 */, 00118 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 8 */, 00119 ctype_base::mask(digit | PRINTFLAG | xdigit) /* 9 */, 00120 ctype_base::mask (punct | PRINTFLAG ) /* : */, 00121 ctype_base::mask (punct | PRINTFLAG ) /* ; */, 00122 ctype_base::mask (punct | PRINTFLAG ) /* < */, 00123 ctype_base::mask (punct | PRINTFLAG ) /* = */, 00124 ctype_base::mask (punct | PRINTFLAG ) /* > */, 00125 ctype_base::mask (punct | PRINTFLAG ) /* ? */, 00126 ctype_base::mask (punct | PRINTFLAG ) /* ! */, 00127 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* A */, 00128 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* B */, 00129 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* C */, 00130 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* D */, 00131 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* E */, 00132 ctype_base::mask(alpha | PRINTFLAG | upper | xdigit) /* F */, 00133 ctype_base::mask(alpha | PRINTFLAG | upper) /* G */, 00134 ctype_base::mask(alpha | PRINTFLAG | upper) /* H */, 00135 ctype_base::mask(alpha | PRINTFLAG | upper) /* I */, 00136 ctype_base::mask(alpha | PRINTFLAG | upper) /* J */, 00137 ctype_base::mask(alpha | PRINTFLAG | upper) /* K */, 00138 ctype_base::mask(alpha | PRINTFLAG | upper) /* L */, 00139 ctype_base::mask(alpha | PRINTFLAG | upper) /* M */, 00140 ctype_base::mask(alpha | PRINTFLAG | upper) /* N */, 00141 ctype_base::mask(alpha | PRINTFLAG | upper) /* O */, 00142 ctype_base::mask(alpha | PRINTFLAG | upper) /* P */, 00143 ctype_base::mask(alpha | PRINTFLAG | upper) /* Q */, 00144 ctype_base::mask(alpha | PRINTFLAG | upper) /* R */, 00145 ctype_base::mask(alpha | PRINTFLAG | upper) /* S */, 00146 ctype_base::mask(alpha | PRINTFLAG | upper) /* T */, 00147 ctype_base::mask(alpha | PRINTFLAG | upper) /* U */, 00148 ctype_base::mask(alpha | PRINTFLAG | upper) /* V */, 00149 ctype_base::mask(alpha | PRINTFLAG | upper) /* W */, 00150 ctype_base::mask(alpha | PRINTFLAG | upper) /* X */, 00151 ctype_base::mask(alpha | PRINTFLAG | upper) /* Y */, 00152 ctype_base::mask(alpha | PRINTFLAG | upper) /* Z */, 00153 ctype_base::mask (punct | PRINTFLAG ) /* [ */, 00154 ctype_base::mask (punct | PRINTFLAG ) /* \ */, 00155 ctype_base::mask (punct | PRINTFLAG ) /* ] */, 00156 ctype_base::mask (punct | PRINTFLAG ) /* ^ */, 00157 ctype_base::mask (punct | PRINTFLAG ) /* _ */, 00158 ctype_base::mask (punct | PRINTFLAG ) /* ` */, 00159 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* a */, 00160 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* b */, 00161 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* c */, 00162 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* d */, 00163 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* e */, 00164 ctype_base::mask(alpha | PRINTFLAG | lower | xdigit) /* f */, 00165 ctype_base::mask(alpha | PRINTFLAG | lower) /* g */, 00166 ctype_base::mask(alpha | PRINTFLAG | lower) /* h */, 00167 ctype_base::mask(alpha | PRINTFLAG | lower) /* i */, 00168 ctype_base::mask(alpha | PRINTFLAG | lower) /* j */, 00169 ctype_base::mask(alpha | PRINTFLAG | lower) /* k */, 00170 ctype_base::mask(alpha | PRINTFLAG | lower) /* l */, 00171 ctype_base::mask(alpha | PRINTFLAG | lower) /* m */, 00172 ctype_base::mask(alpha | PRINTFLAG | lower) /* n */, 00173 ctype_base::mask(alpha | PRINTFLAG | lower) /* o */, 00174 ctype_base::mask(alpha | PRINTFLAG | lower) /* p */, 00175 ctype_base::mask(alpha | PRINTFLAG | lower) /* q */, 00176 ctype_base::mask(alpha | PRINTFLAG | lower) /* r */, 00177 ctype_base::mask(alpha | PRINTFLAG | lower) /* s */, 00178 ctype_base::mask(alpha | PRINTFLAG | lower) /* t */, 00179 ctype_base::mask(alpha | PRINTFLAG | lower) /* u */, 00180 ctype_base::mask(alpha | PRINTFLAG | lower) /* v */, 00181 ctype_base::mask(alpha | PRINTFLAG | lower) /* w */, 00182 ctype_base::mask(alpha | PRINTFLAG | lower) /* x */, 00183 ctype_base::mask(alpha | PRINTFLAG | lower) /* y */, 00184 ctype_base::mask(alpha | PRINTFLAG | lower) /* x */, 00185 ctype_base::mask (punct | PRINTFLAG ) /* { */, 00186 ctype_base::mask (punct | PRINTFLAG ) /* | */, 00187 ctype_base::mask (punct | PRINTFLAG ) /* } */, 00188 ctype_base::mask (punct | PRINTFLAG ) /* ~ */, 00189 cntrl /* del (0x7f)*/, 00190 /* ASCII is a 7-bit code, so everything else is non-ASCII */ 00191 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00192 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00193 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00194 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00195 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00196 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00197 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00198 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00199 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00200 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00201 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00202 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00203 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00204 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00205 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), 00206 ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0), ctype_base::mask(0) 00207 }; 00208 return _S_classic_table; 00209 } 00210 00211 // For every c in the range 0 <= c < 256, _S_upper[c] is the 00212 // uppercased version of c and _S_lower[c] is the lowercased 00213 // version. As before, these two tables assume the ASCII character 00214 // set. 00215 00216 const unsigned char _S_upper[ctype<char>::table_size] = 00217 { 00218 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 00219 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 00220 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 00221 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 00222 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 00223 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 00224 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 00225 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 00226 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 00227 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 00228 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 00229 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 00230 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 00231 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 00232 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 00233 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 00234 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 00235 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 00236 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 00237 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 00238 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 00239 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 00240 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 00241 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 00242 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 00243 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 00244 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 00245 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 00246 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 00247 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 00248 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 00249 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 00250 }; 00251 00252 const unsigned char _S_lower[ctype<char>::table_size] = 00253 { 00254 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 00255 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 00256 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 00257 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 00258 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 00259 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 00260 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 00261 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 00262 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 00263 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 00264 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 00265 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 00266 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 00267 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 00268 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 00269 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 00270 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 00271 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 00272 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 00273 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 00274 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 00275 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 00276 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 00277 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 00278 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 00279 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 00280 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 00281 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 00282 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 00283 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 00284 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 00285 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 00286 }; 00287 00288 //An helper struct to check wchar_t index without generating warnings 00289 //under some compilers (gcc) because of a limited range of value 00290 //(when wchar_t is unsigned) 00291 template <bool _IsSigned> 00292 struct _WCharIndexT; 00293 00294 #if !defined (__BORLANDC__) && \ 00295 !(defined (__GNUC__) && (defined (__MINGW32__) || defined (__CYGWIN__))) && \ 00296 !defined (__ICL) 00297 _STLP_TEMPLATE_NULL 00298 struct _WCharIndexT<true> { 00299 static bool in_range(wchar_t c, size_t upperBound) { 00300 return c >= 0 && size_t(c) < upperBound; 00301 } 00302 }; 00303 #endif 00304 00305 _STLP_TEMPLATE_NULL 00306 struct _WCharIndexT<false> { 00307 static bool in_range(wchar_t c, size_t upperBound) { 00308 return size_t(c) < upperBound; 00309 } 00310 }; 00311 00312 typedef _WCharIndexT<wchar_t(-1) < 0> _WCharIndex; 00313 00314 // Some helper functions used in ctype<>::scan_is and scan_is_not. 00315 00316 struct _Ctype_is_mask { 00317 typedef char argument_type; 00318 typedef bool result_type; 00319 00320 ctype_base::mask _Mask; 00321 const ctype_base::mask* _M_table; 00322 00323 _Ctype_is_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {} 00324 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) != 0; } 00325 }; 00326 00327 struct _Ctype_not_mask { 00328 typedef char argument_type; 00329 typedef bool result_type; 00330 00331 ctype_base::mask _Mask; 00332 const ctype_base::mask* _M_table; 00333 00334 _Ctype_not_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {} 00335 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) == 0; } 00336 }; 00337 00338 ctype<char>::ctype(const ctype_base::mask * __tab, bool __del, size_t __refs) : 00339 locale::facet(__refs), 00340 _M_ctype_table(__tab ? __tab : classic_table()), 00341 _M_delete(__tab && __del) 00342 {} 00343 00344 ctype<char>::~ctype() { 00345 if (_M_delete) 00346 delete[] __CONST_CAST(ctype_base::mask *, _M_ctype_table); 00347 } 00348 00349 const char* 00350 ctype<char>::scan_is(ctype_base::mask __m, const char* __low, const char* __high) const { 00351 return _STLP_STD::find_if(__low, __high, _Ctype_is_mask(__m, _M_ctype_table)); 00352 } 00353 00354 const char* 00355 ctype<char>::scan_not(ctype_base::mask __m, const char* __low, const char* __high) const { 00356 return _STLP_STD::find_if(__low, __high, _Ctype_not_mask(__m, _M_ctype_table)); 00357 } 00358 00359 char ctype<char>::do_toupper(char __c) const 00360 { return (char) _S_upper[(unsigned char) __c]; } 00361 char ctype<char>::do_tolower(char __c) const 00362 { return (char) _S_lower[(unsigned char) __c]; } 00363 00364 const char* ctype<char>::do_toupper(char* __low, const char* __high) const { 00365 for ( ; __low < __high; ++__low) 00366 *__low = (char) _S_upper[(unsigned char) *__low]; 00367 return __high; 00368 } 00369 const char* ctype<char>::do_tolower(char* __low, const char* __high) const { 00370 for ( ; __low < __high; ++__low) 00371 *__low = (char) _S_lower[(unsigned char) *__low]; 00372 return __high; 00373 } 00374 00375 char 00376 ctype<char>::do_widen(char __c) const { return __c; } 00377 00378 const char* 00379 ctype<char>::do_widen(const char* __low, const char* __high, 00380 char* __to) const { 00381 _STLP_PRIV __copy_trivial(__low, __high, __to); 00382 return __high; 00383 } 00384 char 00385 ctype<char>::do_narrow(char __c, char /* dfault */ ) const { return __c; } 00386 const char* 00387 ctype<char>::do_narrow(const char* __low, const char* __high, 00388 char /* dfault */, char* __to) const { 00389 _STLP_PRIV __copy_trivial(__low, __high, __to); 00390 return __high; 00391 } 00392 00393 00394 #if !defined (_STLP_NO_WCHAR_T) 00395 00396 struct _Ctype_w_is_mask { 00397 typedef wchar_t argument_type; 00398 typedef bool result_type; 00399 00400 ctype_base::mask M; 00401 const ctype_base::mask* table; 00402 00403 _Ctype_w_is_mask(ctype_base::mask m, const ctype_base::mask* t) 00404 : M(m), table(t) {} 00405 bool operator()(wchar_t c) const { 00406 return _WCharIndex::in_range(c, ctype<char>::table_size) && (table[c] & M); 00407 } 00408 }; 00409 00410 //---------------------------------------------------------------------- 00411 // ctype<wchar_t> 00412 00413 ctype<wchar_t>::~ctype() {} 00414 00415 00416 bool ctype<wchar_t>::do_is(ctype_base::mask m, wchar_t c) const { 00417 const ctype_base::mask * table = ctype<char>::classic_table(); 00418 return _WCharIndex::in_range(c, ctype<char>::table_size) && (m & table[c]); 00419 } 00420 00421 const wchar_t* ctype<wchar_t>::do_is(const wchar_t* low, const wchar_t* high, 00422 ctype_base::mask * vec) const { 00423 // boris : not clear if this is the right thing to do... 00424 const ctype_base::mask * table = ctype<char>::classic_table(); 00425 for ( ; low < high; ++low, ++vec) { 00426 wchar_t c = *low; 00427 *vec = _WCharIndex::in_range(c, ctype<char>::table_size) ? table[c] : ctype_base::mask(0); 00428 } 00429 return high; 00430 } 00431 00432 const wchar_t* 00433 ctype<wchar_t>::do_scan_is(ctype_base::mask m, 00434 const wchar_t* low, const wchar_t* high) const { 00435 return find_if(low, high, _Ctype_w_is_mask(m, ctype<char>::classic_table())); 00436 } 00437 00438 00439 const wchar_t* 00440 ctype<wchar_t>::do_scan_not(ctype_base::mask m, 00441 const wchar_t* low, const wchar_t* high) const { 00442 return find_if(low, high, not1(_Ctype_w_is_mask(m, ctype<char>::classic_table()))); 00443 } 00444 00445 wchar_t ctype<wchar_t>::do_toupper(wchar_t c) const { 00446 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c] 00447 : c; 00448 } 00449 00450 const wchar_t* 00451 ctype<wchar_t>::do_toupper(wchar_t* low, const wchar_t* high) const { 00452 for ( ; low < high; ++low) { 00453 wchar_t c = *low; 00454 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c] 00455 : c; 00456 } 00457 return high; 00458 } 00459 00460 wchar_t ctype<wchar_t>::do_tolower(wchar_t c) const { 00461 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c] 00462 : c; 00463 } 00464 00465 const wchar_t* 00466 ctype<wchar_t>::do_tolower(wchar_t* low, const wchar_t* high) const { 00467 for ( ; low < high; ++low) { 00468 wchar_t c = *low; 00469 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c] 00470 : c; 00471 } 00472 return high; 00473 } 00474 00475 wchar_t ctype<wchar_t>::do_widen(char c) const { 00476 return (wchar_t)(unsigned char)c; 00477 } 00478 00479 const char* 00480 ctype<wchar_t>::do_widen(const char* low, const char* high, 00481 wchar_t* dest) const { 00482 while (low != high) 00483 *dest++ = (wchar_t)(unsigned char)*low++; 00484 return high; 00485 } 00486 00487 char ctype<wchar_t>::do_narrow(wchar_t c, char dfault) const { 00488 return (unsigned char) c == c ? c : dfault; 00489 } 00490 00491 const wchar_t* ctype<wchar_t>::do_narrow(const wchar_t* low, 00492 const wchar_t* high, 00493 char dfault, char* dest) const { 00494 while (low != high) { 00495 wchar_t c = *low++; 00496 *dest++ = (unsigned char) c == c ? c : dfault; 00497 } 00498 00499 return high; 00500 } 00501 00502 # endif 00503 _STLP_END_NAMESPACE 00504 00505 // Local Variables: 00506 // mode:C++ 00507 // End: 00508
Generated on Mon Mar 10 15:32:16 2008 by ![]() |