summaryrefslogtreecommitdiff
path: root/libstdc++-v3/src/codecvt.cc
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2002-09-10 19:35:04 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2002-09-10 19:35:04 +0000
commit1bd80d36639becc73d982093018c653d4dc3a8e3 (patch)
tree0ac78e1529f2e352158b6477d3d7a1b652a84244 /libstdc++-v3/src/codecvt.cc
parent5f6a99679a97307a035f421fcd2c90fae4586943 (diff)
downloadgcc-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.cc39
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)
{