]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
codecvt.h (class __codecvt_abstract_base): Add __c_locale type _M_c_locale_codecvt...
authorPaolo Carlini <pcarlini@unitus.it>
Tue, 10 Sep 2002 19:35:04 +0000 (21:35 +0200)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 10 Sep 2002 19:35:04 +0000 (19:35 +0000)
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.

From-SVN: r57011

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/codecvt.h
libstdc++-v3/src/codecvt.cc
libstdc++-v3/src/localename.cc

index e89c6187ae736f7b9dfc0259f4d57ccd6f3a1e2d..ef14d43bab0f463acda9122707251eafb1505bdb 100644 (file)
@@ -1,3 +1,20 @@
+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):
index 506752f3432c12fd234b9401eeb93d61a70a10b6..3a3f6044e5ff692f619650954afbee768fbc4bdb 100644 (file)
       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() { }
index 032667e3f13307f047b73357a70beedd34c2e1e4..dcce705d22770e18996254143c346334781a5bca 100644 (file)
@@ -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)
       {
index 8fa911891705aad7dfab3ff7627c02f5731def3c..a0c9e75ee8009370dc01334061cd0a0076d7b030 100644 (file)
@@ -127,7 +127,7 @@ namespace std
 
     // 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>);
@@ -143,7 +143,7 @@ namespace std
        
 #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>);