/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 | 3.44k | #define SWD_N M4_MAX_OFFSET /* size of ring buffer */ |
49 | 37.9M | #define SWD_THRESHOLD 1 /* lower limit for match length */ |
50 | 17.2k | #define SWD_F 2048 /* upper limit for match length */ |
51 | | |
52 | 1.39G | #define SWD_BEST_OFF (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1) |
53 | | |
54 | | #if defined(LZO1X) |
55 | 2.12k | # define LZO_COMPRESS_T lzo1x_999_t |
56 | 1.06k | # define lzo_swd_t lzo1x_999_swd_t |
57 | | #elif defined(LZO1Y) |
58 | 2.11k | # define LZO_COMPRESS_T lzo1y_999_t |
59 | 1.05k | # define lzo_swd_t lzo1y_999_swd_t |
60 | 1.05k | # define lzo1x_999_compress_internal lzo1y_999_compress_internal |
61 | | # define lzo1x_999_compress_dict lzo1y_999_compress_dict |
62 | 1.05k | # define lzo1x_999_compress_level lzo1y_999_compress_level |
63 | | # define lzo1x_999_compress lzo1y_999_compress |
64 | | #elif defined(LZO1Z) |
65 | 2.64k | # define LZO_COMPRESS_T lzo1z_999_t |
66 | 1.32k | # define lzo_swd_t lzo1z_999_swd_t |
67 | 1.32k | # define lzo1x_999_compress_internal lzo1z_999_compress_internal |
68 | | # define lzo1x_999_compress_dict lzo1z_999_compress_dict |
69 | 1.32k | # 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.14M | { |
109 | 2.14M | lzo_uint x_len = m_len; |
110 | 2.14M | lzo_uint x_off = m_off; |
111 | | |
112 | 2.14M | 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.14M | assert(op > c->out); |
143 | 2.14M | if (m_len == 2) |
144 | 334k | { |
145 | 334k | assert(m_off <= M1_MAX_OFFSET); |
146 | 334k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); |
147 | 334k | m_off -= 1; |
148 | | #if defined(LZO1Z) |
149 | 158k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
150 | 158k | *op++ = LZO_BYTE(m_off << 2); |
151 | | #else |
152 | 176k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
153 | 176k | *op++ = LZO_BYTE(m_off >> 2); |
154 | | #endif |
155 | 334k | c->m1a_m++; |
156 | 334k | } |
157 | | #if defined(LZO1Z) |
158 | 613k | else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off)) |
159 | | #else |
160 | 1.19M | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
161 | 570k | #endif |
162 | 853k | { |
163 | 853k | assert(m_len >= 3); |
164 | | #if defined(LZO1X) |
165 | | m_off -= 1; |
166 | 251k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); |
167 | 251k | *op++ = LZO_BYTE(m_off >> 3); |
168 | | assert(op[-2] >= M2_MARKER); |
169 | | #elif defined(LZO1Y) |
170 | | m_off -= 1; |
171 | 318k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); |
172 | 318k | *op++ = LZO_BYTE(m_off >> 2); |
173 | | assert(op[-2] >= M2_MARKER); |
174 | | #elif defined(LZO1Z) |
175 | 282k | if (m_off == c->last_m_off) |
176 | 17.0k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); |
177 | 265k | else |
178 | 265k | { |
179 | 265k | m_off -= 1; |
180 | 265k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); |
181 | 265k | *op++ = LZO_BYTE(m_off << 2); |
182 | 265k | } |
183 | | #endif |
184 | 853k | c->m2_m++; |
185 | 853k | } |
186 | 956k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) |
187 | 8.48k | { |
188 | 8.48k | assert(m_len == 3); |
189 | 8.48k | assert(m_off > M2_MAX_OFFSET); |
190 | 8.48k | m_off -= 1 + M2_MAX_OFFSET; |
191 | | #if defined(LZO1Z) |
192 | 2.35k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); |
193 | 2.35k | *op++ = LZO_BYTE(m_off << 2); |
194 | | #else |
195 | 6.12k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); |
196 | 6.12k | *op++ = LZO_BYTE(m_off >> 2); |
197 | | #endif |
198 | 8.48k | c->m1b_m++; |
199 | 8.48k | } |
200 | 947k | else if (m_off <= M3_MAX_OFFSET) |
201 | 720k | { |
202 | 720k | assert(m_len >= 3); |
203 | 720k | m_off -= 1; |
204 | 720k | if (m_len <= M3_MAX_LEN) |
205 | 582k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); |
206 | 138k | else |
207 | 138k | { |
208 | 138k | m_len -= M3_MAX_LEN; |
209 | 138k | *op++ = M3_MARKER | 0; |
210 | 234k | while (m_len > 255) |
211 | 95.4k | { |
212 | 95.4k | m_len -= 255; |
213 | 95.4k | *op++ = 0; |
214 | 95.4k | } |
215 | 138k | assert(m_len > 0); |
216 | 138k | *op++ = LZO_BYTE(m_len); |
217 | 138k | } |
218 | | #if defined(LZO1Z) |
219 | 261k | *op++ = LZO_BYTE(m_off >> 6); |
220 | 261k | *op++ = LZO_BYTE(m_off << 2); |
221 | | #else |
222 | 459k | *op++ = LZO_BYTE(m_off << 2); |
223 | 459k | *op++ = LZO_BYTE(m_off >> 6); |
224 | | #endif |
225 | 720k | c->m3_m++; |
226 | 720k | } |
227 | 227k | else |
228 | 227k | { |
229 | 227k | lzo_uint k; |
230 | | |
231 | 227k | assert(m_len >= 3); |
232 | 227k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); |
233 | 227k | m_off -= 0x4000; |
234 | 227k | k = (m_off & 0x4000) >> 11; |
235 | 227k | if (m_len <= M4_MAX_LEN) |
236 | 125k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); |
237 | 101k | else |
238 | 101k | { |
239 | 101k | m_len -= M4_MAX_LEN; |
240 | 101k | *op++ = LZO_BYTE(M4_MARKER | k | 0); |
241 | 140k | while (m_len > 255) |
242 | 38.4k | { |
243 | 38.4k | m_len -= 255; |
244 | 38.4k | *op++ = 0; |
245 | 38.4k | } |
246 | 101k | assert(m_len > 0); |
247 | 101k | *op++ = LZO_BYTE(m_len); |
248 | 101k | } |
249 | | #if defined(LZO1Z) |
250 | 67.4k | *op++ = LZO_BYTE(m_off >> 6); |
251 | 67.4k | *op++ = LZO_BYTE(m_off << 2); |
252 | | #else |
253 | 159k | *op++ = LZO_BYTE(m_off << 2); |
254 | 159k | *op++ = LZO_BYTE(m_off >> 6); |
255 | | #endif |
256 | 227k | c->m4_m++; |
257 | 227k | } |
258 | | |
259 | 2.14M | c->last_m_len = x_len; |
260 | 2.14M | c->last_m_off = x_off; |
261 | 2.14M | return op; |
262 | 2.14M | } Line | Count | Source | 108 | 634k | { | 109 | 634k | lzo_uint x_len = m_len; | 110 | 634k | lzo_uint x_off = m_off; | 111 | | | 112 | 634k | 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 | 634k | assert(op > c->out); | 143 | 634k | if (m_len == 2) | 144 | 83.5k | { | 145 | 83.5k | assert(m_off <= M1_MAX_OFFSET); | 146 | 83.5k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 83.5k | 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 | 83.5k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 83.5k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 83.5k | #endif | 155 | 83.5k | c->m1a_m++; | 156 | 83.5k | } | 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 | 551k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 251k | #endif | 162 | 251k | { | 163 | 251k | assert(m_len >= 3); | 164 | 251k | #if defined(LZO1X) | 165 | 251k | m_off -= 1; | 166 | 251k | *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); | 167 | 251k | *op++ = LZO_BYTE(m_off >> 3); | 168 | 251k | 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 | 251k | c->m2_m++; | 185 | 251k | } | 186 | 299k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 1.43k | { | 188 | 1.43k | assert(m_len == 3); | 189 | 1.43k | assert(m_off > M2_MAX_OFFSET); | 190 | 1.43k | 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 | 1.43k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 1.43k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 1.43k | #endif | 198 | 1.43k | c->m1b_m++; | 199 | 1.43k | } | 200 | 297k | else if (m_off <= M3_MAX_OFFSET) | 201 | 224k | { | 202 | 224k | assert(m_len >= 3); | 203 | 224k | m_off -= 1; | 204 | 224k | if (m_len <= M3_MAX_LEN) | 205 | 177k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 47.0k | else | 207 | 47.0k | { | 208 | 47.0k | m_len -= M3_MAX_LEN; | 209 | 47.0k | *op++ = M3_MARKER | 0; | 210 | 69.9k | while (m_len > 255) | 211 | 22.8k | { | 212 | 22.8k | m_len -= 255; | 213 | 22.8k | *op++ = 0; | 214 | 22.8k | } | 215 | 47.0k | assert(m_len > 0); | 216 | 47.0k | *op++ = LZO_BYTE(m_len); | 217 | 47.0k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 224k | *op++ = LZO_BYTE(m_off << 2); | 223 | 224k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 224k | #endif | 225 | 224k | c->m3_m++; | 226 | 224k | } | 227 | 73.1k | else | 228 | 73.1k | { | 229 | 73.1k | lzo_uint k; | 230 | | | 231 | 73.1k | assert(m_len >= 3); | 232 | 73.1k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 73.1k | m_off -= 0x4000; | 234 | 73.1k | k = (m_off & 0x4000) >> 11; | 235 | 73.1k | if (m_len <= M4_MAX_LEN) | 236 | 27.1k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 46.0k | else | 238 | 46.0k | { | 239 | 46.0k | m_len -= M4_MAX_LEN; | 240 | 46.0k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 58.5k | while (m_len > 255) | 242 | 12.4k | { | 243 | 12.4k | m_len -= 255; | 244 | 12.4k | *op++ = 0; | 245 | 12.4k | } | 246 | 46.0k | assert(m_len > 0); | 247 | 46.0k | *op++ = LZO_BYTE(m_len); | 248 | 46.0k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 73.1k | *op++ = LZO_BYTE(m_off << 2); | 254 | 73.1k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 73.1k | #endif | 256 | 73.1k | c->m4_m++; | 257 | 73.1k | } | 258 | | | 259 | 634k | c->last_m_len = x_len; | 260 | 634k | c->last_m_off = x_off; | 261 | 634k | return op; | 262 | 634k | } |
Line | Count | Source | 108 | 737k | { | 109 | 737k | lzo_uint x_len = m_len; | 110 | 737k | lzo_uint x_off = m_off; | 111 | | | 112 | 737k | 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 | 737k | assert(op > c->out); | 143 | 737k | if (m_len == 2) | 144 | 92.5k | { | 145 | 92.5k | assert(m_off <= M1_MAX_OFFSET); | 146 | 92.5k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 92.5k | 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 | 92.5k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 153 | 92.5k | *op++ = LZO_BYTE(m_off >> 2); | 154 | 92.5k | #endif | 155 | 92.5k | c->m1a_m++; | 156 | 92.5k | } | 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 | 644k | else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 161 | 318k | #endif | 162 | 318k | { | 163 | 318k | 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 | 318k | *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); | 172 | 318k | *op++ = LZO_BYTE(m_off >> 2); | 173 | 318k | 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 | 318k | c->m2_m++; | 185 | 318k | } | 186 | 325k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 4.69k | { | 188 | 4.69k | assert(m_len == 3); | 189 | 4.69k | assert(m_off > M2_MAX_OFFSET); | 190 | 4.69k | m_off -= 1 + M2_MAX_OFFSET; | 191 | | #if defined(LZO1Z) | 192 | | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | | *op++ = LZO_BYTE(m_off << 2); | 194 | | #else | 195 | 4.69k | *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); | 196 | 4.69k | *op++ = LZO_BYTE(m_off >> 2); | 197 | 4.69k | #endif | 198 | 4.69k | c->m1b_m++; | 199 | 4.69k | } | 200 | 321k | else if (m_off <= M3_MAX_OFFSET) | 201 | 234k | { | 202 | 234k | assert(m_len >= 3); | 203 | 234k | m_off -= 1; | 204 | 234k | if (m_len <= M3_MAX_LEN) | 205 | 191k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 43.1k | else | 207 | 43.1k | { | 208 | 43.1k | m_len -= M3_MAX_LEN; | 209 | 43.1k | *op++ = M3_MARKER | 0; | 210 | 71.3k | while (m_len > 255) | 211 | 28.1k | { | 212 | 28.1k | m_len -= 255; | 213 | 28.1k | *op++ = 0; | 214 | 28.1k | } | 215 | 43.1k | assert(m_len > 0); | 216 | 43.1k | *op++ = LZO_BYTE(m_len); | 217 | 43.1k | } | 218 | | #if defined(LZO1Z) | 219 | | *op++ = LZO_BYTE(m_off >> 6); | 220 | | *op++ = LZO_BYTE(m_off << 2); | 221 | | #else | 222 | 234k | *op++ = LZO_BYTE(m_off << 2); | 223 | 234k | *op++ = LZO_BYTE(m_off >> 6); | 224 | 234k | #endif | 225 | 234k | c->m3_m++; | 226 | 234k | } | 227 | 86.4k | else | 228 | 86.4k | { | 229 | 86.4k | lzo_uint k; | 230 | | | 231 | 86.4k | assert(m_len >= 3); | 232 | 86.4k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 86.4k | m_off -= 0x4000; | 234 | 86.4k | k = (m_off & 0x4000) >> 11; | 235 | 86.4k | if (m_len <= M4_MAX_LEN) | 236 | 57.6k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 28.8k | else | 238 | 28.8k | { | 239 | 28.8k | m_len -= M4_MAX_LEN; | 240 | 28.8k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 41.0k | while (m_len > 255) | 242 | 12.1k | { | 243 | 12.1k | m_len -= 255; | 244 | 12.1k | *op++ = 0; | 245 | 12.1k | } | 246 | 28.8k | assert(m_len > 0); | 247 | 28.8k | *op++ = LZO_BYTE(m_len); | 248 | 28.8k | } | 249 | | #if defined(LZO1Z) | 250 | | *op++ = LZO_BYTE(m_off >> 6); | 251 | | *op++ = LZO_BYTE(m_off << 2); | 252 | | #else | 253 | 86.4k | *op++ = LZO_BYTE(m_off << 2); | 254 | 86.4k | *op++ = LZO_BYTE(m_off >> 6); | 255 | 86.4k | #endif | 256 | 86.4k | c->m4_m++; | 257 | 86.4k | } | 258 | | | 259 | 737k | c->last_m_len = x_len; | 260 | 737k | c->last_m_off = x_off; | 261 | 737k | return op; | 262 | 737k | } |
Line | Count | Source | 108 | 772k | { | 109 | 772k | lzo_uint x_len = m_len; | 110 | 772k | lzo_uint x_off = m_off; | 111 | | | 112 | 772k | 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 | 772k | assert(op > c->out); | 143 | 772k | if (m_len == 2) | 144 | 158k | { | 145 | 158k | assert(m_off <= M1_MAX_OFFSET); | 146 | 158k | assert(c->r1_lit > 0); assert(c->r1_lit < 4); | 147 | 158k | m_off -= 1; | 148 | 158k | #if defined(LZO1Z) | 149 | 158k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 150 | 158k | *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 | 158k | c->m1a_m++; | 156 | 158k | } | 157 | 613k | #if defined(LZO1Z) | 158 | 613k | 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 | 282k | { | 163 | 282k | 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 | 282k | if (m_off == c->last_m_off) | 176 | 17.0k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6)); | 177 | 265k | else | 178 | 265k | { | 179 | 265k | m_off -= 1; | 180 | 265k | *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6)); | 181 | 265k | *op++ = LZO_BYTE(m_off << 2); | 182 | 265k | } | 183 | 282k | #endif | 184 | 282k | c->m2_m++; | 185 | 282k | } | 186 | 331k | else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4) | 187 | 2.35k | { | 188 | 2.35k | assert(m_len == 3); | 189 | 2.35k | assert(m_off > M2_MAX_OFFSET); | 190 | 2.35k | m_off -= 1 + M2_MAX_OFFSET; | 191 | 2.35k | #if defined(LZO1Z) | 192 | 2.35k | *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6)); | 193 | 2.35k | *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 | 2.35k | c->m1b_m++; | 199 | 2.35k | } | 200 | 329k | else if (m_off <= M3_MAX_OFFSET) | 201 | 261k | { | 202 | 261k | assert(m_len >= 3); | 203 | 261k | m_off -= 1; | 204 | 261k | if (m_len <= M3_MAX_LEN) | 205 | 213k | *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); | 206 | 48.3k | else | 207 | 48.3k | { | 208 | 48.3k | m_len -= M3_MAX_LEN; | 209 | 48.3k | *op++ = M3_MARKER | 0; | 210 | 92.8k | while (m_len > 255) | 211 | 44.4k | { | 212 | 44.4k | m_len -= 255; | 213 | 44.4k | *op++ = 0; | 214 | 44.4k | } | 215 | 48.3k | assert(m_len > 0); | 216 | 48.3k | *op++ = LZO_BYTE(m_len); | 217 | 48.3k | } | 218 | 261k | #if defined(LZO1Z) | 219 | 261k | *op++ = LZO_BYTE(m_off >> 6); | 220 | 261k | *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 | 261k | c->m3_m++; | 226 | 261k | } | 227 | 67.4k | else | 228 | 67.4k | { | 229 | 67.4k | lzo_uint k; | 230 | | | 231 | 67.4k | assert(m_len >= 3); | 232 | 67.4k | assert(m_off > 0x4000); assert(m_off <= 0xbfff); | 233 | 67.4k | m_off -= 0x4000; | 234 | 67.4k | k = (m_off & 0x4000) >> 11; | 235 | 67.4k | if (m_len <= M4_MAX_LEN) | 236 | 40.6k | *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2)); | 237 | 26.8k | else | 238 | 26.8k | { | 239 | 26.8k | m_len -= M4_MAX_LEN; | 240 | 26.8k | *op++ = LZO_BYTE(M4_MARKER | k | 0); | 241 | 40.6k | while (m_len > 255) | 242 | 13.8k | { | 243 | 13.8k | m_len -= 255; | 244 | 13.8k | *op++ = 0; | 245 | 13.8k | } | 246 | 26.8k | assert(m_len > 0); | 247 | 26.8k | *op++ = LZO_BYTE(m_len); | 248 | 26.8k | } | 249 | 67.4k | #if defined(LZO1Z) | 250 | 67.4k | *op++ = LZO_BYTE(m_off >> 6); | 251 | 67.4k | *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 | 67.4k | c->m4_m++; | 257 | 67.4k | } | 258 | | | 259 | 772k | c->last_m_len = x_len; | 260 | 772k | c->last_m_off = x_off; | 261 | 772k | return op; | 262 | 772k | } |
|
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.42M | { |
268 | 1.42M | c->lit_bytes += t; |
269 | | |
270 | 1.42M | if (op == c->out && t <= 238) |
271 | 3.37k | { |
272 | 3.37k | *op++ = LZO_BYTE(17 + t); |
273 | 3.37k | } |
274 | 1.42M | else if (t <= 3) |
275 | 1.27M | { |
276 | | #if defined(LZO1Z) |
277 | 489k | op[-1] = LZO_BYTE(op[-1] | t); |
278 | | #else |
279 | 786k | op[-2] = LZO_BYTE(op[-2] | t); |
280 | | #endif |
281 | 1.27M | c->lit1_r++; |
282 | 1.27M | } |
283 | 148k | else if (t <= 18) |
284 | 104k | { |
285 | 104k | *op++ = LZO_BYTE(t - 3); |
286 | 104k | c->lit2_r++; |
287 | 104k | } |
288 | 44.1k | else |
289 | 44.1k | { |
290 | 44.1k | lzo_uint tt = t - 18; |
291 | | |
292 | 44.1k | *op++ = 0; |
293 | 146k | while (tt > 255) |
294 | 102k | { |
295 | 102k | tt -= 255; |
296 | 102k | *op++ = 0; |
297 | 102k | } |
298 | 44.1k | assert(tt > 0); |
299 | 44.1k | *op++ = LZO_BYTE(tt); |
300 | 44.1k | c->lit3_r++; |
301 | 44.1k | } |
302 | 32.8M | do *op++ = *ii++; while (--t > 0); |
303 | | |
304 | 1.42M | return op; |
305 | 1.42M | } Line | Count | Source | 267 | 418k | { | 268 | 418k | c->lit_bytes += t; | 269 | | | 270 | 418k | if (op == c->out && t <= 238) | 271 | 1.04k | { | 272 | 1.04k | *op++ = LZO_BYTE(17 + t); | 273 | 1.04k | } | 274 | 417k | else if (t <= 3) | 275 | 373k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 373k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 373k | #endif | 281 | 373k | c->lit1_r++; | 282 | 373k | } | 283 | 43.5k | else if (t <= 18) | 284 | 32.4k | { | 285 | 32.4k | *op++ = LZO_BYTE(t - 3); | 286 | 32.4k | c->lit2_r++; | 287 | 32.4k | } | 288 | 11.1k | else | 289 | 11.1k | { | 290 | 11.1k | lzo_uint tt = t - 18; | 291 | | | 292 | 11.1k | *op++ = 0; | 293 | 31.3k | while (tt > 255) | 294 | 20.1k | { | 295 | 20.1k | tt -= 255; | 296 | 20.1k | *op++ = 0; | 297 | 20.1k | } | 298 | 11.1k | assert(tt > 0); | 299 | 11.1k | *op++ = LZO_BYTE(tt); | 300 | 11.1k | c->lit3_r++; | 301 | 11.1k | } | 302 | 6.89M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 418k | return op; | 305 | 418k | } |
Line | Count | Source | 267 | 470k | { | 268 | 470k | c->lit_bytes += t; | 269 | | | 270 | 470k | if (op == c->out && t <= 238) | 271 | 1.03k | { | 272 | 1.03k | *op++ = LZO_BYTE(17 + t); | 273 | 1.03k | } | 274 | 468k | else if (t <= 3) | 275 | 412k | { | 276 | | #if defined(LZO1Z) | 277 | | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | 412k | op[-2] = LZO_BYTE(op[-2] | t); | 280 | 412k | #endif | 281 | 412k | c->lit1_r++; | 282 | 412k | } | 283 | 55.9k | 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 | 19.3k | else | 289 | 19.3k | { | 290 | 19.3k | lzo_uint tt = t - 18; | 291 | | | 292 | 19.3k | *op++ = 0; | 293 | 65.6k | while (tt > 255) | 294 | 46.2k | { | 295 | 46.2k | tt -= 255; | 296 | 46.2k | *op++ = 0; | 297 | 46.2k | } | 298 | 19.3k | assert(tt > 0); | 299 | 19.3k | *op++ = LZO_BYTE(tt); | 300 | 19.3k | c->lit3_r++; | 301 | 19.3k | } | 302 | 14.4M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 470k | return op; | 305 | 470k | } |
Line | Count | Source | 267 | 540k | { | 268 | 540k | c->lit_bytes += t; | 269 | | | 270 | 540k | if (op == c->out && t <= 238) | 271 | 1.29k | { | 272 | 1.29k | *op++ = LZO_BYTE(17 + t); | 273 | 1.29k | } | 274 | 538k | else if (t <= 3) | 275 | 489k | { | 276 | 489k | #if defined(LZO1Z) | 277 | 489k | op[-1] = LZO_BYTE(op[-1] | t); | 278 | | #else | 279 | | op[-2] = LZO_BYTE(op[-2] | t); | 280 | | #endif | 281 | 489k | c->lit1_r++; | 282 | 489k | } | 283 | 49.1k | else if (t <= 18) | 284 | 35.5k | { | 285 | 35.5k | *op++ = LZO_BYTE(t - 3); | 286 | 35.5k | c->lit2_r++; | 287 | 35.5k | } | 288 | 13.5k | else | 289 | 13.5k | { | 290 | 13.5k | lzo_uint tt = t - 18; | 291 | | | 292 | 13.5k | *op++ = 0; | 293 | 49.8k | while (tt > 255) | 294 | 36.2k | { | 295 | 36.2k | tt -= 255; | 296 | 36.2k | *op++ = 0; | 297 | 36.2k | } | 298 | 13.5k | assert(tt > 0); | 299 | 13.5k | *op++ = LZO_BYTE(tt); | 300 | 13.5k | c->lit3_r++; | 301 | 13.5k | } | 302 | 11.4M | do *op++ = *ii++; while (--t > 0); | 303 | | | 304 | 540k | return op; | 305 | 540k | } |
|
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.14M | { |
312 | 2.14M | if (lit > 0) |
313 | 1.42M | { |
314 | 1.42M | assert(m_len >= 2); |
315 | 1.42M | op = STORE_RUN(c,op,ii,lit); |
316 | 1.42M | c->r1_m_len = m_len; |
317 | 1.42M | c->r1_lit = lit; |
318 | 1.42M | } |
319 | 717k | else |
320 | 717k | { |
321 | 717k | assert(m_len >= 3); |
322 | 717k | c->r1_m_len = 0; |
323 | 717k | c->r1_lit = 0; |
324 | 717k | } |
325 | | |
326 | 2.14M | return op; |
327 | 2.14M | } Line | Count | Source | 311 | 634k | { | 312 | 634k | if (lit > 0) | 313 | 417k | { | 314 | 417k | assert(m_len >= 2); | 315 | 417k | op = STORE_RUN(c,op,ii,lit); | 316 | 417k | c->r1_m_len = m_len; | 317 | 417k | c->r1_lit = lit; | 318 | 417k | } | 319 | 216k | else | 320 | 216k | { | 321 | 216k | assert(m_len >= 3); | 322 | 216k | c->r1_m_len = 0; | 323 | 216k | c->r1_lit = 0; | 324 | 216k | } | 325 | | | 326 | 634k | return op; | 327 | 634k | } |
Line | Count | Source | 311 | 737k | { | 312 | 737k | if (lit > 0) | 313 | 469k | { | 314 | 469k | assert(m_len >= 2); | 315 | 469k | op = STORE_RUN(c,op,ii,lit); | 316 | 469k | c->r1_m_len = m_len; | 317 | 469k | c->r1_lit = lit; | 318 | 469k | } | 319 | 267k | else | 320 | 267k | { | 321 | 267k | assert(m_len >= 3); | 322 | 267k | c->r1_m_len = 0; | 323 | 267k | c->r1_lit = 0; | 324 | 267k | } | 325 | | | 326 | 737k | return op; | 327 | 737k | } |
Line | Count | Source | 311 | 772k | { | 312 | 772k | if (lit > 0) | 313 | 539k | { | 314 | 539k | assert(m_len >= 2); | 315 | 539k | op = STORE_RUN(c,op,ii,lit); | 316 | 539k | c->r1_m_len = m_len; | 317 | 539k | c->r1_lit = lit; | 318 | 539k | } | 319 | 233k | else | 320 | 233k | { | 321 | 233k | assert(m_len >= 3); | 322 | 233k | c->r1_m_len = 0; | 323 | 233k | c->r1_lit = 0; | 324 | 233k | } | 325 | | | 326 | 772k | return op; | 327 | 772k | } |
|
328 | | |
329 | | |
330 | | /*********************************************************************** |
331 | | // |
332 | | ************************************************************************/ |
333 | | |
334 | | static lzo_uint |
335 | | len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit ) |
336 | 4.70M | { |
337 | 4.70M | lzo_uint n = 4; |
338 | | |
339 | 4.70M | if (m_len < 2) |
340 | 857k | return 0; |
341 | 3.84M | if (m_len == 2) |
342 | 656k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; |
343 | 3.19M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) |
344 | 1.35M | return 2; |
345 | 1.83M | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) |
346 | 10.4k | return 2; |
347 | 1.82M | if (m_off <= M3_MAX_OFFSET) |
348 | 1.36M | { |
349 | 1.36M | if (m_len <= M3_MAX_LEN) |
350 | 1.17M | return 3; |
351 | 188k | m_len -= M3_MAX_LEN; |
352 | 195k | while (m_len > 255) |
353 | 6.34k | { |
354 | 6.34k | m_len -= 255; |
355 | 6.34k | n++; |
356 | 6.34k | } |
357 | 188k | return n; |
358 | 1.36M | } |
359 | 465k | if (m_off <= M4_MAX_OFFSET) |
360 | 465k | { |
361 | 465k | if (m_len <= M4_MAX_LEN) |
362 | 287k | return 3; |
363 | 178k | m_len -= M4_MAX_LEN; |
364 | 182k | while (m_len > 255) |
365 | 3.87k | { |
366 | 3.87k | m_len -= 255; |
367 | 3.87k | n++; |
368 | 3.87k | } |
369 | 178k | return n; |
370 | 465k | } |
371 | 0 | return 0; |
372 | 465k | } lzo1x_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.51M | { | 337 | 1.51M | lzo_uint n = 4; | 338 | | | 339 | 1.51M | if (m_len < 2) | 340 | 287k | return 0; | 341 | 1.23M | if (m_len == 2) | 342 | 180k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 1.05M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 419k | return 2; | 345 | 631k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 1.74k | return 2; | 347 | 630k | if (m_off <= M3_MAX_OFFSET) | 348 | 465k | { | 349 | 465k | if (m_len <= M3_MAX_LEN) | 350 | 365k | return 3; | 351 | 99.7k | m_len -= M3_MAX_LEN; | 352 | 101k | while (m_len > 255) | 353 | 1.81k | { | 354 | 1.81k | m_len -= 255; | 355 | 1.81k | n++; | 356 | 1.81k | } | 357 | 99.7k | return n; | 358 | 465k | } | 359 | 164k | if (m_off <= M4_MAX_OFFSET) | 360 | 164k | { | 361 | 164k | if (m_len <= M4_MAX_LEN) | 362 | 74.9k | return 3; | 363 | 89.3k | m_len -= M4_MAX_LEN; | 364 | 90.4k | while (m_len > 255) | 365 | 1.07k | { | 366 | 1.07k | m_len -= 255; | 367 | 1.07k | n++; | 368 | 1.07k | } | 369 | 89.3k | return n; | 370 | 164k | } | 371 | 0 | return 0; | 372 | 164k | } |
lzo1y_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.60M | { | 337 | 1.60M | lzo_uint n = 4; | 338 | | | 339 | 1.60M | if (m_len < 2) | 340 | 282k | return 0; | 341 | 1.31M | if (m_len == 2) | 342 | 183k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 1.13M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 508k | return 2; | 345 | 627k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 5.84k | return 2; | 347 | 621k | if (m_off <= M3_MAX_OFFSET) | 348 | 451k | { | 349 | 451k | if (m_len <= M3_MAX_LEN) | 350 | 407k | return 3; | 351 | 44.5k | m_len -= M3_MAX_LEN; | 352 | 46.7k | while (m_len > 255) | 353 | 2.27k | { | 354 | 2.27k | m_len -= 255; | 355 | 2.27k | n++; | 356 | 2.27k | } | 357 | 44.5k | return n; | 358 | 451k | } | 359 | 169k | if (m_off <= M4_MAX_OFFSET) | 360 | 169k | { | 361 | 169k | if (m_len <= M4_MAX_LEN) | 362 | 124k | return 3; | 363 | 45.2k | m_len -= M4_MAX_LEN; | 364 | 46.5k | while (m_len > 255) | 365 | 1.29k | { | 366 | 1.29k | m_len -= 255; | 367 | 1.29k | n++; | 368 | 1.29k | } | 369 | 45.2k | return n; | 370 | 169k | } | 371 | 0 | return 0; | 372 | 169k | } |
lzo1z_9x.c:len_of_coded_match Line | Count | Source | 336 | 1.58M | { | 337 | 1.58M | lzo_uint n = 4; | 338 | | | 339 | 1.58M | if (m_len < 2) | 340 | 287k | return 0; | 341 | 1.29M | if (m_len == 2) | 342 | 292k | return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0; | 343 | 1.00M | if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) | 344 | 424k | return 2; | 345 | 580k | if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4) | 346 | 2.81k | return 2; | 347 | 577k | if (m_off <= M3_MAX_OFFSET) | 348 | 445k | { | 349 | 445k | if (m_len <= M3_MAX_LEN) | 350 | 400k | return 3; | 351 | 44.6k | m_len -= M3_MAX_LEN; | 352 | 46.8k | while (m_len > 255) | 353 | 2.25k | { | 354 | 2.25k | m_len -= 255; | 355 | 2.25k | n++; | 356 | 2.25k | } | 357 | 44.6k | return n; | 358 | 445k | } | 359 | 131k | if (m_off <= M4_MAX_OFFSET) | 360 | 131k | { | 361 | 131k | if (m_len <= M4_MAX_LEN) | 362 | 87.9k | return 3; | 363 | 44.0k | m_len -= M4_MAX_LEN; | 364 | 45.5k | while (m_len > 255) | 365 | 1.50k | { | 366 | 1.50k | m_len -= 255; | 367 | 1.50k | n++; | 368 | 1.50k | } | 369 | 44.0k | return n; | 370 | 131k | } | 371 | 0 | return 0; | 372 | 131k | } |
|
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.02M | { |
378 | 1.02M | lzo_uint lazy_match_min_gain; |
379 | | |
380 | 1.02M | assert (ahead >= 1); |
381 | 1.02M | lazy_match_min_gain = ahead; |
382 | | |
383 | | #if 0 |
384 | | if (l3) |
385 | | lit2 -= ahead; |
386 | | #endif |
387 | | |
388 | 1.02M | if (lit1 <= 3) |
389 | 998k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; |
390 | 24.5k | else if (lit1 <= 18) |
391 | 20.0k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; |
392 | | |
393 | 1.02M | lazy_match_min_gain += (l2 - l1) * 2; |
394 | 1.02M | if (l3) |
395 | 5.32k | lazy_match_min_gain -= (ahead - l3) * 2; |
396 | | |
397 | 1.02M | if ((lzo_int) lazy_match_min_gain < 0) |
398 | 101k | 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.02M | return lazy_match_min_gain; |
407 | 1.02M | } Line | Count | Source | 377 | 351k | { | 378 | 351k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 351k | assert (ahead >= 1); | 381 | 351k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 351k | if (lit1 <= 3) | 389 | 343k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 8.02k | else if (lit1 <= 18) | 391 | 6.53k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 351k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 351k | if (l3) | 395 | 2.56k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 351k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 29.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 | 351k | return lazy_match_min_gain; | 407 | 351k | } |
Line | Count | Source | 377 | 340k | { | 378 | 340k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 340k | assert (ahead >= 1); | 381 | 340k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 340k | if (lit1 <= 3) | 389 | 332k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 8.69k | else if (lit1 <= 18) | 391 | 6.98k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 340k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 340k | if (l3) | 395 | 543 | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 340k | if ((lzo_int) lazy_match_min_gain < 0) | 398 | 45.8k | lazy_match_min_gain = 0; | 399 | | | 400 | | #if 0 | 401 | | if (l1 == 2) | 402 | | if (lazy_match_min_gain == 0) | 403 | | lazy_match_min_gain = 1; | 404 | | #endif | 405 | | | 406 | 340k | return lazy_match_min_gain; | 407 | 340k | } |
Line | Count | Source | 377 | 330k | { | 378 | 330k | lzo_uint lazy_match_min_gain; | 379 | | | 380 | 330k | assert (ahead >= 1); | 381 | 330k | lazy_match_min_gain = ahead; | 382 | | | 383 | | #if 0 | 384 | | if (l3) | 385 | | lit2 -= ahead; | 386 | | #endif | 387 | | | 388 | 330k | if (lit1 <= 3) | 389 | 323k | lazy_match_min_gain += (lit2 <= 3) ? 0 : 2; | 390 | 7.82k | else if (lit1 <= 18) | 391 | 6.48k | lazy_match_min_gain += (lit2 <= 18) ? 0 : 1; | 392 | | | 393 | 330k | lazy_match_min_gain += (l2 - l1) * 2; | 394 | 330k | if (l3) | 395 | 2.21k | lazy_match_min_gain -= (ahead - l3) * 2; | 396 | | | 397 | 330k | 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 | 330k | return lazy_match_min_gain; | 407 | 330k | } |
|
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.29M | # define assert_match(a,b,c) ((void)0) |
446 | | #endif |
447 | | |
448 | | |
449 | | #if defined(SWD_BEST_OFF) |
450 | | |
451 | | static void |
452 | | better_match ( const lzo_swd_p swd, lzo_uint *m_len, lzo_uint *m_off ) |
453 | 3.74M | { |
454 | | #if defined(LZO1Z) |
455 | | const LZO_COMPRESS_T *c = swd->c; |
456 | | #endif |
457 | | |
458 | 3.74M | if (*m_len <= M2_MIN_LEN) |
459 | 1.11M | return; |
460 | | #if defined(LZO1Z) |
461 | 818k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) |
462 | 17.4k | return; |
463 | 800k | #if 1 |
464 | 800k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
465 | 469k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) |
466 | 1.74k | { |
467 | 1.74k | *m_len = *m_len - 1; |
468 | 1.74k | *m_off = swd->best_off[*m_len]; |
469 | 1.74k | return; |
470 | 1.74k | } |
471 | 799k | #endif |
472 | 799k | #endif |
473 | | |
474 | 2.60M | if (*m_off <= M2_MAX_OFFSET) |
475 | 1.31M | return; |
476 | | |
477 | 1.29M | #if 1 |
478 | | /* M3/M4 -> M2 */ |
479 | 1.29M | if (*m_off > M2_MAX_OFFSET && |
480 | 1.29M | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && |
481 | 833k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) |
482 | 135k | { |
483 | 135k | *m_len = *m_len - 1; |
484 | 135k | *m_off = swd->best_off[*m_len]; |
485 | 135k | return; |
486 | 135k | } |
487 | 1.16M | #endif |
488 | | |
489 | 1.16M | #if 1 |
490 | | /* M4 -> M2 */ |
491 | 1.16M | if (*m_off > M3_MAX_OFFSET && |
492 | 422k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && |
493 | 51.9k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) |
494 | 5.13k | { |
495 | 5.13k | *m_len = *m_len - 2; |
496 | 5.13k | *m_off = swd->best_off[*m_len]; |
497 | 5.13k | return; |
498 | 5.13k | } |
499 | 1.15M | #endif |
500 | | |
501 | 1.15M | #if 1 |
502 | | /* M4 -> M3 */ |
503 | 1.15M | if (*m_off > M3_MAX_OFFSET && |
504 | 417k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && |
505 | 168k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) |
506 | 12.9k | { |
507 | 12.9k | *m_len = *m_len - 1; |
508 | 12.9k | *m_off = swd->best_off[*m_len]; |
509 | 12.9k | } |
510 | 1.15M | #endif |
511 | 1.15M | } Line | Count | Source | 453 | 1.18M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.18M | if (*m_len <= M2_MIN_LEN) | 459 | 297k | 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 | 888k | if (*m_off <= M2_MAX_OFFSET) | 475 | 465k | return; | 476 | | | 477 | 423k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 423k | if (*m_off > M2_MAX_OFFSET && | 480 | 423k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 189k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 38.8k | { | 483 | 38.8k | *m_len = *m_len - 1; | 484 | 38.8k | *m_off = swd->best_off[*m_len]; | 485 | 38.8k | return; | 486 | 38.8k | } | 487 | 384k | #endif | 488 | | | 489 | 384k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 384k | if (*m_off > M3_MAX_OFFSET && | 492 | 160k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 8.41k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.56k | { | 495 | 1.56k | *m_len = *m_len - 2; | 496 | 1.56k | *m_off = swd->best_off[*m_len]; | 497 | 1.56k | return; | 498 | 1.56k | } | 499 | 382k | #endif | 500 | | | 501 | 382k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 382k | if (*m_off > M3_MAX_OFFSET && | 504 | 159k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 86.4k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 5.22k | { | 507 | 5.22k | *m_len = *m_len - 1; | 508 | 5.22k | *m_off = swd->best_off[*m_len]; | 509 | 5.22k | } | 510 | 382k | #endif | 511 | 382k | } |
Line | Count | Source | 453 | 1.28M | { | 454 | | #if defined(LZO1Z) | 455 | | const LZO_COMPRESS_T *c = swd->c; | 456 | | #endif | 457 | | | 458 | 1.28M | if (*m_len <= M2_MIN_LEN) | 459 | 360k | 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 | 920k | if (*m_off <= M2_MAX_OFFSET) | 475 | 397k | return; | 476 | | | 477 | 523k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 523k | if (*m_off > M2_MAX_OFFSET && | 480 | 523k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 449k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 65.0k | { | 483 | 65.0k | *m_len = *m_len - 1; | 484 | 65.0k | *m_off = swd->best_off[*m_len]; | 485 | 65.0k | return; | 486 | 65.0k | } | 487 | 458k | #endif | 488 | | | 489 | 458k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 458k | if (*m_off > M3_MAX_OFFSET && | 492 | 149k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 35.2k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 2.18k | { | 495 | 2.18k | *m_len = *m_len - 2; | 496 | 2.18k | *m_off = swd->best_off[*m_len]; | 497 | 2.18k | return; | 498 | 2.18k | } | 499 | 456k | #endif | 500 | | | 501 | 456k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 456k | if (*m_off > M3_MAX_OFFSET && | 504 | 147k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 42.5k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 4.29k | { | 507 | 4.29k | *m_len = *m_len - 1; | 508 | 4.29k | *m_off = swd->best_off[*m_len]; | 509 | 4.29k | } | 510 | 456k | #endif | 511 | 456k | } |
Line | Count | Source | 453 | 1.27M | { | 454 | 1.27M | #if defined(LZO1Z) | 455 | 1.27M | const LZO_COMPRESS_T *c = swd->c; | 456 | 1.27M | #endif | 457 | | | 458 | 1.27M | if (*m_len <= M2_MIN_LEN) | 459 | 459k | return; | 460 | 818k | #if defined(LZO1Z) | 461 | 818k | if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN) | 462 | 17.4k | return; | 463 | 800k | #if 1 | 464 | 800k | if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 465 | 469k | c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off) | 466 | 1.74k | { | 467 | 1.74k | *m_len = *m_len - 1; | 468 | 1.74k | *m_off = swd->best_off[*m_len]; | 469 | 1.74k | return; | 470 | 1.74k | } | 471 | 799k | #endif | 472 | 799k | #endif | 473 | | | 474 | 799k | if (*m_off <= M2_MAX_OFFSET) | 475 | 449k | return; | 476 | | | 477 | 350k | #if 1 | 478 | | /* M3/M4 -> M2 */ | 479 | 350k | if (*m_off > M2_MAX_OFFSET && | 480 | 350k | *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 && | 481 | 194k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET) | 482 | 31.7k | { | 483 | 31.7k | *m_len = *m_len - 1; | 484 | 31.7k | *m_off = swd->best_off[*m_len]; | 485 | 31.7k | return; | 486 | 31.7k | } | 487 | 318k | #endif | 488 | | | 489 | 318k | #if 1 | 490 | | /* M4 -> M2 */ | 491 | 318k | if (*m_off > M3_MAX_OFFSET && | 492 | 112k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 && | 493 | 8.27k | swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET) | 494 | 1.39k | { | 495 | 1.39k | *m_len = *m_len - 2; | 496 | 1.39k | *m_off = swd->best_off[*m_len]; | 497 | 1.39k | return; | 498 | 1.39k | } | 499 | 316k | #endif | 500 | | | 501 | 316k | #if 1 | 502 | | /* M4 -> M3 */ | 503 | 316k | if (*m_off > M3_MAX_OFFSET && | 504 | 110k | *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 && | 505 | 39.2k | swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET) | 506 | 3.44k | { | 507 | 3.44k | *m_len = *m_len - 1; | 508 | 3.44k | *m_off = swd->best_off[*m_len]; | 509 | 3.44k | } | 510 | 316k | #endif | 511 | 316k | } |
|
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 | 3.44k | { |
533 | 3.44k | lzo_bytep op; |
534 | 3.44k | const lzo_bytep ii; |
535 | 3.44k | lzo_uint lit; |
536 | 3.44k | lzo_uint m_len, m_off; |
537 | 3.44k | LZO_COMPRESS_T cc; |
538 | 3.44k | LZO_COMPRESS_T * const c = &cc; |
539 | 3.44k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; |
540 | 3.44k | lzo_uint try_lazy; |
541 | 3.44k | int r; |
542 | | |
543 | | /* sanity check */ |
544 | | #if defined(LZO1X) |
545 | 1.06k | LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
546 | | #elif defined(LZO1Y) |
547 | 1.05k | LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T) |
548 | | #elif defined(LZO1Z) |
549 | 1.32k | 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 | 3.44k | try_lazy = (lzo_uint) try_lazy_parm; |
557 | 3.44k | 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 | 3.44k | 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 | 3.44k | if (max_lazy == 0) |
564 | 0 | max_lazy = 32; |
565 | | /* stop searching for longer matches than this one */ |
566 | 3.44k | if (nice_length == 0) |
567 | 3.44k | nice_length = 0; |
568 | | /* don't search more positions than this */ |
569 | 3.44k | if (max_chain == 0) |
570 | 0 | max_chain = SWD_MAX_CHAIN; |
571 | | |
572 | 3.44k | c->init = 0; |
573 | 3.44k | c->ip = c->in = in; |
574 | 3.44k | c->in_end = in + in_len; |
575 | 3.44k | c->out = out; |
576 | 3.44k | c->cb = cb; |
577 | 3.44k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; |
578 | 3.44k | c->lit1_r = c->lit2_r = c->lit3_r = 0; |
579 | | |
580 | 3.44k | op = out; |
581 | 3.44k | ii = c->ip; /* point to start of literal run */ |
582 | 3.44k | lit = 0; |
583 | 3.44k | c->r1_lit = c->r1_m_len = 0; |
584 | | |
585 | 3.44k | r = init_match(c,swd,dict,dict_len,flags); |
586 | 3.44k | if (r != 0) |
587 | 0 | return r; |
588 | 3.44k | if (max_chain > 0) |
589 | 3.44k | swd->max_chain = max_chain; |
590 | 3.44k | if (nice_length > 0) |
591 | 0 | swd->nice_length = nice_length; |
592 | | |
593 | 3.44k | r = find_match(c,swd,0,0); |
594 | 3.44k | if (r != 0) |
595 | 0 | return r; |
596 | 34.8M | while (c->look > 0) |
597 | 34.8M | { |
598 | 34.8M | lzo_uint ahead; |
599 | 34.8M | lzo_uint max_ahead; |
600 | 34.8M | lzo_uint l1, l2, l3; |
601 | | |
602 | 34.8M | c->codesize = pd(op, out); |
603 | | |
604 | 34.8M | m_len = c->m_len; |
605 | 34.8M | m_off = c->m_off; |
606 | | |
607 | 34.8M | assert(c->bp == c->ip - c->look); |
608 | 34.8M | assert(c->bp >= in); |
609 | 34.8M | if (lit == 0) |
610 | 2.14M | ii = c->bp; |
611 | 34.8M | assert(ii + lit == c->bp); |
612 | 34.8M | assert(swd->b_char == *(c->bp)); |
613 | | |
614 | 34.8M | if ( m_len < 2 || |
615 | 17.2M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || |
616 | 2.88M | #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 | 2.88M | (m_len == 2 && op == out) || |
622 | 2.88M | #endif |
623 | 2.88M | (op == out && lit == 0)) |
624 | 31.9M | { |
625 | | /* a literal */ |
626 | 31.9M | m_len = 0; |
627 | 31.9M | } |
628 | 2.88M | else if (m_len == M2_MIN_LEN) |
629 | 693k | { |
630 | | /* compression ratio improves if we code a literal in some cases */ |
631 | 693k | if (m_off > MX_MAX_OFFSET && lit >= 4) |
632 | 166k | m_len = 0; |
633 | 693k | } |
634 | | |
635 | 34.8M | if (m_len == 0) |
636 | 32.1M | { |
637 | | /* a literal */ |
638 | 32.1M | lit++; |
639 | 32.1M | swd->max_chain = max_chain; |
640 | 32.1M | r = find_match(c,swd,1,0); |
641 | 32.1M | assert(r == 0); LZO_UNUSED(r); |
642 | 32.1M | continue; |
643 | 32.1M | } |
644 | | |
645 | | /* a match */ |
646 | 2.71M | #if defined(SWD_BEST_OFF) |
647 | 2.71M | if (swd->use_best_off) |
648 | 2.71M | better_match(swd,&m_len,&m_off); |
649 | 2.71M | #endif |
650 | 2.71M | assert_match(swd,m_len,m_off); |
651 | | |
652 | | |
653 | | /* shall we try a lazy match ? */ |
654 | 2.71M | ahead = 0; |
655 | 2.71M | if (try_lazy == 0 || m_len >= max_lazy) |
656 | 63.6k | { |
657 | | /* no */ |
658 | 63.6k | l1 = 0; |
659 | 63.6k | max_ahead = 0; |
660 | 63.6k | } |
661 | 2.65M | else |
662 | 2.65M | { |
663 | | /* yes, try a lazy match */ |
664 | 2.65M | l1 = len_of_coded_match(m_len,m_off,lit); |
665 | 2.65M | assert(l1 > 0); |
666 | 2.65M | #if 1 |
667 | 2.65M | 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.65M | } |
672 | | |
673 | | |
674 | 5.75M | while (ahead < max_ahead && c->look > m_len) |
675 | 3.61M | { |
676 | 3.61M | lzo_uint lazy_match_min_gain; |
677 | | |
678 | 3.61M | if (m_len >= good_length) |
679 | 279k | swd->max_chain = max_chain >> 2; |
680 | 3.33M | else |
681 | 3.33M | swd->max_chain = max_chain; |
682 | 3.61M | r = find_match(c,swd,1,0); |
683 | 3.61M | ahead++; |
684 | | |
685 | 3.61M | assert(r == 0); LZO_UNUSED(r); |
686 | 3.61M | assert(c->look > 0); |
687 | 3.61M | assert(ii + lit + ahead == c->bp); |
688 | | |
689 | | #if defined(LZO1Z) |
690 | 1.25M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) |
691 | 105k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) |
692 | 8.39k | c->m_len = 0; |
693 | | #endif |
694 | 3.61M | if (c->m_len < m_len) |
695 | 2.30M | continue; |
696 | 1.30M | #if 1 |
697 | 1.30M | if (c->m_len == m_len && c->m_off >= m_off) |
698 | 278k | continue; |
699 | 1.02M | #endif |
700 | 1.02M | #if defined(SWD_BEST_OFF) |
701 | 1.02M | if (swd->use_best_off) |
702 | 1.02M | better_match(swd,&c->m_len,&c->m_off); |
703 | 1.02M | #endif |
704 | 1.02M | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); |
705 | 1.02M | if (l2 == 0) |
706 | 3.44k | continue; |
707 | | #if 0 |
708 | | if (c->m_len == m_len && l2 >= l1) |
709 | | continue; |
710 | | #endif |
711 | | |
712 | | |
713 | 1.02M | #if 1 |
714 | | /* compressed-data compatibility [see above] */ |
715 | 1.02M | 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.02M | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); |
721 | 1.02M | if (c->m_len >= m_len + lazy_match_min_gain) |
722 | 578k | { |
723 | 578k | c->lazy++; |
724 | 578k | assert_match(swd,c->m_len,c->m_off); |
725 | | |
726 | 578k | if (l3) |
727 | 2.65k | { |
728 | | /* code previous run */ |
729 | 2.65k | op = code_run(c,op,ii,lit,ahead); |
730 | 2.65k | lit = 0; |
731 | | /* code shortened match */ |
732 | 2.65k | op = code_match(c,op,ahead,m_off); |
733 | 2.65k | } |
734 | 575k | else |
735 | 575k | { |
736 | 575k | lit += ahead; |
737 | 575k | assert(ii + lit == c->bp); |
738 | 575k | } |
739 | 578k | goto lazy_match_done; |
740 | 578k | } |
741 | 1.02M | } |
742 | | |
743 | | |
744 | 2.71M | assert(ii + lit + ahead == c->bp); |
745 | | |
746 | | /* 1 - code run */ |
747 | 2.14M | op = code_run(c,op,ii,lit,m_len); |
748 | 2.14M | lit = 0; |
749 | | |
750 | | /* 2 - code match */ |
751 | 2.14M | op = code_match(c,op,m_len,m_off); |
752 | 2.14M | swd->max_chain = max_chain; |
753 | 2.14M | r = find_match(c,swd,m_len,1+ahead); |
754 | 2.14M | assert(r == 0); LZO_UNUSED(r); |
755 | | |
756 | 2.71M | lazy_match_done: ; |
757 | 2.71M | } |
758 | | |
759 | | |
760 | | /* store final run */ |
761 | 3.44k | if (lit > 0) |
762 | 2.01k | op = STORE_RUN(c,op,ii,lit); |
763 | | |
764 | 3.44k | #if defined(LZO_EOF_CODE) |
765 | 3.44k | *op++ = M4_MARKER | 1; |
766 | 3.44k | *op++ = 0; |
767 | 3.44k | *op++ = 0; |
768 | 3.44k | #endif |
769 | | |
770 | 3.44k | c->codesize = pd(op, out); |
771 | 3.44k | assert(c->textsize == in_len); |
772 | | |
773 | 3.44k | *out_len = pd(op, out); |
774 | | |
775 | 3.44k | 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 | 3.44k | assert(c->lit_bytes + c->match_bytes == in_len); |
785 | | |
786 | 3.44k | return LZO_E_OK; |
787 | 3.44k | } lzo1x_999_compress_internal Line | Count | Source | 532 | 1.06k | { | 533 | 1.06k | lzo_bytep op; | 534 | 1.06k | const lzo_bytep ii; | 535 | 1.06k | lzo_uint lit; | 536 | 1.06k | lzo_uint m_len, m_off; | 537 | 1.06k | LZO_COMPRESS_T cc; | 538 | 1.06k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.06k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.06k | lzo_uint try_lazy; | 541 | 1.06k | int r; | 542 | | | 543 | | /* sanity check */ | 544 | 1.06k | #if defined(LZO1X) | 545 | 1.06k | 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.06k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.06k | 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.06k | 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.06k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.06k | if (nice_length == 0) | 567 | 1.06k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.06k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.06k | c->init = 0; | 573 | 1.06k | c->ip = c->in = in; | 574 | 1.06k | c->in_end = in + in_len; | 575 | 1.06k | c->out = out; | 576 | 1.06k | c->cb = cb; | 577 | 1.06k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.06k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.06k | op = out; | 581 | 1.06k | ii = c->ip; /* point to start of literal run */ | 582 | 1.06k | lit = 0; | 583 | 1.06k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.06k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.06k | if (r != 0) | 587 | 0 | return r; | 588 | 1.06k | if (max_chain > 0) | 589 | 1.06k | swd->max_chain = max_chain; | 590 | 1.06k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.06k | r = find_match(c,swd,0,0); | 594 | 1.06k | if (r != 0) | 595 | 0 | return r; | 596 | 7.50M | while (c->look > 0) | 597 | 7.50M | { | 598 | 7.50M | lzo_uint ahead; | 599 | 7.50M | lzo_uint max_ahead; | 600 | 7.50M | lzo_uint l1, l2, l3; | 601 | | | 602 | 7.50M | c->codesize = pd(op, out); | 603 | | | 604 | 7.50M | m_len = c->m_len; | 605 | 7.50M | m_off = c->m_off; | 606 | | | 607 | 7.50M | assert(c->bp == c->ip - c->look); | 608 | 7.50M | assert(c->bp >= in); | 609 | 7.50M | if (lit == 0) | 610 | 635k | ii = c->bp; | 611 | 7.50M | assert(ii + lit == c->bp); | 612 | 7.50M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 7.50M | if ( m_len < 2 || | 615 | 3.38M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 853k | #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 | 853k | (m_len == 2 && op == out) || | 622 | 852k | #endif | 623 | 852k | (op == out && lit == 0)) | 624 | 6.65M | { | 625 | | /* a literal */ | 626 | 6.65M | m_len = 0; | 627 | 6.65M | } | 628 | 852k | else if (m_len == M2_MIN_LEN) | 629 | 176k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 176k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 19.0k | m_len = 0; | 633 | 176k | } | 634 | | | 635 | 7.50M | if (m_len == 0) | 636 | 6.67M | { | 637 | | /* a literal */ | 638 | 6.67M | lit++; | 639 | 6.67M | swd->max_chain = max_chain; | 640 | 6.67M | r = find_match(c,swd,1,0); | 641 | 6.67M | assert(r == 0); LZO_UNUSED(r); | 642 | 6.67M | continue; | 643 | 6.67M | } | 644 | | | 645 | | /* a match */ | 646 | 833k | #if defined(SWD_BEST_OFF) | 647 | 833k | if (swd->use_best_off) | 648 | 833k | better_match(swd,&m_len,&m_off); | 649 | 833k | #endif | 650 | 833k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 833k | ahead = 0; | 655 | 833k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 18.2k | { | 657 | | /* no */ | 658 | 18.2k | l1 = 0; | 659 | 18.2k | max_ahead = 0; | 660 | 18.2k | } | 661 | 815k | else | 662 | 815k | { | 663 | | /* yes, try a lazy match */ | 664 | 815k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 815k | assert(l1 > 0); | 666 | 815k | #if 1 | 667 | 815k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 815k | } | 672 | | | 673 | | | 674 | 1.74M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.11M | { | 676 | 1.11M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.11M | if (m_len >= good_length) | 679 | 127k | swd->max_chain = max_chain >> 2; | 680 | 988k | else | 681 | 988k | swd->max_chain = max_chain; | 682 | 1.11M | r = find_match(c,swd,1,0); | 683 | 1.11M | ahead++; | 684 | | | 685 | 1.11M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.11M | assert(c->look > 0); | 687 | 1.11M | 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.11M | if (c->m_len < m_len) | 695 | 688k | continue; | 696 | 427k | #if 1 | 697 | 427k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 75.4k | continue; | 699 | 352k | #endif | 700 | 352k | #if defined(SWD_BEST_OFF) | 701 | 352k | if (swd->use_best_off) | 702 | 352k | better_match(swd,&c->m_len,&c->m_off); | 703 | 352k | #endif | 704 | 352k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 352k | if (l2 == 0) | 706 | 1.14k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 351k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 351k | 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 | 351k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 351k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 200k | { | 723 | 200k | c->lazy++; | 724 | 200k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 200k | if (l3) | 727 | 1.28k | { | 728 | | /* code previous run */ | 729 | 1.28k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.28k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.28k | op = code_match(c,op,ahead,m_off); | 733 | 1.28k | } | 734 | 199k | else | 735 | 199k | { | 736 | 199k | lit += ahead; | 737 | 199k | assert(ii + lit == c->bp); | 738 | 199k | } | 739 | 200k | goto lazy_match_done; | 740 | 200k | } | 741 | 351k | } | 742 | | | 743 | | | 744 | 833k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 633k | op = code_run(c,op,ii,lit,m_len); | 748 | 633k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 633k | op = code_match(c,op,m_len,m_off); | 752 | 633k | swd->max_chain = max_chain; | 753 | 633k | r = find_match(c,swd,m_len,1+ahead); | 754 | 633k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 833k | lazy_match_done: ; | 757 | 833k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.06k | if (lit > 0) | 762 | 617 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.06k | #if defined(LZO_EOF_CODE) | 765 | 1.06k | *op++ = M4_MARKER | 1; | 766 | 1.06k | *op++ = 0; | 767 | 1.06k | *op++ = 0; | 768 | 1.06k | #endif | 769 | | | 770 | 1.06k | c->codesize = pd(op, out); | 771 | 1.06k | assert(c->textsize == in_len); | 772 | | | 773 | 1.06k | *out_len = pd(op, out); | 774 | | | 775 | 1.06k | 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.06k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.06k | return LZO_E_OK; | 787 | 1.06k | } |
lzo1y_999_compress_internal Line | Count | Source | 532 | 1.05k | { | 533 | 1.05k | lzo_bytep op; | 534 | 1.05k | const lzo_bytep ii; | 535 | 1.05k | lzo_uint lit; | 536 | 1.05k | lzo_uint m_len, m_off; | 537 | 1.05k | LZO_COMPRESS_T cc; | 538 | 1.05k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.05k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.05k | lzo_uint try_lazy; | 541 | 1.05k | 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.05k | 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.05k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.05k | 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.05k | 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.05k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.05k | if (nice_length == 0) | 567 | 1.05k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.05k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.05k | c->init = 0; | 573 | 1.05k | c->ip = c->in = in; | 574 | 1.05k | c->in_end = in + in_len; | 575 | 1.05k | c->out = out; | 576 | 1.05k | c->cb = cb; | 577 | 1.05k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.05k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.05k | op = out; | 581 | 1.05k | ii = c->ip; /* point to start of literal run */ | 582 | 1.05k | lit = 0; | 583 | 1.05k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.05k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.05k | if (r != 0) | 587 | 0 | return r; | 588 | 1.05k | if (max_chain > 0) | 589 | 1.05k | swd->max_chain = max_chain; | 590 | 1.05k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.05k | r = find_match(c,swd,0,0); | 594 | 1.05k | if (r != 0) | 595 | 0 | return r; | 596 | 15.1M | while (c->look > 0) | 597 | 15.1M | { | 598 | 15.1M | lzo_uint ahead; | 599 | 15.1M | lzo_uint max_ahead; | 600 | 15.1M | lzo_uint l1, l2, l3; | 601 | | | 602 | 15.1M | c->codesize = pd(op, out); | 603 | | | 604 | 15.1M | m_len = c->m_len; | 605 | 15.1M | m_off = c->m_off; | 606 | | | 607 | 15.1M | assert(c->bp == c->ip - c->look); | 608 | 15.1M | assert(c->bp >= in); | 609 | 15.1M | if (lit == 0) | 610 | 737k | ii = c->bp; | 611 | 15.1M | assert(ii + lit == c->bp); | 612 | 15.1M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 15.1M | if ( m_len < 2 || | 615 | 7.83M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 1.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 | 1.04M | (m_len == 2 && op == out) || | 622 | 1.04M | #endif | 623 | 1.04M | (op == out && lit == 0)) | 624 | 14.1M | { | 625 | | /* a literal */ | 626 | 14.1M | m_len = 0; | 627 | 14.1M | } | 628 | 1.04M | else if (m_len == M2_MIN_LEN) | 629 | 300k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 300k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 106k | m_len = 0; | 633 | 300k | } | 634 | | | 635 | 15.1M | if (m_len == 0) | 636 | 14.2M | { | 637 | | /* a literal */ | 638 | 14.2M | lit++; | 639 | 14.2M | swd->max_chain = max_chain; | 640 | 14.2M | r = find_match(c,swd,1,0); | 641 | 14.2M | assert(r == 0); LZO_UNUSED(r); | 642 | 14.2M | continue; | 643 | 14.2M | } | 644 | | | 645 | | /* a match */ | 646 | 939k | #if defined(SWD_BEST_OFF) | 647 | 939k | if (swd->use_best_off) | 648 | 939k | better_match(swd,&m_len,&m_off); | 649 | 939k | #endif | 650 | 939k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 939k | ahead = 0; | 655 | 939k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 20.8k | { | 657 | | /* no */ | 658 | 20.8k | l1 = 0; | 659 | 20.8k | max_ahead = 0; | 660 | 20.8k | } | 661 | 918k | else | 662 | 918k | { | 663 | | /* yes, try a lazy match */ | 664 | 918k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 918k | assert(l1 > 0); | 666 | 918k | #if 1 | 667 | 918k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 918k | } | 672 | | | 673 | | | 674 | 1.98M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.24M | { | 676 | 1.24M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.24M | if (m_len >= good_length) | 679 | 75.4k | swd->max_chain = max_chain >> 2; | 680 | 1.17M | else | 681 | 1.17M | swd->max_chain = max_chain; | 682 | 1.24M | r = find_match(c,swd,1,0); | 683 | 1.24M | ahead++; | 684 | | | 685 | 1.24M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.24M | assert(c->look > 0); | 687 | 1.24M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | | #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.24M | if (c->m_len < m_len) | 695 | 787k | continue; | 696 | 457k | #if 1 | 697 | 457k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 115k | continue; | 699 | 342k | #endif | 700 | 342k | #if defined(SWD_BEST_OFF) | 701 | 342k | if (swd->use_best_off) | 702 | 342k | better_match(swd,&c->m_len,&c->m_off); | 703 | 342k | #endif | 704 | 342k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 342k | if (l2 == 0) | 706 | 1.19k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 340k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 340k | 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 | 340k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 340k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 202k | { | 723 | 202k | c->lazy++; | 724 | 202k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 202k | if (l3) | 727 | 283 | { | 728 | | /* code previous run */ | 729 | 283 | op = code_run(c,op,ii,lit,ahead); | 730 | 283 | lit = 0; | 731 | | /* code shortened match */ | 732 | 283 | op = code_match(c,op,ahead,m_off); | 733 | 283 | } | 734 | 202k | else | 735 | 202k | { | 736 | 202k | lit += ahead; | 737 | 202k | assert(ii + lit == c->bp); | 738 | 202k | } | 739 | 202k | goto lazy_match_done; | 740 | 202k | } | 741 | 340k | } | 742 | | | 743 | | | 744 | 939k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 736k | op = code_run(c,op,ii,lit,m_len); | 748 | 736k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 736k | op = code_match(c,op,m_len,m_off); | 752 | 736k | swd->max_chain = max_chain; | 753 | 736k | r = find_match(c,swd,m_len,1+ahead); | 754 | 736k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 939k | lazy_match_done: ; | 757 | 939k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.05k | if (lit > 0) | 762 | 598 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.05k | #if defined(LZO_EOF_CODE) | 765 | 1.05k | *op++ = M4_MARKER | 1; | 766 | 1.05k | *op++ = 0; | 767 | 1.05k | *op++ = 0; | 768 | 1.05k | #endif | 769 | | | 770 | 1.05k | c->codesize = pd(op, out); | 771 | 1.05k | assert(c->textsize == in_len); | 772 | | | 773 | 1.05k | *out_len = pd(op, out); | 774 | | | 775 | 1.05k | 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.05k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.05k | return LZO_E_OK; | 787 | 1.05k | } |
lzo1z_999_compress_internal Line | Count | Source | 532 | 1.32k | { | 533 | 1.32k | lzo_bytep op; | 534 | 1.32k | const lzo_bytep ii; | 535 | 1.32k | lzo_uint lit; | 536 | 1.32k | lzo_uint m_len, m_off; | 537 | 1.32k | LZO_COMPRESS_T cc; | 538 | 1.32k | LZO_COMPRESS_T * const c = &cc; | 539 | 1.32k | lzo_swd_p const swd = (lzo_swd_p) wrkmem; | 540 | 1.32k | lzo_uint try_lazy; | 541 | 1.32k | 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.32k | 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.32k | try_lazy = (lzo_uint) try_lazy_parm; | 557 | 1.32k | 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.32k | 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.32k | if (max_lazy == 0) | 564 | 0 | max_lazy = 32; | 565 | | /* stop searching for longer matches than this one */ | 566 | 1.32k | if (nice_length == 0) | 567 | 1.32k | nice_length = 0; | 568 | | /* don't search more positions than this */ | 569 | 1.32k | if (max_chain == 0) | 570 | 0 | max_chain = SWD_MAX_CHAIN; | 571 | | | 572 | 1.32k | c->init = 0; | 573 | 1.32k | c->ip = c->in = in; | 574 | 1.32k | c->in_end = in + in_len; | 575 | 1.32k | c->out = out; | 576 | 1.32k | c->cb = cb; | 577 | 1.32k | c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0; | 578 | 1.32k | c->lit1_r = c->lit2_r = c->lit3_r = 0; | 579 | | | 580 | 1.32k | op = out; | 581 | 1.32k | ii = c->ip; /* point to start of literal run */ | 582 | 1.32k | lit = 0; | 583 | 1.32k | c->r1_lit = c->r1_m_len = 0; | 584 | | | 585 | 1.32k | r = init_match(c,swd,dict,dict_len,flags); | 586 | 1.32k | if (r != 0) | 587 | 0 | return r; | 588 | 1.32k | if (max_chain > 0) | 589 | 1.32k | swd->max_chain = max_chain; | 590 | 1.32k | if (nice_length > 0) | 591 | 0 | swd->nice_length = nice_length; | 592 | | | 593 | 1.32k | r = find_match(c,swd,0,0); | 594 | 1.32k | if (r != 0) | 595 | 0 | return r; | 596 | 12.2M | while (c->look > 0) | 597 | 12.2M | { | 598 | 12.2M | lzo_uint ahead; | 599 | 12.2M | lzo_uint max_ahead; | 600 | 12.2M | lzo_uint l1, l2, l3; | 601 | | | 602 | 12.2M | c->codesize = pd(op, out); | 603 | | | 604 | 12.2M | m_len = c->m_len; | 605 | 12.2M | m_off = c->m_off; | 606 | | | 607 | 12.2M | assert(c->bp == c->ip - c->look); | 608 | 12.2M | assert(c->bp >= in); | 609 | 12.2M | if (lit == 0) | 610 | 773k | ii = c->bp; | 611 | 12.2M | assert(ii + lit == c->bp); | 612 | 12.2M | assert(swd->b_char == *(c->bp)); | 613 | | | 614 | 12.2M | if ( m_len < 2 || | 615 | 5.98M | (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) || | 616 | 987k | #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 | 987k | (m_len == 2 && op == out) || | 622 | 986k | #endif | 623 | 986k | (op == out && lit == 0)) | 624 | 11.2M | { | 625 | | /* a literal */ | 626 | 11.2M | m_len = 0; | 627 | 11.2M | } | 628 | 986k | else if (m_len == M2_MIN_LEN) | 629 | 216k | { | 630 | | /* compression ratio improves if we code a literal in some cases */ | 631 | 216k | if (m_off > MX_MAX_OFFSET && lit >= 4) | 632 | 40.6k | m_len = 0; | 633 | 216k | } | 634 | | | 635 | 12.2M | if (m_len == 0) | 636 | 11.2M | { | 637 | | /* a literal */ | 638 | 11.2M | lit++; | 639 | 11.2M | swd->max_chain = max_chain; | 640 | 11.2M | r = find_match(c,swd,1,0); | 641 | 11.2M | assert(r == 0); LZO_UNUSED(r); | 642 | 11.2M | continue; | 643 | 11.2M | } | 644 | | | 645 | | /* a match */ | 646 | 946k | #if defined(SWD_BEST_OFF) | 647 | 946k | if (swd->use_best_off) | 648 | 946k | better_match(swd,&m_len,&m_off); | 649 | 946k | #endif | 650 | 946k | assert_match(swd,m_len,m_off); | 651 | | | 652 | | | 653 | | /* shall we try a lazy match ? */ | 654 | 946k | ahead = 0; | 655 | 946k | if (try_lazy == 0 || m_len >= max_lazy) | 656 | 24.4k | { | 657 | | /* no */ | 658 | 24.4k | l1 = 0; | 659 | 24.4k | max_ahead = 0; | 660 | 24.4k | } | 661 | 921k | else | 662 | 921k | { | 663 | | /* yes, try a lazy match */ | 664 | 921k | l1 = len_of_coded_match(m_len,m_off,lit); | 665 | 921k | assert(l1 > 0); | 666 | 921k | #if 1 | 667 | 921k | max_ahead = LZO_MIN(try_lazy, l1 - 1); | 668 | | #else | 669 | | max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1); | 670 | | #endif | 671 | 921k | } | 672 | | | 673 | | | 674 | 2.02M | while (ahead < max_ahead && c->look > m_len) | 675 | 1.25M | { | 676 | 1.25M | lzo_uint lazy_match_min_gain; | 677 | | | 678 | 1.25M | if (m_len >= good_length) | 679 | 76.0k | swd->max_chain = max_chain >> 2; | 680 | 1.17M | else | 681 | 1.17M | swd->max_chain = max_chain; | 682 | 1.25M | r = find_match(c,swd,1,0); | 683 | 1.25M | ahead++; | 684 | | | 685 | 1.25M | assert(r == 0); LZO_UNUSED(r); | 686 | 1.25M | assert(c->look > 0); | 687 | 1.25M | assert(ii + lit + ahead == c->bp); | 688 | | | 689 | 1.25M | #if defined(LZO1Z) | 690 | 1.25M | if (m_off == c->last_m_off && c->m_off != c->last_m_off) | 691 | 105k | if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN) | 692 | 8.39k | c->m_len = 0; | 693 | 1.25M | #endif | 694 | 1.25M | if (c->m_len < m_len) | 695 | 831k | continue; | 696 | 418k | #if 1 | 697 | 418k | if (c->m_len == m_len && c->m_off >= m_off) | 698 | 86.8k | continue; | 699 | 332k | #endif | 700 | 332k | #if defined(SWD_BEST_OFF) | 701 | 332k | if (swd->use_best_off) | 702 | 332k | better_match(swd,&c->m_len,&c->m_off); | 703 | 332k | #endif | 704 | 332k | l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead); | 705 | 332k | if (l2 == 0) | 706 | 1.11k | continue; | 707 | | #if 0 | 708 | | if (c->m_len == m_len && l2 >= l1) | 709 | | continue; | 710 | | #endif | 711 | | | 712 | | | 713 | 330k | #if 1 | 714 | | /* compressed-data compatibility [see above] */ | 715 | 330k | 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 | 330k | lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3); | 721 | 330k | if (c->m_len >= m_len + lazy_match_min_gain) | 722 | 174k | { | 723 | 174k | c->lazy++; | 724 | 174k | assert_match(swd,c->m_len,c->m_off); | 725 | | | 726 | 174k | if (l3) | 727 | 1.09k | { | 728 | | /* code previous run */ | 729 | 1.09k | op = code_run(c,op,ii,lit,ahead); | 730 | 1.09k | lit = 0; | 731 | | /* code shortened match */ | 732 | 1.09k | op = code_match(c,op,ahead,m_off); | 733 | 1.09k | } | 734 | 173k | else | 735 | 173k | { | 736 | 173k | lit += ahead; | 737 | 173k | assert(ii + lit == c->bp); | 738 | 173k | } | 739 | 174k | goto lazy_match_done; | 740 | 174k | } | 741 | 330k | } | 742 | | | 743 | | | 744 | 946k | assert(ii + lit + ahead == c->bp); | 745 | | | 746 | | /* 1 - code run */ | 747 | 771k | op = code_run(c,op,ii,lit,m_len); | 748 | 771k | lit = 0; | 749 | | | 750 | | /* 2 - code match */ | 751 | 771k | op = code_match(c,op,m_len,m_off); | 752 | 771k | swd->max_chain = max_chain; | 753 | 771k | r = find_match(c,swd,m_len,1+ahead); | 754 | 771k | assert(r == 0); LZO_UNUSED(r); | 755 | | | 756 | 946k | lazy_match_done: ; | 757 | 946k | } | 758 | | | 759 | | | 760 | | /* store final run */ | 761 | 1.32k | if (lit > 0) | 762 | 795 | op = STORE_RUN(c,op,ii,lit); | 763 | | | 764 | 1.32k | #if defined(LZO_EOF_CODE) | 765 | 1.32k | *op++ = M4_MARKER | 1; | 766 | 1.32k | *op++ = 0; | 767 | 1.32k | *op++ = 0; | 768 | 1.32k | #endif | 769 | | | 770 | 1.32k | c->codesize = pd(op, out); | 771 | 1.32k | assert(c->textsize == in_len); | 772 | | | 773 | 1.32k | *out_len = pd(op, out); | 774 | | | 775 | 1.32k | 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.32k | assert(c->lit_bytes + c->match_bytes == in_len); | 785 | | | 786 | 1.32k | return LZO_E_OK; | 787 | 1.32k | } |
|
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 | 3.44k | { |
802 | 3.44k | static const struct |
803 | 3.44k | { |
804 | 3.44k | int try_lazy_parm; |
805 | 3.44k | lzo_uint good_length; |
806 | 3.44k | lzo_uint max_lazy; |
807 | 3.44k | lzo_uint nice_length; |
808 | 3.44k | lzo_uint max_chain; |
809 | 3.44k | lzo_uint32_t flags; |
810 | 3.44k | } c[9] = { |
811 | | /* faster compression */ |
812 | 3.44k | { 0, 0, 0, 8, 4, 0 }, |
813 | 3.44k | { 0, 0, 0, 16, 8, 0 }, |
814 | 3.44k | { 0, 0, 0, 32, 16, 0 }, |
815 | 3.44k | { 1, 4, 4, 16, 16, 0 }, |
816 | 3.44k | { 1, 8, 16, 32, 32, 0 }, |
817 | 3.44k | { 1, 8, 16, 128, 128, 0 }, |
818 | 3.44k | { 2, 8, 32, 128, 256, 0 }, |
819 | 3.44k | { 2, 32, 128, SWD_F, 2048, 1 }, |
820 | 3.44k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } |
821 | | /* max. compression */ |
822 | 3.44k | }; |
823 | | |
824 | 3.44k | if (compression_level < 1 || compression_level > 9) |
825 | 0 | return LZO_E_ERROR; |
826 | | |
827 | 3.44k | compression_level -= 1; |
828 | 3.44k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, |
829 | 3.44k | dict, dict_len, cb, |
830 | 3.44k | c[compression_level].try_lazy_parm, |
831 | 3.44k | c[compression_level].good_length, |
832 | 3.44k | c[compression_level].max_lazy, |
833 | | #if 0 |
834 | | c[compression_level].nice_length, |
835 | | #else |
836 | 3.44k | 0, |
837 | 3.44k | #endif |
838 | 3.44k | c[compression_level].max_chain, |
839 | 3.44k | c[compression_level].flags); |
840 | 3.44k | } Line | Count | Source | 801 | 1.06k | { | 802 | 1.06k | static const struct | 803 | 1.06k | { | 804 | 1.06k | int try_lazy_parm; | 805 | 1.06k | lzo_uint good_length; | 806 | 1.06k | lzo_uint max_lazy; | 807 | 1.06k | lzo_uint nice_length; | 808 | 1.06k | lzo_uint max_chain; | 809 | 1.06k | lzo_uint32_t flags; | 810 | 1.06k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.06k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.06k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.06k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.06k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.06k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.06k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.06k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.06k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.06k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.06k | }; | 823 | | | 824 | 1.06k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.06k | compression_level -= 1; | 828 | 1.06k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.06k | dict, dict_len, cb, | 830 | 1.06k | c[compression_level].try_lazy_parm, | 831 | 1.06k | c[compression_level].good_length, | 832 | 1.06k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.06k | 0, | 837 | 1.06k | #endif | 838 | 1.06k | c[compression_level].max_chain, | 839 | 1.06k | c[compression_level].flags); | 840 | 1.06k | } |
Line | Count | Source | 801 | 1.05k | { | 802 | 1.05k | static const struct | 803 | 1.05k | { | 804 | 1.05k | int try_lazy_parm; | 805 | 1.05k | lzo_uint good_length; | 806 | 1.05k | lzo_uint max_lazy; | 807 | 1.05k | lzo_uint nice_length; | 808 | 1.05k | lzo_uint max_chain; | 809 | 1.05k | lzo_uint32_t flags; | 810 | 1.05k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.05k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.05k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.05k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.05k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.05k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.05k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.05k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.05k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.05k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.05k | }; | 823 | | | 824 | 1.05k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.05k | compression_level -= 1; | 828 | 1.05k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.05k | dict, dict_len, cb, | 830 | 1.05k | c[compression_level].try_lazy_parm, | 831 | 1.05k | c[compression_level].good_length, | 832 | 1.05k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.05k | 0, | 837 | 1.05k | #endif | 838 | 1.05k | c[compression_level].max_chain, | 839 | 1.05k | c[compression_level].flags); | 840 | 1.05k | } |
Line | Count | Source | 801 | 1.32k | { | 802 | 1.32k | static const struct | 803 | 1.32k | { | 804 | 1.32k | int try_lazy_parm; | 805 | 1.32k | lzo_uint good_length; | 806 | 1.32k | lzo_uint max_lazy; | 807 | 1.32k | lzo_uint nice_length; | 808 | 1.32k | lzo_uint max_chain; | 809 | 1.32k | lzo_uint32_t flags; | 810 | 1.32k | } c[9] = { | 811 | | /* faster compression */ | 812 | 1.32k | { 0, 0, 0, 8, 4, 0 }, | 813 | 1.32k | { 0, 0, 0, 16, 8, 0 }, | 814 | 1.32k | { 0, 0, 0, 32, 16, 0 }, | 815 | 1.32k | { 1, 4, 4, 16, 16, 0 }, | 816 | 1.32k | { 1, 8, 16, 32, 32, 0 }, | 817 | 1.32k | { 1, 8, 16, 128, 128, 0 }, | 818 | 1.32k | { 2, 8, 32, 128, 256, 0 }, | 819 | 1.32k | { 2, 32, 128, SWD_F, 2048, 1 }, | 820 | 1.32k | { 2, SWD_F, SWD_F, SWD_F, 4096, 1 } | 821 | | /* max. compression */ | 822 | 1.32k | }; | 823 | | | 824 | 1.32k | if (compression_level < 1 || compression_level > 9) | 825 | 0 | return LZO_E_ERROR; | 826 | | | 827 | 1.32k | compression_level -= 1; | 828 | 1.32k | return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem, | 829 | 1.32k | dict, dict_len, cb, | 830 | 1.32k | c[compression_level].try_lazy_parm, | 831 | 1.32k | c[compression_level].good_length, | 832 | 1.32k | c[compression_level].max_lazy, | 833 | | #if 0 | 834 | | c[compression_level].nice_length, | 835 | | #else | 836 | 1.32k | 0, | 837 | 1.32k | #endif | 838 | 1.32k | c[compression_level].max_chain, | 839 | 1.32k | c[compression_level].flags); | 840 | 1.32k | } |
|
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 | 3.44k | { |
862 | 3.44k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, |
863 | | NULL, 0, (lzo_callback_p) 0, 8); |
864 | 3.44k | } Line | Count | Source | 861 | 1.06k | { | 862 | 1.06k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.06k | } |
Line | Count | Source | 861 | 1.05k | { | 862 | 1.05k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.05k | } |
Line | Count | Source | 861 | 1.32k | { | 862 | 1.32k | return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem, | 863 | | NULL, 0, (lzo_callback_p) 0, 8); | 864 | 1.32k | } |
|
865 | | |
866 | | |
867 | | /* vim:set ts=4 sw=4 et: */ |