OSDN Git Service

2002-04-28 Benjamin Kosnik <bkoz@redhat.com>
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2002 07:00:50 +0000 (07:00 +0000)
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Apr 2002 07:00:50 +0000 (07:00 +0000)
        PR libstdc++/5280
        * config/io/basic_file_stdio.h (__basic_file::sys_getc): Return int.
        (__basic_file::sys_ungetc): Take int.
        * config/io/basic_file_stdio.cc (__basic_file::sys_ungetc): Same.
        * include/bits/fstream.tcc (basic_filebuf::_M_underflow_common):
        Use sys_getc for unbuffered input.
        * testsuite/27_io/narrow_stream_objects.cc (test06): New.

        * src/ios.cc (_M_grow_words): Adjust error checking.
        * testsuite/27_io/ios_base_storage.cc: Same.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52879 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/config/io/basic_file_stdio.cc
libstdc++-v3/config/io/basic_file_stdio.h
libstdc++-v3/include/bits/fstream.tcc
libstdc++-v3/src/ios.cc
libstdc++-v3/testsuite/27_io/ios_base_storage.cc
libstdc++-v3/testsuite/27_io/narrow_stream_objects.cc

index 7956c74..e1b79db 100644 (file)
@@ -1,3 +1,16 @@
+2002-04-28  Benjamin Kosnik  <bkoz@redhat.com>
+
+       PR libstdc++/5280
+       * config/io/basic_file_stdio.h (__basic_file::sys_getc): Return int.
+       (__basic_file::sys_ungetc): Take int.
+       * config/io/basic_file_stdio.cc (__basic_file::sys_ungetc): Same.
+       * include/bits/fstream.tcc (basic_filebuf::_M_underflow_common):
+       Use sys_getc for unbuffered input.
+       * testsuite/27_io/narrow_stream_objects.cc (test06): New.
+       
+       * src/ios.cc (_M_grow_words): Adjust error checking.
+       * testsuite/27_io/ios_base_storage.cc: Same.
+
 2002-04-28  Peter Schmid  <schmid@snake.iap.physik.tu-darmstadt.de>
 
        * include/ext/stl_hashtable.h: Import __iterator_category
index eaebdf2..25c93e3 100644 (file)
@@ -81,11 +81,13 @@ namespace std
     return __ret;
   }
 
-  char
-  __basic_file<char>::sys_getc() { return getc (_M_cfile); }
+  int
+  __basic_file<char>::sys_getc() 
+  { return getc(_M_cfile); }
   
-  char
-  __basic_file<char>::sys_ungetc(char __s) { return ungetc (__s, _M_cfile); }
+  int
+  __basic_file<char>::sys_ungetc(int __c) 
+  { return ungetc(__c, _M_cfile); }
   
   __basic_file<char>* 
   __basic_file<char>::open(const char* __name, ios_base::openmode __mode, 
index ca81d6d..137dfec 100644 (file)
@@ -72,11 +72,11 @@ namespace std
       __basic_file*
       sys_open(__c_file* __file, ios_base::openmode __mode);
 
-      char
+      int
       sys_getc();
 
-      char
-      sys_ungetc(char);
+      int
+      sys_ungetc(int);
 
       __basic_file* 
       close(); 
index 740d5e2..2ca89c3 100644 (file)
@@ -224,6 +224,17 @@ namespace std
                return traits_type::to_int_type(*_M_in_cur);
            }
 
+         // Check for unbuffered stream.
+         if (_M_buf_size == 1)
+           {
+             __ret = _M_file.sys_getc();
+             *_M_in_cur = traits_type::to_char_type(__ret);
+             _M_set_determinate(1);
+             if (__testout)
+               _M_out_cur = _M_in_cur;
+             return __ret;
+           }
+
          // Sync internal and external buffers.
          // NB: __testget -> __testput as _M_buf_unified here.
          bool __testget = _M_in_cur && _M_in_beg < _M_in_cur;
@@ -278,14 +289,6 @@ namespace std
                  __ret = traits_type::to_int_type(*_M_in_cur);
                  if (__bump)
                    _M_in_cur_move(1);
-                 else if (_M_buf_size == 1)
-                   {
-                     // If we are synced with stdio, we have to unget the
-                     // character we just read so that the file pointer
-                     // doesn't move.
-                     _M_file.sys_ungetc(*_M_in_cur);
-                     _M_set_indeterminate();
-                   }
                }          
            }
        }
index 1d97bf9..8e834fd 100644 (file)
@@ -226,33 +226,35 @@ namespace std
     // Precondition: _M_word_size <= ix
     int newsize = _S_local_word_size;
     _Words* words = _M_local_word;
-    int i = 0;
     if (ix > _S_local_word_size - 1)
       {
-       const int max = numeric_limits<int>::max();
-       if (ix < max)
-         newsize = ix + 1;
+       if (ix < numeric_limits<int>::max())
+         {
+           newsize = ix + 1;
+           try
+             { words = new _Words[newsize]; }
+           catch (...)
+             {
+               delete [] _M_word;
+               _M_word = 0;
+               _M_streambuf_state |= badbit;
+               if (_M_streambuf_state & _M_exception)
+                 __throw_ios_failure("ios_base::_M_grow_words failure");
+               return _M_word_zero;
+             }
+           for (int i = 0; i < _M_word_size; i++) 
+             words[i] = _M_word[i];
+           if (_M_word && _M_word != _M_local_word) 
+             {
+               delete [] _M_word;
+               _M_word = 0;
+             }
+         }
        else
-         newsize = max;
-
-       try
-         { words = new _Words[newsize]; }
-       catch (...)
          {
-           delete [] _M_word;
-           _M_word = 0;
            _M_streambuf_state |= badbit;
-           if (_M_streambuf_state & _M_exception)
-             __throw_ios_failure("ios_base::_M_grow_words caused exception");
            return _M_word_zero;
          }
-       for (; i < _M_word_size; i++) 
-         words[i] = _M_word[i];
-       if (_M_word && _M_word != _M_local_word) 
-         {
-           delete [] _M_word;
-           _M_word = 0;
-         }
       }
     _M_word = words;
     _M_word_size = newsize;
@@ -351,4 +353,3 @@ namespace std
     return __ret; 
   }
 }  // namespace std
-
index 560e696..c39d030 100644 (file)
@@ -45,7 +45,7 @@ void test01()
 void test02()
 {
   bool test = true;
-  int max = std::numeric_limits<int>::max();
+  int max = std::numeric_limits<int>::max() - 1;
   std::stringbuf        strbuf;
   std::ios              ios(&strbuf);
 
index 3abcb07..27291be 100644 (file)
@@ -1,6 +1,6 @@
 // 2000-08-02 bkoz
 
-// Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -145,6 +145,26 @@ void test05()
   std::cout << "hello " << s << std::endl;
 }
 
+// libstdc++/5280
+// Interactive test: input "1234^D^D" for i should terminate for EOF.
+void test06()
+{
+  using namespace std;
+  int i;
+  cin >> i;
+  if (!cin.good()) 
+    {
+      cerr << endl;
+      cerr << "i == " << i << endl;
+      cerr << "cin.rdstate() == " << cin.rdstate() << endl;
+      cerr << "cin.bad() == " << cin.bad() << endl;      
+      cerr << "cin.fail() == " << cin.fail() << endl;      
+      cerr << "cin.eof() == " << cin.eof() << endl;
+    }   
+  else
+    cerr << "i == " << i << endl;
+}
+
 int 
 main()
 {
@@ -154,5 +174,6 @@ main()
   // test03();
   // test04();
   // test05();
+  // test06();
   return 0;
 }