diff options
| author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-02 18:35:24 +0000 |
|---|---|---|
| committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-02 18:35:24 +0000 |
| commit | b98918e2c44b8ba3b3849d64a6ab755f0232d5ce (patch) | |
| tree | 2d3e0d674d6dfb8c262c7a25c5cc9d1d08c890fb | |
| parent | 6161eb605158f0933433fcd429df646cd07a27c7 (diff) | |
| download | ppe42-gcc-b98918e2c44b8ba3b3849d64a6ab755f0232d5ce.tar.gz ppe42-gcc-b98918e2c44b8ba3b3849d64a6ab755f0232d5ce.zip | |
2003-05-02 Nathan Myers <ncm@cantrip.org>
Paolo Carlini <pcarlini@unitus.it>
* include/bits/streambuf.tcc (__copy_streambufs): Rewrote.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66395 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | libstdc++-v3/ChangeLog | 5 | ||||
| -rw-r--r-- | libstdc++-v3/include/bits/streambuf.tcc | 64 |
2 files changed, 23 insertions, 46 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 95fa8d144fe..55e7538b39b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2003-05-02 Nathan Myers <ncm@cantrip.org> + Paolo Carlini <pcarlini@unitus.it> + + * include/bits/streambuf.tcc (__copy_streambufs): Rewrote. + 2003-05-02 Jonathan Wakely <redi@gcc.gnu.org> * include/bits/basic_string.h (swap): Remove redundant template diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc index 08b24c81d36..f80a815aa42 100644 --- a/libstdc++-v3/include/bits/streambuf.tcc +++ b/libstdc++-v3/include/bits/streambuf.tcc @@ -183,61 +183,33 @@ namespace std __copy_streambufs(basic_ios<_CharT, _Traits>& __ios, basic_streambuf<_CharT, _Traits>* __sbin, basic_streambuf<_CharT, _Traits>* __sbout) - { - typedef typename _Traits::int_type int_type; - + { streamsize __ret = 0; try { - for (;;) - { - streamsize __xtrct; - const ptrdiff_t __avail = __sbin->_M_in_end - - __sbin->_M_in_cur; - if (__avail) + 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) { - __xtrct = __sbout->sputn(__sbin->_M_in_cur, __avail); - __ret += __xtrct; - __sbin->_M_move_in_cur(__xtrct); - if (__xtrct != __avail) + const size_t __wrote = __sbout->sputn(__sbin->_M_in_cur, + __n); + __sbin->_M_move_in_cur(__wrote); + __ret += __wrote; + if (__wrote < __n) break; + __c = __sbin->underflow(); } - else + else { - streamsize __charsread; - const size_t __size = __sbout->_M_out_end - - __sbout->_M_out_cur; - if (__size) - { - _CharT* __buf = - static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) - * __size)); - // Since the next sputn cannot fail sgetn can be - // safely used. - __charsread = __sbin->sgetn(__buf, __size); - __xtrct = __sbout->sputn(__buf, __charsread); - } - else - { - __xtrct = __charsread = 0; - const int_type __c = __sbin->sgetc(); - if (!_Traits::eq_int_type(__c, _Traits::eof())) - { - ++__charsread; - if (_Traits::eq_int_type(__sbout->overflow(__c), - _Traits::eof())) - break; - ++__xtrct; - __sbin->sbumpc(); - } - } - __ret += __xtrct; - if (__xtrct != __charsread) + __c = __sbout->sputc(_Traits::to_char_type(__c)); + if (_Traits::eq_int_type(__c, _Traits::eof())) break; + ++__ret; + __c = __sbin->snextc(); } - if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof())) - break; - } + } } catch(exception& __fail) { |

