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