aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2005-01-11 23:35:43 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2005-01-11 23:35:43 +0000
commit78593d78f1800fcdf5d274e7eef51ed6ca379716 (patch)
tree61535da0dcdbb26accd934c6e3cd5923ac783db4 /libstdc++-v3
parentbc7566caa4d145e59d8623a8413f90915f3747dc (diff)
downloadgcc-78593d78f1800fcdf5d274e7eef51ed6ca379716.zip
gcc-78593d78f1800fcdf5d274e7eef51ed6ca379716.tar.gz
gcc-78593d78f1800fcdf5d274e7eef51ed6ca379716.tar.bz2
istream.cc (basic_istream<char>::ignore(streamsize), [...]): In case more than numeric_limits<streamsize>::max() chars are skipped...
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. Co-Authored-By: Benjamin Kosnik <bkoz@redhat.com> From-SVN: r93208
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/include/bits/istream.tcc27
-rw-r--r--libstdc++-v3/src/istream.cc42
3 files changed, 66 insertions, 15 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 434f487..44c7eff 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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),
diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc
index 1cb88ca..af7fb64 100644
--- a/libstdc++-v3/include/bits/istream.tcc
+++ b/libstdc++-v3/include/bits/istream.tcc
@@ -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();
}
}
diff --git a/libstdc++-v3/src/istream.cc b/libstdc++-v3/src/istream.cc
index e3a3649..2ecd948 100644
--- a/libstdc++-v3/src/istream.cc
+++ b/libstdc++-v3/src/istream.cc
@@ -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();
}
}