aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2005-04-30 06:54:08 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2005-04-30 06:54:08 +0000
commit544f9440ab0b02d0971a148d63957f1b4232c261 (patch)
tree0bf21a7dd9361d87106bd7a9152f621c96e87f2b /libstdc++-v3/include
parentbbf9b9139b111d41be207d2925b619828b1c081b (diff)
downloadgcc-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.tcc36
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;