This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] Clean up sbumpc(), do not special case unbuffered underflow,etc...
- From: Paolo Carlini <pcarlini at unitus dot it>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 10 Jun 2003 02:11:09 +0200
- Subject: [v3] Clean up sbumpc(), do not special case unbuffered underflow,etc...
Hi,
discussed at length on the libstdc++ list, finally reviewed by Benjamin.
Tested x86.
Paolo.
/////////
2003-06-09 Paolo Carlini <pcarlini@unitus.it>
* include/bits/fstream.tcc (_M_underflow): Do not special
case the unbuffered case, which really means simply a one char
get area.
(basic_filebuf): Initialize _M_buf_size.
(setbuf): Unbuffered means _M_buf_size == 1, since only
_M_buf_size - 1 == 0 chars are going to be used for the
put area and 1 for the get area.
* include/std/std_streambuf.h (_M_buf_size): Move to basic_filebuf.
(~basic_streambuf): Tweak.
(basic_streambuf): Do not initialize _M_buf_size.
* include/std/std_fstream.h (_M_buf_size): Add from basic_streambuf.
(~basic_filebuf): Tweak.
(_M_set_buffer): Tweak, considering that _M_buf_size == 1 is the
unbuffered situation (i.e., put area pointers NULL).
* include/bits/streambuf.tcc (sbumpc): Clean up.
* testsuite/27_io/basic_filebuf/sputbackc/char/1.cc: Split into...
* testsuite/27_io/basic_filebuf/sputbackc/char/1-in.cc: New.
* testsuite/27_io/basic_filebuf/sputbackc/char/1-io.cc: New.
* testsuite/27_io/basic_filebuf/sputbackc/char/1-out.cc: New.
* testsuite/27_io/basic_filebuf/sputbackc/char/2-in.cc: New.
* testsuite/27_io/basic_filebuf/sputbackc/char/2-io.cc: New.
* testsuite/27_io/basic_filebuf/sputbackc/char/2-out.cc: New.
diff -prN libstdc++-v3-orig/include/bits/fstream.tcc libstdc++-v3/include/bits/fstream.tcc
*** libstdc++-v3-orig/include/bits/fstream.tcc Fri Jun 6 02:19:14 2003
--- libstdc++-v3/include/bits/fstream.tcc Mon Jun 9 20:18:06 2003
*************** namespace std
*** 71,79 ****
template<typename _CharT, typename _Traits>
basic_filebuf<_CharT, _Traits>::
basic_filebuf() : __streambuf_type(), _M_file(&_M_lock),
! _M_state_cur(__state_type()), _M_state_beg(__state_type()), _M_buf(NULL),
! _M_buf_allocated(false),_M_last_overflowed(false),
! _M_filepos(0), _M_pback(char_type()), _M_pback_cur_save(0),
_M_pback_end_save(0), _M_pback_init(false), _M_codecvt(0)
{
this->_M_buf_unified = true;
--- 71,79 ----
template<typename _CharT, typename _Traits>
basic_filebuf<_CharT, _Traits>::
basic_filebuf() : __streambuf_type(), _M_file(&_M_lock),
! _M_state_cur(__state_type()), _M_state_beg(__state_type()),
! _M_buf(NULL), _M_buf_size(BUFSIZ), _M_buf_allocated(false),
! _M_last_overflowed(false), _M_filepos(0), _M_pback_cur_save(0),
_M_pback_end_save(0), _M_pback_init(false), _M_codecvt(0)
{
this->_M_buf_unified = true;
*************** namespace std
*** 193,294 ****
// fileops happen...
_M_destroy_pback();
! const size_t __buflen = this->_M_buf_size
! ? this->_M_buf_size - 1 : 0;
! if (__buflen)
{
! if (this->_M_in_cur < this->_M_in_end)
! {
! __ret = traits_type::to_int_type(*this->_M_in_cur);
! if (__bump)
! _M_move_in_cur(1);
! return __ret;
! }
! // Sync internal and external buffers.
! if (__testout && this->_M_out_beg < this->_M_out_lim)
! this->overflow();
!
! // Get and convert input sequence.
! streamsize __elen = 0;
! streamsize __ilen = 0;
! if (__check_facet(_M_codecvt).always_noconv())
{
! __elen = _M_file.xsgetn(reinterpret_cast<char*>(this->_M_in_beg), __buflen);
__ilen = __elen;
}
! else
{
! char* __buf = static_cast<char*>(__builtin_alloca(__buflen));
! __elen = _M_file.xsgetn(__buf, __buflen);
!
! const char* __eend;
! char_type* __iend;
! codecvt_base::result __r;
! __r = _M_codecvt->in(_M_state_cur, __buf, __buf + __elen,
! __eend, this->_M_in_beg,
! this->_M_in_beg + __buflen, __iend);
! if (__r == codecvt_base::ok)
! __ilen = __iend - this->_M_in_beg;
! else if (__r == codecvt_base::noconv)
! {
! traits_type::copy(this->_M_in_beg,
! reinterpret_cast<char_type*>(__buf),
! __elen);
! __ilen = __elen;
! }
! else
! {
! // Unwind.
! __ilen = 0;
! _M_file.seekoff(-__elen, ios_base::cur, ios_base::in);
! }
}
-
- if (__ilen > 0)
- {
- _M_set_buffer(__ilen);
- __ret = traits_type::to_int_type(*this->_M_in_cur);
- if (__bump)
- _M_move_in_cur(1);
- }
}
! else
{
! // Unbuffered.
! char __buf;
! if (_M_file.xsgetn(&__buf, 1) > 0)
! {
! if (__check_facet(_M_codecvt).always_noconv())
! {
! char_type* __cp = reinterpret_cast<char_type*>(&__buf);
! __ret = traits_type::to_int_type(*__cp);
! }
! else
! {
! char_type __c;
! const char* __eend;
! char_type* __iend;
! codecvt_base::result __r;
! __r = _M_codecvt->in(_M_state_cur, &__buf, &__buf + 1,
! __eend, &__c, &__c + 1, __iend);
! if (__r == codecvt_base::ok
! || __r == codecvt_base::noconv)
! __ret = traits_type::to_int_type(__c);
! }
!
! // Need to put back this extracted character so that
! // sgetc will not advance the input stream iff
! // underflow, but cannot call pbackfail directly as
! // it calls underflow... which leads to a recursive
! // showdown.
! if (!__bump)
! {
! _M_create_pback();
! *this->_M_in_cur = traits_type::to_char_type(__ret);
! }
! }
! }
}
_M_last_overflowed = false;
return __ret;
--- 193,256 ----
// fileops happen...
_M_destroy_pback();
! const size_t __buflen = this->_M_buf_size > 1
! ? this->_M_buf_size - 1 : 1;
!
! if (this->_M_in_cur < this->_M_in_end)
{
! __ret = traits_type::to_int_type(*this->_M_in_cur);
! if (__bump)
! _M_move_in_cur(1);
! return __ret;
! }
! // Sync internal and external buffers.
! if (__testout && this->_M_out_beg < this->_M_out_lim)
! this->overflow();
!
! // Get and convert input sequence.
! streamsize __elen = 0;
! streamsize __ilen = 0;
! if (__check_facet(_M_codecvt).always_noconv())
! {
! __elen = _M_file.xsgetn(reinterpret_cast<char*>(this->_M_in_beg), __buflen);
! __ilen = __elen;
! }
! else
! {
! char* __buf = static_cast<char*>(__builtin_alloca(__buflen));
! __elen = _M_file.xsgetn(__buf, __buflen);
!
! const char* __eend;
! char_type* __iend;
! codecvt_base::result __r;
! __r = _M_codecvt->in(_M_state_cur, __buf, __buf + __elen,
! __eend, this->_M_in_beg,
! this->_M_in_beg + __buflen, __iend);
! if (__r == codecvt_base::ok)
! __ilen = __iend - this->_M_in_beg;
! else if (__r == codecvt_base::noconv)
{
! traits_type::copy(this->_M_in_beg,
! reinterpret_cast<char_type*>(__buf),
! __elen);
__ilen = __elen;
}
! else
{
! // Unwind.
! __ilen = 0;
! _M_file.seekoff(-__elen, ios_base::cur, ios_base::in);
}
}
!
! if (__ilen > 0)
{
! _M_set_buffer(__ilen);
! __ret = traits_type::to_int_type(*this->_M_in_cur);
! if (__bump)
! _M_move_in_cur(1);
! }
}
_M_last_overflowed = false;
return __ret;
*************** namespace std
*** 467,473 ****
setbuf(char_type* __s, streamsize __n)
{
if (!this->is_open() && __s == 0 && __n == 0)
! this->_M_buf_size = 0;
else if (__s && __n > 1)
{
// This is implementation-defined behavior, and assumes that
--- 429,435 ----
setbuf(char_type* __s, streamsize __n)
{
if (!this->is_open() && __s == 0 && __n == 0)
! this->_M_buf_size = 1;
else if (__s && __n > 1)
{
// This is implementation-defined behavior, and assumes that
diff -prN libstdc++-v3-orig/include/bits/streambuf.tcc libstdc++-v3/include/bits/streambuf.tcc
*** libstdc++-v3-orig/include/bits/streambuf.tcc Fri Jun 6 02:19:15 2003
--- libstdc++-v3/include/bits/streambuf.tcc Mon Jun 9 16:27:35 2003
*************** namespace std
*** 48,59 ****
if (_M_in_cur < _M_in_end)
{
char_type __c = *this->_M_in_cur;
__ret = traits_type::to_int_type(__c);
-
- if (_M_buf_size)
- _M_move_in_cur(1);
- else
- this->underflow();
}
else
__ret = this->uflow();
--- 48,55 ----
if (_M_in_cur < _M_in_end)
{
char_type __c = *this->_M_in_cur;
+ _M_move_in_cur(1);
__ret = traits_type::to_int_type(__c);
}
else
__ret = this->uflow();
diff -prN libstdc++-v3-orig/include/std/std_fstream.h libstdc++-v3/include/std/std_fstream.h
*** libstdc++-v3-orig/include/std/std_fstream.h Fri Jun 6 02:19:15 2003
--- libstdc++-v3/include/std/std_fstream.h Mon Jun 9 20:17:20 2003
*************** namespace std
*** 121,126 ****
--- 121,135 ----
*/
char_type* _M_buf;
+ /**
+ * @if maint
+ * Actual size of internal buffer. This number is equal to the size
+ * of the put area + 1 position, reserved for the overflow char of
+ * a full area.
+ * @endif
+ */
+ size_t _M_buf_size;
+
// Set iff _M_buf is allocated memory from _M_allocate_internal_buffer.
/**
* @if maint
*************** namespace std
*** 206,211 ****
--- 215,221 ----
~basic_filebuf()
{
this->close();
+ _M_buf_size = 0;
_M_last_overflowed = false;
}
*************** namespace std
*** 429,445 ****
{
const bool __testin = this->_M_mode & ios_base::in;
const bool __testout = this->_M_mode & ios_base::out;
! if (this->_M_buf_size)
{
! if (__testin)
! this->setg(this->_M_buf, this->_M_buf, this->_M_buf + __off);
! if (__testout)
! {
! this->setp(this->_M_buf, this->_M_buf + this->_M_buf_size - 1);
! this->_M_out_lim += __off;
! }
! _M_filepos = this->_M_buf + __off;
}
}
};
--- 439,453 ----
{
const bool __testin = this->_M_mode & ios_base::in;
const bool __testout = this->_M_mode & ios_base::out;
!
! if (__testin)
! this->setg(this->_M_buf, this->_M_buf, this->_M_buf + __off);
! if (this->_M_buf_size > 1 && __testout)
{
! this->setp(this->_M_buf, this->_M_buf + this->_M_buf_size - 1);
! this->_M_out_lim += __off;
}
+ _M_filepos = this->_M_buf + __off;
}
};
diff -prN libstdc++-v3-orig/include/std/std_streambuf.h libstdc++-v3/include/std/std_streambuf.h
*** libstdc++-v3-orig/include/std/std_streambuf.h Fri Jun 6 02:19:15 2003
--- libstdc++-v3/include/std/std_streambuf.h Mon Jun 9 16:27:35 2003
*************** namespace std
*** 197,211 ****
/**
* @if maint
- * Actual size of internal buffer. This number is equal to the size
- * of the put area + 1 position, reserved for the overflow char of
- * a full area.
- * @endif
- */
- size_t _M_buf_size;
-
- /**
- * @if maint
* Place to stash in || out || in | out settings for current streambuf.
* @endif
*/
--- 197,202 ----
*************** namespace std
*** 267,273 ****
~basic_streambuf()
{
_M_buf_unified = false;
- _M_buf_size = 0;
_M_mode = ios_base::openmode(0);
}
--- 258,263 ----
*************** namespace std
*** 468,475 ****
*/
basic_streambuf()
: _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
! _M_out_beg(0), _M_out_cur(0), _M_out_end(0),_M_out_lim(0),
! _M_buf_unified(false), _M_buf_size(BUFSIZ),
_M_mode(ios_base::openmode(0)),_M_buf_locale(locale())
{ }
--- 458,465 ----
*/
basic_streambuf()
: _M_in_beg(0), _M_in_cur(0), _M_in_end(0),
! _M_out_beg(0), _M_out_cur(0), _M_out_end(0),
! _M_out_lim(0), _M_buf_unified(false),
_M_mode(ios_base::openmode(0)),_M_buf_locale(locale())
{ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-in.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-in.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-in.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-in.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,92 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "sgetc.txt"; // file with data in it
+
+ // Test overloaded virtual functions.
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+ typedef std::filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+
+ bool test = true;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // in
+ {
+ constraint_filebuf fb_01; // in
+ fb_01.open(name_01, ios::in);
+ VERIFY( !fb_01.write_position() );
+ c1 = fb_01.sbumpc();
+ VERIFY( c1 == '/' );
+ c2 = fb_01.sputbackc('/');
+ VERIFY( c1 == c2 );
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == c2 );
+ fb_01.sbumpc();
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == ' ' );
+ c1 = fb_01.sgetc();
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c2 == 'a' );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == c2 );
+ c3 = fb_01.sgetc();
+ VERIFY( c1 == c3 );
+ fb_01.pubseekoff(5, ios_base::beg, ios_base::in);
+ c1 = fb_01.sgetc();
+ VERIFY( c1 == '0' );
+ fb_01.sbumpc();
+ c1 = fb_01.sbumpc();
+ VERIFY( c1 == '1' );
+ c2 = fb_01.sputbackc('b');
+ VERIFY( c2 == 'b' );
+ fb_01.sbumpc();
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == '1' );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == '7' );
+ VERIFY( !fb_01.write_position() );
+ VERIFY( fb_01.read_position() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-io.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-io.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-io.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-io.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,99 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "tmp_sputbackc_1io.tst"; // empty file, need to create
+
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+
+ typedef filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+ typedef size_t size_type;
+
+ bool test = true;
+ streamsize strmsz_1, strmsz_2;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // in | out
+ {
+ constraint_filebuf fb_01;
+ fb_01.open(name_01, ios_base::out | ios_base::in | ios_base::trunc);
+ VERIFY( fb_01.write_position() );
+ VERIFY( !fb_01.read_position() );
+ strmsz_1 = fb_01.sputn("racadabras", 10);//"abracadabras or what?"
+ strmsz_2 = fb_01.sputn(", i wanna reach out and", 10);
+ c1 = fb_01.sgetc(); // -1
+ c2 = fb_01.sputbackc('z');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ VERIFY( c1 != c3 );
+ VERIFY( 1 == strmsz_2 );
+ //test for _in_cur == _in_beg
+ // fb_01._M_out_beg = "bd23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZracada" etc
+ fb_01.pubseekoff(10, std::ios_base::beg,
+ std::ios_base::in | std::ios_base::out);
+ fb_01.sputc('m');
+ strmsz_1 = fb_01.in_avail();
+ c1 = fb_01.sgetc();
+ fb_01.snextc();
+ c2 = fb_01.sputbackc('z');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c1 != c2 );
+ VERIFY( c3 == c2 );
+ VERIFY( c1 != c3 );
+ VERIFY( c2 == 'z' );
+ // test for replacing char with identical one
+ fb_01.snextc();
+ fb_01.sputc('u');
+ fb_01.sputc('v');
+ fb_01.sputc('a');
+ strmsz_1 = fb_01.in_avail();
+ c2 = fb_01.sputbackc('a');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ VERIFY( strmsz_1 + 1 == strmsz_2 );
+ VERIFY( fb_01.write_position() );
+ VERIFY( fb_01.read_position() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-out.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-out.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1-out.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1-out.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,70 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "tmp_sputbackc_1out.tst"; // empty file, need to create
+
+ // Test overloaded virtual functions.
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+ typedef std::filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+
+ bool test = true;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // out
+ {
+ constraint_filebuf fb_01; // out
+ fb_01.open(name_01, ios::out | ios::trunc);
+ VERIFY( fb_01.write_position() );
+ VERIFY( !fb_01.read_position() );
+ c1 = fb_01.sgetc();
+ VERIFY( c1 == traits_type::eof() );
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c2 == traits_type::eof() );
+ fb_01.sbumpc();
+ c1 = fb_01.sbumpc();
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c1 == c2 );
+ VERIFY( fb_01.write_position() );
+ VERIFY( !fb_01.read_position() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/1.cc Mon May 12 23:01:39 2003
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/1.cc Thu Jan 1 01:00:00 1970
***************
*** 1,155 ****
- // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
-
- // Copyright (C) 2001, 2002, 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>
-
- // @require@ %-*.tst %-*.txt
- // @diff@ %-*.tst %*.txt
-
- // NB: This test assumes that _M_buf_size == 40, and not the usual
- // buffer_size length of BUFSIZ (8192), so that overflow/underflow can be
- // simulated a bit more readily.
- // NRB (Nota Really Bene): setting it to 40 breaks the test, as intended.
- const int buffer_size = 8192;
- //const int buffer_size = 40;
-
- const char name_01[] = "filebuf_virtuals-1.txt"; // file with data in it
- const char name_02[] = "filebuf_virtuals-2.txt"; // empty file, need to create
- const char name_03[] = "filebuf_virtuals-3.txt"; // empty file, need to create
-
- class derived_filebuf: public std::filebuf
- {
- public:
- void
- set_size(int_type __size) { _M_buf_size = __size; }
- };
-
- derived_filebuf fb_01; // in
- derived_filebuf fb_02; // out
- derived_filebuf fb_03; // in | out
-
- // Initialize filebufs to be the same size regardless of platform.
- void test03()
- {
- fb_01.set_size(buffer_size);
- fb_02.set_size(buffer_size);
- fb_03.set_size(buffer_size);
- }
-
- // Test overloaded virtual functions.
- void test05()
- {
- typedef std::filebuf::int_type int_type;
- typedef std::filebuf::traits_type traits_type;
- typedef std::filebuf::pos_type pos_type;
- typedef std::filebuf::off_type off_type;
- typedef size_t size_type;
-
- bool test = true;
- std::filebuf f_tmp;
- std::streamsize strmsz_1, strmsz_2;
- std::streamoff strmof_1, strmof_2;
- int i = 0, j = 0, k = 0;
-
- fb_01.open(name_01, std::ios_base::in);
- fb_02.open(name_02, std::ios_base::out | std::ios_base::trunc);
- fb_03.open(name_03, std::ios_base::out | std::ios_base::in | std::ios_base::trunc);
-
- int_type c1 = fb_01.sbumpc();
- int_type c2 = fb_02.sbumpc();
- int_type c3 = fb_01.sbumpc();
- int_type c4 = fb_02.sbumpc();
- int_type c5 = fb_03.sbumpc();
- int_type c6 = fb_01.sgetc();
- int_type c7 = fb_02.sgetc();
- int_type c8 = fb_01.sgetc();
- int_type c9 = fb_02.sgetc();
-
- // PUT
- strmsz_1 = fb_03.sputn("racadabras", 10);//"abracadabras or what?"
- strmsz_2 = fb_03.sputn(", i wanna reach out and", 10);
- strmsz_1 = fb_02.sputn("racadabras", 10);
- strmsz_1 = fb_01.sputn("racadabra", 10);
-
- // PUTBACK
- // int_type pbfail(int_type c)
- // called when gptr() null, gptr() == eback(), or traits::eq(*gptr, c) false
- // "pending sequence" is:
- // 1) everything as defined in underflow
- // 2) + if (traits::eq_int_type(c, traits::eof()), then input
- // sequence is backed up one char before the pending sequence is
- // determined.
- // 3) + if (not 2) then c is prepended. Left unspecified is
- // whether the input sequence is backedup or modified in any way
- // returns traits::eof() for failure, unspecified other value for success
-
- // int_type sputbackc(char_type c)
- // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
- // otherwise decrements in_cur and returns *gptr()
- c1 = fb_03.sgetc(); // -1
- c2 = fb_03.sputbackc('z');
- strmsz_2 = fb_03.in_avail();
- c3 = fb_03.sgetc();
- VERIFY( c3 == c2 );
- VERIFY( c1 != c3 );
- VERIFY( 1 == strmsz_2 );
- //test for _in_cur == _in_beg
- // fb_03._M_out_beg = "bd23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZracada" etc
- fb_03.pubseekoff(10, std::ios_base::beg,
- std::ios_base::in | std::ios_base::out);
- fb_03.sputc('m');
- strmsz_1 = fb_03.in_avail();
- c1 = fb_03.sgetc();
- fb_03.snextc();
- c2 = fb_03.sputbackc('z');
- strmsz_2 = fb_03.in_avail();
- c3 = fb_03.sgetc();
- VERIFY( c1 != c2 );
- VERIFY( c3 == c2 );
- VERIFY( c1 != c3 );
- VERIFY( c2 == 'z' );
- // VERIFY( strmsz_1 == strmsz_2 );
- // test for replacing char with identical one
- fb_03.snextc();
- fb_03.sputc('u');
- fb_03.sputc('v');
- fb_03.sputc('a');
- strmsz_1 = fb_03.in_avail();
- c2 = fb_03.sputbackc('a');
- strmsz_2 = fb_03.in_avail();
- c3 = fb_03.sgetc();
- VERIFY( c3 == c2 );
- VERIFY( strmsz_1 + 1 == strmsz_2 );
- //test for ios_base::out
- c1 = fb_02.sgetc(); // undefined
- c2 = fb_02.sputbackc('a');
- VERIFY( c1 == c2 );
- VERIFY( c1 == -1 );
- }
-
- main()
- {
- test03();
- test05();
- return 0;
- }
--- 0 ----
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-in.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-in.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-in.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-in.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,92 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "sgetc.txt"; // file with data in it
+
+ // Test overloaded virtual functions.
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+ typedef std::filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+
+ bool test = true;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // in
+ {
+ constraint_filebuf fb_01; // in
+ fb_01.pubsetbuf(0, 0);
+ fb_01.open(name_01, ios::in);
+ VERIFY( fb_01.unbuffered() );
+ c1 = fb_01.sbumpc();
+ VERIFY( c1 == '/' );
+ c2 = fb_01.sputbackc('/');
+ VERIFY( c1 == c2 );
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == c2 );
+ fb_01.sbumpc();
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == ' ' );
+ c1 = fb_01.sgetc();
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c2 == 'a' );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == c2 );
+ c3 = fb_01.sgetc();
+ VERIFY( c1 == c3 );
+ fb_01.pubseekoff(5, ios_base::beg, ios_base::in);
+ c1 = fb_01.sgetc();
+ VERIFY( c1 == '0' );
+ fb_01.sbumpc();
+ c1 = fb_01.sbumpc();
+ VERIFY( c1 == '1' );
+ c2 = fb_01.sputbackc('b');
+ VERIFY( c2 == 'b' );
+ fb_01.sbumpc();
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == '1' );
+ c3 = fb_01.sbumpc();
+ VERIFY( c3 == '7' );
+ VERIFY( fb_01.unbuffered() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-io.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-io.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-io.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-io.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,98 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "tmp_sputbackc_2io.tst"; // empty file, need to create
+
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+
+ typedef filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+ typedef size_t size_type;
+
+ bool test = true;
+ streamsize strmsz_1, strmsz_2;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // in | out
+ {
+ constraint_filebuf fb_01;
+ fb_01.pubsetbuf(0, 0);
+ fb_01.open(name_01, ios_base::out | ios_base::in | ios_base::trunc);
+ VERIFY( fb_01.unbuffered() );
+ strmsz_1 = fb_01.sputn("racadabras", 10);//"abracadabras or what?"
+ strmsz_2 = fb_01.sputn(", i wanna reach out and", 10);
+ c1 = fb_01.sgetc(); // -1
+ c2 = fb_01.sputbackc('z');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ VERIFY( c1 != c3 );
+ VERIFY( 1 == strmsz_2 );
+ //test for _in_cur == _in_beg
+ // fb_01._M_out_beg = "bd23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZracada" etc
+ fb_01.pubseekoff(10, std::ios_base::beg,
+ std::ios_base::in | std::ios_base::out);
+ fb_01.sputc('m');
+ strmsz_1 = fb_01.in_avail();
+ c1 = fb_01.sgetc();
+ fb_01.snextc();
+ c2 = fb_01.sputbackc('z');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c1 != c2 );
+ VERIFY( c3 == c2 );
+ VERIFY( c1 != c3 );
+ VERIFY( c2 == 'z' );
+ // test for replacing char with identical one
+ fb_01.snextc();
+ fb_01.sputc('u');
+ fb_01.sputc('v');
+ fb_01.sputc('a');
+ strmsz_1 = fb_01.in_avail();
+ c2 = fb_01.sputbackc('a');
+ strmsz_2 = fb_01.in_avail();
+ c3 = fb_01.sgetc();
+ VERIFY( c3 == c2 );
+ VERIFY( strmsz_1 == strmsz_2 );
+ VERIFY( fb_01.unbuffered() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }
diff -prN libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-out.cc libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-out.cc
*** libstdc++-v3-orig/testsuite/27_io/basic_filebuf/sputbackc/char/2-out.cc Thu Jan 1 01:00:00 1970
--- libstdc++-v3/testsuite/27_io/basic_filebuf/sputbackc/char/2-out.cc Mon Jun 9 20:23:26 2003
***************
*** 0 ****
--- 1,71 ----
+ // 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
+
+ // Copyright (C) 2001, 2002, 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>
+ #include <testsuite_io.h>
+
+ // @require@ %-*.tst %-*.txt
+ // @diff@ %-*.tst %*.txt
+
+ const char name_01[] = "tmp_sputbackc_2out.tst"; // empty file, need to create
+
+ // Test overloaded virtual functions.
+ void test01()
+ {
+ using namespace std;
+ using namespace __gnu_cxx_test;
+ typedef std::filebuf::int_type int_type;
+ typedef filebuf::traits_type traits_type;
+
+ bool test = true;
+ int_type c1, c2, c3;
+
+ // int_type sputbackc(char_type c)
+ // if in_cur not avail || ! traits::eq(c, gptr() [-1]), return pbfail
+ // otherwise decrements in_cur and returns *gptr()
+
+ // out
+ {
+ constraint_filebuf fb_01; // out
+ fb_01.pubsetbuf(0, 0);
+ fb_01.open(name_01, ios::out | ios::trunc);
+ VERIFY( fb_01.unbuffered() );
+ VERIFY( !fb_01.read_position() );
+ c1 = fb_01.sgetc();
+ VERIFY( c1 == traits_type::eof() );
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c2 == traits_type::eof() );
+ fb_01.sbumpc();
+ c1 = fb_01.sbumpc();
+ c2 = fb_01.sputbackc('a');
+ VERIFY( c1 == c2 );
+ VERIFY( fb_01.unbuffered() );
+ VERIFY( !fb_01.read_position() );
+ }
+ }
+
+ main()
+ {
+ test01();
+ return 0;
+ }