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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
ios::pos_type StreamBuf::seekoff(ios::off_type step,
ios::seekdir way, ios::openmode mode)
{
off_type offs;
switch (way)
{
default: // ios::beg: buffOffset is step
offs = step;
break;
case ios::cur:
switch (d_last)
{
// default: case SEEK
default: // no read/write used so far
offs = offset;
break; // add step to bufOffset (below)
case READ: // setg was used, set bufOffset to
// the abs offset of gptr()
offs = bufbeg + gptr() - eback();
break;
case WRITE: // setp was used, set bufOffset to
// the abs offset of pptr()
offs = bufbeg + pptr() - pbase();
// may extend the writing area
if (offs > static_cast<off_type>(getend))
getend = offs;
break;
}
offs += step; // add the step
break;
case ios::end:
offs = getend + step; // shift from the last write position
break;
}
if (offs < 0)
offs = 0; // offset always >= 0
d_last = SEEK;
setg(0, 0, 0); // reset the buffers
setp(0, 0);
return offset = offs; // the updated offset
}
|