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