This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Fix libstdc++/9761


Hi,

tested x86-linux, approved by Benjamin, committed.

Paolo.

/////////
2003-06-02  Paolo Carlini  <pcarlini@unitus.it>

	PR libstdc++/9761
	* include/bits/fstream.tcc (pbackfail): If the pback buffer
	is already active don't try to store in it a second char.
	* testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc: New.

	* include/bits/fstream.tcc (pbackfail): Add unbuffered bits.
diff -prN libstdc++-v3-orig/include/bits/fstream.tcc libstdc++-v3/include/bits/fstream.tcc
*** libstdc++-v3-orig/include/bits/fstream.tcc	Mon Jun  2 17:39:33 2003
--- libstdc++-v3/include/bits/fstream.tcc	Mon Jun  2 18:22:25 2003
*************** namespace std
*** 268,321 ****
  
        if (__testin)
  	{
! 	  const bool __testpb = this->_M_in_beg < this->_M_in_cur;
! 	  char_type __c = traits_type::to_char_type(__i);
  	  const bool __testeof = traits_type::eq_int_type(__i, __ret);
! 
! 	  if (__testpb)
  	    {
! 	      const bool __testout = this->_M_mode & ios_base::out;
! 	      const bool __testeq = traits_type::eq(__c, this->_M_in_cur[-1]);
! 
! 	      --this->_M_in_cur;
! 	      if (__testout)
! 		--this->_M_out_cur;
! 	      // Try to put back __c into input sequence in one of three ways.
! 	      // Order these tests done in is unspecified by the standard.
! 	      if (!__testeof && __testeq)
! 		__ret = __i;
! 	      else if (__testeof)
! 		__ret = traits_type::not_eof(__i);
! 	      else
! 		{
! 		  _M_create_pback();
! 		  *this->_M_in_cur = __c; 
! 		  __ret = __i;
! 		}
  	    }
- 	  else
- 	    {	 
-  	      // At the beginning of the buffer, need to make a
- 	      // putback position available.
- 	      // But the seek may fail (f.i., at the beginning of
- 	      // a file, see libstdc++/9439) and in that case
- 	      // we return traits_type::eof()
- 	      if (this->seekoff(-1, ios_base::cur) >= 0)
- 		{
- 		  this->underflow();
- 		  if (!__testeof)
- 		    {
- 		      if (!traits_type::eq(__c, *this->_M_in_cur))
- 			{
- 			  _M_create_pback();
- 			  *this->_M_in_cur = __c;
- 			}
- 		      __ret = __i;
- 		    }
- 		  else
- 		    __ret = traits_type::not_eof(__i);
- 		}
-  	    }
  	}
        _M_last_overflowed = false;	
        return __ret;
--- 268,306 ----
  
        if (__testin)
  	{
! 	  // Remember whether the pback buffer is active, otherwise below
! 	  // we may try to store in it a second char (libstdc++/9761).
! 	  const bool __testpb = this->_M_pback_init;	   
  	  const bool __testeof = traits_type::eq_int_type(__i, __ret);
! 	  
! 	  int_type __tmp;
! 	  if (this->_M_in_beg < this->_M_in_cur)
  	    {
! 	      _M_move_in_cur(-1);
! 	      __tmp = traits_type::to_int_type(*this->_M_in_cur);
! 	    }
! 	  // At the beginning of the buffer, need to make a
! 	  // putback position available.
! 	  // But the seek may fail (f.i., at the beginning of
! 	  // a file, see libstdc++/9439) and in that case
! 	  // we return traits_type::eof().
! 	  else if (this->seekoff(-1, ios_base::cur) < 0
! 		   || traits_type::eq_int_type(__tmp = this->underflow(),
! 					       traits_type::eof()))
! 	    return __ret;
! 
! 	  // Try to put back __i into input sequence in one of three ways.
! 	  // Order these tests done in is unspecified by the standard.
! 	  if (!__testeof && traits_type::eq_int_type(__i, __tmp))
! 	    __ret = __i;
! 	  else if (__testeof)
! 	    __ret = traits_type::not_eof(__i);
! 	  else if (!__testpb)
! 	    {
! 	      _M_create_pback();
! 	      *this->_M_in_cur = traits_type::to_char_type(__i); 
! 	      __ret = __i;
  	    }
  	}
        _M_last_overflowed = false;	
        return __ret;
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc libstdc++-v3/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc	Thu Jan  1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/pbackfail/char/9761.cc	Mon Jun  2 18:08:10 2003
***************
*** 0 ****
--- 1,55 ----
+ // 2003-06-02 Paolo Carlini <pcarlini@unitus.it>
+ 
+ // Copyright (C) 2003 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library is free
+ // software; you can redistribute it and/or modify it under the
+ // terms of the GNU General Public License as published by the
+ // Free Software Foundation; either version 2, or (at your option)
+ // any later version.
+ 
+ // This library is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ // GNU General Public License for more details.
+ 
+ // You should have received a copy of the GNU General Public License along
+ // with this library; see the file COPYING.  If not, write to the Free
+ // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ // USA.
+ 
+ // 27.8.1.4 Overridden virtual functions
+ 
+ #include <fstream>
+ #include <testsuite_hooks.h>
+ 
+ const char name_01[] = "filebuf_virtuals-1.txt"; // file with data in it
+ 
+ // libstdc++/9761
+ void test01()
+ {
+   using namespace std;
+   bool test = true;
+ 
+   filebuf fbuf;
+   filebuf::int_type r1, r2;
+ 
+   fbuf.open(name_01, ios_base::in);
+   
+   fbuf.sbumpc();
+   fbuf.sbumpc();
+ 	
+   r1 = fbuf.sputbackc('a');
+   r2 = fbuf.sputbackc('b');
+ 
+   fbuf.close();
+ 
+   VERIFY( r1 != filebuf::traits_type::eof() );
+   VERIFY( r2 == filebuf::traits_type::eof() );
+ }
+ 
+ main() 
+ {
+   test01();
+   return 0;
+ }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]