/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.40k | #define SWD_N M4_MAX_OFFSET /* size of ring buffer */ |
49 | 39.5M | #define SWD_THRESHOLD 1 /* lower limit for match length */ |
50 | 22.0k | #define SWD_F 2048 /* upper limit for match length */ |
51 | | |
52 | 1.38G | #define SWD_BEST_OFF (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1) |
53 | | |
54 | | #if defined(LZO1X) |
55 | 2.67k | # define LZO_COMPRESS_T lzo1x_999_t |
56 | 1.33k | # define lzo_swd_t lzo1x_999_swd_t |
57 | | #elif defined(LZO1Y) |
58 | 2.81k | # define LZO_COMPRESS_T lzo1y_999_t |
59 | 1.40k | # define lzo_swd_t lzo1y_999_swd_t |
60 | 1.40k | # define lzo1x_999_compress_internal lzo1y_999_compress_internal |
61 | | # define lzo1x_999_compress_dict lzo1y_999_compress_dict |
62 | 1.40k | # define lzo1x_999_compress_level lzo1y_999_compress_level |
63 | | # define lzo1x_999_compress lzo1y_999_compress |
64 | | #elif defined(LZO1Z) |
65 | 3.32k | # define LZO_COMPRESS_T lzo1z_999_t |
66 | 1.66k | # define lzo_swd_t lzo1z_999_swd_t |
67 | 1.66k | # define lzo1x_999_compress_internal lzo1z_999_compress_internal |
68 | | # define lzo1x_999_compress_dict lzo1z_999_compress_dict |
69 | 1.66k | # 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.46M | { |
109 | 2.46M | lzo_uint x_len = m_len; |
110 | 2.46M | lzo_uint x_off = m_off; |
111 | | |
112 | 2.46M | 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.46M | assert(op > c->out); |
143 | 2.46M | if (m_len == 2) |
144 | 948k | { |
145 | 948k | assert(m_off <= M1_MAX_OFFSET); |
146 | 948k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); |
147 | 948k | m_off -= 1; |
148 | | #if defined(LZO1Z) |
149 | 408k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
150 | 408k | *op++ = LZO_BYTE(m_off << 2); |
151 | | #else |
152 | 540k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
153 | 540k | *op++ = LZO_BYTE(m_off >> 2); |
154 | | #endif |
155 | 948k | c->m1a_m++; |
156 | 948k | } |
157 | | #if defined(LZO1Z) |
158 | 531k | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) |
159 | | #else |
160 | 986k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
161 | 514k | #endif |
162 | 790k | { |
163 | 790k | assert(m_len >= 3); |
164 | | #if defined(LZO1X) |
165 | | m_off -= 1; |
166 | 274k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); |
167 | 274k | *op++ = LZO_BYTE(m_off >> 3); |
168 | | assert(op[-2] >= M2_MARKER); |
169 | | #elif defined(LZO1Y) |
170 | | m_off -= 1; |
171 | 240k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); |
172 | 240k | *op++ = LZO_BYTE(m_off >> 2); |
173 | | assert(op[-2] >= M2_MARKER); |
174 | | #elif defined(LZO1Z) |
175 | 275k | if (m_off == c->last_m_off) |
176 | 12.7k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); |
177 | 263k | else |
178 | 263k | { |
179 | 263k | m_off -= 1; |
180 | 263k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); |
181 | 263k | *op++ = LZO_BYTE(m_off << 2); |
182 | 263k | } |
183 | | #endif |
184 | 790k | c->m2_m++; |
185 | 790k | } |
186 | 728k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) |
187 | 10.0k | { |
188 | 10.0k | assert(m_len == 3); |
189 | 10.0k | assert(m_off > M2_MAX_OFFSET); |
190 | 10.0k | m_off -= 1 + M2_MAX_OFFSET; |
191 | | #if defined(LZO1Z) |
192 | 3.15k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
193 | 3.15k | *op++ = LZO_BYTE(m_off << 2); |
194 | | #else |
195 | 6.87k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
196 | 6.87k | *op++ = LZO_BYTE(m_off >> 2); |
197 | | #endif |
198 | 10.0k | c->m1b_m++; |
199 | 10.0k | } |
200 | 718k | else if (m_off <= M3_MAX_OFFSET) |
201 | 588k | { |
202 | 588k | assert(m_len >= 3); |
203 | 588k | m_off -= 1; |
204 | 588k | if (m_len <= M3_MAX_LEN) |
205 | 472k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); |
206 | 115k | else |
207 | 115k | { |
208 | 115k | m_len -= M3_MAX_LEN; |
209 | 115k | *op++ = M3_MARKER | 0; |
210 | 207k | while (m_len > 255) |
211 | 91.4k | { |
212 | 91.4k | m_len -= 255; |
213 | 91.4k | *op++ = 0; |
214 | 91.4k | } |
215 | 115k | assert(m_len > 0); |
216 | 115k | *op++ = LZO_BYTE(m_len); |
217 | 115k | } |
218 | | #if defined(LZO1Z) |
219 | 209k | *op++ = LZO_BYTE(m_off >> 6); |
220 | 209k | *op++ = LZO_BYTE(m_off << 2); |
221 | | #else |
222 | 378k | *op++ = LZO_BYTE(m_off << 2); |
223 | 378k | *op++ = LZO_BYTE(m_off >> 6); |
224 | | #endif |
225 | 588k | c->m3_m++; |
226 | 588k | } |
227 | 129k | else |
228 | 129k | { |
229 | 129k | lzo_uint k; |
230 | | |
231 | 129k | assert(m_len >= 3); |
232 | 129k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); |
233 | 129k | m_off -= 0x4000; |
234 | 129k | k = (m_off & 0x4000) >> 11; |
235 | 129k | if (m_len <= M4_MAX_LEN) |
236 | 86.5k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); |
237 | 43.2k | else |
238 | 43.2k | { |
239 | 43.2k | m_len -= M4_MAX_LEN; |
240 | 43.2k | *op++ = LZO_BYTE(M4_MARKER | k | 0); |
241 | 62.7k | while (m_len > 255) |
242 | 19.5k | { |
243 | 19.5k | m_len -= 255; |
244 | 19.5k | *op++ = 0; |
245 | 19.5k | } |
246 | 43.2k | assert(m_len > 0); |
247 | 43.2k | *op++ = LZO_BYTE(m_len); |
248 | 43.2k | } |
249 | | #if defined(LZO1Z) |
250 | 43.0k | *op++ = LZO_BYTE(m_off >> 6); |
251 | 43.0k | *op++ = LZO_BYTE(m_off << 2); |
252 | | #else |
253 | 86.6k | *op++ = LZO_BYTE(m_off << 2); |
254 | 86.6k | *op++ = LZO_BYTE(m_off >> 6); |
255 | | #endif |
256 | 129k | c->m4_m++; |
257 | 129k | } |
258 | | |
259 | 2.46M | c->last_m_len = x_len; |
260 | 2.46M | c->last_m_off = x_off; |
261 | 2.46M | return op; |
262 | 2.46M | } Line | Count | Source | 108 | 767k | { | 109 | 767k | lzo_uint x_len = m_len; | 110 | 767k | lzo_uint x_off = m_off; | 111 | | | 112 | 767k | 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 | 767k | assert(op > c->out); | 143 | 767k | if (m_len == 2) | 144 | 257k | { | 145 | 257k | assert(m_off <= M1_MAX_OFFSET); | 146 | 257k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 257k | 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 | 257k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 257k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 257k | #endif | 155 | 257k | c->m1a_m++; | 156 | 257k | } | 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 | 510k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 274k | #endif | 162 | 274k | { | 163 | 274k | assert(m_len >= 3); | 164 | 274k | #if defined(LZO1X) | 165 | 274k | m_off -= 1; | 166 | 274k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | 274k | *op++ = LZO_BYTE(m_off >> 3); | 168 | 274k | 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 | 274k | c->m2_m++; | 185 | 274k | } | 186 | 236k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 2.97k | { | 188 | 2.97k | assert(m_len == 3); | 189 | 2.97k | assert(m_off > M2_MAX_OFFSET); | 190 | 2.97k | 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.97k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 2.97k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 2.97k | #endif | 198 | 2.97k | c->m1b_m++; | 199 | 2.97k | } | 200 | 233k | 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 | 158k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 35.6k | else | 207 | 35.6k | { | 208 | 35.6k | m_len -= M3_MAX_LEN; | 209 | 35.6k | *op++ = M3_MARKER | 0; | 210 | 60.0k | while (m_len > 255) | 211 | 24.3k | { | 212 | 24.3k | m_len -= 255; | 213 | 24.3k | *op++ = 0; | 214 | 24.3k | } | 215 | 35.6k | assert(m_len > 0); | 216 | 35.6k | *op++ = LZO_BYTE(m_len); | 217 | 35.6k | } | 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 | 38.5k | else | 228 | 38.5k | { | 229 | 38.5k | lzo_uint k; | 230 | | | 231 | 38.5k | assert(m_len >= 3); | 232 | 38.5k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 38.5k | m_off -= 0x4000; | 234 | 38.5k | k = (m_off & 0x4000) >> 11; | 235 | 38.5k | if (m_len <= M4_MAX_LEN) | 236 | 23.5k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 14.9k | else | 238 | 14.9k | { | 239 | 14.9k | m_len -= M4_MAX_LEN; | 240 | 14.9k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 20.5k | while (m_len > 255) | 242 | 5.53k | { | 243 | 5.53k | m_len -= 255; | 244 | 5.53k | *op++ = 0; | 245 | 5.53k | } | 246 | 14.9k | assert(m_len > 0); | 247 | 14.9k | *op++ = LZO_BYTE(m_len); | 248 | 14.9k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 38.5k | *op++ = LZO_BYTE(m_off << 2); | 254 | 38.5k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 38.5k | #endif | 256 | 38.5k | c->m4_m++; | 257 | 38.5k | } | 258 | | | 259 | 767k | c->last_m_len = x_len; | 260 | 767k | c->last_m_off = x_off; | 261 | 767k | return op; | 262 | 767k | } |
Line | Count | Source | 108 | 759k | { | 109 | 759k | lzo_uint x_len = m_len; | 110 | 759k | lzo_uint x_off = m_off; | 111 | | | 112 | 759k | 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 | 759k | assert(op > c->out); | 143 | 759k | if (m_len == 2) | 144 | 282k | { | 145 | 282k | assert(m_off <= M1_MAX_OFFSET); | 146 | 282k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 282k | 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 | 282k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 282k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 282k | #endif | 155 | 282k | c->m1a_m++; | 156 | 282k | } | 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 | 476k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 240k | #endif | 162 | 240k | { | 163 | 240k | 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 | 240k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | 240k | *op++ = LZO_BYTE(m_off >> 2); | 173 | 240k | 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 | 240k | c->m2_m++; | 185 | 240k | } | 186 | 236k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 3.90k | { | 188 | 3.90k | assert(m_len == 3); | 189 | 3.90k | assert(m_off > M2_MAX_OFFSET); | 190 | 3.90k | m_off -= 1 + M2_MAX_OFFSET; | 191 | | #if defined(LZO1Z) | 192 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | | *op++ = LZO_BYTE(m_off << 2); | 194 | | #else | 195 | 3.90k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 3.90k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 3.90k | #endif | 198 | 3.90k | c->m1b_m++; | 199 | 3.90k | } | 200 | 232k | else if (m_off <= M3_MAX_OFFSET) | 201 | 184k | { | 202 | 184k | assert(m_len >= 3); | 203 | 184k | m_off -= 1; | 204 | 184k | if (m_len <= M3_MAX_LEN) | 205 | 145k | *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 | 67.5k | while (m_len > 255) | 211 | 29.1k | { | 212 | 29.1k | m_len -= 255; | 213 | 29.1k | *op++ = 0; | 214 | 29.1k | } | 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 | 184k | *op++ = LZO_BYTE(m_off << 2); | 223 | 184k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 184k | #endif | 225 | 184k | c->m3_m++; | 226 | 184k | } | 227 | 48.1k | else | 228 | 48.1k | { | 229 | 48.1k | lzo_uint k; | 230 | | | 231 | 48.1k | assert(m_len >= 3); | 232 | 48.1k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 48.1k | m_off -= 0x4000; | 234 | 48.1k | k = (m_off & 0x4000) >> 11; | 235 | 48.1k | if (m_len <= M4_MAX_LEN) | 236 | 35.2k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 12.8k | else | 238 | 12.8k | { | 239 | 12.8k | m_len -= M4_MAX_LEN; | 240 | 12.8k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 19.2k | while (m_len > 255) | 242 | 6.37k | { | 243 | 6.37k | m_len -= 255; | 244 | 6.37k | *op++ = 0; | 245 | 6.37k | } | 246 | 12.8k | assert(m_len > 0); | 247 | 12.8k | *op++ = LZO_BYTE(m_len); | 248 | 12.8k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 48.1k | *op++ = LZO_BYTE(m_off << 2); | 254 | 48.1k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 48.1k | #endif | 256 | 48.1k | c->m4_m++; | 257 | 48.1k | } | 258 | | | 259 | 759k | c->last_m_len = x_len; | 260 | 759k | c->last_m_off = x_off; | 261 | 759k | return op; | 262 | 759k | } |
Line | Count | Source | 108 | 940k | { | 109 | 940k | lzo_uint x_len = m_len; | 110 | 940k | lzo_uint x_off = m_off; | 111 | | | 112 | 940k | 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 | 940k | assert(op > c->out); | 143 | 940k | if (m_len == 2) | 144 | 408k | { | 145 | 408k | assert(m_off <= M1_MAX_OFFSET); | 146 | 408k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 408k | m_off -= 1; | 148 | 408k | #if defined(LZO1Z) | 149 | 408k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | 408k | *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 | 408k | c->m1a_m++; | 156 | 408k | } | 157 | 531k | #if defined(LZO1Z) | 158 | 531k | 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 | 275k | { | 163 | 275k | 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 | 275k | if (m_off == c->last_m_off) | 176 | 12.7k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | 263k | else | 178 | 263k | { | 179 | 263k | m_off -= 1; | 180 | 263k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | 263k | *op++ = LZO_BYTE(m_off << 2); | 182 | 263k | } | 183 | 275k | #endif | 184 | 275k | c->m2_m++; | 185 | 275k | } | 186 | 255k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 3.15k | { | 188 | 3.15k | assert(m_len == 3); | 189 | 3.15k | assert(m_off > M2_MAX_OFFSET); | 190 | 3.15k | m_off -= 1 + M2_MAX_OFFSET; | 191 | 3.15k | #if defined(LZO1Z) | 192 | 3.15k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | 3.15k | *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 | 3.15k | c->m1b_m++; | 199 | 3.15k | } | 200 | 252k | else if (m_off <= M3_MAX_OFFSET) | 201 | 209k | { | 202 | 209k | assert(m_len >= 3); | 203 | 209k | m_off -= 1; | 204 | 209k | if (m_len <= M3_MAX_LEN) | 205 | 167k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 41.9k | else | 207 | 41.9k | { | 208 | 41.9k | m_len -= M3_MAX_LEN; | 209 | 41.9k | *op++ = M3_MARKER | 0; | 210 | 79.8k | while (m_len > 255) | 211 | 37.9k | { | 212 | 37.9k | m_len -= 255; | 213 | 37.9k | *op++ = 0; | 214 | 37.9k | } | 215 | 41.9k | assert(m_len > 0); | 216 | 41.9k | *op++ = LZO_BYTE(m_len); | 217 | 41.9k | } | 218 | 209k | #if defined(LZO1Z) | 219 | 209k | *op++ = LZO_BYTE(m_off >> 6); | 220 | 209k | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | | *op++ = LZO_BYTE(m_off << 2); | 223 | | *op++ = LZO_BYTE(m_off >> 6); | 224 | | #endif | 225 | 209k | c->m3_m++; | 226 | 209k | } | 227 | 43.0k | else | 228 | 43.0k | { | 229 | 43.0k | lzo_uint k; | 230 | | | 231 | 43.0k | assert(m_len >= 3); | 232 | 43.0k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 43.0k | m_off -= 0x4000; | 234 | 43.0k | k = (m_off & 0x4000) >> 11; | 235 | 43.0k | if (m_len <= M4_MAX_LEN) | 236 | 27.7k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 15.3k | else | 238 | 15.3k | { | 239 | 15.3k | m_len -= M4_MAX_LEN; | 240 | 15.3k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 22.9k | while (m_len > 255) | 242 | 7.59k | { | 243 | 7.59k | m_len -= 255; | 244 | 7.59k | *op++ = 0; | 245 | 7.59k | } | 246 | 15.3k | assert(m_len > 0); | 247 | 15.3k | *op++ = LZO_BYTE(m_len); | 248 | 15.3k | } | 249 | 43.0k | #if defined(LZO1Z) | 250 | 43.0k | *op++ = LZO_BYTE(m_off >> 6); | 251 | 43.0k | *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 | 43.0k | c->m4_m++; | 257 | 43.0k | } | 258 | | | 259 | 940k | c->last_m_len = x_len; | 260 | 940k | c->last_m_off = x_off; | 261 | 940k | return op; | 262 | 940k | } |
|
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.89M | { |
268 | 1.89M | c->lit_bytes += t; |
269 | | |
270 | 1.89M | if (op == c->out && t <= 238) |
271 | 4.28k | { |
272 | 4.28k | *op++ = LZO_BYTE(17 + t); |
273 | 4.28k | } |
274 | 1.89M | else if (t <= 3) |
275 | 1.72M | { |
276 | | #if defined(LZO1Z) |
277 | 686k | op[-1] = LZO_BYTE(op[-1] | t); |
278 | | #else |
279 | 1.04M | op[-2] = LZO_BYTE(op[-2] | t); |
280 | | #endif |
281 | 1.72M | c->lit1_r++; |
282 | 1.72M | } |
283 | 168k | else if (t <= 18) |
284 | 104k | { |
285 | 104k | *op++ = LZO_BYTE(t - 3); |
286 | 104k | c->lit2_r++; |
287 | 104k | } |
288 | 64.3k | else |
289 | 64.3k | { |
290 | 64.3k | lzo_uint tt = t - 18; |
291 | | |
292 | 64.3k | *op++ = 0; |
293 | 167k | while (tt > 255) |
294 | 102k | { |
295 | 102k | tt -= 255; |
296 | 102k | *op++ = 0; |
297 | 102k | } |
298 | 64.3k | assert(tt > 0); |
299 | 64.3k | *op++ = LZO_BYTE(tt); |
300 | 64.3k | c->lit3_r++; |
301 | 64.3k | } |
302 | 34.0M | do *op++ = *ii++; while (--t > 0); |
303 | | |
304 | 1.89M | return op; |
305 | 1.89M | } Line | Count | Source | 267 | 568k | { | 268 | 568k | c->lit_bytes += t; | 269 | | | 270 | 568k | if (op == c->out && t <= 238) | 271 | 1.31k | { | 272 | 1.31k | *op++ = LZO_BYTE(17 + t); | 273 | 1.31k | } | 274 | 566k | else if (t <= 3) | 275 | 506k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 506k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 506k | #endif | 281 | 506k | c->lit1_r++; | 282 | 506k | } | 283 | 60.3k | else if (t <= 18) | 284 | 35.8k | { | 285 | 35.8k | *op++ = LZO_BYTE(t - 3); | 286 | 35.8k | c->lit2_r++; | 287 | 35.8k | } | 288 | 24.5k | else | 289 | 24.5k | { | 290 | 24.5k | lzo_uint tt = t - 18; | 291 | | | 292 | 24.5k | *op++ = 0; | 293 | 45.5k | while (tt > 255) | 294 | 20.9k | { | 295 | 20.9k | tt -= 255; | 296 | 20.9k | *op++ = 0; | 297 | 20.9k | } | 298 | 24.5k | assert(tt > 0); | 299 | 24.5k | *op++ = LZO_BYTE(tt); | 300 | 24.5k | c->lit3_r++; | 301 | 24.5k | } | 302 | 7.97M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 568k | return op; | 305 | 568k | } |
Line | Count | Source | 267 | 585k | { | 268 | 585k | c->lit_bytes += t; | 269 | | | 270 | 585k | if (op == c->out && t <= 238) | 271 | 1.36k | { | 272 | 1.36k | *op++ = LZO_BYTE(17 + t); | 273 | 1.36k | } | 274 | 583k | else if (t <= 3) | 275 | 533k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 533k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 533k | #endif | 281 | 533k | c->lit1_r++; | 282 | 533k | } | 283 | 50.2k | else if (t <= 18) | 284 | 31.9k | { | 285 | 31.9k | *op++ = LZO_BYTE(t - 3); | 286 | 31.9k | c->lit2_r++; | 287 | 31.9k | } | 288 | 18.3k | else | 289 | 18.3k | { | 290 | 18.3k | lzo_uint tt = t - 18; | 291 | | | 292 | 18.3k | *op++ = 0; | 293 | 71.9k | while (tt > 255) | 294 | 53.6k | { | 295 | 53.6k | tt -= 255; | 296 | 53.6k | *op++ = 0; | 297 | 53.6k | } | 298 | 18.3k | assert(tt > 0); | 299 | 18.3k | *op++ = LZO_BYTE(tt); | 300 | 18.3k | c->lit3_r++; | 301 | 18.3k | } | 302 | 16.0M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 585k | return op; | 305 | 585k | } |
Line | Count | Source | 267 | 746k | { | 268 | 746k | c->lit_bytes += t; | 269 | | | 270 | 746k | if (op == c->out && t <= 238) | 271 | 1.60k | { | 272 | 1.60k | *op++ = LZO_BYTE(17 + t); | 273 | 1.60k | } | 274 | 744k | else if (t <= 3) | 275 | 686k | { | 276 | 686k | #if defined(LZO1Z) | 277 | 686k | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | | op[-2] = LZO_BYTE(op[-2] | t); | 280 | | #endif | 281 | 686k | c->lit1_r++; | 282 | 686k | } | 283 | 58.1k | else if (t <= 18) | 284 | 36.6k | { | 285 | 36.6k | *op++ = LZO_BYTE(t - 3); | 286 | 36.6k | c->lit2_r++; | 287 | 36.6k | } | 288 | 21.4k | else | 289 | 21.4k | { | 290 | 21.4k | lzo_uint tt = t - 18; | 291 | | | 292 | 21.4k | *op++ = 0; | 293 | 49.6k | while (tt > 255) | 294 | 28.1k | { | 295 | 28.1k | tt -= 255; | 296 | 28.1k | *op++ = 0; | 297 | 28.1k | } | 298 | 21.4k | assert(tt > 0); | 299 | 21.4k | *op++ = LZO_BYTE(tt); | 300 | 21.4k | c->lit3_r++; | 301 | 21.4k | } | 302 | 10.0M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 746k | return op; | 305 | 746k | } |
|
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.46M | { |
312 | 2.46M | if (lit > 0) |
313 | 1.89M | { |
314 | 1.89M | assert(m_len >= 2); |
315 | 1.89M | op = STORE_RUN(c,op,ii,lit); |
316 | 1.89M | c->r1_m_len = m_len; |
317 | 1.89M | c->r1_lit = lit; |
318 | 1.89M | } |
319 | 570k | else |
320 | 570k | { |
321 | 570k | assert(m_len >= 3); |
322 | 570k | c->r1_m_len = 0; |
323 | 570k | c->r1_lit = 0; |
324 | 570k | } |
325 | | |
326 | 2.46M | return op; |
327 | 2.46M | } Line | Count | Source | 311 | 767k | { | 312 | 767k | if (lit > 0) | 313 | 567k | { | 314 | 567k | assert(m_len >= 2); | 315 | 567k | op = STORE_RUN(c,op,ii,lit); | 316 | 567k | c->r1_m_len = m_len; | 317 | 567k | c->r1_lit = lit; | 318 | 567k | } | 319 | 199k | else | 320 | 199k | { | 321 | 199k | assert(m_len >= 3); | 322 | 199k | c->r1_m_len = 0; | 323 | 199k | c->r1_lit = 0; | 324 | 199k | } | 325 | | | 326 | 767k | return op; | 327 | 767k | } |
Line | Count | Source | 311 | 759k | { | 312 | 759k | if (lit > 0) | 313 | 584k | { | 314 | 584k | assert(m_len >= 2); | 315 | 584k | op = STORE_RUN(c,op,ii,lit); | 316 | 584k | c->r1_m_len = m_len; | 317 | 584k | c->r1_lit = lit; | 318 | 584k | } | 319 | 175k | else | 320 | 175k | { | 321 | 175k | assert(m_len >= 3); | 322 | 175k | c->r1_m_len = 0; | 323 | 175k | c->r1_lit = 0; | 324 | 175k | } | 325 | | | 326 | 759k | return op; | 327 | 759k | } |
Line | Count | Source | 311 | 940k | { | 312 | 940k | if (lit > 0) | 313 | 744k | { | 314 | 744k | assert(m_len >= 2); | 315 | 744k | op = STORE_RUN(c,op,ii,lit); | 316 | 744k | c->r1_m_len = m_len; | 317 | 744k | c->r1_lit = lit; | 318 | 744k | } | 319 | 195k | else | 320 | 195k | { | 321 | 195k | assert(m_len >= 3); | 322 | 195k | c->r1_m_len = 0; | 323 | 195k | c->r1_lit = 0; | 324 | 195k | } | 325 | | | 326 | 940k | return op; | 327 | 940k | } |
|
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.49M | { |
337 | 5.49M | lzo_uint n = 4; |
338 | | |
339 | 5.49M | if (m_len < 2) |
340 | 1.16M | return 0; |
341 | 4.32M | if (m_len == 2) |
342 | 1.66M | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; |
343 | 2.66M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
344 | 1.24M | return 2; |
345 | 1.42M | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) |
346 | 12.1k | return 2; |
347 | 1.40M | if (m_off <= M3_MAX_OFFSET) |
348 | 1.13M | { |
349 | 1.13M | if (m_len <= M3_MAX_LEN) |
350 | 992k | return 3; |
351 | 139k | m_len -= M3_MAX_LEN; |
352 | 143k | while (m_len > 255) |
353 | 3.72k | { |
354 | 3.72k | m_len -= 255; |
355 | 3.72k | n++; |
356 | 3.72k | } |
357 | 139k | return n; |
358 | 1.13M | } |
359 | 277k | if (m_off <= M4_MAX_OFFSET) |
360 | 277k | { |
361 | 277k | if (m_len <= M4_MAX_LEN) |
362 | 200k | return 3; |
363 | 77.0k | m_len -= M4_MAX_LEN; |
364 | 78.9k | while (m_len > 255) |
365 | 1.96k | { |
366 | 1.96k | m_len -= 255; |
367 | 1.96k | n++; |
368 | 1.96k | } |
369 | 77.0k | return n; |
370 | 277k | } |
371 | 0 | return 0; |
372 | 277k | } lzo1x_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.70M | { | 337 | 1.70M | lzo_uint n = 4; | 338 | | | 339 | 1.70M | if (m_len < 2) | 340 | 357k | return 0; | 341 | 1.35M | if (m_len == 2) | 342 | 451k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 899k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 441k | return 2; | 345 | 458k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 3.56k | return 2; | 347 | 454k | if (m_off <= M3_MAX_OFFSET) | 348 | 371k | { | 349 | 371k | if (m_len <= M3_MAX_LEN) | 350 | 330k | return 3; | 351 | 41.4k | m_len -= M3_MAX_LEN; | 352 | 42.7k | while (m_len > 255) | 353 | 1.21k | { | 354 | 1.21k | m_len -= 255; | 355 | 1.21k | n++; | 356 | 1.21k | } | 357 | 41.4k | return n; | 358 | 371k | } | 359 | 82.6k | if (m_off <= M4_MAX_OFFSET) | 360 | 82.6k | { | 361 | 82.6k | if (m_len <= M4_MAX_LEN) | 362 | 55.7k | return 3; | 363 | 26.9k | m_len -= M4_MAX_LEN; | 364 | 27.5k | while (m_len > 255) | 365 | 660 | { | 366 | 660 | m_len -= 255; | 367 | 660 | n++; | 368 | 660 | } | 369 | 26.9k | return n; | 370 | 82.6k | } | 371 | 0 | return 0; | 372 | 82.6k | } |
lzo1y_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.68M | { | 337 | 1.68M | lzo_uint n = 4; | 338 | | | 339 | 1.68M | if (m_len < 2) | 340 | 349k | return 0; | 341 | 1.33M | if (m_len == 2) | 342 | 492k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 844k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 376k | return 2; | 345 | 467k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 4.70k | return 2; | 347 | 463k | if (m_off <= M3_MAX_OFFSET) | 348 | 365k | { | 349 | 365k | if (m_len <= M3_MAX_LEN) | 350 | 316k | return 3; | 351 | 48.7k | m_len -= M3_MAX_LEN; | 352 | 50.0k | while (m_len > 255) | 353 | 1.30k | { | 354 | 1.30k | m_len -= 255; | 355 | 1.30k | n++; | 356 | 1.30k | } | 357 | 48.7k | return n; | 358 | 365k | } | 359 | 97.7k | if (m_off <= M4_MAX_OFFSET) | 360 | 97.7k | { | 361 | 97.7k | if (m_len <= M4_MAX_LEN) | 362 | 74.9k | return 3; | 363 | 22.8k | m_len -= M4_MAX_LEN; | 364 | 23.4k | while (m_len > 255) | 365 | 643 | { | 366 | 643 | m_len -= 255; | 367 | 643 | n++; | 368 | 643 | } | 369 | 22.8k | return n; | 370 | 97.7k | } | 371 | 0 | return 0; | 372 | 97.7k | } |
lzo1z_9x.c:len_of_coded_match Line | Count | Source | 336 | 2.10M | { | 337 | 2.10M | lzo_uint n = 4; | 338 | | | 339 | 2.10M | if (m_len < 2) | 340 | 462k | return 0; | 341 | 1.64M | if (m_len == 2) | 342 | 720k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 920k | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 424k | return 2; | 345 | 495k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 3.84k | return 2; | 347 | 492k | if (m_off <= M3_MAX_OFFSET) | 348 | 395k | { | 349 | 395k | if (m_len <= M3_MAX_LEN) | 350 | 345k | return 3; | 351 | 49.5k | m_len -= M3_MAX_LEN; | 352 | 50.7k | while (m_len > 255) | 353 | 1.21k | { | 354 | 1.21k | m_len -= 255; | 355 | 1.21k | n++; | 356 | 1.21k | } | 357 | 49.5k | return n; | 358 | 395k | } | 359 | 96.8k | if (m_off <= M4_MAX_OFFSET) | 360 | 96.8k | { | 361 | 96.8k | if (m_len <= M4_MAX_LEN) | 362 | 69.5k | return 3; | 363 | 27.2k | m_len -= M4_MAX_LEN; | 364 | 27.9k | while (m_len > 255) | 365 | 663 | { | 366 | 663 | m_len -= 255; | 367 | 663 | n++; | 368 | 663 | } | 369 | 27.2k | return n; | 370 | 96.8k | } | 371 | 0 | return 0; | 372 | 96.8k | } |
|
373 | | |
374 | | |
375 | | static lzo_uint |
376 | | min_gain(lzo_uint ahead, lzo_uint lit1, lzo_uint lit2, lzo_uint l1, lzo_uint l2, lzo_uint l3) |
377 | 1.29M | { |
378 | 1.29M | lzo_uint lazy_match_min_gain; |
379 | | |
380 | 1.29M | assert (ahead >= 1); |
381 | 1.29M | lazy_match_min_gain = ahead; |
382 | | |
383 | | #if 0 |
384 | | if (l3) |
385 | | lit2 -= ahead; |
386 | | #endif |
387 | | |
388 | 1.29M | if (lit1 <= 3) |
389 | 1.26M | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; |
390 | 28.7k | else if (lit1 <= 18) |
391 | 18.2k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; |
392 | | |
393 | 1.29M | lazy_match_min_gain += (l2 - l1) * 2; |
394 | 1.29M | if (l3) |
395 | 4.81k | lazy_match_min_gain -= (ahead - l3) * 2; |
396 | | |
397 | 1.29M | if ((lzo_int) lazy_match_min_gain < 0) |
398 | 86.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 | 1.29M | return lazy_match_min_gain; |
407 | 1.29M | } Line | Count | Source | 377 | 394k | { | 378 | 394k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 394k | assert (ahead >= 1); | 381 | 394k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 394k | if (lit1 <= 3) | 389 | 383k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 11.4k | else if (lit1 <= 18) | 391 | 6.81k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 394k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 394k | if (l3) | 395 | 1.78k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 394k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 26.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 | 394k | return lazy_match_min_gain; | 407 | 394k | } |
Line | Count | Source | 377 | 393k | { | 378 | 393k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 393k | assert (ahead >= 1); | 381 | 393k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 393k | if (lit1 <= 3) | 389 | 384k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 8.58k | else if (lit1 <= 18) | 391 | 5.80k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 393k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 393k | if (l3) | 395 | 922 | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 393k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 32.0k | 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 | 393k | return lazy_match_min_gain; | 407 | 393k | } |
Line | Count | Source | 377 | 507k | { | 378 | 507k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 507k | assert (ahead >= 1); | 381 | 507k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 507k | if (lit1 <= 3) | 389 | 498k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 8.69k | else if (lit1 <= 18) | 391 | 5.66k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 507k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 507k | if (l3) | 395 | 2.10k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 507k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 27.4k | 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 | 507k | return lazy_match_min_gain; | 407 | 507k | } |
|
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.42M | # 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.24M | { |
454 | | #if defined(LZO1Z) |
455 | | const LZO_COMPRESS_T *c = swd->c; |
456 | | #endif |
457 | | |
458 | 4.24M | if (*m_len <= M2_MIN_LEN) |
459 | 2.09M | return; |
460 | | #if defined(LZO1Z) |
461 | 743k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) |
462 | 10.2k | return; |
463 | 733k | #if 1 |
464 | 733k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
465 | 487k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) |
466 | 1.30k | { |
467 | 1.30k | *m_len = *m_len - 1; |
468 | 1.30k | *m_off = swd->best_off[*m_len]; |
469 | 1.30k | return; |
470 | 1.30k | } |
471 | 732k | #endif |
472 | 732k | #endif |
473 | | |
474 | 2.14M | if (*m_off <= M2_MAX_OFFSET) |
475 | 1.12M | return; |
476 | | |
477 | 1.02M | #if 1 |
478 | | /* M3/M4 -> M2 */ |
479 | 1.02M | if (*m_off > M2_MAX_OFFSET && |
480 | 1.02M | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
481 | 734k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) |
482 | 132k | { |
483 | 132k | *m_len = *m_len - 1; |
484 | 132k | *m_off = swd->best_off[*m_len]; |
485 | 132k | return; |
486 | 132k | } |
487 | 888k | #endif |
488 | | |
489 | 888k | #if 1 |
490 | | /* M4 -> M2 */ |
491 | 888k | if (*m_off > M3_MAX_OFFSET && |
492 | 253k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && |
493 | 34.2k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) |
494 | 4.18k | { |
495 | 4.18k | *m_len = *m_len - 2; |
496 | 4.18k | *m_off = swd->best_off[*m_len]; |
497 | 4.18k | return; |
498 | 4.18k | } |
499 | 884k | #endif |
500 | | |
501 | 884k | #if 1 |
502 | | /* M4 -> M3 */ |
503 | 884k | if (*m_off > M3_MAX_OFFSET && |
504 | 249k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && |
505 | 73.7k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) |
506 | 11.1k | { |
507 | 11.1k | *m_len = *m_len - 1; |
508 | 11.1k | *m_off = swd->best_off[*m_len]; |
509 | 11.1k | } |
510 | 884k | #endif |
511 | 884k | } Line | Count | Source | 453 | 1.32M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.32M | if (*m_len <= M2_MIN_LEN) | 459 | 585k | 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 | 741k | if (*m_off <= M2_MAX_OFFSET) | 475 | 414k | return; | 476 | | | 477 | 327k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 327k | if (*m_off > M2_MAX_OFFSET && | 480 | 327k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 204k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 47.5k | { | 483 | 47.5k | *m_len = *m_len - 1; | 484 | 47.5k | *m_off = swd->best_off[*m_len]; | 485 | 47.5k | return; | 486 | 47.5k | } | 487 | 279k | #endif | 488 | | | 489 | 279k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 279k | if (*m_off > M3_MAX_OFFSET && | 492 | 80.3k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 7.26k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.14k | { | 495 | 1.14k | *m_len = *m_len - 2; | 496 | 1.14k | *m_off = swd->best_off[*m_len]; | 497 | 1.14k | return; | 498 | 1.14k | } | 499 | 278k | #endif | 500 | | | 501 | 278k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 278k | if (*m_off > M3_MAX_OFFSET && | 504 | 79.1k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 26.3k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 4.09k | { | 507 | 4.09k | *m_len = *m_len - 1; | 508 | 4.09k | *m_off = swd->best_off[*m_len]; | 509 | 4.09k | } | 510 | 278k | #endif | 511 | 278k | } |
Line | Count | Source | 453 | 1.30M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.30M | if (*m_len <= M2_MIN_LEN) | 459 | 637k | 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 | 669k | if (*m_off <= M2_MAX_OFFSET) | 475 | 308k | return; | 476 | | | 477 | 360k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 360k | if (*m_off > M2_MAX_OFFSET && | 480 | 360k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 315k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 43.2k | { | 483 | 43.2k | *m_len = *m_len - 1; | 484 | 43.2k | *m_off = swd->best_off[*m_len]; | 485 | 43.2k | return; | 486 | 43.2k | } | 487 | 316k | #endif | 488 | | | 489 | 316k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 316k | if (*m_off > M3_MAX_OFFSET && | 492 | 82.7k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 19.2k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.68k | { | 495 | 1.68k | *m_len = *m_len - 2; | 496 | 1.68k | *m_off = swd->best_off[*m_len]; | 497 | 1.68k | return; | 498 | 1.68k | } | 499 | 315k | #endif | 500 | | | 501 | 315k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 315k | if (*m_off > M3_MAX_OFFSET && | 504 | 81.0k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 21.5k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 3.00k | { | 507 | 3.00k | *m_len = *m_len - 1; | 508 | 3.00k | *m_off = swd->best_off[*m_len]; | 509 | 3.00k | } | 510 | 315k | #endif | 511 | 315k | } |
Line | Count | Source | 453 | 1.61M | { | 454 | 1.61M | #if defined(LZO1Z) | 455 | 1.61M | const LZO_COMPRESS_T *c = swd->c; | 456 | 1.61M | #endif | 457 | | | 458 | 1.61M | if (*m_len <= M2_MIN_LEN) | 459 | 869k | return; | 460 | 743k | #if defined(LZO1Z) | 461 | 743k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | 10.2k | return; | 463 | 733k | #if 1 | 464 | 733k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | 487k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | 1.30k | { | 467 | 1.30k | *m_len = *m_len - 1; | 468 | 1.30k | *m_off = swd->best_off[*m_len]; | 469 | 1.30k | return; | 470 | 1.30k | } | 471 | 732k | #endif | 472 | 732k | #endif | 473 | | | 474 | 732k | if (*m_off <= M2_MAX_OFFSET) | 475 | 397k | return; | 476 | | | 477 | 334k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 334k | if (*m_off > M2_MAX_OFFSET && | 480 | 334k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 214k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 42.0k | { | 483 | 42.0k | *m_len = *m_len - 1; | 484 | 42.0k | *m_off = swd->best_off[*m_len]; | 485 | 42.0k | return; | 486 | 42.0k | } | 487 | 292k | #endif | 488 | | | 489 | 292k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 292k | if (*m_off > M3_MAX_OFFSET && | 492 | 90.3k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 7.70k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.36k | { | 495 | 1.36k | *m_len = *m_len - 2; | 496 | 1.36k | *m_off = swd->best_off[*m_len]; | 497 | 1.36k | return; | 498 | 1.36k | } | 499 | 290k | #endif | 500 | | | 501 | 290k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 290k | if (*m_off > M3_MAX_OFFSET && | 504 | 88.9k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 25.9k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 4.03k | { | 507 | 4.03k | *m_len = *m_len - 1; | 508 | 4.03k | *m_off = swd->best_off[*m_len]; | 509 | 4.03k | } | 510 | 290k | #endif | 511 | 290k | } |
|
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.40k | { |
533 | 4.40k | lzo_bytep op; |
534 | 4.40k | const lzo_bytep ii; |
535 | 4.40k | lzo_uint lit; |
536 | 4.40k | lzo_uint m_len, m_off; |
537 | 4.40k | LZO_COMPRESS_T cc; |
538 | 4.40k | LZO_COMPRESS_T * const c = &cc; |
539 | 4.40k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; |
540 | 4.40k | lzo_uint try_lazy; |
541 | 4.40k | int r; |
542 | | |
543 | | /* sanity check */ |
544 | | #if defined(LZO1X) |
545 | 1.33k | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
546 | | #elif defined(LZO1Y) |
547 | 1.40k | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
548 | | #elif defined(LZO1Z) |
549 | 1.66k | 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.40k | try_lazy = (lzo_uint) try_lazy_parm; |
557 | 4.40k | 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.40k | 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.40k | if (max_lazy == 0) |
564 | 0 | max_lazy = 32; |
565 | | /* stop searching for longer matches than this one */ |
566 | 4.40k | if (nice_length == 0) |
567 | 4.40k | nice_length = 0; |
568 | | /* don't search more positions than this */ |
569 | 4.40k | if (max_chain == 0) |
570 | 0 | max_chain = SWD_MAX_CHAIN; |
571 | | |
572 | 4.40k | c->init = 0; |
573 | 4.40k | c->ip = c->in = in; |
574 | 4.40k | c->in_end = in + in_len; |
575 | 4.40k | c->out = out; |
576 | 4.40k | c->cb = cb; |
577 | 4.40k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; |
578 | 4.40k | c->lit1_r = c->lit2_r = c->lit3_r = 0; |
579 | | |
580 | 4.40k | op = out; |
581 | 4.40k | ii = c->ip; /* point to start of literal run */ |
582 | 4.40k | lit = 0; |
583 | 4.40k | c->r1_lit = c->r1_m_len = 0; |
584 | | |
585 | 4.40k | r = init_match(c,swd,dict,dict_len,flags); |
586 | 4.40k | if (r != 0) |
587 | 0 | return r; |
588 | 4.40k | if (max_chain > 0) |
589 | 4.40k | swd->max_chain = max_chain; |
590 | 4.40k | if (nice_length > 0) |
591 | 0 | swd->nice_length = nice_length; |
592 | | |
593 | 4.40k | r = find_match(c,swd,0,0); |
594 | 4.40k | if (r != 0) |
595 | 0 | return r; |
596 | 36.4M | while (c->look > 0) |
597 | 36.4M | { |
598 | 36.4M | lzo_uint ahead; |
599 | 36.4M | lzo_uint max_ahead; |
600 | 36.4M | lzo_uint l1, l2, l3; |
601 | | |
602 | 36.4M | c->codesize = pd(op, out); |
603 | | |
604 | 36.4M | m_len = c->m_len; |
605 | 36.4M | m_off = c->m_off; |
606 | | |
607 | 36.4M | assert(c->bp == c->ip - c->look); |
608 | 36.4M | assert(c->bp >= in); |
609 | 36.4M | if (lit == 0) |
610 | 2.47M | ii = c->bp; |
611 | 36.4M | assert(ii + lit == c->bp); |
612 | 36.4M | assert(swd->b_char == *(c->bp)); |
613 | | |
614 | 36.4M | if ( m_len < 2 || |
615 | 17.9M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || |
616 | 3.04M | #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.04M | (m_len == 2 && op == out) || |
622 | 3.04M | #endif |
623 | 3.04M | (op == out && lit == 0)) |
624 | 33.3M | { |
625 | | /* a literal */ |
626 | 33.3M | m_len = 0; |
627 | 33.3M | } |
628 | 3.04M | else if (m_len == M2_MIN_LEN) |
629 | 554k | { |
630 | | /* compression ratio improves if we code a literal in some cases */ |
631 | 554k | if (m_off > MX_MAX_OFFSET && lit >= 4) |
632 | 95.3k | m_len = 0; |
633 | 554k | } |
634 | | |
635 | 36.4M | if (m_len == 0) |
636 | 33.4M | { |
637 | | /* a literal */ |
638 | 33.4M | lit++; |
639 | 33.4M | swd->max_chain = max_chain; |
640 | 33.4M | r = find_match(c,swd,1,0); |
641 | 33.4M | assert(r == 0); LZO_UNUSED(r); |
642 | 33.4M | continue; |
643 | 33.4M | } |
644 | | |
645 | | /* a match */ |
646 | 2.94M | #if defined(SWD_BEST_OFF) |
647 | 2.94M | if (swd->use_best_off) |
648 | 2.94M | better_match(swd,&m_len,&m_off); |
649 | 2.94M | #endif |
650 | 2.94M | assert_match(swd,m_len,m_off); |
651 | | |
652 | | |
653 | | /* shall we try a lazy match ? */ |
654 | 2.94M | ahead = 0; |
655 | 2.94M | 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 | 2.90M | else |
662 | 2.90M | { |
663 | | /* yes, try a lazy match */ |
664 | 2.90M | l1 = len_of_coded_match(m_len,m_off,lit); |
665 | 2.90M | assert(l1 > 0); |
666 | 2.90M | #if 1 |
667 | 2.90M | max_ahead = LZO_MIN(try_lazy, l1 - 1); |
668 | | #else |
669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); |
670 | | #endif |
671 | 2.90M | } |
672 | | |
673 | | |
674 | 6.09M | while (ahead < max_ahead && c->look > m_len) |
675 | 3.63M | { |
676 | 3.63M | lzo_uint lazy_match_min_gain; |
677 | | |
678 | 3.63M | if (m_len >= good_length) |
679 | 195k | swd->max_chain = max_chain >> 2; |
680 | 3.43M | else |
681 | 3.43M | swd->max_chain = max_chain; |
682 | 3.63M | r = find_match(c,swd,1,0); |
683 | 3.63M | ahead++; |
684 | | |
685 | 3.63M | assert(r == 0); LZO_UNUSED(r); |
686 | 3.63M | assert(c->look > 0); |
687 | 3.63M | assert(ii + lit + ahead == c->bp); |
688 | | |
689 | | #if defined(LZO1Z) |
690 | 1.34M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) |
691 | 358k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) |
692 | 4.50k | c->m_len = 0; |
693 | | #endif |
694 | 3.63M | if (c->m_len < m_len) |
695 | 2.07M | continue; |
696 | 1.56M | #if 1 |
697 | 1.56M | if (c->m_len == m_len && c->m_off >= m_off) |
698 | 262k | continue; |
699 | 1.30M | #endif |
700 | 1.30M | #if defined(SWD_BEST_OFF) |
701 | 1.30M | if (swd->use_best_off) |
702 | 1.30M | better_match(swd,&c->m_len,&c->m_off); |
703 | 1.30M | #endif |
704 | 1.30M | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); |
705 | 1.30M | if (l2 == 0) |
706 | 6.33k | continue; |
707 | | #if 0 |
708 | | if (c->m_len == m_len && l2 >= l1) |
709 | | continue; |
710 | | #endif |
711 | | |
712 | | |
713 | 1.29M | #if 1 |
714 | | /* compressed-data compatibility [see above] */ |
715 | 1.29M | 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.29M | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); |
721 | 1.29M | if (c->m_len >= m_len + lazy_match_min_gain) |
722 | 482k | { |
723 | 482k | c->lazy++; |
724 | 482k | assert_match(swd,c->m_len,c->m_off); |
725 | | |
726 | 482k | if (l3) |
727 | 2.82k | { |
728 | | /* code previous run */ |
729 | 2.82k | op = code_run(c,op,ii,lit,ahead); |
730 | 2.82k | lit = 0; |
731 | | /* code shortened match */ |
732 | 2.82k | op = code_match(c,op,ahead,m_off); |
733 | 2.82k | } |
734 | 479k | else |
735 | 479k | { |
736 | 479k | lit += ahead; |
737 | 479k | assert(ii + lit == c->bp); |
738 | 479k | } |
739 | 482k | goto lazy_match_done; |
740 | 482k | } |
741 | 1.29M | } |
742 | | |
743 | | |
744 | 2.94M | assert(ii + lit + ahead == c->bp); |
745 | | |
746 | | /* 1 - code run */ |
747 | 2.46M | op = code_run(c,op,ii,lit,m_len); |
748 | 2.46M | lit = 0; |
749 | | |
750 | | /* 2 - code match */ |
751 | 2.46M | op = code_match(c,op,m_len,m_off); |
752 | 2.46M | swd->max_chain = max_chain; |
753 | 2.46M | r = find_match(c,swd,m_len,1+ahead); |
754 | 2.46M | assert(r == 0); LZO_UNUSED(r); |
755 | | |
756 | 2.94M | lazy_match_done: ; |
757 | 2.94M | } |
758 | | |
759 | | |
760 | | /* store final run */ |
761 | 4.40k | if (lit > 0) |
762 | 2.69k | op = STORE_RUN(c,op,ii,lit); |
763 | | |
764 | 4.40k | #if defined(LZO_EOF_CODE) |
765 | 4.40k | *op++ = M4_MARKER | 1; |
766 | 4.40k | *op++ = 0; |
767 | 4.40k | *op++ = 0; |
768 | 4.40k | #endif |
769 | | |
770 | 4.40k | c->codesize = pd(op, out); |
771 | 4.40k | assert(c->textsize == in_len); |
772 | | |
773 | 4.40k | *out_len = pd(op, out); |
774 | | |
775 | 4.40k | 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.40k | assert(c->lit_bytes + c->match_bytes == in_len); |
785 | | |
786 | 4.40k | return LZO_E_OK; |
787 | 4.40k | } lzo1x_999_compress_internal Line | Count | Source | 532 | 1.33k | { | 533 | 1.33k | lzo_bytep op; | 534 | 1.33k | const lzo_bytep ii; | 535 | 1.33k | lzo_uint lit; | 536 | 1.33k | lzo_uint m_len, m_off; | 537 | 1.33k | LZO_COMPRESS_T cc; | 538 | 1.33k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.33k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.33k | lzo_uint try_lazy; | 541 | 1.33k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | 1.33k | #if defined(LZO1X) | 545 | 1.33k | 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.33k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.33k | 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.33k | 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.33k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.33k | if (nice_length == 0) | 567 | 1.33k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.33k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.33k | c->init = 0; | 573 | 1.33k | c->ip = c->in = in; | 574 | 1.33k | c->in_end = in + in_len; | 575 | 1.33k | c->out = out; | 576 | 1.33k | c->cb = cb; | 577 | 1.33k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.33k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.33k | op = out; | 581 | 1.33k | ii = c->ip; /* point to start of literal run */ | 582 | 1.33k | lit = 0; | 583 | 1.33k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.33k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.33k | if (r != 0) | 587 | 0 | return r; | 588 | 1.33k | if (max_chain > 0) | 589 | 1.33k | swd->max_chain = max_chain; | 590 | 1.33k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.33k | r = find_match(c,swd,0,0); | 594 | 1.33k | if (r != 0) | 595 | 0 | return r; | 596 | 8.72M | while (c->look > 0) | 597 | 8.71M | { | 598 | 8.71M | lzo_uint ahead; | 599 | 8.71M | lzo_uint max_ahead; | 600 | 8.71M | lzo_uint l1, l2, l3; | 601 | | | 602 | 8.71M | c->codesize = pd(op, out); | 603 | | | 604 | 8.71M | m_len = c->m_len; | 605 | 8.71M | m_off = c->m_off; | 606 | | | 607 | 8.71M | assert(c->bp == c->ip - c->look); | 608 | 8.71M | assert(c->bp >= in); | 609 | 8.71M | if (lit == 0) | 610 | 768k | ii = c->bp; | 611 | 8.71M | assert(ii + lit == c->bp); | 612 | 8.71M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 8.71M | if ( m_len < 2 || | 615 | 4.08M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 953k | #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 | 953k | (m_len == 2 && op == out) || | 622 | 953k | #endif | 623 | 953k | (op == out && lit == 0)) | 624 | 7.76M | { | 625 | | /* a literal */ | 626 | 7.76M | m_len = 0; | 627 | 7.76M | } | 628 | 953k | else if (m_len == M2_MIN_LEN) | 629 | 165k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 165k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 22.3k | m_len = 0; | 633 | 165k | } | 634 | | | 635 | 8.71M | if (m_len == 0) | 636 | 7.78M | { | 637 | | /* a literal */ | 638 | 7.78M | lit++; | 639 | 7.78M | swd->max_chain = max_chain; | 640 | 7.78M | r = find_match(c,swd,1,0); | 641 | 7.78M | assert(r == 0); LZO_UNUSED(r); | 642 | 7.78M | continue; | 643 | 7.78M | } | 644 | | | 645 | | /* a match */ | 646 | 931k | #if defined(SWD_BEST_OFF) | 647 | 931k | if (swd->use_best_off) | 648 | 931k | better_match(swd,&m_len,&m_off); | 649 | 931k | #endif | 650 | 931k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 931k | ahead = 0; | 655 | 931k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 14.2k | { | 657 | | /* no */ | 658 | 14.2k | l1 = 0; | 659 | 14.2k | max_ahead = 0; | 660 | 14.2k | } | 661 | 916k | else | 662 | 916k | { | 663 | | /* yes, try a lazy match */ | 664 | 916k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 916k | assert(l1 > 0); | 666 | 916k | #if 1 | 667 | 916k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 916k | } | 672 | | | 673 | | | 674 | 1.92M | 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 | 60.3k | 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 | 671k | continue; | 696 | 483k | #if 1 | 697 | 483k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 86.6k | continue; | 699 | 396k | #endif | 700 | 396k | #if defined(SWD_BEST_OFF) | 701 | 396k | if (swd->use_best_off) | 702 | 396k | better_match(swd,&c->m_len,&c->m_off); | 703 | 396k | #endif | 704 | 396k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 396k | if (l2 == 0) | 706 | 1.63k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 394k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 394k | 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 | 394k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 394k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 164k | { | 723 | 164k | c->lazy++; | 724 | 164k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 164k | if (l3) | 727 | 1.02k | { | 728 | | /* code previous run */ | 729 | 1.02k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.02k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.02k | op = code_match(c,op,ahead,m_off); | 733 | 1.02k | } | 734 | 163k | else | 735 | 163k | { | 736 | 163k | lit += ahead; | 737 | 163k | assert(ii + lit == c->bp); | 738 | 163k | } | 739 | 164k | goto lazy_match_done; | 740 | 164k | } | 741 | 394k | } | 742 | | | 743 | | | 744 | 931k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 766k | op = code_run(c,op,ii,lit,m_len); | 748 | 766k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 766k | op = code_match(c,op,m_len,m_off); | 752 | 766k | swd->max_chain = max_chain; | 753 | 766k | r = find_match(c,swd,m_len,1+ahead); | 754 | 766k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 931k | lazy_match_done: ; | 757 | 931k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.33k | if (lit > 0) | 762 | 776 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.33k | #if defined(LZO_EOF_CODE) | 765 | 1.33k | *op++ = M4_MARKER | 1; | 766 | 1.33k | *op++ = 0; | 767 | 1.33k | *op++ = 0; | 768 | 1.33k | #endif | 769 | | | 770 | 1.33k | c->codesize = pd(op, out); | 771 | 1.33k | assert(c->textsize == in_len); | 772 | | | 773 | 1.33k | *out_len = pd(op, out); | 774 | | | 775 | 1.33k | 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.33k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.33k | return LZO_E_OK; | 787 | 1.33k | } |
lzo1y_999_compress_internal Line | Count | Source | 532 | 1.40k | { | 533 | 1.40k | lzo_bytep op; | 534 | 1.40k | const lzo_bytep ii; | 535 | 1.40k | lzo_uint lit; | 536 | 1.40k | lzo_uint m_len, m_off; | 537 | 1.40k | LZO_COMPRESS_T cc; | 538 | 1.40k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.40k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.40k | lzo_uint try_lazy; | 541 | 1.40k | 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.40k | 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.40k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.40k | 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.40k | 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.40k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.40k | if (nice_length == 0) | 567 | 1.40k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.40k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.40k | c->init = 0; | 573 | 1.40k | c->ip = c->in = in; | 574 | 1.40k | c->in_end = in + in_len; | 575 | 1.40k | c->out = out; | 576 | 1.40k | c->cb = cb; | 577 | 1.40k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.40k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.40k | op = out; | 581 | 1.40k | ii = c->ip; /* point to start of literal run */ | 582 | 1.40k | lit = 0; | 583 | 1.40k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.40k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.40k | if (r != 0) | 587 | 0 | return r; | 588 | 1.40k | if (max_chain > 0) | 589 | 1.40k | swd->max_chain = max_chain; | 590 | 1.40k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.40k | r = find_match(c,swd,0,0); | 594 | 1.40k | if (r != 0) | 595 | 0 | return r; | 596 | 16.7M | while (c->look > 0) | 597 | 16.7M | { | 598 | 16.7M | lzo_uint ahead; | 599 | 16.7M | lzo_uint max_ahead; | 600 | 16.7M | lzo_uint l1, l2, l3; | 601 | | | 602 | 16.7M | c->codesize = pd(op, out); | 603 | | | 604 | 16.7M | m_len = c->m_len; | 605 | 16.7M | m_off = c->m_off; | 606 | | | 607 | 16.7M | assert(c->bp == c->ip - c->look); | 608 | 16.7M | assert(c->bp >= in); | 609 | 16.7M | if (lit == 0) | 610 | 760k | ii = c->bp; | 611 | 16.7M | assert(ii + lit == c->bp); | 612 | 16.7M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 16.7M | if ( m_len < 2 || | 615 | 8.49M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 958k | #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 | 958k | (m_len == 2 && op == out) || | 622 | 958k | #endif | 623 | 958k | (op == out && lit == 0)) | 624 | 15.8M | { | 625 | | /* a literal */ | 626 | 15.8M | m_len = 0; | 627 | 15.8M | } | 628 | 958k | else if (m_len == M2_MIN_LEN) | 629 | 199k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 199k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 46.5k | m_len = 0; | 633 | 199k | } | 634 | | | 635 | 16.7M | if (m_len == 0) | 636 | 15.8M | { | 637 | | /* a literal */ | 638 | 15.8M | lit++; | 639 | 15.8M | swd->max_chain = max_chain; | 640 | 15.8M | r = find_match(c,swd,1,0); | 641 | 15.8M | assert(r == 0); LZO_UNUSED(r); | 642 | 15.8M | continue; | 643 | 15.8M | } | 644 | | | 645 | | /* a match */ | 646 | 911k | #if defined(SWD_BEST_OFF) | 647 | 911k | if (swd->use_best_off) | 648 | 911k | better_match(swd,&m_len,&m_off); | 649 | 911k | #endif | 650 | 911k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 911k | ahead = 0; | 655 | 911k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 14.2k | { | 657 | | /* no */ | 658 | 14.2k | l1 = 0; | 659 | 14.2k | max_ahead = 0; | 660 | 14.2k | } | 661 | 897k | else | 662 | 897k | { | 663 | | /* yes, try a lazy match */ | 664 | 897k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 897k | assert(l1 > 0); | 666 | 897k | #if 1 | 667 | 897k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 897k | } | 672 | | | 673 | | | 674 | 1.89M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.13M | { | 676 | 1.13M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.13M | if (m_len >= good_length) | 679 | 65.4k | swd->max_chain = max_chain >> 2; | 680 | 1.07M | else | 681 | 1.07M | swd->max_chain = max_chain; | 682 | 1.13M | r = find_match(c,swd,1,0); | 683 | 1.13M | ahead++; | 684 | | | 685 | 1.13M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.13M | assert(c->look > 0); | 687 | 1.13M | 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.13M | if (c->m_len < m_len) | 695 | 654k | continue; | 696 | 481k | #if 1 | 697 | 481k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 86.3k | continue; | 699 | 395k | #endif | 700 | 395k | #if defined(SWD_BEST_OFF) | 701 | 395k | if (swd->use_best_off) | 702 | 395k | better_match(swd,&c->m_len,&c->m_off); | 703 | 395k | #endif | 704 | 395k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 395k | if (l2 == 0) | 706 | 2.22k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 393k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 393k | 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 | 393k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 393k | 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 | 693 | { | 728 | | /* code previous run */ | 729 | 693 | op = code_run(c,op,ii,lit,ahead); | 730 | 693 | lit = 0; | 731 | | /* code shortened match */ | 732 | 693 | op = code_match(c,op,ahead,m_off); | 733 | 693 | } | 734 | 152k | else | 735 | 152k | { | 736 | 152k | lit += ahead; | 737 | 152k | assert(ii + lit == c->bp); | 738 | 152k | } | 739 | 152k | goto lazy_match_done; | 740 | 152k | } | 741 | 393k | } | 742 | | | 743 | | | 744 | 911k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 758k | op = code_run(c,op,ii,lit,m_len); | 748 | 758k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 758k | op = code_match(c,op,m_len,m_off); | 752 | 758k | swd->max_chain = max_chain; | 753 | 758k | r = find_match(c,swd,m_len,1+ahead); | 754 | 758k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 911k | lazy_match_done: ; | 757 | 911k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.40k | if (lit > 0) | 762 | 859 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.40k | #if defined(LZO_EOF_CODE) | 765 | 1.40k | *op++ = M4_MARKER | 1; | 766 | 1.40k | *op++ = 0; | 767 | 1.40k | *op++ = 0; | 768 | 1.40k | #endif | 769 | | | 770 | 1.40k | c->codesize = pd(op, out); | 771 | 1.40k | assert(c->textsize == in_len); | 772 | | | 773 | 1.40k | *out_len = pd(op, out); | 774 | | | 775 | 1.40k | 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.40k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.40k | return LZO_E_OK; | 787 | 1.40k | } |
lzo1z_999_compress_internal Line | Count | Source | 532 | 1.66k | { | 533 | 1.66k | lzo_bytep op; | 534 | 1.66k | const lzo_bytep ii; | 535 | 1.66k | lzo_uint lit; | 536 | 1.66k | lzo_uint m_len, m_off; | 537 | 1.66k | LZO_COMPRESS_T cc; | 538 | 1.66k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.66k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.66k | lzo_uint try_lazy; | 541 | 1.66k | 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.66k | 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.66k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.66k | 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.66k | 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.66k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.66k | if (nice_length == 0) | 567 | 1.66k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.66k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.66k | c->init = 0; | 573 | 1.66k | c->ip = c->in = in; | 574 | 1.66k | c->in_end = in + in_len; | 575 | 1.66k | c->out = out; | 576 | 1.66k | c->cb = cb; | 577 | 1.66k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.66k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.66k | op = out; | 581 | 1.66k | ii = c->ip; /* point to start of literal run */ | 582 | 1.66k | lit = 0; | 583 | 1.66k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.66k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.66k | if (r != 0) | 587 | 0 | return r; | 588 | 1.66k | if (max_chain > 0) | 589 | 1.66k | swd->max_chain = max_chain; | 590 | 1.66k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.66k | r = find_match(c,swd,0,0); | 594 | 1.66k | if (r != 0) | 595 | 0 | return r; | 596 | 10.9M | while (c->look > 0) | 597 | 10.9M | { | 598 | 10.9M | lzo_uint ahead; | 599 | 10.9M | lzo_uint max_ahead; | 600 | 10.9M | lzo_uint l1, l2, l3; | 601 | | | 602 | 10.9M | c->codesize = pd(op, out); | 603 | | | 604 | 10.9M | m_len = c->m_len; | 605 | 10.9M | m_off = c->m_off; | 606 | | | 607 | 10.9M | assert(c->bp == c->ip - c->look); | 608 | 10.9M | assert(c->bp >= in); | 609 | 10.9M | if (lit == 0) | 610 | 941k | ii = c->bp; | 611 | 10.9M | assert(ii + lit == c->bp); | 612 | 10.9M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 10.9M | if ( m_len < 2 || | 615 | 5.38M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 1.13M | #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.13M | (m_len == 2 && op == out) || | 622 | 1.13M | #endif | 623 | 1.13M | (op == out && lit == 0)) | 624 | 9.79M | { | 625 | | /* a literal */ | 626 | 9.79M | m_len = 0; | 627 | 9.79M | } | 628 | 1.13M | else if (m_len == M2_MIN_LEN) | 629 | 189k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 189k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 26.4k | m_len = 0; | 633 | 189k | } | 634 | | | 635 | 10.9M | 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 | 1.10M | #if defined(SWD_BEST_OFF) | 647 | 1.10M | if (swd->use_best_off) | 648 | 1.10M | better_match(swd,&m_len,&m_off); | 649 | 1.10M | #endif | 650 | 1.10M | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 1.10M | ahead = 0; | 655 | 1.10M | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 17.1k | { | 657 | | /* no */ | 658 | 17.1k | l1 = 0; | 659 | 17.1k | max_ahead = 0; | 660 | 17.1k | } | 661 | 1.08M | else | 662 | 1.08M | { | 663 | | /* yes, try a lazy match */ | 664 | 1.08M | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 1.08M | assert(l1 > 0); | 666 | 1.08M | #if 1 | 667 | 1.08M | 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.08M | } | 672 | | | 673 | | | 674 | 2.28M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.34M | { | 676 | 1.34M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.34M | if (m_len >= good_length) | 679 | 69.6k | swd->max_chain = max_chain >> 2; | 680 | 1.27M | else | 681 | 1.27M | swd->max_chain = max_chain; | 682 | 1.34M | r = find_match(c,swd,1,0); | 683 | 1.34M | ahead++; | 684 | | | 685 | 1.34M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.34M | assert(c->look > 0); | 687 | 1.34M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | 1.34M | #if defined(LZO1Z) | 690 | 1.34M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | 358k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | 4.50k | c->m_len = 0; | 693 | 1.34M | #endif | 694 | 1.34M | if (c->m_len < m_len) | 695 | 744k | continue; | 696 | 599k | #if 1 | 697 | 599k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 89.2k | continue; | 699 | 509k | #endif | 700 | 509k | #if defined(SWD_BEST_OFF) | 701 | 509k | if (swd->use_best_off) | 702 | 509k | better_match(swd,&c->m_len,&c->m_off); | 703 | 509k | #endif | 704 | 509k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 509k | if (l2 == 0) | 706 | 2.47k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 507k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 507k | 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 | 507k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 507k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 164k | { | 723 | 164k | c->lazy++; | 724 | 164k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 164k | if (l3) | 727 | 1.11k | { | 728 | | /* code previous run */ | 729 | 1.11k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.11k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.11k | op = code_match(c,op,ahead,m_off); | 733 | 1.11k | } | 734 | 163k | else | 735 | 163k | { | 736 | 163k | lit += ahead; | 737 | 163k | assert(ii + lit == c->bp); | 738 | 163k | } | 739 | 164k | goto lazy_match_done; | 740 | 164k | } | 741 | 507k | } | 742 | | | 743 | | | 744 | 1.10M | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 939k | op = code_run(c,op,ii,lit,m_len); | 748 | 939k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 939k | op = code_match(c,op,m_len,m_off); | 752 | 939k | swd->max_chain = max_chain; | 753 | 939k | r = find_match(c,swd,m_len,1+ahead); | 754 | 939k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 1.10M | lazy_match_done: ; | 757 | 1.10M | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.66k | if (lit > 0) | 762 | 1.06k | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.66k | #if defined(LZO_EOF_CODE) | 765 | 1.66k | *op++ = M4_MARKER | 1; | 766 | 1.66k | *op++ = 0; | 767 | 1.66k | *op++ = 0; | 768 | 1.66k | #endif | 769 | | | 770 | 1.66k | c->codesize = pd(op, out); | 771 | 1.66k | assert(c->textsize == in_len); | 772 | | | 773 | 1.66k | *out_len = pd(op, out); | 774 | | | 775 | 1.66k | 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.66k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.66k | return LZO_E_OK; | 787 | 1.66k | } |
|
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.40k | { |
802 | 4.40k | static const struct |
803 | 4.40k | { |
804 | 4.40k | int try_lazy_parm; |
805 | 4.40k | lzo_uint good_length; |
806 | 4.40k | lzo_uint max_lazy; |
807 | 4.40k | lzo_uint nice_length; |
808 | 4.40k | lzo_uint max_chain; |
809 | 4.40k | lzo_uint32_t flags; |
810 | 4.40k | } c[9] = { |
811 | | /* faster compression */ |
812 | 4.40k | { 0, 0, 0, 8, 4, 0 }, |
813 | 4.40k | { 0, 0, 0, 16, 8, 0 }, |
814 | 4.40k | { 0, 0, 0, 32, 16, 0 }, |
815 | 4.40k | { 1, 4, 4, 16, 16, 0 }, |
816 | 4.40k | { 1, 8, 16, 32, 32, 0 }, |
817 | 4.40k | { 1, 8, 16, 128, 128, 0 }, |
818 | 4.40k | { 2, 8, 32, 128, 256, 0 }, |
819 | 4.40k | { 2, 32, 128, SWD_F, 2048, 1 }, |
820 | 4.40k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } |
821 | | /* max. compression */ |
822 | 4.40k | }; |
823 | | |
824 | 4.40k | if (compression_level < 1 || compression_level > 9) |
825 | 0 | return LZO_E_ERROR; |
826 | | |
827 | 4.40k | compression_level -= 1; |
828 | 4.40k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, |
829 | 4.40k | dict, dict_len, cb, |
830 | 4.40k | c[compression_level].try_lazy_parm, |
831 | 4.40k | c[compression_level].good_length, |
832 | 4.40k | c[compression_level].max_lazy, |
833 | | #if 0 |
834 | | c[compression_level].nice_length, |
835 | | #else |
836 | 4.40k | 0, |
837 | 4.40k | #endif |
838 | 4.40k | c[compression_level].max_chain, |
839 | 4.40k | c[compression_level].flags); |
840 | 4.40k | } Line | Count | Source | 801 | 1.33k | { | 802 | 1.33k | static const struct | 803 | 1.33k | { | 804 | 1.33k | int try_lazy_parm; | 805 | 1.33k | lzo_uint good_length; | 806 | 1.33k | lzo_uint max_lazy; | 807 | 1.33k | lzo_uint nice_length; | 808 | 1.33k | lzo_uint max_chain; | 809 | 1.33k | lzo_uint32_t flags; | 810 | 1.33k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.33k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.33k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.33k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.33k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.33k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.33k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.33k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.33k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.33k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.33k | }; | 823 | | | 824 | 1.33k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.33k | compression_level -= 1; | 828 | 1.33k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.33k | dict, dict_len, cb, | 830 | 1.33k | c[compression_level].try_lazy_parm, | 831 | 1.33k | c[compression_level].good_length, | 832 | 1.33k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.33k | 0, | 837 | 1.33k | #endif | 838 | 1.33k | c[compression_level].max_chain, | 839 | 1.33k | c[compression_level].flags); | 840 | 1.33k | } |
Line | Count | Source | 801 | 1.40k | { | 802 | 1.40k | static const struct | 803 | 1.40k | { | 804 | 1.40k | int try_lazy_parm; | 805 | 1.40k | lzo_uint good_length; | 806 | 1.40k | lzo_uint max_lazy; | 807 | 1.40k | lzo_uint nice_length; | 808 | 1.40k | lzo_uint max_chain; | 809 | 1.40k | lzo_uint32_t flags; | 810 | 1.40k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.40k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.40k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.40k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.40k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.40k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.40k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.40k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.40k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.40k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.40k | }; | 823 | | | 824 | 1.40k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.40k | compression_level -= 1; | 828 | 1.40k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.40k | dict, dict_len, cb, | 830 | 1.40k | c[compression_level].try_lazy_parm, | 831 | 1.40k | c[compression_level].good_length, | 832 | 1.40k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.40k | 0, | 837 | 1.40k | #endif | 838 | 1.40k | c[compression_level].max_chain, | 839 | 1.40k | c[compression_level].flags); | 840 | 1.40k | } |
Line | Count | Source | 801 | 1.66k | { | 802 | 1.66k | static const struct | 803 | 1.66k | { | 804 | 1.66k | int try_lazy_parm; | 805 | 1.66k | lzo_uint good_length; | 806 | 1.66k | lzo_uint max_lazy; | 807 | 1.66k | lzo_uint nice_length; | 808 | 1.66k | lzo_uint max_chain; | 809 | 1.66k | lzo_uint32_t flags; | 810 | 1.66k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.66k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.66k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.66k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.66k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.66k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.66k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.66k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.66k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.66k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.66k | }; | 823 | | | 824 | 1.66k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.66k | compression_level -= 1; | 828 | 1.66k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.66k | dict, dict_len, cb, | 830 | 1.66k | c[compression_level].try_lazy_parm, | 831 | 1.66k | c[compression_level].good_length, | 832 | 1.66k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.66k | 0, | 837 | 1.66k | #endif | 838 | 1.66k | c[compression_level].max_chain, | 839 | 1.66k | c[compression_level].flags); | 840 | 1.66k | } |
|
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.40k | { |
862 | 4.40k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, |
863 | | NULL, 0, (lzo_callback_p) 0, 8); |
864 | 4.40k | } Line | Count | Source | 861 | 1.33k | { | 862 | 1.33k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.33k | } |
Line | Count | Source | 861 | 1.40k | { | 862 | 1.40k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.40k | } |
Line | Count | Source | 861 | 1.66k | { | 862 | 1.66k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.66k | } |
|
865 | | |
866 | | |
867 | | /* vim:set ts=4 sw=4 et: */ |