OSDN Git Service

2005-01-11 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Jan 2005 23:35:43 +0000 (23:35 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Jan 2005 23:35:43 +0000 (23:35 +0000)
    Benjamin Kosnik  <bkoz@redhat.com>

* src/istream.cc (basic_istream<char>::ignore(streamsize),
basic_istream<char>::ignore(streamsize, int_type),
basic_istream<wchar_t>::ignore(streamsize),
basic_istream<wchar_t>::ignore(streamsize, int_type)): In case
more than numeric_limits<streamsize>::max() chars are skipped,
set _M_gcount = max().
* include/bits/istream.tcc (ignore(streamsize), ignore(streamsize,
int_type)): Likewise; keep simple, don't forward.

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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/istream.tcc
libstdc++-v3/src/istream.cc

index 434f487..44c7eff 100644 (file)
@@ -1,4 +1,16 @@
 2005-01-11  Paolo Carlini  <pcarlini@suse.de>
+           Benjamin Kosnik  <bkoz@redhat.com>
+
+       * src/istream.cc (basic_istream<char>::ignore(streamsize),
+       basic_istream<char>::ignore(streamsize, int_type),
+       basic_istream<wchar_t>::ignore(streamsize),
+       basic_istream<wchar_t>::ignore(streamsize, int_type)): In case
+       more than numeric_limits<streamsize>::max() chars are skipped,
+       set _M_gcount = max().
+       * include/bits/istream.tcc (ignore(streamsize), ignore(streamsize,
+       int_type)): Likewise; keep simple, don't forward.
+
+2005-01-11  Paolo Carlini  <pcarlini@suse.de>
 
        * src/istream.cc (basic_istream<char>::ignore(streamsize),
        basic_istream<char>::ignore(streamsize, int_type),
index 1cb88ca..af7fb64 100644 (file)
@@ -671,9 +671,6 @@ namespace std
     basic_istream<_CharT, _Traits>::
     ignore(streamsize __n)
     {
-      if (__n == 1)
-       return ignore();
-
       _M_gcount = 0;
       sentry __cerb(*this, true);
       if (__cerb && __n > 0)
@@ -692,6 +689,7 @@ namespace std
              // by definition, when more than 2G chars are actually ignored,
              // _M_gcount (the return value of gcount, that is) cannot be
              // really correct, being unavoidably too small.
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -702,11 +700,17 @@ namespace std
                    }
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
              if (traits_type::eq_int_type(__c, __eof))
                 __err |= ios_base::eofbit;
             }
@@ -723,9 +727,6 @@ namespace std
     basic_istream<_CharT, _Traits>::
     ignore(streamsize __n, int_type __delim)
     {
-      if (traits_type::eq_int_type(__delim, traits_type::eof()))
-       return ignore(__n);
-
       _M_gcount = 0;
       sentry __cerb(*this, true);
       if (__cerb && __n > 0)
@@ -738,6 +739,7 @@ namespace std
               int_type __c = __sb->sgetc();
 
              // See comment above.
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -750,16 +752,23 @@ namespace std
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof)
                      && !traits_type::eq_int_type(__c, __delim))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
               if (traits_type::eq_int_type(__c, __eof))
                 __err |= ios_base::eofbit;
              else if (traits_type::eq_int_type(__c, __delim))
                {
-                 ++_M_gcount;
+                 if (_M_gcount < numeric_limits<streamsize>::max())
+                   ++_M_gcount;
                  __sb->sbumpc();
                }
             }
index e3a3649..2ecd948 100644 (file)
@@ -125,6 +125,7 @@ namespace std
              int_type __c = __sb->sgetc();
 
              // See comment in istream.tcc.
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -147,11 +148,17 @@ namespace std
                    }
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
            }
@@ -183,6 +190,7 @@ namespace std
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();
 
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -212,16 +220,23 @@ namespace std
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof)
                      && !traits_type::eq_int_type(__c, __delim))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
              else if (traits_type::eq_int_type(__c, __delim))
                {
-                 ++_M_gcount;
+                 if (_M_gcount < numeric_limits<streamsize>::max())
+                   ++_M_gcount;
                  __sb->sbumpc();
                }
            }
@@ -403,6 +418,7 @@ namespace std
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();
 
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -425,11 +441,17 @@ namespace std
                    }
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
            }
@@ -461,6 +483,7 @@ namespace std
              __streambuf_type* __sb = this->rdbuf();
              int_type __c = __sb->sgetc();
 
+             bool __large_ignore = false;
              while (true)
                {
                  while (_M_gcount < __n
@@ -490,16 +513,23 @@ namespace std
                  if (__n == numeric_limits<streamsize>::max()
                      && !traits_type::eq_int_type(__c, __eof)
                      && !traits_type::eq_int_type(__c, __delim))
-                   _M_gcount = numeric_limits<streamsize>::min();
+                   {
+                     _M_gcount = numeric_limits<streamsize>::min();
+                     __large_ignore = true;
+                   }
                  else
                    break;
                }
 
+             if (__large_ignore)
+               _M_gcount = numeric_limits<streamsize>::max();
+
              if (traits_type::eq_int_type(__c, __eof))
                __err |= ios_base::eofbit;
              else if (traits_type::eq_int_type(__c, __delim))
                {
-                 ++_M_gcount;
+                 if (_M_gcount < numeric_limits<streamsize>::max())
+                   ++_M_gcount;
                  __sb->sbumpc();
                }
            }