Coverage Report

Created: 2026-09-14 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/lzo-2.10/src/lzo1x_9x.c
Line
Count
Source
1
/* lzo1x_9x.c -- implementation of the LZO1X-999 compression algorithm
2
3
   This file is part of the LZO real-time data compression library.
4
5
   Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer
6
   All Rights Reserved.
7
8
   The LZO library is free software; you can redistribute it and/or
9
   modify it under the terms of the GNU General Public License as
10
   published by the Free Software Foundation; either version 2 of
11
   the License, or (at your option) any later version.
12
13
   The LZO library is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with the LZO library; see the file COPYING.
20
   If not, write to the Free Software Foundation, Inc.,
21
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
23
   Markus F.X.J. Oberhumer
24
   <markus@oberhumer.com>
25
   http://www.oberhumer.com/opensource/lzo/
26
 */
27
28
29
#if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z)
30
#  define LZO1X 1
31
#endif
32
33
#if defined(LZO1X)
34
#  include "config1x.h"
35
#elif defined(LZO1Y)
36
#  include "config1y.h"
37
#elif defined(LZO1Z)
38
#  include "config1z.h"
39
#else
40
#  error
41
#endif
42
43
44
/***********************************************************************
45
//
46
************************************************************************/
47
48
4.30k
#define SWD_N           M4_MAX_OFFSET   /* size of ring buffer */
49
39.4M
#define SWD_THRESHOLD       1           /* lower limit for match length */
50
21.5k
#define SWD_F            2048           /* upper limit for match length */
51
52
1.38G
#define SWD_BEST_OFF    (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1)
53
54
#if defined(LZO1X)
55
2.63k
#  define LZO_COMPRESS_T                lzo1x_999_t
56
1.31k
#  define lzo_swd_t                     lzo1x_999_swd_t
57
#elif defined(LZO1Y)
58
2.67k
#  define LZO_COMPRESS_T                lzo1y_999_t
59
1.33k
#  define lzo_swd_t                     lzo1y_999_swd_t
60
1.33k
#  define lzo1x_999_compress_internal   lzo1y_999_compress_internal
61
#  define lzo1x_999_compress_dict       lzo1y_999_compress_dict
62
1.33k
#  define lzo1x_999_compress_level      lzo1y_999_compress_level
63
#  define lzo1x_999_compress            lzo1y_999_compress
64
#elif defined(LZO1Z)
65
3.30k
#  define LZO_COMPRESS_T                lzo1z_999_t
66
1.65k
#  define lzo_swd_t                     lzo1z_999_swd_t
67
1.65k
#  define lzo1x_999_compress_internal   lzo1z_999_compress_internal
68
#  define lzo1x_999_compress_dict       lzo1z_999_compress_dict
69
1.65k
#  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.31M
{
109
2.31M
    lzo_uint x_len = m_len;
110
2.31M
    lzo_uint x_off = m_off;
111
112
2.31M
    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.31M
    assert(op > c->out);
143
2.31M
    if (m_len == 2)
144
807k
    {
145
807k
        assert(m_off <= M1_MAX_OFFSET);
146
807k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
807k
        m_off -= 1;
148
#if defined(LZO1Z)
149
359k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
359k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
447k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
447k
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
807k
        c->m1a_m++;
156
807k
    }
157
#if defined(LZO1Z)
158
564k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
939k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
498k
#endif
162
791k
    {
163
791k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
277k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
277k
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
220k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
220k
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
293k
        if (m_off == c->last_m_off)
176
11.8k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
281k
        else
178
281k
        {
179
281k
            m_off -= 1;
180
281k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
281k
            *op++ = LZO_BYTE(m_off << 2);
182
281k
        }
183
#endif
184
791k
        c->m2_m++;
185
791k
    }
186
712k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
13.5k
    {
188
13.5k
        assert(m_len == 3);
189
13.5k
        assert(m_off > M2_MAX_OFFSET);
190
13.5k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
3.78k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.78k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
9.81k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
9.81k
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
13.5k
        c->m1b_m++;
199
13.5k
    }
200
698k
    else if (m_off <= M3_MAX_OFFSET)
201
585k
    {
202
585k
        assert(m_len >= 3);
203
585k
        m_off -= 1;
204
585k
        if (m_len <= M3_MAX_LEN)
205
475k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
110k
        else
207
110k
        {
208
110k
            m_len -= M3_MAX_LEN;
209
110k
            *op++ = M3_MARKER | 0;
210
197k
            while (m_len > 255)
211
87.5k
            {
212
87.5k
                m_len -= 255;
213
87.5k
                *op++ = 0;
214
87.5k
            }
215
110k
            assert(m_len > 0);
216
110k
            *op++ = LZO_BYTE(m_len);
217
110k
        }
218
#if defined(LZO1Z)
219
224k
        *op++ = LZO_BYTE(m_off >> 6);
220
224k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
361k
        *op++ = LZO_BYTE(m_off << 2);
223
361k
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
585k
        c->m3_m++;
226
585k
    }
227
112k
    else
228
112k
    {
229
112k
        lzo_uint k;
230
231
112k
        assert(m_len >= 3);
232
112k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
112k
        m_off -= 0x4000;
234
112k
        k = (m_off & 0x4000) >> 11;
235
112k
        if (m_len <= M4_MAX_LEN)
236
68.8k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
43.8k
        else
238
43.8k
        {
239
43.8k
            m_len -= M4_MAX_LEN;
240
43.8k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
63.1k
            while (m_len > 255)
242
19.2k
            {
243
19.2k
                m_len -= 255;
244
19.2k
                *op++ = 0;
245
19.2k
            }
246
43.8k
            assert(m_len > 0);
247
43.8k
            *op++ = LZO_BYTE(m_len);
248
43.8k
        }
249
#if defined(LZO1Z)
250
42.4k
        *op++ = LZO_BYTE(m_off >> 6);
251
42.4k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
70.3k
        *op++ = LZO_BYTE(m_off << 2);
254
70.3k
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
112k
        c->m4_m++;
257
112k
    }
258
259
2.31M
    c->last_m_len = x_len;
260
2.31M
    c->last_m_off = x_off;
261
2.31M
    return op;
262
2.31M
}
lzo1x_9x.c:code_match
Line
Count
Source
108
686k
{
109
686k
    lzo_uint x_len = m_len;
110
686k
    lzo_uint x_off = m_off;
111
112
686k
    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
686k
    assert(op > c->out);
143
686k
    if (m_len == 2)
144
170k
    {
145
170k
        assert(m_off <= M1_MAX_OFFSET);
146
170k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
170k
        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
170k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
170k
        *op++ = LZO_BYTE(m_off >> 2);
154
170k
#endif
155
170k
        c->m1a_m++;
156
170k
    }
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
516k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
277k
#endif
162
277k
    {
163
277k
        assert(m_len >= 3);
164
277k
#if defined(LZO1X)
165
277k
        m_off -= 1;
166
277k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
277k
        *op++ = LZO_BYTE(m_off >> 3);
168
277k
        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
277k
        c->m2_m++;
185
277k
    }
186
238k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.41k
    {
188
3.41k
        assert(m_len == 3);
189
3.41k
        assert(m_off > M2_MAX_OFFSET);
190
3.41k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
3.41k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
3.41k
        *op++ = LZO_BYTE(m_off >> 2);
197
3.41k
#endif
198
3.41k
        c->m1b_m++;
199
3.41k
    }
200
235k
    else if (m_off <= M3_MAX_OFFSET)
201
197k
    {
202
197k
        assert(m_len >= 3);
203
197k
        m_off -= 1;
204
197k
        if (m_len <= M3_MAX_LEN)
205
161k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
36.4k
        else
207
36.4k
        {
208
36.4k
            m_len -= M3_MAX_LEN;
209
36.4k
            *op++ = M3_MARKER | 0;
210
64.0k
            while (m_len > 255)
211
27.5k
            {
212
27.5k
                m_len -= 255;
213
27.5k
                *op++ = 0;
214
27.5k
            }
215
36.4k
            assert(m_len > 0);
216
36.4k
            *op++ = LZO_BYTE(m_len);
217
36.4k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
197k
        *op++ = LZO_BYTE(m_off << 2);
223
197k
        *op++ = LZO_BYTE(m_off >> 6);
224
197k
#endif
225
197k
        c->m3_m++;
226
197k
    }
227
37.5k
    else
228
37.5k
    {
229
37.5k
        lzo_uint k;
230
231
37.5k
        assert(m_len >= 3);
232
37.5k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
37.5k
        m_off -= 0x4000;
234
37.5k
        k = (m_off & 0x4000) >> 11;
235
37.5k
        if (m_len <= M4_MAX_LEN)
236
22.8k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
14.6k
        else
238
14.6k
        {
239
14.6k
            m_len -= M4_MAX_LEN;
240
14.6k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
20.3k
            while (m_len > 255)
242
5.66k
            {
243
5.66k
                m_len -= 255;
244
5.66k
                *op++ = 0;
245
5.66k
            }
246
14.6k
            assert(m_len > 0);
247
14.6k
            *op++ = LZO_BYTE(m_len);
248
14.6k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
37.5k
        *op++ = LZO_BYTE(m_off << 2);
254
37.5k
        *op++ = LZO_BYTE(m_off >> 6);
255
37.5k
#endif
256
37.5k
        c->m4_m++;
257
37.5k
    }
258
259
686k
    c->last_m_len = x_len;
260
686k
    c->last_m_off = x_off;
261
686k
    return op;
262
686k
}
lzo1y_9x.c:code_match
Line
Count
Source
108
700k
{
109
700k
    lzo_uint x_len = m_len;
110
700k
    lzo_uint x_off = m_off;
111
112
700k
    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
700k
    assert(op > c->out);
143
700k
    if (m_len == 2)
144
277k
    {
145
277k
        assert(m_off <= M1_MAX_OFFSET);
146
277k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
277k
        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
277k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
277k
        *op++ = LZO_BYTE(m_off >> 2);
154
277k
#endif
155
277k
        c->m1a_m++;
156
277k
    }
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
423k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
220k
#endif
162
220k
    {
163
220k
        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
220k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
220k
        *op++ = LZO_BYTE(m_off >> 2);
173
220k
        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
220k
        c->m2_m++;
185
220k
    }
186
202k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
6.40k
    {
188
6.40k
        assert(m_len == 3);
189
6.40k
        assert(m_off > M2_MAX_OFFSET);
190
6.40k
        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
6.40k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
6.40k
        *op++ = LZO_BYTE(m_off >> 2);
197
6.40k
#endif
198
6.40k
        c->m1b_m++;
199
6.40k
    }
200
195k
    else if (m_off <= M3_MAX_OFFSET)
201
163k
    {
202
163k
        assert(m_len >= 3);
203
163k
        m_off -= 1;
204
163k
        if (m_len <= M3_MAX_LEN)
205
127k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
35.2k
        else
207
35.2k
        {
208
35.2k
            m_len -= M3_MAX_LEN;
209
35.2k
            *op++ = M3_MARKER | 0;
210
60.3k
            while (m_len > 255)
211
25.1k
            {
212
25.1k
                m_len -= 255;
213
25.1k
                *op++ = 0;
214
25.1k
            }
215
35.2k
            assert(m_len > 0);
216
35.2k
            *op++ = LZO_BYTE(m_len);
217
35.2k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
163k
        *op++ = LZO_BYTE(m_off << 2);
223
163k
        *op++ = LZO_BYTE(m_off >> 6);
224
163k
#endif
225
163k
        c->m3_m++;
226
163k
    }
227
32.7k
    else
228
32.7k
    {
229
32.7k
        lzo_uint k;
230
231
32.7k
        assert(m_len >= 3);
232
32.7k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
32.7k
        m_off -= 0x4000;
234
32.7k
        k = (m_off & 0x4000) >> 11;
235
32.7k
        if (m_len <= M4_MAX_LEN)
236
20.5k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
12.1k
        else
238
12.1k
        {
239
12.1k
            m_len -= M4_MAX_LEN;
240
12.1k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
18.3k
            while (m_len > 255)
242
6.23k
            {
243
6.23k
                m_len -= 255;
244
6.23k
                *op++ = 0;
245
6.23k
            }
246
12.1k
            assert(m_len > 0);
247
12.1k
            *op++ = LZO_BYTE(m_len);
248
12.1k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
32.7k
        *op++ = LZO_BYTE(m_off << 2);
254
32.7k
        *op++ = LZO_BYTE(m_off >> 6);
255
32.7k
#endif
256
32.7k
        c->m4_m++;
257
32.7k
    }
258
259
700k
    c->last_m_len = x_len;
260
700k
    c->last_m_off = x_off;
261
700k
    return op;
262
700k
}
lzo1z_9x.c:code_match
Line
Count
Source
108
923k
{
109
923k
    lzo_uint x_len = m_len;
110
923k
    lzo_uint x_off = m_off;
111
112
923k
    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
923k
    assert(op > c->out);
143
923k
    if (m_len == 2)
144
359k
    {
145
359k
        assert(m_off <= M1_MAX_OFFSET);
146
359k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
359k
        m_off -= 1;
148
359k
#if defined(LZO1Z)
149
359k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
359k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
359k
        c->m1a_m++;
156
359k
    }
157
564k
#if defined(LZO1Z)
158
564k
    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
293k
    {
163
293k
        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
293k
        if (m_off == c->last_m_off)
176
11.8k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
281k
        else
178
281k
        {
179
281k
            m_off -= 1;
180
281k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
281k
            *op++ = LZO_BYTE(m_off << 2);
182
281k
        }
183
293k
#endif
184
293k
        c->m2_m++;
185
293k
    }
186
271k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.78k
    {
188
3.78k
        assert(m_len == 3);
189
3.78k
        assert(m_off > M2_MAX_OFFSET);
190
3.78k
        m_off -= 1 + M2_MAX_OFFSET;
191
3.78k
#if defined(LZO1Z)
192
3.78k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.78k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
3.78k
        c->m1b_m++;
199
3.78k
    }
200
267k
    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
186k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
38.3k
        else
207
38.3k
        {
208
38.3k
            m_len -= M3_MAX_LEN;
209
38.3k
            *op++ = M3_MARKER | 0;
210
73.1k
            while (m_len > 255)
211
34.7k
            {
212
34.7k
                m_len -= 255;
213
34.7k
                *op++ = 0;
214
34.7k
            }
215
38.3k
            assert(m_len > 0);
216
38.3k
            *op++ = LZO_BYTE(m_len);
217
38.3k
        }
218
224k
#if defined(LZO1Z)
219
224k
        *op++ = LZO_BYTE(m_off >> 6);
220
224k
        *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
224k
        c->m3_m++;
226
224k
    }
227
42.4k
    else
228
42.4k
    {
229
42.4k
        lzo_uint k;
230
231
42.4k
        assert(m_len >= 3);
232
42.4k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
42.4k
        m_off -= 0x4000;
234
42.4k
        k = (m_off & 0x4000) >> 11;
235
42.4k
        if (m_len <= M4_MAX_LEN)
236
25.4k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
17.0k
        else
238
17.0k
        {
239
17.0k
            m_len -= M4_MAX_LEN;
240
17.0k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
24.3k
            while (m_len > 255)
242
7.32k
            {
243
7.32k
                m_len -= 255;
244
7.32k
                *op++ = 0;
245
7.32k
            }
246
17.0k
            assert(m_len > 0);
247
17.0k
            *op++ = LZO_BYTE(m_len);
248
17.0k
        }
249
42.4k
#if defined(LZO1Z)
250
42.4k
        *op++ = LZO_BYTE(m_off >> 6);
251
42.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
42.4k
        c->m4_m++;
257
42.4k
    }
258
259
923k
    c->last_m_len = x_len;
260
923k
    c->last_m_off = x_off;
261
923k
    return op;
262
923k
}
263
264
265
static lzo_bytep
266
STORE_RUN ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, lzo_uint t )
267
1.74M
{
268
1.74M
    c->lit_bytes += t;
269
270
1.74M
    if (op == c->out && t <= 238)
271
4.19k
    {
272
4.19k
        *op++ = LZO_BYTE(17 + t);
273
4.19k
    }
274
1.73M
    else if (t <= 3)
275
1.56M
    {
276
#if defined(LZO1Z)
277
655k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
912k
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
1.56M
        c->lit1_r++;
282
1.56M
    }
283
168k
    else if (t <= 18)
284
104k
    {
285
104k
        *op++ = LZO_BYTE(t - 3);
286
104k
        c->lit2_r++;
287
104k
    }
288
63.3k
    else
289
63.3k
    {
290
63.3k
        lzo_uint tt = t - 18;
291
292
63.3k
        *op++ = 0;
293
167k
        while (tt > 255)
294
104k
        {
295
104k
            tt -= 255;
296
104k
            *op++ = 0;
297
104k
        }
298
63.3k
        assert(tt > 0);
299
63.3k
        *op++ = LZO_BYTE(tt);
300
63.3k
        c->lit3_r++;
301
63.3k
    }
302
34.1M
    do *op++ = *ii++; while (--t > 0);
303
304
1.74M
    return op;
305
1.74M
}
lzo1x_9x.c:STORE_RUN
Line
Count
Source
267
478k
{
268
478k
    c->lit_bytes += t;
269
270
478k
    if (op == c->out && t <= 238)
271
1.29k
    {
272
1.29k
        *op++ = LZO_BYTE(17 + t);
273
1.29k
    }
274
476k
    else if (t <= 3)
275
421k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
421k
        op[-2] = LZO_BYTE(op[-2] | t);
280
421k
#endif
281
421k
        c->lit1_r++;
282
421k
    }
283
55.5k
    else if (t <= 18)
284
33.7k
    {
285
33.7k
        *op++ = LZO_BYTE(t - 3);
286
33.7k
        c->lit2_r++;
287
33.7k
    }
288
21.8k
    else
289
21.8k
    {
290
21.8k
        lzo_uint tt = t - 18;
291
292
21.8k
        *op++ = 0;
293
43.3k
        while (tt > 255)
294
21.5k
        {
295
21.5k
            tt -= 255;
296
21.5k
            *op++ = 0;
297
21.5k
        }
298
21.8k
        assert(tt > 0);
299
21.8k
        *op++ = LZO_BYTE(tt);
300
21.8k
        c->lit3_r++;
301
21.8k
    }
302
7.93M
    do *op++ = *ii++; while (--t > 0);
303
304
478k
    return op;
305
478k
}
lzo1y_9x.c:STORE_RUN
Line
Count
Source
267
548k
{
268
548k
    c->lit_bytes += t;
269
270
548k
    if (op == c->out && t <= 238)
271
1.29k
    {
272
1.29k
        *op++ = LZO_BYTE(17 + t);
273
1.29k
    }
274
546k
    else if (t <= 3)
275
491k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
491k
        op[-2] = LZO_BYTE(op[-2] | t);
280
491k
#endif
281
491k
        c->lit1_r++;
282
491k
    }
283
55.6k
    else if (t <= 18)
284
33.5k
    {
285
33.5k
        *op++ = LZO_BYTE(t - 3);
286
33.5k
        c->lit2_r++;
287
33.5k
    }
288
22.0k
    else
289
22.0k
    {
290
22.0k
        lzo_uint tt = t - 18;
291
292
22.0k
        *op++ = 0;
293
71.2k
        while (tt > 255)
294
49.2k
        {
295
49.2k
            tt -= 255;
296
49.2k
            *op++ = 0;
297
49.2k
        }
298
22.0k
        assert(tt > 0);
299
22.0k
        *op++ = LZO_BYTE(tt);
300
22.0k
        c->lit3_r++;
301
22.0k
    }
302
15.0M
    do *op++ = *ii++; while (--t > 0);
303
304
548k
    return op;
305
548k
}
lzo1z_9x.c:STORE_RUN
Line
Count
Source
267
714k
{
268
714k
    c->lit_bytes += t;
269
270
714k
    if (op == c->out && t <= 238)
271
1.60k
    {
272
1.60k
        *op++ = LZO_BYTE(17 + t);
273
1.60k
    }
274
712k
    else if (t <= 3)
275
655k
    {
276
655k
#if defined(LZO1Z)
277
655k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
655k
        c->lit1_r++;
282
655k
    }
283
56.9k
    else if (t <= 18)
284
37.4k
    {
285
37.4k
        *op++ = LZO_BYTE(t - 3);
286
37.4k
        c->lit2_r++;
287
37.4k
    }
288
19.5k
    else
289
19.5k
    {
290
19.5k
        lzo_uint tt = t - 18;
291
292
19.5k
        *op++ = 0;
293
53.2k
        while (tt > 255)
294
33.7k
        {
295
33.7k
            tt -= 255;
296
33.7k
            *op++ = 0;
297
33.7k
        }
298
19.5k
        assert(tt > 0);
299
19.5k
        *op++ = LZO_BYTE(tt);
300
19.5k
        c->lit3_r++;
301
19.5k
    }
302
11.2M
    do *op++ = *ii++; while (--t > 0);
303
304
714k
    return op;
305
714k
}
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.31M
{
312
2.31M
    if (lit > 0)
313
1.73M
    {
314
1.73M
        assert(m_len >= 2);
315
1.73M
        op = STORE_RUN(c,op,ii,lit);
316
1.73M
        c->r1_m_len = m_len;
317
1.73M
        c->r1_lit = lit;
318
1.73M
    }
319
572k
    else
320
572k
    {
321
572k
        assert(m_len >= 3);
322
572k
        c->r1_m_len = 0;
323
572k
        c->r1_lit = 0;
324
572k
    }
325
326
2.31M
    return op;
327
2.31M
}
lzo1x_9x.c:code_run
Line
Count
Source
311
686k
{
312
686k
    if (lit > 0)
313
477k
    {
314
477k
        assert(m_len >= 2);
315
477k
        op = STORE_RUN(c,op,ii,lit);
316
477k
        c->r1_m_len = m_len;
317
477k
        c->r1_lit = lit;
318
477k
    }
319
209k
    else
320
209k
    {
321
209k
        assert(m_len >= 3);
322
209k
        c->r1_m_len = 0;
323
209k
        c->r1_lit = 0;
324
209k
    }
325
326
686k
    return op;
327
686k
}
lzo1y_9x.c:code_run
Line
Count
Source
311
700k
{
312
700k
    if (lit > 0)
313
547k
    {
314
547k
        assert(m_len >= 2);
315
547k
        op = STORE_RUN(c,op,ii,lit);
316
547k
        c->r1_m_len = m_len;
317
547k
        c->r1_lit = lit;
318
547k
    }
319
153k
    else
320
153k
    {
321
153k
        assert(m_len >= 3);
322
153k
        c->r1_m_len = 0;
323
153k
        c->r1_lit = 0;
324
153k
    }
325
326
700k
    return op;
327
700k
}
lzo1z_9x.c:code_run
Line
Count
Source
311
923k
{
312
923k
    if (lit > 0)
313
713k
    {
314
713k
        assert(m_len >= 2);
315
713k
        op = STORE_RUN(c,op,ii,lit);
316
713k
        c->r1_m_len = m_len;
317
713k
        c->r1_lit = lit;
318
713k
    }
319
210k
    else
320
210k
    {
321
210k
        assert(m_len >= 3);
322
210k
        c->r1_m_len = 0;
323
210k
        c->r1_lit = 0;
324
210k
    }
325
326
923k
    return op;
327
923k
}
328
329
330
/***********************************************************************
331
//
332
************************************************************************/
333
334
static lzo_uint
335
len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit )
336
5.16M
{
337
5.16M
    lzo_uint n = 4;
338
339
5.16M
    if (m_len < 2)
340
1.08M
        return 0;
341
4.08M
    if (m_len == 2)
342
1.44M
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
2.63M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
1.24M
        return 2;
345
1.39M
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
16.0k
        return 2;
347
1.37M
    if (m_off <= M3_MAX_OFFSET)
348
1.12M
    {
349
1.12M
        if (m_len <= M3_MAX_LEN)
350
990k
            return 3;
351
132k
        m_len -= M3_MAX_LEN;
352
136k
        while (m_len > 255)
353
3.66k
        {
354
3.66k
            m_len -= 255;
355
3.66k
            n++;
356
3.66k
        }
357
132k
        return n;
358
1.12M
    }
359
251k
    if (m_off <= M4_MAX_OFFSET)
360
251k
    {
361
251k
        if (m_len <= M4_MAX_LEN)
362
170k
            return 3;
363
80.2k
        m_len -= M4_MAX_LEN;
364
82.3k
        while (m_len > 255)
365
2.09k
        {
366
2.09k
            m_len -= 255;
367
2.09k
            n++;
368
2.09k
        }
369
80.2k
        return n;
370
251k
    }
371
0
    return 0;
372
251k
}
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
298k
        return 0;
