From 0bad3b7c49882a3aa38510a406c8df9e9420439a Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 16 Jun 2003 18:20:28 +0200 Subject: [PATCH] 1.cc: Split and fix for missing seeks between gets and puts into... 2003-06-16 Paolo Carlini * testsuite/27_io/basic_filebuf/sungetc/char/1.cc: Split and fix for missing seeks between gets and puts into... * testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc: New. * testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc: New. * testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc: New. * testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc: New. * testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc: New. * testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc: New. From-SVN: r68021 --- libstdc++-v3/ChangeLog | 11 ++ .../27_io/basic_filebuf/sungetc/char/1-in.cc | 71 +++++++ .../27_io/basic_filebuf/sungetc/char/1-io.cc | 83 ++++++++ .../27_io/basic_filebuf/sungetc/char/1-out.cc | 70 +++++++ .../27_io/basic_filebuf/sungetc/char/1.cc | 178 ------------------ .../27_io/basic_filebuf/sungetc/char/2-in.cc | 72 +++++++ .../27_io/basic_filebuf/sungetc/char/2-io.cc | 82 ++++++++ .../27_io/basic_filebuf/sungetc/char/2-out.cc | 71 +++++++ 8 files changed, 460 insertions(+), 178 deletions(-) create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc delete mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b1f91a4fb53..1620cf4dd2a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2003-06-16 Paolo Carlini + + * testsuite/27_io/basic_filebuf/sungetc/char/1.cc: Split and + fix for missing seeks between gets and puts into... + * testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc: New. + * testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc: New. + * testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc: New. + * testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc: New. + * testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc: New. + * testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc: New. + 2003-06-15 Richard Henderson * config/linker-map.gnu: Export virtual function thunks for diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc new file mode 100644 index 00000000000..bf753cabcb6 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-in.cc @@ -0,0 +1,71 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*gptr()) + + // in + { + constraint_filebuf fb_01; + fb_01.open(name_01, ios::in); + VERIFY( !fb_01.write_position() ); + c1 = fb_01.sbumpc(); + VERIFY( c1 == '/' ); + c2 = fb_01.sungetc(); + VERIFY( c2 == c1 ); + c3 = fb_01.sgetc(); + VERIFY( c3 == c2 ); + fb_01.pubseekoff(2, ios_base::beg, ios_base::in); + c1 = fb_01.sgetc(); + VERIFY( c1 == ' ' ); + c2 = fb_01.sungetc(); + VERIFY( c2 == traits_type::not_eof(traits_type::eof()) ); + VERIFY( !fb_01.write_position() ); + } +} + +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc new file mode 100644 index 00000000000..38819b6ba19 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-io.cc @@ -0,0 +1,83 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @require@ %-*.tst %-*.txt +// @diff@ %-*.tst %*.txt + +const char name_01[] = "tmp_sungetc_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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*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() ); + fb_01.sputc('u'); + fb_01.sputc('v'); + fb_01.pubseekoff(-1, std::ios_base::end); + c3 = fb_01.sbumpc(); + strmsz_1 = fb_01.in_avail(); + c2 = fb_01.sungetc(); + strmsz_2 = fb_01.in_avail(); + VERIFY( c2 == 'v' ); // VERIFY( c2 != traits_type::eof() ); + VERIFY( strmsz_1 + 1 == strmsz_2 ); + //test for _in_cur == _in_end + fb_01.pubseekoff(0, std::ios_base::end); + strmsz_1 = fb_01.in_avail(); // -1 cuz at the end + c1 = fb_01.sgetc(); + c2 = fb_01.sungetc(); + strmsz_2 = fb_01.in_avail(); // 1 + c3 = fb_01.sgetc(); + VERIFY( c1 != c2 ); + VERIFY( strmsz_2 != strmsz_1 ); + VERIFY( strmsz_2 == 1 ); + VERIFY( fb_01.write_position() ); + VERIFY( fb_01.read_position() ); + } +} + +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc new file mode 100644 index 00000000000..f7d78312420 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1-out.cc @@ -0,0 +1,70 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @require@ %-*.tst %-*.txt +// @diff@ %-*.tst %*.txt + +const char name_01[] = "tmp_sungetc_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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*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.sungetc(); + VERIFY( c2 == traits_type::eof() ); + fb_01.sbumpc(); + c1 = fb_01.sbumpc(); + c2 = fb_01.sungetc(); + VERIFY( c1 == c2 ); + VERIFY( fb_01.write_position() ); + VERIFY( !fb_01.read_position() ); + } +} + +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1.cc deleted file mode 100644 index 201217ea00a..00000000000 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/1.cc +++ /dev/null @@ -1,178 +0,0 @@ -// 2001-05-21 Benjamin Kosnik - -// 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 -#include - -// @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(); - //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(); - 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(); - //test for ios_base::out - c1 = fb_02.sgetc(); // undefined - c2 = fb_02.sputbackc('a'); - - // int_type sungetc() - // if in_cur not avail, return pbackfail(), else decrement and - // return to_int_type(*gptr()) - // fb_03._M_out_beg = "uvaacadabras, i wannaZ[\\]^_`abcdefghijkl" - // fb_03._M_out_cur = "aacadabras, i wannaZ[\\]^_`abcdefghijkl" - strmsz_1 = fb_03.in_avail(); - c2 = fb_03.sungetc(); // delete the 'a' - strmsz_2 = fb_03.in_avail(); - VERIFY( c2 == 'v' ); // VERIFY( c2 != traits_type::eof() ); - VERIFY( strmsz_1 + 1 == strmsz_2 ); - //test for _in_cur == _in_beg - for (int i = 50; i < 32 + 29; ++i) - fb_02.sputc(char(i)); - fb_02.pubseekoff(0, std::ios_base::beg, std::ios_base::out); - c1 = fb_02.sgetc(); - strmsz_1 = fb_02.in_avail(); - c2 = fb_02.sungetc(); - c3 = fb_02.sgetc(); - strmsz_2 = fb_02.in_avail(); - VERIFY( c1 == c2 ); - VERIFY( c2 == c3 ); - VERIFY( c1 == traits_type::eof() ); - VERIFY( strmsz_1 == strmsz_2 ); - //test for _in_cur == _in_end - fb_03.pubseekoff(0, std::ios_base::end); - strmsz_1 = fb_03.in_avail(); // -1 cuz at the end - c1 = fb_03.sgetc(); - c2 = fb_03.sungetc(); - strmsz_2 = fb_03.in_avail(); // 1 - c3 = fb_03.sgetc(); - VERIFY( c1 != c2 ); - // VERIFY( c2 == c3 || c2 == traits_type::not_eof(int(c3)) ); - VERIFY( strmsz_2 != strmsz_1 ); - VERIFY( strmsz_2 == 1 ); - //test for ios_base::out -} - -main() -{ - test03(); - test05(); - return 0; -} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc new file mode 100644 index 00000000000..e0814fdddc0 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-in.cc @@ -0,0 +1,72 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*gptr()) + + // in + { + constraint_filebuf fb_01; + 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.sungetc(); + VERIFY( c2 == c1 ); + c3 = fb_01.sgetc(); + VERIFY( c3 == c2 ); + fb_01.pubseekoff(2, ios_base::beg, ios_base::in); + c1 = fb_01.sgetc(); + VERIFY( c1 == ' ' ); + c2 = fb_01.sungetc(); + VERIFY( c2 == traits_type::not_eof(traits_type::eof()) ); + VERIFY( fb_01.unbuffered() ); + } +} + +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc new file mode 100644 index 00000000000..24d015c90e7 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-io.cc @@ -0,0 +1,82 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @require@ %-*.tst %-*.txt +// @diff@ %-*.tst %*.txt + +const char name_01[] = "tmp_sungetc_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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*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() ); + fb_01.sputc('u'); + fb_01.sputc('v'); + fb_01.pubseekoff(-1, std::ios_base::end); + c3 = fb_01.sbumpc(); + strmsz_1 = fb_01.in_avail(); + c2 = fb_01.sungetc(); + strmsz_2 = fb_01.in_avail(); + VERIFY( c2 == 'v' ); // VERIFY( c2 != traits_type::eof() ); + VERIFY( strmsz_1 + 1 == strmsz_2 ); + //test for _in_cur == _in_end + fb_01.pubseekoff(0, std::ios_base::end); + strmsz_1 = fb_01.in_avail(); // -1 cuz at the end + c1 = fb_01.sgetc(); + c2 = fb_01.sungetc(); + strmsz_2 = fb_01.in_avail(); // 1 + c3 = fb_01.sgetc(); + VERIFY( c1 != c2 ); + VERIFY( strmsz_2 != strmsz_1 ); + VERIFY( strmsz_2 == 1 ); + VERIFY( fb_01.unbuffered() ); + } +} + +main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc new file mode 100644 index 00000000000..d6cd79f5c6e --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/sungetc/char/2-out.cc @@ -0,0 +1,71 @@ +// 2001-05-21 Benjamin Kosnik + +// 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 +#include +#include + +// @require@ %-*.tst %-*.txt +// @diff@ %-*.tst %*.txt + +const char name_01[] = "tmp_sungetc_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 sungetc() + // if in_cur not avail, return pbackfail(), else decrement and + // return to_int_type(*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.sungetc(); + VERIFY( c2 == traits_type::eof() ); + fb_01.sbumpc(); + c1 = fb_01.sbumpc(); + c2 = fb_01.sungetc(); + VERIFY( c1 == c2 ); + VERIFY( fb_01.unbuffered() ); + VERIFY( !fb_01.read_position() ); + } +} + +main() +{ + test01(); + return 0; +}