Commit 52b62c0e by Paolo Carlini Committed by Paolo Carlini

PR libstdc++/9439, PR libstdc++/9425

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

	PR libstdc++/9439, PR libstdc++/9425
	* config/io/basic_file_stdio.cc
	(__basic_file<char>::seekoff, seekpos): Return -1L if
	fseek fails.
	* include/bits/fstream.tcc (basic_filebuf::seekoff):
	Check _M_file.seekoff return value; always return
	pos_type(off_type(-1)) in case of failure.
	(basic_filebuf::pbackfail): Check this->seekoff return
	value and return traits_type::eof() in case of failure.
	* testsuite/27_io/filebuf_virtuals.cc (test09): Add.

From-SVN: r62408
parent 1efd0b97
2003-02-04 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/9439, PR libstdc++/9425
* config/io/basic_file_stdio.cc
(__basic_file<char>::seekoff, seekpos): Return -1L if
fseek fails.
* include/bits/fstream.tcc (basic_filebuf::seekoff):
Check _M_file.seekoff return value; always return
pos_type(off_type(-1)) in case of failure.
(basic_filebuf::pbackfail): Check this->seekoff return
value and return traits_type::eof() in case of failure.
* testsuite/27_io/filebuf_virtuals.cc (test09): Add.
2003-02-04 Jerry Quinn <jlquinn@optonline.net> 2003-02-04 Jerry Quinn <jlquinn@optonline.net>
* include/std/std_ostream.h (ostream::_M_write): Declare. * include/std/std_ostream.h (ostream::_M_write): Declare.
......
...@@ -203,15 +203,21 @@ namespace std ...@@ -203,15 +203,21 @@ namespace std
__basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way, __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way,
ios_base::openmode /*__mode*/) ios_base::openmode /*__mode*/)
{ {
fseek(_M_cfile, __off, __way); if (!fseek(_M_cfile, __off, __way))
return ftell(_M_cfile); return ftell(_M_cfile);
else
// Fseek failed.
return -1L;
} }
streamoff streamoff
__basic_file<char>::seekpos(streamoff __pos, ios_base::openmode /*__mode*/) __basic_file<char>::seekpos(streamoff __pos, ios_base::openmode /*__mode*/)
{ {
fseek(_M_cfile, __pos, ios_base::beg); if (!fseek(_M_cfile, __pos, ios_base::beg))
return ftell(_M_cfile); return ftell(_M_cfile);
else
// Fseek failed.
return -1L;
} }
int int
......
...@@ -215,7 +215,11 @@ namespace std ...@@ -215,7 +215,11 @@ namespace std
{ {
// At the beginning of the buffer, need to make a // At the beginning of the buffer, need to make a
// putback position available. // putback position available.
this->seekoff(-1, ios_base::cur); // But the seek may fail (f.i., at the beginning of
// a file, see libstdc++/9439) and in that case
// we return traits_type::eof()
if (this->seekoff(-1, ios_base::cur) >= 0)
{
this->underflow(); this->underflow();
if (!__testeof) if (!__testeof)
{ {
...@@ -230,6 +234,7 @@ namespace std ...@@ -230,6 +234,7 @@ namespace std
__ret = traits_type::not_eof(__i); __ret = traits_type::not_eof(__i);
} }
} }
}
_M_last_overflowed = false; _M_last_overflowed = false;
return __ret; return __ret;
} }
...@@ -440,6 +445,7 @@ namespace std ...@@ -440,6 +445,7 @@ namespace std
else if (__testget && __way == ios_base::cur) else if (__testget && __way == ios_base::cur)
__computed_off += this->_M_in_cur - _M_filepos; __computed_off += this->_M_in_cur - _M_filepos;
// Return pos_type(off_type(-1)) in case of failure.
__ret = _M_file.seekoff(__computed_off, __way, __mode); __ret = _M_file.seekoff(__computed_off, __way, __mode);
_M_set_indeterminate(); _M_set_indeterminate();
} }
...@@ -447,8 +453,11 @@ namespace std ...@@ -447,8 +453,11 @@ namespace std
// state, ie _M_file._offset == -1 // state, ie _M_file._offset == -1
else else
{ {
__ret = _M_file.seekoff(__off, ios_base::cur, __mode); pos_type __tmp =
__ret += _M_file.seekoff(__off, ios_base::cur, __mode);
if (__tmp >= 0)
// Seek successful.
__ret = __tmp +
std::max(this->_M_out_cur, this->_M_in_cur) - _M_filepos; std::max(this->_M_out_cur, this->_M_in_cur) - _M_filepos;
} }
} }
......
...@@ -570,6 +570,20 @@ void test08() ...@@ -570,6 +570,20 @@ void test08()
mb.sputbackc(0); mb.sputbackc(0);
} }
// libstdc++/9439, libstdc++/9425
void test09()
{
using namespace std;
bool test = true;
filebuf fbuf;
fbuf.open(name_01, ios_base::in);
filebuf::int_type r = fbuf.sputbackc('a');
fbuf.close();
VERIFY( r == filebuf::traits_type::eof() );
}
main() main()
{ {
test01(); test01();
...@@ -582,5 +596,6 @@ main() ...@@ -582,5 +596,6 @@ main()
test07(); test07();
test08(); test08();
test09();
return 0; return 0;
} }
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