Coverage Report

Created: 2026-10-17 06:33

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.46k
#define SWD_N           M4_MAX_OFFSET   /* size of ring buffer */
49
42.8M
#define SWD_THRESHOLD       1           /* lower limit for match length */
50
22.3k
#define SWD_F            2048           /* upper limit for match length */
51
52
1.53G
#define SWD_BEST_OFF    (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1)
53
54
#if defined(LZO1X)
55
2.78k
#  define LZO_COMPRESS_T                lzo1x_999_t
56
1.39k
#  define lzo_swd_t                     lzo1x_999_swd_t
57
#elif defined(LZO1Y)
58
2.83k
#  define LZO_COMPRESS_T                lzo1y_999_t
59
1.41k
#  define lzo_swd_t                     lzo1y_999_swd_t
60
1.41k
#  define lzo1x_999_compress_internal   lzo1y_999_compress_internal
61
#  define lzo1x_999_compress_dict       lzo1y_999_compress_dict
62
1.41k
#  define lzo1x_999_compress_level      lzo1y_999_compress_level
63
#  define lzo1x_999_compress            lzo1y_999_compress
64
#elif defined(LZO1Z)
65
3.31k
#  define LZO_COMPRESS_T                lzo1z_999_t
66
1.65k
#  define lzo_swd_t                     lzo1z_999_swd_t
67
1.65k
#  define lzo1x_999_compress_internal   lzo1z_999_compress_internal
68
#  define lzo1x_999_compress_dict       lzo1z_999_compress_dict
69
1.65k
#  define lzo1x_999_compress_level      lzo1z_999_compress_level
70
#  define lzo1x_999_compress            lzo1z_999_compress
71
#else
72
#  error
73
#endif
74
75
#if 0
76
#  define HEAD3(b,p) \
77
    ((((((lzo_xint)b[p]<<3)^b[p+1])<<3)^b[p+2]) & (SWD_HSIZE-1))
78
#endif
79
#if 0 && (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN)
80
#  define HEAD3(b,p) \
81
    (((* (lzo_uint32_tp) &b[p]) ^ ((* (lzo_uint32_tp) &b[p])>>10)) & (SWD_HSIZE-1))
82
#endif
83
84
#include "lzo_mchw.ch"
85
86
87
/* this is a public functions, but there is no prototype in a header file */
88
LZO_EXTERN(int)
89
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
90
                                    lzo_bytep out, lzo_uintp out_len,
91
                                    lzo_voidp wrkmem,
92
                              const lzo_bytep dict, lzo_uint dict_len,
93
                                    lzo_callback_p cb,
94
                                    int try_lazy_parm,
95
                                    lzo_uint good_length,
96
                                    lzo_uint max_lazy,
97
                                    lzo_uint nice_length,
98
                                    lzo_uint max_chain,
99
                                    lzo_uint32_t flags );
