/home/ntakagi/work/STLport-5.1.5/src/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(__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  doxygen 1.5.1