- unsigned char buf[1024];
-
- while (len) {
- if (fread(buf, MIN(sizeof buf, len), 1, f) != 1) {
- if (feof(f)) {
- lbx_errno = LBX_EEOF;
- } else {
- lbx_errno = -errno;
+ static unsigned char oblivion[1024];
+ long dist;
+
+ if (lbx->foff < base) {
+ dist = base - lbx->foff;
+ } else if (lbx->foff > base) {
+ dist = -(long)(lbx->foff - base);
+ } else {
+ return 0;
+ }
+
+ if (fseek(lbx->f, dist, SEEK_CUR) == 0) {
+ lbx->foff += dist;
+ } else if (lbx->foff < base) {
+ while (dist) {
+ size_t rc, amt = MIN(sizeof oblivion, dist);
+ rc = fread(oblivion, 1, amt, lbx->f);
+ lbx->foff += rc;
+ dist -= rc;
+ if (rc < amt) {
+ if (feof(lbx->f))
+ lbx_errno = LBX_EEOF;
+ else
+ lbx_errno = -errno;
+ return -1;