decompress_common.h: make bitstream_read_bytes() fill buffer itself
authorEric Biggers <ebiggers3@gmail.com>
Mon, 20 Jul 2015 05:02:07 +0000 (00:02 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Wed, 22 Jul 2015 04:55:47 +0000 (23:55 -0500)
include/wimlib/decompress_common.h
src/lzx_decompress.c

index ce731dc..70f7dd5 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef _WIMLIB_DECOMPRESS_COMMON_H
 #define _WIMLIB_DECOMPRESS_COMMON_H
 
+#include <string.h>
+
 #include "wimlib/compiler.h"
 #include "wimlib/types.h"
 #include "wimlib/unaligned.h"
@@ -157,18 +159,17 @@ bitstream_read_u32(struct input_bitstream *is)
        return v;
 }
 
-/* Read an array of literal bytes embedded in the bitstream.  Return a pointer
- * to the resulting array, or NULL if the read overflows the input buffer.  */
-static inline const u8 *
-bitstream_read_bytes(struct input_bitstream *is, size_t count)
+/* Read into @dst_buffer an array of literal bytes embedded in the bitstream.
+ * Return either a pointer to the byte past the last written, or NULL if the
+ * read overflows the input buffer.  */
+static inline void *
+bitstream_read_bytes(struct input_bitstream *is, void *dst_buffer, size_t count)
 {
-       const u8 *p;
-
        if (unlikely(is->end - is->next < count))
                return NULL;
-       p = is->next;
+       memcpy(dst_buffer, is->next, count);
        is->next += count;
-       return p;
+       return (u8 *)dst_buffer + count;
 }
 
 /* Align the input bitstream on a coding-unit boundary.  */
index 1ebaf35..d9ab5c3 100644 (file)
@@ -583,17 +583,15 @@ lzx_decompress(const void *compressed_data, size_t compressed_size,
                         * have been encoded as a literal using mainsym 0xe8. */
                        if (dec->tables.maincode_lens[0xe8] != 0)
                                may_have_e8_byte = true;
+
+                       out_next += block_size;
                } else {
 
                        /* Uncompressed block.  */
-                       const u8 *p;
-
-                       p = bitstream_read_bytes(&istream, block_size);
-                       if (!p)
+                       out_next = bitstream_read_bytes(&istream, out_next, block_size);
+                       if (!out_next)
                                return -1;
 
-                       memcpy(out_next, p, block_size);
-
                        /* Re-align the bitstream if an odd number of bytes was
                         * read.  */
                        if (block_size & 1)
@@ -601,8 +599,6 @@ lzx_decompress(const void *compressed_data, size_t compressed_size,
 
                        may_have_e8_byte = true;
                }
-
-               out_next += block_size;
        }
 
        /* Postprocess the data unless it cannot possibly contain 0xe8 bytes  */