341
1.22M
    if (m_len == 2)
342
301k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
919k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
448k
        return 2;
345
471k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.05k
        return 2;
347
467k
    if (m_off <= M3_MAX_OFFSET)
348
383k
    {
349
383k
        if (m_len <= M3_MAX_LEN)
350
341k
            return 3;
351
42.4k
        m_len -= M3_MAX_LEN;
352
43.6k
        while (m_len > 255)
353
1.26k
        {
354
1.26k
            m_len -= 255;
355
1.26k
            n++;
356
1.26k
        }
357
42.4k
        return n;
358
383k
    }
359
83.6k
    if (m_off <= M4_MAX_OFFSET)
360
83.6k
    {
361
83.6k
        if (m_len <= M4_MAX_LEN)
362
56.7k
            return 3;
363
26.9k
        m_len -= M4_MAX_LEN;
364
27.6k
        while (m_len > 255)
365
750
        {
366
750
            m_len -= 255;
367
750
            n++;
368
750
        }
369
26.9k
        return n;
370
83.6k
    }
371
0
    return 0;
372
83.6k
}
lzo1y_9x.c:len_of_coded_match
Line
Count
Source
336
1.57M
{
337
1.57M
    lzo_uint n = 4;
338
339
1.57M
    if (m_len < 2)
340
341k
        return 0;
341
1.23M
    if (m_len == 2)
342
498k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
736k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
341k
        return 2;
345
395k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
7.31k
        return 2;
347
388k
    if (m_off <= M3_MAX_OFFSET)
348
318k
    {
349
318k
        if (m_len <= M3_MAX_LEN)
350
273k
            return 3;
351
45.0k
        m_len -= M3_MAX_LEN;
352
46.2k
        while (m_len > 255)
353
1.13k
        {
354
1.13k
            m_len -= 255;
355
1.13k
            n++;
356
1.13k
        }
357
45.0k
        return n;
358
318k
    }
359
69.9k
    if (m_off <= M4_MAX_OFFSET)
360
69.9k
    {
361
69.9k
        if (m_len <= M4_MAX_LEN)
362
48.0k
            return 3;
363
21.9k
        m_len -= M4_MAX_LEN;
364
22.5k
        while (m_len > 255)
365
634
        {
366
634
            m_len -= 255;
367
634
            n++;
368
634
        }
369
21.9k
        return n;
370
69.9k
    }
371
0
    return 0;
372
69.9k
}
lzo1z_9x.c:len_of_coded_match
Line
Count
Source
336
2.06M
{
337
2.06M
    lzo_uint n = 4;
338
339
2.06M
    if (m_len < 2)
340
440k
        return 0;
341
1.62M
    if (m_len == 2)
342
649k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
974k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
451k
        return 2;
345
523k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.72k
        return 2;
347
518k
    if (m_off <= M3_MAX_OFFSET)
348
421k
    {
349
421k
        if (m_len <= M3_MAX_LEN)
350
376k
            return 3;
351
45.0k
        m_len -= M3_MAX_LEN;
352
46.3k
        while (m_len > 255)
353
1.26k
        {
354
1.26k
            m_len -= 255;
355
1.26k
            n++;
356
1.26k
        }
357
45.0k
        return n;
358
421k
    }
359
97.5k
    if (m_off <= M4_MAX_OFFSET)
360
97.5k
    {
361
97.5k
        if (m_len <= M4_MAX_LEN)
362
66.1k
            return 3;
363
31.3k
        m_len -= M4_MAX_LEN;
364
32.1k
        while (m_len > 255)
365
713
        {
366
713
            m_len -= 255;
367
713
            n++;
368
713
        }
369
31.3k
        return n;
370
97.5k
    }
371
0
    return 0;
372
97.5k
}
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.20M
{
378
1.20M
    lzo_uint lazy_match_min_gain;
379
380
1.20M
    assert (ahead >= 1);
381
1.20M
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
1.20M
    if (lit1 <= 3)
389
1.18M
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
26.9k
    else if (lit1 <= 18)
391
17.6k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
1.20M
    lazy_match_min_gain += (l2 - l1) * 2;
394
1.20M
    if (l3)
395
5.39k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
1.20M
    if ((lzo_int) lazy_match_min_gain < 0)
398
77.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
1.20M
    return lazy_match_min_gain;
407
1.20M
}
lzo1x_9x.c:min_gain
Line
Count
Source
377
338k
{
378
338k
    lzo_uint lazy_match_min_gain;
379
380
338k
    assert (ahead >= 1);
381
338k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
338k
    if (lit1 <= 3)
389
329k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
9.21k
    else if (lit1 <= 18)
391
5.77k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
338k
    lazy_match_min_gain += (l2 - l1) * 2;
394
338k
    if (l3)
395
2.10k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
338k
    if ((lzo_int) lazy_match_min_gain < 0)
398
24.7k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
338k
    return lazy_match_min_gain;
407
338k
}
lzo1y_9x.c:min_gain
Line
Count
Source
377
378k
{
378
378k
    lzo_uint lazy_match_min_gain;
379
380
378k
    assert (ahead >= 1);
381
378k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
378k
    if (lit1 <= 3)
389
368k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
9.55k
    else if (lit1 <= 18)
391
6.00k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
378k
    lazy_match_min_gain += (l2 - l1) * 2;
394
378k
    if (l3)
395
874
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
378k
    if ((lzo_int) lazy_match_min_gain < 0)
398
25.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
378k
    return lazy_match_min_gain;
407
378k
}
lzo1z_9x.c:min_gain
Line
Count
Source
377
492k
{
378
492k
    lzo_uint lazy_match_min_gain;
379
380
492k
    assert (ahead >= 1);
381
492k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
492k
    if (lit1 <= 3)
389
484k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
8.20k
    else if (lit1 <= 18)
391
5.85k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
492k
    lazy_match_min_gain += (l2 - l1) * 2;
394
492k
    if (l3)
395
2.41k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
492k
    if ((lzo_int) lazy_match_min_gain < 0)
398
27.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
492k
    return lazy_match_min_gain;
407
492k
}
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.25M
#  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.99M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
3.99M
    if (*m_len <= M2_MIN_LEN)
