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