size_t doRead(char * buffer, size_t count) { ssize_t r = -1; while ( (r=fd->read(buffer,count)) < 0 ) { int const error = errno; switch ( error ) { case EINTR: case EAGAIN: // try again break; default: { libmaus2::exception::LibMausException se; se.getStream() << "PosixInputOutputStreamBuffer::doRead(): read() failed: " << strerror(error) << std::endl; se.finish(); throw se; } } } return r; }
int_type underflow() { // if there is still data, then return it if ( gptr() < egptr() ) return static_cast<int_type>(*uptr()); assert ( gptr() == egptr() ); // number of bytes for putback buffer uint64_t const putbackcopy = std::min( static_cast<uint64_t>(gptr() - eback()), putbackspace ); // copy bytes std::copy( gptr()-putbackcopy, gptr(), buffer.begin() + putbackspace - putbackcopy ); // load data uint64_t const uncompressedsize = fd->read( buffer.begin()+putbackspace, buffer.size()-putbackspace ); // set buffer pointers setgchecked( buffer.begin()+putbackspace-putbackcopy, buffer.begin()+putbackspace, buffer.begin()+putbackspace+uncompressedsize); symsread += uncompressedsize; if ( uncompressedsize ) return static_cast<int_type>(*uptr()); else return traits_type::eof(); }