summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/bits/fstream.tcc
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-14 19:04:00 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-14 19:04:00 +0000
commit6dcb23eb3b253136472b67444639ca642343497b (patch)
tree2259512cabf62cb659095d909e64aebda3945303 /libstdc++-v3/include/bits/fstream.tcc
parent85d25060775e1a7a78eaf96455e0cd7d5b67e31e (diff)
downloadgcc-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.tcc36
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>