diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-15 07:05:04 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-15 07:05:04 +0000 |
commit | 3ab6bad2dbe83a7cf6e0e2983cd9104b43e7ed06 (patch) | |
tree | 8de54c61193922ab77a998c6f31861fa57869582 /libstdc++-v3/src | |
parent | 7cc1628dc8ce029afc72194d0453c430bfab0db6 (diff) | |
download | gcc-3ab6bad2dbe83a7cf6e0e2983cd9104b43e7ed06.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48034 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/Makefile.am | 15 | ||||
-rw-r--r-- | libstdc++-v3/src/Makefile.in | 27 | ||||
-rw-r--r-- | libstdc++-v3/src/locale.cc | 201 | ||||
-rw-r--r-- | libstdc++-v3/src/localename.cc | 26 |
4 files changed, 73 insertions, 196 deletions
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index 0e124046000..e0015baadd8 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -60,13 +60,14 @@ INCLUDES = \ $(TOPLEVEL_INCLUDES) sources = \ - basic_file.cc bitset.cc c++locale.cc cmath.cc codecvt.cc \ - complex_io.cc functexcept.cc globals.cc ios.cc limits.cc \ - locale.cc locale-inst.cc localename.cc \ - collate.cc messages.cc moneypunct.cc numpunct.cc time.cc \ - vterminate.cc \ - misc-inst.cc stdexcept.cc stl-inst.cc string-inst.cc strstream.cc \ - valarray-inst.cc wstring-inst.cc concept-inst.cc ext-inst.cc + globals.cc limits.cc \ + basic_file.cc complex_io.cc ios.cc strstream.cc \ + cmath.cc bitset.cc \ + functexcept.cc stdexcept.cc vterminate.cc \ + c++locale.cc locale.cc localename.cc codecvt.cc \ + collate.cc ctype.cc messages.cc moneypunct.cc numpunct.cc time.cc \ + concept-inst.cc locale-inst.cc misc-inst.cc stl-inst.cc \ + string-inst.cc wstring-inst.cc valarray-inst.cc ext-inst.cc VPATH = $(top_srcdir)/src:$(top_srcdir) diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index 643aebe7400..125d1c2643c 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -185,13 +185,14 @@ INCLUDES = \ sources = \ - basic_file.cc bitset.cc c++locale.cc cmath.cc codecvt.cc \ - complex_io.cc functexcept.cc globals.cc ios.cc limits.cc \ - locale.cc locale-inst.cc localename.cc \ - collate.cc messages.cc moneypunct.cc numpunct.cc time.cc \ - vterminate.cc \ - misc-inst.cc stdexcept.cc stl-inst.cc string-inst.cc strstream.cc \ - valarray-inst.cc wstring-inst.cc concept-inst.cc ext-inst.cc + globals.cc limits.cc \ + basic_file.cc complex_io.cc ios.cc strstream.cc \ + cmath.cc bitset.cc \ + functexcept.cc stdexcept.cc vterminate.cc \ + c++locale.cc locale.cc localename.cc codecvt.cc \ + collate.cc ctype.cc messages.cc moneypunct.cc numpunct.cc time.cc \ + concept-inst.cc locale-inst.cc misc-inst.cc stl-inst.cc \ + string-inst.cc wstring-inst.cc valarray-inst.cc ext-inst.cc VPATH = $(top_srcdir)/src:$(top_srcdir) @@ -264,12 +265,12 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I.. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ -libstdc___la_OBJECTS = basic_file.lo bitset.lo c++locale.lo cmath.lo \ -codecvt.lo complex_io.lo functexcept.lo globals.lo ios.lo limits.lo \ -locale.lo locale-inst.lo localename.lo collate.lo messages.lo \ -moneypunct.lo numpunct.lo time.lo vterminate.lo misc-inst.lo \ -stdexcept.lo stl-inst.lo string-inst.lo strstream.lo valarray-inst.lo \ -wstring-inst.lo concept-inst.lo ext-inst.lo +libstdc___la_OBJECTS = globals.lo limits.lo basic_file.lo complex_io.lo \ +ios.lo strstream.lo cmath.lo bitset.lo functexcept.lo stdexcept.lo \ +vterminate.lo c++locale.lo locale.lo localename.lo codecvt.lo \ +collate.lo ctype.lo messages.lo moneypunct.lo numpunct.lo time.lo \ +concept-inst.lo locale-inst.lo misc-inst.lo stl-inst.lo string-inst.lo \ +wstring-inst.lo valarray-inst.lo ext-inst.lo CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) diff --git a/libstdc++-v3/src/locale.cc b/libstdc++-v3/src/locale.cc index 0e899c1d9b3..13c85aba587 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 diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index 2bd34cd4ac8..8c2db9da7c8 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -72,9 +72,14 @@ namespace std { // Initialize the underlying locale model, which also checks to // see if the given name is valid. - __c_locale __cloc = NULL; + __c_locale __cloc; + locale::facet::_S_create_c_locale(__cloc, __str.c_str()); + + // This is needed as presently "C" locales != required data in + // __timepunct, numpunct, and moneypunct. + __c_locale __cloc_c = NULL; if (__str != "C" && __str != "POSIX") - locale::facet::_S_create_c_locale(__cloc, __str.c_str()); + __cloc_c = __cloc; // Allocate facet container. try @@ -90,18 +95,17 @@ namespace std _M_names[i] = __str; // Construct all standard facets and add them to _M_facets. - // XXX How to deal cleanly, consistently with null ("C") __cloc? _M_init_facet(new std::collate<char>(__cloc)); _M_init_facet(new std::ctype<char>(__cloc)); _M_init_facet(new codecvt<char, char, mbstate_t>); - _M_init_facet(new moneypunct<char, false>(__cloc)); - _M_init_facet(new moneypunct<char, true>(__cloc)); + _M_init_facet(new moneypunct<char, false>(__cloc_c)); + _M_init_facet(new moneypunct<char, true>(__cloc_c)); _M_init_facet(new money_get<char>); _M_init_facet(new money_put<char>); - _M_init_facet(new numpunct<char>(__cloc)); + _M_init_facet(new numpunct<char>(__cloc_c)); _M_init_facet(new num_get<char>); _M_init_facet(new num_put<char>); - _M_init_facet(new __timepunct<char>(__cloc, __str.c_str())); + _M_init_facet(new __timepunct<char>(__cloc_c, __str.c_str())); _M_init_facet(new time_get<char>); _M_init_facet(new time_put<char>); _M_init_facet(new std::messages<char>(__cloc, __str.c_str())); @@ -110,14 +114,14 @@ namespace std _M_init_facet(new std::collate<wchar_t>(__cloc)); _M_init_facet(new std::ctype<wchar_t>(__cloc)); _M_init_facet(new codecvt<wchar_t, char, mbstate_t>); - _M_init_facet(new moneypunct<wchar_t, false>(__cloc)); - _M_init_facet(new moneypunct<wchar_t, true>(__cloc)); + _M_init_facet(new moneypunct<wchar_t, false>(__cloc_c)); + _M_init_facet(new moneypunct<wchar_t, true>(__cloc_c)); _M_init_facet(new money_get<wchar_t>); _M_init_facet(new money_put<wchar_t>); - _M_init_facet(new numpunct<wchar_t>(__cloc)); + _M_init_facet(new numpunct<wchar_t>(__cloc_c)); _M_init_facet(new num_get<wchar_t>); _M_init_facet(new num_put<wchar_t>); - _M_init_facet(new __timepunct<wchar_t>(__cloc, __str.c_str())); + _M_init_facet(new __timepunct<wchar_t>(__cloc_c, __str.c_str())); _M_init_facet(new time_get<wchar_t>); _M_init_facet(new time_put<wchar_t>); _M_init_facet(new std::messages<wchar_t>(__cloc, __str.c_str())); |