-/* Advance to the beginning of the index'th file by either fseek or reading. */
-static int _lbx_fseek(struct lbx_state *lbx, size_t base)
-{
- 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;
- }
- }
- } else {
- lbx_errno = -errno;
- return -1;
- }
- return 0;
-}
-