diff options
author | Paolo Carlini <pcarlini@suse.de> | 2005-04-30 06:54:08 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2005-04-30 06:54:08 +0000 |
commit | 544f9440ab0b02d0971a148d63957f1b4232c261 (patch) | |
tree | 0bf21a7dd9361d87106bd7a9152f621c96e87f2b /libstdc++-v3/include | |
parent | bbf9b9139b111d41be207d2925b619828b1c081b (diff) | |
download | gcc-544f9440ab0b02d0971a148d63957f1b4232c261.zip gcc-544f9440ab0b02d0971a148d63957f1b4232c261.tar.gz gcc-544f9440ab0b02d0971a148d63957f1b4232c261.tar.bz2 |
re PR libstdc++/21286 (filebuf::xsgetn vs pipes)
2005-04-29 Paolo Carlini <pcarlini@suse.de>
Nathan Myers <ncm@cantrip.org>
PR libstdc++/21286
* include/bits/fstream.tcc (basic_filebuf<>::xsgetn):
Loop on short reads; remove the work-around for
libstdc++/20806, not needed anymore.
Co-Authored-By: Nathan Myers <ncm@cantrip.org>
From-SVN: r99033
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/fstream.tcc | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index 6915ea9..40bf428 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -531,15 +531,8 @@ namespace std const bool __testin = _M_mode & ios_base::in; const streamsize __buflen = _M_buf_size > 1 ? _M_buf_size - 1 : 1; -#if _GLIBCXX_HAVE_DOS_BASED_FILESYSTEM - // About this workaround, see libstdc++/20806. - const bool __testbinary = _M_mode & ios_base::binary; - if (__n > __buflen && __check_facet(_M_codecvt).always_noconv() - && __testin && __testbinary && !_M_writing) -#else if (__n > __buflen && __check_facet(_M_codecvt).always_noconv() && __testin && !_M_writing) -#endif { // First, copy the chars already present in the buffer. const streamsize __avail = this->egptr() - this->gptr(); @@ -555,13 +548,28 @@ namespace std __n -= __avail; } - const streamsize __len = _M_file.xsgetn(reinterpret_cast<char*>(__s), - __n); - if (__len == -1) - __throw_ios_failure(__N("basic_filebuf::xsgetn " - "error reading the file")); - __ret += __len; - if (__len == __n) + // Need to loop in case of short reads (relatively common + // with pipes). + streamsize __len; + for (;;) + { + __len = _M_file.xsgetn(reinterpret_cast<char*>(__s), + __n); + if (__len == -1) + __throw_ios_failure(__N("basic_filebuf::xsgetn " + "error reading the file")); + if (__len == 0) + break; + + __n -= __len; + __ret += __len; + if (__n == 0) + break; + + __s += __len; + } + + if (__n == 0) { _M_set_buffer(0); _M_reading = true; |