459
1.85M
        return;
460
#if defined(LZO1Z)
461
782k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
9.59k
        return;
463
772k
#if 1
464
772k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
500k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.17k
    {
467
1.17k
        *m_len = *m_len - 1;
468
1.17k
        *m_off = swd->best_off[*m_len];
469
1.17k
        return;
470
1.17k
    }
471
771k
#endif
472
771k
#endif
473
474
2.12M
    if (*m_off <= M2_MAX_OFFSET)
475
1.13M
        return;
476
477
992k
#if 1
478
    /* M3/M4 -> M2 */
479
992k
    if (*m_off > M2_MAX_OFFSET &&
480
992k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
685k
        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
857k
#endif
488
489
857k
#if 1
490
    /* M4 -> M2 */
491
857k
    if (*m_off > M3_MAX_OFFSET &&
492
241k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
34.9k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
4.89k
    {
495
4.89k
        *m_len = *m_len - 2;
496
4.89k
        *m_off = swd->best_off[*m_len];
497
4.89k
        return;
498
4.89k
    }
499
852k
#endif
500
501
852k
#if 1
502
    /* M4 -> M3 */
503
852k
    if (*m_off > M3_MAX_OFFSET &&
504
237k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
77.9k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
11.7k
    {
507
11.7k
        *m_len = *m_len - 1;
508
11.7k
        *m_off = swd->best_off[*m_len];
509
11.7k
    }
510
852k
#endif
511
852k
}
lzo1x_9x.c:better_match
Line
Count
Source
453
1.19M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.19M
    if (*m_len <= M2_MIN_LEN)
459
435k
        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
759k
    if (*m_off <= M2_MAX_OFFSET)
475
430k
        return;
476
477
328k
#if 1
478
    /* M3/M4 -> M2 */
479
328k
    if (*m_off > M2_MAX_OFFSET &&
480
328k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
202k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
47.6k
    {
483
47.6k
        *m_len = *m_len - 1;
484
47.6k
        *m_off = swd->best_off[*m_len];
485
47.6k
        return;
486
47.6k
    }
487
281k
#endif
488
489
281k
#if 1
490
    /* M4 -> M2 */
491
281k
    if (*m_off > M3_MAX_OFFSET &&
492
80.7k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
7.35k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.22k
    {
495
1.22k
        *m_len = *m_len - 2;
496
1.22k
        *m_off = swd->best_off[*m_len];
497
1.22k
        return;
498
1.22k
    }
499
280k
#endif
500
501
280k
#if 1
502
    /* M4 -> M3 */
503
280k
    if (*m_off > M3_MAX_OFFSET &&
504
79.5k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
26.3k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.25k
    {
507
4.25k
        *m_len = *m_len - 1;
508
4.25k
        *m_off = swd->best_off[*m_len];
509
4.25k
    }
510
280k
#endif
511
280k
}
lzo1y_9x.c:better_match
Line
Count
Source
453
1.21M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.21M
    if (*m_len <= M2_MIN_LEN)
459
614k
        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
597k
    if (*m_off <= M2_MAX_OFFSET)
475
283k
        return;
476
477
314k
#if 1
478
    /* M3/M4 -> M2 */
479
314k
    if (*m_off > M2_MAX_OFFSET &&
480
314k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
270k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
39.4k
    {
483
39.4k
        *m_len = *m_len - 1;
484
39.4k
        *m_off = swd->best_off[*m_len];
485
39.4k
        return;
486
39.4k
    }
487
274k
#endif
488
489
274k
#if 1
490
    /* M4 -> M2 */
491
274k
    if (*m_off > M3_MAX_OFFSET &&
492
68.5k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
18.9k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
2.09k
    {
495
2.09k
        *m_len = *m_len - 2;
496
2.09k
        *m_off = swd->best_off[*m_len];
497
2.09k
        return;
498
2.09k
    }
499
272k
#endif
500
501
272k
#if 1
502
    /* M4 -> M3 */
503
272k
    if (*m_off > M3_MAX_OFFSET &&
504
66.4k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
20.8k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
2.75k
    {
507
2.75k
        *m_len = *m_len - 1;
508
2.75k
        *m_off = swd->best_off[*m_len];
509
2.75k
    }
510
272k
#endif
511
272k
}
lzo1z_9x.c:better_match
Line
Count
Source
453
1.58M
{
454
1.58M
#if defined(LZO1Z)
455
1.58M
    const LZO_COMPRESS_T *c = swd->c;
456
1.58M
#endif
457
458
1.58M
    if (*m_len <= M2_MIN_LEN)
459
805k
        return;
460
782k
#if defined(LZO1Z)
461
782k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
9.59k
        return;
463
772k
#if 1
464
772k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
500k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.17k
    {
467
1.17k
        *m_len = *m_len - 1;
468
1.17k
        *m_off = swd->best_off[*m_len];
469
1.17k
        return;
470
1.17k
    }
471
771k
#endif
472
771k
#endif
473
474
771k
    if (*m_off <= M2_MAX_OFFSET)
475
421k
        return;
476
477
349k
#if 1
478
    /* M3/M4 -> M2 */
479
349k
    if (*m_off > M2_MAX_OFFSET &&
480
349k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
213k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
48.0k
    {
483
48.0k
        *m_len = *m_len - 1;
484
48.0k
        *m_off = swd->best_off[*m_len];
485
48.0k
        return;
486
48.0k
    }
487
301k
#endif
488
489
301k
#if 1
490
    /* M4 -> M2 */
491
301k
    if (*m_off > M3_MAX_OFFSET &&
492
92.6k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
8.70k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.57k
    {
495
1.57k
        *m_len = *m_len - 2;
496
1.57k
        *m_off = swd->best_off[*m_len];
497
1.57k
        return;
498
1.57k
    }
499
300k
#endif
500
501
300k
#if 1
502
    /* M4 -> M3 */
503
300k
    if (*m_off > M3_MAX_OFFSET &&
504
91.1k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
30.8k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.75k
    {
507
4.75k
        *m_len = *m_len - 1;
508
4.75k
        *m_off = swd->best_off[*m_len];
509
4.75k
    }
510
300k
#endif
511
300k
}
512
513
#endif
514
515
516
/***********************************************************************
517
//
518
************************************************************************/
519
520
LZO_PUBLIC(int)
521
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
522
                                    lzo_bytep out, lzo_uintp out_len,
523
                                    lzo_voidp wrkmem,
524
                              const lzo_bytep dict, lzo_uint dict_len,
525
                                    lzo_callback_p cb,
526
                                    int try_lazy_parm,
527
                                    lzo_uint good_length,
528
                                    lzo_uint max_lazy,
529
                                    lzo_uint nice_length,
530
                                    lzo_uint max_chain,
531
                                    lzo_uint32_t flags )
532
4.30k
{
533
4.30k
    lzo_bytep op;
534
4.30k
    const lzo_bytep ii;
535
4.30k
    lzo_uint lit;
536
4.30k
    lzo_uint m_len, m_off;
537
4.30k
    LZO_COMPRESS_T cc;
538
4.30k
    LZO_COMPRESS_T * const c = &cc;
539
4.30k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
4.30k
    lzo_uint try_lazy;
541
4.30k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
1.31k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.33k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.65k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
4.30k
    try_lazy = (lzo_uint) try_lazy_parm;
557
4.30k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
4.30k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
4.30k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
4.30k
    if (nice_length == 0)
567
4.30k
        nice_length = 0;
568
    /* don't search more positions than this */
569
4.30k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
4.30k
    c->init = 0;
573
4.30k
    c->ip = c->in = in;
574
4.30k
    c->in_end = in + in_len;
575
4.30k
    c->out = out;
576
4.30k
    c->cb = cb;
577
4.30k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
4.30k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
4.30k
    op = out;
581
4.30k
    ii = c->ip;             /* point to start of literal run */
582
4.30k
    lit = 0;
583
4.30k
    c->r1_lit = c->r1_m_len = 0;
584
585
4.30k
    r = init_match(c,swd,dict,dict_len,flags);
586
4.30k
    if (r != 0)
587
0
        return r;
588
4.30k
    if (max_chain > 0)
589
4.30k
        swd->max_chain = max_chain;
590
4.30k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
4.30k
    r = find_match(c,swd,0,0);
594
4.30k
    if (r != 0)
595
0
        return r;
596
36.4M
    while (c->look > 0)
597
36.4M
    {
598
36.4M
        lzo_uint ahead;
599
36.4M
        lzo_uint max_ahead;
600
36.4M
        lzo_uint l1, l2, l3;
601
602
36.4M
        c->codesize = pd(op, out);
603
604
36.4M
        m_len = c->m_len;
605
36.4M
        m_off = c->m_off;
606
607
36.4M
        assert(c->bp == c->ip - c->look);
608
36.4M
        assert(c->bp >= in);
609
36.4M
        if (lit == 0)
610
2.31M
            ii = c->bp;
611
36.4M
        assert(ii + lit == c->bp);
612
36.4M
        assert(swd->b_char == *(c->bp));
613
614
36.4M
        if ( m_len < 2 ||
615
17.7M
            (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
33.5M
        {
625
            /* a literal */
626
33.5M
            m_len = 0;
627
33.5M
        }
628
2.88M
        else if (m_len == M2_MIN_LEN)
629
551k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
551k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
102k
                m_len = 0;
633
551k
        }
634
635
36.4M
        if (m_len == 0)
636
33.6M
        {
637
    /* a literal */
638
33.6M
            lit++;
639
33.6M
            swd->max_chain = max_chain;
640
33.6M
            r = find_match(c,swd,1,0);
641
33.6M
            assert(r == 0); LZO_UNUSED(r);
642
33.6M
            continue;
643
33.6M
        }
644
645
    /* a match */
646
2.78M
#if defined(SWD_BEST_OFF)
647
2.78M
        if (swd->use_best_off)
648
2.78M
            better_match(swd,&m_len,&m_off);
649
2.78M
#endif
650
2.78M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
2.78M
        ahead = 0;
655
2.78M
        if (try_lazy == 0 || m_len >= max_lazy)
656
43.1k
        {
657
            /* no */
658
43.1k
            l1 = 0;
659
43.1k
            max_ahead = 0;
660
43.1k
        }
661
2.73M
        else
662
2.73M
        {
663
            /* yes, try a lazy match */
664
2.73M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
2.73M
            assert(l1 > 0);
666
2.73M
#if 1
667
2.73M
            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.73M
        }
672
673
674
5.76M
        while (ahead < max_ahead && c->look > m_len)
675
3.45M
        {
676
3.45M
            lzo_uint lazy_match_min_gain;
677
678
3.45M
            if (m_len >= good_length)
679
188k
                swd->max_chain = max_chain >> 2;
680
3.26M
            else
681
3.26M
                swd->max_chain = max_chain;
682
3.45M
            r = find_match(c,swd,1,0);
683
3.45M
            ahead++;
684
685
3.45M
            assert(r == 0); LZO_UNUSED(r);
686
3.45M
            assert(c->look > 0);
687
3.45M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
1.35M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
315k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.05k
                    c->m_len = 0;
693
#endif
694
3.45M
            if (c->m_len < m_len)
695
1.99M
                continue;
696
1.46M
#if 1
697
1.46M
            if (c->m_len == m_len && c->m_off >= m_off)
698
250k
                continue;
699
1.21M
#endif
700
1.21M
#if defined(SWD_BEST_OFF)
701
1.21M
            if (swd->use_best_off)
702
1.21M
                better_match(swd,&c->m_len,&c->m_off);
703
1.21M
#endif
704
1.21M
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
1.21M
            if (l2 == 0)
706
5.01k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
1.20M
#if 1
714
            /* compressed-data compatibility [see above] */
715
1.20M
            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.20M
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
1.20M
            if (c->m_len >= m_len + lazy_match_min_gain)
722
473k
            {
723
473k
                c->lazy++;
724
473k
                assert_match(swd,c->m_len,c->m_off);
725
726
473k
                if (l3)
727
3.17k
                {
728
                    /* code previous run */
729
3.17k
                    op = code_run(c,op,ii,lit,ahead);
730
3.17k
                    lit = 0;
731
                    /* code shortened match */
732
3.17k
                    op = code_match(c,op,ahead,m_off);
733
3.17k
                }
734
470k
                else
735
470k
                {
736
470k
                    lit += ahead;
737
470k
                    assert(ii + lit == c->bp);
738
470k
                }
739
473k
                goto lazy_match_done;
740
473k
            }
741
1.20M
        }
742
743
744
2.78M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
2.30M
        op = code_run(c,op,ii,lit,m_len);
748
2.30M
        lit = 0;
749
750
        /* 2 - code match */
751
2.30M
        op = code_match(c,op,m_len,m_off);
752
2.30M
        swd->max_chain = max_chain;
753
2.30M
        r = find_match(c,swd,m_len,1+ahead);
754
2.30M
        assert(r == 0); LZO_UNUSED(r);
755
756
2.78M
lazy_match_done: ;
757
2.78M
    }
758
759
760
    /* store final run */
761
4.30k
    if (lit > 0)
762
2.74k
        op = STORE_RUN(c,op,ii,lit);
763
764
4.30k
#if defined(LZO_EOF_CODE)
765
4.30k
    *op++ = M4_MARKER | 1;
766
4.30k
    *op++ = 0;
767
4.30k
    *op++ = 0;
768
4.30k
#endif
769
770
4.30k
    c->codesize = pd(op, out);
771
4.30k
    assert(c->textsize == in_len);
772
773
4.30k
    *out_len = pd(op, out);
774
775
4.30k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
4.30k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
4.30k
    return LZO_E_OK;
787
4.30k
}
lzo1x_999_compress_internal
Line
Count
Source
532
1.31k
{
533
1.31k
    lzo_bytep op;
534
1.31k
    const lzo_bytep ii;
535
1.31k
    lzo_uint lit;
536
1.31k
    lzo_uint m_len, m_off;
537
1.31k
    LZO_COMPRESS_T cc;
538
1.31k
    LZO_COMPRESS_T * const c = &cc;
539
1.31k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.31k
    lzo_uint try_lazy;
541
1.31k
    int r;
542
543
    /* sanity check */
544
1.31k
#if defined(LZO1X)
545
1.31k
    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.31k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.31k
    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.31k
    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.31k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.31k
    if (nice_length == 0)
567
1.31k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.31k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.31k
    c->init = 0;
573
1.31k
    c->ip = c->in = in;
574
1.31k
    c->in_end = in + in_len;
575
1.31k
    c->out = out;
576
1.31k
    c->cb = cb;
577
1.31k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.31k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.31k
    op = out;
581
1.31k
    ii = c->ip;             /* point to start of literal run */
582
1.31k
    lit = 0;
583
1.31k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.31k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.31k
    if (r != 0)
587
0
        return r;
588
1.31k
    if (max_chain > 0)
589
1.31k
        swd->max_chain = max_chain;
590
1.31k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.31k
    r = find_match(c,swd,0,0);
594
1.31k
    if (r != 0)
595
0
        return r;
596
8.60M
    while (c->look > 0)
597
8.59M
    {
598
8.59M
        lzo_uint ahead;
599
8.59M
        lzo_uint max_ahead;
600
8.59M
        lzo_uint l1, l2, l3;
601
602
8.59M
        c->codesize = pd(op, out);
603
604
8.59M
        m_len = c->m_len;
605
8.59M
        m_off = c->m_off;
606
607
8.59M
        assert(c->bp == c->ip - c->look);
608
8.59M
        assert(c->bp >= in);
609
8.59M
        if (lit == 0)
610
687k
            ii = c->bp;
611
8.59M
        assert(ii + lit == c->bp);
612
8.59M
        assert(swd->b_char == *(c->bp));
613
614
8.59M
        if ( m_len < 2 ||
615
3.96M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
879k
#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
879k
            (m_len == 2 && op == out) ||
622
879k
#endif
623
879k
            (op == out && lit == 0))
624
7.72M
        {
625
            /* a literal */
626
7.72M
            m_len = 0;
627
7.72M
        }
628
879k
        else if (m_len == M2_MIN_LEN)
629
169k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
169k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
23.7k
                m_len = 0;
633
169k
        }
634
635
8.59M
        if (m_len == 0)
636
7.74M
        {
637
    /* a literal */
638
7.74M
            lit++;
639
7.74M
            swd->max_chain = max_chain;
640
7.74M
            r = find_match(c,swd,1,0);
641
7.74M
            assert(r == 0); LZO_UNUSED(r);
642
7.74M
            continue;
643
7.74M
        }
644
645
    /* a match */
646
855k
#if defined(SWD_BEST_OFF)
647
855k
        if (swd->use_best_off)
648
855k
            better_match(swd,&m_len,&m_off);
649
855k
#endif
650
855k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
855k
        ahead = 0;
655
855k
        if (try_lazy == 0 || m_len >= max_lazy)
656
14.3k
        {
657
            /* no */
658
14.3k
            l1 = 0;
659
14.3k
            max_ahead = 0;
660
14.3k
        }
661
841k
        else
662
841k
        {
663
            /* yes, try a lazy match */
664
841k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
841k
            assert(l1 > 0);
666
841k
#if 1
667
841k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
841k
        }
672
673
674
1.76M
        while (ahead < max_ahead && c->look > m_len)
675
1.08M
        {
676
1.08M
            lzo_uint lazy_match_min_gain;
677
678
1.08M
            if (m_len >= good_length)
679
61.8k
                swd->max_chain = max_chain >> 2;
680
1.02M
            else
681
1.02M
                swd->max_chain = max_chain;
682
1.08M
            r = find_match(c,swd,1,0);
683
1.08M
            ahead++;
684
685
1.08M
            assert(r == 0); LZO_UNUSED(r);
686
1.08M
            assert(c->look > 0);
687
1.08M
            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.08M
            if (c->m_len < m_len)
695
658k
                continue;
696
424k
#if 1
697
424k
            if (c->m_len == m_len && c->m_off >= m_off)
698
84.3k
                continue;
699
339k
#endif
700
339k
#if defined(SWD_BEST_OFF)
701
339k
            if (swd->use_best_off)
702
339k
                better_match(swd,&c->m_len,&c->m_off);
703
339k
#endif
704
339k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
339k
            if (l2 == 0)
706
1.34k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
338k
#if 1
714
            /* compressed-data compatibility [see above] */
715
338k
            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
338k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
338k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
170k
            {
723
170k
                c->lazy++;
724
170k
                assert_match(swd,c->m_len,c->m_off);
725
726
170k
                if (l3)
727
1.24k
                {
728
                    /* code previous run */
729
1.24k
                    op = code_run(c,op,ii,lit,ahead);
730
1.24k
                    lit = 0;
731
                    /* code shortened match */
732
1.24k
                    op = code_match(c,op,ahead,m_off);
733
1.24k
                }
734
169k
                else
735
169k
                {
736
169k
                    lit += ahead;
737
169k
                    assert(ii + lit == c->bp);
738
169k
                }
739
170k
                goto lazy_match_done;
740
170k
            }
741
338k
        }
742
743
744
855k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
685k
        op = code_run(c,op,ii,lit,m_len);
748
685k
        lit = 0;
749
750
        /* 2 - code match */
751
685k
        op = code_match(c,op,m_len,m_off);
752
685k
        swd->max_chain = max_chain;
753
685k
        r = find_match(c,swd,m_len,1+ahead);
754
685k
        assert(r == 0); LZO_UNUSED(r);
755
756
855k
lazy_match_done: ;
757
855k
    }
758
759
760
    /* store final run */
761
1.31k
    if (lit > 0)
762
806
        op = STORE_RUN(c,op,ii,lit);
763
764
1.31k
#if defined(LZO_EOF_CODE)
765
1.31k
    *op++ = M4_MARKER | 1;
766
1.31k
    *op++ = 0;
767
1.31k
    *op++ = 0;
768
1.31k
#endif
769
770
1.31k
    c->codesize = pd(op, out);
771
1.31k
    assert(c->textsize == in_len);
772
773
1.31k
    *out_len = pd(op, out);
774
775
1.31k
    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.31k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.31k
    return LZO_E_OK;
787
1.31k
}
lzo1y_999_compress_internal
Line
Count
Source
532
1.33k
{
533
1.33k
    lzo_bytep op;
534
1.33k
    const lzo_bytep ii;
535
1.33k
    lzo_uint lit;
536
1.33k
    lzo_uint m_len, m_off;
537
1.33k
    LZO_COMPRESS_T cc;
538
1.33k
    LZO_COMPRESS_T * const c = &cc;
539
1.33k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.33k
    lzo_uint try_lazy;
541
1.33k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.33k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.33k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.33k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.33k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.33k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.33k
    if (nice_length == 0)
567
1.33k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.33k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.33k
    c->init = 0;
573
1.33k
    c->ip = c->in = in;
574
1.33k
    c->in_end = in + in_len;
575
1.33k
    c->out = out;
576
1.33k
    c->cb = cb;
577
1.33k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.33k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.33k
    op = out;
581
1.33k
    ii = c->ip;             /* point to start of literal run */
582
1.33k
    lit = 0;
583
1.33k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.33k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.33k
    if (r != 0)
587
0
        return r;
588
1.33k
    if (max_chain > 0)
589
1.33k
        swd->max_chain = max_chain;
590
1.33k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.33k
    r = find_match(c,swd,0,0);
594
1.33k
    if (r != 0)
595
0
        return r;
596
15.7M
    while (c->look > 0)
597
15.6M
    {
598
15.6M
        lzo_uint ahead;
599
15.6M
        lzo_uint max_ahead;
600
15.6M
        lzo_uint l1, l2, l3;
601
602
15.6M
        c->codesize = pd(op, out);
603
604
15.6M
        m_len = c->m_len;
605
15.6M
        m_off = c->m_off;
606
607
15.6M
        assert(c->bp == c->ip - c->look);
608
15.6M
        assert(c->bp >= in);
609
15.6M
        if (lit == 0)
610
701k
            ii = c->bp;
611
15.6M
        assert(ii + lit == c->bp);
612
15.6M
        assert(swd->b_char == *(c->bp));
613
614
15.6M
        if ( m_len < 2 ||
615
7.84M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
880k
#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
880k
            (m_len == 2 && op == out) ||
622
880k
#endif
623
880k
            (op == out && lit == 0))
624
14.8M
        {
625
            /* a literal */
626
14.8M
            m_len = 0;
627
14.8M
        }
628
880k
        else if (m_len == M2_MIN_LEN)
629
175k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
175k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
48.5k
                m_len = 0;
633
175k
        }
634
635
15.6M
        if (m_len == 0)
636
14.8M
        {
637
    /* a literal */
638
14.8M
            lit++;
639
14.8M
            swd->max_chain = max_chain;
640
14.8M
            r = find_match(c,swd,1,0);
641
14.8M
            assert(r == 0); LZO_UNUSED(r);
642
14.8M
            continue;
643
14.8M
        }
644
645
    /* a match */
646
831k
#if defined(SWD_BEST_OFF)
647
831k
        if (swd->use_best_off)
648
831k
            better_match(swd,&m_len,&m_off);
649
831k
#endif
650
831k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
831k
        ahead = 0;
655
831k
        if (try_lazy == 0 || m_len >= max_lazy)
656
12.9k
        {
657
            /* no */
658
12.9k
            l1 = 0;
659
12.9k
            max_ahead = 0;
660
12.9k
        }
661
818k
        else
662
818k
        {
663
            /* yes, try a lazy match */
664
818k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
818k
            assert(l1 > 0);
666
818k
#if 1
667
818k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
818k
        }
672
673
674
1.72M
        while (ahead < max_ahead && c->look > m_len)
675
1.02M
        {
676
1.02M
            lzo_uint lazy_match_min_gain;
677
678
1.02M
            if (m_len >= good_length)
679
61.0k
                swd->max_chain = max_chain >> 2;
680
959k
            else
681
959k
                swd->max_chain = max_chain;
682
1.02M
            r = find_match(c,swd,1,0);
683
1.02M
            ahead++;
684
685
1.02M
            assert(r == 0); LZO_UNUSED(r);
686
1.02M
            assert(c->look > 0);
687
1.02M
            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.02M
            if (c->m_len < m_len)
695
563k
                continue;
696
456k
#if 1
697
456k
            if (c->m_len == m_len && c->m_off >= m_off)
698
76.2k
                continue;
699
379k
#endif
700
379k
#if defined(SWD_BEST_OFF)
701
379k
            if (swd->use_best_off)
702
379k
                better_match(swd,&c->m_len,&c->m_off);
703
379k
#endif
704
379k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
379k
            if (l2 == 0)
706
1.86k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
378k
#if 1
714
            /* compressed-data compatibility [see above] */
715
378k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
378k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
378k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
131k
            {
723
131k
                c->lazy++;
724
131k
                assert_match(swd,c->m_len,c->m_off);
725
726
131k
                if (l3)
727
685
                {
728
                    /* code previous run */
729
685
                    op = code_run(c,op,ii,lit,ahead);
730
685
                    lit = 0;
731
                    /* code shortened match */
732
685
                    op = code_match(c,op,ahead,m_off);
733
685
                }
734
130k
                else
735
130k
                {
736
130k
                    lit += ahead;
737
130k
                    assert(ii + lit == c->bp);
738
130k
                }
739
131k
                goto lazy_match_done;
740
131k
            }
741
378k
        }
742
743
744
831k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
700k
        op = code_run(c,op,ii,lit,m_len);
748
700k
        lit = 0;
749
750
        /* 2 - code match */
751
700k
        op = code_match(c,op,m_len,m_off);
752
700k
        swd->max_chain = max_chain;
753
700k
        r = find_match(c,swd,m_len,1+ahead);
754
700k
        assert(r == 0); LZO_UNUSED(r);
755
756
831k
lazy_match_done: ;
757
831k
    }
758
759
760
    /* store final run */
761
1.33k
    if (lit > 0)
762
813
        op = STORE_RUN(c,op,ii,lit);
763
764
1.33k
#if defined(LZO_EOF_CODE)
765
1.33k
    *op++ = M4_MARKER | 1;
766
1.33k
    *op++ = 0;
767
1.33k
    *op++ = 0;
768
1.33k
#endif
769
770
1.33k
    c->codesize = pd(op, out);
771
1.33k
    assert(c->textsize == in_len);
772
773
1.33k
    *out_len = pd(op, out);
774
775
1.33k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.33k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.33k
    return LZO_E_OK;
787
1.33k
}
lzo1z_999_compress_internal
Line
Count
Source
532
1.65k
{
533
1.65k
    lzo_bytep op;
534
1.65k
    const lzo_bytep ii;
535
1.65k
    lzo_uint lit;
536
1.65k
    lzo_uint m_len, m_off;
537
1.65k
    LZO_COMPRESS_T cc;
538
1.65k
    LZO_COMPRESS_T * const c = &cc;
539
1.65k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.65k
    lzo_uint try_lazy;
541
1.65k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.65k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.65k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.65k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.65k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.65k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.65k
    if (nice_length == 0)
567
1.65k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.65k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.65k
    c->init = 0;
573
1.65k
    c->ip = c->in = in;
574
1.65k
    c->in_end = in + in_len;
575
1.65k
    c->out = out;
576
1.65k
    c->cb = cb;
577
1.65k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.65k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.65k
    op = out;
581
1.65k
    ii = c->ip;             /* point to start of literal run */
582
1.65k
    lit = 0;
583
1.65k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.65k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.65k
    if (r != 0)
587
0
        return r;
588
1.65k
    if (max_chain > 0)
589
1.65k
        swd->max_chain = max_chain;
590
1.65k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.65k
    r = find_match(c,swd,0,0);
594
1.65k
    if (r != 0)
595
0
        return r;
596
12.1M
    while (c->look > 0)
597
12.1M
    {
598
12.1M
        lzo_uint ahead;
599
12.1M
        lzo_uint max_ahead;
600
12.1M
        lzo_uint l1, l2, l3;
601
602
12.1M
        c->codesize = pd(op, out);
603
604
12.1M
        m_len = c->m_len;
605
12.1M
        m_off = c->m_off;
606
607
12.1M
        assert(c->bp == c->ip - c->look);
608
12.1M
        assert(c->bp >= in);
609
12.1M
        if (lit == 0)
610
924k
            ii = c->bp;
611
12.1M
        assert(ii + lit == c->bp);
612
12.1M
        assert(swd->b_char == *(c->bp));
613
614
12.1M
        if ( m_len < 2 ||
615
5.90M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
1.12M
#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.12M
            (m_len == 2 && op == out) ||
622
1.12M
#endif
623
1.12M
            (op == out && lit == 0))
624
10.9M
        {
625
            /* a literal */
626
10.9M
            m_len = 0;
627
10.9M
        }
628
1.12M
        else if (m_len == M2_MIN_LEN)
629
206k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
206k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
30.4k
                m_len = 0;
633
206k
        }
634
635
12.1M
        if (m_len == 0)
636
11.0M
        {
637
    /* a literal */
638
11.0M
            lit++;
639
11.0M
            swd->max_chain = max_chain;
640
11.0M
            r = find_match(c,swd,1,0);
641
11.0M
            assert(r == 0); LZO_UNUSED(r);
642
11.0M
            continue;
643
11.0M
        }
644
645
    /* a match */
646
1.09M
#if defined(SWD_BEST_OFF)
647
1.09M
        if (swd->use_best_off)
648
1.09M
            better_match(swd,&m_len,&m_off);
649
1.09M
#endif
650
1.09M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
1.09M
        ahead = 0;
655
1.09M
        if (try_lazy == 0 || m_len >= max_lazy)
656
15.7k
        {
657
            /* no */
658
15.7k
            l1 = 0;
659
15.7k
            max_ahead = 0;
660
15.7k
        }
661
1.07M
        else
662
1.07M
        {
663
            /* yes, try a lazy match */
664
1.07M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
1.07M
            assert(l1 > 0);
666
1.07M
#if 1
667
1.07M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
1.07M
        }
672
673
674
2.27M
        while (ahead < max_ahead && c->look > m_len)
675
1.35M
        {
676
1.35M
            lzo_uint lazy_match_min_gain;
677
678
1.35M
            if (m_len >= good_length)
679
65.3k
                swd->max_chain = max_chain >> 2;
680
1.28M
            else
681
1.28M
                swd->max_chain = max_chain;
682
1.35M
            r = find_match(c,swd,1,0);
683
1.35M
            ahead++;
684
685
1.35M
            assert(r == 0); LZO_UNUSED(r);
686
1.35M
            assert(c->look > 0);
687
1.35M
            assert(ii + lit + ahead == c->bp);
688
689
1.35M
#if defined(LZO1Z)
690
1.35M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
315k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.05k
                    c->m_len = 0;
693
1.35M
#endif
694
1.35M
            if (c->m_len < m_len)
695
769k
                continue;
696
584k
#if 1
697
584k
            if (c->m_len == m_len && c->m_off >= m_off)
698
90.3k
                continue;
699
494k
#endif
700
494k
#if defined(SWD_BEST_OFF)
701
494k
            if (swd->use_best_off)
702
494k
                better_match(swd,&c->m_len,&c->m_off);
703
494k
#endif
704
494k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
494k
            if (l2 == 0)
706
1.80k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
492k
#if 1
714
            /* compressed-data compatibility [see above] */
715
492k
            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
492k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
492k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
171k
            {
723
171k
                c->lazy++;
724
171k
                assert_match(swd,c->m_len,c->m_off);
725
726
171k
                if (l3)
727
1.24k
                {
728
                    /* code previous run */
729
1.24k
                    op = code_run(c,op,ii,lit,ahead);
730
1.24k
                    lit = 0;
731
                    /* code shortened match */
732
1.24k
                    op = code_match(c,op,ahead,m_off);
733
1.24k
                }
734
170k
                else
735
170k
                {
736
170k
                    lit += ahead;
737
170k
                    assert(ii + lit == c->bp);
738
170k
                }
739
171k
                goto lazy_match_done;
740
171k
            }
741
492k
        }
742
743
744
1.09M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
922k
        op = code_run(c,op,ii,lit,m_len);
748
922k
        lit = 0;
749
750
        /* 2 - code match */
751
922k
        op = code_match(c,op,m_len,m_off);
752
922k
        swd->max_chain = max_chain;
753
922k
        r = find_match(c,swd,m_len,1+ahead);
754
922k
        assert(r == 0); LZO_UNUSED(r);
755
756
1.09M
lazy_match_done: ;
757
1.09M
    }
758
759
760
    /* store final run */
761
1.65k
    if (lit > 0)
762
1.12k
        op = STORE_RUN(c,op,ii,lit);
763
764
1.65k
#if defined(LZO_EOF_CODE)
765
1.65k
    *op++ = M4_MARKER | 1;
766
1.65k
    *op++ = 0;
767
1.65k
    *op++ = 0;
768
1.65k
#endif
769
770
1.65k
    c->codesize = pd(op, out);
771
1.65k
    assert(c->textsize == in_len);
772
773
1.65k
    *out_len = pd(op, out);
774
775
1.65k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.65k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.65k
    return LZO_E_OK;
787
1.65k
}
788
789
790
/***********************************************************************
791
//
792
************************************************************************/
793
794
LZO_PUBLIC(int)
795
lzo1x_999_compress_level    ( const lzo_bytep in , lzo_uint  in_len,
796
                                    lzo_bytep out, lzo_uintp out_len,
797
                                    lzo_voidp wrkmem,
798
                              const lzo_bytep dict, lzo_uint dict_len,
799
                                    lzo_callback_p cb,
800
                                    int compression_level )
801
4.30k
{
802
4.30k
    static const struct
803
4.30k
    {
804
4.30k
        int try_lazy_parm;
805
4.30k
        lzo_uint good_length;
806
4.30k
        lzo_uint max_lazy;
807
4.30k
        lzo_uint nice_length;
808
4.30k
        lzo_uint max_chain;
809
4.30k
        lzo_uint32_t flags;
810
4.30k
    } c[9] = {
811
        /* faster compression */
812
4.30k
        {   0,     0,     0,     8,    4,   0 },
813
4.30k
        {   0,     0,     0,    16,    8,   0 },
814
4.30k
        {   0,     0,     0,    32,   16,   0 },
815
4.30k
        {   1,     4,     4,    16,   16,   0 },
816
4.30k
        {   1,     8,    16,    32,   32,   0 },
817
4.30k
        {   1,     8,    16,   128,  128,   0 },
818
4.30k
        {   2,     8,    32,   128,  256,   0 },
819
4.30k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
4.30k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
4.30k
    };
823
824
4.30k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
4.30k
    compression_level -= 1;
828
4.30k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
4.30k
                                       dict, dict_len, cb,
830
4.30k
                                       c[compression_level].try_lazy_parm,
831
4.30k
                                       c[compression_level].good_length,
832
4.30k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
4.30k
                                       0,
837
4.30k
#endif
838
4.30k
                                       c[compression_level].max_chain,
839
4.30k
                                       c[compression_level].flags);
840
4.30k
}
lzo1x_999_compress_level
Line
Count
Source
801
1.31k
{
802
1.31k
    static const struct
803
1.31k
    {
804
1.31k
        int try_lazy_parm;
805
1.31k
        lzo_uint good_length;
806
1.31k
        lzo_uint max_lazy;
807
1.31k
        lzo_uint nice_length;
808
1.31k
        lzo_uint max_chain;
809
1.31k
        lzo_uint32_t flags;
810
1.31k
    } c[9] = {
811
        /* faster compression */
812
1.31k
        {   0,     0,     0,     8,    4,   0 },
813
1.31k
        {   0,     0,     0,    16,    8,   0 },
814
1.31k
        {   0,     0,     0,    32,   16,   0 },
815
1.31k
        {   1,     4,     4,    16,   16,   0 },
816
1.31k
        {   1,     8,    16,    32,   32,   0 },
817
1.31k
        {   1,     8,    16,   128,  128,   0 },
818
1.31k
        {   2,     8,    32,   128,  256,   0 },
819
1.31k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.31k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.31k
    };
823
824
1.31k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.31k
    compression_level -= 1;
828
1.31k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.31k
                                       dict, dict_len, cb,
830
1.31k
                                       c[compression_level].try_lazy_parm,
831
1.31k
                                       c[compression_level].good_length,
832
1.31k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.31k
                                       0,
837
1.31k
#endif
838
1.31k
                                       c[compression_level].max_chain,
839
1.31k
                                       c[compression_level].flags);
840
1.31k
}
lzo1y_999_compress_level
Line
Count
Source
801
1.33k
{
802
1.33k
    static const struct
803
1.33k
    {
804
1.33k
        int try_lazy_parm;
805
1.33k
        lzo_uint good_length;
806
1.33k
        lzo_uint max_lazy;
807
1.33k
        lzo_uint nice_length;
808
1.33k
        lzo_uint max_chain;
809
1.33k
        lzo_uint32_t flags;
810
1.33k
    } c[9] = {
811
        /* faster compression */
812
1.33k
        {   0,     0,     0,     8,    4,   0 },
813
1.33k
        {   0,     0,     0,    16,    8,   0 },
814
1.33k
        {   0,     0,     0,    32,   16,   0 },
815
1.33k
        {   1,     4,     4,    16,   16,   0 },
816
1.33k
        {   1,     8,    16,    32,   32,   0 },
817
1.33k
        {   1,     8,    16,   128,  128,   0 },
818
1.33k
        {   2,     8,    32,   128,  256,   0 },
819
1.33k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.33k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.33k
    };
823
824
1.33k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.33k
    compression_level -= 1;
828
1.33k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.33k
                                       dict, dict_len, cb,
830
1.33k
                                       c[compression_level].try_lazy_parm,
831
1.33k
                                       c[compression_level].good_length,
832
1.33k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.33k
                                       0,
837
1.33k
#endif
838
1.33k
                                       c[compression_level].max_chain,
839
1.33k
                                       c[compression_level].flags);
840
1.33k
}
lzo1z_999_compress_level
Line
Count
Source
801
1.65k
{
802
1.65k
    static const struct
803
1.65k
    {
804
1.65k
        int try_lazy_parm;
805
1.65k
        lzo_uint good_length;
806
1.65k
        lzo_uint max_lazy;
807
1.65k
        lzo_uint nice_length;
808
1.65k
        lzo_uint max_chain;
809
1.65k
        lzo_uint32_t flags;
810
1.65k
    } c[9] = {
811
        /* faster compression */
812
1.65k
        {   0,     0,     0,     8,    4,   0 },
813
1.65k
        {   0,     0,     0,    16,    8,   0 },
814
1.65k
        {   0,     0,     0,    32,   16,   0 },
815
1.65k
        {   1,     4,     4,    16,   16,   0 },
816
1.65k
        {   1,     8,    16,    32,   32,   0 },
817
1.65k
        {   1,     8,    16,   128,  128,   0 },
818
1.65k
        {   2,     8,    32,   128,  256,   0 },
819
1.65k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.65k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.65k
    };
823
824
1.65k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.65k
    compression_level -= 1;
828
1.65k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.65k
                                       dict, dict_len, cb,
830
1.65k
                                       c[compression_level].try_lazy_parm,
831
1.65k
                                       c[compression_level].good_length,
832
1.65k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.65k
                                       0,
837
1.65k
#endif
838
1.65k
                                       c[compression_level].max_chain,
839
1.65k
                                       c[compression_level].flags);
840
1.65k
}
841
842
843
/***********************************************************************
844
//
845
************************************************************************/
846
847
LZO_PUBLIC(int)
848
lzo1x_999_compress_dict     ( const lzo_bytep in , lzo_uint  in_len,
849
                                    lzo_bytep out, lzo_uintp out_len,
850
                                    lzo_voidp wrkmem,
851
                              const lzo_bytep dict, lzo_uint dict_len )
852
0
{
853
0
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
854
0
                                    dict, dict_len, 0, 8);
855
0
}
Unexecuted instantiation: lzo1x_999_compress_dict
Unexecuted instantiation: lzo1y_999_compress_dict
Unexecuted instantiation: lzo1z_999_compress_dict
856
857
LZO_PUBLIC(int)
858
lzo1x_999_compress  ( const lzo_bytep in , lzo_uint  in_len,
859
                            lzo_bytep out, lzo_uintp out_len,
860
                            lzo_voidp wrkmem )
861
4.30k
{
862
4.30k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
4.30k
}
lzo1x_999_compress
Line
Count
Source
861
1.31k
{
862
1.31k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.31k
}
lzo1y_999_compress
Line
Count
Source
861
1.33k
{
862
1.33k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.33k
}
lzo1z_999_compress
Line
Count
Source
861
1.65k
{
862
1.65k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.65k
}
865
866
867
/* vim:set ts=4 sw=4 et: */