(seek_archive): New function

This commit is contained in:
Sergey Poznyakoff
2004-05-19 14:25:27 +00:00
parent 80c29e6315
commit 488430f739

View File

@@ -888,6 +888,42 @@ backspace_output (void)
}
}
off_t
seek_archive (off_t size)
{
off_t start = current_block_ordinal ();
off_t offset;
off_t nrec, nblk;
off_t skipped = (blocking_factor - (current_block - record_start));
size -= skipped * BLOCKSIZE;
if (size < record_size)
return 0;
/* FIXME: flush? */
/* Compute number of records to skip */
nrec = size / record_size;
offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
if (offset < 0)
return offset;
if (offset % record_size)
FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary")));
/* Convert to number of records */
offset /= BLOCKSIZE;
/* Compute number of skipped blocks */
nblk = offset - start;
/* Update buffering info */
records_read += nblk / blocking_factor;
record_start_block = offset - blocking_factor;
current_block = record_end;
return nblk;
}
/* Close the archive file. */
void
close_archive (void)