OSDN Git Service

2001-10-26 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Oct 2001 07:21:56 +0000 (07:21 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Oct 2001 07:21:56 +0000 (07:21 +0000)
libstdc++/4503
* config/locale/codecvt_specializations_ieee_1003.1-200x.h
(__enc_traits::~__enc_traits): Fix.
(__enc_traits::_M_init): Add error checking.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46532 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/codecvt_specializations_ieee_1003.1-200x.h

index 51dccc9..80c5c9d 100644 (file)
@@ -1,3 +1,10 @@
+2001-10-26  Benjamin Kosnik  <bkoz@redhat.com>
+
+       libstdc++/4503
+       * config/locale/codecvt_specializations_ieee_1003.1-200x.h
+       (__enc_traits::~__enc_traits): Fix.
+       (__enc_traits::_M_init): Add error checking.
+       
 2001-10-25  Benjamin Kosnik  <bkoz@redhat.com>
 
        libstdc++/4542
index 3fe261c..3cf9fef 100644 (file)
@@ -85,7 +85,7 @@
     : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0)
     {
       // __intc_end = whatever we are using internally, which is
-      // UCS4 (linux) 
+      // UCS4 (linux, solaris
       // UCS2 == UNICODE  (microsoft, java, aix, whatever...)
       // XXX Currently don't know how to get this data from target system...
       strcpy(_M_int_enc, "UCS4");
 
     ~__enc_traits()
     {
-      iconv_close(_M_in_desc);
-      iconv_close(_M_out_desc);
+      __desc_type __err = reinterpret_cast<iconv_t>(-1);
+      if (_M_in_desc && _M_in_desc != __err) 
+       iconv_close(_M_in_desc);
+      if (_M_out_desc && _M_out_desc != __err) 
+       iconv_close(_M_out_desc);
     } 
 
-    // Initializes
     void
     _M_init()
     {
+      __desc_type __err = reinterpret_cast<iconv_t>(-1);
       _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc);
+      if (_M_in_desc == __err)
+       __throw_runtime_error("creating iconv input descriptor failed.");
       _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc);
-      if (_M_out_desc == iconv_t(-1) || _M_in_desc == iconv_t(-1))
-       {
-         // XXX Extended error checking.
-       }
+      if (_M_out_desc == __err)
+       __throw_runtime_error("creating iconv output descriptor failed.");
     }
 
     bool
     _M_good()
     { 
-      return _M_out_desc && _M_in_desc 
-            && _M_out_desc != iconv_t(-1) && _M_in_desc != iconv_t(-1);
+      __desc_type __err = reinterpret_cast<iconv_t>(-1);
+      bool __test = _M_in_desc && _M_in_desc != __err; 
+      __test &=  _M_out_desc && _M_out_desc != __err;
+      return __test;
     }
 
     const __desc_type*