/src/lzo-2.10/src/lzo1x_9x.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* lzo1x_9x.c -- implementation of the LZO1X-999 compression algorithm |
2 | | |
3 | | This file is part of the LZO real-time data compression library. |
4 | | |
5 | | Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer |
6 | | All Rights Reserved. |
7 | | |
8 | | The LZO library is free software; you can redistribute it and/or |
9 | | modify it under the terms of the GNU General Public License as |
10 | | published by the Free Software Foundation; either version 2 of |
11 | | the License, or (at your option) any later version. |
12 | | |
13 | | The LZO library is distributed in the hope that it will be useful, |
14 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | | GNU General Public License for more details. |
17 | | |
18 | | You should have received a copy of the GNU General Public License |
19 | | along with the LZO library; see the file COPYING. |
20 | | If not, write to the Free Software Foundation, Inc., |
21 | | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
22 | | |
23 | | Markus F.X.J. Oberhumer |
24 | | <markus@oberhumer.com> |
25 | | http://www.oberhumer.com/opensource/lzo/ |
26 | | */ |
27 | | |
28 | | |
29 | | #if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z) |
30 | | # define LZO1X 1 |
31 | | #endif |
32 | | |
33 | | #if defined(LZO1X) |
34 | | # include "config1x.h" |
35 | | #elif defined(LZO1Y) |
36 | | # include "config1y.h" |
37 | | #elif defined(LZO1Z) |
38 | | # include "config1z.h" |
39 | | #else |
40 | | # error |
41 | | #endif |
42 | | |
43 | | |
44 | | /*********************************************************************** |
45 | | // |
46 | | ************************************************************************/ |
47 | | |
48 | 5.30k | #define SWD_N M4_MAX_OFFSET /* size of ring buffer */ |
49 | 54.9M | #define SWD_THRESHOLD 1 /* lower limit for match length */ |
50 | 26.5k | #define SWD_F 2048 /* upper limit for match length */ |
51 | | |
52 | 1.84G | #define SWD_BEST_OFF (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1) |
53 | | |
54 | | #if defined(LZO1X) |
55 | 3.36k | # define LZO_COMPRESS_T lzo1x_999_t |
56 | 1.68k | # define lzo_swd_t lzo1x_999_swd_t |
57 | | #elif defined(LZO1Y) |
58 | 3.30k | # define LZO_COMPRESS_T lzo1y_999_t |
59 | 1.65k | # define lzo_swd_t lzo1y_999_swd_t |
60 | 1.65k | # define lzo1x_999_compress_internal lzo1y_999_compress_internal |
61 | | # define lzo1x_999_compress_dict lzo1y_999_compress_dict |
62 | 1.65k | # define lzo1x_999_compress_level lzo1y_999_compress_level |
63 | | # define lzo1x_999_compress lzo1y_999_compress |
64 | | #elif defined(LZO1Z) |
65 | 3.93k | # define LZO_COMPRESS_T lzo1z_999_t |
66 | 1.96k | # define lzo_swd_t lzo1z_999_swd_t |
67 | 1.96k | # define lzo1x_999_compress_internal lzo1z_999_compress_internal |
68 | | # define lzo1x_999_compress_dict lzo1z_999_compress_dict |
69 | 1.96k | # define lzo1x_999_compress_level lzo1z_999_compress_level |
70 | | # define lzo1x_999_compress lzo1z_999_compress |
71 | | #else |
72 | | # error |
73 | | #endif |
74 | | |
75 | | #if 0 |
76 | | # define HEAD3(b,p) \ |
77 | | ((((((lzo_xint)b[p]<<3)^b[p+1])<<3)^b[p+2]) & (SWD_HSIZE-1)) |
78 | | #endif |
79 | | #if 0 && (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN) |
80 | | # define HEAD3(b,p) \ |
81 | | (((* (lzo_uint32_tp) &b[p]) ^ ((* (lzo_uint32_tp) &b[p])>>10)) & (SWD_HSIZE-1)) |
82 | | #endif |
83 | | |
84 | | #include "lzo_mchw.ch" |
85 | | |
86 | | |
87 | | /* this is a public functions, but there is no prototype in a header file */ |
88 | | LZO_EXTERN(int) |
89 | | lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint in_len, |
90 | | lzo_bytep out, lzo_uintp out_len, |
91 | | lzo_voidp wrkmem, |
92 | | const lzo_bytep dict, lzo_uint dict_len, |
93 | | lzo_callback_p cb, |
94 | | int try_lazy_parm, |
95 | | lzo_uint good_length, |
96 | | lzo_uint max_lazy, |
97 | | lzo_uint nice_length, |
98 | | lzo_uint max_chain, |
99 | | lzo_uint32_t flags ); |
100 | | |
101 | | |
102 | | /*********************************************************************** |
103 | | // |
104 | | ************************************************************************/ |
105 | | |
106 | | static lzo_bytep |
107 | | code_match ( LZO_COMPRESS_T *c, lzo_bytep op, lzo_uint m_len, lzo_uint m_off ) |
108 | 2.38M | { |
109 | 2.38M | lzo_uint x_len = m_len; |
110 | 2.38M | lzo_uint x_off = m_off; |
111 | | |
112 | 2.38M | c->match_bytes += m_len; |
113 | | |
114 | | #if 0 |
115 | | /* |
116 | | static lzo_uint last_m_len = 0, last_m_off = 0; |
117 | | static lzo_uint prev_m_off[4]; |
118 | | static unsigned prev_m_off_ptr = 0; |
119 | | unsigned i; |
120 | | |
121 | | //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
122 | | if (m_len >= 3 && m_len <= M2_MAX_LEN) |
123 | | { |
124 | | //if (m_len == last_m_len && m_off == last_m_off) |
125 | | //printf("last_m_len + last_m_off\n"); |
126 | | //else |
127 | | if (m_off == last_m_off) |
128 | | printf("last_m_off\n"); |
129 | | else |
130 | | { |
131 | | for (i = 0; i < 4; i++) |
132 | | if (m_off == prev_m_off[i]) |
133 | | printf("prev_m_off %u: %5ld\n",i,(long)m_off); |
134 | | } |
135 | | } |
136 | | last_m_len = m_len; |
137 | | last_m_off = prev_m_off[prev_m_off_ptr] = m_off; |
138 | | prev_m_off_ptr = (prev_m_off_ptr + 1) & 3; |
139 | | */ |
140 | | #endif |
141 | | |
142 | 2.38M | assert(op > c->out); |
143 | 2.38M | if (m_len == 2) |
144 | 921k | { |
145 | 921k | assert(m_off <= M1_MAX_OFFSET); |
146 | 921k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); |
147 | 921k | m_off -= 1; |
148 | | #if defined(LZO1Z) |
149 | 359k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
150 | 359k | *op++ = LZO_BYTE(m_off << 2); |
151 | | #else |
152 | 561k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
153 | 561k | *op++ = LZO_BYTE(m_off >> 2); |
154 | | #endif |
155 | 921k | c->m1a_m++; |
156 | 921k | } |
157 | | #if defined(LZO1Z) |
158 | 515k | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) |
159 | | #else |
160 | 947k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
161 | 462k | #endif |
162 | 722k | { |
163 | 722k | assert(m_len >= 3); |
164 | | #if defined(LZO1X) |
165 | | m_off -= 1; |
166 | 230k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); |
167 | 230k | *op++ = LZO_BYTE(m_off >> 3); |
168 | | assert(op[-2] >= M2_MARKER); |
169 | | #elif defined(LZO1Y) |
170 | | m_off -= 1; |
171 | 231k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); |
172 | 231k | *op++ = LZO_BYTE(m_off >> 2); |
173 | | assert(op[-2] >= M2_MARKER); |
174 | | #elif defined(LZO1Z) |
175 | 259k | if (m_off == c->last_m_off) |
176 | 14.6k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); |
177 | 245k | else |
178 | 245k | { |
179 | 245k | m_off -= 1; |
180 | 245k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); |
181 | 245k | *op++ = LZO_BYTE(m_off << 2); |
182 | 245k | } |
183 | | #endif |
184 | 722k | c->m2_m++; |
185 | 722k | } |
186 | 741k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) |
187 | 12.8k | { |
188 | 12.8k | assert(m_len == 3); |
189 | 12.8k | assert(m_off > M2_MAX_OFFSET); |
190 | 12.8k | m_off -= 1 + M2_MAX_OFFSET; |
191 | | #if defined(LZO1Z) |
192 | 4.16k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
193 | 4.16k | *op++ = LZO_BYTE(m_off << 2); |
194 | | #else |
195 | 8.65k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
196 | 8.65k | *op++ = LZO_BYTE(m_off >> 2); |
197 | | #endif |
198 | 12.8k | c->m1b_m++; |
199 | 12.8k | } |
200 | 728k | else if (m_off <= M3_MAX_OFFSET) |
201 | 600k | { |
202 | 600k | assert(m_len >= 3); |
203 | 600k | m_off -= 1; |
204 | 600k | if (m_len <= M3_MAX_LEN) |
205 | 453k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); |
206 | 147k | else |
207 | 147k | { |
208 | 147k | m_len -= M3_MAX_LEN; |
209 | 147k | *op++ = M3_MARKER | 0; |
210 | 220k | while (m_len > 255) |
211 | 73.1k | { |
212 | 73.1k | m_len -= 255; |
213 | 73.1k | *op++ = 0; |
214 | 73.1k | } |
215 | 147k | assert(m_len > 0); |
216 | 147k | *op++ = LZO_BYTE(m_len); |
217 | 147k | } |
218 | | #if defined(LZO1Z) |
219 | 209k | *op++ = LZO_BYTE(m_off >> 6); |
220 | 209k | *op++ = LZO_BYTE(m_off << 2); |
221 | | #else |
222 | 391k | *op++ = LZO_BYTE(m_off << 2); |
223 | 391k | *op++ = LZO_BYTE(m_off >> 6); |
224 | | #endif |
225 | 600k | c->m3_m++; |
226 | 600k | } |
227 | 127k | else |
228 | 127k | { |
229 | 127k | lzo_uint k; |
230 | | |
231 | 127k | assert(m_len >= 3); |
232 | 127k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); |
233 | 127k | m_off -= 0x4000; |
234 | 127k | k = (m_off & 0x4000) >> 11; |
235 | 127k | if (m_len <= M4_MAX_LEN) |
236 | 72.5k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); |
237 | 54.8k | else |
238 | 54.8k | { |
239 | 54.8k | m_len -= M4_MAX_LEN; |
240 | 54.8k | *op++ = LZO_BYTE(M4_MARKER | k | 0); |
241 | 77.3k | while (m_len > 255) |
242 | 22.4k | { |
243 | 22.4k | m_len -= 255; |
244 | 22.4k | *op++ = 0; |
245 | 22.4k | } |
246 | 54.8k | assert(m_len > 0); |
247 | 54.8k | *op++ = LZO_BYTE(m_len); |
248 | 54.8k | } |
249 | | #if defined(LZO1Z) |
250 | 41.7k | *op++ = LZO_BYTE(m_off >> 6); |
251 | 41.7k | *op++ = LZO_BYTE(m_off << 2); |
252 | | #else |
253 | 85.6k | *op++ = LZO_BYTE(m_off << 2); |
254 | 85.6k | *op++ = LZO_BYTE(m_off >> 6); |
255 | | #endif |
256 | 127k | c->m4_m++; |
257 | 127k | } |
258 | | |
259 | 2.38M | c->last_m_len = x_len; |
260 | 2.38M | c->last_m_off = x_off; |
261 | 2.38M | return op; |
262 | 2.38M | } Line | Count | Source | 108 | 707k | { | 109 | 707k | lzo_uint x_len = m_len; | 110 | 707k | lzo_uint x_off = m_off; | 111 | | | 112 | 707k | c->match_bytes += m_len; | 113 | | | 114 | | #if 0 | 115 | | /* | 116 | | static lzo_uint last_m_len = 0, last_m_off = 0; | 117 | | static lzo_uint prev_m_off[4]; | 118 | | static unsigned prev_m_off_ptr = 0; | 119 | | unsigned i; | 120 | | | 121 | | //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 122 | | if (m_len >= 3 && m_len <= M2_MAX_LEN) | 123 | | { | 124 | | //if (m_len == last_m_len && m_off == last_m_off) | 125 | | //printf("last_m_len + last_m_off\n"); | 126 | | //else | 127 | | if (m_off == last_m_off) | 128 | | printf("last_m_off\n"); | 129 | | else | 130 | | { | 131 | | for (i = 0; i < 4; i++) | 132 | | if (m_off == prev_m_off[i]) | 133 | | printf("prev_m_off %u: %5ld\n",i,(long)m_off); | 134 | | } | 135 | | } | 136 | | last_m_len = m_len; | 137 | | last_m_off = prev_m_off[prev_m_off_ptr] = m_off; | 138 | | prev_m_off_ptr = (prev_m_off_ptr + 1) & 3; | 139 | | */ | 140 | | #endif | 141 | | | 142 | 707k | assert(op > c->out); | 143 | 707k | if (m_len == 2) | 144 | 242k | { | 145 | 242k | assert(m_off <= M1_MAX_OFFSET); | 146 | 242k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 242k | m_off -= 1; | 148 | | #if defined(LZO1Z) | 149 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | | *op++ = LZO_BYTE(m_off << 2); | 151 | | #else | 152 | 242k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 242k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 242k | #endif | 155 | 242k | c->m1a_m++; | 156 | 242k | } | 157 | | #if defined(LZO1Z) | 158 | | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) | 159 | | #else | 160 | 464k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 230k | #endif | 162 | 230k | { | 163 | 230k | assert(m_len >= 3); | 164 | 230k | #if defined(LZO1X) | 165 | 230k | m_off -= 1; | 166 | 230k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | 230k | *op++ = LZO_BYTE(m_off >> 3); | 168 | 230k | assert(op[-2] >= M2_MARKER); | 169 | | #elif defined(LZO1Y) | 170 | | m_off -= 1; | 171 | | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | | *op++ = LZO_BYTE(m_off >> 2); | 173 | | assert(op[-2] >= M2_MARKER); | 174 | | #elif defined(LZO1Z) | 175 | | if (m_off == c->last_m_off) | 176 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | | else | 178 | | { | 179 | | m_off -= 1; | 180 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | | *op++ = LZO_BYTE(m_off << 2); | 182 | | } | 183 | | #endif | 184 | 230k | c->m2_m++; | 185 | 230k | } | 186 | 234k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 3.32k | { | 188 | 3.32k | assert(m_len == 3); | 189 | 3.32k | assert(m_off > M2_MAX_OFFSET); | 190 | 3.32k | m_off -= 1 + M2_MAX_OFFSET; | 191 | | #if defined(LZO1Z) | 192 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | | *op++ = LZO_BYTE(m_off << 2); | 194 | | #else | 195 | 3.32k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 3.32k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 3.32k | #endif | 198 | 3.32k | c->m1b_m++; | 199 | 3.32k | } | 200 | 231k | else if (m_off <= M3_MAX_OFFSET) | 201 | 192k | { | 202 | 192k | assert(m_len >= 3); | 203 | 192k | m_off -= 1; | 204 | 192k | if (m_len <= M3_MAX_LEN) | 205 | 144k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 48.4k | else | 207 | 48.4k | { | 208 | 48.4k | m_len -= M3_MAX_LEN; | 209 | 48.4k | *op++ = M3_MARKER | 0; | 210 | 69.8k | while (m_len > 255) | 211 | 21.3k | { | 212 | 21.3k | m_len -= 255; | 213 | 21.3k | *op++ = 0; | 214 | 21.3k | } | 215 | 48.4k | assert(m_len > 0); | 216 | 48.4k | *op++ = LZO_BYTE(m_len); | 217 | 48.4k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 192k | *op++ = LZO_BYTE(m_off << 2); | 223 | 192k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 192k | #endif | 225 | 192k | c->m3_m++; | 226 | 192k | } | 227 | 38.5k | else | 228 | 38.5k | { | 229 | 38.5k | lzo_uint k; | 230 | | | 231 | 38.5k | assert(m_len >= 3); | 232 | 38.5k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 38.5k | m_off -= 0x4000; | 234 | 38.5k | k = (m_off & 0x4000) >> 11; | 235 | 38.5k | if (m_len <= M4_MAX_LEN) | 236 | 21.7k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 16.8k | else | 238 | 16.8k | { | 239 | 16.8k | m_len -= M4_MAX_LEN; | 240 | 16.8k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 23.7k | while (m_len > 255) | 242 | 6.90k | { | 243 | 6.90k | m_len -= 255; | 244 | 6.90k | *op++ = 0; | 245 | 6.90k | } | 246 | 16.8k | assert(m_len > 0); | 247 | 16.8k | *op++ = LZO_BYTE(m_len); | 248 | 16.8k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 38.5k | *op++ = LZO_BYTE(m_off << 2); | 254 | 38.5k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 38.5k | #endif | 256 | 38.5k | c->m4_m++; | 257 | 38.5k | } | 258 | | | 259 | 707k | c->last_m_len = x_len; | 260 | 707k | c->last_m_off = x_off; | 261 | 707k | return op; | 262 | 707k | } |
Line | Count | Source | 108 | 802k | { | 109 | 802k | lzo_uint x_len = m_len; | 110 | 802k | lzo_uint x_off = m_off; | 111 | | | 112 | 802k | c->match_bytes += m_len; | 113 | | | 114 | | #if 0 | 115 | | /* | 116 | | static lzo_uint last_m_len = 0, last_m_off = 0; | 117 | | static lzo_uint prev_m_off[4]; | 118 | | static unsigned prev_m_off_ptr = 0; | 119 | | unsigned i; | 120 | | | 121 | | //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 122 | | if (m_len >= 3 && m_len <= M2_MAX_LEN) | 123 | | { | 124 | | //if (m_len == last_m_len && m_off == last_m_off) | 125 | | //printf("last_m_len + last_m_off\n"); | 126 | | //else | 127 | | if (m_off == last_m_off) | 128 | | printf("last_m_off\n"); | 129 | | else | 130 | | { | 131 | | for (i = 0; i < 4; i++) | 132 | | if (m_off == prev_m_off[i]) | 133 | | printf("prev_m_off %u: %5ld\n",i,(long)m_off); | 134 | | } | 135 | | } | 136 | | last_m_len = m_len; | 137 | | last_m_off = prev_m_off[prev_m_off_ptr] = m_off; | 138 | | prev_m_off_ptr = (prev_m_off_ptr + 1) & 3; | 139 | | */ | 140 | | #endif | 141 | | | 142 | 802k | assert(op > c->out); | 143 | 802k | if (m_len == 2) | 144 | 319k | { | 145 | 319k | assert(m_off <= M1_MAX_OFFSET); | 146 | 319k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 319k | m_off -= 1; | 148 | | #if defined(LZO1Z) | 149 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | | *op++ = LZO_BYTE(m_off << 2); | 151 | | #else | 152 | 319k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 319k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 319k | #endif | 155 | 319k | c->m1a_m++; | 156 | 319k | } | 157 | | #if defined(LZO1Z) | 158 | | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) | 159 | | #else | 160 | 482k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 231k | #endif | 162 | 231k | { | 163 | 231k | assert(m_len >= 3); | 164 | | #if defined(LZO1X) | 165 | | m_off -= 1; | 166 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | | *op++ = LZO_BYTE(m_off >> 3); | 168 | | assert(op[-2] >= M2_MARKER); | 169 | | #elif defined(LZO1Y) | 170 | 231k | m_off -= 1; | 171 | 231k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | 231k | *op++ = LZO_BYTE(m_off >> 2); | 173 | 231k | assert(op[-2] >= M2_MARKER); | 174 | | #elif defined(LZO1Z) | 175 | | if (m_off == c->last_m_off) | 176 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | | else | 178 | | { | 179 | | m_off -= 1; | 180 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | | *op++ = LZO_BYTE(m_off << 2); | 182 | | } | 183 | | #endif | 184 | 231k | c->m2_m++; | 185 | 231k | } | 186 | 251k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 5.32k | { | 188 | 5.32k | assert(m_len == 3); | 189 | 5.32k | assert(m_off > M2_MAX_OFFSET); | 190 | 5.32k | m_off -= 1 + M2_MAX_OFFSET; | 191 | | #if defined(LZO1Z) | 192 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | | *op++ = LZO_BYTE(m_off << 2); | 194 | | #else | 195 | 5.32k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 5.32k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 5.32k | #endif | 198 | 5.32k | c->m1b_m++; | 199 | 5.32k | } | 200 | 245k | else if (m_off <= M3_MAX_OFFSET) | 201 | 198k | { | 202 | 198k | assert(m_len >= 3); | 203 | 198k | m_off -= 1; | 204 | 198k | if (m_len <= M3_MAX_LEN) | 205 | 149k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 49.4k | else | 207 | 49.4k | { | 208 | 49.4k | m_len -= M3_MAX_LEN; | 209 | 49.4k | *op++ = M3_MARKER | 0; | 210 | 72.8k | while (m_len > 255) | 211 | 23.4k | { | 212 | 23.4k | m_len -= 255; | 213 | 23.4k | *op++ = 0; | 214 | 23.4k | } | 215 | 49.4k | assert(m_len > 0); | 216 | 49.4k | *op++ = LZO_BYTE(m_len); | 217 | 49.4k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 198k | *op++ = LZO_BYTE(m_off << 2); | 223 | 198k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 198k | #endif | 225 | 198k | c->m3_m++; | 226 | 198k | } | 227 | 47.0k | else | 228 | 47.0k | { | 229 | 47.0k | lzo_uint k; | 230 | | | 231 | 47.0k | assert(m_len >= 3); | 232 | 47.0k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 47.0k | m_off -= 0x4000; | 234 | 47.0k | k = (m_off & 0x4000) >> 11; | 235 | 47.0k | if (m_len <= M4_MAX_LEN) | 236 | 28.4k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 18.5k | else | 238 | 18.5k | { | 239 | 18.5k | m_len -= M4_MAX_LEN; | 240 | 18.5k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 25.5k | while (m_len > 255) | 242 | 7.02k | { | 243 | 7.02k | m_len -= 255; | 244 | 7.02k | *op++ = 0; | 245 | 7.02k | } | 246 | 18.5k | assert(m_len > 0); | 247 | 18.5k | *op++ = LZO_BYTE(m_len); | 248 | 18.5k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 47.0k | *op++ = LZO_BYTE(m_off << 2); | 254 | 47.0k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 47.0k | #endif | 256 | 47.0k | c->m4_m++; | 257 | 47.0k | } | 258 | | | 259 | 802k | c->last_m_len = x_len; | 260 | 802k | c->last_m_off = x_off; | 261 | 802k | return op; | 262 | 802k | } |
Line | Count | Source | 108 | 875k | { | 109 | 875k | lzo_uint x_len = m_len; | 110 | 875k | lzo_uint x_off = m_off; | 111 | | | 112 | 875k | c->match_bytes += m_len; | 113 | | | 114 | | #if 0 | 115 | | /* | 116 | | static lzo_uint last_m_len = 0, last_m_off = 0; | 117 | | static lzo_uint prev_m_off[4]; | 118 | | static unsigned prev_m_off_ptr = 0; | 119 | | unsigned i; | 120 | | | 121 | | //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 122 | | if (m_len >= 3 && m_len <= M2_MAX_LEN) | 123 | | { | 124 | | //if (m_len == last_m_len && m_off == last_m_off) | 125 | | //printf("last_m_len + last_m_off\n"); | 126 | | //else | 127 | | if (m_off == last_m_off) | 128 | | printf("last_m_off\n"); | 129 | | else | 130 | | { | 131 | | for (i = 0; i < 4; i++) | 132 | | if (m_off == prev_m_off[i]) | 133 | | printf("prev_m_off %u: %5ld\n",i,(long)m_off); | 134 | | } | 135 | | } | 136 | | last_m_len = m_len; | 137 | | last_m_off = prev_m_off[prev_m_off_ptr] = m_off; | 138 | | prev_m_off_ptr = (prev_m_off_ptr + 1) & 3; | 139 | | */ | 140 | | #endif | 141 | | | 142 | 875k | assert(op > c->out); | 143 | 875k | if (m_len == 2) | 144 | 359k | { | 145 | 359k | assert(m_off <= M1_MAX_OFFSET); | 146 | 359k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 359k | m_off -= 1; | 148 | 359k | #if defined(LZO1Z) | 149 | 359k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | 359k | *op++ = LZO_BYTE(m_off << 2); | 151 | | #else | 152 | | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | | *op++ = LZO_BYTE(m_off >> 2); | 154 | | #endif | 155 | 359k | c->m1a_m++; | 156 | 359k | } | 157 | 515k | #if defined(LZO1Z) | 158 | 515k | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) | 159 | | #else | 160 | | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | | #endif | 162 | 259k | { | 163 | 259k | assert(m_len >= 3); | 164 | | #if defined(LZO1X) | 165 | | m_off -= 1; | 166 | | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | | *op++ = LZO_BYTE(m_off >> 3); | 168 | | assert(op[-2] >= M2_MARKER); | 169 | | #elif defined(LZO1Y) | 170 | | m_off -= 1; | 171 | | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | | *op++ = LZO_BYTE(m_off >> 2); | 173 | | assert(op[-2] >= M2_MARKER); | 174 | | #elif defined(LZO1Z) | 175 | 259k | if (m_off == c->last_m_off) | 176 | 14.6k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | 245k | else | 178 | 245k | { | 179 | 245k | m_off -= 1; | 180 | 245k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | 245k | *op++ = LZO_BYTE(m_off << 2); | 182 | 245k | } | 183 | 259k | #endif | 184 | 259k | c->m2_m++; | 185 | 259k | } | 186 | 255k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 4.16k | { | 188 | 4.16k | assert(m_len == 3); | 189 | 4.16k | assert(m_off > M2_MAX_OFFSET); | 190 | 4.16k | m_off -= 1 + M2_MAX_OFFSET; | 191 | 4.16k | #if defined(LZO1Z) | 192 | 4.16k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | 4.16k | *op++ = LZO_BYTE(m_off << 2); | 194 | | #else | 195 | | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | | *op++ = LZO_BYTE(m_off >> 2); | 197 | | #endif | 198 | 4.16k | c->m1b_m++; | 199 | 4.16k | } | 200 | 251k | else if (m_off <= M3_MAX_OFFSET) | 201 | 209k | { | 202 | 209k | assert(m_len >= 3); | 203 | 209k | m_off -= 1; | 204 | 209k | if (m_len <= M3_MAX_LEN) | 205 | 159k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 49.6k | else | 207 | 49.6k | { | 208 | 49.6k | m_len -= M3_MAX_LEN; | 209 | 49.6k | *op++ = M3_MARKER | 0; | 210 | 78.0k | while (m_len > 255) | 211 | 28.3k | { | 212 | 28.3k | m_len -= 255; | 213 | 28.3k | *op++ = 0; | 214 | 28.3k | } | 215 | 49.6k | assert(m_len > 0); | 216 | 49.6k | *op++ = LZO_BYTE(m_len); | 217 | 49.6k | } | 218 | 209k | #if defined(LZO1Z) | 219 | 209k | *op++ = LZO_BYTE(m_off >> 6); | 220 | 209k | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | | *op++ = LZO_BYTE(m_off << 2); | 223 | | *op++ = LZO_BYTE(m_off >> 6); | 224 | | #endif | 225 | 209k | c->m3_m++; | 226 | 209k | } | 227 | 41.7k | else | 228 | 41.7k | { | 229 | 41.7k | lzo_uint k; | 230 | | | 231 | 41.7k | assert(m_len >= 3); | 232 | 41.7k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 41.7k | m_off -= 0x4000; | 234 | 41.7k | k = (m_off & 0x4000) >> 11; | 235 | 41.7k | if (m_len <= M4_MAX_LEN) | 236 | 22.2k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 19.5k | else | 238 | 19.5k | { | 239 | 19.5k | m_len -= M4_MAX_LEN; | 240 | 19.5k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 28.0k | while (m_len > 255) | 242 | 8.51k | { | 243 | 8.51k | m_len -= 255; | 244 | 8.51k | *op++ = 0; | 245 | 8.51k | } | 246 | 19.5k | assert(m_len > 0); | 247 | 19.5k | *op++ = LZO_BYTE(m_len); | 248 | 19.5k | } | 249 | 41.7k | #if defined(LZO1Z) | 250 | 41.7k | *op++ = LZO_BYTE(m_off >> 6); | 251 | 41.7k | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | | *op++ = LZO_BYTE(m_off << 2); | 254 | | *op++ = LZO_BYTE(m_off >> 6); | 255 | | #endif | 256 | 41.7k | c->m4_m++; | 257 | 41.7k | } | 258 | | | 259 | 875k | c->last_m_len = x_len; | 260 | 875k | c->last_m_off = x_off; | 261 | 875k | return op; | 262 | 875k | } |
|
263 | | |
264 | | |
265 | | static lzo_bytep |
266 | | STORE_RUN ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, lzo_uint t ) |
267 | 1.74M | { |
268 | 1.74M | c->lit_bytes += t; |
269 | | |
270 | 1.74M | if (op == c->out && t <= 238) |
271 | 5.07k | { |
272 | 5.07k | *op++ = LZO_BYTE(17 + t); |
273 | 5.07k | } |
274 | 1.74M | else if (t <= 3) |
275 | 1.57M | { |
276 | | #if defined(LZO1Z) |
277 | 592k | op[-1] = LZO_BYTE(op[-1] | t); |
278 | | #else |
279 | 980k | op[-2] = LZO_BYTE(op[-2] | t); |
280 | | #endif |
281 | 1.57M | c->lit1_r++; |
282 | 1.57M | } |
283 | 169k | else if (t <= 18) |
284 | 101k | { |
285 | 101k | *op++ = LZO_BYTE(t - 3); |
286 | 101k | c->lit2_r++; |
287 | 101k | } |
288 | 67.6k | else |
289 | 67.6k | { |
290 | 67.6k | lzo_uint tt = t - 18; |
291 | | |
292 | 67.6k | *op++ = 0; |
293 | 232k | while (tt > 255) |
294 | 165k | { |
295 | 165k | tt -= 255; |
296 | 165k | *op++ = 0; |
297 | 165k | } |
298 | 67.6k | assert(tt > 0); |
299 | 67.6k | *op++ = LZO_BYTE(tt); |
300 | 67.6k | c->lit3_r++; |
301 | 67.6k | } |
302 | 49.5M | do *op++ = *ii++; while (--t > 0); |
303 | | |
304 | 1.74M | return op; |
305 | 1.74M | } Line | Count | Source | 267 | 513k | { | 268 | 513k | c->lit_bytes += t; | 269 | | | 270 | 513k | if (op == c->out && t <= 238) | 271 | 1.60k | { | 272 | 1.60k | *op++ = LZO_BYTE(17 + t); | 273 | 1.60k | } | 274 | 511k | else if (t <= 3) | 275 | 454k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 454k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 454k | #endif | 281 | 454k | c->lit1_r++; | 282 | 454k | } | 283 | 57.2k | else if (t <= 18) | 284 | 34.6k | { | 285 | 34.6k | *op++ = LZO_BYTE(t - 3); | 286 | 34.6k | c->lit2_r++; | 287 | 34.6k | } | 288 | 22.6k | else | 289 | 22.6k | { | 290 | 22.6k | lzo_uint tt = t - 18; | 291 | | | 292 | 22.6k | *op++ = 0; | 293 | 74.7k | while (tt > 255) | 294 | 52.1k | { | 295 | 52.1k | tt -= 255; | 296 | 52.1k | *op++ = 0; | 297 | 52.1k | } | 298 | 22.6k | assert(tt > 0); | 299 | 22.6k | *op++ = LZO_BYTE(tt); | 300 | 22.6k | c->lit3_r++; | 301 | 22.6k | } | 302 | 15.7M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 513k | return op; | 305 | 513k | } |
Line | Count | Source | 267 | 579k | { | 268 | 579k | c->lit_bytes += t; | 269 | | | 270 | 579k | if (op == c->out && t <= 238) | 271 | 1.57k | { | 272 | 1.57k | *op++ = LZO_BYTE(17 + t); | 273 | 1.57k | } | 274 | 578k | else if (t <= 3) | 275 | 526k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 526k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 526k | #endif | 281 | 526k | c->lit1_r++; | 282 | 526k | } | 283 | 51.7k | else if (t <= 18) | 284 | 31.5k | { | 285 | 31.5k | *op++ = LZO_BYTE(t - 3); | 286 | 31.5k | c->lit2_r++; | 287 | 31.5k | } | 288 | 20.1k | else | 289 | 20.1k | { | 290 | 20.1k | lzo_uint tt = t - 18; | 291 | | | 292 | 20.1k | *op++ = 0; | 293 | 74.5k | while (tt > 255) | 294 | 54.3k | { | 295 | 54.3k | tt -= 255; | 296 | 54.3k | *op++ = 0; | 297 | 54.3k | } | 298 | 20.1k | assert(tt > 0); | 299 | 20.1k | *op++ = LZO_BYTE(tt); | 300 | 20.1k | c->lit3_r++; | 301 | 20.1k | } | 302 | 16.1M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 579k | return op; | 305 | 579k | } |
Line | Count | Source | 267 | 654k | { | 268 | 654k | c->lit_bytes += t; | 269 | | | 270 | 654k | if (op == c->out && t <= 238) | 271 | 1.89k | { | 272 | 1.89k | *op++ = LZO_BYTE(17 + t); | 273 | 1.89k | } | 274 | 652k | else if (t <= 3) | 275 | 592k | { | 276 | 592k | #if defined(LZO1Z) | 277 | 592k | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | | op[-2] = LZO_BYTE(op[-2] | t); | 280 | | #endif | 281 | 592k | c->lit1_r++; | 282 | 592k | } | 283 | 60.0k | else if (t <= 18) | 284 | 35.1k | { | 285 | 35.1k | *op++ = LZO_BYTE(t - 3); | 286 | 35.1k | c->lit2_r++; | 287 | 35.1k | } | 288 | 24.8k | else | 289 | 24.8k | { | 290 | 24.8k | lzo_uint tt = t - 18; | 291 | | | 292 | 24.8k | *op++ = 0; | 293 | 83.4k | while (tt > 255) | 294 | 58.5k | { | 295 | 58.5k | tt -= 255; | 296 | 58.5k | *op++ = 0; | 297 | 58.5k | } | 298 | 24.8k | assert(tt > 0); | 299 | 24.8k | *op++ = LZO_BYTE(tt); | 300 | 24.8k | c->lit3_r++; | 301 | 24.8k | } | 302 | 17.6M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 654k | return op; | 305 | 654k | } |
|
306 | | |
307 | | |
308 | | static lzo_bytep |
309 | | code_run ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, |
310 | | lzo_uint lit, lzo_uint m_len ) |
311 | 2.38M | { |
312 | 2.38M | if (lit > 0) |
313 | 1.74M | { |
314 | 1.74M | assert(m_len >= 2); |
315 | 1.74M | op = STORE_RUN(c,op,ii,lit); |
316 | 1.74M | c->r1_m_len = m_len; |
317 | 1.74M | c->r1_lit = lit; |
318 | 1.74M | } |
319 | 640k | else |
320 | 640k | { |
321 | 640k | assert(m_len >= 3); |
322 | 640k | c->r1_m_len = 0; |
323 | 640k | c->r1_lit = 0; |
324 | 640k | } |
325 | | |
326 | 2.38M | return op; |
327 | 2.38M | } Line | Count | Source | 311 | 707k | { | 312 | 707k | if (lit > 0) | 313 | 512k | { | 314 | 512k | assert(m_len >= 2); | 315 | 512k | op = STORE_RUN(c,op,ii,lit); | 316 | 512k | c->r1_m_len = m_len; | 317 | 512k | c->r1_lit = lit; | 318 | 512k | } | 319 | 194k | else | 320 | 194k | { | 321 | 194k | assert(m_len >= 3); | 322 | 194k | c->r1_m_len = 0; | 323 | 194k | c->r1_lit = 0; | 324 | 194k | } | 325 | | | 326 | 707k | return op; | 327 | 707k | } |
Line | Count | Source | 311 | 802k | { | 312 | 802k | if (lit > 0) | 313 | 578k | { | 314 | 578k | assert(m_len >= 2); | 315 | 578k | op = STORE_RUN(c,op,ii,lit); | 316 | 578k | c->r1_m_len = m_len; | 317 | 578k | c->r1_lit = lit; | 318 | 578k | } | 319 | 223k | else | 320 | 223k | { | 321 | 223k | assert(m_len >= 3); | 322 | 223k | c->r1_m_len = 0; | 323 | 223k | c->r1_lit = 0; | 324 | 223k | } | 325 | | | 326 | 802k | return op; | 327 | 802k | } |
Line | Count | Source | 311 | 875k | { | 312 | 875k | if (lit > 0) | 313 | 653k | { | 314 | 653k | assert(m_len >= 2); | 315 | 653k | op = STORE_RUN(c,op,ii,lit); | 316 | 653k | c->r1_m_len = m_len; | 317 | 653k | c->r1_lit = lit; | 318 | 653k | } | 319 | 221k | else | 320 | 221k | { | 321 | 221k | assert(m_len >= 3); | 322 | 221k | c->r1_m_len = 0; | 323 | 221k | c->r1_lit = 0; | 324 | 221k | } | 325 | | | 326 | 875k | return op; | 327 | 875k | } |
|
328 | | |
329 | | |
330 | | /*********************************************************************** |
331 | | // |
332 | | ************************************************************************/ |
333 | | |
334 | | static lzo_uint |
335 | | len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit ) |
336 | 4.89M | { |
337 | 4.89M | lzo_uint n = 4; |
338 | | |
339 | 4.89M | if (m_len < 2) |
340 | 959k | return 0; |
341 | 3.93M | if (m_len == 2) |
342 | 1.56M | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; |
343 | 2.36M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
344 | 1.05M | return 2; |
345 | 1.30M | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) |
346 | 15.1k | return 2; |
347 | 1.29M | if (m_off <= M3_MAX_OFFSET) |
348 | 1.05M | { |
349 | 1.05M | if (m_len <= M3_MAX_LEN) |
350 | 844k | return 3; |
351 | 208k | m_len -= M3_MAX_LEN; |
352 | 212k | while (m_len > 255) |
353 | 4.41k | { |
354 | 4.41k | m_len -= 255; |
355 | 4.41k | n++; |
356 | 4.41k | } |
357 | 208k | return n; |
358 | 1.05M | } |
359 | 238k | if (m_off <= M4_MAX_OFFSET) |
360 | 238k | { |
361 | 238k | if (m_len <= M4_MAX_LEN) |
362 | 153k | return 3; |
363 | 85.3k | m_len -= M4_MAX_LEN; |
364 | 87.7k | while (m_len > 255) |
365 | 2.32k | { |
366 | 2.32k | m_len -= 255; |
367 | 2.32k | n++; |
368 | 2.32k | } |
369 | 85.3k | return n; |
370 | 238k | } |
371 | 0 | return 0; |
372 | 238k | } lzo1x_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.41M | { | 337 | 1.41M | lzo_uint n = 4; | 338 | | | 339 | 1.41M | if (m_len < 2) | 340 | 262k | return 0; | 341 | 1.15M | if (m_len == 2) | 342 | 400k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 754k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 339k | return 2; | 345 | 414k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 4.12k | return 2; | 347 | 410k | if (m_off <= M3_MAX_OFFSET) | 348 | 335k | { | 349 | 335k | if (m_len <= M3_MAX_LEN) | 350 | 267k | return 3; | 351 | 68.0k | m_len -= M3_MAX_LEN; | 352 | 69.5k | while (m_len > 255) | 353 | 1.46k | { | 354 | 1.46k | m_len -= 255; | 355 | 1.46k | n++; | 356 | 1.46k | } | 357 | 68.0k | return n; | 358 | 335k | } | 359 | 75.1k | if (m_off <= M4_MAX_OFFSET) | 360 | 75.1k | { | 361 | 75.1k | if (m_len <= M4_MAX_LEN) | 362 | 48.6k | return 3; | 363 | 26.5k | m_len -= M4_MAX_LEN; | 364 | 27.2k | while (m_len > 255) | 365 | 674 | { | 366 | 674 | m_len -= 255; | 367 | 674 | n++; | 368 | 674 | } | 369 | 26.5k | return n; | 370 | 75.1k | } | 371 | 0 | return 0; | 372 | 75.1k | } |
lzo1y_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.66M | { | 337 | 1.66M | lzo_uint n = 4; | 338 | | | 339 | 1.66M | if (m_len < 2) | 340 | 332k | return 0; | 341 | 1.33M | if (m_len == 2) | 342 | 554k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 782k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 339k | return 2; | 345 | 442k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 6.16k | return 2; | 347 | 436k | if (m_off <= M3_MAX_OFFSET) | 348 | 353k | { | 349 | 353k | if (m_len <= M3_MAX_LEN) | 350 | 279k | return 3; | 351 | 73.6k | m_len -= M3_MAX_LEN; | 352 | 75.1k | while (m_len > 255) | 353 | 1.50k | { | 354 | 1.50k | m_len -= 255; | 355 | 1.50k | n++; | 356 | 1.50k | } | 357 | 73.6k | return n; | 358 | 353k | } | 359 | 83.5k | if (m_off <= M4_MAX_OFFSET) | 360 | 83.5k | { | 361 | 83.5k | if (m_len <= M4_MAX_LEN) | 362 | 55.1k | return 3; | 363 | 28.4k | m_len -= M4_MAX_LEN; | 364 | 29.2k | while (m_len > 255) | 365 | 783 | { | 366 | 783 | m_len -= 255; | 367 | 783 | n++; | 368 | 783 | } | 369 | 28.4k | return n; | 370 | 83.5k | } | 371 | 0 | return 0; | 372 | 83.5k | } |
lzo1z_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.80M | { | 337 | 1.80M | lzo_uint n = 4; | 338 | | | 339 | 1.80M | if (m_len < 2) | 340 | 364k | return 0; | 341 | 1.44M | if (m_len == 2) | 342 | 612k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 830k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 380k | return 2; | 345 | 449k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 4.85k | return 2; | 347 | 444k | if (m_off <= M3_MAX_OFFSET) | 348 | 364k | { | 349 | 364k | if (m_len <= M3_MAX_LEN) | 350 | 298k | return 3; | 351 | 66.6k | m_len -= M3_MAX_LEN; | 352 | 68.0k | while (m_len > 255) | 353 | 1.43k | { | 354 | 1.43k | m_len -= 255; | 355 | 1.43k | n++; | 356 | 1.43k | } | 357 | 66.6k | return n; | 358 | 364k | } | 359 | 79.8k | if (m_off <= M4_MAX_OFFSET) | 360 | 79.8k | { | 361 | 79.8k | if (m_len <= M4_MAX_LEN) | 362 | 49.5k | return 3; | 363 | 30.3k | m_len -= M4_MAX_LEN; | 364 | 31.2k | while (m_len > 255) | 365 | 869 | { | 366 | 869 | m_len -= 255; | 367 | 869 | n++; | 368 | 869 | } | 369 | 30.3k | return n; | 370 | 79.8k | } | 371 | 0 | return 0; | 372 | 79.8k | } |
|
373 | | |
374 | | |
375 | | static lzo_uint |
376 | | min_gain(lzo_uint ahead, lzo_uint lit1, lzo_uint lit2, lzo_uint l1, lzo_uint l2, lzo_uint l3) |
377 | 1.08M | { |
378 | 1.08M | lzo_uint lazy_match_min_gain; |
379 | | |
380 | 1.08M | assert (ahead >= 1); |
381 | 1.08M | lazy_match_min_gain = ahead; |
382 | | |
383 | | #if 0 |
384 | | if (l3) |
385 | | lit2 -= ahead; |
386 | | #endif |
387 | | |
388 | 1.08M | if (lit1 <= 3) |
389 | 1.06M | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; |
390 | 18.7k | else if (lit1 <= 18) |
391 | 11.7k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; |
392 | | |
393 | 1.08M | lazy_match_min_gain += (l2 - l1) * 2; |
394 | 1.08M | if (l3) |
395 | 4.95k | lazy_match_min_gain -= (ahead - l3) * 2; |
396 | | |
397 | 1.08M | if ((lzo_int) lazy_match_min_gain < 0) |
398 | 43.7k | lazy_match_min_gain = 0; |
399 | | |
400 | | #if 0 |
401 | | if (l1 == 2) |
402 | | if (lazy_match_min_gain == 0) |
403 | | lazy_match_min_gain = 1; |
404 | | #endif |
405 | | |
406 | 1.08M | return lazy_match_min_gain; |
407 | 1.08M | } Line | Count | Source | 377 | 301k | { | 378 | 301k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 301k | assert (ahead >= 1); | 381 | 301k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 301k | if (lit1 <= 3) | 389 | 295k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 6.44k | else if (lit1 <= 18) | 391 | 3.95k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 301k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 301k | if (l3) | 395 | 1.71k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 301k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 13.8k | lazy_match_min_gain = 0; | 399 | | | 400 | | #if 0 | 401 | | if (l1 == 2) | 402 | | if (lazy_match_min_gain == 0) | 403 | | lazy_match_min_gain = 1; | 404 | | #endif | 405 | | | 406 | 301k | return lazy_match_min_gain; | 407 | 301k | } |
Line | Count | Source | 377 | 378k | { | 378 | 378k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 378k | assert (ahead >= 1); | 381 | 378k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 378k | if (lit1 <= 3) | 389 | 372k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 5.91k | else if (lit1 <= 18) | 391 | 3.84k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 378k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 378k | if (l3) | 395 | 1.41k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 378k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 15.6k | lazy_match_min_gain = 0; | 399 | | | 400 | | #if 0 | 401 | | if (l1 == 2) | 402 | | if (lazy_match_min_gain == 0) | 403 | | lazy_match_min_gain = 1; | 404 | | #endif | 405 | | | 406 | 378k | return lazy_match_min_gain; | 407 | 378k | } |
Line | Count | Source | 377 | 406k | { | 378 | 406k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 406k | assert (ahead >= 1); | 381 | 406k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 406k | if (lit1 <= 3) | 389 | 400k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 6.41k | else if (lit1 <= 18) | 391 | 3.97k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 406k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 406k | if (l3) | 395 | 1.82k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 406k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 14.2k | lazy_match_min_gain = 0; | 399 | | | 400 | | #if 0 | 401 | | if (l1 == 2) | 402 | | if (lazy_match_min_gain == 0) | 403 | | lazy_match_min_gain = 1; | 404 | | #endif | 405 | | | 406 | 406k | return lazy_match_min_gain; | 407 | 406k | } |
|
408 | | |
409 | | |
410 | | /*********************************************************************** |
411 | | // |
412 | | ************************************************************************/ |
413 | | |
414 | | #if !defined(NDEBUG) |
415 | | static |
416 | | void assert_match( const lzo_swd_p swd, lzo_uint m_len, lzo_uint m_off ) |
417 | | { |
418 | | const LZO_COMPRESS_T *c = swd->c; |
419 | | lzo_uint d_off; |
420 | | |
421 | | assert(m_len >= 2); |
422 | | if (m_off <= (lzo_uint) (c->bp - c->in)) |
423 | | { |
424 | | assert(c->bp - m_off + m_len < c->ip); |
425 | | assert(lzo_memcmp(c->bp, c->bp - m_off, m_len) == 0); |
426 | | } |
427 | | else |
428 | | { |
429 | | assert(swd->dict != NULL); |
430 | | d_off = m_off - (lzo_uint) (c->bp - c->in); |
431 | | assert(d_off <= swd->dict_len); |
432 | | if (m_len > d_off) |
433 | | { |
434 | | assert(lzo_memcmp(c->bp, swd->dict_end - d_off, d_off) == 0); |
435 | | assert(c->in + m_len - d_off < c->ip); |
436 | | assert(lzo_memcmp(c->bp + d_off, c->in, m_len - d_off) == 0); |
437 | | } |
438 | | else |
439 | | { |
440 | | assert(lzo_memcmp(c->bp, swd->dict_end - d_off, m_len) == 0); |
441 | | } |
442 | | } |
443 | | } |
444 | | #else |
445 | 3.14M | # define assert_match(a,b,c) ((void)0) |
446 | | #endif |
447 | | |
448 | | |
449 | | #if defined(SWD_BEST_OFF) |
450 | | |
451 | | static void |
452 | | better_match ( const lzo_swd_p swd, lzo_uint *m_len, lzo_uint *m_off ) |
453 | 3.85M | { |
454 | | #if defined(LZO1Z) |
455 | | const LZO_COMPRESS_T *c = swd->c; |
456 | | #endif |
457 | | |
458 | 3.85M | if (*m_len <= M2_MIN_LEN) |
459 | 1.97M | return; |
460 | | #if defined(LZO1Z) |
461 | 661k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) |
462 | 10.2k | return; |
463 | 651k | #if 1 |
464 | 651k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
465 | 651k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) |
466 | 1.17k | { |
467 | 1.17k | *m_len = *m_len - 1; |
468 | 1.17k | *m_off = swd->best_off[*m_len]; |
469 | 1.17k | return; |
470 | 1.17k | } |
471 | 650k | #endif |
472 | 650k | #endif |
473 | | |
474 | 1.86M | if (*m_off <= M2_MAX_OFFSET) |
475 | 1.08M | return; |
476 | | |
477 | 781k | #if 1 |
478 | | /* M3/M4 -> M2 */ |
479 | 781k | if (*m_off > M2_MAX_OFFSET && |
480 | 781k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
481 | 781k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) |
482 | 47.0k | { |
483 | 47.0k | *m_len = *m_len - 1; |
484 | 47.0k | *m_off = swd->best_off[*m_len]; |
485 | 47.0k | return; |
486 | 47.0k | } |
487 | 734k | #endif |
488 | | |
489 | 734k | #if 1 |
490 | | /* M4 -> M2 */ |
491 | 734k | if (*m_off > M3_MAX_OFFSET && |
492 | 734k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && |
493 | 734k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) |
494 | 3.00k | { |
495 | 3.00k | *m_len = *m_len - 2; |
496 | 3.00k | *m_off = swd->best_off[*m_len]; |
497 | 3.00k | return; |
498 | 3.00k | } |
499 | 731k | #endif |
500 | | |
501 | 731k | #if 1 |
502 | | /* M4 -> M3 */ |
503 | 731k | if (*m_off > M3_MAX_OFFSET && |
504 | 731k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && |
505 | 731k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) |
506 | 5.39k | { |
507 | 5.39k | *m_len = *m_len - 1; |
508 | 5.39k | *m_off = swd->best_off[*m_len]; |
509 | 5.39k | } |
510 | 731k | #endif |
511 | 731k | } Line | Count | Source | 453 | 1.13M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.13M | if (*m_len <= M2_MIN_LEN) | 459 | 545k | return; | 460 | | #if defined(LZO1Z) | 461 | | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | | return; | 463 | | #if 1 | 464 | | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | | { | 467 | | *m_len = *m_len - 1; | 468 | | *m_off = swd->best_off[*m_len]; | 469 | | return; | 470 | | } | 471 | | #endif | 472 | | #endif | 473 | | | 474 | 586k | if (*m_off <= M2_MAX_OFFSET) | 475 | 361k | return; | 476 | | | 477 | 225k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 225k | if (*m_off > M2_MAX_OFFSET && | 480 | 225k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 225k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 14.6k | { | 483 | 14.6k | *m_len = *m_len - 1; | 484 | 14.6k | *m_off = swd->best_off[*m_len]; | 485 | 14.6k | return; | 486 | 14.6k | } | 487 | 210k | #endif | 488 | | | 489 | 210k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 210k | if (*m_off > M3_MAX_OFFSET && | 492 | 210k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 210k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 915 | { | 495 | 915 | *m_len = *m_len - 2; | 496 | 915 | *m_off = swd->best_off[*m_len]; | 497 | 915 | return; | 498 | 915 | } | 499 | 209k | #endif | 500 | | | 501 | 209k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 209k | if (*m_off > M3_MAX_OFFSET && | 504 | 209k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 209k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 1.77k | { | 507 | 1.77k | *m_len = *m_len - 1; | 508 | 1.77k | *m_off = swd->best_off[*m_len]; | 509 | 1.77k | } | 510 | 209k | #endif | 511 | 209k | } |
Line | Count | Source | 453 | 1.30M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.30M | if (*m_len <= M2_MIN_LEN) | 459 | 677k | return; | 460 | | #if defined(LZO1Z) | 461 | | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | | return; | 463 | | #if 1 | 464 | | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | | { | 467 | | *m_len = *m_len - 1; | 468 | | *m_off = swd->best_off[*m_len]; | 469 | | return; | 470 | | } | 471 | | #endif | 472 | | #endif | 473 | | | 474 | 629k | if (*m_off <= M2_MAX_OFFSET) | 475 | 328k | return; | 476 | | | 477 | 301k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 301k | if (*m_off > M2_MAX_OFFSET && | 480 | 301k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 301k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 15.0k | { | 483 | 15.0k | *m_len = *m_len - 1; | 484 | 15.0k | *m_off = swd->best_off[*m_len]; | 485 | 15.0k | return; | 486 | 15.0k | } | 487 | 286k | #endif | 488 | | | 489 | 286k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 286k | if (*m_off > M3_MAX_OFFSET && | 492 | 286k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 286k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.23k | { | 495 | 1.23k | *m_len = *m_len - 2; | 496 | 1.23k | *m_off = swd->best_off[*m_len]; | 497 | 1.23k | return; | 498 | 1.23k | } | 499 | 285k | #endif | 500 | | | 501 | 285k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 285k | if (*m_off > M3_MAX_OFFSET && | 504 | 285k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 285k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 1.53k | { | 507 | 1.53k | *m_len = *m_len - 1; | 508 | 1.53k | *m_off = swd->best_off[*m_len]; | 509 | 1.53k | } | 510 | 285k | #endif | 511 | 285k | } |
Line | Count | Source | 453 | 1.41M | { | 454 | 1.41M | #if defined(LZO1Z) | 455 | 1.41M | const LZO_COMPRESS_T *c = swd->c; | 456 | 1.41M | #endif | 457 | | | 458 | 1.41M | if (*m_len <= M2_MIN_LEN) | 459 | 756k | return; | 460 | 661k | #if defined(LZO1Z) | 461 | 661k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | 10.2k | return; | 463 | 651k | #if 1 | 464 | 651k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | 651k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | 1.17k | { | 467 | 1.17k | *m_len = *m_len - 1; | 468 | 1.17k | *m_off = swd->best_off[*m_len]; | 469 | 1.17k | return; | 470 | 1.17k | } | 471 | 650k | #endif | 472 | 650k | #endif | 473 | | | 474 | 650k | if (*m_off <= M2_MAX_OFFSET) | 475 | 395k | return; | 476 | | | 477 | 255k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 255k | if (*m_off > M2_MAX_OFFSET && | 480 | 255k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 255k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 17.3k | { | 483 | 17.3k | *m_len = *m_len - 1; | 484 | 17.3k | *m_off = swd->best_off[*m_len]; | 485 | 17.3k | return; | 486 | 17.3k | } | 487 | 237k | #endif | 488 | | | 489 | 237k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 237k | if (*m_off > M3_MAX_OFFSET && | 492 | 237k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 237k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 860 | { | 495 | 860 | *m_len = *m_len - 2; | 496 | 860 | *m_off = swd->best_off[*m_len]; | 497 | 860 | return; | 498 | 860 | } | 499 | 237k | #endif | 500 | | | 501 | 237k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 237k | if (*m_off > M3_MAX_OFFSET && | 504 | 237k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 237k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 2.07k | { | 507 | 2.07k | *m_len = *m_len - 1; | 508 | 2.07k | *m_off = swd->best_off[*m_len]; | 509 | 2.07k | } | 510 | 237k | #endif | 511 | 237k | } |
|
512 | | |
513 | | #endif |
514 | | |
515 | | |
516 | | /*********************************************************************** |
517 | | // |
518 | | ************************************************************************/ |
519 | | |
520 | | LZO_PUBLIC(int) |
521 | | lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint in_len, |
522 | | lzo_bytep out, lzo_uintp out_len, |
523 | | lzo_voidp wrkmem, |
524 | | const lzo_bytep dict, lzo_uint dict_len, |
525 | | lzo_callback_p cb, |
526 | | int try_lazy_parm, |
527 | | lzo_uint good_length, |
528 | | lzo_uint max_lazy, |
529 | | lzo_uint nice_length, |
530 | | lzo_uint max_chain, |
531 | | lzo_uint32_t flags ) |
532 | 5.30k | { |
533 | 5.30k | lzo_bytep op; |
534 | 5.30k | const lzo_bytep ii; |
535 | 5.30k | lzo_uint lit; |
536 | 5.30k | lzo_uint m_len, m_off; |
537 | 5.30k | LZO_COMPRESS_T cc; |
538 | 5.30k | LZO_COMPRESS_T * const c = &cc; |
539 | 5.30k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; |
540 | 5.30k | lzo_uint try_lazy; |
541 | 5.30k | int r; |
542 | | |
543 | | /* sanity check */ |
544 | | #if defined(LZO1X) |
545 | 1.68k | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
546 | | #elif defined(LZO1Y) |
547 | 1.65k | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
548 | | #elif defined(LZO1Z) |
549 | 1.96k | LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
550 | | #else |
551 | | # error |
552 | | #endif |
553 | | |
554 | | /* setup parameter defaults */ |
555 | | /* number of lazy match tries */ |
556 | 5.30k | try_lazy = (lzo_uint) try_lazy_parm; |
557 | 5.30k | if (try_lazy_parm < 0) |
558 | 0 | try_lazy = 1; |
559 | | /* reduce lazy match search if we already have a match with this length */ |
560 | 5.30k | if (good_length == 0) |
561 | 0 | good_length = 32; |
562 | | /* do not try a lazy match if we already have a match with this length */ |
563 | 5.30k | if (max_lazy == 0) |
564 | 0 | max_lazy = 32; |
565 | | /* stop searching for longer matches than this one */ |
566 | 5.30k | if (nice_length == 0) |
567 | 5.30k | nice_length = 0; |
568 | | /* don't search more positions than this */ |
569 | 5.30k | if (max_chain == 0) |
570 | 0 | max_chain = SWD_MAX_CHAIN; |
571 | | |
572 | 5.30k | c->init = 0; |
573 | 5.30k | c->ip = c->in = in; |
574 | 5.30k | c->in_end = in + in_len; |
575 | 5.30k | c->out = out; |
576 | 5.30k | c->cb = cb; |
577 | 5.30k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; |
578 | 5.30k | c->lit1_r = c->lit2_r = c->lit3_r = 0; |
579 | | |
580 | 5.30k | op = out; |
581 | 5.30k | ii = c->ip; /* point to start of literal run */ |
582 | 5.30k | lit = 0; |
583 | 5.30k | c->r1_lit = c->r1_m_len = 0; |
584 | | |
585 | 5.30k | r = init_match(c,swd,dict,dict_len,flags); |
586 | 5.30k | if (r != 0) |
587 | 0 | return r; |
588 | 5.30k | if (max_chain > 0) |
589 | 5.30k | swd->max_chain = max_chain; |
590 | 5.30k | if (nice_length > 0) |
591 | 0 | swd->nice_length = nice_length; |
592 | | |
593 | 5.30k | r = find_match(c,swd,0,0); |
594 | 5.30k | if (r != 0) |
595 | 0 | return r; |
596 | 51.9M | while (c->look > 0) |
597 | 51.9M | { |
598 | 51.9M | lzo_uint ahead; |
599 | 51.9M | lzo_uint max_ahead; |
600 | 51.9M | lzo_uint l1, l2, l3; |
601 | | |
602 | 51.9M | c->codesize = pd(op, out); |
603 | | |
604 | 51.9M | m_len = c->m_len; |
605 | 51.9M | m_off = c->m_off; |
606 | | |
607 | 51.9M | assert(c->bp == c->ip - c->look); |
608 | 51.9M | assert(c->bp >= in); |
609 | 51.9M | if (lit == 0) |
610 | 2.38M | ii = c->bp; |
611 | 51.9M | assert(ii + lit == c->bp); |
612 | 51.9M | assert(swd->b_char == *(c->bp)); |
613 | | |
614 | 51.9M | if ( m_len < 2 || |
615 | 51.9M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || |
616 | 51.9M | #if 1 |
617 | | /* Do not accept this match for compressed-data compatibility |
618 | | * with LZO v1.01 and before |
619 | | * [ might be a problem for decompress() and optimize() ] |
620 | | */ |
621 | 51.9M | (m_len == 2 && op == out) || |
622 | 51.9M | #endif |
623 | 51.9M | (op == out && lit == 0)) |
624 | 49.0M | { |
625 | | /* a literal */ |
626 | 49.0M | m_len = 0; |
627 | 49.0M | } |
628 | 2.90M | else if (m_len == M2_MIN_LEN) |
629 | 591k | { |
630 | | /* compression ratio improves if we code a literal in some cases */ |
631 | 591k | if (m_off > MX_MAX_OFFSET && lit >= 4) |
632 | 141k | m_len = 0; |
633 | 591k | } |
634 | | |
635 | 51.9M | if (m_len == 0) |
636 | 49.1M | { |
637 | | /* a literal */ |
638 | 49.1M | lit++; |
639 | 49.1M | swd->max_chain = max_chain; |
640 | 49.1M | r = find_match(c,swd,1,0); |
641 | 49.1M | assert(r == 0); LZO_UNUSED(r); |
642 | 49.1M | continue; |
643 | 49.1M | } |
644 | | |
645 | | /* a match */ |
646 | 2.76M | #if defined(SWD_BEST_OFF) |
647 | 2.76M | if (swd->use_best_off) |
648 | 2.76M | better_match(swd,&m_len,&m_off); |
649 | 2.76M | #endif |
650 | 2.76M | assert_match(swd,m_len,m_off); |
651 | | |
652 | | |
653 | | /* shall we try a lazy match ? */ |
654 | 2.76M | ahead = 0; |
655 | 2.76M | if (try_lazy == 0 || m_len >= max_lazy) |
656 | 50.0k | { |
657 | | /* no */ |
658 | 50.0k | l1 = 0; |
659 | 50.0k | max_ahead = 0; |
660 | 50.0k | } |
661 | 2.71M | else |
662 | 2.71M | { |
663 | | /* yes, try a lazy match */ |
664 | 2.71M | l1 = len_of_coded_match(m_len,m_off,lit); |
665 | 2.71M | assert(l1 > 0); |
666 | 2.71M | #if 1 |
667 | 2.71M | max_ahead = LZO_MIN(try_lazy, l1 - 1); |
668 | | #else |
669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); |
670 | | #endif |
671 | 2.71M | } |
672 | | |
673 | | |
674 | 5.83M | while (ahead < max_ahead && c->look > m_len) |
675 | 3.45M | { |
676 | 3.45M | lzo_uint lazy_match_min_gain; |
677 | | |
678 | 3.45M | if (m_len >= good_length) |
679 | 283k | swd->max_chain = max_chain >> 2; |
680 | 3.16M | else |
681 | 3.16M | swd->max_chain = max_chain; |
682 | 3.45M | r = find_match(c,swd,1,0); |
683 | 3.45M | ahead++; |
684 | | |
685 | 3.45M | assert(r == 0); LZO_UNUSED(r); |
686 | 3.45M | assert(c->look > 0); |
687 | 3.45M | assert(ii + lit + ahead == c->bp); |
688 | | |
689 | | #if defined(LZO1Z) |
690 | 1.24M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) |
691 | 308k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) |
692 | 3.68k | c->m_len = 0; |
693 | | #endif |
694 | 3.45M | if (c->m_len < m_len) |
695 | 2.15M | continue; |
696 | 1.29M | #if 1 |
697 | 1.29M | if (c->m_len == m_len && c->m_off >= m_off) |
698 | 198k | continue; |
699 | 1.09M | #endif |
700 | 1.09M | #if defined(SWD_BEST_OFF) |
701 | 1.09M | if (swd->use_best_off) |
702 | 1.09M | better_match(swd,&c->m_len,&c->m_off); |
703 | 1.09M | #endif |
704 | 1.09M | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); |
705 | 1.09M | if (l2 == 0) |
706 | 6.43k | continue; |
707 | | #if 0 |
708 | | if (c->m_len == m_len && l2 >= l1) |
709 | | continue; |
710 | | #endif |
711 | | |
712 | | |
713 | 1.08M | #if 1 |
714 | | /* compressed-data compatibility [see above] */ |
715 | 1.08M | l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit); |
716 | | #else |
717 | | l3 = len_of_coded_match(ahead,m_off,lit); |
718 | | #endif |
719 | | |
720 | 1.08M | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); |
721 | 1.08M | if (c->m_len >= m_len + lazy_match_min_gain) |
722 | 382k | { |
723 | 382k | c->lazy++; |
724 | 382k | assert_match(swd,c->m_len,c->m_off); |
725 | | |
726 | 382k | if (l3) |
727 | 2.76k | { |
728 | | /* code previous run */ |
729 | 2.76k | op = code_run(c,op,ii,lit,ahead); |
730 | 2.76k | lit = 0; |
731 | | /* code shortened match */ |
732 | 2.76k | op = code_match(c,op,ahead,m_off); |
733 | 2.76k | } |
734 | 379k | else |
735 | 379k | { |
736 | 379k | lit += ahead; |
737 | 379k | assert(ii + lit == c->bp); |
738 | 379k | } |
739 | 382k | goto lazy_match_done; |
740 | 382k | } |
741 | 1.08M | } |
742 | | |
743 | | |
744 | 2.38M | assert(ii + lit + ahead == c->bp); |
745 | | |
746 | | /* 1 - code run */ |
747 | 2.38M | op = code_run(c,op,ii,lit,m_len); |
748 | 2.38M | lit = 0; |
749 | | |
750 | | /* 2 - code match */ |
751 | 2.38M | op = code_match(c,op,m_len,m_off); |
752 | 2.38M | swd->max_chain = max_chain; |
753 | 2.38M | r = find_match(c,swd,m_len,1+ahead); |
754 | 2.38M | assert(r == 0); LZO_UNUSED(r); |
755 | | |
756 | 2.76M | lazy_match_done: ; |
757 | 2.76M | } |
758 | | |
759 | | |
760 | | /* store final run */ |
761 | 5.30k | if (lit > 0) |
762 | 3.15k | op = STORE_RUN(c,op,ii,lit); |
763 | | |
764 | 5.30k | #if defined(LZO_EOF_CODE) |
765 | 5.30k | *op++ = M4_MARKER | 1; |
766 | 5.30k | *op++ = 0; |
767 | 5.30k | *op++ = 0; |
768 | 5.30k | #endif |
769 | | |
770 | 5.30k | c->codesize = pd(op, out); |
771 | 5.30k | assert(c->textsize == in_len); |
772 | | |
773 | 5.30k | *out_len = pd(op, out); |
774 | | |
775 | 5.30k | if (c->cb && c->cb->nprogress) |
776 | 0 | (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0); |
777 | | |
778 | | #if 0 |
779 | | printf("%ld %ld -> %ld %ld: %ld %ld %ld %ld %ld %ld: %ld %ld %ld %ld\n", |
780 | | (long) c->textsize, (long) in_len, (long) c->codesize, |
781 | | c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m, |
782 | | c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy); |
783 | | #endif |
784 | 5.30k | assert(c->lit_bytes + c->match_bytes == in_len); |
785 | | |
786 | 5.30k | return LZO_E_OK; |
787 | 5.30k | } lzo1x_999_compress_internal Line | Count | Source | 532 | 1.68k | { | 533 | 1.68k | lzo_bytep op; | 534 | 1.68k | const lzo_bytep ii; | 535 | 1.68k | lzo_uint lit; | 536 | 1.68k | lzo_uint m_len, m_off; | 537 | 1.68k | LZO_COMPRESS_T cc; | 538 | 1.68k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.68k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.68k | lzo_uint try_lazy; | 541 | 1.68k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | 1.68k | #if defined(LZO1X) | 545 | 1.68k | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 546 | | #elif defined(LZO1Y) | 547 | | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 548 | | #elif defined(LZO1Z) | 549 | | LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 550 | | #else | 551 | | # error | 552 | | #endif | 553 | | | 554 | | /* setup parameter defaults */ | 555 | | /* number of lazy match tries */ | 556 | 1.68k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.68k | if (try_lazy_parm < 0) | 558 | 0 | try_lazy = 1; | 559 | | /* reduce lazy match search if we already have a match with this length */ | 560 | 1.68k | if (good_length == 0) | 561 | 0 | good_length = 32; | 562 | | /* do not try a lazy match if we already have a match with this length */ | 563 | 1.68k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.68k | if (nice_length == 0) | 567 | 1.68k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.68k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.68k | c->init = 0; | 573 | 1.68k | c->ip = c->in = in; | 574 | 1.68k | c->in_end = in + in_len; | 575 | 1.68k | c->out = out; | 576 | 1.68k | c->cb = cb; | 577 | 1.68k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.68k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.68k | op = out; | 581 | 1.68k | ii = c->ip; /* point to start of literal run */ | 582 | 1.68k | lit = 0; | 583 | 1.68k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.68k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.68k | if (r != 0) | 587 | 0 | return r; | 588 | 1.68k | if (max_chain > 0) | 589 | 1.68k | swd->max_chain = max_chain; | 590 | 1.68k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.68k | r = find_match(c,swd,0,0); | 594 | 1.68k | if (r != 0) | 595 | 0 | return r; | 596 | 16.4M | while (c->look > 0) | 597 | 16.4M | { | 598 | 16.4M | lzo_uint ahead; | 599 | 16.4M | lzo_uint max_ahead; | 600 | 16.4M | lzo_uint l1, l2, l3; | 601 | | | 602 | 16.4M | c->codesize = pd(op, out); | 603 | | | 604 | 16.4M | m_len = c->m_len; | 605 | 16.4M | m_off = c->m_off; | 606 | | | 607 | 16.4M | assert(c->bp == c->ip - c->look); | 608 | 16.4M | assert(c->bp >= in); | 609 | 16.4M | if (lit == 0) | 610 | 708k | ii = c->bp; | 611 | 16.4M | assert(ii + lit == c->bp); | 612 | 16.4M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 16.4M | if ( m_len < 2 || | 615 | 16.4M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 16.4M | #if 1 | 617 | | /* Do not accept this match for compressed-data compatibility | 618 | | * with LZO v1.01 and before | 619 | | * [ might be a problem for decompress() and optimize() ] | 620 | | */ | 621 | 16.4M | (m_len == 2 && op == out) || | 622 | 16.4M | #endif | 623 | 16.4M | (op == out && lit == 0)) | 624 | 15.5M | { | 625 | | /* a literal */ | 626 | 15.5M | m_len = 0; | 627 | 15.5M | } | 628 | 871k | else if (m_len == M2_MIN_LEN) | 629 | 195k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 195k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 43.7k | m_len = 0; | 633 | 195k | } | 634 | | | 635 | 16.4M | if (m_len == 0) | 636 | 15.5M | { | 637 | | /* a literal */ | 638 | 15.5M | lit++; | 639 | 15.5M | swd->max_chain = max_chain; | 640 | 15.5M | r = find_match(c,swd,1,0); | 641 | 15.5M | assert(r == 0); LZO_UNUSED(r); | 642 | 15.5M | continue; | 643 | 15.5M | } | 644 | | | 645 | | /* a match */ | 646 | 828k | #if defined(SWD_BEST_OFF) | 647 | 828k | if (swd->use_best_off) | 648 | 828k | better_match(swd,&m_len,&m_off); | 649 | 828k | #endif | 650 | 828k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 828k | ahead = 0; | 655 | 828k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 16.2k | { | 657 | | /* no */ | 658 | 16.2k | l1 = 0; | 659 | 16.2k | max_ahead = 0; | 660 | 16.2k | } | 661 | 812k | else | 662 | 812k | { | 663 | | /* yes, try a lazy match */ | 664 | 812k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 812k | assert(l1 > 0); | 666 | 812k | #if 1 | 667 | 812k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 812k | } | 672 | | | 673 | | | 674 | 1.75M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.04M | { | 676 | 1.04M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.04M | if (m_len >= good_length) | 679 | 91.7k | swd->max_chain = max_chain >> 2; | 680 | 953k | else | 681 | 953k | swd->max_chain = max_chain; | 682 | 1.04M | r = find_match(c,swd,1,0); | 683 | 1.04M | ahead++; | 684 | | | 685 | 1.04M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.04M | assert(c->look > 0); | 687 | 1.04M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | | #if defined(LZO1Z) | 690 | | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | | c->m_len = 0; | 693 | | #endif | 694 | 1.04M | if (c->m_len < m_len) | 695 | 673k | continue; | 696 | 371k | #if 1 | 697 | 371k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 67.5k | continue; | 699 | 303k | #endif | 700 | 303k | #if defined(SWD_BEST_OFF) | 701 | 303k | if (swd->use_best_off) | 702 | 303k | better_match(swd,&c->m_len,&c->m_off); | 703 | 303k | #endif | 704 | 303k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 303k | if (l2 == 0) | 706 | 2.04k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 301k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 301k | l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit); | 716 | | #else | 717 | | l3 = len_of_coded_match(ahead,m_off,lit); | 718 | | #endif | 719 | | | 720 | 301k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 301k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 122k | { | 723 | 122k | c->lazy++; | 724 | 122k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 122k | if (l3) | 727 | 1.04k | { | 728 | | /* code previous run */ | 729 | 1.04k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.04k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.04k | op = code_match(c,op,ahead,m_off); | 733 | 1.04k | } | 734 | 120k | else | 735 | 120k | { | 736 | 120k | lit += ahead; | 737 | 120k | assert(ii + lit == c->bp); | 738 | 120k | } | 739 | 122k | goto lazy_match_done; | 740 | 122k | } | 741 | 301k | } | 742 | | | 743 | | | 744 | 706k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 706k | op = code_run(c,op,ii,lit,m_len); | 748 | 706k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 706k | op = code_match(c,op,m_len,m_off); | 752 | 706k | swd->max_chain = max_chain; | 753 | 706k | r = find_match(c,swd,m_len,1+ahead); | 754 | 706k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 828k | lazy_match_done: ; | 757 | 828k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.68k | if (lit > 0) | 762 | 1.01k | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.68k | #if defined(LZO_EOF_CODE) | 765 | 1.68k | *op++ = M4_MARKER | 1; | 766 | 1.68k | *op++ = 0; | 767 | 1.68k | *op++ = 0; | 768 | 1.68k | #endif | 769 | | | 770 | 1.68k | c->codesize = pd(op, out); | 771 | 1.68k | assert(c->textsize == in_len); | 772 | | | 773 | 1.68k | *out_len = pd(op, out); | 774 | | | 775 | 1.68k | if (c->cb && c->cb->nprogress) | 776 | 0 | (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0); | 777 | | | 778 | | #if 0 | 779 | | printf("%ld %ld -> %ld %ld: %ld %ld %ld %ld %ld %ld: %ld %ld %ld %ld\n", | 780 | | (long) c->textsize, (long) in_len, (long) c->codesize, | 781 | | c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m, | 782 | | c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy); | 783 | | #endif | 784 | 1.68k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.68k | return LZO_E_OK; | 787 | 1.68k | } |
lzo1y_999_compress_internal Line | Count | Source | 532 | 1.65k | { | 533 | 1.65k | lzo_bytep op; | 534 | 1.65k | const lzo_bytep ii; | 535 | 1.65k | lzo_uint lit; | 536 | 1.65k | lzo_uint m_len, m_off; | 537 | 1.65k | LZO_COMPRESS_T cc; | 538 | 1.65k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.65k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.65k | lzo_uint try_lazy; | 541 | 1.65k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | | #if defined(LZO1X) | 545 | | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 546 | | #elif defined(LZO1Y) | 547 | 1.65k | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 548 | | #elif defined(LZO1Z) | 549 | | LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 550 | | #else | 551 | | # error | 552 | | #endif | 553 | | | 554 | | /* setup parameter defaults */ | 555 | | /* number of lazy match tries */ | 556 | 1.65k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.65k | if (try_lazy_parm < 0) | 558 | 0 | try_lazy = 1; | 559 | | /* reduce lazy match search if we already have a match with this length */ | 560 | 1.65k | if (good_length == 0) | 561 | 0 | good_length = 32; | 562 | | /* do not try a lazy match if we already have a match with this length */ | 563 | 1.65k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.65k | if (nice_length == 0) | 567 | 1.65k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.65k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.65k | c->init = 0; | 573 | 1.65k | c->ip = c->in = in; | 574 | 1.65k | c->in_end = in + in_len; | 575 | 1.65k | c->out = out; | 576 | 1.65k | c->cb = cb; | 577 | 1.65k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.65k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.65k | op = out; | 581 | 1.65k | ii = c->ip; /* point to start of literal run */ | 582 | 1.65k | lit = 0; | 583 | 1.65k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.65k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.65k | if (r != 0) | 587 | 0 | return r; | 588 | 1.65k | if (max_chain > 0) | 589 | 1.65k | swd->max_chain = max_chain; | 590 | 1.65k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.65k | r = find_match(c,swd,0,0); | 594 | 1.65k | if (r != 0) | 595 | 0 | return r; | 596 | 16.9M | while (c->look > 0) | 597 | 16.9M | { | 598 | 16.9M | lzo_uint ahead; | 599 | 16.9M | lzo_uint max_ahead; | 600 | 16.9M | lzo_uint l1, l2, l3; | 601 | | | 602 | 16.9M | c->codesize = pd(op, out); | 603 | | | 604 | 16.9M | m_len = c->m_len; | 605 | 16.9M | m_off = c->m_off; | 606 | | | 607 | 16.9M | assert(c->bp == c->ip - c->look); | 608 | 16.9M | assert(c->bp >= in); | 609 | 16.9M | if (lit == 0) | 610 | 803k | ii = c->bp; | 611 | 16.9M | assert(ii + lit == c->bp); | 612 | 16.9M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 16.9M | if ( m_len < 2 || | 615 | 16.9M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 16.9M | #if 1 | 617 | | /* Do not accept this match for compressed-data compatibility | 618 | | * with LZO v1.01 and before | 619 | | * [ might be a problem for decompress() and optimize() ] | 620 | | */ | 621 | 16.9M | (m_len == 2 && op == out) || | 622 | 16.9M | #endif | 623 | 16.9M | (op == out && lit == 0)) | 624 | 15.9M | { | 625 | | /* a literal */ | 626 | 15.9M | m_len = 0; | 627 | 15.9M | } | 628 | 973k | else if (m_len == M2_MIN_LEN) | 629 | 190k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 190k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 47.1k | m_len = 0; | 633 | 190k | } | 634 | | | 635 | 16.9M | if (m_len == 0) | 636 | 16.0M | { | 637 | | /* a literal */ | 638 | 16.0M | lit++; | 639 | 16.0M | swd->max_chain = max_chain; | 640 | 16.0M | r = find_match(c,swd,1,0); | 641 | 16.0M | assert(r == 0); LZO_UNUSED(r); | 642 | 16.0M | continue; | 643 | 16.0M | } | 644 | | | 645 | | /* a match */ | 646 | 926k | #if defined(SWD_BEST_OFF) | 647 | 926k | if (swd->use_best_off) | 648 | 926k | better_match(swd,&m_len,&m_off); | 649 | 926k | #endif | 650 | 926k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 926k | ahead = 0; | 655 | 926k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 16.2k | { | 657 | | /* no */ | 658 | 16.2k | l1 = 0; | 659 | 16.2k | max_ahead = 0; | 660 | 16.2k | } | 661 | 910k | else | 662 | 910k | { | 663 | | /* yes, try a lazy match */ | 664 | 910k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 910k | assert(l1 > 0); | 666 | 910k | #if 1 | 667 | 910k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 910k | } | 672 | | | 673 | | | 674 | 1.96M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.15M | { | 676 | 1.15M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.15M | if (m_len >= good_length) | 679 | 98.2k | swd->max_chain = max_chain >> 2; | 680 | 1.06M | else | 681 | 1.06M | swd->max_chain = max_chain; | 682 | 1.15M | r = find_match(c,swd,1,0); | 683 | 1.15M | ahead++; | 684 | | | 685 | 1.15M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.15M | assert(c->look > 0); | 687 | 1.15M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | | #if defined(LZO1Z) | 690 | | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | | c->m_len = 0; | 693 | | #endif | 694 | 1.15M | if (c->m_len < m_len) | 695 | 717k | continue; | 696 | 441k | #if 1 | 697 | 441k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 61.7k | continue; | 699 | 380k | #endif | 700 | 380k | #if defined(SWD_BEST_OFF) | 701 | 380k | if (swd->use_best_off) | 702 | 380k | better_match(swd,&c->m_len,&c->m_off); | 703 | 380k | #endif | 704 | 380k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 380k | if (l2 == 0) | 706 | 1.93k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 378k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 378k | l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit); | 716 | | #else | 717 | | l3 = len_of_coded_match(ahead,m_off,lit); | 718 | | #endif | 719 | | | 720 | 378k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 378k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 125k | { | 723 | 125k | c->lazy++; | 724 | 125k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 125k | if (l3) | 727 | 726 | { | 728 | | /* code previous run */ | 729 | 726 | op = code_run(c,op,ii,lit,ahead); | 730 | 726 | lit = 0; | 731 | | /* code shortened match */ | 732 | 726 | op = code_match(c,op,ahead,m_off); | 733 | 726 | } | 734 | 124k | else | 735 | 124k | { | 736 | 124k | lit += ahead; | 737 | 124k | assert(ii + lit == c->bp); | 738 | 124k | } | 739 | 125k | goto lazy_match_done; | 740 | 125k | } | 741 | 378k | } | 742 | | | 743 | | | 744 | 801k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 801k | op = code_run(c,op,ii,lit,m_len); | 748 | 801k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 801k | op = code_match(c,op,m_len,m_off); | 752 | 801k | swd->max_chain = max_chain; | 753 | 801k | r = find_match(c,swd,m_len,1+ahead); | 754 | 801k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 926k | lazy_match_done: ; | 757 | 926k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.65k | if (lit > 0) | 762 | 949 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.65k | #if defined(LZO_EOF_CODE) | 765 | 1.65k | *op++ = M4_MARKER | 1; | 766 | 1.65k | *op++ = 0; | 767 | 1.65k | *op++ = 0; | 768 | 1.65k | #endif | 769 | | | 770 | 1.65k | c->codesize = pd(op, out); | 771 | 1.65k | assert(c->textsize == in_len); | 772 | | | 773 | 1.65k | *out_len = pd(op, out); | 774 | | | 775 | 1.65k | if (c->cb && c->cb->nprogress) | 776 | 0 | (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0); | 777 | | | 778 | | #if 0 | 779 | | printf("%ld %ld -> %ld %ld: %ld %ld %ld %ld %ld %ld: %ld %ld %ld %ld\n", | 780 | | (long) c->textsize, (long) in_len, (long) c->codesize, | 781 | | c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m, | 782 | | c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy); | 783 | | #endif | 784 | 1.65k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.65k | return LZO_E_OK; | 787 | 1.65k | } |
lzo1z_999_compress_internal Line | Count | Source | 532 | 1.96k | { | 533 | 1.96k | lzo_bytep op; | 534 | 1.96k | const lzo_bytep ii; | 535 | 1.96k | lzo_uint lit; | 536 | 1.96k | lzo_uint m_len, m_off; | 537 | 1.96k | LZO_COMPRESS_T cc; | 538 | 1.96k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.96k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.96k | lzo_uint try_lazy; | 541 | 1.96k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | | #if defined(LZO1X) | 545 | | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 546 | | #elif defined(LZO1Y) | 547 | | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 548 | | #elif defined(LZO1Z) | 549 | 1.96k | LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) | 550 | | #else | 551 | | # error | 552 | | #endif | 553 | | | 554 | | /* setup parameter defaults */ | 555 | | /* number of lazy match tries */ | 556 | 1.96k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.96k | if (try_lazy_parm < 0) | 558 | 0 | try_lazy = 1; | 559 | | /* reduce lazy match search if we already have a match with this length */ | 560 | 1.96k | if (good_length == 0) | 561 | 0 | good_length = 32; | 562 | | /* do not try a lazy match if we already have a match with this length */ | 563 | 1.96k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.96k | if (nice_length == 0) | 567 | 1.96k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.96k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.96k | c->init = 0; | 573 | 1.96k | c->ip = c->in = in; | 574 | 1.96k | c->in_end = in + in_len; | 575 | 1.96k | c->out = out; | 576 | 1.96k | c->cb = cb; | 577 | 1.96k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.96k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.96k | op = out; | 581 | 1.96k | ii = c->ip; /* point to start of literal run */ | 582 | 1.96k | lit = 0; | 583 | 1.96k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.96k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.96k | if (r != 0) | 587 | 0 | return r; | 588 | 1.96k | if (max_chain > 0) | 589 | 1.96k | swd->max_chain = max_chain; | 590 | 1.96k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.96k | r = find_match(c,swd,0,0); | 594 | 1.96k | if (r != 0) | 595 | 0 | return r; | 596 | 18.5M | while (c->look > 0) | 597 | 18.5M | { | 598 | 18.5M | lzo_uint ahead; | 599 | 18.5M | lzo_uint max_ahead; | 600 | 18.5M | lzo_uint l1, l2, l3; | 601 | | | 602 | 18.5M | c->codesize = pd(op, out); | 603 | | | 604 | 18.5M | m_len = c->m_len; | 605 | 18.5M | m_off = c->m_off; | 606 | | | 607 | 18.5M | assert(c->bp == c->ip - c->look); | 608 | 18.5M | assert(c->bp >= in); | 609 | 18.5M | if (lit == 0) | 610 | 876k | ii = c->bp; | 611 | 18.5M | assert(ii + lit == c->bp); | 612 | 18.5M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 18.5M | if ( m_len < 2 || | 615 | 18.5M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 18.5M | #if 1 | 617 | | /* Do not accept this match for compressed-data compatibility | 618 | | * with LZO v1.01 and before | 619 | | * [ might be a problem for decompress() and optimize() ] | 620 | | */ | 621 | 18.5M | (m_len == 2 && op == out) || | 622 | 18.5M | #endif | 623 | 18.5M | (op == out && lit == 0)) | 624 | 17.4M | { | 625 | | /* a literal */ | 626 | 17.4M | m_len = 0; | 627 | 17.4M | } | 628 | 1.05M | else if (m_len == M2_MIN_LEN) | 629 | 205k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 205k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 50.5k | m_len = 0; | 633 | 205k | } | 634 | | | 635 | 18.5M | if (m_len == 0) | 636 | 17.5M | { | 637 | | /* a literal */ | 638 | 17.5M | lit++; | 639 | 17.5M | swd->max_chain = max_chain; | 640 | 17.5M | r = find_match(c,swd,1,0); | 641 | 17.5M | assert(r == 0); LZO_UNUSED(r); | 642 | 17.5M | continue; | 643 | 17.5M | } | 644 | | | 645 | | /* a match */ | 646 | 1.00M | #if defined(SWD_BEST_OFF) | 647 | 1.00M | if (swd->use_best_off) | 648 | 1.00M | better_match(swd,&m_len,&m_off); | 649 | 1.00M | #endif | 650 | 1.00M | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 1.00M | ahead = 0; | 655 | 1.00M | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 17.5k | { | 657 | | /* no */ | 658 | 17.5k | l1 = 0; | 659 | 17.5k | max_ahead = 0; | 660 | 17.5k | } | 661 | 991k | else | 662 | 991k | { | 663 | | /* yes, try a lazy match */ | 664 | 991k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 991k | assert(l1 > 0); | 666 | 991k | #if 1 | 667 | 991k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 991k | } | 672 | | | 673 | | | 674 | 2.12M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.24M | { | 676 | 1.24M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.24M | if (m_len >= good_length) | 679 | 94.0k | swd->max_chain = max_chain >> 2; | 680 | 1.15M | else | 681 | 1.15M | swd->max_chain = max_chain; | 682 | 1.24M | r = find_match(c,swd,1,0); | 683 | 1.24M | ahead++; | 684 | | | 685 | 1.24M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.24M | assert(c->look > 0); | 687 | 1.24M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | 1.24M | #if defined(LZO1Z) | 690 | 1.24M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | 308k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | 3.68k | c->m_len = 0; | 693 | 1.24M | #endif | 694 | 1.24M | if (c->m_len < m_len) | 695 | 768k | continue; | 696 | 478k | #if 1 | 697 | 478k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 69.4k | continue; | 699 | 408k | #endif | 700 | 408k | #if defined(SWD_BEST_OFF) | 701 | 408k | if (swd->use_best_off) | 702 | 408k | better_match(swd,&c->m_len,&c->m_off); | 703 | 408k | #endif | 704 | 408k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 408k | if (l2 == 0) | 706 | 2.45k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 406k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 406k | l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit); | 716 | | #else | 717 | | l3 = len_of_coded_match(ahead,m_off,lit); | 718 | | #endif | 719 | | | 720 | 406k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 406k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 135k | { | 723 | 135k | c->lazy++; | 724 | 135k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 135k | if (l3) | 727 | 998 | { | 728 | | /* code previous run */ | 729 | 998 | op = code_run(c,op,ii,lit,ahead); | 730 | 998 | lit = 0; | 731 | | /* code shortened match */ | 732 | 998 | op = code_match(c,op,ahead,m_off); | 733 | 998 | } | 734 | 134k | else | 735 | 134k | { | 736 | 134k | lit += ahead; | 737 | 134k | assert(ii + lit == c->bp); | 738 | 134k | } | 739 | 135k | goto lazy_match_done; | 740 | 135k | } | 741 | 406k | } | 742 | | | 743 | | | 744 | 874k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 874k | op = code_run(c,op,ii,lit,m_len); | 748 | 874k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 874k | op = code_match(c,op,m_len,m_off); | 752 | 874k | swd->max_chain = max_chain; | 753 | 874k | r = find_match(c,swd,m_len,1+ahead); | 754 | 874k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 1.00M | lazy_match_done: ; | 757 | 1.00M | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.96k | if (lit > 0) | 762 | 1.18k | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.96k | #if defined(LZO_EOF_CODE) | 765 | 1.96k | *op++ = M4_MARKER | 1; | 766 | 1.96k | *op++ = 0; | 767 | 1.96k | *op++ = 0; | 768 | 1.96k | #endif | 769 | | | 770 | 1.96k | c->codesize = pd(op, out); | 771 | 1.96k | assert(c->textsize == in_len); | 772 | | | 773 | 1.96k | *out_len = pd(op, out); | 774 | | | 775 | 1.96k | if (c->cb && c->cb->nprogress) | 776 | 0 | (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0); | 777 | | | 778 | | #if 0 | 779 | | printf("%ld %ld -> %ld %ld: %ld %ld %ld %ld %ld %ld: %ld %ld %ld %ld\n", | 780 | | (long) c->textsize, (long) in_len, (long) c->codesize, | 781 | | c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m, | 782 | | c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy); | 783 | | #endif | 784 | 1.96k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.96k | return LZO_E_OK; | 787 | 1.96k | } |
|
788 | | |
789 | | |
790 | | /*********************************************************************** |
791 | | // |
792 | | ************************************************************************/ |
793 | | |
794 | | LZO_PUBLIC(int) |
795 | | lzo1x_999_compress_level ( const lzo_bytep in , lzo_uint in_len, |
796 | | lzo_bytep out, lzo_uintp out_len, |
797 | | lzo_voidp wrkmem, |
798 | | const lzo_bytep dict, lzo_uint dict_len, |
799 | | lzo_callback_p cb, |
800 | | int compression_level ) |
801 | 5.30k | { |
802 | 5.30k | static const struct |
803 | 5.30k | { |
804 | 5.30k | int try_lazy_parm; |
805 | 5.30k | lzo_uint good_length; |
806 | 5.30k | lzo_uint max_lazy; |
807 | 5.30k | lzo_uint nice_length; |
808 | 5.30k | lzo_uint max_chain; |
809 | 5.30k | lzo_uint32_t flags; |
810 | 5.30k | } c[9] = { |
811 | | /* faster compression */ |
812 | 5.30k | { 0, 0, 0, 8, 4, 0 }, |
813 | 5.30k | { 0, 0, 0, 16, 8, 0 }, |
814 | 5.30k | { 0, 0, 0, 32, 16, 0 }, |
815 | 5.30k | { 1, 4, 4, 16, 16, 0 }, |
816 | 5.30k | { 1, 8, 16, 32, 32, 0 }, |
817 | 5.30k | { 1, 8, 16, 128, 128, 0 }, |
818 | 5.30k | { 2, 8, 32, 128, 256, 0 }, |
819 | 5.30k | { 2, 32, 128, SWD_F, 2048, 1 }, |
820 | 5.30k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } |
821 | | /* max. compression */ |
822 | 5.30k | }; |
823 | | |
824 | 5.30k | if (compression_level < 1 || compression_level > 9) |
825 | 0 | return LZO_E_ERROR; |
826 | | |
827 | 5.30k | compression_level -= 1; |
828 | 5.30k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, |
829 | 5.30k | dict, dict_len, cb, |
830 | 5.30k | c[compression_level].try_lazy_parm, |
831 | 5.30k | c[compression_level].good_length, |
832 | 5.30k | c[compression_level].max_lazy, |
833 | | #if 0 |
834 | | c[compression_level].nice_length, |
835 | | #else |
836 | 5.30k | 0, |
837 | 5.30k | #endif |
838 | 5.30k | c[compression_level].max_chain, |
839 | 5.30k | c[compression_level].flags); |
840 | 5.30k | } Line | Count | Source | 801 | 1.68k | { | 802 | 1.68k | static const struct | 803 | 1.68k | { | 804 | 1.68k | int try_lazy_parm; | 805 | 1.68k | lzo_uint good_length; | 806 | 1.68k | lzo_uint max_lazy; | 807 | 1.68k | lzo_uint nice_length; | 808 | 1.68k | lzo_uint max_chain; | 809 | 1.68k | lzo_uint32_t flags; | 810 | 1.68k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.68k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.68k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.68k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.68k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.68k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.68k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.68k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.68k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.68k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.68k | }; | 823 | | | 824 | 1.68k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.68k | compression_level -= 1; | 828 | 1.68k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.68k | dict, dict_len, cb, | 830 | 1.68k | c[compression_level].try_lazy_parm, | 831 | 1.68k | c[compression_level].good_length, | 832 | 1.68k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.68k | 0, | 837 | 1.68k | #endif | 838 | 1.68k | c[compression_level].max_chain, | 839 | 1.68k | c[compression_level].flags); | 840 | 1.68k | } |
Line | Count | Source | 801 | 1.65k | { | 802 | 1.65k | static const struct | 803 | 1.65k | { | 804 | 1.65k | int try_lazy_parm; | 805 | 1.65k | lzo_uint good_length; | 806 | 1.65k | lzo_uint max_lazy; | 807 | 1.65k | lzo_uint nice_length; | 808 | 1.65k | lzo_uint max_chain; | 809 | 1.65k | lzo_uint32_t flags; | 810 | 1.65k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.65k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.65k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.65k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.65k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.65k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.65k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.65k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.65k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.65k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.65k | }; | 823 | | | 824 | 1.65k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.65k | compression_level -= 1; | 828 | 1.65k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.65k | dict, dict_len, cb, | 830 | 1.65k | c[compression_level].try_lazy_parm, | 831 | 1.65k | c[compression_level].good_length, | 832 | 1.65k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.65k | 0, | 837 | 1.65k | #endif | 838 | 1.65k | c[compression_level].max_chain, | 839 | 1.65k | c[compression_level].flags); | 840 | 1.65k | } |
Line | Count | Source | 801 | 1.96k | { | 802 | 1.96k | static const struct | 803 | 1.96k | { | 804 | 1.96k | int try_lazy_parm; | 805 | 1.96k | lzo_uint good_length; | 806 | 1.96k | lzo_uint max_lazy; | 807 | 1.96k | lzo_uint nice_length; | 808 | 1.96k | lzo_uint max_chain; | 809 | 1.96k | lzo_uint32_t flags; | 810 | 1.96k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.96k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.96k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.96k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.96k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.96k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.96k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.96k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.96k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.96k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.96k | }; | 823 | | | 824 | 1.96k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.96k | compression_level -= 1; | 828 | 1.96k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.96k | dict, dict_len, cb, | 830 | 1.96k | c[compression_level].try_lazy_parm, | 831 | 1.96k | c[compression_level].good_length, | 832 | 1.96k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.96k | 0, | 837 | 1.96k | #endif | 838 | 1.96k | c[compression_level].max_chain, | 839 | 1.96k | c[compression_level].flags); | 840 | 1.96k | } |
|
841 | | |
842 | | |
843 | | /*********************************************************************** |
844 | | // |
845 | | ************************************************************************/ |
846 | | |
847 | | LZO_PUBLIC(int) |
848 | | lzo1x_999_compress_dict ( const lzo_bytep in , lzo_uint in_len, |
849 | | lzo_bytep out, lzo_uintp out_len, |
850 | | lzo_voidp wrkmem, |
851 | | const lzo_bytep dict, lzo_uint dict_len ) |
852 | 0 | { |
853 | 0 | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, |
854 | 0 | dict, dict_len, 0, 8); |
855 | 0 | } Unexecuted instantiation: lzo1x_999_compress_dict Unexecuted instantiation: lzo1y_999_compress_dict Unexecuted instantiation: lzo1z_999_compress_dict |
856 | | |
857 | | LZO_PUBLIC(int) |
858 | | lzo1x_999_compress ( const lzo_bytep in , lzo_uint in_len, |
859 | | lzo_bytep out, lzo_uintp out_len, |
860 | | lzo_voidp wrkmem ) |
861 | 5.30k | { |
862 | 5.30k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, |
863 | 5.30k | NULL, 0, (lzo_callback_p) 0, 8); |
864 | 5.30k | } Line | Count | Source | 861 | 1.68k | { | 862 | 1.68k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | 1.68k | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.68k | } |
Line | Count | Source | 861 | 1.65k | { | 862 | 1.65k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | 1.65k | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.65k | } |
Line | Count | Source | 861 | 1.96k | { | 862 | 1.96k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | 1.96k | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.96k | } |
|
865 | | |
866 | | |
867 | | /* vim:set ts=4 sw=4 et: */ |