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