X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxpress-decompress.c;h=c24a1e66d8d2c574e03897089cb3015f258b9252;hb=f02f8a0274377459bf90d5a70cb7b72480a3df60;hp=b71f6be23e1c6f8a502564fda9b29e966d33a5fa;hpb=4757f17833c96b8c83a7e17cbc6f374c449d60db;p=wimlib diff --git a/src/xpress-decompress.c b/src/xpress-decompress.c index b71f6be2..c24a1e66 100644 --- a/src/xpress-decompress.c +++ b/src/xpress-decompress.c @@ -55,10 +55,10 @@ * * Also, a caveat--- according to Microsoft's documentation for XPRESS, * - * "Some implementation of the decompression algorithm expect an extra - * symbol to mark the end of the data. Specifically, some implementations - * fail during decompression if the Huffman symbol 256 is not found after - * the actual data." + * "Some implementation of the decompression algorithm expect an extra + * symbol to mark the end of the data. Specifically, some implementations + * fail during decompression if the Huffman symbol 256 is not found after + * the actual data." * * This is the case for the implementation in WIMGAPI. However, wimlib's * decompressor in this file currently does not care if this extra symbol is @@ -70,7 +70,8 @@ #endif #include "wimlib.h" -#include "wimlib/decompress.h" +#include "wimlib/decompressor_ops.h" +#include "wimlib/decompress_common.h" #include "wimlib/xpress.h" /* @@ -194,14 +195,11 @@ xpress_lz_decode(struct input_bitstream * restrict istream, } -/* API function documented in wimlib.h */ -WIMLIBAPI int -wimlib_xpress_decompress(const void * const restrict _compressed_data, - const unsigned compressed_len, - void * const restrict uncompressed_data, - const unsigned uncompressed_len) +static int +xpress_decompress(const void *compressed_data, size_t compressed_size, + void *uncompressed_data, size_t uncompressed_size, void *_ctx) { - const u8 *compressed_data = _compressed_data; + const u8 *cdata = compressed_data; u8 lens[XPRESS_NUM_SYMBOLS]; u8 *lens_p; u16 decode_table[(1 << XPRESS_TABLEBITS) + 2 * XPRESS_NUM_SYMBOLS] @@ -211,13 +209,13 @@ wimlib_xpress_decompress(const void * const restrict _compressed_data, /* XPRESS uses only one Huffman code. It contains 512 symbols, and the * code lengths of these symbols are given literally as 4-bit integers * in the first 256 bytes of the compressed data. */ - if (compressed_len < XPRESS_NUM_SYMBOLS / 2) + if (compressed_size < XPRESS_NUM_SYMBOLS / 2) return -1; lens_p = lens; for (unsigned i = 0; i < XPRESS_NUM_SYMBOLS / 2; i++) { - *lens_p++ = compressed_data[i] & 0xf; - *lens_p++ = compressed_data[i] >> 4; + *lens_p++ = cdata[i] & 0xf; + *lens_p++ = cdata[i] >> 4; } if (make_huffman_decode_table(decode_table, XPRESS_NUM_SYMBOLS, @@ -225,9 +223,13 @@ wimlib_xpress_decompress(const void * const restrict _compressed_data, XPRESS_MAX_CODEWORD_LEN)) return -1; - init_input_bitstream(&istream, compressed_data + XPRESS_NUM_SYMBOLS / 2, - compressed_len - XPRESS_NUM_SYMBOLS / 2); + init_input_bitstream(&istream, cdata + XPRESS_NUM_SYMBOLS / 2, + compressed_size - XPRESS_NUM_SYMBOLS / 2); return xpress_lz_decode(&istream, uncompressed_data, - uncompressed_len, lens, decode_table); + uncompressed_size, lens, decode_table); } + +const struct decompressor_ops xpress_decompressor_ops = { + .decompress = xpress_decompress, +};