aboutsummaryrefslogtreecommitdiff
path: root/contrib/libstdc++/include/bits/streambuf.tcc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libstdc++/include/bits/streambuf.tcc')
-rw-r--r--contrib/libstdc++/include/bits/streambuf.tcc86
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