118334Speter// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2169689Skan// 2006, 2007, 2008, 2009 3132718Skan// Free Software Foundation, Inc. 418334Speter// 518334Speter// This file is part of the GNU ISO C++ Library. This library is free 6132718Skan// software; you can redistribute it and/or modify it under the 718334Speter// terms of the GNU General Public License as published by the 8132718Skan// Free Software Foundation; either version 3, or (at your option) 918334Speter// any later version. 1018334Speter 1118334Speter// This library is distributed in the hope that it will be useful, 1218334Speter// but WITHOUT ANY WARRANTY; without even the implied warranty of 13132718Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1418334Speter// GNU General Public License for more details. 1518334Speter 1618334Speter// Under Section 7 of GPL version 3, you are granted additional 1718334Speter// permissions described in the GCC Runtime Library Exception, version 1818334Speter// 3.1, as published by the Free Software Foundation. 19132718Skan 20169689Skan// You should have received a copy of the GNU General Public License and 21169689Skan// a copy of the GCC Runtime Library Exception along with this program; 2218334Speter// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2318334Speter// <http://www.gnu.org/licenses/>. 2418334Speter 2518334Speter#include <locale> 2618334Speter#include <cstdlib> 2718334Speter#include <cstring> 2818334Speter 2918334Speter_GLIBCXX_BEGIN_NAMESPACE(std) 3050397Sobrien 31132718Skan // Definitions for static const data members of ctype_base. 32132718Skan const ctype_base::mask ctype_base::space; 3318334Speter const ctype_base::mask ctype_base::print; 3418334Speter const ctype_base::mask ctype_base::cntrl; 3518334Speter const ctype_base::mask ctype_base::upper; 3618334Speter const ctype_base::mask ctype_base::lower; 3750397Sobrien const ctype_base::mask ctype_base::alpha; 3890075Sobrien const ctype_base::mask ctype_base::digit; 39169689Skan const ctype_base::mask ctype_base::punct; 4018334Speter const ctype_base::mask ctype_base::xdigit; 41132718Skan const ctype_base::mask ctype_base::alnum; 42132718Skan const ctype_base::mask ctype_base::graph; 43169689Skan 44132718Skan // Definitions for locale::id of standard facets that are specialized. 45169689Skan locale::id ctype<char>::id; 4618334Speter 47117395Skan#ifdef _GLIBCXX_USE_WCHAR_T 4818334Speter locale::id ctype<wchar_t>::id; 4918334Speter#endif 50117395Skan 5150397Sobrien // XXX At some point, just rename this file to ctype_configure_char.cc 5290075Sobrien // and compile it as a separate file instead of including it here. 53169689Skan // Platform-specific initialization code for ctype tables. 5418334Speter#include <bits/ctype_noninline.h> 5550397Sobrien 5650397Sobrien const size_t ctype<char>::table_size; 5718334Speter 58132718Skan ctype<char>::~ctype() 5918334Speter { 6050397Sobrien _S_destroy_c_locale(_M_c_locale_ctype); 6150397Sobrien if (_M_del) 6250397Sobrien delete[] this->table(); 6350397Sobrien } 6450397Sobrien 6550397Sobrien // Fill in the narrowing cache and flag whether all values are 6650397Sobrien // valid or not. _M_narrow_ok is set to 2 if memcpy can't 6750397Sobrien // be used. 6850397Sobrien void 6950397Sobrien ctype<char>:: 7050397Sobrien _M_narrow_init() const 71169689Skan { 72169689Skan char __tmp[sizeof(_M_narrow)]; 73169689Skan for (size_t __i = 0; __i < sizeof(_M_narrow); ++__i) 74169689Skan __tmp[__i] = __i; 7550397Sobrien do_narrow(__tmp, __tmp + sizeof(__tmp), 0, _M_narrow); 7650397Sobrien 7750397Sobrien _M_narrow_ok = 1; 7850397Sobrien if (__builtin_memcmp(__tmp, _M_narrow, sizeof(_M_narrow))) 7950397Sobrien _M_narrow_ok = 2; 8050397Sobrien else 8150397Sobrien { 8250397Sobrien // Deal with the special case of zero: renarrow with a 8350397Sobrien // different default and compare. 8450397Sobrien char __c; 8550397Sobrien do_narrow(__tmp, __tmp + 1, 1, &__c); 8650397Sobrien if (__c == 1) 87169689Skan _M_narrow_ok = 2; 8818334Speter } 8918334Speter } 90132718Skan 91132718Skan void 9218334Speter ctype<char>:: 9318334Speter _M_widen_init() const 9450397Sobrien { 9518334Speter char __tmp[sizeof(_M_widen)]; 9618334Speter for (size_t __i = 0; __i < sizeof(_M_widen); ++__i) 9750397Sobrien __tmp[__i] = __i; 9850397Sobrien do_widen(__tmp, __tmp + sizeof(__tmp), _M_widen); 9950397Sobrien 10018334Speter _M_widen_ok = 1; 10150397Sobrien // Set _M_widen_ok to 2 if memcpy can't be used. 10250397Sobrien if (__builtin_memcmp(__tmp, _M_widen, sizeof(_M_widen))) 10350397Sobrien _M_widen_ok = 2; 10450397Sobrien } 105169689Skan 10618334Speter#ifdef _GLIBCXX_USE_WCHAR_T 10718334Speter ctype<wchar_t>::ctype(size_t __refs) 10818334Speter : __ctype_abstract_base<wchar_t>(__refs), 10918334Speter _M_c_locale_ctype(_S_get_c_locale()), _M_narrow_ok(false) 11018334Speter { _M_initialize_ctype(); } 11118334Speter 112169689Skan ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs) 11318334Speter : __ctype_abstract_base<wchar_t>(__refs), 11418334Speter _M_c_locale_ctype(_S_clone_c_locale(__cloc)), _M_narrow_ok(false) 11518334Speter { _M_initialize_ctype(); } 11618334Speter 11790075Sobrien ctype<wchar_t>::~ctype() 118169689Skan { _S_destroy_c_locale(_M_c_locale_ctype); } 11918334Speter 120169689Skan ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs) 121132718Skan : ctype<wchar_t>(__refs) 12218334Speter { 123132718Skan if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) 12452284Sobrien { 12518334Speter this->_S_destroy_c_locale(this->_M_c_locale_ctype); 12618334Speter this->_S_create_c_locale(this->_M_c_locale_ctype, __s); 127169689Skan this->_M_initialize_ctype(); 12818334Speter } 12990075Sobrien } 13090075Sobrien 13118334Speter ctype_byname<wchar_t>::~ctype_byname() 13218334Speter { } 13318334Speter 134169689Skan#endif 135117395Skan 136117395Skan_GLIBCXX_END_NAMESPACE 13718334Speter