ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ctype.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.