#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"
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. */
* 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)
may_have_e8_byte = true;
}
-
- out_next += block_size;
}
/* Postprocess the data unless it cannot possibly contain 0xe8 bytes */