1// Locale support -*- C++ -*-
2
3// Copyright (C) 2011-2020 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
35namespace 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 | blank) /* 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 | blank) /*   */,
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
244