diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-14 19:04:00 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-02-14 19:04:00 +0000 |
commit | 6dcb23eb3b253136472b67444639ca642343497b (patch) | |
tree | 2259512cabf62cb659095d909e64aebda3945303 /libstdc++-v3/include/bits/fstream.tcc | |
parent | 85d25060775e1a7a78eaf96455e0cd7d5b67e31e (diff) | |
download | gcc-6dcb23eb3b253136472b67444639ca642343497b.tar.gz |
2004-02-14 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/13858
* include/bits/fstream.tcc (basic_filebuf<>::_M_convert_to_external):
In case of conversion errors, throw ios_failure; simplify.
* testsuite/27_io/basic_filebuf/overflow/char/13858.cc: New.
* testsuite/27_io/basic_filebuf/overflow/wchar_t/13858.cc: Ditto.
* testsuite/27_io/basic_filebuf/overflow/char/9182-2.cc: Tweak,
previously we didn't throw in case of conversion errors, instead
just returned eof().
* testsuite/27_io/basic_filebuf/seekoff/wchar_t/3.cc: Ditto.
* testsuite/27_io/basic_filebuf/seekpos/wchar_t/1.cc: Ditto.
* testsuite/27_io/basic_filebuf/sync/char/9182-1.cc: Ditto.
* include/bits/fstream.tcc (basic_filebuf<>::overflow):
Trivial simplification of a conditional.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77812 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits/fstream.tcc')
-rw-r--r-- | libstdc++-v3/include/bits/fstream.tcc | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index 9022b582594..19530e75c49 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -397,7 +397,7 @@ namespace std // and output. if (_M_convert_to_external(this->pbase(), this->pptr() - this->pbase()) - && (!__testeof || (__testeof && !_M_file.sync()))) + && (!__testeof || !_M_file.sync())) { _M_set_buffer(0); __ret = traits_type::not_eof(__c); @@ -437,12 +437,12 @@ namespace std _M_convert_to_external(_CharT* __ibuf, streamsize __ilen) { // Sizes of external and pending output. - streamsize __elen = 0; - streamsize __plen = 0; + streamsize __elen; + streamsize __plen; if (__check_facet(_M_codecvt).always_noconv()) { - __elen += _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen); - __plen += __ilen; + __elen = _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen); + __plen = __ilen; } else { @@ -466,19 +466,14 @@ namespace std __blen = __ilen; } else - { - // Result == error. - __blen = 0; - } - - if (__blen) - { - __elen += _M_file.xsputn(__buf, __blen); - __plen += __blen; - } + __throw_ios_failure(__N("basic_filebuf::_M_convert_to_external " + "conversion error")); + + __elen = _M_file.xsputn(__buf, __blen); + __plen = __blen; // Try once more for partial conversions. - if (__r == codecvt_base::partial) + if (__r == codecvt_base::partial && __elen == __plen) { const char_type* __iresume = __iend; streamsize __rlen = this->pptr() - __iend; @@ -488,12 +483,15 @@ namespace std if (__r != codecvt_base::error) { __rlen = __bend - __buf; - __elen += _M_file.xsputn(__buf, __rlen); - __plen += __rlen; + __elen = _M_file.xsputn(__buf, __rlen); + __plen = __rlen; } + else + __throw_ios_failure(__N("basic_filebuf::_M_convert_to_external " + "conversion error")); } } - return __elen && __elen == __plen; + return __elen == __plen; } template<typename _CharT, typename _Traits> |