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