X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fcompress.c;h=9884a7c970cf64ca62bccbbadcded4b55d4b21d7;hb=39baf46ecec78f739ee9a68201f96fbdc917f62a;hp=a3c95b0f5d965fa07dec7b36e307eb9feb28d8ee;hpb=cbd31ea4e13a4e7479b2a19dc59efd9f2dd86e5e;p=wimlib diff --git a/src/compress.c b/src/compress.c index a3c95b0f..9884a7c9 100644 --- a/src/compress.c +++ b/src/compress.c @@ -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,33 @@ 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; + + if (!compressor_ctype_valid(ctype)) + return 0; + + ops = compressor_ops[ctype]; + if (ops->get_needed_memory == NULL) + return 0; + + if (extra_params) { + params = extra_params; + if (ops->params_valid && !ops->params_valid(params)) + return 0; + } else { + params = compressor_default_params[ctype]; + } + + return ops->get_needed_memory(max_block_size, params); +} + + WIMLIBAPI int wimlib_create_compressor(enum wimlib_compression_type ctype, size_t max_block_size, @@ -108,10 +140,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) {