Commit 3ecaae52 by Paolo Carlini Committed by Paolo Carlini

PR libstdc++/38365 (cont)

2008-12-02  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/38365 (cont)
	* src/localename.cc (locale::locale(const locale&, const locale&,
	category)): Revert last changes.
	* src/localename.cc (locale::_Impl::_M_replace_categories(const
	_Impl*, category)): Fix here instead; rework.

From-SVN: r142358
parent 84cfdcb3
2008-12-02 Paolo Carlini <paolo.carlini@oracle.com> 2008-12-02 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/38365 (cont)
* src/localename.cc (locale::locale(const locale&, const locale&,
category)): Revert last changes.
* src/localename.cc (locale::_Impl::_M_replace_categories(const
_Impl*, category)): Fix here instead; rework.
2008-12-02 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/38365 PR libstdc++/38365
* src/localename.cc (locale::locale(const locale&, const locale&, * src/localename.cc (locale::locale(const locale&, const locale&,
category)): Fix. category)): Fix.
......
...@@ -157,14 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -157,14 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
locale::locale(const locale& __base, const locale& __add, category __cat) locale::locale(const locale& __base, const locale& __add, category __cat)
: _M_impl(0) : _M_impl(0)
{ { _M_coalesce(__base, __add, __cat); }
_M_coalesce(__base, __add, __cat);
if (!__base._M_impl->_M_names[0] || !__add._M_impl->_M_names[0])
{
delete [] _M_impl->_M_names[0];
_M_impl->_M_names[0] = 0; // Unnamed.
}
}
void void
locale::_M_coalesce(const locale& __base, const locale& __add, locale::_M_coalesce(const locale& __base, const locale& __add,
...@@ -274,29 +267,43 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -274,29 +267,43 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_M_replace_categories(const _Impl* __imp, category __cat) _M_replace_categories(const _Impl* __imp, category __cat)
{ {
category __mask = 1; category __mask = 1;
const bool __have_names = _M_names[0] && __imp->_M_names[0]; if (!_M_names[0] || !__imp->_M_names[0])
for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1) {
if (_M_names[0])
{
delete [] _M_names[0];
_M_names[0] = 0; // Unnamed.
}
for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1)
{
if (__mask & __cat)
// Need to replace entry in _M_facets with other locale's info.
_M_replace_category(__imp, _S_facet_categories[__ix]);
}
}
else
{ {
if (__mask & __cat) if (!_M_names[1])
{ {
// Need to replace entry in _M_facets with other locale's info. // A full set of _M_names must be prepared, all identical
_M_replace_category(__imp, _S_facet_categories[__ix]); // to _M_names[0] to begin with. Then, below, a few will
// If both have names, go ahead and mangle. // be replaced by the corresponding __imp->_M_names. I.e.,
if (__have_names) // not a "simple" locale anymore (see locale::operator==).
const size_t __len = std::strlen(_M_names[0]) + 1;
for (size_t __i = 1; __i < _S_categories_size; ++__i)
{ {
if (!_M_names[1]) _M_names[__i] = new char[__len];
{ std::memcpy(_M_names[__i], _M_names[0], __len);
// A full set of _M_names must be prepared, all identical }
// to _M_names[0] to begin with. Then, below, a few will }
// be replaced by the corresponding __imp->_M_names. I.e.,
// not a "simple" locale anymore (see locale::operator==). for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1)
const size_t __len = std::strlen(_M_names[0]) + 1; {
for (size_t __i = 1; __i < _S_categories_size; ++__i) if (__mask & __cat)
{ {
_M_names[__i] = new char[__len]; // Need to replace entry in _M_facets with other locale's info.
std::memcpy(_M_names[__i], _M_names[0], __len); _M_replace_category(__imp, _S_facet_categories[__ix]);
}
}
// FIXME: Hack for libstdc++/29217: the numerical encodings // FIXME: Hack for libstdc++/29217: the numerical encodings
// of the time and collate categories are swapped vs the // of the time and collate categories are swapped vs the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment