diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2001-12-15 07:05:04 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2001-12-15 07:05:04 +0000 |
commit | def9790d51a51a78a700567bb677225a90bc854e (patch) | |
tree | 8de54c61193922ab77a998c6f31861fa57869582 /libstdc++-v3/src/locale.cc | |
parent | 88f92c0f3f41595fb8c7d233f5aacb205495bd87 (diff) | |
download | gcc-def9790d51a51a78a700567bb677225a90bc854e.zip gcc-def9790d51a51a78a700567bb677225a90bc854e.tar.gz gcc-def9790d51a51a78a700567bb677225a90bc854e.tar.bz2 |
Clean up initialization and simplfy caching of underlying "C" locale objects.
2001-12-14 Benjamin Kosnik <bkoz@redhat.com>
Clean up initialization and simplfy caching of underlying "C"
locale objects.
* src/localename.cc (locale::_Impl::_Impl(string, size_t):
Unconditionally create __clocale object for all named locales,
including "C" and "POSIX".
* config/locale/c_locale_generic.cc
(locale::facet::_S_create_c_locale): Always set __cloc to zero.
* config/locale/c_locale_gnu.cc: Always delete.
* include/bits/localefwd.h (locale::facet::_S_c_locale): New.
* src/locale.cc (locale::classic()): Initialize
locale::facet::_S_c_locale.
(locale::facet::_S_c_locale): Define.
* include/bits/locale_facets.h: Add ctype_byname<wchar_t> ctor
specialization.
* src/locale.cc: Add definition here.
* config/os/gnu-linux/bits/ctype_inline.h: Tweak.
* config/os/gnu-linux/bits/ctype_noninline.h: Adjust initializations.
* include/bits/locale_facets.h (ctype<char>::_M_c_locale_ctype): Add.
Adjust ctors, dtors.
(ctype<char>::_M_toupper): Remove const&.
(ctype<char>::_M_tolower): Remove const&.
(ctype<char>::_M_ctable): Remove const&.
* include/bits/locale_facets.h (collate): Clean up initialization
of _M_c_locale_collate in ctors and dtors.
* config/locale/collate_members_gnu.cc: Always use extended
functions.
* include/bits/locale_facets.h (messages): Clean up inits in ctor/dtor.
(messages_byname): Same.
* config/locale/messages_members_generic.h (messages::~messages):
Remove.
* config/locale/messages_members_gnu.h: Same.
* include/bits/localefwd.h: Clean. Move dtor definitions to
* src/locale.cc: Here.
* testsuite/22_locale/facet.cc: Fix spelling.
Named locale support for ctype<wchar_t>.
* acinclude.m4 (GLIBCPP_ENABLE_CLOCALE): Add variable
ctype_members_* bits.
* aclocal.m4: Regenerate.
* configure: Regenerate.
* src/Makefile.am (sources): Add ctype.cc.
* src/Makefile.in: Regenerate.
* config/locale/ctype_members_generic.cc: New file.
* config/locale/ctype_members_gnu.cc: New file.
* src/locale.cc: Remove ctype<wchart_t> definitions.
From-SVN: r48034
Diffstat (limited to 'libstdc++-v3/src/locale.cc')
-rw-r--r-- | libstdc++-v3/src/locale.cc | 201 |
1 files changed, 36 insertions, 165 deletions
diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc index 0e899c1..13c85ab 100644 --- a/libstdc++-v3/src/locale.cc +++ b/libstdc++-v3/src/locale.cc @@ -348,9 +348,18 @@ namespace std return __ret; } + __c_locale + locale::facet::_S_c_locale; + + locale::facet:: + ~facet() { } + locale::facet:: facet(size_t __refs) throw() : _M_references(__refs) - { } + { + if (!_S_c_locale) + _S_create_c_locale(_S_c_locale, "C"); + } void locale::facet:: @@ -370,6 +379,8 @@ namespace std } } + locale::id::id() { } + // Definitions for static const data members of ctype_base. const ctype_base::mask ctype_base::space; const ctype_base::mask ctype_base::print; @@ -389,7 +400,12 @@ namespace std const size_t ctype<char>::table_size; ctype<char>::~ctype() - { if (_M_del) delete[] this->table(); } + { + if (_M_c_locale_ctype) + _S_destroy_c_locale(_M_c_locale_ctype); + if (_M_del) + delete[] this->table(); + } // These are dummy placeholders as these virtual functions are never called. bool @@ -431,171 +447,26 @@ namespace std return __hi; } - template<> - ctype_byname<char>::ctype_byname(const char* /*__s*/, size_t __refs) - : ctype<char>(new mask[table_size], true, __refs) - { } - -#ifdef _GLIBCPP_USE_WCHAR_T - ctype<wchar_t>::__wmask_type - ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const - { - __wmask_type __ret; - switch (__m) - { - case space: - __ret = wctype("space"); - break; - case print: - __ret = wctype("print"); - break; - case cntrl: - __ret = wctype("cntrl"); - break; - case upper: - __ret = wctype("upper"); - break; - case lower: - __ret = wctype("lower"); - break; - case alpha: - __ret = wctype("alpha"); - break; - case digit: - __ret = wctype("digit"); - break; - case punct: - __ret = wctype("punct"); - break; - case xdigit: - __ret = wctype("xdigit"); - break; - case alnum: - __ret = wctype("alnum"); - break; - case graph: - __ret = wctype("graph"); - break; - default: - __ret = 0; - } - return __ret; - }; - - ctype<wchar_t>::~ctype() { } - - // NB: These ctype<wchar_t> methods are not configuration-specific, - // unlike the ctype<char> bits. +#ifdef _GLIBCPP_USE_WCHAR_T ctype<wchar_t>::ctype(size_t __refs) - : __ctype_abstract_base<wchar_t>(__refs) { } + : __ctype_abstract_base<wchar_t>(__refs) + { _M_c_locale_ctype = _S_clone_c_locale(_S_c_locale); } - ctype<wchar_t>::ctype(__c_locale /*__cloc*/, size_t __refs) - : __ctype_abstract_base<wchar_t>(__refs) { } + 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); } - wchar_t - ctype<wchar_t>::do_toupper(wchar_t __c) const - { return towupper(__c); } - - const wchar_t* - ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const - { - while (__lo < __hi) - { - *__lo = towupper(*__lo); - ++__lo; - } - return __hi; - } - - wchar_t - ctype<wchar_t>::do_tolower(wchar_t __c) const - { return towlower(__c); } - - const wchar_t* - ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const - { - while (__lo < __hi) - { - *__lo = towlower(*__lo); - ++__lo; - } - return __hi; - } - - bool - ctype<wchar_t>:: - do_is(mask __m, char_type __c) const - { return static_cast<bool>(iswctype(__c, _M_convert_to_wmask(__m))); } - - const wchar_t* - ctype<wchar_t>:: - do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const - { - while (__lo < __hi && !this->is(*__m, *__lo)) - ++__lo; - return __lo; - } - - const wchar_t* - ctype<wchar_t>:: - do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const - { - while (__lo < __hi && !this->is(__m, *__lo)) - ++__lo; - return __lo; - } - - const wchar_t* - ctype<wchar_t>:: - do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const - { - while (__lo < __hi && this->is(__m, *__lo) != 0) - ++__lo; - return __lo; - } - - wchar_t - ctype<wchar_t>:: - do_widen(char __c) const - { return btowc(__c); } - - const char* - ctype<wchar_t>:: - do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const - { - mbstate_t __state; - memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); - mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); - return __hi; - } - - char - ctype<wchar_t>:: - do_narrow(wchar_t __wc, char __dfault) const - { - int __c = wctob(__wc); - return (__c == EOF ? __dfault : static_cast<char>(__c)); - } - - const wchar_t* - ctype<wchar_t>:: - do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, - char* __dest) const - { - mbstate_t __state; - memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); - size_t __len = __hi - __lo; - size_t __conv = wcsrtombs(__dest, &__lo, __len, &__state); - if (__conv == __len) - *__dest = __dfault; - return __hi; - } + ctype<wchar_t>::~ctype() + { _S_destroy_c_locale(_M_c_locale_ctype); } template<> - ctype_byname<wchar_t>:: - ctype_byname(const char* /*__s*/, size_t __refs) - : ctype<wchar_t>(__refs) { } -#endif // _GLIBCPP_USE_WCHAR_T + 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); + } +#endif // Definitions for static const data members of time_base template<> @@ -618,7 +489,7 @@ namespace std // Definitions for static const data members of money_base const money_base::pattern - money_base::_S_default_pattern = {{symbol, sign, none, value}}; + money_base::_S_default_pattern = { {symbol, sign, none, value} }; template<> const ctype<char>& @@ -708,12 +579,12 @@ namespace std } template<> - moneypunct_byname<char, false>::moneypunct_byname(const char* /*__s*/, + moneypunct_byname<char, false>::moneypunct_byname(const char*, size_t __refs) : moneypunct<char, false>(__refs) { } template<> - moneypunct_byname<char, true>::moneypunct_byname(const char* /*__s*/, + moneypunct_byname<char, true>::moneypunct_byname(const char*, size_t __refs) : moneypunct<char, true>(__refs) { } } // namespace std |