#ifndef _WIMLIB_COMPRESS_H
#define _WIMLIB_COMPRESS_H
-#include "wimlib/endianness.h"
#include "wimlib/types.h"
-typedef u16 output_bitbuf_t;
-
/* Variable type that can represent all possible window positions. */
-typedef u32 freq_t;
#ifndef INPUT_IDX_T_DEFINED
#define INPUT_IDX_T_DEFINED
typedef u32 input_idx_t;
#endif
-/* Structure to keep track of the current position in the compressed output. */
+/* Structure to keep track of the current state sending bits and bytes to the
+ * compressed output buffer. */
struct output_bitstream {
- /* A variable to buffer writing bits to the output and is flushed to the
- * compressed output when full. */
- output_bitbuf_t bitbuf;
+ /* Variable that holds up to 16 bits that haven't yet been flushed to
+ * the output. */
+ u16 bitbuf;
- /* Number of free bits in @bitbuf */
+ /* Number of free bits in @bitbuf; that is, 16 minus the number of valid
+ * bits in @bitbuf. */
unsigned free_bits;
/* Pointer to the start of the output buffer. */
*/
u8 *output;
- /* Bytes remaining in @output buffer. */
+ /* Number of bytes remaining in the @output buffer. */
input_idx_t bytes_remaining;
/* Set to true if the buffer has been exhausted. */
extern void
bitstream_put_bits(struct output_bitstream *ostream,
- output_bitbuf_t bits, unsigned num_bits);
+ u32 bits, unsigned num_bits);
extern void
bitstream_put_byte(struct output_bitstream *ostream, u8 n);
struct lz_params {
unsigned min_match;
unsigned max_match;
+ unsigned max_offset;
unsigned nice_match;
unsigned good_match;
unsigned max_chain_len;
typedef void (*lz_record_literal_t)(u8 lit, void *ctx);
extern void
-lz_analyze_block(const u8 window[],
+lz_analyze_block(const u8 window[restrict],
input_idx_t window_size,
lz_record_match_t record_match,
lz_record_literal_t record_literal,
void *record_ctx,
- const struct lz_params *params);
+ const struct lz_params *params,
+ input_idx_t prev_tab[restrict]);
extern void
make_canonical_huffman_code(unsigned num_syms,
unsigned max_codeword_len,
- const freq_t freq_tab[restrict],
+ const input_idx_t freq_tab[restrict],
u8 lens[restrict],
u16 codewords[restrict]);