From: paolo Date: Tue, 11 Jan 2005 23:35:43 +0000 (+0000) Subject: 2005-01-11 Paolo Carlini X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;ds=sidebyside;h=37b8790ed92a09896f9a8ad06bddf8a3d156ca0e;p=pf3gnuchains%2Fgcc-fork.git 2005-01-11 Paolo Carlini Benjamin Kosnik * src/istream.cc (basic_istream::ignore(streamsize), basic_istream::ignore(streamsize, int_type), basic_istream::ignore(streamsize), basic_istream::ignore(streamsize, int_type)): In case more than numeric_limits::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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 434f487d8ff..44c7eff9c8d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,4 +1,16 @@ 2005-01-11 Paolo Carlini + Benjamin Kosnik + + * src/istream.cc (basic_istream::ignore(streamsize), + basic_istream::ignore(streamsize, int_type), + basic_istream::ignore(streamsize), + basic_istream::ignore(streamsize, int_type)): In case + more than numeric_limits::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 * src/istream.cc (basic_istream::ignore(streamsize), basic_istream::ignore(streamsize, int_type), diff --git a/libstdc++-v3/include/bits/istream.tcc b/libstdc++-v3/include/bits/istream.tcc index 1cb88cad114..af7fb6441a4 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::max() && !traits_type::eq_int_type(__c, __eof)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::max() && !traits_type::eq_int_type(__c, __eof) && !traits_type::eq_int_type(__c, __delim)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::max()) + ++_M_gcount; __sb->sbumpc(); } } diff --git a/libstdc++-v3/src/istream.cc b/libstdc++-v3/src/istream.cc index e3a36490283..2ecd948585a 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::max() && !traits_type::eq_int_type(__c, __eof)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::max() && !traits_type::eq_int_type(__c, __eof) && !traits_type::eq_int_type(__c, __delim)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::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::max() && !traits_type::eq_int_type(__c, __eof)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::max() && !traits_type::eq_int_type(__c, __eof) && !traits_type::eq_int_type(__c, __delim)) - _M_gcount = numeric_limits::min(); + { + _M_gcount = numeric_limits::min(); + __large_ignore = true; + } else break; } + if (__large_ignore) + _M_gcount = numeric_limits::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::max()) + ++_M_gcount; __sb->sbumpc(); } }