1*38fd1498Szrj // Copyright (C) 1997-2018 Free Software Foundation, Inc.
2*38fd1498Szrj //
3*38fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
4*38fd1498Szrj // software; you can redistribute it and/or modify it under the
5*38fd1498Szrj // terms of the GNU General Public License as published by the
6*38fd1498Szrj // Free Software Foundation; either version 3, or (at your option)
7*38fd1498Szrj // any later version.
8*38fd1498Szrj 
9*38fd1498Szrj // This library is distributed in the hope that it will be useful,
10*38fd1498Szrj // but WITHOUT ANY WARRANTY; without even the implied warranty of
11*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*38fd1498Szrj // GNU General Public License for more details.
13*38fd1498Szrj 
14*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
15*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
16*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
17*38fd1498Szrj 
18*38fd1498Szrj // You should have received a copy of the GNU General Public License and
19*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
20*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21*38fd1498Szrj // <http://www.gnu.org/licenses/>.
22*38fd1498Szrj 
23*38fd1498Szrj #include <locale>
24*38fd1498Szrj #include <cstdlib>
25*38fd1498Szrj #include <cstring>
26*38fd1498Szrj 
27*38fd1498Szrj namespace std _GLIBCXX_VISIBILITY(default)
28*38fd1498Szrj {
29*38fd1498Szrj _GLIBCXX_BEGIN_NAMESPACE_VERSION
30*38fd1498Szrj 
31*38fd1498Szrj   // Definitions for static const data members of ctype_base.
32*38fd1498Szrj   const ctype_base::mask ctype_base::space;
33*38fd1498Szrj   const ctype_base::mask ctype_base::print;
34*38fd1498Szrj   const ctype_base::mask ctype_base::cntrl;
35*38fd1498Szrj   const ctype_base::mask ctype_base::upper;
36*38fd1498Szrj   const ctype_base::mask ctype_base::lower;
37*38fd1498Szrj   const ctype_base::mask ctype_base::alpha;
38*38fd1498Szrj   const ctype_base::mask ctype_base::digit;
39*38fd1498Szrj   const ctype_base::mask ctype_base::punct;
40*38fd1498Szrj   const ctype_base::mask ctype_base::xdigit;
41*38fd1498Szrj   const ctype_base::mask ctype_base::alnum;
42*38fd1498Szrj   const ctype_base::mask ctype_base::graph;
43*38fd1498Szrj   const ctype_base::mask ctype_base::blank;
44*38fd1498Szrj 
45*38fd1498Szrj   // Definitions for locale::id of standard facets that are specialized.
46*38fd1498Szrj   locale::id ctype<char>::id;
47*38fd1498Szrj 
48*38fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T
49*38fd1498Szrj   locale::id ctype<wchar_t>::id;
50*38fd1498Szrj #endif
51*38fd1498Szrj 
52*38fd1498Szrj   const size_t ctype<char>::table_size;
53*38fd1498Szrj 
~ctype()54*38fd1498Szrj   ctype<char>::~ctype()
55*38fd1498Szrj   {
56*38fd1498Szrj     _S_destroy_c_locale(_M_c_locale_ctype);
57*38fd1498Szrj     if (_M_del)
58*38fd1498Szrj       delete[] this->table();
59*38fd1498Szrj   }
60*38fd1498Szrj 
61*38fd1498Szrj   // Fill in the narrowing cache and flag whether all values are
62*38fd1498Szrj   // valid or not.  _M_narrow_ok is set to 2 if memcpy can't
63*38fd1498Szrj   // be used.
64*38fd1498Szrj   void
65*38fd1498Szrj   ctype<char>::
_M_narrow_init() const66*38fd1498Szrj   _M_narrow_init() const
67*38fd1498Szrj   {
68*38fd1498Szrj     char __tmp[sizeof(_M_narrow)];
69*38fd1498Szrj     for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i)
70*38fd1498Szrj       __tmp[__i] = __i;
71*38fd1498Szrj     do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow);
72*38fd1498Szrj 
73*38fd1498Szrj     _M_narrow_ok = 1;
74*38fd1498Szrj     if (__builtin_memcmp(__tmp, _M_narrow, sizeof(_M_narrow)))
75*38fd1498Szrj       _M_narrow_ok = 2;
76*38fd1498Szrj     else
77*38fd1498Szrj       {
78*38fd1498Szrj 	// Deal with the special case of zero: renarrow with a
79*38fd1498Szrj 	// different default and compare.
80*38fd1498Szrj 	char __c;
81*38fd1498Szrj 	do_narrow(__tmp, __tmp + 1, 1, &__c);
82*38fd1498Szrj 	if (__c == 1)
83*38fd1498Szrj 	  _M_narrow_ok = 2;
84*38fd1498Szrj       }
85*38fd1498Szrj   }
86*38fd1498Szrj 
87*38fd1498Szrj   void
88*38fd1498Szrj   ctype<char>::
_M_widen_init() const89*38fd1498Szrj   _M_widen_init() const
90*38fd1498Szrj   {
91*38fd1498Szrj     char __tmp[sizeof(_M_widen)];
92*38fd1498Szrj     for (size_t __i = 0; __i < sizeof(_M_widen); ++__i)
93*38fd1498Szrj       __tmp[__i] = __i;
94*38fd1498Szrj     do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen);
95*38fd1498Szrj 
96*38fd1498Szrj     _M_widen_ok = 1;
97*38fd1498Szrj     // Set _M_widen_ok to 2 if memcpy can't be used.
98*38fd1498Szrj     if (__builtin_memcmp(__tmp, _M_widen, sizeof(_M_widen)))
99*38fd1498Szrj       _M_widen_ok = 2;
100*38fd1498Szrj   }
101*38fd1498Szrj 
102*38fd1498Szrj #ifdef _GLIBCXX_USE_WCHAR_T
ctype(size_t __refs)103*38fd1498Szrj   ctype<wchar_t>::ctype(size_t __refs)
104*38fd1498Szrj   : __ctype_abstract_base<wchar_t>(__refs),
105*38fd1498Szrj   _M_c_locale_ctype(_S_get_c_locale()), _M_narrow_ok(false)
106*38fd1498Szrj   { _M_initialize_ctype(); }
107*38fd1498Szrj 
ctype(__c_locale __cloc,size_t __refs)108*38fd1498Szrj   ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs)
109*38fd1498Szrj   : __ctype_abstract_base<wchar_t>(__refs),
110*38fd1498Szrj   _M_c_locale_ctype(_S_clone_c_locale(__cloc)), _M_narrow_ok(false)
111*38fd1498Szrj   { _M_initialize_ctype(); }
112*38fd1498Szrj 
~ctype()113*38fd1498Szrj   ctype<wchar_t>::~ctype()
114*38fd1498Szrj   { _S_destroy_c_locale(_M_c_locale_ctype); }
115*38fd1498Szrj 
ctype_byname(const char * __s,size_t __refs)116*38fd1498Szrj   ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs)
117*38fd1498Szrj   : ctype<wchar_t>(__refs)
118*38fd1498Szrj   {
119*38fd1498Szrj     if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
120*38fd1498Szrj       {
121*38fd1498Szrj 	this->_S_destroy_c_locale(this->_M_c_locale_ctype);
122*38fd1498Szrj 	this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
123*38fd1498Szrj 	this->_M_initialize_ctype();
124*38fd1498Szrj       }
125*38fd1498Szrj   }
126*38fd1498Szrj 
~ctype_byname()127*38fd1498Szrj   ctype_byname<wchar_t>::~ctype_byname()
128*38fd1498Szrj   { }
129*38fd1498Szrj 
130*38fd1498Szrj #endif
131*38fd1498Szrj 
132*38fd1498Szrj _GLIBCXX_END_NAMESPACE_VERSION
133*38fd1498Szrj } // namespace
134