Coverage Report

Created: 2026-02-14 06:27

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.00k
#define SWD_N           M4_MAX_OFFSET   /* size of ring buffer */
49
44.6M
#define SWD_THRESHOLD       1           /* lower limit for match length */
50
20.0k
#define SWD_F            2048           /* upper limit for match length */
51
52
1.55G
#define SWD_BEST_OFF    (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1)
53
54
#if defined(LZO1X)
55
2.45k
#  define LZO_COMPRESS_T                lzo1x_999_t
56
1.22k
#  define lzo_swd_t                     lzo1x_999_swd_t
57
#elif defined(LZO1Y)
58
2.52k
#  define LZO_COMPRESS_T                lzo1y_999_t
59
1.26k
#  define lzo_swd_t                     lzo1y_999_swd_t
60
1.26k
#  define lzo1x_999_compress_internal   lzo1y_999_compress_internal
61
#  define lzo1x_999_compress_dict       lzo1y_999_compress_dict
62
1.26k
#  define lzo1x_999_compress_level      lzo1y_999_compress_level
63
#  define lzo1x_999_compress            lzo1y_999_compress
64
#elif defined(LZO1Z)
65
3.02k
#  define LZO_COMPRESS_T                lzo1z_999_t
66
1.51k
#  define lzo_swd_t                     lzo1z_999_swd_t
67
1.51k
#  define lzo1x_999_compress_internal   lzo1z_999_compress_internal
68
#  define lzo1x_999_compress_dict       lzo1z_999_compress_dict
69
1.51k
#  define lzo1x_999_compress_level      lzo1z_999_compress_level
70
#  define lzo1x_999_compress            lzo1z_999_compress
71
#else
72
#  error
73
#endif
74
75
#if 0
76
#  define HEAD3(b,p) \
77
    ((((((lzo_xint)b[p]<<3)^b[p+1])<<3)^b[p+2]) & (SWD_HSIZE-1))
78
#endif
79
#if 0 && (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN)
80
#  define HEAD3(b,p) \
81
    (((* (lzo_uint32_tp) &b[p]) ^ ((* (lzo_uint32_tp) &b[p])>>10)) & (SWD_HSIZE-1))
82
#endif
83
84
#include "lzo_mchw.ch"
85
86
87
/* this is a public functions, but there is no prototype in a header file */
88
LZO_EXTERN(int)
89
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
90
                                    lzo_bytep out, lzo_uintp out_len,
91
                                    lzo_voidp wrkmem,
92
                              const lzo_bytep dict, lzo_uint dict_len,
93
                                    lzo_callback_p cb,
94
                                    int try_lazy_parm,
95
                                    lzo_uint good_length,
96
                                    lzo_uint max_lazy,
97
                                    lzo_uint nice_length,
98
                                    lzo_uint max_chain,
99
                                    lzo_uint32_t flags );
