* include/bits/codecvt.h (class __codecvt_abstract_base):
Add __c_locale type _M_c_locale_codecvt member.
(class codecvt<char, char, mbstate_t>,
class codecvt<wchar_t, char, mbstate_t>): Add new
codecvt(__c_locale, size_t) constructor.
(codecvt_byname::codecvt_byname): Update.
* src/codecvt.cc (class codecvt<char, char, mbstate_t>,
class codecvt<wchar_t, char, mbstate_t>): Update codecvt(size_t)
constructor and ~codecvt() destructor; define
codecvt(__c_locale, size_t) constructor.
(codecvt::do_out): Switch to _M_c_locale_codecvt around wcsrtombs call.
(codecvt::do_in): Ditto for mbsrtowcs call.
* src/localename.cc (locale::_Impl::_Impl(const char*, size_t)):
Tweak construction of codecvt facets.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57011
138bc75d-0d04-0410-961f-
82ee72b054a4
+2002-09-10 Paolo Carlini <pcarlini@unitus.it>
+
+ * include/bits/codecvt.h (class __codecvt_abstract_base):
+ Add __c_locale type _M_c_locale_codecvt member.
+ (class codecvt<char, char, mbstate_t>,
+ class codecvt<wchar_t, char, mbstate_t>): Add new
+ codecvt(__c_locale, size_t) constructor.
+ (codecvt_byname::codecvt_byname): Update.
+ * src/codecvt.cc (class codecvt<char, char, mbstate_t>,
+ class codecvt<wchar_t, char, mbstate_t>): Update codecvt(size_t)
+ constructor and ~codecvt() destructor; define
+ codecvt(__c_locale, size_t) constructor.
+ (codecvt::do_out): Switch to _M_c_locale_codecvt around wcsrtombs call.
+ (codecvt::do_in): Ditto for mbsrtowcs call.
+ * src/localename.cc (locale::_Impl::_Impl(const char*, size_t)):
+ Tweak construction of codecvt facets.
+
2002-09-10 Danny Smith <dannysmith@users.sourceforge.net>
* include/bits/locale_facets.tcc (__convert_from_v):
typedef _InternT intern_type;
typedef _ExternT extern_type;
typedef _StateT state_type;
-
+
+ protected:
+ __c_locale _M_c_locale_codecvt;
+
+ public:
// 22.2.1.5.1 codecvt members
result
out(state_type& __state, const intern_type* __from,
explicit
codecvt(size_t __refs = 0);
+ // Non-standard.
+ explicit
+ codecvt(__c_locale __cloc, size_t __refs = 0);
+
protected:
virtual
~codecvt();
explicit
codecvt(size_t __refs = 0);
+ // Non-standard.
+ explicit
+ codecvt(__c_locale __cloc, size_t __refs = 0);
+
protected:
virtual
~codecvt();
{
public:
explicit
- codecvt_byname(const char*, size_t __refs = 0)
- : codecvt<_InternT, _ExternT, _StateT>(__refs) { }
+ codecvt_byname(const char* __s, size_t __refs = 0)
+ : codecvt<_InternT, _ExternT, _StateT>(__refs)
+ {
+ if (_M_c_locale_codecvt != _S_c_locale)
+ _S_destroy_c_locale(_M_c_locale_codecvt);
+ _S_create_c_locale(_M_c_locale_codecvt, __s);
+ }
+
protected:
virtual
~codecvt_byname() { }
codecvt<char, char, mbstate_t>::
codecvt(size_t __refs)
: __codecvt_abstract_base<char, char, mbstate_t>(__refs)
- { }
+ { _M_c_locale_codecvt = _S_c_locale; }
codecvt<char, char, mbstate_t>::
- ~codecvt() { }
+ codecvt(__c_locale __cloc, size_t __refs)
+ : __codecvt_abstract_base<char, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
+
+ codecvt<char, char, mbstate_t>::
+ ~codecvt()
+ {
+ if (_M_c_locale_codecvt != _S_c_locale)
+ _S_destroy_c_locale(_M_c_locale_codecvt);
+ }
codecvt_base::result
codecvt<char, char, mbstate_t>::
// codecvt<wchar_t, char, mbstate_t> required specialization
codecvt<wchar_t, char, mbstate_t>::
codecvt(size_t __refs)
- : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs) { }
+ : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_c_locale; }
codecvt<wchar_t, char, mbstate_t>::
- ~codecvt() { }
+ codecvt(__c_locale __cloc, size_t __refs)
+ : __codecvt_abstract_base<wchar_t, char, mbstate_t>(__refs)
+ { _M_c_locale_codecvt = _S_clone_c_locale(__cloc); }
+
+ codecvt<wchar_t, char, mbstate_t>::
+ ~codecvt()
+ {
+ if (_M_c_locale_codecvt != _S_c_locale)
+ _S_destroy_c_locale(_M_c_locale_codecvt);
+ }
codecvt_base::result
codecvt<wchar_t, char, mbstate_t>::
{
result __ret = error;
size_t __len = min(__from_end - __from, __to_end - __to);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
+#endif
size_t __conv = wcsrtombs(__to, &__from, __len, &__state);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
if (__conv == __len)
{
{
result __ret = error;
size_t __len = min(__from_end - __from, __to_end - __to);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __c_locale __old = __uselocale(_M_c_locale_codecvt);
+#endif
size_t __conv = mbsrtowcs(__to, &__from, __len, &__state);
+#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+ __uselocale(__old);
+#endif
if (__conv == __len)
{
// Construct all standard facets and add them to _M_facets.
_M_init_facet(new std::ctype<char>(__cloc));
- _M_init_facet(new codecvt<char, char, mbstate_t>);
+ _M_init_facet(new codecvt<char, char, mbstate_t>(__cloc));
_M_init_facet(new numpunct<char>(__cloc));
_M_init_facet(new num_get<char>);
_M_init_facet(new num_put<char>);
#ifdef _GLIBCPP_USE_WCHAR_T
_M_init_facet(new std::ctype<wchar_t>(__cloc));
- _M_init_facet(new codecvt<wchar_t, char, mbstate_t>);
+ _M_init_facet(new codecvt<wchar_t, char, mbstate_t>(__cloc));
_M_init_facet(new numpunct<wchar_t>(__cloc));
_M_init_facet(new num_get<wchar_t>);
_M_init_facet(new num_put<wchar_t>);