# include "config.h"
#endif
-#include "wimlib.h"
#include "wimlib/decompressor_ops.h"
#include "wimlib/decompress_common.h"
+#include "wimlib/error.h"
#include "wimlib/xpress.h"
/*
* Returns the match length, or -1 if the data is invalid.
*/
static int
-xpress_decode_match(unsigned sym, input_idx_t window_pos,
- input_idx_t window_len, u8 window[restrict],
+xpress_decode_match(unsigned sym, u32 window_pos,
+ u32 window_len, u8 window[restrict],
struct input_bitstream * restrict istream)
{
-
- u8 len_hdr;
- u8 offset_bsr;
- u8 *match_dest;
- u8 *match_src;
- unsigned i;
+ unsigned len_hdr;
+ unsigned offset_bsr;
unsigned match_len;
unsigned match_offset;
}
match_len += XPRESS_MIN_MATCH_LEN;
-
- /* Verify the match is in bounds, then copy its data to the current
- * position. */
-
- if (window_pos + match_len > window_len)
+ if (unlikely(match_len > window_len - window_pos))
return -1;
- if (match_offset > window_pos)
+ if (unlikely(match_offset > window_pos))
return -1;
- match_dest = window + window_pos;
- match_src = match_dest - match_offset;
-
- for (i = 0; i < match_len; i++)
- match_dest[i] = match_src[i];
+ lz_copy(&window[window_pos], match_len, match_offset,
+ &window[window_len]);
return match_len;
}
xpress_lz_decode(struct input_bitstream * restrict istream,
u8 uncompressed_data[restrict],
unsigned uncompressed_len,
- const u8 lens[restrict],
const u16 decode_table[restrict])
{
- input_idx_t curpos;
+ u32 curpos;
unsigned match_len;
for (curpos = 0; curpos < uncompressed_len; curpos += match_len) {
unsigned sym;
int ret;
- bitstream_ensure_bits(istream, 16);
-
sym = read_huffsym(istream, decode_table,
- XPRESS_NUM_SYMBOLS, XPRESS_TABLEBITS,
- XPRESS_MAX_CODEWORD_LEN);
+ XPRESS_TABLEBITS, XPRESS_MAX_CODEWORD_LEN);
if (sym < XPRESS_NUM_CHARS) {
/* Literal */
uncompressed_data[curpos] = sym;
compressed_size - XPRESS_NUM_SYMBOLS / 2);
return xpress_lz_decode(&istream, uncompressed_data,
- uncompressed_size, lens, decode_table);
+ uncompressed_size, decode_table);
+}
+
+static int
+xpress_create_decompressor(size_t max_block_size, void **dec_ret)
+{
+ if (max_block_size > XPRESS_MAX_OFFSET + 1)
+ return WIMLIB_ERR_INVALID_PARAM;
+
+ return 0;
}
const struct decompressor_ops xpress_decompressor_ops = {
- .decompress = xpress_decompress,
+ .create_decompressor = xpress_create_decompressor,
+ .decompress = xpress_decompress,
};