summaryrefslogtreecommitdiff
path: root/lib/comp/compressor.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/comp/compressor.c')
-rw-r--r--lib/comp/compressor.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/comp/compressor.c b/lib/comp/compressor.c
new file mode 100644
index 0000000..3bc2b4d
--- /dev/null
+++ b/lib/comp/compressor.c
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+#include <string.h>
+
+#include "internal.h"
+
+typedef compressor_t *(*compressor_fun_t)(bool compress, size_t block_size);
+
+static compressor_fun_t compressors[SQFS_COMP_MAX + 1] = {
+#ifdef WITH_ZLIB
+ [SQFS_COMP_GZIP] = create_zlib_compressor,
+#endif
+#ifdef WITH_LZMA
+ [SQFS_COMP_XZ] = create_lzma_compressor,
+#endif
+};
+
+bool compressor_exists(E_SQFS_COMPRESSOR id)
+{
+ if (id < SQFS_COMP_MIN || id > SQFS_COMP_MAX)
+ return false;
+
+ return (compressors[id] != NULL);
+}
+
+compressor_t *compressor_create(E_SQFS_COMPRESSOR id, bool compress,
+ size_t block_size)
+{
+ if (id < SQFS_COMP_MIN || id > SQFS_COMP_MAX)
+ return NULL;
+
+ if (compressors[id] == NULL)
+ return NULL;
+
+ return compressors[id](compress, block_size);
+}