From b6d0bcbf1fa9c8088578c959f442e219f590ebf9 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 4 Jun 2020 07:24:52 +0200 Subject: Cleanup: Pull compression level parameter out into compressor config Every compressor (except LC4) has a compression level parameter. This commit pulls the compression level field out into the generic configuration structure and applies some code clean ups as a result from this. Signed-off-by: David Oberhollenzer --- include/sqfs/compressor.h | 52 +++++++++------------------------------------- lib/common/comp_lzo.c | 8 +++---- lib/common/comp_opt.c | 21 +------------------ lib/sqfs/comp/compressor.c | 14 +++++-------- lib/sqfs/comp/gzip.c | 10 ++++----- lib/sqfs/comp/lz4.c | 3 +++ lib/sqfs/comp/lzma.c | 6 +++--- lib/sqfs/comp/xz.c | 6 +++--- lib/sqfs/comp/zstd.c | 8 +++---- 9 files changed, 37 insertions(+), 91 deletions(-) diff --git a/include/sqfs/compressor.h b/include/sqfs/compressor.h index 7e687f6..87ecc9d 100644 --- a/include/sqfs/compressor.h +++ b/include/sqfs/compressor.h @@ -119,6 +119,13 @@ struct sqfs_compressor_config_t { */ sqfs_u32 block_size; + /** + * @brief Compression level. + * + * Valid range and default value depend on the selected compressor. + */ + sqfs_u32 level; + /** * @brief Backend specific options for fine tuing. */ @@ -127,13 +134,6 @@ struct sqfs_compressor_config_t { * @brief Options for the zlib compressor. */ struct { - /** - * @brief Compression level. Value between 1 and 9. - * - * Default is 9, i.e. best compression. - */ - sqfs_u16 level; - /** * @brief Deflate window size. Value between 8 and 15. * @@ -141,23 +141,9 @@ struct sqfs_compressor_config_t { */ sqfs_u16 window_size; - sqfs_u32 padd0[3]; + sqfs_u8 padd0[14]; } gzip; - /** - * @brief Options for the zstd compressor. - */ - struct { - /** - * @brief Compression level. Value between 1 and 22. - * - * Default is 15. - */ - sqfs_u16 level; - - sqfs_u16 padd0[7]; - } zstd; - /** * @brief Options for the lzo compressor. */ @@ -170,18 +156,7 @@ struct sqfs_compressor_config_t { */ sqfs_u16 algorithm; - /** - * @brief Compression level for @ref SQFS_LZO1X_999. - * - * If the selected algorithm is @ref SQFS_LZO1X_999, - * this can be a value between 0 and 9. For all other - * algorithms it has to be 0. - * - * Defaults to 9, i.e. best compression. - */ - sqfs_u16 level; - - sqfs_u32 padd0[3]; + sqfs_u8 padd0[14]; } lzo; /** @@ -199,13 +174,6 @@ struct sqfs_compressor_config_t { */ sqfs_u32 dict_size; - /** - * @brief Compression level. Maximum 9. - * - * For LZMA, the default is 5, for XZ the default is 6. - */ - sqfs_u8 level; - /** * @brief Number of literal context bits. * @@ -244,7 +212,7 @@ struct sqfs_compressor_config_t { */ sqfs_u8 pb; - sqfs_u32 padd0[2]; + sqfs_u8 padd0[9]; } xz, lzma; sqfs_u64 padd0[2]; diff --git a/lib/common/comp_lzo.c b/lib/common/comp_lzo.c index 0956e0e..3452647 100644 --- a/lib/common/comp_lzo.c +++ b/lib/common/comp_lzo.c @@ -193,7 +193,7 @@ static void lzo_get_configuration(const sqfs_compressor_t *base, cfg->block_size = lzo->block_size; cfg->opt.lzo.algorithm = lzo->algorithm; - cfg->opt.lzo.level = lzo->level; + cfg->level = lzo->level; if (base->do_block == lzo_uncomp_block) cfg->flags |= SQFS_COMP_FLAG_UNCOMPRESS; @@ -233,9 +233,9 @@ int lzo_compressor_create(const sqfs_compressor_config_t *cfg, } if (cfg->opt.lzo.algorithm == SQFS_LZO1X_999) { - if (cfg->opt.lzo.level > SQFS_LZO_MAX_LEVEL) + if (cfg->level > SQFS_LZO_MAX_LEVEL) return SQFS_ERROR_UNSUPPORTED; - } else if (cfg->opt.lzo.level != 0) { + } else if (cfg->level != 0) { return SQFS_ERROR_UNSUPPORTED; } @@ -262,7 +262,7 @@ int lzo_compressor_create(const sqfs_compressor_config_t *cfg, lzo->block_size = cfg->block_size; lzo->algorithm = cfg->opt.lzo.algorithm; - lzo->level = cfg->opt.lzo.level; + lzo->level = cfg->level; lzo->buf_size = scratch_size; lzo->work_size = lzo_algs[cfg->opt.lzo.algorithm].bufsize; diff --git a/lib/common/comp_opt.c b/lib/common/comp_opt.c index 8864a0e..5be4466 100644 --- a/lib/common/comp_opt.c +++ b/lib/common/comp_opt.c @@ -185,29 +185,10 @@ int compressor_cfg_init_options(sqfs_compressor_config_t *cfg, goto fail_level; level = atoi(value); - if (level < min_level || level > max_level) goto fail_level; - switch (cfg->id) { - case SQFS_COMP_GZIP: - cfg->opt.gzip.level = level; - break; - case SQFS_COMP_LZO: - cfg->opt.lzo.level = level; - break; - case SQFS_COMP_ZSTD: - cfg->opt.zstd.level = level; - break; - case SQFS_COMP_XZ: - cfg->opt.xz.level = level; - break; - case SQFS_COMP_LZMA: - cfg->opt.lzma.level = level; - break; - default: - goto fail_opt; - } + cfg->level = level; break; case OPT_ALG: if (cfg->id != SQFS_COMP_LZO) diff --git a/lib/sqfs/comp/compressor.c b/lib/sqfs/comp/compressor.c index ff7ce0c..42ee436 100644 --- a/lib/sqfs/comp/compressor.c +++ b/lib/sqfs/comp/compressor.c @@ -106,10 +106,6 @@ int sqfs_compressor_create(const sqfs_compressor_config_t *cfg, ret = memcmp(cfg->opt.lzo.padd0, padd0, sizeof(cfg->opt.lzo.padd0)); break; - case SQFS_COMP_ZSTD: - ret = memcmp(cfg->opt.zstd.padd0, padd0, - sizeof(cfg->opt.zstd.padd0)); - break; case SQFS_COMP_GZIP: ret = memcmp(cfg->opt.gzip.padd0, padd0, sizeof(cfg->opt.gzip.padd0)); @@ -156,20 +152,20 @@ int sqfs_compressor_config_init(sqfs_compressor_config_t *cfg, switch (id) { case SQFS_COMP_GZIP: flag_mask |= SQFS_COMP_FLAG_GZIP_ALL; - cfg->opt.gzip.level = SQFS_GZIP_DEFAULT_LEVEL; + cfg->level = SQFS_GZIP_DEFAULT_LEVEL; cfg->opt.gzip.window_size = SQFS_GZIP_DEFAULT_WINDOW; break; case SQFS_COMP_LZO: cfg->opt.lzo.algorithm = SQFS_LZO_DEFAULT_ALG; - cfg->opt.lzo.level = SQFS_LZO_DEFAULT_LEVEL; + cfg->level = SQFS_LZO_DEFAULT_LEVEL; break; case SQFS_COMP_ZSTD: - cfg->opt.zstd.level = SQFS_ZSTD_DEFAULT_LEVEL; + cfg->level = SQFS_ZSTD_DEFAULT_LEVEL; break; case SQFS_COMP_XZ: flag_mask |= SQFS_COMP_FLAG_XZ_ALL; + cfg->level = SQFS_XZ_DEFAULT_LEVEL; cfg->opt.xz.dict_size = block_size; - cfg->opt.xz.level = SQFS_XZ_DEFAULT_LEVEL; cfg->opt.xz.lc = SQFS_XZ_DEFAULT_LC; cfg->opt.xz.lp = SQFS_XZ_DEFAULT_LP; cfg->opt.xz.pb = SQFS_XZ_DEFAULT_PB; @@ -179,8 +175,8 @@ int sqfs_compressor_config_init(sqfs_compressor_config_t *cfg, break; case SQFS_COMP_LZMA: flag_mask |= SQFS_COMP_FLAG_LZMA_ALL; + cfg->level = SQFS_LZMA_DEFAULT_LEVEL; cfg->opt.lzma.dict_size = block_size; - cfg->opt.lzma.level = SQFS_LZMA_DEFAULT_LEVEL; cfg->opt.lzma.lc = SQFS_LZMA_DEFAULT_LC; cfg->opt.lzma.lp = SQFS_LZMA_DEFAULT_LP; cfg->opt.lzma.pb = SQFS_LZMA_DEFAULT_PB; diff --git a/lib/sqfs/comp/gzip.c b/lib/sqfs/comp/gzip.c index d702da1..9be84db 100644 --- a/lib/sqfs/comp/gzip.c +++ b/lib/sqfs/comp/gzip.c @@ -53,7 +53,7 @@ static void gzip_get_configuration(const sqfs_compressor_t *base, cfg->id = SQFS_COMP_GZIP; cfg->flags = gzip->opt.strategies; cfg->block_size = gzip->block_size; - cfg->opt.gzip.level = gzip->opt.level; + cfg->level = gzip->opt.level; cfg->opt.gzip.window_size = gzip->opt.window; if (!gzip->compress) @@ -259,8 +259,8 @@ int gzip_compressor_create(const sqfs_compressor_config_t *cfg, return SQFS_ERROR_UNSUPPORTED; } - if (cfg->opt.gzip.level < SQFS_GZIP_MIN_LEVEL || - cfg->opt.gzip.level > SQFS_GZIP_MAX_LEVEL) { + if (cfg->level < SQFS_GZIP_MIN_LEVEL || + cfg->level > SQFS_GZIP_MAX_LEVEL) { return SQFS_ERROR_UNSUPPORTED; } @@ -275,7 +275,7 @@ int gzip_compressor_create(const sqfs_compressor_config_t *cfg, if (gzip == NULL) return SQFS_ERROR_ALLOC; - gzip->opt.level = cfg->opt.gzip.level; + gzip->opt.level = cfg->level; gzip->opt.window = cfg->opt.gzip.window_size; gzip->opt.strategies = cfg->flags & SQFS_COMP_FLAG_GZIP_ALL; gzip->compress = (cfg->flags & SQFS_COMP_FLAG_UNCOMPRESS) == 0; @@ -288,7 +288,7 @@ int gzip_compressor_create(const sqfs_compressor_config_t *cfg, ((sqfs_object_t *)base)->destroy = gzip_destroy; if (gzip->compress) { - ret = deflateInit2(&gzip->strm, cfg->opt.gzip.level, + ret = deflateInit2(&gzip->strm, cfg->level, Z_DEFLATED, cfg->opt.gzip.window_size, 8, Z_DEFAULT_STRATEGY); } else { diff --git a/lib/sqfs/comp/lz4.c b/lib/sqfs/comp/lz4.c index 090ec50..f326870 100644 --- a/lib/sqfs/comp/lz4.c +++ b/lib/sqfs/comp/lz4.c @@ -148,6 +148,9 @@ int lz4_compressor_create(const sqfs_compressor_config_t *cfg, return SQFS_ERROR_UNSUPPORTED; } + if (cfg->level != 0) + return SQFS_ERROR_UNSUPPORTED; + lz4 = calloc(1, sizeof(*lz4)); base = (sqfs_compressor_t *)lz4; if (lz4 == NULL) diff --git a/lib/sqfs/comp/lzma.c b/lib/sqfs/comp/lzma.c index b674af9..01e6042 100644 --- a/lib/sqfs/comp/lzma.c +++ b/lib/sqfs/comp/lzma.c @@ -185,8 +185,8 @@ static void lzma_get_configuration(const sqfs_compressor_t *base, cfg->id = SQFS_COMP_LZMA; cfg->block_size = lzma->block_size; cfg->flags = lzma->flags; + cfg->level = lzma->level; cfg->opt.lzma.dict_size = lzma->dict_size; - cfg->opt.lzma.level = lzma->level; cfg->opt.lzma.lc = lzma->lc; cfg->opt.lzma.lp = lzma->lp; cfg->opt.lzma.pb = lzma->pb; @@ -220,7 +220,7 @@ int lzma_compressor_create(const sqfs_compressor_config_t *cfg, return SQFS_ERROR_UNSUPPORTED; /* XXX: values are unsigned and minimum is 0 */ - if (cfg->opt.lzma.level > SQFS_LZMA_MAX_LEVEL) + if (cfg->level > SQFS_LZMA_MAX_LEVEL) return SQFS_ERROR_UNSUPPORTED; if (cfg->opt.lzma.lc > SQFS_LZMA_MAX_LC) @@ -262,8 +262,8 @@ int lzma_compressor_create(const sqfs_compressor_config_t *cfg, lzma->block_size = cfg->block_size; lzma->flags = cfg->flags; + lzma->level = cfg->level; lzma->dict_size = cfg->opt.lzma.dict_size; - lzma->level = cfg->opt.lzma.level; lzma->lc = cfg->opt.lzma.lc; lzma->lp = cfg->opt.lzma.lp; lzma->pb = cfg->opt.lzma.pb; diff --git a/lib/sqfs/comp/xz.c b/lib/sqfs/comp/xz.c index 662a49f..7d7991d 100644 --- a/lib/sqfs/comp/xz.c +++ b/lib/sqfs/comp/xz.c @@ -242,8 +242,8 @@ static void xz_get_configuration(const sqfs_compressor_t *base, cfg->id = SQFS_COMP_XZ; cfg->flags = xz->flags; cfg->block_size = xz->block_size; + cfg->level = xz->level; cfg->opt.xz.dict_size = xz->dict_size; - cfg->opt.xz.level = xz->level; cfg->opt.xz.lc = xz->lc; cfg->opt.xz.lp = xz->lp; cfg->opt.xz.pb = xz->pb; @@ -288,7 +288,7 @@ int xz_compressor_create(const sqfs_compressor_config_t *cfg, if (cfg->opt.xz.pb > SQFS_XZ_MAX_PB) return SQFS_ERROR_UNSUPPORTED; - if (cfg->opt.xz.level > SQFS_XZ_MAX_LEVEL) + if (cfg->level > SQFS_XZ_MAX_LEVEL) return SQFS_ERROR_UNSUPPORTED; if (cfg->opt.xz.dict_size < SQFS_XZ_MIN_DICT_SIZE) @@ -308,7 +308,7 @@ int xz_compressor_create(const sqfs_compressor_config_t *cfg, xz->lc = cfg->opt.xz.lc; xz->lp = cfg->opt.xz.lp; xz->pb = cfg->opt.xz.pb; - xz->level = cfg->opt.xz.level; + xz->level = cfg->level; base->get_configuration = xz_get_configuration; base->do_block = (cfg->flags & SQFS_COMP_FLAG_UNCOMPRESS) ? xz_uncomp_block : xz_comp_block; diff --git a/lib/sqfs/comp/zstd.c b/lib/sqfs/comp/zstd.c index 18289fe..af5bd84 100644 --- a/lib/sqfs/comp/zstd.c +++ b/lib/sqfs/comp/zstd.c @@ -101,7 +101,7 @@ static void zstd_get_configuration(const sqfs_compressor_t *base, cfg->id = SQFS_COMP_ZSTD; cfg->block_size = zstd->block_size; - cfg->opt.zstd.level = zstd->level; + cfg->level = zstd->level; if (base->do_block == zstd_uncomp_block) cfg->flags |= SQFS_COMP_FLAG_UNCOMPRESS; @@ -143,10 +143,8 @@ int zstd_compressor_create(const sqfs_compressor_config_t *cfg, if (cfg->flags & ~SQFS_COMP_FLAG_GENERIC_ALL) return SQFS_ERROR_UNSUPPORTED; - if (cfg->opt.zstd.level < 1 || - cfg->opt.zstd.level > ZSTD_maxCLevel()) { + if (cfg->level < 1 || cfg->level > (unsigned int)ZSTD_maxCLevel()) return SQFS_ERROR_UNSUPPORTED; - } zstd = calloc(1, sizeof(*zstd)); base = (sqfs_compressor_t *)zstd; @@ -154,7 +152,7 @@ int zstd_compressor_create(const sqfs_compressor_config_t *cfg, return SQFS_ERROR_ALLOC; zstd->block_size = cfg->block_size; - zstd->level = cfg->opt.zstd.level; + zstd->level = cfg->level; zstd->zctx = ZSTD_createCCtx(); if (zstd->zctx == NULL) { free(zstd); -- cgit v1.2.3