]> wimlib.net Git - wimlib/blobdiff - src/compress.c
Add wimlib_get_version()
[wimlib] / src / compress.c
index 32d5fb49fc28b0885ef261dfeece9bc3231d82f5..9884a7c970cf64ca62bccbbadcded4b55d4b21d7 100644 (file)
@@ -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) {