diff options
Diffstat (limited to 'contrib/libstdc++/include/bits/streambuf.tcc')
-rw-r--r-- | contrib/libstdc++/include/bits/streambuf.tcc | 86 |
1 files changed, 39 insertions, 47 deletions
diff --git a/contrib/libstdc++/include/bits/streambuf.tcc b/contrib/libstdc++/include/bits/streambuf.tcc index 5f57df583a7b..be858621b85b 100644 --- a/contrib/libstdc++/include/bits/streambuf.tcc +++ b/contrib/libstdc++/include/bits/streambuf.tcc @@ -1,6 +1,6 @@ // Stream buffer classes -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -67,8 +67,7 @@ namespace std { int_type __ret; bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur; - bool __testne = _M_in_cur && !traits_type::eq(__c, this->gptr()[-1]); - if (!__testpos || __testne) + if (!__testpos || !traits_type::eq(__c, this->gptr()[-1])) __ret = this->pbackfail(traits_type::to_int_type(__c)); else { @@ -199,54 +198,46 @@ namespace std basic_streambuf<_CharT, _Traits>* __sbin, basic_streambuf<_CharT, _Traits>* __sbout) { - typedef typename _Traits::int_type int_type; - - streamsize __ret = 0; - streamsize __bufsize = __sbin->in_avail(); - streamsize __xtrct; - bool __testput = __sbout->_M_mode & ios_base::out; - try - { - while (__testput && __bufsize != -1) - { - if (__bufsize != 0 && __sbin->gptr() != NULL - && __sbin->gptr() + __bufsize <= __sbin->egptr()) - { - __xtrct = __sbout->sputn(__sbin->gptr(), __bufsize); - __ret += __xtrct; - __sbin->_M_in_cur_move(__xtrct); - if (__xtrct != __bufsize) - break; - } - else - { - size_t __size = - __sbin->_M_buf_size_opt > 0 ? __sbin->_M_buf_size_opt : 1; - _CharT* __buf = - static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __size)); - streamsize __charsread = __sbin->sgetn(__buf, __size); - __xtrct = __sbout->sputn(__buf, __charsread); - __ret += __xtrct; - if (__xtrct != __charsread) - break; - } - if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof())) - break; - __bufsize = __sbin->in_avail(); - } - } - catch(exception& __fail) - { - __ios.setstate(ios_base::failbit); - if ((__ios.exceptions() & ios_base::failbit) != 0) - __throw_exception_again; - } - return __ret; - } + streamsize __ret = 0; + try + { + typename _Traits::int_type __c = __sbin->sgetc(); + while (!_Traits::eq_int_type(__c, _Traits::eof())) + { + const size_t __n = __sbin->_M_in_end - __sbin->_M_in_cur; + if (__n > 1) + { + const size_t __wrote = __sbout->sputn(__sbin->_M_in_cur, + __n); + __sbin->_M_in_cur_move(__wrote); + __ret += __wrote; + if (__wrote < __n) + break; + __c = __sbin->underflow(); + } + else + { + __c = __sbout->sputc(_Traits::to_char_type(__c)); + if (_Traits::eq_int_type(__c, _Traits::eof())) + break; + ++__ret; + __c = __sbin->snextc(); + } + } + } + catch(exception& __fail) + { + __ios.setstate(ios_base::failbit); + if ((__ios.exceptions() & ios_base::failbit) != 0) + __throw_exception_again; + } + return __ret; + } // Inhibit implicit instantiations for required instantiations, // which are defined via explicit instantiations elsewhere. // NB: This syntax is a GNU extension. +#if _GLIBCPP_EXTERN_TEMPLATE extern template class basic_streambuf<char>; extern template streamsize @@ -260,6 +251,7 @@ namespace std __copy_streambufs(basic_ios<wchar_t>&, basic_streambuf<wchar_t>*, basic_streambuf<wchar_t>*); #endif +#endif } // namespace std #endif |