/src/lzo-2.10/src/lzo1x_9x.c
Line | Count | Source |
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 | 4.00k | #define SWD_N M4_MAX_OFFSET /* size of ring buffer */ |
49 | 44.6M | #define SWD_THRESHOLD 1 /* lower limit for match length */ |
50 | 20.0k | #define SWD_F 2048 /* upper limit for match length */ |
51 | | |
52 | 1.55G | #define SWD_BEST_OFF (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1) |
53 | | |
54 | | #if defined(LZO1X) |
55 | 2.45k | # define LZO_COMPRESS_T lzo1x_999_t |
56 | 1.22k | # define lzo_swd_t lzo1x_999_swd_t |
57 | | #elif defined(LZO1Y) |
58 | 2.52k | # define LZO_COMPRESS_T lzo1y_999_t |
59 | 1.26k | # define lzo_swd_t lzo1y_999_swd_t |
60 | 1.26k | # define lzo1x_999_compress_internal lzo1y_999_compress_internal |
61 | | # define lzo1x_999_compress_dict lzo1y_999_compress_dict |
62 | 1.26k | # define lzo1x_999_compress_level lzo1y_999_compress_level |
63 | | # define lzo1x_999_compress lzo1y_999_compress |
64 | | #elif defined(LZO1Z) |
65 | 3.02k | # define LZO_COMPRESS_T lzo1z_999_t |
66 | 1.51k | # define lzo_swd_t lzo1z_999_swd_t |
67 | 1.51k | # define lzo1x_999_compress_internal lzo1z_999_compress_internal |
68 | | # define lzo1x_999_compress_dict lzo1z_999_compress_dict |
69 | 1.51k | # 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.49M | { |
109 | 2.49M | lzo_uint x_len = m_len; |
110 | 2.49M | lzo_uint x_off = m_off; |
111 | | |
112 | 2.49M | 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.49M | assert(op > c->out); |
143 | 2.49M | if (m_len == 2) |
144 | 723k | { |
145 | 723k | assert(m_off <= M1_MAX_OFFSET); |
146 | 723k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); |
147 | 723k | m_off -= 1; |
148 | | #if defined(LZO1Z) |
149 | 236k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
150 | 236k | *op++ = LZO_BYTE(m_off << 2); |
151 | | #else |
152 | 486k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
153 | 486k | *op++ = LZO_BYTE(m_off >> 2); |
154 | | #endif |
155 | 723k | c->m1a_m++; |
156 | 723k | } |
157 | | #if defined(LZO1Z) |
158 | 799k | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) |
159 | | #else |
160 | 975k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
161 | 509k | #endif |
162 | 881k | { |
163 | 881k | assert(m_len >= 3); |
164 | | #if defined(LZO1X) |
165 | | m_off -= 1; |
166 | 270k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); |
167 | 270k | *op++ = LZO_BYTE(m_off >> 3); |
168 | | assert(op[-2] >= M2_MARKER); |
169 | | #elif defined(LZO1Y) |
170 | | m_off -= 1; |
171 | 239k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); |
172 | 239k | *op++ = LZO_BYTE(m_off >> 2); |
173 | | assert(op[-2] >= M2_MARKER); |
174 | | #elif defined(LZO1Z) |
175 | 372k | if (m_off == c->last_m_off) |
176 | 19.7k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); |
177 | 352k | else |
178 | 352k | { |
179 | 352k | m_off -= 1; |
180 | 352k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); |
181 | 352k | *op++ = LZO_BYTE(m_off << 2); |
182 | 352k | } |
183 | | #endif |
184 | 881k | c->m2_m++; |
185 | 881k | } |
186 | 894k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) |
187 | 10.9k | { |
188 | 10.9k | assert(m_len == 3); |
189 | 10.9k | assert(m_off > M2_MAX_OFFSET); |
190 | 10.9k | m_off -= 1 + M2_MAX_OFFSET; |
191 | | #if defined(LZO1Z) |
192 | 4.07k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
193 | 4.07k | *op++ = LZO_BYTE(m_off << 2); |
194 | | #else |
195 | 6.85k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
196 | 6.85k | *op++ = LZO_BYTE(m_off >> 2); |
197 | | #endif |
198 | 10.9k | c->m1b_m++; |
199 | 10.9k | } |
200 | 883k | else if (m_off <= M3_MAX_OFFSET) |
201 | 660k | { |
202 | 660k | assert(m_len >= 3); |
203 | 660k | m_off -= 1; |
204 | 660k | if (m_len <= M3_MAX_LEN) |
205 | 546k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); |
206 | 114k | else |
207 | 114k | { |
208 | 114k | m_len -= M3_MAX_LEN; |
209 | 114k | *op++ = M3_MARKER | 0; |
210 | 202k | while (m_len > 255) |
211 | 88.5k | { |
212 | 88.5k | m_len -= 255; |
213 | 88.5k | *op++ = 0; |
214 | 88.5k | } |
215 | 114k | assert(m_len > 0); |
216 | 114k | *op++ = LZO_BYTE(m_len); |
217 | 114k | } |
218 | | #if defined(LZO1Z) |
219 | 288k | *op++ = LZO_BYTE(m_off >> 6); |
220 | 288k | *op++ = LZO_BYTE(m_off << 2); |
221 | | #else |
222 | 371k | *op++ = LZO_BYTE(m_off << 2); |
223 | 371k | *op++ = LZO_BYTE(m_off >> 6); |
224 | | #endif |
225 | 660k | c->m3_m++; |
226 | 660k | } |
227 | 222k | else |
228 | 222k | { |
229 | 222k | lzo_uint k; |
230 | | |
231 | 222k | assert(m_len >= 3); |
232 | 222k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); |
233 | 222k | m_off -= 0x4000; |
234 | 222k | k = (m_off & 0x4000) >> 11; |
235 | 222k | if (m_len <= M4_MAX_LEN) |
236 | 169k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); |
237 | 52.4k | else |
238 | 52.4k | { |
239 | 52.4k | m_len -= M4_MAX_LEN; |
240 | 52.4k | *op++ = LZO_BYTE(M4_MARKER | k | 0); |
241 | 73.2k | while (m_len > 255) |
242 | 20.8k | { |
243 | 20.8k | m_len -= 255; |
244 | 20.8k | *op++ = 0; |
245 | 20.8k | } |
246 | 52.4k | assert(m_len > 0); |
247 | 52.4k | *op++ = LZO_BYTE(m_len); |
248 | 52.4k | } |
249 | | #if defined(LZO1Z) |
250 | 134k | *op++ = LZO_BYTE(m_off >> 6); |
251 | 134k | *op++ = LZO_BYTE(m_off << 2); |
252 | | #else |
253 | 87.7k | *op++ = LZO_BYTE(m_off << 2); |
254 | 87.7k | *op++ = LZO_BYTE(m_off >> 6); |
255 | | #endif |
256 | 222k | c->m4_m++; |
257 | 222k | } |
258 | | |
259 | 2.49M | c->last_m_len = x_len; |
260 | 2.49M | c->last_m_off = x_off; |
261 | 2.49M | return op; |
262 | 2.49M | } Line | Count | Source | 108 | 756k | { | 109 | 756k | lzo_uint x_len = m_len; | 110 | 756k | lzo_uint x_off = m_off; | 111 | | | 112 | 756k | 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 | 756k | assert(op > c->out); | 143 | 756k | if (m_len == 2) | 144 | 243k | { | 145 | 243k | assert(m_off <= M1_MAX_OFFSET); | 146 | 243k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 243k | 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 | 243k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 243k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 243k | #endif | 155 | 243k | c->m1a_m++; | 156 | 243k | } | 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 | 512k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 270k | #endif | 162 | 270k | { | 163 | 270k | assert(m_len >= 3); | 164 | 270k | #if defined(LZO1X) | 165 | 270k | m_off -= 1; | 166 | 270k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | 270k | *op++ = LZO_BYTE(m_off >> 3); | 168 | 270k | 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 | 270k | c->m2_m++; | 185 | 270k | } | 186 | 242k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 2.59k | { | 188 | 2.59k | assert(m_len == 3); | 189 | 2.59k | assert(m_off > M2_MAX_OFFSET); | 190 | 2.59k | 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 | 2.59k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 2.59k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 2.59k | #endif | 198 | 2.59k | c->m1b_m++; | 199 | 2.59k | } | 200 | 239k | else if (m_off <= M3_MAX_OFFSET) | 201 | 194k | { | 202 | 194k | assert(m_len >= 3); | 203 | 194k | m_off -= 1; | 204 | 194k | if (m_len <= M3_MAX_LEN) | 205 | 159k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 35.5k | else | 207 | 35.5k | { | 208 | 35.5k | m_len -= M3_MAX_LEN; | 209 | 35.5k | *op++ = M3_MARKER | 0; | 210 | 59.1k | while (m_len > 255) | 211 | 23.5k | { | 212 | 23.5k | m_len -= 255; | 213 | 23.5k | *op++ = 0; | 214 | 23.5k | } | 215 | 35.5k | assert(m_len > 0); | 216 | 35.5k | *op++ = LZO_BYTE(m_len); | 217 | 35.5k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 194k | *op++ = LZO_BYTE(m_off << 2); | 223 | 194k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 194k | #endif | 225 | 194k | c->m3_m++; | 226 | 194k | } | 227 | 45.1k | else | 228 | 45.1k | { | 229 | 45.1k | lzo_uint k; | 230 | | | 231 | 45.1k | assert(m_len >= 3); | 232 | 45.1k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 45.1k | m_off -= 0x4000; | 234 | 45.1k | k = (m_off & 0x4000) >> 11; | 235 | 45.1k | if (m_len <= M4_MAX_LEN) | 236 | 26.7k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 18.3k | else | 238 | 18.3k | { | 239 | 18.3k | m_len -= M4_MAX_LEN; | 240 | 18.3k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 24.1k | while (m_len > 255) | 242 | 5.82k | { | 243 | 5.82k | m_len -= 255; | 244 | 5.82k | *op++ = 0; | 245 | 5.82k | } | 246 | 18.3k | assert(m_len > 0); | 247 | 18.3k | *op++ = LZO_BYTE(m_len); | 248 | 18.3k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 45.1k | *op++ = LZO_BYTE(m_off << 2); | 254 | 45.1k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 45.1k | #endif | 256 | 45.1k | c->m4_m++; | 257 | 45.1k | } | 258 | | | 259 | 756k | c->last_m_len = x_len; | 260 | 756k | c->last_m_off = x_off; | 261 | 756k | return op; | 262 | 756k | } |
Line | Count | Source | 108 | 706k | { | 109 | 706k | lzo_uint x_len = m_len; | 110 | 706k | lzo_uint x_off = m_off; | 111 | | | 112 | 706k | 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 | 706k | assert(op > c->out); | 143 | 706k | if (m_len == 2) | 144 | 243k | { | 145 | 243k | assert(m_off <= M1_MAX_OFFSET); | 146 | 243k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 243k | 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 | 243k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 243k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 243k | #endif | 155 | 243k | c->m1a_m++; | 156 | 243k | } | 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 | 463k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 239k | #endif | 162 | 239k | { | 163 | 239k | 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 | 239k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | 239k | *op++ = LZO_BYTE(m_off >> 2); | 173 | 239k | 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 | 239k | c->m2_m++; | 185 | 239k | } | 186 | 224k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 4.26k | { | 188 | 4.26k | assert(m_len == 3); | 189 | 4.26k | assert(m_off > M2_MAX_OFFSET); | 190 | 4.26k | 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 | 4.26k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 4.26k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 4.26k | #endif | 198 | 4.26k | c->m1b_m++; | 199 | 4.26k | } | 200 | 219k | else if (m_off <= M3_MAX_OFFSET) | 201 | 177k | { | 202 | 177k | assert(m_len >= 3); | 203 | 177k | m_off -= 1; | 204 | 177k | if (m_len <= M3_MAX_LEN) | 205 | 138k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 38.3k | else | 207 | 38.3k | { | 208 | 38.3k | m_len -= M3_MAX_LEN; | 209 | 38.3k | *op++ = M3_MARKER | 0; | 210 | 66.6k | while (m_len > 255) | 211 | 28.3k | { | 212 | 28.3k | m_len -= 255; | 213 | 28.3k | *op++ = 0; | 214 | 28.3k | } | 215 | 38.3k | assert(m_len > 0); | 216 | 38.3k | *op++ = LZO_BYTE(m_len); | 217 | 38.3k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 177k | *op++ = LZO_BYTE(m_off << 2); | 223 | 177k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 177k | #endif | 225 | 177k | c->m3_m++; | 226 | 177k | } | 227 | 42.6k | else | 228 | 42.6k | { | 229 | 42.6k | lzo_uint k; | 230 | | | 231 | 42.6k | assert(m_len >= 3); | 232 | 42.6k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 42.6k | m_off -= 0x4000; | 234 | 42.6k | k = (m_off & 0x4000) >> 11; | 235 | 42.6k | if (m_len <= M4_MAX_LEN) | 236 | 28.6k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 13.9k | else | 238 | 13.9k | { | 239 | 13.9k | m_len -= M4_MAX_LEN; | 240 | 13.9k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 21.6k | while (m_len > 255) | 242 | 7.68k | { | 243 | 7.68k | m_len -= 255; | 244 | 7.68k | *op++ = 0; | 245 | 7.68k | } | 246 | 13.9k | assert(m_len > 0); | 247 | 13.9k | *op++ = LZO_BYTE(m_len); | 248 | 13.9k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 42.6k | *op++ = LZO_BYTE(m_off << 2); | 254 | 42.6k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 42.6k | #endif | 256 | 42.6k | c->m4_m++; | 257 | 42.6k | } | 258 | | | 259 | 706k | c->last_m_len = x_len; | 260 | 706k | c->last_m_off = x_off; | 261 | 706k | return op; | 262 | 706k | } |
Line | Count | Source | 108 | 1.03M | { | 109 | 1.03M | lzo_uint x_len = m_len; | 110 | 1.03M | lzo_uint x_off = m_off; | 111 | | | 112 | 1.03M | 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 | 1.03M | assert(op > c->out); | 143 | 1.03M | if (m_len == 2) | 144 | 236k | { | 145 | 236k | assert(m_off <= M1_MAX_OFFSET); | 146 | 236k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 236k | m_off -= 1; | 148 | 236k | #if defined(LZO1Z) | 149 | 236k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | 236k | *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 | 236k | c->m1a_m++; | 156 | 236k | } | 157 | 799k | #if defined(LZO1Z) | 158 | 799k | 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 | 372k | { | 163 | 372k | 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 | 372k | if (m_off == c->last_m_off) | 176 | 19.7k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | 352k | else | 178 | 352k | { | 179 | 352k | m_off -= 1; | 180 | 352k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | 352k | *op++ = LZO_BYTE(m_off << 2); | 182 | 352k | } | 183 | 372k | #endif | 184 | 372k | c->m2_m++; | 185 | 372k | } | 186 | 427k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 4.07k | { | 188 | 4.07k | assert(m_len == 3); | 189 | 4.07k | assert(m_off > M2_MAX_OFFSET); | 190 | 4.07k | m_off -= 1 + M2_MAX_OFFSET; | 191 | 4.07k | #if defined(LZO1Z) | 192 | 4.07k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | 4.07k | *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.07k | c->m1b_m++; | 199 | 4.07k | } | 200 | 423k | else if (m_off <= M3_MAX_OFFSET) | 201 | 288k | { | 202 | 288k | assert(m_len >= 3); | 203 | 288k | m_off -= 1; | 204 | 288k | if (m_len <= M3_MAX_LEN) | 205 | 248k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 40.0k | else | 207 | 40.0k | { | 208 | 40.0k | m_len -= M3_MAX_LEN; | 209 | 40.0k | *op++ = M3_MARKER | 0; | 210 | 76.7k | while (m_len > 255) | 211 | 36.6k | { | 212 | 36.6k | m_len -= 255; | 213 | 36.6k | *op++ = 0; | 214 | 36.6k | } | 215 | 40.0k | assert(m_len > 0); | 216 | 40.0k | *op++ = LZO_BYTE(m_len); | 217 | 40.0k | } | 218 | 288k | #if defined(LZO1Z) | 219 | 288k | *op++ = LZO_BYTE(m_off >> 6); | 220 | 288k | *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 | 288k | c->m3_m++; | 226 | 288k | } | 227 | 134k | else | 228 | 134k | { | 229 | 134k | lzo_uint k; | 230 | | | 231 | 134k | assert(m_len >= 3); | 232 | 134k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 134k | m_off -= 0x4000; | 234 | 134k | k = (m_off & 0x4000) >> 11; | 235 | 134k | if (m_len <= M4_MAX_LEN) | 236 | 114k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 20.1k | else | 238 | 20.1k | { | 239 | 20.1k | m_len -= M4_MAX_LEN; | 240 | 20.1k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 27.4k | while (m_len > 255) | 242 | 7.32k | { | 243 | 7.32k | m_len -= 255; | 244 | 7.32k | *op++ = 0; | 245 | 7.32k | } | 246 | 20.1k | assert(m_len > 0); | 247 | 20.1k | *op++ = LZO_BYTE(m_len); | 248 | 20.1k | } | 249 | 134k | #if defined(LZO1Z) | 250 | 134k | *op++ = LZO_BYTE(m_off >> 6); | 251 | 134k | *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 | 134k | c->m4_m++; | 257 | 134k | } | 258 | | | 259 | 1.03M | c->last_m_len = x_len; | 260 | 1.03M | c->last_m_off = x_off; | 261 | 1.03M | return op; | 262 | 1.03M | } |
|
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.82M | { |
268 | 1.82M | c->lit_bytes += t; |
269 | | |
270 | 1.82M | if (op == c->out && t <= 238) |
271 | 3.88k | { |
272 | 3.88k | *op++ = LZO_BYTE(17 + t); |
273 | 3.88k | } |
274 | 1.81M | else if (t <= 3) |
275 | 1.65M | { |
276 | | #if defined(LZO1Z) |
277 | 678k | op[-1] = LZO_BYTE(op[-1] | t); |
278 | | #else |
279 | 976k | op[-2] = LZO_BYTE(op[-2] | t); |
280 | | #endif |
281 | 1.65M | c->lit1_r++; |
282 | 1.65M | } |
283 | 162k | else if (t <= 18) |
284 | 108k | { |
285 | 108k | *op++ = LZO_BYTE(t - 3); |
286 | 108k | c->lit2_r++; |
287 | 108k | } |
288 | 53.8k | else |
289 | 53.8k | { |
290 | 53.8k | lzo_uint tt = t - 18; |
291 | | |
292 | 53.8k | *op++ = 0; |
293 | 177k | while (tt > 255) |
294 | 123k | { |
295 | 123k | tt -= 255; |
296 | 123k | *op++ = 0; |
297 | 123k | } |
298 | 53.8k | assert(tt > 0); |
299 | 53.8k | *op++ = LZO_BYTE(tt); |
300 | 53.8k | c->lit3_r++; |
301 | 53.8k | } |
302 | 38.8M | do *op++ = *ii++; while (--t > 0); |
303 | | |
304 | 1.82M | return op; |
305 | 1.82M | } Line | Count | Source | 267 | 544k | { | 268 | 544k | c->lit_bytes += t; | 269 | | | 270 | 544k | if (op == c->out && t <= 238) | 271 | 1.19k | { | 272 | 1.19k | *op++ = LZO_BYTE(17 + t); | 273 | 1.19k | } | 274 | 542k | else if (t <= 3) | 275 | 496k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 496k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 496k | #endif | 281 | 496k | c->lit1_r++; | 282 | 496k | } | 283 | 46.0k | else if (t <= 18) | 284 | 32.3k | { | 285 | 32.3k | *op++ = LZO_BYTE(t - 3); | 286 | 32.3k | c->lit2_r++; | 287 | 32.3k | } | 288 | 13.6k | else | 289 | 13.6k | { | 290 | 13.6k | lzo_uint tt = t - 18; | 291 | | | 292 | 13.6k | *op++ = 0; | 293 | 45.5k | while (tt > 255) | 294 | 31.8k | { | 295 | 31.8k | tt -= 255; | 296 | 31.8k | *op++ = 0; | 297 | 31.8k | } | 298 | 13.6k | assert(tt > 0); | 299 | 13.6k | *op++ = LZO_BYTE(tt); | 300 | 13.6k | c->lit3_r++; | 301 | 13.6k | } | 302 | 10.0M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 544k | return op; | 305 | 544k | } |
Line | Count | Source | 267 | 527k | { | 268 | 527k | c->lit_bytes += t; | 269 | | | 270 | 527k | if (op == c->out && t <= 238) | 271 | 1.21k | { | 272 | 1.21k | *op++ = LZO_BYTE(17 + t); | 273 | 1.21k | } | 274 | 526k | else if (t <= 3) | 275 | 480k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 480k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 480k | #endif | 281 | 480k | c->lit1_r++; | 282 | 480k | } | 283 | 46.4k | else if (t <= 18) | 284 | 26.3k | { | 285 | 26.3k | *op++ = LZO_BYTE(t - 3); | 286 | 26.3k | c->lit2_r++; | 287 | 26.3k | } | 288 | 20.1k | else | 289 | 20.1k | { | 290 | 20.1k | lzo_uint tt = t - 18; | 291 | | | 292 | 20.1k | *op++ = 0; | 293 | 75.8k | while (tt > 255) | 294 | 55.7k | { | 295 | 55.7k | tt -= 255; | 296 | 55.7k | *op++ = 0; | 297 | 55.7k | } | 298 | 20.1k | assert(tt > 0); | 299 | 20.1k | *op++ = LZO_BYTE(tt); | 300 | 20.1k | c->lit3_r++; | 301 | 20.1k | } | 302 | 16.7M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 527k | return op; | 305 | 527k | } |
Line | Count | Source | 267 | 749k | { | 268 | 749k | c->lit_bytes += t; | 269 | | | 270 | 749k | if (op == c->out && t <= 238) | 271 | 1.47k | { | 272 | 1.47k | *op++ = LZO_BYTE(17 + t); | 273 | 1.47k | } | 274 | 748k | else if (t <= 3) | 275 | 678k | { | 276 | 678k | #if defined(LZO1Z) | 277 | 678k | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | | op[-2] = LZO_BYTE(op[-2] | t); | 280 | | #endif | 281 | 678k | c->lit1_r++; | 282 | 678k | } | 283 | 69.9k | else if (t <= 18) | 284 | 49.9k | { | 285 | 49.9k | *op++ = LZO_BYTE(t - 3); | 286 | 49.9k | c->lit2_r++; | 287 | 49.9k | } | 288 | 20.0k | else | 289 | 20.0k | { | 290 | 20.0k | lzo_uint tt = t - 18; | 291 | | | 292 | 20.0k | *op++ = 0; | 293 | 56.1k | while (tt > 255) | 294 | 36.0k | { | 295 | 36.0k | tt -= 255; | 296 | 36.0k | *op++ = 0; | 297 | 36.0k | } | 298 | 20.0k | assert(tt > 0); | 299 | 20.0k | *op++ = LZO_BYTE(tt); | 300 | 20.0k | c->lit3_r++; | 301 | 20.0k | } | 302 | 12.0M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 749k | return op; | 305 | 749k | } |
|
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.49M | { |
312 | 2.49M | if (lit > 0) |
313 | 1.81M | { |
314 | 1.81M | assert(m_len >= 2); |
315 | 1.81M | op = STORE_RUN(c,op,ii,lit); |
316 | 1.81M | c->r1_m_len = m_len; |
317 | 1.81M | c->r1_lit = lit; |
318 | 1.81M | } |
319 | 679k | else |
320 | 679k | { |
321 | 679k | assert(m_len >= 3); |
322 | 679k | c->r1_m_len = 0; |
323 | 679k | c->r1_lit = 0; |
324 | 679k | } |
325 | | |
326 | 2.49M | return op; |
327 | 2.49M | } Line | Count | Source | 311 | 756k | { | 312 | 756k | if (lit > 0) | 313 | 543k | { | 314 | 543k | assert(m_len >= 2); | 315 | 543k | op = STORE_RUN(c,op,ii,lit); | 316 | 543k | c->r1_m_len = m_len; | 317 | 543k | c->r1_lit = lit; | 318 | 543k | } | 319 | 213k | else | 320 | 213k | { | 321 | 213k | assert(m_len >= 3); | 322 | 213k | c->r1_m_len = 0; | 323 | 213k | c->r1_lit = 0; | 324 | 213k | } | 325 | | | 326 | 756k | return op; | 327 | 756k | } |
Line | Count | Source | 311 | 706k | { | 312 | 706k | if (lit > 0) | 313 | 527k | { | 314 | 527k | assert(m_len >= 2); | 315 | 527k | op = STORE_RUN(c,op,ii,lit); | 316 | 527k | c->r1_m_len = m_len; | 317 | 527k | c->r1_lit = lit; | 318 | 527k | } | 319 | 179k | else | 320 | 179k | { | 321 | 179k | assert(m_len >= 3); | 322 | 179k | c->r1_m_len = 0; | 323 | 179k | c->r1_lit = 0; | 324 | 179k | } | 325 | | | 326 | 706k | return op; | 327 | 706k | } |
Line | Count | Source | 311 | 1.03M | { | 312 | 1.03M | if (lit > 0) | 313 | 748k | { | 314 | 748k | assert(m_len >= 2); | 315 | 748k | op = STORE_RUN(c,op,ii,lit); | 316 | 748k | c->r1_m_len = m_len; | 317 | 748k | c->r1_lit = lit; | 318 | 748k | } | 319 | 287k | else | 320 | 287k | { | 321 | 287k | assert(m_len >= 3); | 322 | 287k | c->r1_m_len = 0; | 323 | 287k | c->r1_lit = 0; | 324 | 287k | } | 325 | | | 326 | 1.03M | return op; | 327 | 1.03M | } |
|
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 | 5.52M | { |
337 | 5.52M | lzo_uint n = 4; |
338 | | |
339 | 5.52M | if (m_len < 2) |
340 | 1.08M | return 0; |
341 | 4.44M | if (m_len == 2) |
342 | 1.30M | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; |
343 | 3.14M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
344 | 1.37M | return 2; |
345 | 1.76M | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) |
346 | 13.0k | return 2; |
347 | 1.75M | if (m_off <= M3_MAX_OFFSET) |
348 | 1.29M | { |
349 | 1.29M | if (m_len <= M3_MAX_LEN) |
350 | 1.16M | return 3; |
351 | 132k | m_len -= M3_MAX_LEN; |
352 | 136k | while (m_len > 255) |
353 | 3.97k | { |
354 | 3.97k | m_len -= 255; |
355 | 3.97k | n++; |
356 | 3.97k | } |
357 | 132k | return n; |
358 | 1.29M | } |
359 | 458k | if (m_off <= M4_MAX_OFFSET) |
360 | 458k | { |
361 | 458k | if (m_len <= M4_MAX_LEN) |
362 | 364k | return 3; |
363 | 94.1k | m_len -= M4_MAX_LEN; |
364 | 96.3k | while (m_len > 255) |
365 | 2.26k | { |
366 | 2.26k | m_len -= 255; |
367 | 2.26k | n++; |
368 | 2.26k | } |
369 | 94.1k | return n; |
370 | 458k | } |
371 | 0 | return 0; |
372 | 458k | } lzo1x_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.32M | if (m_len == 2) | 342 | 422k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 905k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 427k | return 2; | 345 | 477k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 3.16k | return 2; | 347 | 474k | if (m_off <= M3_MAX_OFFSET) | 348 | 372k | { | 349 | 372k | if (m_len <= M3_MAX_LEN) | 350 | 332k | return 3; | 351 | 40.6k | m_len -= M3_MAX_LEN; | 352 | 42.0k | while (m_len > 255) | 353 | 1.40k | { | 354 | 1.40k | m_len -= 255; | 355 | 1.40k | n++; | 356 | 1.40k | } | 357 | 40.6k | return n; | 358 | 372k | } | 359 | 101k | if (m_off <= M4_MAX_OFFSET) | 360 | 101k | { | 361 | 101k | if (m_len <= M4_MAX_LEN) | 362 | 67.9k | return 3; | 363 | 33.4k | m_len -= M4_MAX_LEN; | 364 | 34.1k | while (m_len > 255) | 365 | 688 | { | 366 | 688 | m_len -= 255; | 367 | 688 | n++; | 368 | 688 | } | 369 | 33.4k | return n; | 370 | 101k | } | 371 | 0 | return 0; | 372 | 101k | } |
lzo1y_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.58M | { | 337 | 1.58M | lzo_uint n = 4; | 338 | | | 339 | 1.58M | if (m_len < 2) | 340 | 327k | return 0; | 341 | 1.25M | if (m_len == 2) | 342 | 438k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 818k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 370k | return 2; | 345 | 448k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 4.88k | return 2; | 347 | 443k | if (m_off <= M3_MAX_OFFSET) | 348 | 352k | { | 349 | 352k | if (m_len <= M3_MAX_LEN) | 350 | 306k | return 3; | 351 | 46.1k | m_len -= M3_MAX_LEN; | 352 | 47.3k | while (m_len > 255) | 353 | 1.18k | { | 354 | 1.18k | m_len -= 255; | 355 | 1.18k | n++; | 356 | 1.18k | } | 357 | 46.1k | return n; | 358 | 352k | } | 359 | 90.9k | if (m_off <= M4_MAX_OFFSET) | 360 | 90.9k | { | 361 | 90.9k | if (m_len <= M4_MAX_LEN) | 362 | 67.5k | return 3; | 363 | 23.4k | m_len -= M4_MAX_LEN; | 364 | 24.1k | while (m_len > 255) | 365 | 787 | { | 366 | 787 | m_len -= 255; | 367 | 787 | n++; | 368 | 787 | } | 369 | 23.4k | return n; | 370 | 90.9k | } | 371 | 0 | return 0; | 372 | 90.9k | } |
lzo1z_9x.c:len_of_coded_match Line | Count | Source | 336 | 2.28M | { | 337 | 2.28M | lzo_uint n = 4; | 338 | | | 339 | 2.28M | if (m_len < 2) | 340 | 424k | return 0; | 341 | 1.85M | if (m_len == 2) | 342 | 439k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 1.41M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 579k | return 2; | 345 | 839k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 5.04k | return 2; | 347 | 834k | if (m_off <= M3_MAX_OFFSET) | 348 | 567k | { | 349 | 567k | if (m_len <= M3_MAX_LEN) | 350 | 522k | return 3; | 351 | 45.6k | m_len -= M3_MAX_LEN; | 352 | 47.0k | while (m_len > 255) | 353 | 1.38k | { | 354 | 1.38k | m_len -= 255; | 355 | 1.38k | n++; | 356 | 1.38k | } | 357 | 45.6k | return n; | 358 | 567k | } | 359 | 266k | if (m_off <= M4_MAX_OFFSET) | 360 | 266k | { | 361 | 266k | if (m_len <= M4_MAX_LEN) | 362 | 229k | return 3; | 363 | 37.2k | m_len -= M4_MAX_LEN; | 364 | 38.0k | while (m_len > 255) | 365 | 792 | { | 366 | 792 | m_len -= 255; | 367 | 792 | n++; | 368 | 792 | } | 369 | 37.2k | return n; | 370 | 266k | } | 371 | 0 | return 0; | 372 | 266k | } |
|
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.25M | { |
378 | 1.25M | lzo_uint lazy_match_min_gain; |
379 | | |
380 | 1.25M | assert (ahead >= 1); |
381 | 1.25M | lazy_match_min_gain = ahead; |
382 | | |
383 | | #if 0 |
384 | | if (l3) |
385 | | lit2 -= ahead; |
386 | | #endif |
387 | | |
388 | 1.25M | if (lit1 <= 3) |
389 | 1.22M | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; |
390 | 26.4k | else if (lit1 <= 18) |
391 | 19.9k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; |
392 | | |
393 | 1.25M | lazy_match_min_gain += (l2 - l1) * 2; |
394 | 1.25M | if (l3) |
395 | 5.69k | lazy_match_min_gain -= (ahead - l3) * 2; |
396 | | |
397 | 1.25M | if ((lzo_int) lazy_match_min_gain < 0) |
398 | 117k | 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.25M | return lazy_match_min_gain; |
407 | 1.25M | } Line | Count | Source | 377 | 375k | { | 378 | 375k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 375k | assert (ahead >= 1); | 381 | 375k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 375k | if (lit1 <= 3) | 389 | 367k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 7.55k | else if (lit1 <= 18) | 391 | 5.78k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 375k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 375k | if (l3) | 395 | 2.10k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 375k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 25.9k | 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 | 375k | return lazy_match_min_gain; | 407 | 375k | } |
Line | Count | Source | 377 | 370k | { | 378 | 370k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 370k | assert (ahead >= 1); | 381 | 370k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 370k | if (lit1 <= 3) | 389 | 364k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 6.00k | else if (lit1 <= 18) | 391 | 3.85k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 370k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 370k | if (l3) | 395 | 1.30k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 370k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 28.1k | 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 | 370k | return lazy_match_min_gain; | 407 | 370k | } |
Line | Count | Source | 377 | 505k | { | 378 | 505k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 505k | assert (ahead >= 1); | 381 | 505k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 505k | if (lit1 <= 3) | 389 | 492k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 12.8k | else if (lit1 <= 18) | 391 | 10.2k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 505k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 505k | if (l3) | 395 | 2.28k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 505k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 63.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 | 505k | return lazy_match_min_gain; | 407 | 505k | } |
|
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.63M | # 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 | 4.32M | { |
454 | | #if defined(LZO1Z) |
455 | | const LZO_COMPRESS_T *c = swd->c; |
456 | | #endif |
457 | | |
458 | 4.32M | if (*m_len <= M2_MIN_LEN) |
459 | 1.89M | return; |
460 | | #if defined(LZO1Z) |
461 | 1.03M | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) |
462 | 16.8k | return; |
463 | 1.01M | #if 1 |
464 | 1.01M | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
465 | 733k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) |
466 | 2.75k | { |
467 | 2.75k | *m_len = *m_len - 1; |
468 | 2.75k | *m_off = swd->best_off[*m_len]; |
469 | 2.75k | return; |
470 | 2.75k | } |
471 | 1.01M | #endif |
472 | 1.01M | #endif |
473 | | |
474 | 2.40M | if (*m_off <= M2_MAX_OFFSET) |
475 | 1.21M | return; |
476 | | |
477 | 1.18M | #if 1 |
478 | | /* M3/M4 -> M2 */ |
479 | 1.18M | if (*m_off > M2_MAX_OFFSET && |
480 | 1.18M | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
481 | 872k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) |
482 | 139k | { |
483 | 139k | *m_len = *m_len - 1; |
484 | 139k | *m_off = swd->best_off[*m_len]; |
485 | 139k | return; |
486 | 139k | } |
487 | 1.04M | #endif |
488 | | |
489 | 1.04M | #if 1 |
490 | | /* M4 -> M2 */ |
491 | 1.04M | if (*m_off > M3_MAX_OFFSET && |
492 | 362k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && |
493 | 35.0k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) |
494 | 4.19k | { |
495 | 4.19k | *m_len = *m_len - 2; |
496 | 4.19k | *m_off = swd->best_off[*m_len]; |
497 | 4.19k | return; |
498 | 4.19k | } |
499 | 1.04M | #endif |
500 | | |
501 | 1.04M | #if 1 |
502 | | /* M4 -> M3 */ |
503 | 1.04M | if (*m_off > M3_MAX_OFFSET && |
504 | 357k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && |
505 | 89.8k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) |
506 | 11.6k | { |
507 | 11.6k | *m_len = *m_len - 1; |
508 | 11.6k | *m_off = swd->best_off[*m_len]; |
509 | 11.6k | } |
510 | 1.04M | #endif |
511 | 1.04M | } Line | Count | Source | 453 | 1.29M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.29M | if (*m_len <= M2_MIN_LEN) | 459 | 567k | 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 | 732k | if (*m_off <= M2_MAX_OFFSET) | 475 | 413k | return; | 476 | | | 477 | 319k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 319k | if (*m_off > M2_MAX_OFFSET && | 480 | 319k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 197k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 42.2k | { | 483 | 42.2k | *m_len = *m_len - 1; | 484 | 42.2k | *m_off = swd->best_off[*m_len]; | 485 | 42.2k | return; | 486 | 42.2k | } | 487 | 276k | #endif | 488 | | | 489 | 276k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 276k | if (*m_off > M3_MAX_OFFSET && | 492 | 93.9k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 7.51k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.28k | { | 495 | 1.28k | *m_len = *m_len - 2; | 496 | 1.28k | *m_off = swd->best_off[*m_len]; | 497 | 1.28k | return; | 498 | 1.28k | } | 499 | 275k | #endif | 500 | | | 501 | 275k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 275k | if (*m_off > M3_MAX_OFFSET && | 504 | 92.6k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 31.9k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 4.28k | { | 507 | 4.28k | *m_len = *m_len - 1; | 508 | 4.28k | *m_off = swd->best_off[*m_len]; | 509 | 4.28k | } | 510 | 275k | #endif | 511 | 275k | } |
Line | Count | Source | 453 | 1.23M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.23M | if (*m_len <= M2_MIN_LEN) | 459 | 573k | 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 | 657k | if (*m_off <= M2_MAX_OFFSET) | 475 | 314k | return; | 476 | | | 477 | 342k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 342k | if (*m_off > M2_MAX_OFFSET && | 480 | 342k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 289k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 37.3k | { | 483 | 37.3k | *m_len = *m_len - 1; | 484 | 37.3k | *m_off = swd->best_off[*m_len]; | 485 | 37.3k | return; | 486 | 37.3k | } | 487 | 304k | #endif | 488 | | | 489 | 304k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 304k | if (*m_off > M3_MAX_OFFSET && | 492 | 84.4k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 18.0k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.69k | { | 495 | 1.69k | *m_len = *m_len - 2; | 496 | 1.69k | *m_off = swd->best_off[*m_len]; | 497 | 1.69k | return; | 498 | 1.69k | } | 499 | 302k | #endif | 500 | | | 501 | 302k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 302k | if (*m_off > M3_MAX_OFFSET && | 504 | 82.7k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 21.7k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 2.75k | { | 507 | 2.75k | *m_len = *m_len - 1; | 508 | 2.75k | *m_off = swd->best_off[*m_len]; | 509 | 2.75k | } | 510 | 302k | #endif | 511 | 302k | } |
Line | Count | Source | 453 | 1.79M | { | 454 | 1.79M | #if defined(LZO1Z) | 455 | 1.79M | const LZO_COMPRESS_T *c = swd->c; | 456 | 1.79M | #endif | 457 | | | 458 | 1.79M | if (*m_len <= M2_MIN_LEN) | 459 | 757k | return; | 460 | 1.03M | #if defined(LZO1Z) | 461 | 1.03M | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | 16.8k | return; | 463 | 1.01M | #if 1 | 464 | 1.01M | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | 733k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | 2.75k | { | 467 | 2.75k | *m_len = *m_len - 1; | 468 | 2.75k | *m_off = swd->best_off[*m_len]; | 469 | 2.75k | return; | 470 | 2.75k | } | 471 | 1.01M | #endif | 472 | 1.01M | #endif | 473 | | | 474 | 1.01M | if (*m_off <= M2_MAX_OFFSET) | 475 | 491k | return; | 476 | | | 477 | 525k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 525k | if (*m_off > M2_MAX_OFFSET && | 480 | 525k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 386k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 59.6k | { | 483 | 59.6k | *m_len = *m_len - 1; | 484 | 59.6k | *m_off = swd->best_off[*m_len]; | 485 | 59.6k | return; | 486 | 59.6k | } | 487 | 466k | #endif | 488 | | | 489 | 466k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 466k | if (*m_off > M3_MAX_OFFSET && | 492 | 183k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 9.49k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.22k | { | 495 | 1.22k | *m_len = *m_len - 2; | 496 | 1.22k | *m_off = swd->best_off[*m_len]; | 497 | 1.22k | return; | 498 | 1.22k | } | 499 | 465k | #endif | 500 | | | 501 | 465k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 465k | if (*m_off > M3_MAX_OFFSET && | 504 | 182k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 36.1k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 4.66k | { | 507 | 4.66k | *m_len = *m_len - 1; | 508 | 4.66k | *m_off = swd->best_off[*m_len]; | 509 | 4.66k | } | 510 | 465k | #endif | 511 | 465k | } |
|
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 | 4.00k | { |
533 | 4.00k | lzo_bytep op; |
534 | 4.00k | const lzo_bytep ii; |
535 | 4.00k | lzo_uint lit; |
536 | 4.00k | lzo_uint m_len, m_off; |
537 | 4.00k | LZO_COMPRESS_T cc; |
538 | 4.00k | LZO_COMPRESS_T * const c = &cc; |
539 | 4.00k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; |
540 | 4.00k | lzo_uint try_lazy; |
541 | 4.00k | int r; |
542 | | |
543 | | /* sanity check */ |
544 | | #if defined(LZO1X) |
545 | 1.22k | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
546 | | #elif defined(LZO1Y) |
547 | 1.26k | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
548 | | #elif defined(LZO1Z) |
549 | 1.51k | 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 | 4.00k | try_lazy = (lzo_uint) try_lazy_parm; |
557 | 4.00k | 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 | 4.00k | 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 | 4.00k | if (max_lazy == 0) |
564 | 0 | max_lazy = 32; |
565 | | /* stop searching for longer matches than this one */ |
566 | 4.00k | if (nice_length == 0) |
567 | 4.00k | nice_length = 0; |
568 | | /* don't search more positions than this */ |
569 | 4.00k | if (max_chain == 0) |
570 | 0 | max_chain = SWD_MAX_CHAIN; |
571 | | |
572 | 4.00k | c->init = 0; |
573 | 4.00k | c->ip = c->in = in; |
574 | 4.00k | c->in_end = in + in_len; |
575 | 4.00k | c->out = out; |
576 | 4.00k | c->cb = cb; |
577 | 4.00k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; |
578 | 4.00k | c->lit1_r = c->lit2_r = c->lit3_r = 0; |
579 | | |
580 | 4.00k | op = out; |
581 | 4.00k | ii = c->ip; /* point to start of literal run */ |
582 | 4.00k | lit = 0; |
583 | 4.00k | c->r1_lit = c->r1_m_len = 0; |
584 | | |
585 | 4.00k | r = init_match(c,swd,dict,dict_len,flags); |
586 | 4.00k | if (r != 0) |
587 | 0 | return r; |
588 | 4.00k | if (max_chain > 0) |
589 | 4.00k | swd->max_chain = max_chain; |
590 | 4.00k | if (nice_length > 0) |
591 | 0 | swd->nice_length = nice_length; |
592 | | |
593 | 4.00k | r = find_match(c,swd,0,0); |
594 | 4.00k | if (r != 0) |
595 | 0 | return r; |
596 | 41.2M | while (c->look > 0) |
597 | 41.2M | { |
598 | 41.2M | lzo_uint ahead; |
599 | 41.2M | lzo_uint max_ahead; |
600 | 41.2M | lzo_uint l1, l2, l3; |
601 | | |
602 | 41.2M | c->codesize = pd(op, out); |
603 | | |
604 | 41.2M | m_len = c->m_len; |
605 | 41.2M | m_off = c->m_off; |
606 | | |
607 | 41.2M | assert(c->bp == c->ip - c->look); |
608 | 41.2M | assert(c->bp >= in); |
609 | 41.2M | if (lit == 0) |
610 | 2.50M | ii = c->bp; |
611 | 41.2M | assert(ii + lit == c->bp); |
612 | 41.2M | assert(swd->b_char == *(c->bp)); |
613 | | |
614 | 41.2M | if ( m_len < 2 || |
615 | 20.4M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || |
616 | 3.22M | #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 | 3.22M | (m_len == 2 && op == out) || |
622 | 3.22M | #endif |
623 | 3.22M | (op == out && lit == 0)) |
624 | 38.0M | { |
625 | | /* a literal */ |
626 | 38.0M | m_len = 0; |
627 | 38.0M | } |
628 | 3.22M | else if (m_len == M2_MIN_LEN) |
629 | 773k | { |
630 | | /* compression ratio improves if we code a literal in some cases */ |
631 | 773k | if (m_off > MX_MAX_OFFSET && lit >= 4) |
632 | 157k | m_len = 0; |
633 | 773k | } |
634 | | |
635 | 41.2M | if (m_len == 0) |
636 | 38.1M | { |
637 | | /* a literal */ |
638 | 38.1M | lit++; |
639 | 38.1M | swd->max_chain = max_chain; |
640 | 38.1M | r = find_match(c,swd,1,0); |
641 | 38.1M | assert(r == 0); LZO_UNUSED(r); |
642 | 38.1M | continue; |
643 | 38.1M | } |
644 | | |
645 | | /* a match */ |
646 | 3.06M | #if defined(SWD_BEST_OFF) |
647 | 3.06M | if (swd->use_best_off) |
648 | 3.06M | better_match(swd,&m_len,&m_off); |
649 | 3.06M | #endif |
650 | 3.06M | assert_match(swd,m_len,m_off); |
651 | | |
652 | | |
653 | | /* shall we try a lazy match ? */ |
654 | 3.06M | ahead = 0; |
655 | 3.06M | if (try_lazy == 0 || m_len >= max_lazy) |
656 | 45.6k | { |
657 | | /* no */ |
658 | 45.6k | l1 = 0; |
659 | 45.6k | max_ahead = 0; |
660 | 45.6k | } |
661 | 3.02M | else |
662 | 3.02M | { |
663 | | /* yes, try a lazy match */ |
664 | 3.02M | l1 = len_of_coded_match(m_len,m_off,lit); |
665 | 3.02M | assert(l1 > 0); |
666 | 3.02M | #if 1 |
667 | 3.02M | max_ahead = LZO_MIN(try_lazy, l1 - 1); |
668 | | #else |
669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); |
670 | | #endif |
671 | 3.02M | } |
672 | | |
673 | | |
674 | 6.43M | while (ahead < max_ahead && c->look > m_len) |
675 | 3.94M | { |
676 | 3.94M | lzo_uint lazy_match_min_gain; |
677 | | |
678 | 3.94M | if (m_len >= good_length) |
679 | 193k | swd->max_chain = max_chain >> 2; |
680 | 3.75M | else |
681 | 3.75M | swd->max_chain = max_chain; |
682 | 3.94M | r = find_match(c,swd,1,0); |
683 | 3.94M | ahead++; |
684 | | |
685 | 3.94M | assert(r == 0); LZO_UNUSED(r); |
686 | 3.94M | assert(c->look > 0); |
687 | 3.94M | assert(ii + lit + ahead == c->bp); |
688 | | |
689 | | #if defined(LZO1Z) |
690 | 1.71M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) |
691 | 136k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) |
692 | 6.86k | c->m_len = 0; |
693 | | #endif |
694 | 3.94M | if (c->m_len < m_len) |
695 | 2.37M | continue; |
696 | 1.57M | #if 1 |
697 | 1.57M | if (c->m_len == m_len && c->m_off >= m_off) |
698 | 312k | continue; |
699 | 1.25M | #endif |
700 | 1.25M | #if defined(SWD_BEST_OFF) |
701 | 1.25M | if (swd->use_best_off) |
702 | 1.25M | better_match(swd,&c->m_len,&c->m_off); |
703 | 1.25M | #endif |
704 | 1.25M | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); |
705 | 1.25M | if (l2 == 0) |
706 | 7.03k | continue; |
707 | | #if 0 |
708 | | if (c->m_len == m_len && l2 >= l1) |
709 | | continue; |
710 | | #endif |
711 | | |
712 | | |
713 | 1.25M | #if 1 |
714 | | /* compressed-data compatibility [see above] */ |
715 | 1.25M | 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.25M | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); |
721 | 1.25M | if (c->m_len >= m_len + lazy_match_min_gain) |
722 | 570k | { |
723 | 570k | c->lazy++; |
724 | 570k | assert_match(swd,c->m_len,c->m_off); |
725 | | |
726 | 570k | if (l3) |
727 | 3.48k | { |
728 | | /* code previous run */ |
729 | 3.48k | op = code_run(c,op,ii,lit,ahead); |
730 | 3.48k | lit = 0; |
731 | | /* code shortened match */ |
732 | 3.48k | op = code_match(c,op,ahead,m_off); |
733 | 3.48k | } |
734 | 567k | else |
735 | 567k | { |
736 | 567k | lit += ahead; |
737 | 567k | assert(ii + lit == c->bp); |
738 | 567k | } |
739 | 570k | goto lazy_match_done; |
740 | 570k | } |
741 | 1.25M | } |
742 | | |
743 | | |
744 | 3.06M | assert(ii + lit + ahead == c->bp); |
745 | | |
746 | | /* 1 - code run */ |
747 | 2.49M | op = code_run(c,op,ii,lit,m_len); |
748 | 2.49M | lit = 0; |
749 | | |
750 | | /* 2 - code match */ |
751 | 2.49M | op = code_match(c,op,m_len,m_off); |
752 | 2.49M | swd->max_chain = max_chain; |
753 | 2.49M | r = find_match(c,swd,m_len,1+ahead); |
754 | 2.49M | assert(r == 0); LZO_UNUSED(r); |
755 | | |
756 | 3.06M | lazy_match_done: ; |
757 | 3.06M | } |
758 | | |
759 | | |
760 | | /* store final run */ |
761 | 4.00k | if (lit > 0) |
762 | 2.44k | op = STORE_RUN(c,op,ii,lit); |
763 | | |
764 | 4.00k | #if defined(LZO_EOF_CODE) |
765 | 4.00k | *op++ = M4_MARKER | 1; |
766 | 4.00k | *op++ = 0; |
767 | 4.00k | *op++ = 0; |
768 | 4.00k | #endif |
769 | | |
770 | 4.00k | c->codesize = pd(op, out); |
771 | 4.00k | assert(c->textsize == in_len); |
772 | | |
773 | 4.00k | *out_len = pd(op, out); |
774 | | |
775 | 4.00k | 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 | 4.00k | assert(c->lit_bytes + c->match_bytes == in_len); |
785 | | |
786 | 4.00k | return LZO_E_OK; |
787 | 4.00k | } lzo1x_999_compress_internal Line | Count | Source | 532 | 1.22k | { | 533 | 1.22k | lzo_bytep op; | 534 | 1.22k | const lzo_bytep ii; | 535 | 1.22k | lzo_uint lit; | 536 | 1.22k | lzo_uint m_len, m_off; | 537 | 1.22k | LZO_COMPRESS_T cc; | 538 | 1.22k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.22k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.22k | lzo_uint try_lazy; | 541 | 1.22k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | 1.22k | #if defined(LZO1X) | 545 | 1.22k | 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.22k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.22k | 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.22k | 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.22k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.22k | if (nice_length == 0) | 567 | 1.22k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.22k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.22k | c->init = 0; | 573 | 1.22k | c->ip = c->in = in; | 574 | 1.22k | c->in_end = in + in_len; | 575 | 1.22k | c->out = out; | 576 | 1.22k | c->cb = cb; | 577 | 1.22k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.22k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.22k | op = out; | 581 | 1.22k | ii = c->ip; /* point to start of literal run */ | 582 | 1.22k | lit = 0; | 583 | 1.22k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.22k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.22k | if (r != 0) | 587 | 0 | return r; | 588 | 1.22k | if (max_chain > 0) | 589 | 1.22k | swd->max_chain = max_chain; | 590 | 1.22k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.22k | r = find_match(c,swd,0,0); | 594 | 1.22k | if (r != 0) | 595 | 0 | return r; | 596 | 10.7M | while (c->look > 0) | 597 | 10.7M | { | 598 | 10.7M | lzo_uint ahead; | 599 | 10.7M | lzo_uint max_ahead; | 600 | 10.7M | lzo_uint l1, l2, l3; | 601 | | | 602 | 10.7M | c->codesize = pd(op, out); | 603 | | | 604 | 10.7M | m_len = c->m_len; | 605 | 10.7M | m_off = c->m_off; | 606 | | | 607 | 10.7M | assert(c->bp == c->ip - c->look); | 608 | 10.7M | assert(c->bp >= in); | 609 | 10.7M | if (lit == 0) | 610 | 757k | ii = c->bp; | 611 | 10.7M | assert(ii + lit == c->bp); | 612 | 10.7M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 10.7M | if ( m_len < 2 || | 615 | 5.14M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 949k | #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 | 949k | (m_len == 2 && op == out) || | 622 | 948k | #endif | 623 | 948k | (op == out && lit == 0)) | 624 | 9.79M | { | 625 | | /* a literal */ | 626 | 9.79M | m_len = 0; | 627 | 9.79M | } | 628 | 948k | else if (m_len == M2_MIN_LEN) | 629 | 181k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 181k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 26.7k | m_len = 0; | 633 | 181k | } | 634 | | | 635 | 10.7M | if (m_len == 0) | 636 | 9.82M | { | 637 | | /* a literal */ | 638 | 9.82M | lit++; | 639 | 9.82M | swd->max_chain = max_chain; | 640 | 9.82M | r = find_match(c,swd,1,0); | 641 | 9.82M | assert(r == 0); LZO_UNUSED(r); | 642 | 9.82M | continue; | 643 | 9.82M | } | 644 | | | 645 | | /* a match */ | 646 | 922k | #if defined(SWD_BEST_OFF) | 647 | 922k | if (swd->use_best_off) | 648 | 922k | better_match(swd,&m_len,&m_off); | 649 | 922k | #endif | 650 | 922k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 922k | ahead = 0; | 655 | 922k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 14.4k | { | 657 | | /* no */ | 658 | 14.4k | l1 = 0; | 659 | 14.4k | max_ahead = 0; | 660 | 14.4k | } | 661 | 907k | else | 662 | 907k | { | 663 | | /* yes, try a lazy match */ | 664 | 907k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 907k | assert(l1 > 0); | 666 | 907k | #if 1 | 667 | 907k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 907k | } | 672 | | | 673 | | | 674 | 1.91M | 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 | 61.2k | swd->max_chain = max_chain >> 2; | 680 | 1.09M | else | 681 | 1.09M | 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 | 696k | continue; | 696 | 459k | #if 1 | 697 | 459k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 81.8k | continue; | 699 | 377k | #endif | 700 | 377k | #if defined(SWD_BEST_OFF) | 701 | 377k | if (swd->use_best_off) | 702 | 377k | better_match(swd,&c->m_len,&c->m_off); | 703 | 377k | #endif | 704 | 377k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 377k | if (l2 == 0) | 706 | 2.06k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 375k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 375k | 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 | 375k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 375k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 167k | { | 723 | 167k | c->lazy++; | 724 | 167k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 167k | if (l3) | 727 | 1.24k | { | 728 | | /* code previous run */ | 729 | 1.24k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.24k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.24k | op = code_match(c,op,ahead,m_off); | 733 | 1.24k | } | 734 | 165k | else | 735 | 165k | { | 736 | 165k | lit += ahead; | 737 | 165k | assert(ii + lit == c->bp); | 738 | 165k | } | 739 | 167k | goto lazy_match_done; | 740 | 167k | } | 741 | 375k | } | 742 | | | 743 | | | 744 | 922k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 755k | op = code_run(c,op,ii,lit,m_len); | 748 | 755k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 755k | op = code_match(c,op,m_len,m_off); | 752 | 755k | swd->max_chain = max_chain; | 753 | 755k | r = find_match(c,swd,m_len,1+ahead); | 754 | 755k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 922k | lazy_match_done: ; | 757 | 922k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.22k | if (lit > 0) | 762 | 727 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.22k | #if defined(LZO_EOF_CODE) | 765 | 1.22k | *op++ = M4_MARKER | 1; | 766 | 1.22k | *op++ = 0; | 767 | 1.22k | *op++ = 0; | 768 | 1.22k | #endif | 769 | | | 770 | 1.22k | c->codesize = pd(op, out); | 771 | 1.22k | assert(c->textsize == in_len); | 772 | | | 773 | 1.22k | *out_len = pd(op, out); | 774 | | | 775 | 1.22k | 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.22k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.22k | return LZO_E_OK; | 787 | 1.22k | } |
lzo1y_999_compress_internal Line | Count | Source | 532 | 1.26k | { | 533 | 1.26k | lzo_bytep op; | 534 | 1.26k | const lzo_bytep ii; | 535 | 1.26k | lzo_uint lit; | 536 | 1.26k | lzo_uint m_len, m_off; | 537 | 1.26k | LZO_COMPRESS_T cc; | 538 | 1.26k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.26k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.26k | lzo_uint try_lazy; | 541 | 1.26k | 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.26k | 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.26k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.26k | 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.26k | 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.26k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.26k | if (nice_length == 0) | 567 | 1.26k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.26k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.26k | c->init = 0; | 573 | 1.26k | c->ip = c->in = in; | 574 | 1.26k | c->in_end = in + in_len; | 575 | 1.26k | c->out = out; | 576 | 1.26k | c->cb = cb; | 577 | 1.26k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.26k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.26k | op = out; | 581 | 1.26k | ii = c->ip; /* point to start of literal run */ | 582 | 1.26k | lit = 0; | 583 | 1.26k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.26k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.26k | if (r != 0) | 587 | 0 | return r; | 588 | 1.26k | if (max_chain > 0) | 589 | 1.26k | swd->max_chain = max_chain; | 590 | 1.26k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.26k | r = find_match(c,swd,0,0); | 594 | 1.26k | if (r != 0) | 595 | 0 | return r; | 596 | 17.4M | while (c->look > 0) | 597 | 17.4M | { | 598 | 17.4M | lzo_uint ahead; | 599 | 17.4M | lzo_uint max_ahead; | 600 | 17.4M | lzo_uint l1, l2, l3; | 601 | | | 602 | 17.4M | c->codesize = pd(op, out); | 603 | | | 604 | 17.4M | m_len = c->m_len; | 605 | 17.4M | m_off = c->m_off; | 606 | | | 607 | 17.4M | assert(c->bp == c->ip - c->look); | 608 | 17.4M | assert(c->bp >= in); | 609 | 17.4M | if (lit == 0) | 610 | 707k | ii = c->bp; | 611 | 17.4M | assert(ii + lit == c->bp); | 612 | 17.4M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 17.4M | if ( m_len < 2 || | 615 | 8.88M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 936k | #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 | 936k | (m_len == 2 && op == out) || | 622 | 936k | #endif | 623 | 936k | (op == out && lit == 0)) | 624 | 16.5M | { | 625 | | /* a literal */ | 626 | 16.5M | m_len = 0; | 627 | 16.5M | } | 628 | 936k | else if (m_len == M2_MIN_LEN) | 629 | 223k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 223k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 78.2k | m_len = 0; | 633 | 223k | } | 634 | | | 635 | 17.4M | if (m_len == 0) | 636 | 16.5M | { | 637 | | /* a literal */ | 638 | 16.5M | lit++; | 639 | 16.5M | swd->max_chain = max_chain; | 640 | 16.5M | r = find_match(c,swd,1,0); | 641 | 16.5M | assert(r == 0); LZO_UNUSED(r); | 642 | 16.5M | continue; | 643 | 16.5M | } | 644 | | | 645 | | /* a match */ | 646 | 858k | #if defined(SWD_BEST_OFF) | 647 | 858k | if (swd->use_best_off) | 648 | 858k | better_match(swd,&m_len,&m_off); | 649 | 858k | #endif | 650 | 858k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 858k | ahead = 0; | 655 | 858k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 14.8k | { | 657 | | /* no */ | 658 | 14.8k | l1 = 0; | 659 | 14.8k | max_ahead = 0; | 660 | 14.8k | } | 661 | 843k | else | 662 | 843k | { | 663 | | /* yes, try a lazy match */ | 664 | 843k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 843k | assert(l1 > 0); | 666 | 843k | #if 1 | 667 | 843k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 843k | } | 672 | | | 673 | | | 674 | 1.77M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.07M | { | 676 | 1.07M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.07M | if (m_len >= good_length) | 679 | 64.8k | swd->max_chain = max_chain >> 2; | 680 | 1.00M | else | 681 | 1.00M | swd->max_chain = max_chain; | 682 | 1.07M | r = find_match(c,swd,1,0); | 683 | 1.07M | ahead++; | 684 | | | 685 | 1.07M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.07M | assert(c->look > 0); | 687 | 1.07M | 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.07M | if (c->m_len < m_len) | 695 | 616k | continue; | 696 | 455k | #if 1 | 697 | 455k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 83.4k | continue; | 699 | 371k | #endif | 700 | 371k | #if defined(SWD_BEST_OFF) | 701 | 371k | if (swd->use_best_off) | 702 | 371k | better_match(swd,&c->m_len,&c->m_off); | 703 | 371k | #endif | 704 | 371k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 371k | if (l2 == 0) | 706 | 1.74k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 370k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 370k | 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 | 370k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 370k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 152k | { | 723 | 152k | c->lazy++; | 724 | 152k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 152k | if (l3) | 727 | 984 | { | 728 | | /* code previous run */ | 729 | 984 | op = code_run(c,op,ii,lit,ahead); | 730 | 984 | lit = 0; | 731 | | /* code shortened match */ | 732 | 984 | op = code_match(c,op,ahead,m_off); | 733 | 984 | } | 734 | 151k | else | 735 | 151k | { | 736 | 151k | lit += ahead; | 737 | 151k | assert(ii + lit == c->bp); | 738 | 151k | } | 739 | 152k | goto lazy_match_done; | 740 | 152k | } | 741 | 370k | } | 742 | | | 743 | | | 744 | 858k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 705k | op = code_run(c,op,ii,lit,m_len); | 748 | 705k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 705k | op = code_match(c,op,m_len,m_off); | 752 | 705k | swd->max_chain = max_chain; | 753 | 705k | r = find_match(c,swd,m_len,1+ahead); | 754 | 705k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 858k | lazy_match_done: ; | 757 | 858k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.26k | if (lit > 0) | 762 | 761 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.26k | #if defined(LZO_EOF_CODE) | 765 | 1.26k | *op++ = M4_MARKER | 1; | 766 | 1.26k | *op++ = 0; | 767 | 1.26k | *op++ = 0; | 768 | 1.26k | #endif | 769 | | | 770 | 1.26k | c->codesize = pd(op, out); | 771 | 1.26k | assert(c->textsize == in_len); | 772 | | | 773 | 1.26k | *out_len = pd(op, out); | 774 | | | 775 | 1.26k | 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.26k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.26k | return LZO_E_OK; | 787 | 1.26k | } |
lzo1z_999_compress_internal Line | Count | Source | 532 | 1.51k | { | 533 | 1.51k | lzo_bytep op; | 534 | 1.51k | const lzo_bytep ii; | 535 | 1.51k | lzo_uint lit; | 536 | 1.51k | lzo_uint m_len, m_off; | 537 | 1.51k | LZO_COMPRESS_T cc; | 538 | 1.51k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.51k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.51k | lzo_uint try_lazy; | 541 | 1.51k | 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.51k | 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.51k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.51k | 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.51k | 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.51k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.51k | if (nice_length == 0) | 567 | 1.51k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.51k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.51k | c->init = 0; | 573 | 1.51k | c->ip = c->in = in; | 574 | 1.51k | c->in_end = in + in_len; | 575 | 1.51k | c->out = out; | 576 | 1.51k | c->cb = cb; | 577 | 1.51k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.51k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.51k | op = out; | 581 | 1.51k | ii = c->ip; /* point to start of literal run */ | 582 | 1.51k | lit = 0; | 583 | 1.51k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.51k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.51k | if (r != 0) | 587 | 0 | return r; | 588 | 1.51k | if (max_chain > 0) | 589 | 1.51k | swd->max_chain = max_chain; | 590 | 1.51k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.51k | r = find_match(c,swd,0,0); | 594 | 1.51k | if (r != 0) | 595 | 0 | return r; | 596 | 13.0M | while (c->look > 0) | 597 | 13.0M | { | 598 | 13.0M | lzo_uint ahead; | 599 | 13.0M | lzo_uint max_ahead; | 600 | 13.0M | lzo_uint l1, l2, l3; | 601 | | | 602 | 13.0M | c->codesize = pd(op, out); | 603 | | | 604 | 13.0M | m_len = c->m_len; | 605 | 13.0M | m_off = c->m_off; | 606 | | | 607 | 13.0M | assert(c->bp == c->ip - c->look); | 608 | 13.0M | assert(c->bp >= in); | 609 | 13.0M | if (lit == 0) | 610 | 1.03M | ii = c->bp; | 611 | 13.0M | assert(ii + lit == c->bp); | 612 | 13.0M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 13.0M | if ( m_len < 2 || | 615 | 6.40M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 1.33M | #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 | 1.33M | (m_len == 2 && op == out) || | 622 | 1.33M | #endif | 623 | 1.33M | (op == out && lit == 0)) | 624 | 11.6M | { | 625 | | /* a literal */ | 626 | 11.6M | m_len = 0; | 627 | 11.6M | } | 628 | 1.33M | else if (m_len == M2_MIN_LEN) | 629 | 367k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 367k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 52.1k | m_len = 0; | 633 | 367k | } | 634 | | | 635 | 13.0M | if (m_len == 0) | 636 | 11.7M | { | 637 | | /* a literal */ | 638 | 11.7M | lit++; | 639 | 11.7M | swd->max_chain = max_chain; | 640 | 11.7M | r = find_match(c,swd,1,0); | 641 | 11.7M | assert(r == 0); LZO_UNUSED(r); | 642 | 11.7M | continue; | 643 | 11.7M | } | 644 | | | 645 | | /* a match */ | 646 | 1.28M | #if defined(SWD_BEST_OFF) | 647 | 1.28M | if (swd->use_best_off) | 648 | 1.28M | better_match(swd,&m_len,&m_off); | 649 | 1.28M | #endif | 650 | 1.28M | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 1.28M | ahead = 0; | 655 | 1.28M | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 16.4k | { | 657 | | /* no */ | 658 | 16.4k | l1 = 0; | 659 | 16.4k | max_ahead = 0; | 660 | 16.4k | } | 661 | 1.26M | else | 662 | 1.26M | { | 663 | | /* yes, try a lazy match */ | 664 | 1.26M | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 1.26M | assert(l1 > 0); | 666 | 1.26M | #if 1 | 667 | 1.26M | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 1.26M | } | 672 | | | 673 | | | 674 | 2.75M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.71M | { | 676 | 1.71M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.71M | if (m_len >= good_length) | 679 | 67.3k | swd->max_chain = max_chain >> 2; | 680 | 1.64M | else | 681 | 1.64M | swd->max_chain = max_chain; | 682 | 1.71M | r = find_match(c,swd,1,0); | 683 | 1.71M | ahead++; | 684 | | | 685 | 1.71M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.71M | assert(c->look > 0); | 687 | 1.71M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | 1.71M | #if defined(LZO1Z) | 690 | 1.71M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | 136k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | 6.86k | c->m_len = 0; | 693 | 1.71M | #endif | 694 | 1.71M | if (c->m_len < m_len) | 695 | 1.06M | continue; | 696 | 655k | #if 1 | 697 | 655k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 147k | continue; | 699 | 508k | #endif | 700 | 508k | #if defined(SWD_BEST_OFF) | 701 | 508k | if (swd->use_best_off) | 702 | 508k | better_match(swd,&c->m_len,&c->m_off); | 703 | 508k | #endif | 704 | 508k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 508k | if (l2 == 0) | 706 | 3.22k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 505k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 505k | 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 | 505k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 505k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 250k | { | 723 | 250k | c->lazy++; | 724 | 250k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 250k | if (l3) | 727 | 1.25k | { | 728 | | /* code previous run */ | 729 | 1.25k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.25k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.25k | op = code_match(c,op,ahead,m_off); | 733 | 1.25k | } | 734 | 249k | else | 735 | 249k | { | 736 | 249k | lit += ahead; | 737 | 249k | assert(ii + lit == c->bp); | 738 | 249k | } | 739 | 250k | goto lazy_match_done; | 740 | 250k | } | 741 | 505k | } | 742 | | | 743 | | | 744 | 1.28M | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 1.03M | op = code_run(c,op,ii,lit,m_len); | 748 | 1.03M | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 1.03M | op = code_match(c,op,m_len,m_off); | 752 | 1.03M | swd->max_chain = max_chain; | 753 | 1.03M | r = find_match(c,swd,m_len,1+ahead); | 754 | 1.03M | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 1.28M | lazy_match_done: ; | 757 | 1.28M | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.51k | if (lit > 0) | 762 | 959 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.51k | #if defined(LZO_EOF_CODE) | 765 | 1.51k | *op++ = M4_MARKER | 1; | 766 | 1.51k | *op++ = 0; | 767 | 1.51k | *op++ = 0; | 768 | 1.51k | #endif | 769 | | | 770 | 1.51k | c->codesize = pd(op, out); | 771 | 1.51k | assert(c->textsize == in_len); | 772 | | | 773 | 1.51k | *out_len = pd(op, out); | 774 | | | 775 | 1.51k | 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.51k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.51k | return LZO_E_OK; | 787 | 1.51k | } |
|
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 | 4.00k | { |
802 | 4.00k | static const struct |
803 | 4.00k | { |
804 | 4.00k | int try_lazy_parm; |
805 | 4.00k | lzo_uint good_length; |
806 | 4.00k | lzo_uint max_lazy; |
807 | 4.00k | lzo_uint nice_length; |
808 | 4.00k | lzo_uint max_chain; |
809 | 4.00k | lzo_uint32_t flags; |
810 | 4.00k | } c[9] = { |
811 | | /* faster compression */ |
812 | 4.00k | { 0, 0, 0, 8, 4, 0 }, |
813 | 4.00k | { 0, 0, 0, 16, 8, 0 }, |
814 | 4.00k | { 0, 0, 0, 32, 16, 0 }, |
815 | 4.00k | { 1, 4, 4, 16, 16, 0 }, |
816 | 4.00k | { 1, 8, 16, 32, 32, 0 }, |
817 | 4.00k | { 1, 8, 16, 128, 128, 0 }, |
818 | 4.00k | { 2, 8, 32, 128, 256, 0 }, |
819 | 4.00k | { 2, 32, 128, SWD_F, 2048, 1 }, |
820 | 4.00k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } |
821 | | /* max. compression */ |
822 | 4.00k | }; |
823 | | |
824 | 4.00k | if (compression_level < 1 || compression_level > 9) |
825 | 0 | return LZO_E_ERROR; |
826 | | |
827 | 4.00k | compression_level -= 1; |
828 | 4.00k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, |
829 | 4.00k | dict, dict_len, cb, |
830 | 4.00k | c[compression_level].try_lazy_parm, |
831 | 4.00k | c[compression_level].good_length, |
832 | 4.00k | c[compression_level].max_lazy, |
833 | | #if 0 |
834 | | c[compression_level].nice_length, |
835 | | #else |
836 | 4.00k | 0, |
837 | 4.00k | #endif |
838 | 4.00k | c[compression_level].max_chain, |
839 | 4.00k | c[compression_level].flags); |
840 | 4.00k | } Line | Count | Source | 801 | 1.22k | { | 802 | 1.22k | static const struct | 803 | 1.22k | { | 804 | 1.22k | int try_lazy_parm; | 805 | 1.22k | lzo_uint good_length; | 806 | 1.22k | lzo_uint max_lazy; | 807 | 1.22k | lzo_uint nice_length; | 808 | 1.22k | lzo_uint max_chain; | 809 | 1.22k | lzo_uint32_t flags; | 810 | 1.22k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.22k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.22k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.22k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.22k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.22k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.22k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.22k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.22k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.22k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.22k | }; | 823 | | | 824 | 1.22k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.22k | compression_level -= 1; | 828 | 1.22k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.22k | dict, dict_len, cb, | 830 | 1.22k | c[compression_level].try_lazy_parm, | 831 | 1.22k | c[compression_level].good_length, | 832 | 1.22k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.22k | 0, | 837 | 1.22k | #endif | 838 | 1.22k | c[compression_level].max_chain, | 839 | 1.22k | c[compression_level].flags); | 840 | 1.22k | } |
Line | Count | Source | 801 | 1.26k | { | 802 | 1.26k | static const struct | 803 | 1.26k | { | 804 | 1.26k | int try_lazy_parm; | 805 | 1.26k | lzo_uint good_length; | 806 | 1.26k | lzo_uint max_lazy; | 807 | 1.26k | lzo_uint nice_length; | 808 | 1.26k | lzo_uint max_chain; | 809 | 1.26k | lzo_uint32_t flags; | 810 | 1.26k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.26k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.26k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.26k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.26k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.26k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.26k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.26k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.26k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.26k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.26k | }; | 823 | | | 824 | 1.26k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.26k | compression_level -= 1; | 828 | 1.26k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.26k | dict, dict_len, cb, | 830 | 1.26k | c[compression_level].try_lazy_parm, | 831 | 1.26k | c[compression_level].good_length, | 832 | 1.26k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.26k | 0, | 837 | 1.26k | #endif | 838 | 1.26k | c[compression_level].max_chain, | 839 | 1.26k | c[compression_level].flags); | 840 | 1.26k | } |
Line | Count | Source | 801 | 1.51k | { | 802 | 1.51k | static const struct | 803 | 1.51k | { | 804 | 1.51k | int try_lazy_parm; | 805 | 1.51k | lzo_uint good_length; | 806 | 1.51k | lzo_uint max_lazy; | 807 | 1.51k | lzo_uint nice_length; | 808 | 1.51k | lzo_uint max_chain; | 809 | 1.51k | lzo_uint32_t flags; | 810 | 1.51k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.51k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.51k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.51k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.51k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.51k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.51k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.51k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.51k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.51k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.51k | }; | 823 | | | 824 | 1.51k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.51k | compression_level -= 1; | 828 | 1.51k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.51k | dict, dict_len, cb, | 830 | 1.51k | c[compression_level].try_lazy_parm, | 831 | 1.51k | c[compression_level].good_length, | 832 | 1.51k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.51k | 0, | 837 | 1.51k | #endif | 838 | 1.51k | c[compression_level].max_chain, | 839 | 1.51k | c[compression_level].flags); | 840 | 1.51k | } |
|
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 | 4.00k | { |
862 | 4.00k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, |
863 | | NULL, 0, (lzo_callback_p) 0, 8); |
864 | 4.00k | } Line | Count | Source | 861 | 1.22k | { | 862 | 1.22k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.22k | } |
Line | Count | Source | 861 | 1.26k | { | 862 | 1.26k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.26k | } |
Line | Count | Source | 861 | 1.51k | { | 862 | 1.51k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.51k | } |
|
865 | | |
866 | | |
867 | | /* vim:set ts=4 sw=4 et: */ |