100
101
102
/***********************************************************************
103
//
104
************************************************************************/
105
106
static lzo_bytep
107
code_match ( LZO_COMPRESS_T *c, lzo_bytep op, lzo_uint m_len, lzo_uint m_off )
108
2.49M
{
109
2.49M
    lzo_uint x_len = m_len;
110
2.49M
    lzo_uint x_off = m_off;
111
112
2.49M
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
2.49M
    assert(op > c->out);
143
2.49M
    if (m_len == 2)
144
723k
    {
145
723k
        assert(m_off <= M1_MAX_OFFSET);
146
723k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
723k
        m_off -= 1;
148
#if defined(LZO1Z)
149
236k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
236k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
486k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
486k
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
723k
        c->m1a_m++;
156
723k
    }
157
#if defined(LZO1Z)
158
799k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
975k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
509k
#endif
162
881k
    {
163
881k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
270k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
270k
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
239k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
239k
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
372k
        if (m_off == c->last_m_off)
176
19.7k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
352k
        else
178
352k
        {
179
352k
            m_off -= 1;
180
352k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
352k
            *op++ = LZO_BYTE(m_off << 2);
182
352k
        }
183
#endif
184
881k
        c->m2_m++;
185
881k
    }
186
894k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
10.9k
    {
188
10.9k
        assert(m_len == 3);
189
10.9k
        assert(m_off > M2_MAX_OFFSET);
190
10.9k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
4.07k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
4.07k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
6.85k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
6.85k
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
10.9k
        c->m1b_m++;
199
10.9k
    }
200
883k
    else if (m_off <= M3_MAX_OFFSET)
201
660k
    {
202
660k
        assert(m_len >= 3);
203
660k
        m_off -= 1;
204
660k
        if (m_len <= M3_MAX_LEN)
205
546k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
114k
        else
207
114k
        {
208
114k
            m_len -= M3_MAX_LEN;
209
114k
            *op++ = M3_MARKER | 0;
210
202k
            while (m_len > 255)
211
88.5k
            {
212
88.5k
                m_len -= 255;
213
88.5k
                *op++ = 0;
214
88.5k
            }
215
114k
            assert(m_len > 0);
216
114k
            *op++ = LZO_BYTE(m_len);
217
114k
        }
218
#if defined(LZO1Z)
219
288k
        *op++ = LZO_BYTE(m_off >> 6);
220
288k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
371k
        *op++ = LZO_BYTE(m_off << 2);
223
371k
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
660k
        c->m3_m++;
226
660k
    }
227
222k
    else
228
222k
    {
229
222k
        lzo_uint k;
230
231
222k
        assert(m_len >= 3);
232
222k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
222k
        m_off -= 0x4000;
234
222k
        k = (m_off & 0x4000) >> 11;
235
222k
        if (m_len <= M4_MAX_LEN)
236
169k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
52.4k
        else
238
52.4k
        {
239
52.4k
            m_len -= M4_MAX_LEN;
240
52.4k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
73.2k
            while (m_len > 255)
242
20.8k
            {
243
20.8k
                m_len -= 255;
244
20.8k
                *op++ = 0;
245
20.8k
            }
246
52.4k
            assert(m_len > 0);
247
52.4k
            *op++ = LZO_BYTE(m_len);
248
52.4k
        }
249
#if defined(LZO1Z)
250
134k
        *op++ = LZO_BYTE(m_off >> 6);
251
134k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
87.7k
        *op++ = LZO_BYTE(m_off << 2);
254
87.7k
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
222k
        c->m4_m++;
257
222k
    }
258
259
2.49M
    c->last_m_len = x_len;
260
2.49M
    c->last_m_off = x_off;
261
2.49M
    return op;
262
2.49M
}
lzo1x_9x.c:code_match
Line
Count
Source
108
756k
{
109
756k
    lzo_uint x_len = m_len;
110
756k
    lzo_uint x_off = m_off;
111
112
756k
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
756k
    assert(op > c->out);
143
756k
    if (m_len == 2)
144
243k
    {
145
243k
        assert(m_off <= M1_MAX_OFFSET);
146
243k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
243k
        m_off -= 1;
148
#if defined(LZO1Z)
149
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
243k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
243k
        *op++ = LZO_BYTE(m_off >> 2);
154
243k
#endif
155
243k
        c->m1a_m++;
156
243k
    }
157
#if defined(LZO1Z)
158
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
512k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
270k
#endif
162
270k
    {
163
270k
        assert(m_len >= 3);
164
270k
#if defined(LZO1X)
165
270k
        m_off -= 1;
166
270k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
270k
        *op++ = LZO_BYTE(m_off >> 3);
168
270k
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
        if (m_off == c->last_m_off)
176
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
        else
178
        {
179
            m_off -= 1;
180
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
            *op++ = LZO_BYTE(m_off << 2);
182
        }
183
#endif
184
270k
        c->m2_m++;
185
270k
    }
186
242k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
2.59k
    {
188
2.59k
        assert(m_len == 3);
189
2.59k
        assert(m_off > M2_MAX_OFFSET);
190
2.59k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
2.59k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
2.59k
        *op++ = LZO_BYTE(m_off >> 2);
197
2.59k
#endif
198
2.59k
        c->m1b_m++;
199
2.59k
    }
200
239k
    else if (m_off <= M3_MAX_OFFSET)
201
194k
    {
202
194k
        assert(m_len >= 3);
203
194k
        m_off -= 1;
204
194k
        if (m_len <= M3_MAX_LEN)
205
159k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
35.5k
        else
207
35.5k
        {
208
35.5k
            m_len -= M3_MAX_LEN;
209
35.5k
            *op++ = M3_MARKER | 0;
210
59.1k
            while (m_len > 255)
211
23.5k
            {
212
23.5k
                m_len -= 255;
213
23.5k
                *op++ = 0;
214
23.5k
            }
215
35.5k
            assert(m_len > 0);
216
35.5k
            *op++ = LZO_BYTE(m_len);
217
35.5k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
194k
        *op++ = LZO_BYTE(m_off << 2);
223
194k
        *op++ = LZO_BYTE(m_off >> 6);
224
194k
#endif
225
194k
        c->m3_m++;
226
194k
    }
227
45.1k
    else
228
45.1k
    {
229
45.1k
        lzo_uint k;
230
231
45.1k
        assert(m_len >= 3);
232
45.1k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
45.1k
        m_off -= 0x4000;
234
45.1k
        k = (m_off & 0x4000) >> 11;
235
45.1k
        if (m_len <= M4_MAX_LEN)
236
26.7k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
18.3k
        else
238
18.3k
        {
239
18.3k
            m_len -= M4_MAX_LEN;
240
18.3k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
24.1k
            while (m_len > 255)
242
5.82k
            {
243
5.82k
                m_len -= 255;
244
5.82k
                *op++ = 0;
245
5.82k
            }
246
18.3k
            assert(m_len > 0);
247
18.3k
            *op++ = LZO_BYTE(m_len);
248
18.3k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
45.1k
        *op++ = LZO_BYTE(m_off << 2);
254
45.1k
        *op++ = LZO_BYTE(m_off >> 6);
255
45.1k
#endif
256
45.1k
        c->m4_m++;
257
45.1k
    }
258
259
756k
    c->last_m_len = x_len;
260
756k
    c->last_m_off = x_off;
261
756k
    return op;
262
756k
}
lzo1y_9x.c:code_match
Line
Count
Source
108
706k
{
109
706k
    lzo_uint x_len = m_len;
110
706k
    lzo_uint x_off = m_off;
111
112
706k
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
706k
    assert(op > c->out);
143
706k
    if (m_len == 2)
144
243k
    {
145
243k
        assert(m_off <= M1_MAX_OFFSET);
146
243k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
243k
        m_off -= 1;
148
#if defined(LZO1Z)
149
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
243k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
243k
        *op++ = LZO_BYTE(m_off >> 2);
154
243k
#endif
155
243k
        c->m1a_m++;
156
243k
    }
157
#if defined(LZO1Z)
158
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
463k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
239k
#endif
162
239k
    {
163
239k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
239k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
239k
        *op++ = LZO_BYTE(m_off >> 2);
173
239k
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
        if (m_off == c->last_m_off)
176
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
        else
178
        {
179
            m_off -= 1;
180
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
            *op++ = LZO_BYTE(m_off << 2);
182
        }
183
#endif
184
239k
        c->m2_m++;
185
239k
    }
186
224k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
4.26k
    {
188
4.26k
        assert(m_len == 3);
189
4.26k
        assert(m_off > M2_MAX_OFFSET);
190
4.26k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
4.26k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
4.26k
        *op++ = LZO_BYTE(m_off >> 2);
197
4.26k
#endif
198
4.26k
        c->m1b_m++;
199
4.26k
    }
200
219k
    else if (m_off <= M3_MAX_OFFSET)
201
177k
    {
202
177k
        assert(m_len >= 3);
203
177k
        m_off -= 1;
204
177k
        if (m_len <= M3_MAX_LEN)
205
138k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
38.3k
        else
207
38.3k
        {
208
38.3k
            m_len -= M3_MAX_LEN;
209
38.3k
            *op++ = M3_MARKER | 0;
210
66.6k
            while (m_len > 255)
211
28.3k
            {
212
28.3k
                m_len -= 255;
213
28.3k
                *op++ = 0;
214
28.3k
            }
215
38.3k
            assert(m_len > 0);
216
38.3k
            *op++ = LZO_BYTE(m_len);
217
38.3k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
177k
        *op++ = LZO_BYTE(m_off << 2);
223
177k
        *op++ = LZO_BYTE(m_off >> 6);
224
177k
#endif
225
177k
        c->m3_m++;
226
177k
    }
227
42.6k
    else
228
42.6k
    {
229
42.6k
        lzo_uint k;
230
231
42.6k
        assert(m_len >= 3);
232
42.6k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
42.6k
        m_off -= 0x4000;
234
42.6k
        k = (m_off & 0x4000) >> 11;
235
42.6k
        if (m_len <= M4_MAX_LEN)
236
28.6k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
13.9k
        else
238
13.9k
        {
239
13.9k
            m_len -= M4_MAX_LEN;
240
13.9k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
21.6k
            while (m_len > 255)
242
7.68k
            {
243
7.68k
                m_len -= 255;
244
7.68k
                *op++ = 0;
245
7.68k
            }
246
13.9k
            assert(m_len > 0);
247
13.9k
            *op++ = LZO_BYTE(m_len);
248
13.9k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
42.6k
        *op++ = LZO_BYTE(m_off << 2);
254
42.6k
        *op++ = LZO_BYTE(m_off >> 6);
255
42.6k
#endif
256
42.6k
        c->m4_m++;
257
42.6k
    }
258
259
706k
    c->last_m_len = x_len;
260
706k
    c->last_m_off = x_off;
261
706k
    return op;
262
706k
}
lzo1z_9x.c:code_match
Line
Count
Source
108
1.03M
{
109
1.03M
    lzo_uint x_len = m_len;
110
1.03M
    lzo_uint x_off = m_off;
111
112
1.03M
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
1.03M
    assert(op > c->out);
143
1.03M
    if (m_len == 2)
144
236k
    {
145
236k
        assert(m_off <= M1_MAX_OFFSET);
146
236k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
236k
        m_off -= 1;
148
236k
#if defined(LZO1Z)
149
236k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
236k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
236k
        c->m1a_m++;
156
236k
    }
157
799k
#if defined(LZO1Z)
158
799k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
#endif
162
372k
    {
163
372k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
372k
        if (m_off == c->last_m_off)
176
19.7k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
352k
        else
178
352k
        {
179
352k
            m_off -= 1;
180
352k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
352k
            *op++ = LZO_BYTE(m_off << 2);
182
352k
        }
183
372k
#endif
184
372k
        c->m2_m++;
185
372k
    }
186
427k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
4.07k
    {
188
4.07k
        assert(m_len == 3);
189
4.07k
        assert(m_off > M2_MAX_OFFSET);
190
4.07k
        m_off -= 1 + M2_MAX_OFFSET;
191
4.07k
#if defined(LZO1Z)
192
4.07k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
4.07k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
4.07k
        c->m1b_m++;
199
4.07k
    }
200
423k
    else if (m_off <= M3_MAX_OFFSET)
201
288k
    {
202
288k
        assert(m_len >= 3);
203
288k
        m_off -= 1;
204
288k
        if (m_len <= M3_MAX_LEN)
205
248k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
40.0k
        else
207
40.0k
        {
208
40.0k
            m_len -= M3_MAX_LEN;
209
40.0k
            *op++ = M3_MARKER | 0;
210
76.7k
            while (m_len > 255)
211
36.6k
            {
212
36.6k
                m_len -= 255;
213
36.6k
                *op++ = 0;
214
36.6k
            }
215
40.0k
            assert(m_len > 0);
216
40.0k
            *op++ = LZO_BYTE(m_len);
217
40.0k
        }
218
288k
#if defined(LZO1Z)
219
288k
        *op++ = LZO_BYTE(m_off >> 6);
220
288k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
        *op++ = LZO_BYTE(m_off << 2);
223
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
288k
        c->m3_m++;
226
288k
    }
227
134k
    else
228
134k
    {
229
134k
        lzo_uint k;
230
231
134k
        assert(m_len >= 3);
232
134k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
134k
        m_off -= 0x4000;
234
134k
        k = (m_off & 0x4000) >> 11;
235
134k
        if (m_len <= M4_MAX_LEN)
236
114k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
20.1k
        else
238
20.1k
        {
239
20.1k
            m_len -= M4_MAX_LEN;
240
20.1k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
27.4k
            while (m_len > 255)
242
7.32k
            {
243
7.32k
                m_len -= 255;
244
7.32k
                *op++ = 0;
245
7.32k
            }
246
20.1k
            assert(m_len > 0);
247
20.1k
            *op++ = LZO_BYTE(m_len);
248
20.1k
        }
249
134k
#if defined(LZO1Z)
250
134k
        *op++ = LZO_BYTE(m_off >> 6);
251
134k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
        *op++ = LZO_BYTE(m_off << 2);
254
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
134k
        c->m4_m++;
257
134k
    }
258
259
1.03M
    c->last_m_len = x_len;
260
1.03M
    c->last_m_off = x_off;
261
1.03M
    return op;
262
1.03M
}
263
264
265
static lzo_bytep
266
STORE_RUN ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, lzo_uint t )
267
1.82M
{
268
1.82M
    c->lit_bytes += t;
269
270
1.82M
    if (op == c->out && t <= 238)
271
3.88k
    {
272
3.88k
        *op++ = LZO_BYTE(17 + t);
273
3.88k
    }
274
1.81M
    else if (t <= 3)
275
1.65M
    {
276
#if defined(LZO1Z)
277
678k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
976k
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
1.65M
        c->lit1_r++;
282
1.65M
    }
283
162k
    else if (t <= 18)
284
108k
    {
285
108k
        *op++ = LZO_BYTE(t - 3);
286
108k
        c->lit2_r++;
287
108k
    }
288
53.8k
    else
289
53.8k
    {
290
53.8k
        lzo_uint tt = t - 18;
291
292
53.8k
        *op++ = 0;
293
177k
        while (tt > 255)
294
123k
        {
295
123k
            tt -= 255;
296
123k
            *op++ = 0;
297
123k
        }
298
53.8k
        assert(tt > 0);
299
53.8k
        *op++ = LZO_BYTE(tt);
300
53.8k
        c->lit3_r++;
301
53.8k
    }
302
38.8M
    do *op++ = *ii++; while (--t > 0);
303
304
1.82M
    return op;
305
1.82M
}
lzo1x_9x.c:STORE_RUN
Line
Count
Source
267
544k
{
268
544k
    c->lit_bytes += t;
269
270
544k
    if (op == c->out && t <= 238)
271
1.19k
    {
272
1.19k
        *op++ = LZO_BYTE(17 + t);
273
1.19k
    }
274
542k
    else if (t <= 3)
275
496k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
496k
        op[-2] = LZO_BYTE(op[-2] | t);
280
496k
#endif
281
496k
        c->lit1_r++;
282
496k
    }
283
46.0k
    else if (t <= 18)
284
32.3k
    {
285
32.3k
        *op++ = LZO_BYTE(t - 3);
286
32.3k
        c->lit2_r++;
287
32.3k
    }
288
13.6k
    else
289
13.6k
    {
290
13.6k
        lzo_uint tt = t - 18;
291
292
13.6k
        *op++ = 0;
293
45.5k
        while (tt > 255)
294
31.8k
        {
295
31.8k
            tt -= 255;
296
31.8k
            *op++ = 0;
297
31.8k
        }
298
13.6k
        assert(tt > 0);
299
13.6k
        *op++ = LZO_BYTE(tt);
300
13.6k
        c->lit3_r++;
301
13.6k
    }
302
10.0M
    do *op++ = *ii++; while (--t > 0);
303
304
544k
    return op;
305
544k
}
lzo1y_9x.c:STORE_RUN
Line
Count
Source
267
527k
{
268
527k
    c->lit_bytes += t;
269
270
527k
    if (op == c->out && t <= 238)
271
1.21k
    {
272
1.21k
        *op++ = LZO_BYTE(17 + t);
273
1.21k
    }
274
526k
    else if (t <= 3)
275
480k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
480k
        op[-2] = LZO_BYTE(op[-2] | t);
280
480k
#endif
281
480k
        c->lit1_r++;
282
480k
    }
283
46.4k
    else if (t <= 18)
284
26.3k
    {
285
26.3k
        *op++ = LZO_BYTE(t - 3);
286
26.3k
        c->lit2_r++;
287
26.3k
    }
288
20.1k
    else
289
20.1k
    {
290
20.1k
        lzo_uint tt = t - 18;
291
292
20.1k
        *op++ = 0;
293
75.8k
        while (tt > 255)
294
55.7k
        {
295
55.7k
            tt -= 255;
296
55.7k
            *op++ = 0;
297
55.7k
        }
298
20.1k
        assert(tt > 0);
299
20.1k
        *op++ = LZO_BYTE(tt);
300
20.1k
        c->lit3_r++;
301
20.1k
    }
302
16.7M
    do *op++ = *ii++; while (--t > 0);
303
304
527k
    return op;
305
527k
}
lzo1z_9x.c:STORE_RUN
Line
Count
Source
267
749k
{
268
749k
    c->lit_bytes += t;
269
270
749k
    if (op == c->out && t <= 238)
271
1.47k
    {
272
1.47k
        *op++ = LZO_BYTE(17 + t);
273
1.47k
    }
274
748k
    else if (t <= 3)
275
678k
    {
276
678k
#if defined(LZO1Z)
277
678k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
678k
        c->lit1_r++;
282
678k
    }
283
69.9k
    else if (t <= 18)
284
49.9k
    {
285
49.9k
        *op++ = LZO_BYTE(t - 3);
286
49.9k
        c->lit2_r++;
287
49.9k
    }
288
20.0k
    else
289
20.0k
    {
290
20.0k
        lzo_uint tt = t - 18;
291
292
20.0k
        *op++ = 0;
293
56.1k
        while (tt > 255)
294
36.0k
        {
295
36.0k
            tt -= 255;
296
36.0k
            *op++ = 0;
297
36.0k
        }
298
20.0k
        assert(tt > 0);
299
20.0k
        *op++ = LZO_BYTE(tt);
300
20.0k
        c->lit3_r++;
301
20.0k
    }
302
12.0M
    do *op++ = *ii++; while (--t > 0);
303
304
749k
    return op;
305
749k
}
306
307
308
static lzo_bytep
309
code_run ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii,
310
           lzo_uint lit, lzo_uint m_len )
