reader: track read_filter "can_skip" with a flag
Analogous to the earlier "can_seek" change. Drop the function pointer in favour of a flag. Over the years, with over a dozen filters, no filters actually implemented it. If at a point in the future that changes, one can reinstate it. Alternatively one could use a ARCHIVE_FILTER_NONE check. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
This commit is contained in:
1 parent
4e7a6bd811
commit
033a3a3460
12 files changed
+4
-15
No files matched your search
@@ -488,11 +488,11 @@ archive_read_open1(struct archive *_a)
|
||||
filter->data = a->client.dataset[0].data;
|
||||
filter->open = client_open_proxy;
|
||||
filter->read = client_read_proxy;
|
||||
filter->skip = client_skip_proxy;
|
||||
filter->close = client_close_proxy;
|
||||
filter->sswitch = client_switch_proxy;
|
||||
filter->name = "none";
|
||||
filter->code = ARCHIVE_FILTER_NONE;
|
||||
filter->can_skip = 1;
|
||||
filter->can_seek = 1;
|
||||
|
||||
a->client.dataset[0].begin_position = 0;
|
||||
@@ -1563,8 +1563,8 @@ advance_file_pointer(struct archive_read_filter *filter, int64_t request)
|
||||
return (total_bytes_skipped);
|
||||
|
||||
/* If there's an optimized skip function, use it. */
|
||||
if (filter->skip != NULL) {
|
||||
bytes_skipped = (filter->skip)(filter, request);
|
||||
if (filter->can_skip != 0) {
|
||||
bytes_skipped = client_skip_proxy(filter, request);
|
||||
if (bytes_skipped < 0) { /* error */
|
||||
filter->fatal = 1;
|
||||
return (bytes_skipped);
|
||||
|
||||
@@ -91,8 +91,6 @@ struct archive_read_filter {
|
||||
int (*open)(struct archive_read_filter *self);
|
||||
/* Return next block. */
|
||||
ssize_t (*read)(struct archive_read_filter *, const void **);
|
||||
/* Skip forward this many bytes. */
|
||||
int64_t (*skip)(struct archive_read_filter *self, int64_t request);
|
||||
/* Close (just this filter) and free(self). */
|
||||
int (*close)(struct archive_read_filter *self);
|
||||
/* Function that handles switching from reading one block to the next/prev */
|
||||
@@ -104,6 +102,7 @@ struct archive_read_filter {
|
||||
|
||||
const char *name;
|
||||
int code;
|
||||
int can_skip;
|
||||
int can_seek;
|
||||
|
||||
/* Used by reblocking logic. */
|
||||
|
||||
@@ -200,7 +200,6 @@ bzip2_reader_init(struct archive_read_filter *self)
|
||||
state->out_block_size = out_block_size;
|
||||
state->out_block = out_block;
|
||||
self->read = bzip2_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = bzip2_filter_close;
|
||||
|
||||
return (ARCHIVE_OK);
|
||||
|
||||
@@ -227,7 +227,6 @@ compress_bidder_init(struct archive_read_filter *self)
|
||||
state->out_block_size = out_block_size;
|
||||
state->out_block = out_block;
|
||||
self->read = compress_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = compress_filter_close;
|
||||
|
||||
/* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */
|
||||
|
||||
@@ -315,7 +315,6 @@ gzip_bidder_init(struct archive_read_filter *self)
|
||||
state->out_block_size = out_block_size;
|
||||
state->out_block = out_block;
|
||||
self->read = gzip_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = gzip_filter_close;
|
||||
#ifdef HAVE_ZLIB_H
|
||||
self->read_header = gzip_read_header;
|
||||
|
||||
@@ -229,7 +229,6 @@ lz4_reader_init(struct archive_read_filter *self)
|
||||
self->data = state;
|
||||
state->stage = SELECT_STREAM;
|
||||
self->read = lz4_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = lz4_filter_close;
|
||||
|
||||
return (ARCHIVE_OK);
|
||||
|
||||
@@ -189,7 +189,6 @@ lzop_bidder_init(struct archive_read_filter *self)
|
||||
|
||||
self->data = state;
|
||||
self->read = lzop_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = lzop_filter_close;
|
||||
|
||||
return (ARCHIVE_OK);
|
||||
|
||||
@@ -429,7 +429,6 @@ __archive_read_program(struct archive_read_filter *self, const char *cmd)
|
||||
|
||||
self->data = state;
|
||||
self->read = program_filter_read;
|
||||
self->skip = NULL;
|
||||
self->close = program_filter_close;
|
||||
|
||||
/* XXX Check that we can read at least one byte? */
|
||||
|
||||
@@ -135,7 +135,6 @@ rpm_bidder_init(struct archive_read_filter *self)
|
||||
self->code = ARCHIVE_FILTER_RPM;
|
||||
self->name = "rpm";
|
||||
self->read = rpm_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = rpm_filter_close;
|
||||
|
||||
rpm = (struct rpm *)calloc(sizeof(*rpm), 1);
|
||||
|
||||
@@ -361,7 +361,6 @@ uudecode_bidder_init(struct archive_read_filter *self)
|
||||
self->code = ARCHIVE_FILTER_UU;
|
||||
self->name = "uu";
|
||||
self->read = uudecode_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = uudecode_filter_close;
|
||||
|
||||
uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1);
|
||||
|
||||
@@ -486,7 +486,6 @@ xz_lzma_bidder_init(struct archive_read_filter *self)
|
||||
state->out_block_size = out_block_size;
|
||||
state->out_block = out_block;
|
||||
self->read = xz_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = xz_filter_close;
|
||||
|
||||
state->stream.avail_in = 0;
|
||||
|
||||
@@ -190,7 +190,6 @@ zstd_bidder_init(struct archive_read_filter *self)
|
||||
state->out_block = out_block;
|
||||
state->dstream = dstream;
|
||||
self->read = zstd_filter_read;
|
||||
self->skip = NULL; /* not supported */
|
||||
self->close = zstd_filter_close;
|
||||
|
||||
state->eof = 0;
|
||||
|
||||
Reference in new issue
Block a user