OSDN Git Service

2011-10-14 Jonathan Yong <jon_y@users.sourceforge.net>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / config / os / mingw32-w64 / ctype_configure_char.cc
1 // Locale support -*- C++ -*-
2
3 // Copyright (C) 2011 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24
25 /** @file ctype_configure_char.cc */
26
27 //
28 // ISO C++ 14882: 22.1  Locales
29 //
30
31 #include <locale>
32 #include <cstdlib>
33 #include <cstring>
34
35 namespace std _GLIBCXX_VISIBILITY(default)
36 {
37 _GLIBCXX_BEGIN_NAMESPACE_VERSION
38
39   // The classic table used in libstdc++ is *not* the C _ctype table
40   // used by mscvrt, but is based on the ctype masks defined for libstdc++
41   // in ctype_base.h.
42
43   const ctype_base::mask*
44   ctype<char>::classic_table() throw()
45   {
46     static const ctype_base::mask _S_classic_table[256] =
47     {
48       cntrl /* null */,
49       cntrl /* ^A */,
50       cntrl /* ^B */,
51       cntrl /* ^C */,
52       cntrl /* ^D */,
53       cntrl /* ^E */,
54       cntrl /* ^F */,
55       cntrl /* ^G */,
56       cntrl /* ^H */,
57       ctype_base::mask(space | cntrl) /* tab */,
58       ctype_base::mask(space | cntrl) /* LF */,
59       ctype_base::mask(space | cntrl) /* ^K */,
60       ctype_base::mask(space | cntrl) /* FF */,
61       ctype_base::mask(space | cntrl) /* ^M */,
62       cntrl /* ^N */,
63       cntrl /* ^O */,
64       cntrl /* ^P */,
65       cntrl /* ^Q */,
66       cntrl /* ^R */,
67       cntrl /* ^S */,
68       cntrl /* ^T */,
69       cntrl /* ^U */,
70       cntrl /* ^V */,
71       cntrl /* ^W */,
72       cntrl /* ^X */,
73       cntrl /* ^Y */,
74       cntrl /* ^Z */,
75       cntrl /* esc */,
76       cntrl /* ^\ */,
77       cntrl /* ^] */,
78       cntrl /* ^^ */,
79       cntrl /* ^_ */,
80       ctype_base::mask(space | print) /*   */,
81       ctype_base::mask(punct | print) /* ! */,
82       ctype_base::mask(punct | print) /* " */,
83       ctype_base::mask(punct | print) /* # */,
84       ctype_base::mask(punct | print) /* $ */,
85       ctype_base::mask(punct | print) /* % */,
86       ctype_base::mask(punct | print) /* & */,
87       ctype_base::mask(punct | print) /* ' */,
88       ctype_base::mask(punct | print) /* ( */,
89       ctype_base::mask(punct | print) /* ) */,
90       ctype_base::mask(punct | print) /* * */,
91       ctype_base::mask(punct | print) /* + */,
92       ctype_base::mask(punct | print) /* , */,
93       ctype_base::mask(punct | print) /* - */,
94       ctype_base::mask(punct | print) /* . */,
95       ctype_base::mask(punct | print) /* / */,
96       ctype_base::mask(digit | xdigit | print) /* 0 */,
97       ctype_base::mask(digit | xdigit | print) /* 1 */,
98       ctype_base::mask(digit | xdigit | print) /* 2 */,
99       ctype_base::mask(digit | xdigit | print) /* 3 */,
100       ctype_base::mask(digit | xdigit | print) /* 4 */,
101       ctype_base::mask(digit | xdigit | print) /* 5 */,
102       ctype_base::mask(digit | xdigit | print) /* 6 */,
103       ctype_base::mask(digit | xdigit | print) /* 7 */,
104       ctype_base::mask(digit | xdigit | print) /* 8 */,
105       ctype_base::mask(digit | xdigit | print) /* 9 */,
106       ctype_base::mask(punct | print) /* : */,
107       ctype_base::mask(punct | print) /* ; */,
108       ctype_base::mask(punct | print) /* < */,
109       ctype_base::mask(punct | print) /* = */,
110       ctype_base::mask(punct | print) /* > */,
111       ctype_base::mask(punct | print) /* ? */,
112       ctype_base::mask(punct | print) /* ! */,
113       ctype_base::mask(alpha | upper | xdigit | print) /* A */,
114       ctype_base::mask(alpha | upper | xdigit | print) /* B */,
115       ctype_base::mask(alpha | upper | xdigit | print) /* C */,
116       ctype_base::mask(alpha | upper | xdigit | print) /* D */,
117       ctype_base::mask(alpha | upper | xdigit | print) /* E */,
118       ctype_base::mask(alpha | upper | xdigit | print) /* F */,
119       ctype_base::mask(alpha | upper | print) /* G */,
120       ctype_base::mask(alpha | upper | print) /* H */,
121       ctype_base::mask(alpha | upper | print) /* I */,
122       ctype_base::mask(alpha | upper | print) /* J */,
123       ctype_base::mask(alpha | upper | print) /* K */,
124       ctype_base::mask(alpha | upper | print) /* L */,
125       ctype_base::mask(alpha | upper | print) /* M */,
126       ctype_base::mask(alpha | upper | print) /* N */,
127       ctype_base::mask(alpha | upper | print) /* O */,
128       ctype_base::mask(alpha | upper | print) /* P */,
129       ctype_base::mask(alpha | upper | print) /* Q */,
130       ctype_base::mask(alpha | upper | print) /* R */,
131       ctype_base::mask(alpha | upper | print) /* S */,
132       ctype_base::mask(alpha | upper | print) /* T */,
133       ctype_base::mask(alpha | upper | print) /* U */,
134       ctype_base::mask(alpha | upper | print) /* V */,
135       ctype_base::mask(alpha | upper | print) /* W */,
136       ctype_base::mask(alpha | upper | print) /* X */,
137       ctype_base::mask(alpha | upper | print) /* Y */,
138       ctype_base::mask(alpha | upper | print) /* Z */,
139       ctype_base::mask(punct | print) /* [ */,
140       ctype_base::mask(punct | print) /* \ */,
141       ctype_base::mask(punct | print) /* ] */,
142       ctype_base::mask(punct | print) /* ^ */,
143       ctype_base::mask(punct | print) /* _ */,
144       ctype_base::mask(punct | print) /* ` */,
145       ctype_base::mask(alpha | lower | xdigit | print) /* a */,
146       ctype_base::mask(alpha | lower | xdigit | print) /* b */,
147       ctype_base::mask(alpha | lower | xdigit | print) /* c */,
148       ctype_base::mask(alpha | lower | xdigit | print) /* d */,
149       ctype_base::mask(alpha | lower | xdigit | print) /* e */,
150       ctype_base::mask(alpha | lower | xdigit | print) /* f */,
151       ctype_base::mask(alpha | lower | print) /* g */,
152       ctype_base::mask(alpha | lower | print) /* h */,
153       ctype_base::mask(alpha | lower | print) /* i */,
154       ctype_base::mask(alpha | lower | print) /* j */,
155       ctype_base::mask(alpha | lower | print) /* k */,
156       ctype_base::mask(alpha | lower | print) /* l */,
157       ctype_base::mask(alpha | lower | print) /* m */,
158       ctype_base::mask(alpha | lower | print) /* n */,
159       ctype_base::mask(alpha | lower | print) /* o */,
160       ctype_base::mask(alpha | lower | print) /* p */,
161       ctype_base::mask(alpha | lower | print) /* q */,
162       ctype_base::mask(alpha | lower | print) /* r */,
163       ctype_base::mask(alpha | lower | print) /* s */,
164       ctype_base::mask(alpha | lower | print) /* t */,
165       ctype_base::mask(alpha | lower | print) /* u */,
166       ctype_base::mask(alpha | lower | print) /* v */,
167       ctype_base::mask(alpha | lower | print) /* w */,
168       ctype_base::mask(alpha | lower | print) /* x */,
169       ctype_base::mask(alpha | lower | print) /* y */,
170       ctype_base::mask(alpha | lower | print) /* x */,
171       ctype_base::mask(punct | print) /* { */,
172       ctype_base::mask(punct | print) /* | */,
173       ctype_base::mask(punct | print) /* } */,
174       ctype_base::mask(punct | print) /* ~ */,
175       cntrl /* del (0x7f)*/,
176       /* The next 128 entries are all 0.   */
177       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
178       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
179       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
180       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
181       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
182       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
183       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
184       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
185     };
186     return _S_classic_table;
187   }
188
189   ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
190                      size_t __refs)
191   : facet(__refs), _M_del(__table != 0 && __del),
192   _M_toupper(NULL), _M_tolower(NULL),
193   _M_table(__table ? __table : classic_table())
194   {
195     memset(_M_widen, 0, sizeof(_M_widen));
196     _M_widen_ok = 0;
197     memset(_M_narrow, 0, sizeof(_M_narrow));
198     _M_narrow_ok = 0;
199   }
200
201   ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
202   : facet(__refs), _M_del(__table != 0 && __del),
203   _M_toupper(NULL), _M_tolower(NULL),
204   _M_table(__table ? __table : classic_table())
205   {
206     memset(_M_widen, 0, sizeof(_M_widen));
207     _M_widen_ok = 0;
208     memset(_M_narrow, 0, sizeof(_M_narrow));
209     _M_narrow_ok = 0;
210   }
211
212   char
213   ctype<char>::do_toupper(char __c) const
214   { return (this->is(ctype_base::lower, __c) ? (__c - 'a' + 'A') : __c); }
215
216   const char*
217   ctype<char>::do_toupper(char* __low, const char* __high) const
218   {
219     while (__low < __high)
220       {
221         *__low = this->do_toupper(*__low);
222         ++__low;
223       }
224     return __high;
225   }
226
227   char
228   ctype<char>::do_tolower(char __c) const
229   { return (this->is(ctype_base::upper, __c) ? (__c - 'A' + 'a') : __c); }
230
231   const char*
232   ctype<char>::do_tolower(char* __low, const char* __high) const
233   {
234     while (__low < __high)
235       {
236         *__low = this->do_tolower(*__low);
237         ++__low;
238       }
239     return __high;
240   }
241
242 _GLIBCXX_END_NAMESPACE_VERSION
243 } // namespace