int fz_tell(fz_stream *stm) { if (stm->mode == FZ_SREAD) return fz_rtell(stm); return fz_wtell(stm); }
fz_error * fz_rseek(fz_stream *stm, int offset, int whence) { fz_error *error; fz_buffer *buf = stm->buffer; int t, c; if (stm->dead) return fz_throw("assert: seek in dead stream"); if (stm->mode != FZ_SREAD) return fz_throw("assert: read operation on writing stream"); if (whence == 1) { int cur = fz_rtell(stm); if (cur < 0) return fz_throw("cannot tell current position"); offset = cur + offset; whence = 0; } buf->eof = 0; switch (stm->kind) { case FZ_SFILE: t = lseek(stm->file, offset, whence); if (t < 0) { stm->dead = 1; return fz_throw("syserr: lseek: %s", strerror(errno)); } buf->rp = buf->bp; buf->wp = buf->bp; return fz_okay; case FZ_SFILTER: if (whence == 0) { if (offset < fz_rtell(stm)) { stm->dead = 1; return fz_throw("assert: seek backwards in filter"); } while (fz_rtell(stm) < offset) { c = fz_readbyte(stm); if (c == EOF) { error = fz_readerror(stm); if (error) return fz_rethrow(error, "cannot seek forward in filter"); break; } } return fz_okay; } stm->dead = 1; return fz_throw("assert: relative seek in filter"); case FZ_SBUFFER: if (whence == 0) buf->rp = CLAMP(buf->bp + offset, buf->bp, buf->ep); else buf->rp = CLAMP(buf->ep + offset, buf->bp, buf->ep); return fz_okay; default: return fz_throw("unknown stream type"); } }