1 /* 2 * Copyright (c) 1999 3 * Silicon Graphics Computer Systems, Inc. 4 * 5 * Copyright (c) 1999 6 * Boris Fomitchev 7 * 8 * This material is provided "as is", with absolutely no warranty expressed 9 * or implied. Any use is at your own risk. 10 * 11 * Permission to use or copy this software for any purpose is hereby granted 12 * without fee, provided the above notices are retained on all copies. 13 * Permission to modify the code and to distribute modified code is granted, 14 * provided the above notices are retained, and a notice that the code was 15 * modified is included with the above copyright notice. 16 * 17 */ 18 19 #include "stlport_prefix.h" 20 21 #include <algorithm> 22 #include <locale> 23 #include <functional> 24 25 #include "c_locale.h" 26 27 _STLP_BEGIN_NAMESPACE 28 29 //---------------------------------------------------------------------- 30 // ctype<char> 31 32 // The classic table: static data members. 33 34 #if !defined (_STLP_STATIC_CONST_INIT_BUG) && !defined (_STLP_NO_STATIC_CONST_DEFINITION) 35 //*TY 02/25/2000 - added workaround for MPW compilers; they confuse on in-class static const 36 const size_t ctype<char>::table_size; 37 #endif 38 39 // This macro is specifically for platforms where isprint() relies 40 // on separate flag 41 42 const ctype_base::mask* 43 ctype<char>::classic_table() _STLP_NOTHROW { 44 /* Ctype table for the ASCII character set. */ 45 static const ctype_base::mask _S_classic_table[table_size] = { 46 cntrl /* null */, 47 cntrl /* ^A */, 48 cntrl /* ^B */, 49 cntrl /* ^C */, 50 cntrl /* ^D */, 51 cntrl /* ^E */, 52 cntrl /* ^F */, 53 cntrl /* ^G */, 54 cntrl /* ^H */, 55 ctype_base::mask(space | cntrl) /* tab */, 56 ctype_base::mask(space | cntrl) /* LF */, 57 ctype_base::mask(space | cntrl) /* ^K */, 58 ctype_base::mask(space | cntrl) /* FF */, 59 ctype_base::mask(space | cntrl) /* ^M */, 60 cntrl /* ^N */, 61 cntrl /* ^O */, 62 cntrl /* ^P */, 63 cntrl /* ^Q */, 64 cntrl /* ^R */, 65 cntrl /* ^S */, 66 cntrl /* ^T */, 67 cntrl /* ^U */, 68 cntrl /* ^V */, 69 cntrl /* ^W */, 70 cntrl /* ^X */, 71 cntrl /* ^Y */, 72 cntrl /* ^Z */, 73 cntrl /* esc */, 74 cntrl /* ^\ */, 75 cntrl /* ^] */, 76 cntrl /* ^^ */, 77 cntrl /* ^_ */, 78 ctype_base::mask(space | print) /* */, 79 ctype_base::mask(punct | print) /* ! */, 80 ctype_base::mask(punct | print) /* " */, 81 ctype_base::mask(punct | print) /* # */, 82 ctype_base::mask(punct | print) /* $ */, 83 ctype_base::mask(punct | print) /* % */, 84 ctype_base::mask(punct | print) /* & */, 85 ctype_base::mask(punct | print) /* ' */, 86 ctype_base::mask(punct | print) /* ( */, 87 ctype_base::mask(punct | print) /* ) */, 88 ctype_base::mask(punct | print) /* * */, 89 ctype_base::mask(punct | print) /* + */, 90 ctype_base::mask(punct | print) /* , */, 91 ctype_base::mask(punct | print) /* - */, 92 ctype_base::mask(punct | print) /* . */, 93 ctype_base::mask(punct | print) /* / */, 94 ctype_base::mask(digit | print | xdigit) /* 0 */, 95 ctype_base::mask(digit | print | xdigit) /* 1 */, 96 ctype_base::mask(digit | print | xdigit) /* 2 */, 97 ctype_base::mask(digit | print | xdigit) /* 3 */, 98 ctype_base::mask(digit | print | xdigit) /* 4 */, 99 ctype_base::mask(digit | print | xdigit) /* 5 */, 100 ctype_base::mask(digit | print | xdigit) /* 6 */, 101 ctype_base::mask(digit | print | xdigit) /* 7 */, 102 ctype_base::mask(digit | print | xdigit) /* 8 */, 103 ctype_base::mask(digit | print | xdigit) /* 9 */, 104 ctype_base::mask(punct | print) /* : */, 105 ctype_base::mask(punct | print) /* ; */, 106 ctype_base::mask(punct | print) /* < */, 107 ctype_base::mask(punct | print) /* = */, 108 ctype_base::mask(punct | print) /* > */, 109 ctype_base::mask(punct | print) /* ? */, 110 ctype_base::mask(punct | print) /* ! */, 111 ctype_base::mask(alpha | print | upper | xdigit) /* A */, 112 ctype_base::mask(alpha | print | upper | xdigit) /* B */, 113 ctype_base::mask(alpha | print | upper | xdigit) /* C */, 114 ctype_base::mask(alpha | print | upper | xdigit) /* D */, 115 ctype_base::mask(alpha | print | upper | xdigit) /* E */, 116 ctype_base::mask(alpha | print | upper | xdigit) /* F */, 117 ctype_base::mask(alpha | print | upper) /* G */, 118 ctype_base::mask(alpha | print | upper) /* H */, 119 ctype_base::mask(alpha | print | upper) /* I */, 120 ctype_base::mask(alpha | print | upper) /* J */, 121 ctype_base::mask(alpha | print | upper) /* K */, 122 ctype_base::mask(alpha | print | upper) /* L */, 123 ctype_base::mask(alpha | print | upper) /* M */, 124 ctype_base::mask(alpha | print | upper) /* N */, 125 ctype_base::mask(alpha | print | upper) /* O */, 126 ctype_base::mask(alpha | print | upper) /* P */, 127 ctype_base::mask(alpha | print | upper) /* Q */, 128 ctype_base::mask(alpha | print | upper) /* R */, 129 ctype_base::mask(alpha | print | upper) /* S */, 130 ctype_base::mask(alpha | print | upper) /* T */, 131 ctype_base::mask(alpha | print | upper) /* U */, 132 ctype_base::mask(alpha | print | upper) /* V */, 133 ctype_base::mask(alpha | print | upper) /* W */, 134 ctype_base::mask(alpha | print | upper) /* X */, 135 ctype_base::mask(alpha | print | upper) /* Y */, 136 ctype_base::mask(alpha | print | upper) /* Z */, 137 ctype_base::mask(punct | print) /* [ */, 138 ctype_base::mask(punct | print) /* \ */, 139 ctype_base::mask(punct | print) /* ] */, 140 ctype_base::mask(punct | print) /* ^ */, 141 ctype_base::mask(punct | print) /* _ */, 142 ctype_base::mask(punct | print) /* ` */, 143 ctype_base::mask(alpha | print | lower | xdigit) /* a */, 144 ctype_base::mask(alpha | print | lower | xdigit) /* b */, 145 ctype_base::mask(alpha | print | lower | xdigit) /* c */, 146 ctype_base::mask(alpha | print | lower | xdigit) /* d */, 147 ctype_base::mask(alpha | print | lower | xdigit) /* e */, 148 ctype_base::mask(alpha | print | lower | xdigit) /* f */, 149 ctype_base::mask(alpha | print | lower) /* g */, 150 ctype_base::mask(alpha | print | lower) /* h */, 151 ctype_base::mask(alpha | print | lower) /* i */, 152 ctype_base::mask(alpha | print | lower) /* j */, 153 ctype_base::mask(alpha | print | lower) /* k */, 154 ctype_base::mask(alpha | print | lower) /* l */, 155 ctype_base::mask(alpha | print | lower) /* m */, 156 ctype_base::mask(alpha | print | lower) /* n */, 157 ctype_base::mask(alpha | print | lower) /* o */, 158 ctype_base::mask(alpha | print | lower) /* p */, 159 ctype_base::mask(alpha | print | lower) /* q */, 160 ctype_base::mask(alpha | print | lower) /* r */, 161 ctype_base::mask(alpha | print | lower) /* s */, 162 ctype_base::mask(alpha | print | lower) /* t */, 163 ctype_base::mask(alpha | print | lower) /* u */, 164 ctype_base::mask(alpha | print | lower) /* v */, 165 ctype_base::mask(alpha | print | lower) /* w */, 166 ctype_base::mask(alpha | print | lower) /* x */, 167 ctype_base::mask(alpha | print | lower) /* y */, 168 ctype_base::mask(alpha | print | lower) /* z */, 169 ctype_base::mask(punct | print) /* { */, 170 ctype_base::mask(punct | print) /* | */, 171 ctype_base::mask(punct | print) /* } */, 172 ctype_base::mask(punct | print) /* ~ */, 173 cntrl /* del (0x7f)*/, 174 /* ASCII is a 7-bit code, so everything else is non-ASCII */ 175 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), 176 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), 177 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), 178 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), 179 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), 180 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), 181 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), 182 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), 183 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), 184 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), 185 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), 186 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), 187 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), 188 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), 189 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), 190 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) 191 }; 192 return _S_classic_table; 193 } 194 195 // For every c in the range 0 <= c < 256, _S_upper[c] is the 196 // uppercased version of c and _S_lower[c] is the lowercased 197 // version. As before, these two tables assume the ASCII character 198 // set. 199 200 const unsigned char _S_upper[ctype<char>::table_size] = 201 { 202 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 203 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 204 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 205 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 206 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 207 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 208 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 209 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 210 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 211 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 212 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 213 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 214 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 215 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 216 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 217 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 218 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 219 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 220 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 221 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 222 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 223 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 224 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 225 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 226 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 227 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 228 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 229 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 230 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 231 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 232 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 233 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 234 }; 235 236 const unsigned char _S_lower[ctype<char>::table_size] = 237 { 238 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 239 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 240 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 241 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 242 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 243 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 244 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 245 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 246 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 247 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 248 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 249 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 250 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 251 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 252 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 253 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 254 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 255 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 256 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 257 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 258 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 259 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 260 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 261 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 262 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 263 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 264 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 265 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 266 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 267 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 268 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 269 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 270 }; 271 272 //An helper struct to check wchar_t index without generating warnings 273 //under some compilers (gcc) because of a limited range of value 274 //(when wchar_t is unsigned) 275 template <bool _IsSigned> 276 struct _WCharIndexT; 277 278 #if !(defined (__BORLANDC__) && !defined(__linux__)) && \ 279 !(defined (__GNUC__) && (defined (__MINGW32__) || defined (__CYGWIN__))) && \ 280 !defined (__ICL) 281 _STLP_TEMPLATE_NULL 282 struct _WCharIndexT<true> { 283 static bool in_range(wchar_t c, size_t upperBound) { 284 return c >= 0 && size_t(c) < upperBound; 285 } 286 }; 287 #endif 288 289 _STLP_TEMPLATE_NULL 290 struct _WCharIndexT<false> { 291 static bool in_range(wchar_t c, size_t upperBound) { 292 return size_t(c) < upperBound; 293 } 294 }; 295 296 typedef _WCharIndexT<wchar_t(-1) < 0> _WCharIndex; 297 298 // Some helper functions used in ctype<>::scan_is and scan_is_not. 299 300 struct _Ctype_is_mask : public unary_function<char, bool> { 301 ctype_base::mask _Mask; 302 const ctype_base::mask* _M_table; 303 304 _Ctype_is_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {} 305 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) != 0; } 306 }; 307 308 struct _Ctype_not_mask : public unary_function<char, bool> { 309 ctype_base::mask _Mask; 310 const ctype_base::mask* _M_table; 311 312 _Ctype_not_mask(ctype_base::mask __m, const ctype_base::mask* __t) : _Mask(__m), _M_table(__t) {} 313 bool operator()(char __c) const { return (_M_table[(unsigned char) __c] & _Mask) == 0; } 314 }; 315 316 ctype<char>::ctype(const ctype_base::mask * __tab, bool __del, size_t __refs) : 317 locale::facet(__refs), 318 _M_ctype_table(__tab ? __tab : classic_table()), 319 _M_delete(__tab && __del) 320 {} 321 322 ctype<char>::~ctype() { 323 if (_M_delete) 324 delete[] __CONST_CAST(ctype_base::mask *, _M_ctype_table); 325 } 326 327 const char* 328 #if defined (__DMC__) 329 _STLP_DECLSPEC 330 #endif 331 ctype<char>::scan_is(ctype_base::mask __m, const char* __low, const char* __high) const 332 { return _STLP_STD::find_if(__low, __high, _Ctype_is_mask(__m, _M_ctype_table)); } 333 334 const char* 335 #if defined (__DMC__) 336 _STLP_DECLSPEC 337 #endif 338 ctype<char>::scan_not(ctype_base::mask __m, const char* __low, const char* __high) const 339 { return _STLP_STD::find_if(__low, __high, _Ctype_not_mask(__m, _M_ctype_table)); } 340 341 char ctype<char>::do_toupper(char __c) const 342 { return (char) _S_upper[(unsigned char) __c]; } 343 char ctype<char>::do_tolower(char __c) const 344 { return (char) _S_lower[(unsigned char) __c]; } 345 346 const char* ctype<char>::do_toupper(char* __low, const char* __high) const { 347 for ( ; __low < __high; ++__low) 348 *__low = (char) _S_upper[(unsigned char) *__low]; 349 return __high; 350 } 351 const char* ctype<char>::do_tolower(char* __low, const char* __high) const { 352 for ( ; __low < __high; ++__low) 353 *__low = (char) _S_lower[(unsigned char) *__low]; 354 return __high; 355 } 356 357 char 358 ctype<char>::do_widen(char __c) const { return __c; } 359 360 const char* 361 ctype<char>::do_widen(const char* __low, const char* __high, 362 char* __to) const { 363 _STLP_PRIV __copy_trivial(__low, __high, __to); 364 return __high; 365 } 366 char 367 ctype<char>::do_narrow(char __c, char /* dfault */ ) const { return __c; } 368 const char* 369 ctype<char>::do_narrow(const char* __low, const char* __high, 370 char /* dfault */, char* __to) const { 371 _STLP_PRIV __copy_trivial(__low, __high, __to); 372 return __high; 373 } 374 375 376 #if !defined (_STLP_NO_WCHAR_T) 377 378 struct _Ctype_w_is_mask : public unary_function<wchar_t, bool> { 379 ctype_base::mask M; 380 const ctype_base::mask* table; 381 382 _Ctype_w_is_mask(ctype_base::mask m, const ctype_base::mask* t) 383 : M(m), table(t) {} 384 bool operator()(wchar_t c) const 385 { return _WCharIndex::in_range(c, ctype<char>::table_size) && (table[c] & M); } 386 }; 387 388 //---------------------------------------------------------------------- 389 // ctype<wchar_t> 390 391 ctype<wchar_t>::~ctype() {} 392 393 394 bool ctype<wchar_t>::do_is(ctype_base::mask m, wchar_t c) const { 395 const ctype_base::mask * table = ctype<char>::classic_table(); 396 return _WCharIndex::in_range(c, ctype<char>::table_size) && (m & table[c]); 397 } 398 399 const wchar_t* ctype<wchar_t>::do_is(const wchar_t* low, const wchar_t* high, 400 ctype_base::mask * vec) const { 401 // boris : not clear if this is the right thing to do... 402 const ctype_base::mask * table = ctype<char>::classic_table(); 403 wchar_t c; 404 for ( ; low < high; ++low, ++vec) { 405 c = *low; 406 *vec = _WCharIndex::in_range(c, ctype<char>::table_size) ? table[c] : ctype_base::mask(0); 407 } 408 return high; 409 } 410 411 const wchar_t* 412 ctype<wchar_t>::do_scan_is(ctype_base::mask m, 413 const wchar_t* low, const wchar_t* high) const { 414 return find_if(low, high, _Ctype_w_is_mask(m, ctype<char>::classic_table())); 415 } 416 417 418 const wchar_t* 419 ctype<wchar_t>::do_scan_not(ctype_base::mask m, 420 const wchar_t* low, const wchar_t* high) const { 421 return find_if(low, high, not1(_Ctype_w_is_mask(m, ctype<char>::classic_table()))); 422 } 423 424 wchar_t ctype<wchar_t>::do_toupper(wchar_t c) const { 425 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c] 426 : c; 427 } 428 429 const wchar_t* 430 ctype<wchar_t>::do_toupper(wchar_t* low, const wchar_t* high) const { 431 for ( ; low < high; ++low) { 432 wchar_t c = *low; 433 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_upper[c] 434 : c; 435 } 436 return high; 437 } 438 439 wchar_t ctype<wchar_t>::do_tolower(wchar_t c) const { 440 return _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c] 441 : c; 442 } 443 444 const wchar_t* 445 ctype<wchar_t>::do_tolower(wchar_t* low, const wchar_t* high) const { 446 for ( ; low < high; ++low) { 447 wchar_t c = *low; 448 *low = _WCharIndex::in_range(c, ctype<char>::table_size) ? (wchar_t)_S_lower[c] 449 : c; 450 } 451 return high; 452 } 453 454 wchar_t ctype<wchar_t>::do_widen(char c) const { 455 return (wchar_t)(unsigned char)c; 456 } 457 458 const char* 459 ctype<wchar_t>::do_widen(const char* low, const char* high, 460 wchar_t* dest) const { 461 while (low != high) 462 *dest++ = (wchar_t)(unsigned char)*low++; 463 return high; 464 } 465 466 char ctype<wchar_t>::do_narrow(wchar_t c, char dfault) const 467 { return (unsigned char)c == c ? (char)c : dfault; } 468 469 const wchar_t* ctype<wchar_t>::do_narrow(const wchar_t* low, 470 const wchar_t* high, 471 char dfault, char* dest) const { 472 while (low != high) { 473 wchar_t c = *low++; 474 *dest++ = (unsigned char)c == c ? (char)c : dfault; 475 } 476 477 return high; 478 } 479 480 # endif 481 _STLP_END_NAMESPACE 482 483 // Local Variables: 484 // mode:C++ 485 // End: 486 487