From ccb50b8111f3e370a92be2a2367831e98e7bcfff Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 2 Jun 2003 17:36:24 +0200 Subject: [PATCH] std_fstream.h (_M_destroy_pback): Use _M_in_beg instead of unnecessarily taking the address of _M_pback. 2003-06-02 Paolo Carlini * 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 * include/bits/sstream.tcc (seekoff): Remove four unnecessary variables and two 'if', clean up. 2003-06-02 Paolo Carlini * 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. From-SVN: r67334 --- libstdc++-v3/ChangeLog | 18 +++++++ libstdc++-v3/include/bits/sstream.tcc | 35 +++++--------- libstdc++-v3/include/std/std_fstream.h | 10 ++-- .../27_io/basic_stringbuf/seekpos/char/3.cc | 47 +++++++++++++++++++ 4 files changed, 80 insertions(+), 30 deletions(-) create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 85ca56a0346..86672813d1e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,21 @@ +2003-06-02 Paolo Carlini + + * 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 + + * include/bits/sstream.tcc (seekoff): Remove four unnecessary + variables and two 'if', clean up. + +2003-06-02 Paolo Carlini + + * 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. + 2003-05-30 Phil Edwards * docs/doxygen/filter: New file. diff --git a/libstdc++-v3/include/bits/sstream.tcc b/libstdc++-v3/include/bits/sstream.tcc index ff8e7a4f916..b506d184334 100644 --- a/libstdc++-v3/include/bits/sstream.tcc +++ b/libstdc++-v3/include/bits/sstream.tcc @@ -132,45 +132,32 @@ namespace std 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); @@ -207,7 +194,7 @@ namespace std 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 --git a/libstdc++-v3/include/std/std_fstream.h b/libstdc++-v3/include/std/std_fstream.h index 9faf7373006..de192131c14 100644 --- a/libstdc++-v3/include/std/std_fstream.h +++ b/libstdc++-v3/include/std/std_fstream.h @@ -191,7 +191,7 @@ namespace std 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 @@ namespace std // 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 --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc new file mode 100644 index 00000000000..f0973b073e3 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/seekpos/char/3.cc @@ -0,0 +1,47 @@ +// 2003-05-30 Paolo Carlini + +// 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 +#include + +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; +} -- 2.30.2