311
2.49M
{
312
2.49M
    if (lit > 0)
313
1.81M
    {
314
1.81M
        assert(m_len >= 2);
315
1.81M
        op = STORE_RUN(c,op,ii,lit);
316
1.81M
        c->r1_m_len = m_len;
317
1.81M
        c->r1_lit = lit;
318
1.81M
    }
319
679k
    else
320
679k
    {
321
679k
        assert(m_len >= 3);
322
679k
        c->r1_m_len = 0;
323
679k
        c->r1_lit = 0;
324
679k
    }
325
326
2.49M
    return op;
327
2.49M
}
lzo1x_9x.c:code_run
Line
Count
Source
311
756k
{
312
756k
    if (lit > 0)
313
543k
    {
314
543k
        assert(m_len >= 2);
315
543k
        op = STORE_RUN(c,op,ii,lit);
316
543k
        c->r1_m_len = m_len;
317
543k
        c->r1_lit = lit;
318
543k
    }
319
213k
    else
320
213k
    {
321
213k
        assert(m_len >= 3);
322
213k
        c->r1_m_len = 0;
323
213k
        c->r1_lit = 0;
324
213k
    }
325
326
756k
    return op;
327
756k
}
lzo1y_9x.c:code_run
Line
Count
Source
311
706k
{
312
706k
    if (lit > 0)
313
527k
    {
314
527k
        assert(m_len >= 2);
315
527k
        op = STORE_RUN(c,op,ii,lit);
316
527k
        c->r1_m_len = m_len;
317
527k
        c->r1_lit = lit;
318
527k
    }
319
179k
    else
320
179k
    {
321
179k
        assert(m_len >= 3);
322
179k
        c->r1_m_len = 0;
323
179k
        c->r1_lit = 0;
324
179k
    }
325
326
706k
    return op;
327
706k
}
lzo1z_9x.c:code_run
Line
Count
Source
311
1.03M
{
312
1.03M
    if (lit > 0)
313
748k
    {
314
748k
        assert(m_len >= 2);
315
748k
        op = STORE_RUN(c,op,ii,lit);
316
748k
        c->r1_m_len = m_len;
317
748k
        c->r1_lit = lit;
318
748k
    }
319
287k
    else
320
287k
    {
321
287k
        assert(m_len >= 3);
322
287k
        c->r1_m_len = 0;
323
287k
        c->r1_lit = 0;
324
287k
    }
325
326
1.03M
    return op;
327
1.03M
}
328
329
330
/***********************************************************************
331
//
332
************************************************************************/
333
334
static lzo_uint
335
len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit )
336
5.52M
{
337
5.52M
    lzo_uint n = 4;
338
339
5.52M
    if (m_len < 2)
340
1.08M
        return 0;
341
4.44M
    if (m_len == 2)
342
1.30M
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
3.14M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
1.37M
        return 2;
345
1.76M
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
13.0k
        return 2;
347
1.75M
    if (m_off <= M3_MAX_OFFSET)
348
1.29M
    {
349
1.29M
        if (m_len <= M3_MAX_LEN)
350
1.16M
            return 3;
351
132k
        m_len -= M3_MAX_LEN;
352
136k
        while (m_len > 255)
353
3.97k
        {
354
3.97k
            m_len -= 255;
355
3.97k
            n++;
356
3.97k
        }
357
132k
        return n;
358
1.29M
    }
359
458k
    if (m_off <= M4_MAX_OFFSET)
360
458k
    {
361
458k
        if (m_len <= M4_MAX_LEN)
362
364k
            return 3;
363
94.1k
        m_len -= M4_MAX_LEN;
364
96.3k
        while (m_len > 255)
365
2.26k
        {
366
2.26k
            m_len -= 255;
367
2.26k
            n++;
368
2.26k
        }
369
94.1k
        return n;
370
458k
    }
371
0
    return 0;
372
458k
}
lzo1x_9x.c:len_of_coded_match
Line
Count
Source
336
1.66M
{
337
1.66M
    lzo_uint n = 4;
338
339
1.66M
    if (m_len < 2)
340
332k
        return 0;
341
1.32M
    if (m_len == 2)
342
422k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
905k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
427k
        return 2;
345
477k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
3.16k
        return 2;
347
474k
    if (m_off <= M3_MAX_OFFSET)
348
372k
    {
349
372k
        if (m_len <= M3_MAX_LEN)
350
332k
            return 3;
351
40.6k
        m_len -= M3_MAX_LEN;
352
42.0k
        while (m_len > 255)
353
1.40k
        {
354
1.40k
            m_len -= 255;
355
1.40k
            n++;
356
1.40k
        }
357
40.6k
        return n;
358
372k
    }
359
101k
    if (m_off <= M4_MAX_OFFSET)
360
101k
    {
361
101k
        if (m_len <= M4_MAX_LEN)
362
67.9k
            return 3;
363
33.4k
        m_len -= M4_MAX_LEN;
364
34.1k
        while (m_len > 255)
365
688
        {
366
688
            m_len -= 255;
367
688
            n++;
368
688
        }
369
33.4k
        return n;
370
101k
    }
371
0
    return 0;
372
101k
}
lzo1y_9x.c:len_of_coded_match
Line
Count
Source
336
1.58M
{
337
1.58M
    lzo_uint n = 4;
338
339
1.58M
    if (m_len < 2)
340
327k
        return 0;
341
1.25M
    if (m_len == 2)
342
438k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
818k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
370k
        return 2;
345
448k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.88k
        return 2;
347
443k
    if (m_off <= M3_MAX_OFFSET)
348
352k
    {
349
352k
        if (m_len <= M3_MAX_LEN)
350
306k
            return 3;
351
46.1k
        m_len -= M3_MAX_LEN;
352
47.3k
        while (m_len > 255)
353
1.18k
        {
354
1.18k
            m_len -= 255;
355
1.18k
            n++;
356
1.18k
        }
357
46.1k
        return n;
358
352k
    }
359
90.9k
    if (m_off <= M4_MAX_OFFSET)
360
90.9k
    {
361
90.9k
        if (m_len <= M4_MAX_LEN)
362
67.5k
            return 3;
363
23.4k
        m_len -= M4_MAX_LEN;
364
24.1k
        while (m_len > 255)
365
787
        {
366
787
            m_len -= 255;
367
787
            n++;
368
787
        }
369
23.4k
        return n;
370
90.9k
    }
371
0
    return 0;
372
90.9k
}
lzo1z_9x.c:len_of_coded_match
Line
Count
Source
336
2.28M
{
337
2.28M
    lzo_uint n = 4;
338
339
2.28M
    if (m_len < 2)
340
424k
        return 0;
341
1.85M
    if (m_len == 2)
342
439k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
1.41M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
579k
        return 2;
345
839k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
5.04k
        return 2;
347
834k
    if (m_off <= M3_MAX_OFFSET)
348
567k
    {
349
567k
        if (m_len <= M3_MAX_LEN)
350
522k
            return 3;
351
45.6k
        m_len -= M3_MAX_LEN;
352
47.0k
        while (m_len > 255)
353
1.38k
        {
354
1.38k
            m_len -= 255;
355
1.38k
            n++;
356
1.38k
        }
357
45.6k
        return n;
358
567k
    }
359
266k
    if (m_off <= M4_MAX_OFFSET)
360
266k
    {
361
266k
        if (m_len <= M4_MAX_LEN)
362
229k
            return 3;
363
37.2k
        m_len -= M4_MAX_LEN;
364
38.0k
        while (m_len > 255)
365
792
        {
366
792
            m_len -= 255;
367
792
            n++;
368
792
        }
369
37.2k
        return n;
370
266k
    }
371
0
    return 0;
372
266k
}
373
374
375
static lzo_uint
376
min_gain(lzo_uint ahead, lzo_uint lit1, lzo_uint lit2, lzo_uint l1, lzo_uint l2, lzo_uint l3)
377
1.25M
{
378
1.25M
    lzo_uint lazy_match_min_gain;
379
380
1.25M
    assert (ahead >= 1);
381
1.25M
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
1.25M
    if (lit1 <= 3)
389
1.22M
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
26.4k
    else if (lit1 <= 18)
391
19.9k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
1.25M
    lazy_match_min_gain += (l2 - l1) * 2;
394
1.25M
    if (l3)
395
5.69k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
1.25M
    if ((lzo_int) lazy_match_min_gain < 0)
398
117k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
1.25M
    return lazy_match_min_gain;
407
1.25M
}
lzo1x_9x.c:min_gain
Line
Count
Source
377
375k
{
378
375k
    lzo_uint lazy_match_min_gain;
379
380
375k
    assert (ahead >= 1);
381
375k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
375k
    if (lit1 <= 3)
389
367k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
7.55k
    else if (lit1 <= 18)
391
5.78k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
375k
    lazy_match_min_gain += (l2 - l1) * 2;
394
375k
    if (l3)
395
2.10k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
375k
    if ((lzo_int) lazy_match_min_gain < 0)
398
25.9k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
375k
    return lazy_match_min_gain;
407
375k
}
lzo1y_9x.c:min_gain
Line
Count
Source
377
370k
{
378
370k
    lzo_uint lazy_match_min_gain;
379
380
370k
    assert (ahead >= 1);
381
370k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
370k
    if (lit1 <= 3)
389
364k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
6.00k
    else if (lit1 <= 18)
391
3.85k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
370k
    lazy_match_min_gain += (l2 - l1) * 2;
394
370k
    if (l3)
395
1.30k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
370k
    if ((lzo_int) lazy_match_min_gain < 0)
398
28.1k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
370k
    return lazy_match_min_gain;
407
370k
}
lzo1z_9x.c:min_gain
Line
Count
Source
377
505k
{
378
505k
    lzo_uint lazy_match_min_gain;
379
380
505k
    assert (ahead >= 1);
381
505k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
505k
    if (lit1 <= 3)
389
492k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
12.8k
    else if (lit1 <= 18)
391
10.2k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
505k
    lazy_match_min_gain += (l2 - l1) * 2;
394
505k
    if (l3)
395
2.28k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
505k
    if ((lzo_int) lazy_match_min_gain < 0)
398
63.6k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
505k
    return lazy_match_min_gain;
407
505k
}
408
409
410
/***********************************************************************
411
//
412
************************************************************************/
413
414
#if !defined(NDEBUG)
415
static
416
void assert_match( const lzo_swd_p swd, lzo_uint m_len, lzo_uint m_off )
417
{
418
    const LZO_COMPRESS_T *c = swd->c;
419
    lzo_uint d_off;
420
421
    assert(m_len >= 2);
422
    if (m_off <= (lzo_uint) (c->bp - c->in))
423
    {
424
        assert(c->bp - m_off + m_len < c->ip);
425
        assert(lzo_memcmp(c->bp, c->bp - m_off, m_len) == 0);
426
    }
427
    else
428
    {
429
        assert(swd->dict != NULL);
430
        d_off = m_off - (lzo_uint) (c->bp - c->in);
431
        assert(d_off <= swd->dict_len);
432
        if (m_len > d_off)
433
        {
434
            assert(lzo_memcmp(c->bp, swd->dict_end - d_off, d_off) == 0);
435
            assert(c->in + m_len - d_off < c->ip);
436
            assert(lzo_memcmp(c->bp + d_off, c->in, m_len - d_off) == 0);
437
        }
438
        else
439
        {
440
            assert(lzo_memcmp(c->bp, swd->dict_end - d_off, m_len) == 0);
441
        }
442
    }
443
}
444
#else
445
3.63M
#  define assert_match(a,b,c)   ((void)0)
446
#endif
447
448
449
#if defined(SWD_BEST_OFF)
450
451
static void
452
better_match ( const lzo_swd_p swd, lzo_uint *m_len, lzo_uint *m_off )
453
4.32M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
4.32M
    if (*m_len <= M2_MIN_LEN)
