#ifndef _WIMLIB_DECOMPRESS_COMMON_H
#define _WIMLIB_DECOMPRESS_COMMON_H
-#include "wimlib/assert.h"
+#include <string.h>
+
#include "wimlib/compiler.h"
-#include "wimlib/endianness.h"
#include "wimlib/types.h"
#include "wimlib/unaligned.h"
static inline u32
bitstream_peek_bits(const struct input_bitstream *is, const unsigned num_bits)
{
- if (unlikely(num_bits == 0))
- return 0;
- return is->bitbuf >> (32 - num_bits);
+ return (is->bitbuf >> 1) >> (sizeof(is->bitbuf) * 8 - num_bits - 1);
}
/* Remove @num_bits from the bitstream. There must be at least @num_bits
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. */
* input data is exhausted, the Huffman symbol is decoded as if the missing bits
* are all zeroes.
*
- * XXX: This is mostly duplicated in lzms_huffman_decode_symbol() in
- * lzms-decompress.c. */
-static inline u16
+ * XXX: This is mostly duplicated in lzms_decode_huffman_symbol() in
+ * lzms_decompress.c. */
+static inline unsigned
read_huffsym(struct input_bitstream *istream, const u16 decode_table[],
unsigned table_bits, unsigned max_codeword_len)
{
unsigned num_bits, const u8 lens[],
unsigned max_codeword_len);
+static inline void
+copy_word_unaligned(const void *src, void *dst)
+{
+ store_word_unaligned(load_word_unaligned(src), dst);
+}
+
+static inline machine_word_t
+repeat_byte(u8 b)
+{
+ machine_word_t v;
+
+ BUILD_BUG_ON(WORDSIZE != 4 && WORDSIZE != 8);
+
+ v = b;
+ v |= v << 8;
+ v |= v << 16;
+ v |= v << ((WORDSIZE == 8) ? 32 : 0);
+ return v;
+}
/*
* Copy an LZ77 match at (dst - offset) to dst.