diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/istream.tcc | 27 | ||||
-rw-r--r-- | libstdc++-v3/src/istream.cc | 42 |
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(); } } |