summaryrefslogtreecommitdiff
path: root/libstdc++-v3/src
diff options
context:
space:
mode:
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-15 07:05:04 +0000
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-15 07:05:04 +0000
commit3ab6bad2dbe83a7cf6e0e2983cd9104b43e7ed06 (patch)
tree8de54c61193922ab77a998c6f31861fa57869582 /libstdc++-v3/src
parent7cc1628dc8ce029afc72194d0453c430bfab0db6 (diff)
downloadgcc-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.am15
-rw-r--r--libstdc++-v3/src/Makefile.in27
-rw-r--r--libstdc++-v3/src/locale.cc201
-rw-r--r--libstdc++-v3/src/localename.cc26
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()));