From-SVN: r66726
authorBenjamin Kosnik <bkoz@gcc.gnu.org>
Mon, 12 May 2003 18:12:27 +0000 (18:12 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Mon, 12 May 2003 18:12:27 +0000 (18:12 +0000)
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/include/std/std_fstream.h

index 508913864a27937fec86049d2bf8c36d87809d92..fd0ac14c42fae5f608848e20f2c527a807eab252 100644 (file)
@@ -1,3 +1,15 @@
+2003-05-12  Benjamin Kosnik  <bkoz@redhat.com>
+
+       * include/bits/fstream.tcc (_M_overflow): Remove unbuffered bits.
+
+2003-05-12  Paolo Carlini  <pcarlini@unitus.it>
+
+       * include/std/std_fstream.h (_M_convert_to_external): Change
+       to return bool, take two less streamsize parameters.
+       * include/bits/fstream.tcc (_M_convert_to_external): Tweak
+       consistently definition.
+       (_M_overflow): Adjust call points.
+
 2003-05-12  Benjamin Kosnik  <bkoz@redhat.com>
 
        * testsuite/27_io/basic_filebuf/underflow/10096.cc: Add weak bits.
index cec57ffffc08d4bfdfe059f18ba8674fe96e61ca..40d1ece324a317ee1393c6bc5a77544d9ccfd877 100644 (file)
@@ -182,7 +182,8 @@ namespace std
   
   template<typename _CharT, typename _Traits>
     typename basic_filebuf<_CharT, _Traits>::int_type 
-    basic_filebuf<_CharT, _Traits>::_M_underflow(bool __bump)
+    basic_filebuf<_CharT, _Traits>::
+    _M_underflow(bool __bump)
     {
       int_type __ret = traits_type::eof();
       const bool __testin = this->_M_mode & ios_base::in;
@@ -330,6 +331,53 @@ namespace std
       return __ret;
     }
 
+  template<typename _CharT, typename _Traits>
+    typename basic_filebuf<_CharT, _Traits>::int_type 
+    basic_filebuf<_CharT, _Traits>::
+    _M_overflow(int_type __c)
+    {
+      int_type __ret = traits_type::eof();
+      const bool __testput = this->_M_out_beg < this->_M_out_lim;
+
+      if (__testput)
+       {
+         // Need to restore current position. The position of the external
+         // byte sequence (_M_file) corresponds to _M_filepos, and we need
+         // to move it to _M_out_beg for the write.
+         if (_M_filepos && _M_filepos != this->_M_out_beg)
+           {
+             off_type __off = this->_M_out_beg - _M_filepos;
+             _M_file.seekoff(__off, ios_base::cur);
+           }
+
+         // Convert internal buffer to external representation, output.
+         if (_M_convert_to_external(this->_M_out_beg, 
+                                    this->_M_out_lim - this->_M_out_beg))
+           {
+             // Convert pending sequence to external representation, output.
+             // If eof, then just attempt sync.
+             if (!traits_type::eq_int_type(__c, traits_type::eof()))
+               {
+                 // User code must flush when switching modes (thus
+                 // don't sync).
+                 char_type __pending = traits_type::to_char_type(__c);
+                 if (_M_convert_to_external(&__pending, 1))
+                   {
+                     _M_set_indeterminate();
+                     __ret = traits_type::not_eof(__c);
+                   }
+               }
+             else if (!_M_file.sync())
+               {
+                 _M_set_indeterminate();
+                 __ret = traits_type::not_eof(__c);
+               }
+           }
+       }
+      _M_last_overflowed = true;       
+      return __ret;
+    }
+
   template<typename _CharT, typename _Traits>
     typename basic_filebuf<_CharT, _Traits>::int_type 
     basic_filebuf<_CharT, _Traits>::
@@ -358,14 +406,16 @@ namespace std
     }
   
   template<typename _CharT, typename _Traits>
-    void
+    bool
     basic_filebuf<_CharT, _Traits>::
-    _M_convert_to_external(_CharT* __ibuf, streamsize __ilen,
-                          streamsize& __elen, streamsize& __plen)
+    _M_convert_to_external(_CharT* __ibuf, streamsize __ilen)
     {
+      // Sizes of external and pending output.
+      streamsize __elen = 0;
+      streamsize __plen = 0;
+
       const locale __loc = this->getloc();
       const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
-
       if (__cvt.always_noconv() && __ilen)
        {
          __elen += _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen);
@@ -420,67 +470,8 @@ namespace std
                }
            }
        }
-    }
-
-  template<typename _CharT, typename _Traits>
-    typename basic_filebuf<_CharT, _Traits>::int_type 
-    basic_filebuf<_CharT, _Traits>::
-    _M_overflow(int_type __c)
-    {
-      int_type __ret = traits_type::eof();
-      const bool __testput = this->_M_out_beg < this->_M_out_lim;
-      const bool __testunbuffered = _M_file.is_open() && !this->_M_buf_size;
-
-      if (__testput || __testunbuffered)
-       {
-         // Sizes of external and pending output.
-         streamsize __elen = 0;
-         streamsize __plen = 0;
 
-         // Need to restore current position. The position of the external
-         // byte sequence (_M_file) corresponds to _M_filepos, and we need
-         // to move it to _M_out_beg for the write.
-         if (_M_filepos && _M_filepos != this->_M_out_beg)
-           {
-             off_type __off = this->_M_out_beg - _M_filepos;
-             _M_file.seekoff(__off, ios_base::cur);
-           }
-
-         // Convert internal buffer to external representation, output.
-         // NB: In the unbuffered case, no internal buffer exists. 
-         if (!__testunbuffered)
-           _M_convert_to_external(this->_M_out_beg,
-                                  this->_M_out_lim - this->_M_out_beg, 
-                                  __elen, __plen);
-
-         // Checks for codecvt.out failures and _M_file.xsputn failures,
-         // respectively, inside _M_convert_to_external.
-         if (__testunbuffered || (__elen && __elen == __plen))
-           {
-             // Convert pending sequence to external representation, output.
-             // If eof, then just attempt sync.
-             if (!traits_type::eq_int_type(__c, traits_type::eof()))
-               {
-                 char_type __pending = traits_type::to_char_type(__c);
-                 _M_convert_to_external(&__pending, 1, __elen, __plen);
-
-                 // User code must flush when switching modes (thus
-                 // don't sync).
-                 if (__elen == __plen && __elen)
-                   {
-                     _M_set_indeterminate();
-                     __ret = traits_type::not_eof(__c);
-                   }
-               }
-             else if (!_M_file.sync())
-               {
-                 _M_set_indeterminate();
-                 __ret = traits_type::not_eof(__c);
-               }
-           }
-       }
-      _M_last_overflowed = true;       
-      return __ret;
+      return __elen && __elen == __plen;
     }
 
   template<typename _CharT, typename _Traits>
index 0de74e6252d213b776352c8fd3434d5b80ab3bcc..0781f0d5294e6b993571eb23499a15e4949b4950 100644 (file)
@@ -353,8 +353,8 @@ namespace std
        *  @doctodo
        *  @endif
       */
-      void
-      _M_convert_to_external(char_type*, streamsize, streamsize&, streamsize&);
+      bool
+      _M_convert_to_external(char_type*, streamsize);
 
       /**
        *  @brief  Manipulates the buffer.