From c3b8e7f75c83c7e13cb3997d1dcac387daf89f1f Mon Sep 17 00:00:00 2001 From: bkoz Date: Mon, 11 Nov 2002 23:18:05 +0000 Subject: [PATCH] 2002-11-11 Benjamin Kosnik 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@59030 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 10 ++++ libstdc++-v3/config/io/basic_file_stdio.cc | 43 ++++++++++++++---- libstdc++-v3/include/bits/fstream.tcc | 10 ++++ .../testsuite/27_io/istream_unformatted.cc | 53 +++++++++++++++++++++- 4 files changed, 107 insertions(+), 9 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 19bc60a..7cf481b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2002-11-11 Benjamin Kosnik + + 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 * 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 93ca6bc..ff23d98 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -32,6 +32,7 @@ // #include +#include namespace std { @@ -43,8 +44,8 @@ namespace std { this->close(); } void - __basic_file::_M_open_mode(ios_base::openmode __mode, int&, int&, - char* __c_mode) + __basic_file::_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 66cb9a1..387f099 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 7e449ab..e7676ec 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; } -- 2.7.4