summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2002-11-11 23:18:05 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2002-11-11 23:18:05 +0000
commit6eeb7d7ae07a0534f9bf07f0bb146d941f4b0731 (patch)
treeb453888a589082dd78db7efe37b82197810bdf37 /libstdc++-v3
parent90e76e864a228ac5cb306aa33f5716913fab061a (diff)
downloadgcc-6eeb7d7ae07a0534f9bf07f0bb146d941f4b0731.tar.gz
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.cc43
-rw-r--r--libstdc++-v3/include/bits/fstream.tcc10
-rw-r--r--libstdc++-v3/testsuite/27_io/istream_unformatted.cc53
4 files changed, 107 insertions, 9 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 19bc60ab71f..7cf481b7353 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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.
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc
index 93ca6bc5de4..ff23d983ae8 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.cc
+++ b/libstdc++-v3/config/io/basic_file_stdio.cc
@@ -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;
}
}
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc
index 66cb9a1b179..387f099ae98 100644
--- a/libstdc++-v3/include/bits/fstream.tcc
+++ b/libstdc++-v3/include/bits/fstream.tcc
@@ -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;
}
}
diff --git a/libstdc++-v3/testsuite/27_io/istream_unformatted.cc b/libstdc++-v3/testsuite/27_io/istream_unformatted.cc
index 7e449ab2fe4..e7676ecb370 100644
--- a/libstdc++-v3/testsuite/27_io/istream_unformatted.cc
+++ b/libstdc++-v3/testsuite/27_io/istream_unformatted.cc
@@ -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;
}