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