X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fcompress.c;h=9884a7c970cf64ca62bccbbadcded4b55d4b21d7;hp=32d5fb49fc28b0885ef261dfeece9bc3231d82f5;hb=06c208689d042c215bb9882232aabb0d98c01875;hpb=883833a4b3dabec325edf1ca938000f91d587c00 diff --git a/src/compress.c b/src/compress.c index 32d5fb49..9884a7c9 100644 --- a/src/compress.c +++ b/src/compress.c @@ -45,9 +45,6 @@ static const struct compressor_ops *compressor_ops[] = { static struct wimlib_compressor_params_header * compressor_default_params[ARRAY_LEN(compressor_ops)] = { - [WIMLIB_COMPRESSION_TYPE_LZX] = NULL, - [WIMLIB_COMPRESSION_TYPE_XPRESS] = NULL, - [WIMLIB_COMPRESSION_TYPE_LZMS] = NULL, }; static bool @@ -67,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); @@ -88,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, @@ -111,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) {