From: Benjamin Kosnik Date: Mon, 12 May 2003 18:12:27 +0000 (+0000) Subject: From-SVN: r66726 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6e81c6f49c3e2ae1d91b54a53313e05ee1b4812d;p=gcc.git From-SVN: r66726 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 508913864a2..fd0ac14c42f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2003-05-12 Benjamin Kosnik + + * include/bits/fstream.tcc (_M_overflow): Remove unbuffered bits. + +2003-05-12 Paolo Carlini + + * include/std/std_fstream.h (_M_convert_to_external): Change + to return bool, take two less streamsize parameters. + * include/bits/fstream.tcc (_M_convert_to_external): Tweak + consistently definition. + (_M_overflow): Adjust call points. + 2003-05-12 Benjamin Kosnik * testsuite/27_io/basic_filebuf/underflow/10096.cc: Add weak bits. diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index cec57ffffc0..40d1ece324a 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -182,7 +182,8 @@ namespace std template typename basic_filebuf<_CharT, _Traits>::int_type - basic_filebuf<_CharT, _Traits>::_M_underflow(bool __bump) + basic_filebuf<_CharT, _Traits>:: + _M_underflow(bool __bump) { int_type __ret = traits_type::eof(); const bool __testin = this->_M_mode & ios_base::in; @@ -330,6 +331,53 @@ namespace std return __ret; } + template + typename basic_filebuf<_CharT, _Traits>::int_type + basic_filebuf<_CharT, _Traits>:: + _M_overflow(int_type __c) + { + int_type __ret = traits_type::eof(); + const bool __testput = this->_M_out_beg < this->_M_out_lim; + + if (__testput) + { + // Need to restore current position. The position of the external + // byte sequence (_M_file) corresponds to _M_filepos, and we need + // to move it to _M_out_beg for the write. + if (_M_filepos && _M_filepos != this->_M_out_beg) + { + off_type __off = this->_M_out_beg - _M_filepos; + _M_file.seekoff(__off, ios_base::cur); + } + + // Convert internal buffer to external representation, output. + if (_M_convert_to_external(this->_M_out_beg, + this->_M_out_lim - this->_M_out_beg)) + { + // Convert pending sequence to external representation, output. + // If eof, then just attempt sync. + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + // User code must flush when switching modes (thus + // don't sync). + char_type __pending = traits_type::to_char_type(__c); + if (_M_convert_to_external(&__pending, 1)) + { + _M_set_indeterminate(); + __ret = traits_type::not_eof(__c); + } + } + else if (!_M_file.sync()) + { + _M_set_indeterminate(); + __ret = traits_type::not_eof(__c); + } + } + } + _M_last_overflowed = true; + return __ret; + } + template typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>:: @@ -358,14 +406,16 @@ namespace std } template - void + bool basic_filebuf<_CharT, _Traits>:: - _M_convert_to_external(_CharT* __ibuf, streamsize __ilen, - streamsize& __elen, streamsize& __plen) + _M_convert_to_external(_CharT* __ibuf, streamsize __ilen) { + // Sizes of external and pending output. + streamsize __elen = 0; + streamsize __plen = 0; + const locale __loc = this->getloc(); const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc); - if (__cvt.always_noconv() && __ilen) { __elen += _M_file.xsputn(reinterpret_cast(__ibuf), __ilen); @@ -420,67 +470,8 @@ namespace std } } } - } - - template - typename basic_filebuf<_CharT, _Traits>::int_type - basic_filebuf<_CharT, _Traits>:: - _M_overflow(int_type __c) - { - int_type __ret = traits_type::eof(); - const bool __testput = this->_M_out_beg < this->_M_out_lim; - const bool __testunbuffered = _M_file.is_open() && !this->_M_buf_size; - - if (__testput || __testunbuffered) - { - // Sizes of external and pending output. - streamsize __elen = 0; - streamsize __plen = 0; - // Need to restore current position. The position of the external - // byte sequence (_M_file) corresponds to _M_filepos, and we need - // to move it to _M_out_beg for the write. - if (_M_filepos && _M_filepos != this->_M_out_beg) - { - off_type __off = this->_M_out_beg - _M_filepos; - _M_file.seekoff(__off, ios_base::cur); - } - - // Convert internal buffer to external representation, output. - // NB: In the unbuffered case, no internal buffer exists. - if (!__testunbuffered) - _M_convert_to_external(this->_M_out_beg, - this->_M_out_lim - this->_M_out_beg, - __elen, __plen); - - // Checks for codecvt.out failures and _M_file.xsputn failures, - // respectively, inside _M_convert_to_external. - if (__testunbuffered || (__elen && __elen == __plen)) - { - // Convert pending sequence to external representation, output. - // If eof, then just attempt sync. - if (!traits_type::eq_int_type(__c, traits_type::eof())) - { - char_type __pending = traits_type::to_char_type(__c); - _M_convert_to_external(&__pending, 1, __elen, __plen); - - // User code must flush when switching modes (thus - // don't sync). - if (__elen == __plen && __elen) - { - _M_set_indeterminate(); - __ret = traits_type::not_eof(__c); - } - } - else if (!_M_file.sync()) - { - _M_set_indeterminate(); - __ret = traits_type::not_eof(__c); - } - } - } - _M_last_overflowed = true; - return __ret; + return __elen && __elen == __plen; } template diff --git a/libstdc++-v3/include/std/std_fstream.h b/libstdc++-v3/include/std/std_fstream.h index 0de74e6252d..0781f0d5294 100644 --- a/libstdc++-v3/include/std/std_fstream.h +++ b/libstdc++-v3/include/std/std_fstream.h @@ -353,8 +353,8 @@ namespace std * @doctodo * @endif */ - void - _M_convert_to_external(char_type*, streamsize, streamsize&, streamsize&); + bool + _M_convert_to_external(char_type*, streamsize); /** * @brief Manipulates the buffer.