/* * compress.h * * Functions useful for compression, mainly bitstreams. */ #ifndef _WIMLIB_COMPRESS_H #define _WIMLIB_COMPRESS_H #include "util.h" #include "endianness.h" typedef u16 output_bitbuf_t; /* Assuming that WIM chunks are at most 32768 bytes, 16 bits is enough for any * symbol frequency. */ typedef u16 freq_t; /* Structure to keep track of the current position in the compressed output. */ 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; /* Number of free bits in @bitbuf */ unsigned free_bits; u8 *bit_output; u8 *next_bit_output; /* Pointer to the next byte in the compressed output. */ u8 *output; /* Number of bytes left in the memory pointed to by @output. */ int num_bytes_remaining; }; static inline int bitstream_put_byte(struct output_bitstream *ostream, u8 n) { if (ostream->num_bytes_remaining < 1) return 1; *ostream->output = n; ostream->output++; ostream->num_bytes_remaining--; return 0; } static inline int bitstream_put_two_bytes(struct output_bitstream *ostream, u16 n) { if (ostream->num_bytes_remaining < 2) return 1; *(u16*)ostream->output = cpu_to_le16(n); ostream->output += 2; ostream->num_bytes_remaining -= 2; return 0; } struct lz_params { unsigned min_match; unsigned max_match; unsigned nice_match; unsigned good_match; unsigned max_chain_len; unsigned max_lazy_match; unsigned too_far; }; typedef unsigned (*lz_record_match_t)(unsigned, unsigned, void *, void *); typedef unsigned (*lz_record_literal_t)(u8, void *); extern unsigned lz_analyze_block(const u8 uncompressed_data[], unsigned uncompressed_len, u32 match_tab[], lz_record_match_t record_match, lz_record_literal_t record_literal, void *record_match_arg1, void *record_match_arg2, void *record_literal_arg, const struct lz_params *params); extern int bitstream_put_bits(struct output_bitstream *ostream, output_bitbuf_t bits, unsigned num_bits); extern void init_output_bitstream(struct output_bitstream *ostream, void *data, unsigned num_bytes); extern int flush_output_bitstream(struct output_bitstream *ostream); extern void make_canonical_huffman_code(unsigned num_syms, unsigned max_codeword_len, const freq_t freq_tab[], u8 lens[], u16 codewords[]); #endif /* _WIMLIB_COMPRESS_H */