X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxpress-decompress.c;h=f060d0b0df2afeccfec25fbae91d41321f6beda6;hb=965c28d0cce2e43df3c38b47c78204b1c33c313d;hp=338c9d957b7a90bccd55f29447a3add8797ab806;hpb=18f9daee201c3e79e6d508f1ce69206b8035ae4b;p=wimlib diff --git a/src/xpress-decompress.c b/src/xpress-decompress.c index 338c9d95..f060d0b0 100644 --- a/src/xpress-decompress.c +++ b/src/xpress-decompress.c @@ -69,7 +69,6 @@ # include "config.h" #endif -#include "wimlib.h" #include "wimlib/decompressor_ops.h" #include "wimlib/decompress_common.h" #include "wimlib/xpress.h" @@ -85,16 +84,12 @@ * 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; @@ -119,21 +114,14 @@ xpress_decode_match(unsigned sym, input_idx_t window_pos, } 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; } @@ -144,18 +132,15 @@ static int 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_TABLEBITS, XPRESS_MAX_CODEWORD_LEN); if (sym < XPRESS_NUM_CHARS) { @@ -210,7 +195,7 @@ xpress_decompress(const void *compressed_data, size_t compressed_size, compressed_size - XPRESS_NUM_SYMBOLS / 2); return xpress_lz_decode(&istream, uncompressed_data, - uncompressed_size, lens, decode_table); + uncompressed_size, decode_table); } const struct decompressor_ops xpress_decompressor_ops = {