100
101
102
/***********************************************************************
103
//
104
************************************************************************/
105
106
static lzo_bytep
107
code_match ( LZO_COMPRESS_T *c, lzo_bytep op, lzo_uint m_len, lzo_uint m_off )
108
2.38M
{
109
2.38M
    lzo_uint x_len = m_len;
110
2.38M
    lzo_uint x_off = m_off;
111
112
2.38M
    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.38M
    assert(op > c->out);
143
2.38M
    if (m_len == 2)
144
844k
    {
145
844k
        assert(m_off <= M1_MAX_OFFSET);
146
844k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
844k
        m_off -= 1;
148
#if defined(LZO1Z)
149
397k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
397k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
446k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
446k
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
844k
        c->m1a_m++;
156
844k
    }
157
#if defined(LZO1Z)
158
520k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
1.01M
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
533k
#endif
162
812k
    {
163
812k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
292k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
292k
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
241k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
241k
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
278k
        if (m_off == c->last_m_off)
176
13.0k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
265k
        else
178
265k
        {
179
265k
            m_off -= 1;
180
265k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
265k
            *op++ = LZO_BYTE(m_off << 2);
182
265k
        }
183
#endif
184
812k
        c->m2_m++;
185
812k
    }
186
725k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
13.0k
    {
188
13.0k
        assert(m_len == 3);
189
13.0k
        assert(m_off > M2_MAX_OFFSET);
190
13.0k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
3.15k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.15k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
9.90k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
9.90k
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
13.0k
        c->m1b_m++;
199
13.0k
    }
200
712k
    else if (m_off <= M3_MAX_OFFSET)
201
602k
    {
202
602k
        assert(m_len >= 3);
203
602k
        m_off -= 1;
204
602k
        if (m_len <= M3_MAX_LEN)
205
488k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
113k
        else
207
113k
        {
208
113k
            m_len -= M3_MAX_LEN;
209
113k
            *op++ = M3_MARKER | 0;
210
204k
            while (m_len > 255)
211
90.4k
            {
212
90.4k
                m_len -= 255;
213
90.4k
                *op++ = 0;
214
90.4k
            }
215
113k
            assert(m_len > 0);
216
113k
            *op++ = LZO_BYTE(m_len);
217
113k
        }
218
#if defined(LZO1Z)
219
204k
        *op++ = LZO_BYTE(m_off >> 6);
220
204k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
397k
        *op++ = LZO_BYTE(m_off << 2);
223
397k
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
602k
        c->m3_m++;
226
602k
    }
227
109k
    else
228
109k
    {
229
109k
        lzo_uint k;
230
231
109k
        assert(m_len >= 3);
232
109k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
109k
        m_off -= 0x4000;
234
109k
        k = (m_off & 0x4000) >> 11;
235
109k
        if (m_len <= M4_MAX_LEN)
236
63.2k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
46.5k
        else
238
46.5k
        {
239
46.5k
            m_len -= M4_MAX_LEN;
240
46.5k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
67.6k
            while (m_len > 255)
242
21.0k
            {
243
21.0k
                m_len -= 255;
244
21.0k
                *op++ = 0;
245
21.0k
            }
246
46.5k
            assert(m_len > 0);
247
46.5k
            *op++ = LZO_BYTE(m_len);
248
46.5k
        }
249
#if defined(LZO1Z)
250
33.8k
        *op++ = LZO_BYTE(m_off >> 6);
251
33.8k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
75.9k
        *op++ = LZO_BYTE(m_off << 2);
254
75.9k
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
109k
        c->m4_m++;
257
109k
    }
258
259
2.38M
    c->last_m_len = x_len;
260
2.38M
    c->last_m_off = x_off;
261
2.38M
    return op;
262
2.38M
}
lzo1x_9x.c:code_match
Line
Count
Source
108
800k
{
109
800k
    lzo_uint x_len = m_len;
110
800k
    lzo_uint x_off = m_off;
111
112
800k
    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
800k
    assert(op > c->out);
143
800k
    if (m_len == 2)
144
249k
    {
145
249k
        assert(m_off <= M1_MAX_OFFSET);
146
249k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
249k
        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
249k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
249k
        *op++ = LZO_BYTE(m_off >> 2);
154
249k
#endif
155
249k
        c->m1a_m++;
156
249k
    }
157
#if defined(LZO1Z)
158
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
551k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
292k
#endif
162
292k
    {
163
292k
        assert(m_len >= 3);
164
292k
#if defined(LZO1X)
165
292k
        m_off -= 1;
166
292k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
292k
        *op++ = LZO_BYTE(m_off >> 3);
168
292k
        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
292k
        c->m2_m++;
185
292k
    }
186
259k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
5.18k
    {
188
5.18k
        assert(m_len == 3);
189
5.18k
        assert(m_off > M2_MAX_OFFSET);
190
5.18k
        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
5.18k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
5.18k
        *op++ = LZO_BYTE(m_off >> 2);
197
5.18k
#endif
198
5.18k
        c->m1b_m++;
199
5.18k
    }
200
253k
    else if (m_off <= M3_MAX_OFFSET)
201
213k
    {
202
213k
        assert(m_len >= 3);
203
213k
        m_off -= 1;
204
213k
        if (m_len <= M3_MAX_LEN)
205
176k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
37.1k
        else
207
37.1k
        {
208
37.1k
            m_len -= M3_MAX_LEN;
209
37.1k
            *op++ = M3_MARKER | 0;
210
60.1k
            while (m_len > 255)
211
22.9k
            {
212
22.9k
                m_len -= 255;
213
22.9k
                *op++ = 0;
214
22.9k
            }
215
37.1k
            assert(m_len > 0);
216
37.1k
            *op++ = LZO_BYTE(m_len);
217
37.1k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
213k
        *op++ = LZO_BYTE(m_off << 2);
223
213k
        *op++ = LZO_BYTE(m_off >> 6);
224
213k
#endif
225
213k
        c->m3_m++;
226
213k
    }
227
40.5k
    else
228
40.5k
    {
229
40.5k
        lzo_uint k;
230
231
40.5k
        assert(m_len >= 3);
232
40.5k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
40.5k
        m_off -= 0x4000;
234
40.5k
        k = (m_off & 0x4000) >> 11;
235
40.5k
        if (m_len <= M4_MAX_LEN)
236
24.2k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
16.3k
        else
238
16.3k
        {
239
16.3k
            m_len -= M4_MAX_LEN;
240
16.3k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
23.5k
            while (m_len > 255)
242
7.20k
            {
243
7.20k
                m_len -= 255;
244
7.20k
                *op++ = 0;
245
7.20k
            }
246
16.3k
            assert(m_len > 0);
247
16.3k
            *op++ = LZO_BYTE(m_len);
248
16.3k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
40.5k
        *op++ = LZO_BYTE(m_off << 2);
254
40.5k
        *op++ = LZO_BYTE(m_off >> 6);
255
40.5k
#endif
256
40.5k
        c->m4_m++;
257
40.5k
    }
258
259
800k
    c->last_m_len = x_len;
260
800k
    c->last_m_off = x_off;
261
800k
    return op;
262
800k
}
lzo1y_9x.c:code_match
Line
Count
Source
108
662k
{
109
662k
    lzo_uint x_len = m_len;
110
662k
    lzo_uint x_off = m_off;
111
112
662k
    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
662k
    assert(op > c->out);
143
662k
    if (m_len == 2)
144
197k
    {
145
197k
        assert(m_off <= M1_MAX_OFFSET);
146
197k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
197k
        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
197k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
197k
        *op++ = LZO_BYTE(m_off >> 2);
154
197k
#endif
155
197k
        c->m1a_m++;
156
197k
    }
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
465k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
241k
#endif
162
241k
    {
163
241k
        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
241k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
241k
        *op++ = LZO_BYTE(m_off >> 2);
173
241k
        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
241k
        c->m2_m++;
185
241k
    }
186
224k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
4.72k
    {
188
4.72k
        assert(m_len == 3);
189
4.72k
        assert(m_off > M2_MAX_OFFSET);
190
4.72k
        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.72k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
4.72k
        *op++ = LZO_BYTE(m_off >> 2);
197
4.72k
#endif
198
4.72k
        c->m1b_m++;
199
4.72k
    }
200
219k
    else if (m_off <= M3_MAX_OFFSET)
201
184k
    {
202
184k
        assert(m_len >= 3);
203
184k
        m_off -= 1;
204
184k
        if (m_len <= M3_MAX_LEN)
205
145k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
38.2k
        else
207
38.2k
        {
208
38.2k
            m_len -= M3_MAX_LEN;
209
38.2k
            *op++ = M3_MARKER | 0;
210
65.3k
            while (m_len > 255)
211
27.0k
            {
212
27.0k
                m_len -= 255;
213
27.0k
                *op++ = 0;
214
27.0k
            }
215
38.2k
            assert(m_len > 0);
216
38.2k
            *op++ = LZO_BYTE(m_len);
217
38.2k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
184k
        *op++ = LZO_BYTE(m_off << 2);
223
184k
        *op++ = LZO_BYTE(m_off >> 6);
224
184k
#endif
225
184k
        c->m3_m++;
226
184k
    }
227
35.3k
    else
228
35.3k
    {
229
35.3k
        lzo_uint k;
230
231
35.3k
        assert(m_len >= 3);
232
35.3k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
35.3k
        m_off -= 0x4000;
234
35.3k
        k = (m_off & 0x4000) >> 11;
235
35.3k
        if (m_len <= M4_MAX_LEN)
236
19.9k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
15.4k
        else
238
15.4k
        {
239
15.4k
            m_len -= M4_MAX_LEN;
240
15.4k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
19.5k
            while (m_len > 255)
242
4.09k
            {
243
4.09k
                m_len -= 255;
244
4.09k
                *op++ = 0;
245
4.09k
            }
246
15.4k
            assert(m_len > 0);
247
15.4k
            *op++ = LZO_BYTE(m_len);
248
15.4k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
35.3k
        *op++ = LZO_BYTE(m_off << 2);
254
35.3k
        *op++ = LZO_BYTE(m_off >> 6);
255
35.3k
#endif
256
35.3k
        c->m4_m++;
257
35.3k
    }
258
259
662k
    c->last_m_len = x_len;
260
662k
    c->last_m_off = x_off;
261
662k
    return op;
262
662k
}
lzo1z_9x.c:code_match
Line
Count
Source
108
918k
{
109
918k
    lzo_uint x_len = m_len;
110
918k
    lzo_uint x_off = m_off;
111
112
918k
    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
918k
    assert(op > c->out);
143
918k
    if (m_len == 2)
144
397k
    {
145
397k
        assert(m_off <= M1_MAX_OFFSET);
146
397k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
397k
        m_off -= 1;
148
397k
#if defined(LZO1Z)
149
397k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
397k
        *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
397k
        c->m1a_m++;
156
397k
    }
157
520k
#if defined(LZO1Z)
158
520k
    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
278k
    {
163
278k
        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
278k
        if (m_off == c->last_m_off)
176
13.0k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
265k
        else
178
265k
        {
179
265k
            m_off -= 1;
180
265k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
265k
            *op++ = LZO_BYTE(m_off << 2);
182
265k
        }
183
278k
#endif
184
278k
        c->m2_m++;
185
278k
    }
186
242k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.15k
    {
188
3.15k
        assert(m_len == 3);
189
3.15k
        assert(m_off > M2_MAX_OFFSET);
190
3.15k
        m_off -= 1 + M2_MAX_OFFSET;
191
3.15k
#if defined(LZO1Z)
192
3.15k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.15k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
3.15k
        c->m1b_m++;
199
3.15k
    }
200
238k
    else if (m_off <= M3_MAX_OFFSET)
201
204k
    {
202
204k
        assert(m_len >= 3);
203
204k
        m_off -= 1;
204
204k
        if (m_len <= M3_MAX_LEN)
205
166k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
38.2k
        else
207
38.2k
        {
208
38.2k
            m_len -= M3_MAX_LEN;
209
38.2k
            *op++ = M3_MARKER | 0;
210
78.6k
            while (m_len > 255)
211
40.4k
            {
212
40.4k
                m_len -= 255;
213
40.4k
                *op++ = 0;
214
40.4k
            }
215
38.2k
            assert(m_len > 0);
216
38.2k
            *op++ = LZO_BYTE(m_len);
217
38.2k
        }
218
204k
#if defined(LZO1Z)
219
204k
        *op++ = LZO_BYTE(m_off >> 6);
220
204k
        *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
204k
        c->m3_m++;
226
204k
    }
227
33.8k
    else
228
33.8k
    {
229
33.8k
        lzo_uint k;
230
231
33.8k
        assert(m_len >= 3);
232
33.8k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
33.8k
        m_off -= 0x4000;
234
33.8k
        k = (m_off & 0x4000) >> 11;
235
33.8k
        if (m_len <= M4_MAX_LEN)
236
19.0k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
14.8k
        else
238
14.8k
        {
239
14.8k
            m_len -= M4_MAX_LEN;
240
14.8k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
24.5k
            while (m_len > 255)
242
9.77k
            {
243
9.77k
                m_len -= 255;
244
9.77k
                *op++ = 0;
245
9.77k
            }
246
14.8k
            assert(m_len > 0);
247
14.8k
            *op++ = LZO_BYTE(m_len);
248
14.8k
        }
249
33.8k
#if defined(LZO1Z)
250
33.8k
        *op++ = LZO_BYTE(m_off >> 6);
251
33.8k
        *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
33.8k
        c->m4_m++;
257
33.8k
    }
258
259
918k
    c->last_m_len = x_len;
260
918k
    c->last_m_off = x_off;
261
918k
    return op;
262
918k
}
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.78M
{
268
1.78M
    c->lit_bytes += t;
269
270
1.78M
    if (op == c->out && t <= 238)
271
4.34k
    {
272
4.34k
        *op++ = LZO_BYTE(17 + t);
273
4.34k
    }
274
1.78M
    else if (t <= 3)
275
1.61M
    {
276
#if defined(LZO1Z)
277
666k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
953k
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
1.61M
        c->lit1_r++;
282
1.61M
    }
283
161k
    else if (t <= 18)
284
102k
    {
285
102k
        *op++ = LZO_BYTE(t - 3);
286
102k
        c->lit2_r++;
287
102k
    }
288
59.0k
    else
289
59.0k
    {
290
59.0k
        lzo_uint tt = t - 18;
291
292
59.0k
        *op++ = 0;
293
178k
        while (tt > 255)
294
119k
        {
295
119k
            tt -= 255;
296
119k
            *op++ = 0;
297
119k
        }
298
59.0k
        assert(tt > 0);
299
59.0k
        *op++ = LZO_BYTE(tt);
300
59.0k
        c->lit3_r++;
301
59.0k
    }
302
37.4M
    do *op++ = *ii++; while (--t > 0);
303
304
1.78M
    return op;
305
1.78M
}
lzo1x_9x.c:STORE_RUN
Line
Count
Source
267
581k
{
268
581k
    c->lit_bytes += t;
269
270
581k
    if (op == c->out && t <= 238)
271
1.36k
    {
272
1.36k
        *op++ = LZO_BYTE(17 + t);
273
1.36k
    }
274
580k
    else if (t <= 3)
275
518k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
518k
        op[-2] = LZO_BYTE(op[-2] | t);
280
518k
#endif
281
518k
        c->lit1_r++;
282
518k
    }
283
61.5k
    else if (t <= 18)
284
39.5k
    {
285
39.5k
        *op++ = LZO_BYTE(t - 3);
286
39.5k
        c->lit2_r++;
287
39.5k
    }
288
21.9k
    else
289
21.9k
    {
290
21.9k
        lzo_uint tt = t - 18;
291
292
21.9k
        *op++ = 0;
293
50.3k
        while (tt > 255)
294
28.3k
        {
295
28.3k
            tt -= 255;
296
28.3k
            *op++ = 0;
297
28.3k
        }
298
21.9k
        assert(tt > 0);
299
21.9k
        *op++ = LZO_BYTE(tt);
300
21.9k
        c->lit3_r++;
301
21.9k
    }
302
9.54M
    do *op++ = *ii++; while (--t > 0);
303
304
581k
    return op;
305
581k
}
lzo1y_9x.c:STORE_RUN
Line
Count
Source
267
487k
{
268
487k
    c->lit_bytes += t;
269
270
487k
    if (op == c->out && t <= 238)
271
1.36k
    {
272
1.36k
        *op++ = LZO_BYTE(17 + t);
273
1.36k
    }
274
485k
    else if (t <= 3)
275
434k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
434k
        op[-2] = LZO_BYTE(op[-2] | t);
280
434k
#endif
281
434k
        c->lit1_r++;
282
434k
    }
283
51.2k
    else if (t <= 18)
284
31.3k
    {
285
31.3k
        *op++ = LZO_BYTE(t - 3);
286
31.3k
        c->lit2_r++;
287
31.3k
    }
288
19.8k
    else
289
19.8k
    {
290
19.8k
        lzo_uint tt = t - 18;
291
292
19.8k
        *op++ = 0;
293
74.6k
        while (tt > 255)
294
54.8k
        {
295
54.8k
            tt -= 255;
296
54.8k
            *op++ = 0;
297
54.8k
        }
298
19.8k
        assert(tt > 0);
299
19.8k
        *op++ = LZO_BYTE(tt);
300
19.8k
        c->lit3_r++;
301
19.8k
    }
302
16.2M
    do *op++ = *ii++; while (--t > 0);
303
304
487k
    return op;
305
487k
}
lzo1z_9x.c:STORE_RUN
Line
Count
Source
267
716k
{
268
716k
    c->lit_bytes += t;
269
270
716k
    if (op == c->out && t <= 238)
271
1.60k
    {
272
1.60k
        *op++ = LZO_BYTE(17 + t);
273
1.60k
    }
274
715k
    else if (t <= 3)
275
666k
    {
276
666k
#if defined(LZO1Z)
277
666k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
666k
        c->lit1_r++;
282
666k
    }
283
49.1k
    else if (t <= 18)
284
31.8k
    {
285
31.8k
        *op++ = LZO_BYTE(t - 3);
286
31.8k
        c->lit2_r++;
287
31.8k
    }
288
17.2k
    else
289
17.2k
    {
290
17.2k
        lzo_uint tt = t - 18;
291
292
17.2k
        *op++ = 0;
293
53.7k
        while (tt > 255)
294
36.4k
        {
295
36.4k
            tt -= 255;
296
36.4k
            *op++ = 0;
297
36.4k
        }
298
17.2k
        assert(tt > 0);
299
17.2k
        *op++ = LZO_BYTE(tt);
300
17.2k
        c->lit3_r++;
301
17.2k
    }
302
11.6M
    do *op++ = *ii++; while (--t > 0);
303
304
716k
    return op;
305
716k
}
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.38M
{
312
2.38M
    if (lit > 0)
313
1.78M
    {
314
1.78M
        assert(m_len >= 2);
315
1.78M
        op = STORE_RUN(c,op,ii,lit);
316
1.78M
        c->r1_m_len = m_len;
317
1.78M
        c->r1_lit = lit;
318
1.78M
    }
319
598k
    else
320
598k
    {
321
598k
        assert(m_len >= 3);
322
598k
        c->r1_m_len = 0;
323
598k
        c->r1_lit = 0;
324
598k
    }
325
326
2.38M
    return op;
327
2.38M
}
lzo1x_9x.c:code_run
Line
Count
Source
311
800k
{
312
800k
    if (lit > 0)
313
581k
    {
314
581k
        assert(m_len >= 2);
315
581k
        op = STORE_RUN(c,op,ii,lit);
316
581k
        c->r1_m_len = m_len;
317
581k
        c->r1_lit = lit;
318
581k
    }
319
219k
    else
320
219k
    {
321
219k
        assert(m_len >= 3);
322
219k
        c->r1_m_len = 0;
323
219k
        c->r1_lit = 0;
324
219k
    }
325
326
800k
    return op;
327
800k
}
lzo1y_9x.c:code_run
Line
Count
Source
311
662k
{
312
662k
    if (lit > 0)
313
486k
    {
314
486k
        assert(m_len >= 2);
315
486k
        op = STORE_RUN(c,op,ii,lit);
316
486k
        c->r1_m_len = m_len;
317
486k
        c->r1_lit = lit;
318
486k
    }
319
176k
    else
320
176k
    {
321
176k
        assert(m_len >= 3);
322
176k
        c->r1_m_len = 0;
323
176k
        c->r1_lit = 0;
324
176k
    }
325
326
662k
    return op;
327
662k
}
lzo1z_9x.c:code_run
Line
Count
Source
311
918k
{
312
918k
    if (lit > 0)
313
715k
    {
314
715k
        assert(m_len >= 2);
315
715k
        op = STORE_RUN(c,op,ii,lit);
316
715k
        c->r1_m_len = m_len;
317
715k
        c->r1_lit = lit;
318
715k
    }
319
202k
    else
320
202k
    {
321
202k
        assert(m_len >= 3);
322
202k
        c->r1_m_len = 0;
323
202k
        c->r1_lit = 0;
324
202k
    }
325
326
918k
    return op;
327
918k
}
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.33M
{
337
5.33M
    lzo_uint n = 4;
338
339
5.33M
    if (m_len < 2)
340
1.12M
        return 0;
341
4.21M
    if (m_len == 2)
342
1.49M
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
2.71M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
1.28M
        return 2;
345
1.43M
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
15.3k
        return 2;
347
1.41M
    if (m_off <= M3_MAX_OFFSET)
348
1.16M
    {
349
1.16M
        if (m_len <= M3_MAX_LEN)
350
1.02M
            return 3;
351
133k
        m_len -= M3_MAX_LEN;
352
137k
        while (m_len > 255)
353
4.15k
        {
354
4.15k
            m_len -= 255;
355
4.15k
            n++;
356
4.15k
        }
357
133k
        return n;
358
1.16M
    }
359
253k
    if (m_off <= M4_MAX_OFFSET)
360
253k
    {
361
253k
        if (m_len <= M4_MAX_LEN)
362
164k
            return 3;
363
89.2k
        m_len -= M4_MAX_LEN;
364
91.6k
        while (m_len > 255)
365
2.36k
        {
366
2.36k
            m_len -= 255;
367
2.36k
            n++;
368
2.36k
        }
369
89.2k
        return n;
370
253k
    }
371
0
    return 0;
372
253k
}
lzo1x_9x.c:len_of_coded_match
Line
Count
Source
336
1.81M
{
337
1.81M
    lzo_uint n = 4;
338
339
1.81M
    if (m_len < 2)
340
379k
        return 0;
341
1.43M
    if (m_len == 2)
342
444k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
988k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
472k
        return 2;
345
515k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
6.02k
        return 2;
347
509k
    if (m_off <= M3_MAX_OFFSET)
348
416k
    {
349
416k
        if (m_len <= M3_MAX_LEN)
350
372k
            return 3;
351
43.7k
        m_len -= M3_MAX_LEN;
352
45.1k
        while (m_len > 255)
353
1.44k
        {
354
1.44k
            m_len -= 255;
355
1.44k
            n++;
356
1.44k
        }
357
43.7k
        return n;
358
416k
    }
359
93.5k
    if (m_off <= M4_MAX_OFFSET)
360
93.5k
    {
361
93.5k
        if (m_len <= M4_MAX_LEN)
362
62.6k
            return 3;
363
30.8k
        m_len -= M4_MAX_LEN;
364
31.9k
        while (m_len > 255)
365
1.07k
        {
366
1.07k
            m_len -= 255;
367
1.07k
            n++;
368
1.07k
        }
369
30.8k
        return n;
370
93.5k
    }
371
0
    return 0;
372
93.5k
}
lzo1y_9x.c:len_of_coded_match
Line
Count
Source
336
1.45M
{
337
1.45M
    lzo_uint n = 4;
338
339
1.45M
    if (m_len < 2)
340
286k
        return 0;
341
1.16M
    if (m_len == 2)
342
342k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
826k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
378k
        return 2;
345
448k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
5.53k
        return 2;
347
442k
    if (m_off <= M3_MAX_OFFSET)
348
361k
    {
349
361k
        if (m_len <= M3_MAX_LEN)
350
313k
            return 3;
351
48.2k
        m_len -= M3_MAX_LEN;
352
49.6k
        while (m_len > 255)
353
1.45k
        {
354
1.45k
            m_len -= 255;
355
1.45k
            n++;
356
1.45k
        }
357
48.2k
        return n;
358
361k
    }
359
81.5k
    if (m_off <= M4_MAX_OFFSET)
360
81.5k
    {
361
81.5k
        if (m_len <= M4_MAX_LEN)
362
49.9k
            return 3;
363
31.5k
        m_len -= M4_MAX_LEN;
364
32.0k
        while (m_len > 255)
365
492
        {
366
492
            m_len -= 255;
367
492
            n++;
368
492
        }
369
31.5k
        return n;
370
81.5k
    }
371
0
    return 0;
372
81.5k
}
lzo1z_9x.c:len_of_coded_match
Line
Count
Source
336
2.06M
{
337
2.06M
    lzo_uint n = 4;
338
339
2.06M
    if (m_len < 2)
340
459k
        return 0;
341
1.60M
    if (m_len == 2)
342
705k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
901k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
433k
        return 2;
345
468k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
3.80k
        return 2;
347
464k
    if (m_off <= M3_MAX_OFFSET)
348
385k
    {
349
385k
        if (m_len <= M3_MAX_LEN)
350
344k
            return 3;
351
41.5k
        m_len -= M3_MAX_LEN;
352
42.7k
        while (m_len > 255)
353
1.25k
        {
354
1.25k
            m_len -= 255;
355
1.25k
            n++;
356
1.25k
        }
357
41.5k
        return n;
358
385k
    }
359
78.8k
    if (m_off <= M4_MAX_OFFSET)
360
78.8k
    {
361
78.8k
        if (m_len <= M4_MAX_LEN)
362
51.9k
            return 3;
363
26.9k
        m_len -= M4_MAX_LEN;
364
27.7k
        while (m_len > 255)
365
797
        {
366
797
            m_len -= 255;
367
797
            n++;
368
797
        }
369
26.9k
        return n;
370
78.8k
    }
371
0
    return 0;
372
78.8k
}
373
374
375
static lzo_uint
376
min_gain(lzo_uint ahead, lzo_uint lit1, lzo_uint lit2, lzo_uint l1, lzo_uint l2, lzo_uint l3)
377
1.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
24.9k
    else if (lit1 <= 18)
391
16.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.19k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
1.25M
    if ((lzo_int) lazy_match_min_gain < 0)
398
79.7k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
1.25M
    return lazy_match_min_gain;
407
1.25M
}
lzo1x_9x.c:min_gain
Line
Count
Source
377
423k
{
378
423k
    lzo_uint lazy_match_min_gain;
379
380
423k
    assert (ahead >= 1);
381
423k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
423k
    if (lit1 <= 3)
389
412k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
10.3k
    else if (lit1 <= 18)
391
7.01k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
423k
    lazy_match_min_gain += (l2 - l1) * 2;
394
423k
    if (l3)
395
2.05k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
423k
    if ((lzo_int) lazy_match_min_gain < 0)
398
26.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
423k
    return lazy_match_min_gain;
407
423k
}
lzo1y_9x.c:min_gain
Line
Count
Source
377
325k
{
378
325k
    lzo_uint lazy_match_min_gain;
379
380
325k
    assert (ahead >= 1);
381
325k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
325k
    if (lit1 <= 3)
389
317k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
8.20k
    else if (lit1 <= 18)
391
5.29k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
325k
    lazy_match_min_gain += (l2 - l1) * 2;
394
325k
    if (l3)
395
1.01k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
325k
    if ((lzo_int) lazy_match_min_gain < 0)
398
30.0k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
325k
    return lazy_match_min_gain;
407
325k
}
lzo1z_9x.c:min_gain
Line
Count
Source
377
501k
{
378
501k
    lzo_uint lazy_match_min_gain;
379
380
501k
    assert (ahead >= 1);
381
501k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
501k
    if (lit1 <= 3)
389
495k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
6.38k
    else if (lit1 <= 18)
391
4.59k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
501k
    lazy_match_min_gain += (l2 - l1) * 2;
394
501k
    if (l3)
395
2.11k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
501k
    if ((lzo_int) lazy_match_min_gain < 0)
398
22.7k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
501k
    return lazy_match_min_gain;
407
501k
}
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.37M
#  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.13M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
4.13M
    if (*m_len <= M2_MIN_LEN)
459
1.87M
        return;
460
#if defined(LZO1Z)
461
742k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.3k
        return;
463
732k
#if 1
464
732k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
478k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.35k
    {
467
1.35k
        *m_len = *m_len - 1;
468
1.35k
        *m_off = swd->best_off[*m_len];
469
1.35k
        return;
470
1.35k
    }
471
731k
#endif
472
731k
#endif
473
474
2.24M
    if (*m_off <= M2_MAX_OFFSET)
475
1.17M
        return;
476
477
1.07M
#if 1
478
    /* M3/M4 -> M2 */
479
1.07M
    if (*m_off > M2_MAX_OFFSET &&
480
1.07M
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
720k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
141k
    {
483
141k
        *m_len = *m_len - 1;
484
141k
        *m_off = swd->best_off[*m_len];
485
141k
        return;
486
141k
    }
487
928k
#endif
488
489
928k
#if 1
490
    /* M4 -> M2 */
491
928k
    if (*m_off > M3_MAX_OFFSET &&
492
248k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
41.3k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
5.51k
    {
495
5.51k
        *m_len = *m_len - 2;
496
5.51k
        *m_off = swd->best_off[*m_len];
497
5.51k
        return;
498
5.51k
    }
499
923k
#endif
500
501
923k
#if 1
502
    /* M4 -> M3 */
503
923k
    if (*m_off > M3_MAX_OFFSET &&
504
243k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
89.3k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
13.8k
    {
507
13.8k
        *m_len = *m_len - 1;
508
13.8k
        *m_off = swd->best_off[*m_len];
509
13.8k
    }
510
923k
#endif
511
923k
}
lzo1x_9x.c:better_match
Line
Count
Source
453
1.40M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.40M
    if (*m_len <= M2_MIN_LEN)
459
581k
        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
823k
    if (*m_off <= M2_MAX_OFFSET)
475
444k
        return;
476
477
378k
#if 1
478
    /* M3/M4 -> M2 */
479
378k
    if (*m_off > M2_MAX_OFFSET &&
480
378k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
227k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
55.3k
    {
483
55.3k
        *m_len = *m_len - 1;
484
55.3k
        *m_off = swd->best_off[*m_len];
485
55.3k
        return;
486
55.3k
    }
487
323k
#endif
488
489
323k
#if 1
490
    /* M4 -> M2 */
491
323k
    if (*m_off > M3_MAX_OFFSET &&
492
90.9k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
9.35k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.66k
    {
495
1.66k
        *m_len = *m_len - 2;
496
1.66k
        *m_off = swd->best_off[*m_len];
497
1.66k
        return;
498
1.66k
    }
499
321k
#endif
500
501
321k
#if 1
502
    /* M4 -> M3 */
503
321k
    if (*m_off > M3_MAX_OFFSET &&
504
89.2k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
31.3k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
5.50k
    {
507
5.50k
        *m_len = *m_len - 1;
508
5.50k
        *m_off = swd->best_off[*m_len];
509
5.50k
    }
510
321k
#endif
511
321k
}
lzo1y_9x.c:better_match
Line
Count
Source
453
1.14M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.14M
    if (*m_len <= M2_MIN_LEN)
459
450k
        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
693k
    if (*m_off <= M2_MAX_OFFSET)
475
327k
        return;
476
477
365k
#if 1
478
    /* M3/M4 -> M2 */
479
365k
    if (*m_off > M2_MAX_OFFSET &&
480
365k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
299k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
42.4k
    {
483
42.4k
        *m_len = *m_len - 1;
484
42.4k
        *m_off = swd->best_off[*m_len];
485
42.4k
        return;
486
42.4k
    }
487
323k
#endif
488
489
323k
#if 1
490
    /* M4 -> M2 */
491
323k
    if (*m_off > M3_MAX_OFFSET &&
492
79.3k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
23.6k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
2.30k
    {
495
2.30k
        *m_len = *m_len - 2;
496
2.30k
        *m_off = swd->best_off[*m_len];
497
2.30k
        return;
498
2.30k
    }
499
321k
#endif
500
501
321k
#if 1
502
    /* M4 -> M3 */
503
321k
    if (*m_off > M3_MAX_OFFSET &&
504
77.0k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
30.3k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
3.65k
    {
507
3.65k
        *m_len = *m_len - 1;
508
3.65k
        *m_off = swd->best_off[*m_len];
509
3.65k
    }
510
321k
#endif
511
321k
}
lzo1z_9x.c:better_match
Line
Count
Source
453
1.58M
{
454
1.58M
#if defined(LZO1Z)
455
1.58M
    const LZO_COMPRESS_T *c = swd->c;
456
1.58M
#endif
457
458
1.58M
    if (*m_len <= M2_MIN_LEN)
459
839k
        return;
460
742k
#if defined(LZO1Z)
461
742k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.3k
        return;
463
732k
#if 1
464
732k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
478k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.35k
    {
467
1.35k
        *m_len = *m_len - 1;
468
1.35k
        *m_off = swd->best_off[*m_len];
469
1.35k
        return;
470
1.35k
    }
471
731k
#endif
472
731k
#endif
473
474
731k
    if (*m_off <= M2_MAX_OFFSET)
475
404k
        return;
476
477
326k
#if 1
478
    /* M3/M4 -> M2 */
479
326k
    if (*m_off > M2_MAX_OFFSET &&
480
326k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
194k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
43.8k
    {
483
43.8k
        *m_len = *m_len - 1;
484
43.8k
        *m_off = swd->best_off[*m_len];
485
43.8k
        return;
486
43.8k
    }
487
282k
#endif
488
489
282k
#if 1
490
    /* M4 -> M2 */
491
282k
    if (*m_off > M3_MAX_OFFSET &&
492
78.3k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
8.36k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.54k
    {
495
1.54k
        *m_len = *m_len - 2;
496
1.54k
        *m_off = swd->best_off[*m_len];
497
1.54k
        return;
498
1.54k
    }
499
280k
#endif
500
501
280k
#if 1
502
    /* M4 -> M3 */
503
280k
    if (*m_off > M3_MAX_OFFSET &&
504
76.8k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
27.6k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.70k
    {
507
4.70k
        *m_len = *m_len - 1;
508
4.70k
        *m_off = swd->best_off[*m_len];
509
4.70k
    }
510
280k
#endif
511
280k
}
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.46k
{
533
4.46k
    lzo_bytep op;
534
4.46k
    const lzo_bytep ii;
535
4.46k
    lzo_uint lit;
536
4.46k
    lzo_uint m_len, m_off;
537
4.46k
    LZO_COMPRESS_T cc;
538
4.46k
    LZO_COMPRESS_T * const c = &cc;
539
4.46k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
4.46k
    lzo_uint try_lazy;
541
4.46k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
1.39k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.41k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.65k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
4.46k
    try_lazy = (lzo_uint) try_lazy_parm;
557
4.46k
    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.46k
    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.46k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
4.46k
    if (nice_length == 0)
567
4.46k
        nice_length = 0;
568
    /* don't search more positions than this */
569
4.46k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
4.46k
    c->init = 0;
573
4.46k
    c->ip = c->in = in;
574
4.46k
    c->in_end = in + in_len;
575
4.46k
    c->out = out;
576
4.46k
    c->cb = cb;
577
4.46k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
4.46k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
4.46k
    op = out;
581
4.46k
    ii = c->ip;             /* point to start of literal run */
582
4.46k
    lit = 0;
583
4.46k
    c->r1_lit = c->r1_m_len = 0;
584
585
4.46k
    r = init_match(c,swd,dict,dict_len,flags);
586
4.46k
    if (r != 0)
587
0
        return r;
588
4.46k
    if (max_chain > 0)
589
4.46k
        swd->max_chain = max_chain;
590
4.46k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
4.46k
    r = find_match(c,swd,0,0);
594
4.46k
    if (r != 0)
595
0
        return r;
596
39.8M
    while (c->look > 0)
597
39.8M
    {
598
39.8M
        lzo_uint ahead;
599
39.8M
        lzo_uint max_ahead;
600
39.8M
        lzo_uint l1, l2, l3;
601
602
39.8M
        c->codesize = pd(op, out);
603
604
39.8M
        m_len = c->m_len;
605
39.8M
        m_off = c->m_off;
606
607
39.8M
        assert(c->bp == c->ip - c->look);
608
39.8M
        assert(c->bp >= in);
609
39.8M
        if (lit == 0)
610
2.38M
            ii = c->bp;
611
39.8M
        assert(ii + lit == c->bp);
612
39.8M
        assert(swd->b_char == *(c->bp));
613
614
39.8M
        if ( m_len < 2 ||
615
19.3M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
2.99M
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
2.99M
            (m_len == 2 && op == out) ||
622
2.99M
#endif
623
2.99M
            (op == out && lit == 0))
624
36.8M
        {
625
            /* a literal */
626
36.8M
            m_len = 0;
627
36.8M
        }
628
2.99M
        else if (m_len == M2_MIN_LEN)
629
545k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
545k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
121k
                m_len = 0;
633
545k
        }
634
635
39.8M
        if (m_len == 0)
636
36.9M
        {
637
    /* a literal */
638
36.9M
            lit++;
639
36.9M
            swd->max_chain = max_chain;
640
36.9M
            r = find_match(c,swd,1,0);
641
36.9M
            assert(r == 0); LZO_UNUSED(r);
642
36.9M
            continue;
643
36.9M
        }
644
645
    /* a match */
646
2.87M
#if defined(SWD_BEST_OFF)
647
2.87M
        if (swd->use_best_off)
648
2.87M
            better_match(swd,&m_len,&m_off);
649
2.87M
#endif
650
2.87M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
2.87M
        ahead = 0;
655
2.87M
        if (try_lazy == 0 || m_len >= max_lazy)
656
45.4k
        {
657
            /* no */
658
45.4k
            l1 = 0;
659
45.4k
            max_ahead = 0;
660
45.4k
        }
661
2.83M
        else
662
2.83M
        {
663
            /* yes, try a lazy match */
664
2.83M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
2.83M
            assert(l1 > 0);
666
2.83M
#if 1
667
2.83M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
2.83M
        }
672
673
674
5.93M
        while (ahead < max_ahead && c->look > m_len)
675
3.55M
        {
676
3.55M
            lzo_uint lazy_match_min_gain;
677
678
3.55M
            if (m_len >= good_length)
679
191k
                swd->max_chain = max_chain >> 2;
680
3.36M
            else
681
3.36M
                swd->max_chain = max_chain;
682
3.55M
            r = find_match(c,swd,1,0);
683
3.55M
            ahead++;
684
685
3.55M
            assert(r == 0); LZO_UNUSED(r);
686
3.55M
            assert(c->look > 0);
687
3.55M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
1.30M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
353k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.48k
                    c->m_len = 0;
693
#endif
694
3.55M
            if (c->m_len < m_len)
695
2.04M
                continue;
696
1.50M
#if 1
697
1.50M
            if (c->m_len == m_len && c->m_off >= m_off)
698
254k
                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
5.16k
                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
497k
            {
723
497k
                c->lazy++;
724
497k
                assert_match(swd,c->m_len,c->m_off);
725
726
497k
                if (l3)
727
2.86k
                {
728
                    /* code previous run */
729
2.86k
                    op = code_run(c,op,ii,lit,ahead);
730
2.86k
                    lit = 0;
731
                    /* code shortened match */
732
2.86k
                    op = code_match(c,op,ahead,m_off);
733
2.86k
                }
734
494k
                else
735
494k
                {
736
494k
                    lit += ahead;
737
494k
                    assert(ii + lit == c->bp);
738
494k
                }
739
497k
                goto lazy_match_done;
740
497k
            }
741
1.25M
        }
742
743
744
2.87M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
2.37M
        op = code_run(c,op,ii,lit,m_len);
748
2.37M
        lit = 0;
749
750
        /* 2 - code match */
751
2.37M
        op = code_match(c,op,m_len,m_off);
752
2.37M
        swd->max_chain = max_chain;
753
2.37M
        r = find_match(c,swd,m_len,1+ahead);
754
2.37M
        assert(r == 0); LZO_UNUSED(r);
755
756
2.87M
lazy_match_done: ;
757
2.87M
    }
758
759
760
    /* store final run */
761
4.46k
    if (lit > 0)
762
2.77k
        op = STORE_RUN(c,op,ii,lit);
763
764
4.46k
#if defined(LZO_EOF_CODE)
765
4.46k
    *op++ = M4_MARKER | 1;
766
4.46k
    *op++ = 0;
767
4.46k
    *op++ = 0;
768
4.46k
#endif
769
770
4.46k
    c->codesize = pd(op, out);
771
4.46k
    assert(c->textsize == in_len);
772
773
4.46k
    *out_len = pd(op, out);
774
775
4.46k
    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.46k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
4.46k
    return LZO_E_OK;
787
4.46k
}
lzo1x_999_compress_internal
Line
Count
Source
532
1.39k
{
533
1.39k
    lzo_bytep op;
534
1.39k
    const lzo_bytep ii;
535
1.39k
    lzo_uint lit;
536
1.39k
    lzo_uint m_len, m_off;
537
1.39k
    LZO_COMPRESS_T cc;
538
1.39k
    LZO_COMPRESS_T * const c = &cc;
539
1.39k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.39k
    lzo_uint try_lazy;
541
1.39k
    int r;
542
543
    /* sanity check */
544
1.39k
#if defined(LZO1X)
545
1.39k
    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.39k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.39k
    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.39k
    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.39k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.39k
    if (nice_length == 0)
567
1.39k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.39k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.39k
    c->init = 0;
573
1.39k
    c->ip = c->in = in;
574
1.39k
    c->in_end = in + in_len;
575
1.39k
    c->out = out;
576
1.39k
    c->cb = cb;
577
1.39k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.39k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.39k
    op = out;
581
1.39k
    ii = c->ip;             /* point to start of literal run */
582
1.39k
    lit = 0;
583
1.39k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.39k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.39k
    if (r != 0)
587
0
        return r;
588
1.39k
    if (max_chain > 0)
589
1.39k
        swd->max_chain = max_chain;
590
1.39k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.39k
    r = find_match(c,swd,0,0);
594
1.39k
    if (r != 0)
595
0
        return r;
596
10.3M
    while (c->look > 0)
597
10.3M
    {
598
10.3M
        lzo_uint ahead;
599
10.3M
        lzo_uint max_ahead;
600
10.3M
        lzo_uint l1, l2, l3;
601
602
10.3M
        c->codesize = pd(op, out);
603
604
10.3M
        m_len = c->m_len;
605
10.3M
        m_off = c->m_off;
606
607
10.3M
        assert(c->bp == c->ip - c->look);
608
10.3M
        assert(c->bp >= in);
609
10.3M
        if (lit == 0)
610
801k
            ii = c->bp;
611
10.3M
        assert(ii + lit == c->bp);
612
10.3M
        assert(swd->b_char == *(c->bp));
613
614
10.3M
        if ( m_len < 2 ||
615
4.94M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
1.02M
#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.02M
            (m_len == 2 && op == out) ||
622
1.02M
#endif
623
1.02M
            (op == out && lit == 0))
624
9.30M
        {
625
            /* a literal */
626
9.30M
            m_len = 0;
627
9.30M
        }
628
1.02M
        else if (m_len == M2_MIN_LEN)
629
196k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
196k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
44.7k
                m_len = 0;
633
196k
        }
634
635
10.3M
        if (m_len == 0)
636
9.34M
        {
637
    /* a literal */
638
9.34M
            lit++;
639
9.34M
            swd->max_chain = max_chain;
640
9.34M
            r = find_match(c,swd,1,0);
641
9.34M
            assert(r == 0); LZO_UNUSED(r);
642
9.34M
            continue;
643
9.34M
        }
644
645
    /* a match */
646
980k
#if defined(SWD_BEST_OFF)
647
980k
        if (swd->use_best_off)
648
980k
            better_match(swd,&m_len,&m_off);
649
980k
#endif
650
980k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
980k
        ahead = 0;
655
980k
        if (try_lazy == 0 || m_len >= max_lazy)
656
15.0k
        {
657
            /* no */
658
15.0k
            l1 = 0;
659
15.0k
            max_ahead = 0;
660
15.0k
        }
661
965k
        else
662
965k
        {
663
            /* yes, try a lazy match */
664
965k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
965k
            assert(l1 > 0);
666
965k
#if 1
667
965k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
965k
        }
672
673
674
2.02M
        while (ahead < max_ahead && c->look > m_len)
675
1.22M
        {
676
1.22M
            lzo_uint lazy_match_min_gain;
677
678
1.22M
            if (m_len >= good_length)
679
63.5k
                swd->max_chain = max_chain >> 2;
680
1.16M
            else
681
1.16M
                swd->max_chain = max_chain;
682
1.22M
            r = find_match(c,swd,1,0);
683
1.22M
            ahead++;
684
685
1.22M
            assert(r == 0); LZO_UNUSED(r);
686
1.22M
            assert(c->look > 0);
687
1.22M
            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.22M
            if (c->m_len < m_len)
695
702k
                continue;
696
521k
#if 1
697
521k
            if (c->m_len == m_len && c->m_off >= m_off)
698
97.0k
                continue;
699
424k
#endif
700
424k
#if defined(SWD_BEST_OFF)
701
424k
            if (swd->use_best_off)
702
424k
                better_match(swd,&c->m_len,&c->m_off);
703
424k
#endif
704
424k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
424k
            if (l2 == 0)
706
1.47k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
423k
#if 1
714
            /* compressed-data compatibility [see above] */
715
423k
            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
423k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
423k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
180k
            {
723
180k
                c->lazy++;
724
180k
                assert_match(swd,c->m_len,c->m_off);
725
726
180k
                if (l3)
727
1.01k
                {
728
                    /* code previous run */
729
1.01k
                    op = code_run(c,op,ii,lit,ahead);
730
1.01k
                    lit = 0;
731
                    /* code shortened match */
732
1.01k
                    op = code_match(c,op,ahead,m_off);
733
1.01k
                }
734
179k
                else
735
179k
                {
736
179k
                    lit += ahead;
737
179k
                    assert(ii + lit == c->bp);
738
179k
                }
739
180k
                goto lazy_match_done;
740
180k
            }
741
423k
        }
742
743
744
980k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
799k
        op = code_run(c,op,ii,lit,m_len);
748
799k
        lit = 0;
749
750
        /* 2 - code match */
751
799k
        op = code_match(c,op,m_len,m_off);
752
799k
        swd->max_chain = max_chain;
753
799k
        r = find_match(c,swd,m_len,1+ahead);
754
799k
        assert(r == 0); LZO_UNUSED(r);
755
756
980k
lazy_match_done: ;
757
980k
    }
758
759
760
    /* store final run */
761
1.39k
    if (lit > 0)
762
812
        op = STORE_RUN(c,op,ii,lit);
763
764
1.39k
#if defined(LZO_EOF_CODE)
765
1.39k
    *op++ = M4_MARKER | 1;
766
1.39k
    *op++ = 0;
767
1.39k
    *op++ = 0;
768
1.39k
#endif
769
770
1.39k
    c->codesize = pd(op, out);
771
1.39k
    assert(c->textsize == in_len);
772
773
1.39k
    *out_len = pd(op, out);
774
775
1.39k
    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.39k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.39k
    return LZO_E_OK;
787
1.39k
}
lzo1y_999_compress_internal
Line
Count
Source
532
1.41k
{
533
1.41k
    lzo_bytep op;
534
1.41k
    const lzo_bytep ii;
535
1.41k
    lzo_uint lit;
536
1.41k
    lzo_uint m_len, m_off;
537
1.41k
    LZO_COMPRESS_T cc;
538
1.41k
    LZO_COMPRESS_T * const c = &cc;
539
1.41k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.41k
    lzo_uint try_lazy;
541
1.41k
    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.41k
    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.41k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.41k
    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.41k
    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.41k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.41k
    if (nice_length == 0)
567
1.41k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.41k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.41k
    c->init = 0;
573
1.41k
    c->ip = c->in = in;
574
1.41k
    c->in_end = in + in_len;
575
1.41k
    c->out = out;
576
1.41k
    c->cb = cb;
577
1.41k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.41k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.41k
    op = out;
581
1.41k
    ii = c->ip;             /* point to start of literal run */
582
1.41k
    lit = 0;
583
1.41k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.41k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.41k
    if (r != 0)
587
0
        return r;
588
1.41k
    if (max_chain > 0)
589
1.41k
        swd->max_chain = max_chain;
590
1.41k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.41k
    r = find_match(c,swd,0,0);
594
1.41k
    if (r != 0)
595
0
        return r;
596
16.9M
    while (c->look > 0)
597
16.9M
    {
598
16.9M
        lzo_uint ahead;
599
16.9M
        lzo_uint max_ahead;
600
16.9M
        lzo_uint l1, l2, l3;
601
602
16.9M
        c->codesize = pd(op, out);
603
604
16.9M
        m_len = c->m_len;
605
16.9M
        m_off = c->m_off;
606
607
16.9M
        assert(c->bp == c->ip - c->look);
608
16.9M
        assert(c->bp >= in);
609
16.9M
        if (lit == 0)
610
663k
            ii = c->bp;
611
16.9M
        assert(ii + lit == c->bp);
612
16.9M
        assert(swd->b_char == *(c->bp));
613
614
16.9M
        if ( m_len < 2 ||
615
8.38M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
864k
#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
864k
            (m_len == 2 && op == out) ||
622
864k
#endif
623
864k
            (op == out && lit == 0))
624
16.0M
        {
625
            /* a literal */
626
16.0M
            m_len = 0;
627
16.0M
        }
628
864k
        else if (m_len == M2_MIN_LEN)
629
170k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
170k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
47.3k
                m_len = 0;
633
170k
        }
634
635
16.9M
        if (m_len == 0)
636
16.1M
        {
637
    /* a literal */
638
16.1M
            lit++;
639
16.1M
            swd->max_chain = max_chain;
640
16.1M
            r = find_match(c,swd,1,0);
641
16.1M
            assert(r == 0); LZO_UNUSED(r);
642
16.1M
            continue;
643
16.1M
        }
644
645
    /* a match */
646
816k
#if defined(SWD_BEST_OFF)
647
816k
        if (swd->use_best_off)
648
816k
            better_match(swd,&m_len,&m_off);
649
816k
#endif
650
816k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
816k
        ahead = 0;
655
816k
        if (try_lazy == 0 || m_len >= max_lazy)
656
13.4k
        {
657
            /* no */
658
13.4k
            l1 = 0;
659
13.4k
            max_ahead = 0;
660
13.4k
        }
661
803k
        else
662
803k
        {
663
            /* yes, try a lazy match */
664
803k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
803k
            assert(l1 > 0);
666
803k
#if 1
667
803k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
803k
        }
672
673
674
1.69M
        while (ahead < max_ahead && c->look > m_len)
675
1.03M
        {
676
1.03M
            lzo_uint lazy_match_min_gain;
677
678
1.03M
            if (m_len >= good_length)
679
66.4k
                swd->max_chain = max_chain >> 2;
680
963k
            else
681
963k
                swd->max_chain = max_chain;
682
1.03M
            r = find_match(c,swd,1,0);
683
1.03M
            ahead++;
684
685
1.03M
            assert(r == 0); LZO_UNUSED(r);
686
1.03M
            assert(c->look > 0);
687
1.03M
            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.03M
            if (c->m_len < m_len)
695
629k
                continue;
696
401k
#if 1
697
401k
            if (c->m_len == m_len && c->m_off >= m_off)
698
73.9k
                continue;
699
327k
#endif
700
327k
#if defined(SWD_BEST_OFF)
701
327k
            if (swd->use_best_off)
702
327k
                better_match(swd,&c->m_len,&c->m_off);
703
327k
#endif
704
327k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
327k
            if (l2 == 0)
706
1.78k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
325k
#if 1
714
            /* compressed-data compatibility [see above] */
715
325k
            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
325k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
325k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
154k
            {
723
154k
                c->lazy++;
724
154k
                assert_match(swd,c->m_len,c->m_off);
725
726
154k
                if (l3)
727
768
                {
728
                    /* code previous run */
729
768
                    op = code_run(c,op,ii,lit,ahead);
730
768
                    lit = 0;
731
                    /* code shortened match */
732
768
                    op = code_match(c,op,ahead,m_off);
733
768
                }
734
154k
                else
735
154k
                {
736
154k
                    lit += ahead;
737
154k
                    assert(ii + lit == c->bp);
738
154k
                }
739
154k
                goto lazy_match_done;
740
154k
            }
741
325k
        }
742
743
744
816k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
662k
        op = code_run(c,op,ii,lit,m_len);
748
662k
        lit = 0;
749
750
        /* 2 - code match */
751
662k
        op = code_match(c,op,m_len,m_off);
752
662k
        swd->max_chain = max_chain;
753
662k
        r = find_match(c,swd,m_len,1+ahead);
754
662k
        assert(r == 0); LZO_UNUSED(r);
755
756
816k
lazy_match_done: ;
757
816k
    }
758
759
760
    /* store final run */
761
1.41k
    if (lit > 0)
762
871
        op = STORE_RUN(c,op,ii,lit);
763
764
1.41k
#if defined(LZO_EOF_CODE)
765
1.41k
    *op++ = M4_MARKER | 1;
766
1.41k
    *op++ = 0;
767
1.41k
    *op++ = 0;
768
1.41k
#endif
769
770
1.41k
    c->codesize = pd(op, out);
771
1.41k
    assert(c->textsize == in_len);
772
773
1.41k
    *out_len = pd(op, out);
774
775
1.41k
    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.41k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.41k
    return LZO_E_OK;
787
1.41k
}
lzo1z_999_compress_internal
Line
Count
Source
532
1.65k
{
533
1.65k
    lzo_bytep op;
534
1.65k
    const lzo_bytep ii;
535
1.65k
    lzo_uint lit;
536
1.65k
    lzo_uint m_len, m_off;
537
1.65k
    LZO_COMPRESS_T cc;
538
1.65k
    LZO_COMPRESS_T * const c = &cc;
539
1.65k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.65k
    lzo_uint try_lazy;
541
1.65k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.65k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.65k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.65k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.65k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.65k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.65k
    if (nice_length == 0)
567
1.65k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.65k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.65k
    c->init = 0;
573
1.65k
    c->ip = c->in = in;
574
1.65k
    c->in_end = in + in_len;
575
1.65k
    c->out = out;
576
1.65k
    c->cb = cb;
577
1.65k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.65k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.65k
    op = out;
581
1.65k
    ii = c->ip;             /* point to start of literal run */
582
1.65k
    lit = 0;
583
1.65k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.65k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.65k
    if (r != 0)
587
0
        return r;
588
1.65k
    if (max_chain > 0)
589
1.65k
        swd->max_chain = max_chain;
590
1.65k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.65k
    r = find_match(c,swd,0,0);
594
1.65k
    if (r != 0)
595
0
        return r;
596
12.5M
    while (c->look > 0)
597
12.5M
    {
598
12.5M
        lzo_uint ahead;
599
12.5M
        lzo_uint max_ahead;
600
12.5M
        lzo_uint l1, l2, l3;
601
602
12.5M
        c->codesize = pd(op, out);
603
604
12.5M
        m_len = c->m_len;
605
12.5M
        m_off = c->m_off;
606
607
12.5M
        assert(c->bp == c->ip - c->look);
608
12.5M
        assert(c->bp >= in);
609
12.5M
        if (lit == 0)
610
919k
            ii = c->bp;
611
12.5M
        assert(ii + lit == c->bp);
612
12.5M
        assert(swd->b_char == *(c->bp));
613
614
12.5M
        if ( m_len < 2 ||
615
6.01M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
1.10M
#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.10M
            (m_len == 2 && op == out) ||
622
1.10M
#endif
623
1.10M
            (op == out && lit == 0))
624
11.4M
        {
625
            /* a literal */
626
11.4M
            m_len = 0;
627
11.4M
        }
628
1.10M
        else if (m_len == M2_MIN_LEN)
629
178k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
178k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
29.3k
                m_len = 0;
633
178k
        }
634
635
12.5M
        if (m_len == 0)
636
11.4M
        {
637
    /* a literal */
638
11.4M
            lit++;
639
11.4M
            swd->max_chain = max_chain;
640
11.4M
            r = find_match(c,swd,1,0);
641
11.4M
            assert(r == 0); LZO_UNUSED(r);
642
11.4M
            continue;
643
11.4M
        }
644
645
    /* a match */
646
1.07M
#if defined(SWD_BEST_OFF)
647
1.07M
        if (swd->use_best_off)
648
1.07M
            better_match(swd,&m_len,&m_off);
649
1.07M
#endif
650
1.07M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
1.07M
        ahead = 0;
655
1.07M
        if (try_lazy == 0 || m_len >= max_lazy)
656
16.9k
        {
657
            /* no */
658
16.9k
            l1 = 0;
659
16.9k
            max_ahead = 0;
660
16.9k
        }
661
1.06M
        else
662
1.06M
        {
663
            /* yes, try a lazy match */
664
1.06M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
1.06M
            assert(l1 > 0);
666
1.06M
#if 1
667
1.06M
            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.06M
        }
672
673
674
2.22M
        while (ahead < max_ahead && c->look > m_len)
675
1.30M
        {
676
1.30M
            lzo_uint lazy_match_min_gain;
677
678
1.30M
            if (m_len >= good_length)
679
61.1k
                swd->max_chain = max_chain >> 2;
680
1.24M
            else
681
1.24M
                swd->max_chain = max_chain;
682
1.30M
            r = find_match(c,swd,1,0);
683
1.30M
            ahead++;
684
685
1.30M
            assert(r == 0); LZO_UNUSED(r);
686
1.30M
            assert(c->look > 0);
687
1.30M
            assert(ii + lit + ahead == c->bp);
688
689
1.30M
#if defined(LZO1Z)
690
1.30M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
353k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.48k
                    c->m_len = 0;
693
1.30M
#endif
694
1.30M
            if (c->m_len < m_len)
695
717k
                continue;
696
586k
#if 1
697
586k
            if (c->m_len == m_len && c->m_off >= m_off)
698
82.9k
                continue;
699
503k
#endif
700
503k
#if defined(SWD_BEST_OFF)
701
503k
            if (swd->use_best_off)
702
503k
                better_match(swd,&c->m_len,&c->m_off);
703
503k
#endif
704
503k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
503k
            if (l2 == 0)
706
1.90k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
501k
#if 1
714
            /* compressed-data compatibility [see above] */
715
501k
            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
501k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
501k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
161k
            {
723
161k
                c->lazy++;
724
161k
                assert_match(swd,c->m_len,c->m_off);
725
726
161k
                if (l3)
727
1.07k
                {
728
                    /* code previous run */
729
1.07k
                    op = code_run(c,op,ii,lit,ahead);
730
1.07k
                    lit = 0;
731
                    /* code shortened match */
732
1.07k
                    op = code_match(c,op,ahead,m_off);
733
1.07k
                }
734
160k
                else
735
160k
                {
736
160k
                    lit += ahead;
737
160k
                    assert(ii + lit == c->bp);
738
160k
                }
739
161k
                goto lazy_match_done;
740
161k
            }
741
501k
        }
742
743
744
1.07M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
917k
        op = code_run(c,op,ii,lit,m_len);
748
917k
        lit = 0;
749
750
        /* 2 - code match */
751
917k
        op = code_match(c,op,m_len,m_off);
752
917k
        swd->max_chain = max_chain;
753
917k
        r = find_match(c,swd,m_len,1+ahead);
754
917k
        assert(r == 0); LZO_UNUSED(r);
755
756
1.07M
lazy_match_done: ;
757
1.07M
    }
758
759
760
    /* store final run */
761
1.65k
    if (lit > 0)
762
1.09k
        op = STORE_RUN(c,op,ii,lit);
763
764
1.65k
#if defined(LZO_EOF_CODE)
765
1.65k
    *op++ = M4_MARKER | 1;
766
1.65k
    *op++ = 0;
767
1.65k
    *op++ = 0;
768
1.65k
#endif
769
770
1.65k
    c->codesize = pd(op, out);
771
1.65k
    assert(c->textsize == in_len);
772
773
1.65k
    *out_len = pd(op, out);
774
775
1.65k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.65k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.65k
    return LZO_E_OK;
787
1.65k
}
788
789
790
/***********************************************************************
791
//
792
************************************************************************/
793
794
LZO_PUBLIC(int)
795
lzo1x_999_compress_level    ( const lzo_bytep in , lzo_uint  in_len,
796
                                    lzo_bytep out, lzo_uintp out_len,
797
                                    lzo_voidp wrkmem,
798
                              const lzo_bytep dict, lzo_uint dict_len,
799
                                    lzo_callback_p cb,
800
                                    int compression_level )
801
4.46k
{
802
4.46k
    static const struct
803
4.46k
    {
804
4.46k
        int try_lazy_parm;
805
4.46k
        lzo_uint good_length;
806
4.46k
        lzo_uint max_lazy;
807
4.46k
        lzo_uint nice_length;
808
4.46k
        lzo_uint max_chain;
809
4.46k
        lzo_uint32_t flags;
810
4.46k
    } c[9] = {
811
        /* faster compression */
812
4.46k
        {   0,     0,     0,     8,    4,   0 },
813
4.46k
        {   0,     0,     0,    16,    8,   0 },
814
4.46k
        {   0,     0,     0,    32,   16,   0 },
815
4.46k
        {   1,     4,     4,    16,   16,   0 },
816
4.46k
        {   1,     8,    16,    32,   32,   0 },
817
4.46k
        {   1,     8,    16,   128,  128,   0 },
818
4.46k
        {   2,     8,    32,   128,  256,   0 },
819
4.46k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
4.46k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
4.46k
    };
823
824
4.46k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
4.46k
    compression_level -= 1;
828
4.46k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
4.46k
                                       dict, dict_len, cb,
830
4.46k
                                       c[compression_level].try_lazy_parm,
831
4.46k
                                       c[compression_level].good_length,
832
4.46k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
4.46k
                                       0,
837
4.46k
#endif
838
4.46k
                                       c[compression_level].max_chain,
839
4.46k
                                       c[compression_level].flags);
840
4.46k
}
lzo1x_999_compress_level
Line
Count
Source
801
1.39k
{
802
1.39k
    static const struct
803
1.39k
    {
804
1.39k
        int try_lazy_parm;
805
1.39k
        lzo_uint good_length;
806
1.39k
        lzo_uint max_lazy;
807
1.39k
        lzo_uint nice_length;
808
1.39k
        lzo_uint max_chain;
809
1.39k
        lzo_uint32_t flags;
810
1.39k
    } c[9] = {
811
        /* faster compression */
812
1.39k
        {   0,     0,     0,     8,    4,   0 },
813
1.39k
        {   0,     0,     0,    16,    8,   0 },
814
1.39k
        {   0,     0,     0,    32,   16,   0 },
815
1.39k
        {   1,     4,     4,    16,   16,   0 },
816
1.39k
        {   1,     8,    16,    32,   32,   0 },
817
1.39k
        {   1,     8,    16,   128,  128,   0 },
818
1.39k
        {   2,     8,    32,   128,  256,   0 },
819
1.39k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.39k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.39k
    };
823
824
1.39k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.39k
    compression_level -= 1;
828
1.39k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.39k
                                       dict, dict_len, cb,
830
1.39k
                                       c[compression_level].try_lazy_parm,
831
1.39k
                                       c[compression_level].good_length,
832
1.39k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.39k
                                       0,
837
1.39k
#endif
838
1.39k
                                       c[compression_level].max_chain,
839
1.39k
                                       c[compression_level].flags);
840
1.39k
}
lzo1y_999_compress_level
Line
Count
Source
801
1.41k
{
802
1.41k
    static const struct
803
1.41k
    {
804
1.41k
        int try_lazy_parm;
805
1.41k
        lzo_uint good_length;
806
1.41k
        lzo_uint max_lazy;
807
1.41k
        lzo_uint nice_length;
808
1.41k
        lzo_uint max_chain;
809
1.41k
        lzo_uint32_t flags;
810
1.41k
    } c[9] = {
811
        /* faster compression */
812
1.41k
        {   0,     0,     0,     8,    4,   0 },
813
1.41k
        {   0,     0,     0,    16,    8,   0 },
814
1.41k
        {   0,     0,     0,    32,   16,   0 },
815
1.41k
        {   1,     4,     4,    16,   16,   0 },
816
1.41k
        {   1,     8,    16,    32,   32,   0 },
817
1.41k
        {   1,     8,    16,   128,  128,   0 },
818
1.41k
        {   2,     8,    32,   128,  256,   0 },
819
1.41k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.41k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.41k
    };
823
824
1.41k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.41k
    compression_level -= 1;
828
1.41k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.41k
                                       dict, dict_len, cb,
830
1.41k
                                       c[compression_level].try_lazy_parm,
831
1.41k
                                       c[compression_level].good_length,
832
1.41k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.41k
                                       0,
837
1.41k
#endif
838
1.41k
                                       c[compression_level].max_chain,
839
1.41k
                                       c[compression_level].flags);
840
1.41k
}
lzo1z_999_compress_level
Line
Count
Source
801
1.65k
{
802
1.65k
    static const struct
803
1.65k
    {
804
1.65k
        int try_lazy_parm;
805
1.65k
        lzo_uint good_length;
806
1.65k
        lzo_uint max_lazy;
807
1.65k
        lzo_uint nice_length;
808
1.65k
        lzo_uint max_chain;
809
1.65k
        lzo_uint32_t flags;
810
1.65k
    } c[9] = {
811
        /* faster compression */
812
1.65k
        {   0,     0,     0,     8,    4,   0 },
813
1.65k
        {   0,     0,     0,    16,    8,   0 },
814
1.65k
        {   0,     0,     0,    32,   16,   0 },
815
1.65k
        {   1,     4,     4,    16,   16,   0 },
816
1.65k
        {   1,     8,    16,    32,   32,   0 },
817
1.65k
        {   1,     8,    16,   128,  128,   0 },
818
1.65k
        {   2,     8,    32,   128,  256,   0 },
819
1.65k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.65k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.65k
    };
823
824
1.65k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.65k
    compression_level -= 1;
828
1.65k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.65k
                                       dict, dict_len, cb,
830
1.65k
                                       c[compression_level].try_lazy_parm,
831
1.65k
                                       c[compression_level].good_length,
832
1.65k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.65k
                                       0,
837
1.65k
#endif
838
1.65k
                                       c[compression_level].max_chain,
839
1.65k
                                       c[compression_level].flags);
840
1.65k
}
841
842
843
/***********************************************************************
844
//
845
************************************************************************/
846
847
LZO_PUBLIC(int)
848
lzo1x_999_compress_dict     ( const lzo_bytep in , lzo_uint  in_len,
849
                                    lzo_bytep out, lzo_uintp out_len,
850
                                    lzo_voidp wrkmem,
851
                              const lzo_bytep dict, lzo_uint dict_len )
852
0
{
853
0
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
854
0
                                    dict, dict_len, 0, 8);
855
0
}
Unexecuted instantiation: lzo1x_999_compress_dict
Unexecuted instantiation: lzo1y_999_compress_dict
Unexecuted instantiation: lzo1z_999_compress_dict
856
857
LZO_PUBLIC(int)
858
lzo1x_999_compress  ( const lzo_bytep in , lzo_uint  in_len,
859
                            lzo_bytep out, lzo_uintp out_len,
860
                            lzo_voidp wrkmem )
861
4.46k
{
862
4.46k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
4.46k
}
lzo1x_999_compress
Line
Count
Source
861
1.39k
{
862
1.39k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.39k
}
lzo1y_999_compress
Line
Count
Source
861
1.41k
{
862
1.41k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.41k
}
lzo1z_999_compress
Line
Count
Source
861
1.65k
{
862
1.65k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.65k
}
865
866
867
/* vim:set ts=4 sw=4 et: */