Fix sequential extraction, and include progress info
[wimlib] / src / comp.h
1 /*
2  * comp.h
3  *
4  * Functions useful for compression, mainly bitstreams.
5  */
6
7 #ifndef _WIMLIB_COMP_H
8 #define _WIMLIB_COMP_H
9
10 #include "util.h"
11 #include "endianness.h"
12
13 typedef u16 output_bitbuf_t;
14
15 /* Structure to keep track of the current position in the compressed output. */
16 struct output_bitstream {
17
18         /* A variable to buffer writing bits to the output and is flushed to the
19          * compressed output when full. */
20         output_bitbuf_t bitbuf;
21
22         /* Number of free bits in @bitbuf */
23         uint free_bits;
24
25         u8 *bit_output;
26         u8 *next_bit_output;
27
28         /* Pointer to the next byte in the compressed output. */
29         u8 *output;
30
31
32         /* Number of bytes left in the memory pointed to by @output. */
33         int num_bytes_remaining;
34 };
35
36
37 static inline int bitstream_put_byte(struct output_bitstream *ostream,
38                                      u8 n)
39 {
40         if (ostream->num_bytes_remaining < 1)
41                 return 1;
42         *ostream->output = n;
43         ostream->output++;
44         ostream->num_bytes_remaining--;
45         return 0;
46 }
47
48 static inline int bitstream_put_two_bytes(struct output_bitstream *ostream,
49                                           u16 n)
50 {
51         if (ostream->num_bytes_remaining < 2)
52                 return 1;
53         *(u16*)ostream->output = cpu_to_le16(n);
54         ostream->output += 2;
55         ostream->num_bytes_remaining -= 2;
56         return 0;
57 }
58
59
60 struct lz_params {
61         uint min_match;
62         uint max_match;
63         uint nice_match;
64         uint good_match;
65         uint max_chain_len;
66         uint max_lazy_match;
67         uint too_far;
68 };
69
70 typedef uint (*lz_record_match_t)(uint, uint, void *, void *);
71 typedef uint (*lz_record_literal_t)(u8, void *);
72
73 extern uint lz_analyze_block(const u8 uncompressed_data[],
74                              uint uncompressed_len,
75                              u32 match_tab[],
76                              lz_record_match_t record_match,
77                              lz_record_literal_t record_literal,
78                              void *record_match_arg1,
79                              void *record_match_arg2,
80                              void *record_literal_arg,
81                              const struct lz_params *params);
82
83 extern int bitstream_put_bits(struct output_bitstream *ostream,
84                               output_bitbuf_t bits, unsigned num_bits);
85
86 extern void init_output_bitstream(struct output_bitstream *ostream,
87                                   void *data, unsigned num_bytes);
88
89 extern int flush_output_bitstream(struct output_bitstream *ostream);
90
91 extern void make_canonical_huffman_code(uint num_syms, uint max_codeword_len,
92                                         const u32 freq_tab[], u8 lens[],
93                                         u16 codewords[]);
94
95 #endif /* _WIMLIB_COMP_H */