2002-11-11 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Nov 2002 23:18:05 +0000 (23:18 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Nov 2002 23:18:05 +0000 (23:18 +0000)
        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
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/testsuite/27_io/istream_unformatted.cc

index 19bc60a..7cf481b 100644 (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.
index 93ca6bc..ff23d98 100644 (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;
          }
       }
index 66cb9a1..387f099 100644 (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;
            }
        }
index 7e449ab..e7676ec 100644 (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;
 }