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] Various clean ups and fixes


Hi,

tested x86-linux, reviewed by Benjamin, committed.

Paolo.

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

	* include/std/std_fstream.h (_M_destroy_pback): Use _M_in_beg
	instead of unnecessarily taking the address of _M_pback.
	(xsgetn): Simplify slightly for a single char pback buffer.

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

	* include/bits/sstream.tcc (seekoff): Remove four unnecessary
	variables and two 'if', clean up.

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

	* include/bits/sstream.tcc (seekpos): Test against _M_out_lim
	not _M_out_end, since the former actually points to the string
	end (vs buffer end).
	* testsuite/27_io/basic_stringbuf/seekpos/char/3.cc: New.
diff -urN libstdc++-v3-2/include/std/std_fstream.h libstdc++-v3/include/std/std_fstream.h
--- libstdc++-v3-2/include/std/std_fstream.h	2003-05-29 13:02:27.000000000 +0200
+++ libstdc++-v3/include/std/std_fstream.h	2003-06-01 13:25:44.000000000 +0200
@@ -191,7 +191,7 @@
 	if (_M_pback_init)
 	  {
 	    // Length _M_in_cur moved in the pback buffer.
-	    const size_t __off = this->_M_in_cur == &_M_pback ? 0 : 1;
+	    const size_t __off = this->_M_in_cur == this->_M_in_beg ? 0 : 1;
 	    this->setg(this->_M_buf, _M_pback_cur_save + __off, 
 		       _M_pback_end_save);
 	    _M_pback_init = false;
@@ -399,12 +399,10 @@
 	// Clear out pback buffer before going on to the real deal...
 	if (this->_M_pback_init)
 	  {
-	    while (__ret < __n && this->_M_in_cur < this->_M_in_end)
+	    if (__n && this->_M_in_cur == this->_M_in_beg)
 	      {
-		*__s = *this->_M_in_cur;
-		++__ret;
-		++__s;
-		++this->_M_in_cur;
+		*__s++ = *this->_M_in_cur++;
+		__ret = 1;
 	      }
 	    _M_destroy_pback();
 	  }
diff -urN libstdc++-v3-1/include/bits/sstream.tcc libstdc++-v3/include/bits/sstream.tcc
--- libstdc++-v3-1/include/bits/sstream.tcc	2003-05-31 00:49:54.000000000 +0200
+++ libstdc++-v3/include/bits/sstream.tcc	2003-05-30 22:20:42.000000000 +0200
@@ -194,7 +194,7 @@
 	  if (__testout)
 	    {
 	      __beg = this->_M_out_beg;
-	      __end = this->_M_out_end;
+	      __end = this->_M_out_lim;
 	      if (0 <= __pos && __pos <= __end - __beg)
 		__testposo = true;
 	    }
diff -urN libstdc++-v3-1/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc
--- libstdc++-v3-1/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc	1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc	2003-05-31 00:33:35.000000000 +0200
@@ -0,0 +1,47 @@
+// 2003-05-30  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.
+
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void test01() 
+{
+  bool 	test = true;
+  using namespace std;
+  typedef stringbuf::pos_type pos_type;
+  typedef stringbuf::off_type off_type;
+
+  stringbuf strb_01(ios_base::out);
+
+  strb_01.sputn("broken peak", 11);
+  pos_type pt_1 = strb_01.pubseekoff(0, ios_base::end, ios_base::out);
+  // In general, according to 27.7.1.3,14, the below has undefined
+  // behaviour since pt_1 + off_type(1) doesn't come from a
+  // previous pubseekpos or pubseekoff. However, given v3 implementation,
+  // this was useful to expose a bug in pubseekpos checks.
+  pos_type pt_2 = strb_01.pubseekpos(pt_1 + off_type(1), ios_base::out);
+  VERIFY( pt_2 == pos_type(off_type(-1)) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff -urN libstdc++-v3-orig/include/bits/sstream.tcc libstdc++-v3/include/bits/sstream.tcc
--- libstdc++-v3-orig/include/bits/sstream.tcc	2003-05-07 07:01:57.000000000 +0200
+++ libstdc++-v3/include/bits/sstream.tcc	2003-05-30 19:48:31.000000000 +0200
@@ -132,45 +132,32 @@
       if (_M_string.capacity() && (__testin || __testout || __testboth))
 	{
 	  char_type* __beg = __testin ? this->_M_in_beg : this->_M_out_beg;
-	  char_type* __curi = NULL;
-	  char_type* __curo = NULL;
-	  char_type* __endi = NULL;
-	  char_type* __endo = NULL;
-
-	  if (__testin || __testboth)
-	    {
-	      __curi = this->_M_in_cur;
-	      __endi = this->_M_in_end;
-	    }
-	  if (__testout || __testboth)
-	    {
-	      __curo = this->_M_out_cur;
-	      // Due to the resolution of DR169, ios_base::end
-	      // is this->_M_out_lim, not _M_out_end.
-	      __endo = this->_M_out_lim;
-	    }
 
 	  off_type __newoffi = 0;
 	  off_type __newoffo = 0;
 	  if (__way == ios_base::cur)
 	    {
-	      __newoffi = __curi - __beg;
-	      __newoffo = __curo - __beg;
+	      __newoffi = this->_M_in_cur - __beg;
+	      __newoffo = this->_M_out_cur - __beg;
 	    }
 	  else if (__way == ios_base::end)
 	    {
-	      __newoffi = __endi - __beg;
-	      __newoffo = __endo - __beg;
+	      __newoffi = this->_M_in_end - __beg;
+	      // Due to the resolution of DR169, ios_base::end
+	      // is this->_M_out_lim, not _M_out_end.
+	      __newoffo = this->_M_out_lim - __beg;
 	    }
 
 	  if ((__testin || __testboth)
-	      && __newoffi + __off >= 0 && __endi - __beg >= __newoffi + __off)
+	      && __newoffi + __off >= 0 
+	      && this->_M_in_end - __beg >= __newoffi + __off)
 	    {
 	      this->_M_in_cur = __beg + __newoffi + __off;
 	      __ret = pos_type(__newoffi);
 	    }
 	  if ((__testout || __testboth)
-	      && __newoffo + __off >= 0 && __endo - __beg >= __newoffo + __off)
+	      && __newoffo + __off >= 0 
+	      && this->_M_out_lim - __beg >= __newoffo + __off)
 	    {
 	      _M_move_out_cur(__newoffo + __off - (this->_M_out_cur - __beg));
 	      __ret = pos_type(__newoffo);

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