-static int
-xpress_decompress(const void *compressed_data, size_t compressed_size,
- void *uncompressed_data, size_t uncompressed_size, void *_ctx)
-{
- const u8 *cdata = compressed_data;
- u8 lens[XPRESS_NUM_SYMBOLS];
- u8 *lens_p;
- u16 decode_table[(1 << XPRESS_TABLEBITS) + 2 * XPRESS_NUM_SYMBOLS]
- _aligned_attribute(DECODE_TABLE_ALIGNMENT);
- struct input_bitstream istream;
-
- /* 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_size < XPRESS_NUM_SYMBOLS / 2)
- return -1;
-
- lens_p = lens;
- for (unsigned i = 0; i < XPRESS_NUM_SYMBOLS / 2; i++) {
- *lens_p++ = cdata[i] & 0xf;
- *lens_p++ = cdata[i] >> 4;
- }
-
- if (make_huffman_decode_table(decode_table, XPRESS_NUM_SYMBOLS,
- XPRESS_TABLEBITS, lens,
- XPRESS_MAX_CODEWORD_LEN))
- return -1;
-
- init_input_bitstream(&istream, cdata + XPRESS_NUM_SYMBOLS / 2,
- compressed_size - XPRESS_NUM_SYMBOLS / 2);
-
- return xpress_decode_window(&istream, decode_table,
- uncompressed_data, uncompressed_size);
-}
-