1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
streamsize StreamBuf::xsgetn(char *buf, streamsize nChars)
{
size_t toRead = nChars;
size_t nRead = 0;
while (toRead)
{
size_t avail = egptr() - gptr(); // available buffer space
// no or empty memory buffer
// but no more readable chars
if (avail == 0 and underflow() == EOF)
return nRead;
avail = min(getend, bufend) - offset;
size_t next = min(avail, toRead); // next #bytes to write
memcpy(buf, gptr(), next); // write to the buffer
gbump(next); // update gptr
buf += next; // update the buf location
toRead -= next; // and update the counters
nRead += next;
offset += next;
}
d_last = READ; // now reading: also if underflow
// wasn't called.
return nRead;
}
|