X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fcompress.c;h=039836af5c8f19d62b954c5e79ea537762bca109;hb=aae154ad67444bc760bedff60bc60fd5b91b8ede;hp=a3c95b0f5d965fa07dec7b36e307eb9feb28d8ee;hpb=cbd31ea4e13a4e7479b2a19dc59efd9f2dd86e5e;p=wimlib diff --git a/src/compress.c b/src/compress.c index a3c95b0f..039836af 100644 --- a/src/compress.c +++ b/src/compress.c @@ -38,8 +38,8 @@ struct wimlib_compressor { }; static const struct compressor_ops *compressor_ops[] = { - [WIMLIB_COMPRESSION_TYPE_LZX] = &lzx_compressor_ops, [WIMLIB_COMPRESSION_TYPE_XPRESS] = &xpress_compressor_ops, + [WIMLIB_COMPRESSION_TYPE_LZX] = &lzx_compressor_ops, [WIMLIB_COMPRESSION_TYPE_LZMS] = &lzms_compressor_ops, }; @@ -64,6 +64,11 @@ wimlib_set_default_compressor_params(enum wimlib_compression_type ctype, if (!compressor_ctype_valid(ctype)) return WIMLIB_ERR_INVALID_COMPRESSION_TYPE; + if (params != NULL && + compressor_ops[ctype]->params_valid != NULL && + !compressor_ops[ctype]->params_valid(params)) + return WIMLIB_ERR_INVALID_PARAM; + dup = NULL; if (params) { dup = memdup(params, params->size); @@ -85,6 +90,35 @@ cleanup_compressor_params(void) } } +WIMLIBAPI u64 +wimlib_get_compressor_needed_memory(enum wimlib_compression_type ctype, + size_t max_block_size, + const struct wimlib_compressor_params_header *extra_params) +{ + const struct compressor_ops *ops; + const struct wimlib_compressor_params_header *params; + u64 size; + + if (!compressor_ctype_valid(ctype)) + return 0; + + ops = compressor_ops[ctype]; + + if (extra_params) { + params = extra_params; + if (ops->params_valid && !ops->params_valid(params)) + return 0; + } else { + params = compressor_default_params[ctype]; + } + + size = sizeof(struct wimlib_compressor); + if (ops->get_needed_memory) + size += ops->get_needed_memory(max_block_size, params); + return size; +} + + WIMLIBAPI int wimlib_create_compressor(enum wimlib_compression_type ctype, size_t max_block_size, @@ -108,10 +142,15 @@ wimlib_create_compressor(enum wimlib_compression_type ctype, const struct wimlib_compressor_params_header *params; int ret; - if (extra_params) + if (extra_params) { params = extra_params; - else + if (c->ops->params_valid && !c->ops->params_valid(params)) { + FREE(c); + return WIMLIB_ERR_INVALID_PARAM; + } + } else { params = compressor_default_params[ctype]; + } ret = c->ops->create_compressor(max_block_size, params, &c->private); if (ret) {