diff options
Diffstat (limited to 'contrib/libstdc++/src/ctype.cc')
-rw-r--r-- | contrib/libstdc++/src/ctype.cc | 100 |
1 files changed, 33 insertions, 67 deletions
diff --git a/contrib/libstdc++/src/ctype.cc b/contrib/libstdc++/src/ctype.cc index 3d5ee61..777ff41 100644 --- a/contrib/libstdc++/src/ctype.cc +++ b/contrib/libstdc++/src/ctype.cc @@ -1,4 +1,4 @@ -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -30,15 +30,23 @@ namespace std { - // XXX At some point, just rename this file to ctype_members_char.cc - // and compile it as a separate file instead of including it here. - // Platform-specific initialization code for ctype tables. - #include <bits/ctype_noninline.h> + // Definitions for static const data members of ctype_base. + const ctype_base::mask ctype_base::space; + const ctype_base::mask ctype_base::print; + const ctype_base::mask ctype_base::cntrl; + const ctype_base::mask ctype_base::upper; + const ctype_base::mask ctype_base::lower; + const ctype_base::mask ctype_base::alpha; + const ctype_base::mask ctype_base::digit; + const ctype_base::mask ctype_base::punct; + const ctype_base::mask ctype_base::xdigit; + const ctype_base::mask ctype_base::alnum; + const ctype_base::mask ctype_base::graph; // Definitions for locale::id of standard facets that are specialized. locale::id ctype<char>::id; -#ifdef _GLIBCPP_USE_WCHAR_T +#ifdef _GLIBCXX_USE_WCHAR_T locale::id ctype<wchar_t>::id; #endif @@ -51,7 +59,7 @@ namespace std return static_cast<const ctype<char>&>(*(__tmp->_M_facets[__i])); } -#ifdef _GLIBCPP_USE_WCHAR_T +#ifdef _GLIBCXX_USE_WCHAR_T template<> const ctype<wchar_t>& use_facet<ctype<wchar_t> >(const locale& __loc) @@ -62,18 +70,10 @@ namespace std } #endif - // Definitions for static const data members of ctype_base. - const ctype_base::mask ctype_base::space; - const ctype_base::mask ctype_base::print; - const ctype_base::mask ctype_base::cntrl; - const ctype_base::mask ctype_base::upper; - const ctype_base::mask ctype_base::lower; - const ctype_base::mask ctype_base::alpha; - const ctype_base::mask ctype_base::digit; - const ctype_base::mask ctype_base::punct; - const ctype_base::mask ctype_base::xdigit; - const ctype_base::mask ctype_base::alnum; - const ctype_base::mask ctype_base::graph; + // XXX At some point, just rename this file to ctype_configure_char.cc + // and compile it as a separate file instead of including it here. + // Platform-specific initialization code for ctype tables. + #include <bits/ctype_noninline.h> const size_t ctype<char>::table_size; @@ -84,54 +84,16 @@ namespace std delete[] this->table(); } - // These are dummy placeholders as these virtual functions are never called. - bool - ctype<char>::do_is(mask, char_type) const - { return false; } - - const char* - ctype<char>::do_is(const char_type* __c, const char_type*, mask*) const - { return __c; } - - const char* - ctype<char>::do_scan_is(mask, const char_type* __c, const char_type*) const - { return __c; } - - const char* - ctype<char>::do_scan_not(mask, const char_type* __c, const char_type*) const - { return __c; } - - char - ctype<char>::do_widen(char __c) const - { return __c; } - - const char* - ctype<char>::do_widen(const char* __lo, const char* __hi, char* __dest) const - { - memcpy(__dest, __lo, __hi - __lo); - return __hi; - } - - char - ctype<char>::do_narrow(char __c, char /*__dfault*/) const - { return __c; } - - const char* - ctype<char>::do_narrow(const char* __lo, const char* __hi, - char /*__dfault*/, char* __dest) const - { - memcpy(__dest, __lo, __hi - __lo); - return __hi; - } - -#ifdef _GLIBCPP_USE_WCHAR_T +#ifdef _GLIBCXX_USE_WCHAR_T ctype<wchar_t>::ctype(size_t __refs) - : __ctype_abstract_base<wchar_t>(__refs) - { _M_c_locale_ctype = _S_c_locale; } + : __ctype_abstract_base<wchar_t>(__refs), + _M_c_locale_ctype(_S_get_c_locale()), _M_narrow_ok(false) + { _M_initialize_ctype(); } ctype<wchar_t>::ctype(__c_locale __cloc, size_t __refs) - : __ctype_abstract_base<wchar_t>(__refs) - { _M_c_locale_ctype = _S_clone_c_locale(__cloc); } + : __ctype_abstract_base<wchar_t>(__refs), + _M_c_locale_ctype(_S_clone_c_locale(__cloc)), _M_narrow_ok(false) + { _M_initialize_ctype(); } ctype<wchar_t>::~ctype() { _S_destroy_c_locale(_M_c_locale_ctype); } @@ -139,9 +101,13 @@ namespace std template<> ctype_byname<wchar_t>::ctype_byname(const char* __s, size_t __refs) : ctype<wchar_t>(__refs) - { - _S_destroy_c_locale(_M_c_locale_ctype); - _S_create_c_locale(_M_c_locale_ctype, __s); + { + if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) + { + this->_S_destroy_c_locale(this->_M_c_locale_ctype); + this->_S_create_c_locale(this->_M_c_locale_ctype, __s); + this->_M_initialize_ctype(); + } } #endif } // namespace std |