diff options
Diffstat (limited to 'lib/sqfs/comp/zstd.c')
-rw-r--r-- | lib/sqfs/comp/zstd.c | 64 |
1 files changed, 18 insertions, 46 deletions
diff --git a/lib/sqfs/comp/zstd.c b/lib/sqfs/comp/zstd.c index e206338..c805524 100644 --- a/lib/sqfs/comp/zstd.c +++ b/lib/sqfs/comp/zstd.c @@ -16,8 +16,6 @@ #include "internal.h" -#define ZSTD_DEFAULT_COMPRESSION_LEVEL 15 - typedef struct { compressor_t base; ZSTD_CCtx *zctx; @@ -34,7 +32,7 @@ static int zstd_write_options(compressor_t *base, int fd) zstd_options_t opt; (void)fd; - if (zstd->level == ZSTD_DEFAULT_COMPRESSION_LEVEL) + if (zstd->level == SQFS_ZSTD_DEFAULT_LEVEL) return 0; opt.level = htole32(zstd->level); @@ -119,38 +117,26 @@ static void zstd_destroy(compressor_t *base) free(zstd); } -compressor_t *create_zstd_compressor(bool compress, size_t block_size, - char *options) +compressor_t *create_zstd_compressor(const compressor_config_t *cfg) { - zstd_compressor_t *zstd = calloc(1, sizeof(*zstd)); - compressor_t *base = (compressor_t *)zstd; - size_t i; - (void)block_size; + zstd_compressor_t *zstd; + compressor_t *base; - if (zstd == NULL) { - perror("creating zstd compressor"); - return NULL; + if (cfg->flags & ~SQFS_COMP_FLAG_GENERIC_ALL) { + fputs("creating zstd compressor: unknown compressor flags\n", + stderr); } - zstd->level = ZSTD_DEFAULT_COMPRESSION_LEVEL; - - if (options != NULL) { - if (strncmp(options, "level=", 6) == 0) { - options += 6; - - for (i = 0; isdigit(options[i]); ++i) - ; - - if (i == 0 || options[i] != '\0' || i > 6) - goto fail_level; - - zstd->level = atoi(options); + if (cfg->opt.zstd.level < 1 || + cfg->opt.zstd.level > ZSTD_maxCLevel()) { + goto fail_level; + } - if (zstd->level < 1 || zstd->level > ZSTD_maxCLevel()) - goto fail_level; - } else { - goto fail_opt; - } + zstd = calloc(1, sizeof(*zstd)); + base = (compressor_t *)zstd; + if (zstd == NULL) { + perror("creating zstd compressor"); + return NULL; } zstd->zctx = ZSTD_createCCtx(); @@ -161,7 +147,8 @@ compressor_t *create_zstd_compressor(bool compress, size_t block_size, } base->destroy = zstd_destroy; - base->do_block = compress ? zstd_comp_block : zstd_uncomp_block; + base->do_block = cfg->flags & SQFS_COMP_FLAG_UNCOMPRESS ? + zstd_uncomp_block : zstd_comp_block; base->write_options = zstd_write_options; base->read_options = zstd_read_options; base->create_copy = zstd_create_copy; @@ -169,20 +156,5 @@ compressor_t *create_zstd_compressor(bool compress, size_t block_size, fail_level: fprintf(stderr, "zstd compression level must be a number in the range " "1...%d\n", ZSTD_maxCLevel()); - free(zstd); return NULL; -fail_opt: - fputs("Unsupported extra options for zstd compressor\n", stderr); - free(zstd); - return NULL; -} - -void compressor_zstd_print_help(void) -{ - printf("Available options for zstd compressor:\n" - "\n" - " level=<value> Set compression level. Defaults to %d.\n" - " Maximum is %d.\n" - "\n", - ZSTD_DEFAULT_COMPRESSION_LEVEL, ZSTD_maxCLevel()); } |