mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 14:30:59 +08:00
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:
parent
90e76e864a
commit
6eeb7d7ae0
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user