xref: /plan9-contrib/sys/src/cmd/lzip/fast_encoder.h (revision 13d37d7716a3e781f408392d7869dff5927c6669)
1 /*  Clzip - LZMA lossless data compressor
2     Copyright (C) 2010-2017 Antonio Diaz Diaz.
3 
4     This program is free software: you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation, either version 2 of the License, or
7     (at your option) any later version.
8 
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13 
14     You should have received a copy of the GNU General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16 
17 typedef struct FLZ_encoder FLZ_encoder;
18 struct FLZ_encoder {
19 	struct LZ_encoder_base eb;
20 	unsigned key4;			/* key made from latest 4 bytes */
21 };
22 
23 static void
FLZe_reset_key4(FLZ_encoder * fe)24 FLZe_reset_key4(FLZ_encoder *fe)
25 {
26 	int	i;
27 	fe->key4 = 0;
28 	for (i = 0; i < 3 && i < Mb_avail_bytes(&fe->eb.mb); ++i)
29 		fe->key4 = (fe->key4 << 4) ^ fe->eb.mb.buffer[i];
30 }
31 
32 int	FLZe_longest_match_len(FLZ_encoder *fe, int *distance);
33 
34 static void
FLZe_update_and_move(FLZ_encoder * fe,int n)35 FLZe_update_and_move(FLZ_encoder *fe, int n)
36 {
37 	while (--n >= 0) {
38 		if (Mb_avail_bytes(&fe->eb.mb) >= 4) {
39 			fe->key4 = ((fe->key4 << 4) ^ fe->eb.mb.buffer[fe->eb.mb.pos+3]) &
40 			    fe->eb.mb.key4_mask;
41 			fe->eb.mb.pos_array[fe->eb.mb.cyclic_pos] = fe->eb.mb.prev_positions[fe->key4];
42 			fe->eb.mb.prev_positions[fe->key4] = fe->eb.mb.pos + 1;
43 		}
44 		Mb_move_pos(&fe->eb.mb);
45 	}
46 }
47 
48 static bool
FLZe_init(FLZ_encoder * fe,int ifd,int outfd)49 FLZe_init(FLZ_encoder *fe, int ifd, int outfd)
50 {
51 	enum {
52 		before = 0,
53 		dict_size = 65536,
54 		/* bytes to keep in buffer after pos */
55 		after_size = max_match_len,
56 		dict_factor = 16,
57 		num_prev_positions23 = 0,
58 		pos_array_factor = 1
59 	};
60 
61 	return LZeb_init(&fe->eb, before, dict_size, after_size, dict_factor,
62 	    num_prev_positions23, pos_array_factor, ifd, outfd);
63 }
64 
65 static void
FLZe_reset(FLZ_encoder * fe)66 FLZe_reset(FLZ_encoder *fe)
67 {
68 	LZeb_reset(&fe->eb);
69 }
70 
71 bool	FLZe_encode_member(FLZ_encoder *fe, uvlong member_size);
72