459
1.89M
        return;
460
#if defined(LZO1Z)
461
1.03M
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
16.8k
        return;
463
1.01M
#if 1
464
1.01M
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
733k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
2.75k
    {
467
2.75k
        *m_len = *m_len - 1;
468
2.75k
        *m_off = swd->best_off[*m_len];
469
2.75k
        return;
470
2.75k
    }
471
1.01M
#endif
472
1.01M
#endif
473
474
2.40M
    if (*m_off <= M2_MAX_OFFSET)
475
1.21M
        return;
476
477
1.18M
#if 1
478
    /* M3/M4 -> M2 */
479
1.18M
    if (*m_off > M2_MAX_OFFSET &&
480
1.18M
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
872k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
139k
    {
483
139k
        *m_len = *m_len - 1;
484
139k
        *m_off = swd->best_off[*m_len];
485
139k
        return;
486
139k
    }
487
1.04M
#endif
488
489
1.04M
#if 1
490
    /* M4 -> M2 */
491
1.04M
    if (*m_off > M3_MAX_OFFSET &&
492
362k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
35.0k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
4.19k
    {
495
4.19k
        *m_len = *m_len - 2;
496
4.19k
        *m_off = swd->best_off[*m_len];
497
4.19k
        return;
498
4.19k
    }
499
1.04M
#endif
500
501
1.04M
#if 1
502
    /* M4 -> M3 */
503
1.04M
    if (*m_off > M3_MAX_OFFSET &&
504
357k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
89.8k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
11.6k
    {
507
11.6k
        *m_len = *m_len - 1;
508
11.6k
        *m_off = swd->best_off[*m_len];
509
11.6k
    }
510
1.04M
#endif
511
1.04M
}
lzo1x_9x.c:better_match
Line
Count
Source
453
1.29M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.29M
    if (*m_len <= M2_MIN_LEN)
459
567k
        return;
460
#if defined(LZO1Z)
461
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
        return;
463
#if 1
464
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
    {
467
        *m_len = *m_len - 1;
468
        *m_off = swd->best_off[*m_len];
469
        return;
470
    }
471
#endif
472
#endif
473
474
732k
    if (*m_off <= M2_MAX_OFFSET)
475
413k
        return;
476
477
319k
#if 1
478
    /* M3/M4 -> M2 */
479
319k
    if (*m_off > M2_MAX_OFFSET &&
480
319k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
197k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
42.2k
    {
483
42.2k
        *m_len = *m_len - 1;
484
42.2k
        *m_off = swd->best_off[*m_len];
485
42.2k
        return;
486
42.2k
    }
487
276k
#endif
488
489
276k
#if 1
490
    /* M4 -> M2 */
491
276k
    if (*m_off > M3_MAX_OFFSET &&
492
93.9k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
7.51k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.28k
    {
495
1.28k
        *m_len = *m_len - 2;
496
1.28k
        *m_off = swd->best_off[*m_len];
497
1.28k
        return;
498
1.28k
    }
499
275k
#endif
500
501
275k
#if 1
502
    /* M4 -> M3 */
503
275k
    if (*m_off > M3_MAX_OFFSET &&
504
92.6k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
31.9k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.28k
    {
507
4.28k
        *m_len = *m_len - 1;
508
4.28k
        *m_off = swd->best_off[*m_len];
509
4.28k
    }
510
275k
#endif
511
275k
}
lzo1y_9x.c:better_match
Line
Count
Source
453
1.23M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.23M
    if (*m_len <= M2_MIN_LEN)
459
573k
        return;
460
#if defined(LZO1Z)
461
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
        return;
463
#if 1
464
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
    {
467
        *m_len = *m_len - 1;
468
        *m_off = swd->best_off[*m_len];
469
        return;
470
    }
471
#endif
472
#endif
473
474
657k
    if (*m_off <= M2_MAX_OFFSET)
475
314k
        return;
476
477
342k
#if 1
478
    /* M3/M4 -> M2 */
479
342k
    if (*m_off > M2_MAX_OFFSET &&
480
342k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
289k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
37.3k
    {
483
37.3k
        *m_len = *m_len - 1;
484
37.3k
        *m_off = swd->best_off[*m_len];
485
37.3k
        return;
486
37.3k
    }
487
304k
#endif
488
489
304k
#if 1
490
    /* M4 -> M2 */
491
304k
    if (*m_off > M3_MAX_OFFSET &&
492
84.4k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
18.0k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.69k
    {
495
1.69k
        *m_len = *m_len - 2;
496
1.69k
        *m_off = swd->best_off[*m_len];
497
1.69k
        return;
498
1.69k
    }
499
302k
#endif
500
501
302k
#if 1
502
    /* M4 -> M3 */
503
302k
    if (*m_off > M3_MAX_OFFSET &&
504
82.7k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
21.7k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
2.75k
    {
507
2.75k
        *m_len = *m_len - 1;
508
2.75k
        *m_off = swd->best_off[*m_len];
509
2.75k
    }
510
302k
#endif
511
302k
}
lzo1z_9x.c:better_match
Line
Count
Source
453
1.79M
{
454
1.79M
#if defined(LZO1Z)
455
1.79M
    const LZO_COMPRESS_T *c = swd->c;
456
1.79M
#endif
457
458
1.79M
    if (*m_len <= M2_MIN_LEN)
459
757k
        return;
460
1.03M
#if defined(LZO1Z)
461
1.03M
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
16.8k
        return;
463
1.01M
#if 1
464
1.01M
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
733k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
2.75k
    {
467
2.75k
        *m_len = *m_len - 1;
468
2.75k
        *m_off = swd->best_off[*m_len];
469
2.75k
        return;
470
2.75k
    }
471
1.01M
#endif
472
1.01M
#endif
473
474
1.01M
    if (*m_off <= M2_MAX_OFFSET)
475
491k
        return;
476
477
525k
#if 1
478
    /* M3/M4 -> M2 */
479
525k
    if (*m_off > M2_MAX_OFFSET &&
480
525k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
386k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
59.6k
    {
483
59.6k
        *m_len = *m_len - 1;
484
59.6k
        *m_off = swd->best_off[*m_len];
485
59.6k
        return;
486
59.6k
    }
487
466k
#endif
488
489
466k
#if 1
490
    /* M4 -> M2 */
491
466k
    if (*m_off > M3_MAX_OFFSET &&
492
183k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
9.49k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.22k
    {
495
1.22k
        *m_len = *m_len - 2;
496
1.22k
        *m_off = swd->best_off[*m_len];
497
1.22k
        return;
498
1.22k
    }
499
465k
#endif
500
501
465k
#if 1
502
    /* M4 -> M3 */
503
465k
    if (*m_off > M3_MAX_OFFSET &&
504
182k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
36.1k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.66k
    {
507
4.66k
        *m_len = *m_len - 1;
508
4.66k
        *m_off = swd->best_off[*m_len];
509
4.66k
    }
510
465k
#endif
511
465k
}
512
513
#endif
514
515
516
/***********************************************************************
517
//
518
************************************************************************/
519
520
LZO_PUBLIC(int)
521
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
522
                                    lzo_bytep out, lzo_uintp out_len,
523
                                    lzo_voidp wrkmem,
524
                              const lzo_bytep dict, lzo_uint dict_len,
525
                                    lzo_callback_p cb,
526
                                    int try_lazy_parm,
527
                                    lzo_uint good_length,
528
                                    lzo_uint max_lazy,
529
                                    lzo_uint nice_length,
530
                                    lzo_uint max_chain,
531
                                    lzo_uint32_t flags )
532
4.00k
{
533
4.00k
    lzo_bytep op;
534
4.00k
    const lzo_bytep ii;
535
4.00k
    lzo_uint lit;
536
4.00k
    lzo_uint m_len, m_off;
537
4.00k
    LZO_COMPRESS_T cc;
538
4.00k
    LZO_COMPRESS_T * const c = &cc;
539
4.00k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
4.00k
    lzo_uint try_lazy;
541
4.00k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
1.22k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.26k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.51k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
4.00k
    try_lazy = (lzo_uint) try_lazy_parm;
557
4.00k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
4.00k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
4.00k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
4.00k
    if (nice_length == 0)
567
4.00k
        nice_length = 0;
568
    /* don't search more positions than this */
569
4.00k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
4.00k
    c->init = 0;
573
4.00k
    c->ip = c->in = in;
574
4.00k
    c->in_end = in + in_len;
575
4.00k
    c->out = out;
576
4.00k
    c->cb = cb;
577
4.00k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
4.00k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
4.00k
    op = out;
581
4.00k
    ii = c->ip;             /* point to start of literal run */
582
4.00k
    lit = 0;
583
4.00k
    c->r1_lit = c->r1_m_len = 0;
584
585
4.00k
    r = init_match(c,swd,dict,dict_len,flags);
586
4.00k
    if (r != 0)
587
0
        return r;
588
4.00k
    if (max_chain > 0)
589
4.00k
        swd->max_chain = max_chain;
590
4.00k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
4.00k
    r = find_match(c,swd,0,0);
594
4.00k
    if (r != 0)
595
0
        return r;
596
41.2M
    while (c->look > 0)
597
41.2M
    {
598
41.2M
        lzo_uint ahead;
599
41.2M
        lzo_uint max_ahead;
600
41.2M
        lzo_uint l1, l2, l3;
601
602
41.2M
        c->codesize = pd(op, out);
603
604
41.2M
        m_len = c->m_len;
605
41.2M
        m_off = c->m_off;
606
607
41.2M
        assert(c->bp == c->ip - c->look);
608
41.2M
        assert(c->bp >= in);
609
41.2M
        if (lit == 0)
610
2.50M
            ii = c->bp;
611
41.2M
        assert(ii + lit == c->bp);
612
41.2M
        assert(swd->b_char == *(c->bp));
613
614
41.2M
        if ( m_len < 2 ||
615
20.4M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
3.22M
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
3.22M
            (m_len == 2 && op == out) ||
622
3.22M
#endif
623
3.22M
            (op == out && lit == 0))
624
38.0M
        {
625
            /* a literal */
626
38.0M
            m_len = 0;
627
38.0M
        }
628
3.22M
        else if (m_len == M2_MIN_LEN)
629
773k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
773k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
157k
                m_len = 0;
633
773k
        }
634
635
41.2M
        if (m_len == 0)
636
38.1M
        {
637
    /* a literal */
638
38.1M
            lit++;
639
38.1M
            swd->max_chain = max_chain;
640
38.1M
            r = find_match(c,swd,1,0);
641
38.1M
            assert(r == 0); LZO_UNUSED(r);
642
38.1M
            continue;
643
38.1M
        }
644
645
    /* a match */
646
3.06M
#if defined(SWD_BEST_OFF)
647
3.06M
        if (swd->use_best_off)
648
3.06M
            better_match(swd,&m_len,&m_off);
649
3.06M
#endif
650
3.06M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
3.06M
        ahead = 0;
655
3.06M
        if (try_lazy == 0 || m_len >= max_lazy)
656
45.6k
        {
657
            /* no */
658
45.6k
            l1 = 0;
659
45.6k
            max_ahead = 0;
660
45.6k
        }
661
3.02M
        else
662
3.02M
        {
663
            /* yes, try a lazy match */
664
3.02M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
3.02M
            assert(l1 > 0);
666
3.02M
#if 1
667
3.02M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
3.02M
        }
672
673
674
6.43M
        while (ahead < max_ahead && c->look > m_len)
675
3.94M
        {
676
3.94M
            lzo_uint lazy_match_min_gain;
677
678
3.94M
            if (m_len >= good_length)
679
193k
                swd->max_chain = max_chain >> 2;
680
3.75M
            else
681
3.75M
                swd->max_chain = max_chain;
682
3.94M
            r = find_match(c,swd,1,0);
683
3.94M
            ahead++;
684
685
3.94M
            assert(r == 0); LZO_UNUSED(r);
686
3.94M
            assert(c->look > 0);
687
3.94M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
1.71M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
136k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
6.86k
                    c->m_len = 0;
693
#endif
694
3.94M
            if (c->m_len < m_len)
695
2.37M
                continue;
696
1.57M
#if 1
697
1.57M
            if (c->m_len == m_len && c->m_off >= m_off)
698
312k
                continue;
699
1.25M
#endif
700
1.25M
#if defined(SWD_BEST_OFF)
701
1.25M
            if (swd->use_best_off)
702
1.25M
                better_match(swd,&c->m_len,&c->m_off);
703
1.25M
#endif
704
1.25M
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
1.25M
            if (l2 == 0)
706
7.03k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
1.25M
#if 1
714
            /* compressed-data compatibility [see above] */
715
1.25M
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
1.25M
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
1.25M
            if (c->m_len >= m_len + lazy_match_min_gain)
722
570k
            {
723
570k
                c->lazy++;
724
570k
                assert_match(swd,c->m_len,c->m_off);
725
726
570k
                if (l3)
727
3.48k
                {
728
                    /* code previous run */
729
3.48k
                    op = code_run(c,op,ii,lit,ahead);
730
3.48k
                    lit = 0;
731
                    /* code shortened match */
732
3.48k
                    op = code_match(c,op,ahead,m_off);
733
3.48k
                }
734
567k
                else
735
567k
                {
736
567k
                    lit += ahead;
737
567k
                    assert(ii + lit == c->bp);
738
567k
                }
739
570k
                goto lazy_match_done;
740
570k
            }
741
1.25M
        }
742
743
744
3.06M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
2.49M
        op = code_run(c,op,ii,lit,m_len);
748
2.49M
        lit = 0;
749
750
        /* 2 - code match */
751
2.49M
        op = code_match(c,op,m_len,m_off);
752
2.49M
        swd->max_chain = max_chain;
753
2.49M
        r = find_match(c,swd,m_len,1+ahead);
754
2.49M
        assert(r == 0); LZO_UNUSED(r);
755
756
3.06M
lazy_match_done: ;
757
3.06M
    }
758
759
760
    /* store final run */
761
4.00k
    if (lit > 0)
762
2.44k
        op = STORE_RUN(c,op,ii,lit);
763
764
4.00k
#if defined(LZO_EOF_CODE)
765
4.00k
    *op++ = M4_MARKER | 1;
766
4.00k
    *op++ = 0;
767
4.00k
    *op++ = 0;
768
4.00k
#endif
769
770
4.00k
    c->codesize = pd(op, out);
771
4.00k
    assert(c->textsize == in_len);
772
773
4.00k
    *out_len = pd(op, out);
774
775
4.00k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
4.00k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
4.00k
    return LZO_E_OK;
787
4.00k
}
lzo1x_999_compress_internal
Line
Count
Source
532
1.22k
{
533
1.22k
    lzo_bytep op;
534
1.22k
    const lzo_bytep ii;
535
1.22k
    lzo_uint lit;
536
1.22k
    lzo_uint m_len, m_off;
537
1.22k
    LZO_COMPRESS_T cc;
538
1.22k
    LZO_COMPRESS_T * const c = &cc;
539
1.22k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.22k
    lzo_uint try_lazy;
541
1.22k
    int r;
542
543
    /* sanity check */
544
1.22k
#if defined(LZO1X)
545
1.22k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.22k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.22k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.22k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.22k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.22k
    if (nice_length == 0)
567
1.22k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.22k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.22k
    c->init = 0;
573
1.22k
    c->ip = c->in = in;
574
1.22k
    c->in_end = in + in_len;
575
1.22k
    c->out = out;
576
1.22k
    c->cb = cb;
577
1.22k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.22k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.22k
    op = out;
581
1.22k
    ii = c->ip;             /* point to start of literal run */
582
1.22k
    lit = 0;
583
1.22k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.22k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.22k
    if (r != 0)
587
0
        return r;
588
1.22k
    if (max_chain > 0)
589
1.22k
        swd->max_chain = max_chain;
590
1.22k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.22k
    r = find_match(c,swd,0,0);
594
1.22k
    if (r != 0)
595
0
        return r;
596
10.7M
    while (c->look > 0)
597
10.7M
    {
598
10.7M
        lzo_uint ahead;
599
10.7M
        lzo_uint max_ahead;
600
10.7M
        lzo_uint l1, l2, l3;
601
602
10.7M
        c->codesize = pd(op, out);
603
604
10.7M
        m_len = c->m_len;
605
10.7M
        m_off = c->m_off;
606
607
10.7M
        assert(c->bp == c->ip - c->look);
608
10.7M
        assert(c->bp >= in);
609
10.7M
        if (lit == 0)
610
757k
            ii = c->bp;
611
10.7M
        assert(ii + lit == c->bp);
612
10.7M
        assert(swd->b_char == *(c->bp));
613
614
10.7M
        if ( m_len < 2 ||
615
5.14M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
949k
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
949k
            (m_len == 2 && op == out) ||
622
948k
#endif
623
948k
            (op == out && lit == 0))
624
9.79M
        {
625
            /* a literal */
626
9.79M
            m_len = 0;
627
9.79M
        }
628
948k
        else if (m_len == M2_MIN_LEN)
629
181k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
181k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
26.7k
                m_len = 0;
633
181k
        }
634
635
10.7M
        if (m_len == 0)
636
9.82M
        {
637
    /* a literal */
638
9.82M
            lit++;
639
9.82M
            swd->max_chain = max_chain;
640
9.82M
            r = find_match(c,swd,1,0);
641
9.82M
            assert(r == 0); LZO_UNUSED(r);
642
9.82M
            continue;
643
9.82M
        }
644
645
    /* a match */
646
922k
#if defined(SWD_BEST_OFF)
647
922k
        if (swd->use_best_off)
648
922k
            better_match(swd,&m_len,&m_off);
649
922k
#endif
650
922k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
922k
        ahead = 0;
655
922k
        if (try_lazy == 0 || m_len >= max_lazy)
656
14.4k
        {
657
            /* no */
658
14.4k
            l1 = 0;
659
14.4k
            max_ahead = 0;
660
14.4k
        }
661
907k
        else
662
907k
        {
663
            /* yes, try a lazy match */
664
907k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
907k
            assert(l1 > 0);
666
907k
#if 1
667
907k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
907k
        }
672
673
674
1.91M
        while (ahead < max_ahead && c->look > m_len)
675
1.15M
        {
676
1.15M
            lzo_uint lazy_match_min_gain;
677
678
1.15M
            if (m_len >= good_length)
679
61.2k
                swd->max_chain = max_chain >> 2;
680
1.09M
            else
681
1.09M
                swd->max_chain = max_chain;
682
1.15M
            r = find_match(c,swd,1,0);
683
1.15M
            ahead++;
684
685
1.15M
            assert(r == 0); LZO_UNUSED(r);
686
1.15M
            assert(c->look > 0);
687
1.15M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
                    c->m_len = 0;
693
#endif
694
1.15M
            if (c->m_len < m_len)
695
696k
                continue;
696
459k
#if 1
697
459k
            if (c->m_len == m_len && c->m_off >= m_off)
698
81.8k
                continue;
699
377k
#endif
700
377k
#if defined(SWD_BEST_OFF)
701
377k
            if (swd->use_best_off)
702
377k
                better_match(swd,&c->m_len,&c->m_off);
703
377k
#endif
704
377k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
377k
            if (l2 == 0)
706
2.06k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
375k
#if 1
714
            /* compressed-data compatibility [see above] */
715
375k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
375k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
375k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
167k
            {
723
167k
                c->lazy++;
724
167k
                assert_match(swd,c->m_len,c->m_off);
725
726
167k
                if (l3)
727
1.24k
                {
728
                    /* code previous run */
729
1.24k
                    op = code_run(c,op,ii,lit,ahead);
730
1.24k
                    lit = 0;
731
                    /* code shortened match */
732
1.24k
                    op = code_match(c,op,ahead,m_off);
733
1.24k
                }
734
165k
                else
735
165k
                {
736
165k
                    lit += ahead;
737
165k
                    assert(ii + lit == c->bp);
738
165k
                }
739
167k
                goto lazy_match_done;
740
167k
            }
741
375k
        }
742
743
744
922k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
755k
        op = code_run(c,op,ii,lit,m_len);
748
755k
        lit = 0;
749
750
        /* 2 - code match */
751
755k
        op = code_match(c,op,m_len,m_off);
752
755k
        swd->max_chain = max_chain;
753
755k
        r = find_match(c,swd,m_len,1+ahead);
754
755k
        assert(r == 0); LZO_UNUSED(r);
755
756
922k
lazy_match_done: ;
757
922k
    }
758
759
760
    /* store final run */
761
1.22k
    if (lit > 0)
762
727
        op = STORE_RUN(c,op,ii,lit);
763
764
1.22k
#if defined(LZO_EOF_CODE)
765
1.22k
    *op++ = M4_MARKER | 1;
766
1.22k
    *op++ = 0;
767
1.22k
    *op++ = 0;
768
1.22k
#endif
769
770
1.22k
    c->codesize = pd(op, out);
771
1.22k
    assert(c->textsize == in_len);
772
773
1.22k
    *out_len = pd(op, out);
774
775
1.22k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.22k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.22k
    return LZO_E_OK;
787
1.22k
}
lzo1y_999_compress_internal
Line
Count
Source
532
1.26k
{
533
1.26k
    lzo_bytep op;
534
1.26k
    const lzo_bytep ii;
535
1.26k
    lzo_uint lit;
536
1.26k
    lzo_uint m_len, m_off;
537
1.26k
    LZO_COMPRESS_T cc;
538
1.26k
    LZO_COMPRESS_T * const c = &cc;
539
1.26k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.26k
    lzo_uint try_lazy;
541
1.26k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.26k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.26k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.26k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.26k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.26k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.26k
    if (nice_length == 0)
567
1.26k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.26k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.26k
    c->init = 0;
573
1.26k
    c->ip = c->in = in;
574
1.26k
    c->in_end = in + in_len;
575
1.26k
    c->out = out;
576
1.26k
    c->cb = cb;
577
1.26k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.26k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.26k
    op = out;
581
1.26k
    ii = c->ip;             /* point to start of literal run */
582
1.26k
    lit = 0;
583
1.26k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.26k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.26k
    if (r != 0)
587
0
        return r;
588
1.26k
    if (max_chain > 0)
589
1.26k
        swd->max_chain = max_chain;
590
1.26k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.26k
    r = find_match(c,swd,0,0);
594
1.26k
    if (r != 0)
595
0
        return r;
596
17.4M
    while (c->look > 0)
597
17.4M
    {
598
17.4M
        lzo_uint ahead;
599
17.4M
        lzo_uint max_ahead;
600
17.4M
        lzo_uint l1, l2, l3;
601
602
17.4M
        c->codesize = pd(op, out);
603
604
17.4M
        m_len = c->m_len;
605
17.4M
        m_off = c->m_off;
606
607
17.4M
        assert(c->bp == c->ip - c->look);
608
17.4M
        assert(c->bp >= in);
609
17.4M
        if (lit == 0)
610
707k
            ii = c->bp;
611
17.4M
        assert(ii + lit == c->bp);
612
17.4M
        assert(swd->b_char == *(c->bp));
613
614
17.4M
        if ( m_len < 2 ||
615
8.88M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
936k
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
936k
            (m_len == 2 && op == out) ||
622
936k
#endif
623
936k
            (op == out && lit == 0))
624
16.5M
        {
625
            /* a literal */
626
16.5M
            m_len = 0;
627
16.5M
        }
628
936k
        else if (m_len == M2_MIN_LEN)
629
223k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
223k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
78.2k
                m_len = 0;
633
223k
        }
634
635
17.4M
        if (m_len == 0)
636
16.5M
        {
637
    /* a literal */
638
16.5M
            lit++;
639
16.5M
            swd->max_chain = max_chain;
640
16.5M
            r = find_match(c,swd,1,0);
641
16.5M
            assert(r == 0); LZO_UNUSED(r);
642
16.5M
            continue;
643
16.5M
        }
644
645
    /* a match */
646
858k
#if defined(SWD_BEST_OFF)
647
858k
        if (swd->use_best_off)
648
858k
            better_match(swd,&m_len,&m_off);
649
858k
#endif
650
858k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
858k
        ahead = 0;
655
858k
        if (try_lazy == 0 || m_len >= max_lazy)
656
14.8k
        {
657
            /* no */
658
14.8k
            l1 = 0;
659
14.8k
            max_ahead = 0;
660
14.8k
        }
661
843k
        else
662
843k
        {
663
            /* yes, try a lazy match */
664
843k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
843k
            assert(l1 > 0);
666
843k
#if 1
667
843k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
843k
        }
672
673
674
1.77M
        while (ahead < max_ahead && c->look > m_len)
675
1.07M
        {
676
1.07M
            lzo_uint lazy_match_min_gain;
677
678
1.07M
            if (m_len >= good_length)
679
64.8k
                swd->max_chain = max_chain >> 2;
680
1.00M
            else
681
1.00M
                swd->max_chain = max_chain;
682
1.07M
            r = find_match(c,swd,1,0);
683
1.07M
            ahead++;
684
685
1.07M
            assert(r == 0); LZO_UNUSED(r);
686
1.07M
            assert(c->look > 0);
687
1.07M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
                    c->m_len = 0;
693
#endif
694
1.07M
            if (c->m_len < m_len)
695
616k
                continue;
696
455k
#if 1
697
455k
            if (c->m_len == m_len && c->m_off >= m_off)
698
83.4k
                continue;
699
371k
#endif
700
371k
#if defined(SWD_BEST_OFF)
701
371k
            if (swd->use_best_off)
702
371k
                better_match(swd,&c->m_len,&c->m_off);
703
371k
#endif
704
371k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
371k
            if (l2 == 0)
706
1.74k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
370k
#if 1
714
            /* compressed-data compatibility [see above] */
715
370k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
370k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
370k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
152k
            {
723
152k
                c->lazy++;
724
152k
                assert_match(swd,c->m_len,c->m_off);
725
726
152k
                if (l3)
727
984
                {
728
                    /* code previous run */
729
984
                    op = code_run(c,op,ii,lit,ahead);
730
984
                    lit = 0;
731
                    /* code shortened match */
732
984
                    op = code_match(c,op,ahead,m_off);
733
984
                }
734
151k
                else
735
151k
                {
736
151k
                    lit += ahead;
737
151k
                    assert(ii + lit == c->bp);
738
151k
                }
739
152k
                goto lazy_match_done;
740
152k
            }
741
370k
        }
742
743
744
858k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
705k
        op = code_run(c,op,ii,lit,m_len);
748
705k
        lit = 0;
749
750
        /* 2 - code match */
751
705k
        op = code_match(c,op,m_len,m_off);
752
705k
        swd->max_chain = max_chain;
753
705k
        r = find_match(c,swd,m_len,1+ahead);
754
705k
        assert(r == 0); LZO_UNUSED(r);
755
756
858k
lazy_match_done: ;
757
858k
    }
758
759
760
    /* store final run */
761
1.26k
    if (lit > 0)
762
761
        op = STORE_RUN(c,op,ii,lit);
763
764
1.26k
#if defined(LZO_EOF_CODE)
765
1.26k
    *op++ = M4_MARKER | 1;
766
1.26k
    *op++ = 0;
767
1.26k
    *op++ = 0;
768
1.26k
#endif
769
770
1.26k
    c->codesize = pd(op, out);
771
1.26k
    assert(c->textsize == in_len);
772
773
1.26k
    *out_len = pd(op, out);
774
775
1.26k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.26k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.26k
    return LZO_E_OK;
787
1.26k
}
lzo1z_999_compress_internal
Line
Count
Source
532
1.51k
{
533
1.51k
    lzo_bytep op;
534
1.51k
    const lzo_bytep ii;
535
1.51k
    lzo_uint lit;
536
1.51k
    lzo_uint m_len, m_off;
537
1.51k
    LZO_COMPRESS_T cc;
538
1.51k
    LZO_COMPRESS_T * const c = &cc;
539
1.51k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.51k
    lzo_uint try_lazy;
541
1.51k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.51k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.51k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.51k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.51k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.51k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.51k
    if (nice_length == 0)
567
1.51k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.51k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.51k
    c->init = 0;
573
1.51k
    c->ip = c->in = in;
574
1.51k
    c->in_end = in + in_len;
575
1.51k
    c->out = out;
576
1.51k
    c->cb = cb;
577
1.51k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.51k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.51k
    op = out;
581
1.51k
    ii = c->ip;             /* point to start of literal run */
582
1.51k
    lit = 0;
583
1.51k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.51k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.51k
    if (r != 0)
587
0
        return r;
588
1.51k
    if (max_chain > 0)
589
1.51k
        swd->max_chain = max_chain;
590
1.51k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.51k
    r = find_match(c,swd,0,0);
594
1.51k
    if (r != 0)
595
0
        return r;
596
13.0M
    while (c->look > 0)
597
13.0M
    {
598
13.0M
        lzo_uint ahead;
599
13.0M
        lzo_uint max_ahead;
600
13.0M
        lzo_uint l1, l2, l3;
601
602
13.0M
        c->codesize = pd(op, out);
603
604
13.0M
        m_len = c->m_len;
605
13.0M
        m_off = c->m_off;
606
607
13.0M
        assert(c->bp == c->ip - c->look);
608
13.0M
        assert(c->bp >= in);
609
13.0M
        if (lit == 0)
610
1.03M
            ii = c->bp;
611
13.0M
        assert(ii + lit == c->bp);
612
13.0M
        assert(swd->b_char == *(c->bp));
613
614
13.0M
        if ( m_len < 2 ||
615
6.40M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
1.33M
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
1.33M
            (m_len == 2 && op == out) ||
622
1.33M
#endif
623
1.33M
            (op == out && lit == 0))
624
11.6M
        {
625
            /* a literal */
626
11.6M
            m_len = 0;
627
11.6M
        }
628
1.33M
        else if (m_len == M2_MIN_LEN)
629
367k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
367k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
52.1k
                m_len = 0;
633
367k
        }
634
635
13.0M
        if (m_len == 0)
636
11.7M
        {
637
    /* a literal */
638
11.7M
            lit++;
639
11.7M
            swd->max_chain = max_chain;
640
11.7M
            r = find_match(c,swd,1,0);
641
11.7M
            assert(r == 0); LZO_UNUSED(r);
642
11.7M
            continue;
643
11.7M
        }
644
645
    /* a match */
646
1.28M
#if defined(SWD_BEST_OFF)
647
1.28M
        if (swd->use_best_off)
648
1.28M
            better_match(swd,&m_len,&m_off);
649
1.28M
#endif
650
1.28M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
1.28M
        ahead = 0;
655
1.28M
        if (try_lazy == 0 || m_len >= max_lazy)
656
16.4k
        {
657
            /* no */
658
16.4k
            l1 = 0;
659
16.4k
            max_ahead = 0;
660
16.4k
        }
661
1.26M
        else
662
1.26M
        {
663
            /* yes, try a lazy match */
664
1.26M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
1.26M
            assert(l1 > 0);
666
1.26M
#if 1
667
1.26M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
1.26M
        }
672
673
674
2.75M
        while (ahead < max_ahead && c->look > m_len)
675
1.71M
        {
676
1.71M
            lzo_uint lazy_match_min_gain;
677
678
1.71M
            if (m_len >= good_length)
679
67.3k
                swd->max_chain = max_chain >> 2;
680
1.64M
            else
681
1.64M
                swd->max_chain = max_chain;
682
1.71M
            r = find_match(c,swd,1,0);
683
1.71M
            ahead++;
684
685
1.71M
            assert(r == 0); LZO_UNUSED(r);
686
1.71M
            assert(c->look > 0);
687
1.71M
            assert(ii + lit + ahead == c->bp);
688
689
1.71M
#if defined(LZO1Z)
690
1.71M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
136k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
6.86k
                    c->m_len = 0;
693
1.71M
#endif
694
1.71M
            if (c->m_len < m_len)
695
1.06M
                continue;
696
655k
#if 1
697
655k
            if (c->m_len == m_len && c->m_off >= m_off)
698
147k
                continue;
699
508k
#endif
700
508k
#if defined(SWD_BEST_OFF)
701
508k
            if (swd->use_best_off)
702
508k
                better_match(swd,&c->m_len,&c->m_off);
703
508k
#endif
704
508k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
508k
            if (l2 == 0)
706
3.22k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
505k
#if 1
714
            /* compressed-data compatibility [see above] */
715
505k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
505k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
505k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
250k
            {
723
250k
                c->lazy++;
724
250k
                assert_match(swd,c->m_len,c->m_off);
725
726
250k
                if (l3)
727
1.25k
                {
728
                    /* code previous run */
729
1.25k
                    op = code_run(c,op,ii,lit,ahead);
730
1.25k
                    lit = 0;
731
                    /* code shortened match */
732
1.25k
                    op = code_match(c,op,ahead,m_off);
733
1.25k
                }
734
249k
                else
735
249k
                {
736
249k
                    lit += ahead;
737
249k
                    assert(ii + lit == c->bp);
738
249k
                }
739
250k
                goto lazy_match_done;
740
250k
            }
741
505k
        }
742
743
744
1.28M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
1.03M
        op = code_run(c,op,ii,lit,m_len);
748
1.03M
        lit = 0;
749
750
        /* 2 - code match */
751
1.03M
        op = code_match(c,op,m_len,m_off);
752
1.03M
        swd->max_chain = max_chain;
753
1.03M
        r = find_match(c,swd,m_len,1+ahead);
754
1.03M
        assert(r == 0); LZO_UNUSED(r);
755
756
1.28M
lazy_match_done: ;
757
1.28M
    }
758
759
760
    /* store final run */
761
1.51k
    if (lit > 0)
762
959
        op = STORE_RUN(c,op,ii,lit);
763
764
1.51k
#if defined(LZO_EOF_CODE)
765
1.51k
    *op++ = M4_MARKER | 1;
766
1.51k
    *op++ = 0;
767
1.51k
    *op++ = 0;
768
1.51k
#endif
769
770
1.51k
    c->codesize = pd(op, out);
771
1.51k
    assert(c->textsize == in_len);
772
773
1.51k
    *out_len = pd(op, out);
774
775
1.51k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.51k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.51k
    return LZO_E_OK;
787
1.51k
}
788
789
790
/***********************************************************************
791
//
792
************************************************************************/
793
794
LZO_PUBLIC(int)
795
lzo1x_999_compress_level    ( const lzo_bytep in , lzo_uint  in_len,
796
                                    lzo_bytep out, lzo_uintp out_len,
797
                                    lzo_voidp wrkmem,
798
                              const lzo_bytep dict, lzo_uint dict_len,
799
                                    lzo_callback_p cb,
800
                                    int compression_level )
801
4.00k
{
802
4.00k
    static const struct
803
4.00k
    {
804
4.00k
        int try_lazy_parm;
805
4.00k
        lzo_uint good_length;
806
4.00k
        lzo_uint max_lazy;
807
4.00k
        lzo_uint nice_length;
808
4.00k
        lzo_uint max_chain;
809
4.00k
        lzo_uint32_t flags;
810
4.00k
    } c[9] = {
811
        /* faster compression */
812
4.00k
        {   0,     0,     0,     8,    4,   0 },
813
4.00k
        {   0,     0,     0,    16,    8,   0 },
814
4.00k
        {   0,     0,     0,    32,   16,   0 },
815
4.00k
        {   1,     4,     4,    16,   16,   0 },
816
4.00k
        {   1,     8,    16,    32,   32,   0 },
817
4.00k
        {   1,     8,    16,   128,  128,   0 },
818
4.00k
        {   2,     8,    32,   128,  256,   0 },
819
4.00k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
4.00k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
4.00k
    };
823
824
4.00k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
4.00k
    compression_level -= 1;
828
4.00k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
4.00k
                                       dict, dict_len, cb,
830
4.00k
                                       c[compression_level].try_lazy_parm,
831
4.00k
                                       c[compression_level].good_length,
832
4.00k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
4.00k
                                       0,
837
4.00k
#endif
838
4.00k
                                       c[compression_level].max_chain,
839
4.00k
                                       c[compression_level].flags);
840
4.00k
}
lzo1x_999_compress_level
Line
Count
Source
801
1.22k
{
802
1.22k
    static const struct
803
1.22k
    {
804
1.22k
        int try_lazy_parm;
805
1.22k
        lzo_uint good_length;
806
1.22k
        lzo_uint max_lazy;
807
1.22k
        lzo_uint nice_length;
808
1.22k
        lzo_uint max_chain;
809
1.22k
        lzo_uint32_t flags;
810
1.22k
    } c[9] = {
811
        /* faster compression */
812
1.22k
        {   0,     0,     0,     8,    4,   0 },
813
1.22k
        {   0,     0,     0,    16,    8,   0 },
814
1.22k
        {   0,     0,     0,    32,   16,   0 },
815
1.22k
        {   1,     4,     4,    16,   16,   0 },
816
1.22k
        {   1,     8,    16,    32,   32,   0 },
817
1.22k
        {   1,     8,    16,   128,  128,   0 },
818
1.22k
        {   2,     8,    32,   128,  256,   0 },
819
1.22k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.22k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.22k
    };
823
824
1.22k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.22k
    compression_level -= 1;
828
1.22k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.22k
                                       dict, dict_len, cb,
830
1.22k
                                       c[compression_level].try_lazy_parm,
831
1.22k
                                       c[compression_level].good_length,
832
1.22k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.22k
                                       0,
837
1.22k
#endif
838
1.22k
                                       c[compression_level].max_chain,
839
1.22k
                                       c[compression_level].flags);
840
1.22k
}
lzo1y_999_compress_level
Line
Count
Source
801
1.26k
{
802
1.26k
    static const struct
803
1.26k
    {
804
1.26k
        int try_lazy_parm;
805
1.26k
        lzo_uint good_length;
806
1.26k
        lzo_uint max_lazy;
807
1.26k
        lzo_uint nice_length;
808
1.26k
        lzo_uint max_chain;
809
1.26k
        lzo_uint32_t flags;
810
1.26k
    } c[9] = {
811
        /* faster compression */
812
1.26k
        {   0,     0,     0,     8,    4,   0 },
813
1.26k
        {   0,     0,     0,    16,    8,   0 },
814
1.26k
        {   0,     0,     0,    32,   16,   0 },
815
1.26k
        {   1,     4,     4,    16,   16,   0 },
816
1.26k
        {   1,     8,    16,    32,   32,   0 },
817
1.26k
        {   1,     8,    16,   128,  128,   0 },
818
1.26k
        {   2,     8,    32,   128,  256,   0 },
819
1.26k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.26k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.26k
    };
823
824
1.26k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.26k
    compression_level -= 1;
828
1.26k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.26k
                                       dict, dict_len, cb,
830
1.26k
                                       c[compression_level].try_lazy_parm,
831
1.26k
                                       c[compression_level].good_length,
832
1.26k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.26k
                                       0,
837
1.26k
#endif
838
1.26k
                                       c[compression_level].max_chain,
839
1.26k
                                       c[compression_level].flags);
840
1.26k
}
lzo1z_999_compress_level
Line
Count
Source
801
1.51k
{
802
1.51k
    static const struct
803
1.51k
    {
804
1.51k
        int try_lazy_parm;
805
1.51k
        lzo_uint good_length;
806
1.51k
        lzo_uint max_lazy;
807
1.51k
        lzo_uint nice_length;
808
1.51k
        lzo_uint max_chain;
809
1.51k
        lzo_uint32_t flags;
810
1.51k
    } c[9] = {
811
        /* faster compression */
812
1.51k
        {   0,     0,     0,     8,    4,   0 },
813
1.51k
        {   0,     0,     0,    16,    8,   0 },
814
1.51k
        {   0,     0,     0,    32,   16,   0 },
815
1.51k
        {   1,     4,     4,    16,   16,   0 },
816
1.51k
        {   1,     8,    16,    32,   32,   0 },
817
1.51k
        {   1,     8,    16,   128,  128,   0 },
818
1.51k
        {   2,     8,    32,   128,  256,   0 },
819
1.51k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.51k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.51k
    };
823
824
1.51k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.51k
    compression_level -= 1;
828
1.51k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.51k
                                       dict, dict_len, cb,
830
1.51k
                                       c[compression_level].try_lazy_parm,
831
1.51k
                                       c[compression_level].good_length,
832
1.51k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.51k
                                       0,
837
1.51k
#endif
838
1.51k
                                       c[compression_level].max_chain,
839
1.51k
                                       c[compression_level].flags);
840
1.51k
}
841
842
843
/***********************************************************************
844
//
845
************************************************************************/
846
847
LZO_PUBLIC(int)
848
lzo1x_999_compress_dict     ( const lzo_bytep in , lzo_uint  in_len,
849
                                    lzo_bytep out, lzo_uintp out_len,
850
                                    lzo_voidp wrkmem,
851
                              const lzo_bytep dict, lzo_uint dict_len )
852
0
{
853
0
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
854
0
                                    dict, dict_len, 0, 8);
855
0
}
Unexecuted instantiation: lzo1x_999_compress_dict
Unexecuted instantiation: lzo1y_999_compress_dict
Unexecuted instantiation: lzo1z_999_compress_dict
856
857
LZO_PUBLIC(int)
858
lzo1x_999_compress  ( const lzo_bytep in , lzo_uint  in_len,
859
                            lzo_bytep out, lzo_uintp out_len,
860
                            lzo_voidp wrkmem )
861
4.00k
{
862
4.00k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
4.00k
}
lzo1x_999_compress
Line
Count
Source
861
1.22k
{
862
1.22k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.22k
}
lzo1y_999_compress
Line
Count
Source
861
1.26k
{
862
1.26k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.26k
}
lzo1z_999_compress
Line
Count
Source
861
1.51k
{
862
1.51k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.51k
}
865
866
867
/* vim:set ts=4 sw=4 et: */