Commit 8dcaff28 by Paolo Carlini Committed by Paolo Carlini

re PR libstdc++/12232 (Incorrect handling of openmode argument in filebuf::seekoff and seekpos)

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

	PR libstdc++/12232
	* include/bits/fstream.tcc (seekoff): Ignore the openmode
	argument; simplify.
	* config/io/basic_file_stdio.h (__basic_file<char>::seekoff,
	seekpos): Remove the openmode argument.
	* config/io/basic_file_stdio.cc (__basic_file<char>::seekoff,
	seekpos): Remove redundant placeholder for the openmode argument.
	* testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New.
	* testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak.
	* testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise.
	* testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise.
	* testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise.

From-SVN: r72048
parent d1aa4795
2003-10-02 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/12232
* include/bits/fstream.tcc (seekoff): Ignore the openmode
argument; simplify.
* config/io/basic_file_stdio.h (__basic_file<char>::seekoff,
seekpos): Remove the openmode argument.
* config/io/basic_file_stdio.cc (__basic_file<char>::seekoff,
seekpos): Remove redundant placeholder for the openmode argument.
* testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New.
* testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak.
* testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise.
* testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise.
* testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise.
2003-10-02 Benjamin Kosnik <bkoz@redhat.com> 2003-10-02 Benjamin Kosnik <bkoz@redhat.com>
* src/locale.cc (locale::_S_initialize): Use __gthread_active_p. * src/locale.cc (locale::_S_initialize): Use __gthread_active_p.
......
...@@ -261,12 +261,11 @@ namespace std ...@@ -261,12 +261,11 @@ namespace std
} }
streampos streampos
__basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way, __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way)
ios_base::openmode /*__mode*/)
{ return lseek(this->fd(), __off, __way); } { return lseek(this->fd(), __off, __way); }
streampos streampos
__basic_file<char>::seekpos(streampos __pos, ios_base::openmode /*__mode*/) __basic_file<char>::seekpos(streampos __pos)
{ return lseek(this->fd(), __pos, ios_base::beg); } { return lseek(this->fd(), __pos, ios_base::beg); }
int int
......
...@@ -98,12 +98,10 @@ namespace std ...@@ -98,12 +98,10 @@ namespace std
xsgetn(char* __s, streamsize __n); xsgetn(char* __s, streamsize __n);
streampos streampos
seekoff(streamoff __off, ios_base::seekdir __way, seekoff(streamoff __off, ios_base::seekdir __way);
ios_base::openmode __mode = ios_base::in | ios_base::out);
streampos streampos
seekpos(streampos __pos, seekpos(streampos __pos);
ios_base::openmode __mode = ios_base::in | ios_base::out);
int int
sync(); sync();
......
...@@ -572,15 +572,18 @@ namespace std ...@@ -572,15 +572,18 @@ namespace std
return this; return this;
} }
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// According to 27.8.1.4 p11 - 13 (for seekoff) and the resolution of
// DR 171 (for seekpos), both functions should ignore the last argument
// (of type openmode).
template<typename _CharT, typename _Traits> template<typename _CharT, typename _Traits>
typename basic_filebuf<_CharT, _Traits>::pos_type typename basic_filebuf<_CharT, _Traits>::pos_type
basic_filebuf<_CharT, _Traits>:: basic_filebuf<_CharT, _Traits>::
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode) seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode)
{ {
pos_type __ret = pos_type(off_type(-1)); pos_type __ret = pos_type(off_type(-1));
const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
int __width = 0; int __width = 0;
if (_M_codecvt) if (_M_codecvt)
__width = _M_codecvt->encoding(); __width = _M_codecvt->encoding();
...@@ -588,7 +591,7 @@ namespace std ...@@ -588,7 +591,7 @@ namespace std
__width = 0; __width = 0;
const bool __testfail = __off != 0 && __width <= 0; const bool __testfail = __off != 0 && __width <= 0;
if (this->is_open() && !__testfail && (__testin || __testout)) if (this->is_open() && !__testfail)
{ {
// Ditch any pback buffers to avoid confusion. // Ditch any pback buffers to avoid confusion.
_M_destroy_pback(); _M_destroy_pback();
...@@ -618,7 +621,7 @@ namespace std ...@@ -618,7 +621,7 @@ namespace std
} }
// Returns pos_type(off_type(-1)) in case of failure. // Returns pos_type(off_type(-1)) in case of failure.
__ret = _M_file.seekoff(__computed_off, __way, __mode); __ret = _M_file.seekoff(__computed_off, __way);
_M_reading = false; _M_reading = false;
_M_writing = false; _M_writing = false;
......
// 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[] = "tmp_12232";
// libstdc++/12232
void test01()
{
using namespace std;
bool test __attribute__((unused)) = true;
filebuf fbout;
fbout.open(name, ios_base::out);
fbout.sputn("abc", 3);
streampos p1 = fbout.pubseekoff(0, ios_base::cur, ios_base::in);
VERIFY( p1 != streampos(-1) );
fbout.sputn("de", 2);
streampos p2 = fbout.pubseekpos(p1, ios_base::openmode());
VERIFY( p2 != streampos(-1) );
fbout.sputn("34", 2);
streampos p3 = fbout.pubseekoff(0, ios_base::beg, ios_base::ate);
VERIFY( p3 != streampos(-1) );
fbout.sputn("012", 3);
fbout.close();
filebuf fbin;
fbin.open(name, ios_base::in);
streampos p4 = fbin.pubseekoff(0, ios_base::beg, ios_base::ate);
VERIFY( p4 != streampos(-1) );
VERIFY( fbin.sgetc() == '0' );
streampos p5 = fbin.pubseekoff(-1, ios_base::end, ios_base::out);
VERIFY( p5 != streampos(-1) );
VERIFY( fbin.sbumpc() == '4' );
streampos p6 = fbin.pubseekpos(p4, ios_base::binary);
VERIFY( p6 != streampos(-1) );
VERIFY( fbin.sbumpc() == '0' );
fbin.close();
}
int main()
{
void test01();
return 0;
}
...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) ...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
// seekoff // seekoff
p = in.pubseekoff(0, ios_base::beg, ios_base::in); p = in.pubseekoff(0, ios_base::beg, ios_base::in);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
p = in.pubseekoff(0, ios_base::beg, ios_base::out); p = in.pubseekoff(0, ios_base::beg, ios_base::out);
VERIFY( p == bad ); VERIFY( pass == (p != bad) ); // See libstdc++/12232
p = in.pubseekoff(0, ios_base::beg); p = in.pubseekoff(0, ios_base::beg);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
} }
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
......
...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) ...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
// seekoff // seekoff
p = in.pubseekoff(0, ios_base::beg, ios_base::in); p = in.pubseekoff(0, ios_base::beg, ios_base::in);
VERIFY( p == bad ); VERIFY( pass == (p != bad) ); // See libstdc++/12232
p = in.pubseekoff(0, ios_base::beg, ios_base::out); p = in.pubseekoff(0, ios_base::beg, ios_base::out);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
p = in.pubseekoff(0, ios_base::beg); p = in.pubseekoff(0, ios_base::beg);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
} }
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
......
...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) ...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
// seekpos // seekpos
p = in.pubseekpos(0, ios_base::in); p = in.pubseekpos(0, ios_base::in);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
p = in.pubseekpos(0, ios_base::out); p = in.pubseekpos(0, ios_base::out);
VERIFY( p == bad ); VERIFY( pass == (p != bad) ); // See libstdc++/12232
p = in.pubseekpos(0); p = in.pubseekpos(0);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
} }
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
......
...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) ...@@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass)
// seekpos // seekpos
p = in.pubseekpos(0, ios_base::in); p = in.pubseekpos(0, ios_base::in);
VERIFY( p == bad ); VERIFY( pass == (p != bad) ); // See libstdc++/12232
p = in.pubseekpos(0, ios_base::out); p = in.pubseekpos(0, ios_base::out);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
p = in.pubseekpos(0); p = in.pubseekpos(0);
if (pass) VERIFY( pass == (p != bad) );
VERIFY( p != bad );
} }
const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment