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