diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-10 19:35:04 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-10 19:35:04 +0000 |
commit | 1bd80d36639becc73d982093018c653d4dc3a8e3 (patch) | |
tree | 0ac78e1529f2e352158b6477d3d7a1b652a84244 /libstdc++-v3/src/codecvt.cc | |
parent | 5f6a99679a97307a035f421fcd2c90fae4586943 (diff) | |
download | gcc-1bd80d36639becc73d982093018c653d4dc3a8e3.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57011 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/src/codecvt.cc')
-rw-r--r-- | libstdc++-v3/src/codecvt.cc | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/libstdc++-v3/src/codecvt.cc b/libstdc++-v3/src/codecvt.cc index 032667e3f13..dcce705d227 100644 --- a/libstdc++-v3/src/codecvt.cc +++ b/libstdc++-v3/src/codecvt.cc @@ -39,10 +39,19 @@ namespace std 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>:: @@ -106,10 +115,20 @@ namespace std // 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>:: @@ -120,7 +139,13 @@ namespace std { 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) { @@ -158,7 +183,13 @@ namespace std { 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) { |