re PR libstdc++/6746 (ifstream::readsome() always returns zero)

2002-11-11  Benjamin Kosnik  <bkoz@redhat.com>

        PR libstdc++/6746
        * include/bits/fstream.tcc (filebuf::open): Set input pointers.
	* config/io/basic_file_stdio.cc (__basic_file::_M_open_mode): Set
	__p_mode as well.
	(__basic_file::open): Set to non-block for input.
	* testsuite/27_io/istream_unformatted.cc (test12): Add.
	(test13): Same.

From-SVN: r59030
This commit is contained in:
Benjamin Kosnik 2002-11-11 23:18:05 +00:00 committed by Benjamin Kosnik
parent 90e76e864a
commit 6eeb7d7ae0
4 changed files with 107 additions and 9 deletions

View File

@ -1,3 +1,13 @@
2002-11-11 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/6746
* include/bits/fstream.tcc (filebuf::open): Set input pointers.
* config/io/basic_file_stdio.cc (__basic_file::_M_open_mode): Set
__p_mode as well.
(__basic_file::open): Set to non-block for input.
* testsuite/27_io/istream_unformatted.cc (test12): Add.
(test13): Same.
2002-11-11 Jonathan Wakely <redi@gcc.gnu.org>
* docs/html/17_intro/howto.html: Make "chapter 22 notes" a link.

View File

@ -32,6 +32,7 @@
//
#include <bits/basic_file.h>
#include <fcntl.h>
namespace std
{
@ -43,8 +44,8 @@ namespace std
{ this->close(); }
void
__basic_file<char>::_M_open_mode(ios_base::openmode __mode, int&, int&,
char* __c_mode)
__basic_file<char>::_M_open_mode(ios_base::openmode __mode, int& __p_mode,
int&, char* __c_mode)
{
bool __testb = __mode & ios_base::binary;
bool __testi = __mode & ios_base::in;
@ -52,18 +53,39 @@ namespace std
bool __testt = __mode & ios_base::trunc;
bool __testa = __mode & ios_base::app;
// Set __c_mode for use in fopen.
// Set __p_mode for use in open.
if (!__testi && __testo && !__testt && !__testa)
strcpy(__c_mode, "w");
{
strcpy(__c_mode, "w");
__p_mode = (O_WRONLY | O_CREAT);
}
if (!__testi && __testo && !__testt && __testa)
strcpy(__c_mode, "a");
{
strcpy(__c_mode, "a");
__p_mode |= O_WRONLY | O_CREAT | O_APPEND;
}
if (!__testi && __testo && __testt && !__testa)
strcpy(__c_mode, "w");
{
strcpy(__c_mode, "w");
__p_mode |= O_WRONLY | O_CREAT | O_TRUNC;
}
if (__testi && !__testo && !__testt && !__testa)
strcpy(__c_mode, "r");
{
strcpy(__c_mode, "r");
__p_mode |= O_RDONLY | O_NONBLOCK;
}
if (__testi && __testo && !__testt && !__testa)
strcpy(__c_mode, "r+");
{
strcpy(__c_mode, "r+");
__p_mode |= O_RDWR | O_CREAT;
}
if (__testi && __testo && __testt && !__testa)
strcpy(__c_mode, "w+");
{
strcpy(__c_mode, "w+");
__p_mode |= O_RDWR | O_CREAT | O_TRUNC;
}
if (__testb)
strcat(__c_mode, "b");
}
@ -128,6 +150,11 @@ namespace std
if ((_M_cfile = fopen(__name, __c_mode)))
{
_M_cfile_created = true;
// Set input to nonblocking for fifos.
if (__mode & ios_base::in)
fcntl(this->fd(), F_SETFL, O_NONBLOCK);
__ret = this;
}
}

View File

@ -90,11 +90,21 @@ namespace std
{
_M_allocate_internal_buffer();
_M_mode = __mode;
// Setup initial position of buffer.
_M_set_indeterminate();
// Set input buffer to something real.
// NB: Must open in non-blocking way to do this, or must
// set the initial position in a different manner than
// using underflow.
if (__mode & ios_base::in && _M_buf_allocated)
this->underflow();
if ((__mode & ios_base::ate)
&& this->seekoff(0, ios_base::end, __mode) < 0)
this->close();
__ret = this;
}
}

View File

@ -569,7 +569,54 @@ void test11()
VERIFY(istr.rdstate() == ios_base::goodbit);
}
// libstdc++/6746
void test12()
{
using namespace std;
bool test = true;
streamsize sum = 0;
istringstream iss("shamma shamma");
// test01
size_t i = iss.rdbuf()->in_avail();
VERIFY( i != 0 );
// test02
streamsize extracted;
do
{
char buf[1024];
extracted = iss.readsome(buf, sizeof buf);
sum += extracted;
}
while (iss.good() && extracted);
VERIFY( sum != 0 );
}
// libstdc++/6746
void test13()
{
using namespace std;
bool test = true;
streamsize sum = 0;
ifstream ifs("istream_unformatted-1.tst");
// test01
size_t i = ifs.rdbuf()->in_avail();
VERIFY( i != 0 );
// test02
streamsize extracted;
do
{
char buf[1024];
extracted = ifs.readsome(buf, sizeof buf);
sum += extracted;
}
while (ifs.good() && extracted);
VERIFY( sum != 0 );
}
int
main()
{
@ -584,5 +631,9 @@ main()
test09();
test10();
test11();
test12();
test13();
return 0;
}