]> wimlib.net Git - wimlib/blobdiff - src/xpress-decompress.c
Get rid of input_idx_t
[wimlib] / src / xpress-decompress.c
index e4f4c6ba43f4e7f0c8da423d698d87fe2b017925..7ad47264359cfcaace8a0c253afcccd43a220cf4 100644 (file)
  * 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;
-       int ret;
-       u8 *match_dest;
-       u8 *match_src;
-       unsigned i;
+       unsigned len_hdr;
+       unsigned offset_bsr;
        unsigned match_len;
        unsigned match_offset;
 
@@ -103,27 +98,15 @@ xpress_decode_match(unsigned sym, input_idx_t window_pos,
        len_hdr = sym & 0xf;
        offset_bsr = sym >> 4;
 
-       if (bitstream_ensure_bits(istream, 16))
-               return -1;
+       bitstream_ensure_bits(istream, 16);
 
        match_offset = (1U << offset_bsr) | bitstream_pop_bits(istream, offset_bsr);
 
        if (len_hdr == 0xf) {
-               ret = bitstream_read_byte(istream);
-               if (ret < 0)
-                       return ret;
-               match_len = ret;
+               match_len = bitstream_read_byte(istream);
                if (unlikely(match_len == 0xff)) {
-                       ret = bitstream_read_byte(istream);
-                       if (ret < 0)
-                               return ret;
-                       match_len = ret;
-
-                       ret = bitstream_read_byte(istream);
-                       if (ret < 0)
-                               return ret;
-
-                       match_len |= (ret << 8);
+                       match_len = bitstream_read_byte(istream);
+                       match_len |= (unsigned)bitstream_read_byte(istream) << 8;
                } else {
                        match_len += 0xf;
                }
@@ -132,21 +115,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 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;
 }
@@ -157,24 +133,19 @@ 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;
 
-               if (unlikely(bitstream_ensure_bits(istream, 16)))
-                       return -1;
-
-               if (unlikely(read_huffsym(istream, decode_table, lens,
-                                         XPRESS_NUM_SYMBOLS, XPRESS_TABLEBITS,
-                                         &sym, XPRESS_MAX_CODEWORD_LEN)))
-                       return -1;
+               bitstream_ensure_bits(istream, 16);
 
+               sym = read_huffsym(istream, decode_table,
+                                  XPRESS_TABLEBITS, XPRESS_MAX_CODEWORD_LEN);
                if (sym < XPRESS_NUM_CHARS) {
                        /* Literal  */
                        uncompressed_data[curpos] = sym;
@@ -195,7 +166,6 @@ xpress_lz_decode(struct input_bitstream * restrict istream,
 }
 
 
-/* API function documented in wimlib.h  */
 static int
 xpress_decompress(const void *compressed_data, size_t compressed_size,
                  void *uncompressed_data, size_t uncompressed_size, void *_ctx)
@@ -228,7 +198,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 = {