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