Commit 6eeb7d7a by Benjamin Kosnik Committed by Benjamin Kosnik

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
parent 90e76e86
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> 2002-11-11 Jonathan Wakely <redi@gcc.gnu.org>
* docs/html/17_intro/howto.html: Make "chapter 22 notes" a link. * docs/html/17_intro/howto.html: Make "chapter 22 notes" a link.
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
// //
#include <bits/basic_file.h> #include <bits/basic_file.h>
#include <fcntl.h>
namespace std namespace std
{ {
...@@ -43,8 +44,8 @@ namespace std ...@@ -43,8 +44,8 @@ namespace std
{ this->close(); } { this->close(); }
void void
__basic_file<char>::_M_open_mode(ios_base::openmode __mode, int&, int&, __basic_file<char>::_M_open_mode(ios_base::openmode __mode, int& __p_mode,
char* __c_mode) int&, char* __c_mode)
{ {
bool __testb = __mode & ios_base::binary; bool __testb = __mode & ios_base::binary;
bool __testi = __mode & ios_base::in; bool __testi = __mode & ios_base::in;
...@@ -52,18 +53,39 @@ namespace std ...@@ -52,18 +53,39 @@ namespace std
bool __testt = __mode & ios_base::trunc; bool __testt = __mode & ios_base::trunc;
bool __testa = __mode & ios_base::app; 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) if (!__testi && __testo && !__testt && !__testa)
strcpy(__c_mode, "w"); {
strcpy(__c_mode, "w");
__p_mode = (O_WRONLY | O_CREAT);
}
if (!__testi && __testo && !__testt && __testa) 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) 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) if (__testi && !__testo && !__testt && !__testa)
strcpy(__c_mode, "r"); {
strcpy(__c_mode, "r");
__p_mode |= O_RDONLY | O_NONBLOCK;
}
if (__testi && __testo && !__testt && !__testa) if (__testi && __testo && !__testt && !__testa)
strcpy(__c_mode, "r+"); {
strcpy(__c_mode, "r+");
__p_mode |= O_RDWR | O_CREAT;
}
if (__testi && __testo && __testt && !__testa) if (__testi && __testo && __testt && !__testa)
strcpy(__c_mode, "w+"); {
strcpy(__c_mode, "w+");
__p_mode |= O_RDWR | O_CREAT | O_TRUNC;
}
if (__testb) if (__testb)
strcat(__c_mode, "b"); strcat(__c_mode, "b");
} }
...@@ -128,6 +150,11 @@ namespace std ...@@ -128,6 +150,11 @@ namespace std
if ((_M_cfile = fopen(__name, __c_mode))) if ((_M_cfile = fopen(__name, __c_mode)))
{ {
_M_cfile_created = true; _M_cfile_created = true;
// Set input to nonblocking for fifos.
if (__mode & ios_base::in)
fcntl(this->fd(), F_SETFL, O_NONBLOCK);
__ret = this; __ret = this;
} }
} }
......
...@@ -90,11 +90,21 @@ namespace std ...@@ -90,11 +90,21 @@ namespace std
{ {
_M_allocate_internal_buffer(); _M_allocate_internal_buffer();
_M_mode = __mode; _M_mode = __mode;
// Setup initial position of buffer.
_M_set_indeterminate(); _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) if ((__mode & ios_base::ate)
&& this->seekoff(0, ios_base::end, __mode) < 0) && this->seekoff(0, ios_base::end, __mode) < 0)
this->close(); this->close();
__ret = this; __ret = this;
} }
} }
......
...@@ -569,7 +569,54 @@ void test11() ...@@ -569,7 +569,54 @@ void test11()
VERIFY(istr.rdstate() == ios_base::goodbit); 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 int
main() main()
{ {
...@@ -584,5 +631,9 @@ main() ...@@ -584,5 +631,9 @@ main()
test09(); test09();
test10(); test10();
test11(); test11();
test12();
test13();
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