Coverage Report

Created: 2026-06-14 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/lzo-2.10/src/lzo1x_9x.c
Line
Count
Source
1
/* lzo1x_9x.c -- implementation of the LZO1X-999 compression algorithm
2
3
   This file is part of the LZO real-time data compression library.
4
5
   Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer
6
   All Rights Reserved.
7
8
   The LZO library is free software; you can redistribute it and/or
9
   modify it under the terms of the GNU General Public License as
10
   published by the Free Software Foundation; either version 2 of
11
   the License, or (at your option) any later version.
12
13
   The LZO library is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with the LZO library; see the file COPYING.
20
   If not, write to the Free Software Foundation, Inc.,
21
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
23
   Markus F.X.J. Oberhumer
24
   <markus@oberhumer.com>
25
   http://www.oberhumer.com/opensource/lzo/
26
 */
27
28
29
#if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z)
30
#  define LZO1X 1
31
#endif
32
33
#if defined(LZO1X)
34
#  include "config1x.h"
35
#elif defined(LZO1Y)
36
#  include "config1y.h"
37
#elif defined(LZO1Z)
38
#  include "config1z.h"
39
#else
40
#  error
41
#endif
42
43
44
/***********************************************************************
45
//
46
************************************************************************/
47
48
4.40k
#define SWD_N           M4_MAX_OFFSET   /* size of ring buffer */
49
39.5M
#define SWD_THRESHOLD       1           /* lower limit for match length */
50
22.0k
#define SWD_F            2048           /* upper limit for match length */
51
52
1.38G
#define SWD_BEST_OFF    (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1)
53
54
#if defined(LZO1X)
55
2.67k
#  define LZO_COMPRESS_T                lzo1x_999_t
56
1.33k
#  define lzo_swd_t                     lzo1x_999_swd_t
57
#elif defined(LZO1Y)
58
2.81k
#  define LZO_COMPRESS_T                lzo1y_999_t
59
1.40k
#  define lzo_swd_t                     lzo1y_999_swd_t
60
1.40k
#  define lzo1x_999_compress_internal   lzo1y_999_compress_internal
61
#  define lzo1x_999_compress_dict       lzo1y_999_compress_dict
62
1.40k
#  define lzo1x_999_compress_level      lzo1y_999_compress_level
63
#  define lzo1x_999_compress            lzo1y_999_compress
64
#elif defined(LZO1Z)
65
3.32k
#  define LZO_COMPRESS_T                lzo1z_999_t
66
1.66k
#  define lzo_swd_t                     lzo1z_999_swd_t
67
1.66k
#  define lzo1x_999_compress_internal   lzo1z_999_compress_internal
68
#  define lzo1x_999_compress_dict       lzo1z_999_compress_dict
69
1.66k
#  define lzo1x_999_compress_level      lzo1z_999_compress_level
70
#  define lzo1x_999_compress            lzo1z_999_compress
71
#else
72
#  error
73
#endif
74
75
#if 0
76
#  define HEAD3(b,p) \
77
    ((((((lzo_xint)b[p]<<3)^b[p+1])<<3)^b[p+2]) & (SWD_HSIZE-1))
78
#endif
79
#if 0 && (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN)
80
#  define HEAD3(b,p) \
81
    (((* (lzo_uint32_tp) &b[p]) ^ ((* (lzo_uint32_tp) &b[p])>>10)) & (SWD_HSIZE-1))
82
#endif
83
84
#include "lzo_mchw.ch"
85
86
87
/* this is a public functions, but there is no prototype in a header file */
88
LZO_EXTERN(int)
89
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
90
                                    lzo_bytep out, lzo_uintp out_len,
91
                                    lzo_voidp wrkmem,
92
                              const lzo_bytep dict, lzo_uint dict_len,
93
                                    lzo_callback_p cb,
94
                                    int try_lazy_parm,
95
                                    lzo_uint good_length,
96
                                    lzo_uint max_lazy,
97
                                    lzo_uint nice_length,
98
                                    lzo_uint max_chain,
99
                                    lzo_uint32_t flags );
100
101
102
/***********************************************************************
103
//
104
************************************************************************/
105
106
static lzo_bytep
107
code_match ( LZO_COMPRESS_T *c, lzo_bytep op, lzo_uint m_len, lzo_uint m_off )
108
2.46M
{
109
2.46M
    lzo_uint x_len = m_len;
110
2.46M
    lzo_uint x_off = m_off;
111
112
2.46M
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
2.46M
    assert(op > c->out);
143
2.46M
    if (m_len == 2)
144
948k
    {
145
948k
        assert(m_off <= M1_MAX_OFFSET);
146
948k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
948k
        m_off -= 1;
148
#if defined(LZO1Z)
149
408k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
408k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
540k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
540k
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
948k
        c->m1a_m++;
156
948k
    }
157
#if defined(LZO1Z)
158
531k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
986k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
514k
#endif
162
790k
    {
163
790k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
274k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
274k
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
240k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
240k
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
275k
        if (m_off == c->last_m_off)
176
12.7k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
263k
        else
178
263k
        {
179
263k
            m_off -= 1;
180
263k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
263k
            *op++ = LZO_BYTE(m_off << 2);
182
263k
        }
183
#endif
184
790k
        c->m2_m++;
185
790k
    }
186
728k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
10.0k
    {
188
10.0k
        assert(m_len == 3);
189
10.0k
        assert(m_off > M2_MAX_OFFSET);
190
10.0k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
3.15k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.15k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
6.87k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
6.87k
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
10.0k
        c->m1b_m++;
199
10.0k
    }
200
718k
    else if (m_off <= M3_MAX_OFFSET)
201
588k
    {
202
588k
        assert(m_len >= 3);
203
588k
        m_off -= 1;
204
588k
        if (m_len <= M3_MAX_LEN)
205
472k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
115k
        else
207
115k
        {
208
115k
            m_len -= M3_MAX_LEN;
209
115k
            *op++ = M3_MARKER | 0;
210
207k
            while (m_len > 255)
211
91.4k
            {
212
91.4k
                m_len -= 255;
213
91.4k
                *op++ = 0;
214
91.4k
            }
215
115k
            assert(m_len > 0);
216
115k
            *op++ = LZO_BYTE(m_len);
217
115k
        }
218
#if defined(LZO1Z)
219
209k
        *op++ = LZO_BYTE(m_off >> 6);
220
209k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
378k
        *op++ = LZO_BYTE(m_off << 2);
223
378k
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
588k
        c->m3_m++;
226
588k
    }
227
129k
    else
228
129k
    {
229
129k
        lzo_uint k;
230
231
129k
        assert(m_len >= 3);
232
129k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
129k
        m_off -= 0x4000;
234
129k
        k = (m_off & 0x4000) >> 11;
235
129k
        if (m_len <= M4_MAX_LEN)
236
86.5k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
43.2k
        else
238
43.2k
        {
239
43.2k
            m_len -= M4_MAX_LEN;
240
43.2k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
62.7k
            while (m_len > 255)
242
19.5k
            {
243
19.5k
                m_len -= 255;
244
19.5k
                *op++ = 0;
245
19.5k
            }
246
43.2k
            assert(m_len > 0);
247
43.2k
            *op++ = LZO_BYTE(m_len);
248
43.2k
        }
249
#if defined(LZO1Z)
250
43.0k
        *op++ = LZO_BYTE(m_off >> 6);
251
43.0k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
86.6k
        *op++ = LZO_BYTE(m_off << 2);
254
86.6k
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
129k
        c->m4_m++;
257
129k
    }
258
259
2.46M
    c->last_m_len = x_len;
260
2.46M
    c->last_m_off = x_off;
261
2.46M
    return op;
262
2.46M
}
lzo1x_9x.c:code_match
Line
Count
Source
108
767k
{
109
767k
    lzo_uint x_len = m_len;
110
767k
    lzo_uint x_off = m_off;
111
112
767k
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
767k
    assert(op > c->out);
143
767k
    if (m_len == 2)
144
257k
    {
145
257k
        assert(m_off <= M1_MAX_OFFSET);
146
257k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
257k
        m_off -= 1;
148
#if defined(LZO1Z)
149
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
257k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
257k
        *op++ = LZO_BYTE(m_off >> 2);
154
257k
#endif
155
257k
        c->m1a_m++;
156
257k
    }
157
#if defined(LZO1Z)
158
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
510k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
274k
#endif
162
274k
    {
163
274k
        assert(m_len >= 3);
164
274k
#if defined(LZO1X)
165
274k
        m_off -= 1;
166
274k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
274k
        *op++ = LZO_BYTE(m_off >> 3);
168
274k
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
        if (m_off == c->last_m_off)
176
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
        else
178
        {
179
            m_off -= 1;
180
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
            *op++ = LZO_BYTE(m_off << 2);
182
        }
183
#endif
184
274k
        c->m2_m++;
185
274k
    }
186
236k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
2.97k
    {
188
2.97k
        assert(m_len == 3);
189
2.97k
        assert(m_off > M2_MAX_OFFSET);
190
2.97k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
2.97k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
2.97k
        *op++ = LZO_BYTE(m_off >> 2);
197
2.97k
#endif
198
2.97k
        c->m1b_m++;
199
2.97k
    }
200
233k
    else if (m_off <= M3_MAX_OFFSET)
201
194k
    {
202
194k
        assert(m_len >= 3);
203
194k
        m_off -= 1;
204
194k
        if (m_len <= M3_MAX_LEN)
205
158k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
35.6k
        else
207
35.6k
        {
208
35.6k
            m_len -= M3_MAX_LEN;
209
35.6k
            *op++ = M3_MARKER | 0;
210
60.0k
            while (m_len > 255)
211
24.3k
            {
212
24.3k
                m_len -= 255;
213
24.3k
                *op++ = 0;
214
24.3k
            }
215
35.6k
            assert(m_len > 0);
216
35.6k
            *op++ = LZO_BYTE(m_len);
217
35.6k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
194k
        *op++ = LZO_BYTE(m_off << 2);
223
194k
        *op++ = LZO_BYTE(m_off >> 6);
224
194k
#endif
225
194k
        c->m3_m++;
226
194k
    }
227
38.5k
    else
228
38.5k
    {
229
38.5k
        lzo_uint k;
230
231
38.5k
        assert(m_len >= 3);
232
38.5k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
38.5k
        m_off -= 0x4000;
234
38.5k
        k = (m_off & 0x4000) >> 11;
235
38.5k
        if (m_len <= M4_MAX_LEN)
236
23.5k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
14.9k
        else
238
14.9k
        {
239
14.9k
            m_len -= M4_MAX_LEN;
240
14.9k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
20.5k
            while (m_len > 255)
242
5.53k
            {
243
5.53k
                m_len -= 255;
244
5.53k
                *op++ = 0;
245
5.53k
            }
246
14.9k
            assert(m_len > 0);
247
14.9k
            *op++ = LZO_BYTE(m_len);
248
14.9k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
38.5k
        *op++ = LZO_BYTE(m_off << 2);
254
38.5k
        *op++ = LZO_BYTE(m_off >> 6);
255
38.5k
#endif
256
38.5k
        c->m4_m++;
257
38.5k
    }
258
259
767k
    c->last_m_len = x_len;
260
767k
    c->last_m_off = x_off;
261
767k
    return op;
262
767k
}
lzo1y_9x.c:code_match
Line
Count
Source
108
759k
{
109
759k
    lzo_uint x_len = m_len;
110
759k
    lzo_uint x_off = m_off;
111
112
759k
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
759k
    assert(op > c->out);
143
759k
    if (m_len == 2)
144
282k
    {
145
282k
        assert(m_off <= M1_MAX_OFFSET);
146
282k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
282k
        m_off -= 1;
148
#if defined(LZO1Z)
149
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
282k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
282k
        *op++ = LZO_BYTE(m_off >> 2);
154
282k
#endif
155
282k
        c->m1a_m++;
156
282k
    }
157
#if defined(LZO1Z)
158
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
476k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
240k
#endif
162
240k
    {
163
240k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
240k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
240k
        *op++ = LZO_BYTE(m_off >> 2);
173
240k
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
        if (m_off == c->last_m_off)
176
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
        else
178
        {
179
            m_off -= 1;
180
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
            *op++ = LZO_BYTE(m_off << 2);
182
        }
183
#endif
184
240k
        c->m2_m++;
185
240k
    }
186
236k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.90k
    {
188
3.90k
        assert(m_len == 3);
189
3.90k
        assert(m_off > M2_MAX_OFFSET);
190
3.90k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
3.90k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
3.90k
        *op++ = LZO_BYTE(m_off >> 2);
197
3.90k
#endif
198
3.90k
        c->m1b_m++;
199
3.90k
    }
200
232k
    else if (m_off <= M3_MAX_OFFSET)
201
184k
    {
202
184k
        assert(m_len >= 3);
203
184k
        m_off -= 1;
204
184k
        if (m_len <= M3_MAX_LEN)
205
145k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
38.3k
        else
207
38.3k
        {
208
38.3k
            m_len -= M3_MAX_LEN;
209
38.3k
            *op++ = M3_MARKER | 0;
210
67.5k
            while (m_len > 255)
211
29.1k
            {
212
29.1k
                m_len -= 255;
213
29.1k
                *op++ = 0;
214
29.1k
            }
215
38.3k
            assert(m_len > 0);
216
38.3k
            *op++ = LZO_BYTE(m_len);
217
38.3k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
184k
        *op++ = LZO_BYTE(m_off << 2);
223
184k
        *op++ = LZO_BYTE(m_off >> 6);
224
184k
#endif
225
184k
        c->m3_m++;
226
184k
    }
227
48.1k
    else
228
48.1k
    {
229
48.1k
        lzo_uint k;
230
231
48.1k
        assert(m_len >= 3);
232
48.1k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
48.1k
        m_off -= 0x4000;
234
48.1k
        k = (m_off & 0x4000) >> 11;
235
48.1k
        if (m_len <= M4_MAX_LEN)
236
35.2k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
12.8k
        else
238
12.8k
        {
239
12.8k
            m_len -= M4_MAX_LEN;
240
12.8k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
19.2k
            while (m_len > 255)
242
6.37k
            {
243
6.37k
                m_len -= 255;
244
6.37k
                *op++ = 0;
245
6.37k
            }
246
12.8k
            assert(m_len > 0);
247
12.8k
            *op++ = LZO_BYTE(m_len);
248
12.8k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
48.1k
        *op++ = LZO_BYTE(m_off << 2);
254
48.1k
        *op++ = LZO_BYTE(m_off >> 6);
255
48.1k
#endif
256
48.1k
        c->m4_m++;
257
48.1k
    }
258
259
759k
    c->last_m_len = x_len;
260
759k
    c->last_m_off = x_off;
261
759k
    return op;
262
759k
}
lzo1z_9x.c:code_match
Line
Count
Source
108
940k
{
109
940k
    lzo_uint x_len = m_len;
110
940k
    lzo_uint x_off = m_off;
111
112
940k
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
940k
    assert(op > c->out);
143
940k
    if (m_len == 2)
144
408k
    {
145
408k
        assert(m_off <= M1_MAX_OFFSET);
146
408k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
408k
        m_off -= 1;
148
408k
#if defined(LZO1Z)
149
408k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
408k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
408k
        c->m1a_m++;
156
408k
    }
157
531k
#if defined(LZO1Z)
158
531k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
#endif
162
275k
    {
163
275k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
275k
        if (m_off == c->last_m_off)
176
12.7k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
263k
        else
178
263k
        {
179
263k
            m_off -= 1;
180
263k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
263k
            *op++ = LZO_BYTE(m_off << 2);
182
263k
        }
183
275k
#endif
184
275k
        c->m2_m++;
185
275k
    }
186
255k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.15k
    {
188
3.15k
        assert(m_len == 3);
189
3.15k
        assert(m_off > M2_MAX_OFFSET);
190
3.15k
        m_off -= 1 + M2_MAX_OFFSET;
191
3.15k
#if defined(LZO1Z)
192
3.15k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
3.15k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
3.15k
        c->m1b_m++;
199
3.15k
    }
200
252k
    else if (m_off <= M3_MAX_OFFSET)
201
209k
    {
202
209k
        assert(m_len >= 3);
203
209k
        m_off -= 1;
204
209k
        if (m_len <= M3_MAX_LEN)
205
167k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
41.9k
        else
207
41.9k
        {
208
41.9k
            m_len -= M3_MAX_LEN;
209
41.9k
            *op++ = M3_MARKER | 0;
210
79.8k
            while (m_len > 255)
211
37.9k
            {
212
37.9k
                m_len -= 255;
213
37.9k
                *op++ = 0;
214
37.9k
            }
215
41.9k
            assert(m_len > 0);
216
41.9k
            *op++ = LZO_BYTE(m_len);
217
41.9k
        }
218
209k
#if defined(LZO1Z)
219
209k
        *op++ = LZO_BYTE(m_off >> 6);
220
209k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
        *op++ = LZO_BYTE(m_off << 2);
223
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
209k
        c->m3_m++;
226
209k
    }
227
43.0k
    else
228
43.0k
    {
229
43.0k
        lzo_uint k;
230
231
43.0k
        assert(m_len >= 3);
232
43.0k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
43.0k
        m_off -= 0x4000;
234
43.0k
        k = (m_off & 0x4000) >> 11;
235
43.0k
        if (m_len <= M4_MAX_LEN)
236
27.7k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
15.3k
        else
238
15.3k
        {
239
15.3k
            m_len -= M4_MAX_LEN;
240
15.3k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
22.9k
            while (m_len > 255)
242
7.59k
            {
243
7.59k
                m_len -= 255;
244
7.59k
                *op++ = 0;
245
7.59k
            }
246
15.3k
            assert(m_len > 0);
247
15.3k
            *op++ = LZO_BYTE(m_len);
248
15.3k
        }
249
43.0k
#if defined(LZO1Z)
250
43.0k
        *op++ = LZO_BYTE(m_off >> 6);
251
43.0k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
        *op++ = LZO_BYTE(m_off << 2);
254
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
43.0k
        c->m4_m++;
257
43.0k
    }
258
259
940k
    c->last_m_len = x_len;
260
940k
    c->last_m_off = x_off;
261
940k
    return op;
262
940k
}
263
264
265
static lzo_bytep
266
STORE_RUN ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, lzo_uint t )
267
1.89M
{
268
1.89M
    c->lit_bytes += t;
269
270
1.89M
    if (op == c->out && t <= 238)
271
4.28k
    {
272
4.28k
        *op++ = LZO_BYTE(17 + t);
273
4.28k
    }
274
1.89M
    else if (t <= 3)
275
1.72M
    {
276
#if defined(LZO1Z)
277
686k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
1.04M
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
1.72M
        c->lit1_r++;
282
1.72M
    }
283
168k
    else if (t <= 18)
284
104k
    {
285
104k
        *op++ = LZO_BYTE(t - 3);
286
104k
        c->lit2_r++;
287
104k
    }
288
64.3k
    else
289
64.3k
    {
290
64.3k
        lzo_uint tt = t - 18;
291
292
64.3k
        *op++ = 0;
293
167k
        while (tt > 255)
294
102k
        {
295
102k
            tt -= 255;
296
102k
            *op++ = 0;
297
102k
        }
298
64.3k
        assert(tt > 0);
299
64.3k
        *op++ = LZO_BYTE(tt);
300
64.3k
        c->lit3_r++;
301
64.3k
    }
302
34.0M
    do *op++ = *ii++; while (--t > 0);
303
304
1.89M
    return op;
305
1.89M
}
lzo1x_9x.c:STORE_RUN
Line
Count
Source
267
568k
{
268
568k
    c->lit_bytes += t;
269
270
568k
    if (op == c->out && t <= 238)
271
1.31k
    {
272
1.31k
        *op++ = LZO_BYTE(17 + t);
273
1.31k
    }
274
566k
    else if (t <= 3)
275
506k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
506k
        op[-2] = LZO_BYTE(op[-2] | t);
280
506k
#endif
281
506k
        c->lit1_r++;
282
506k
    }
283
60.3k
    else if (t <= 18)
284
35.8k
    {
285
35.8k
        *op++ = LZO_BYTE(t - 3);
286
35.8k
        c->lit2_r++;
287
35.8k
    }
288
24.5k
    else
289
24.5k
    {
290
24.5k
        lzo_uint tt = t - 18;
291
292
24.5k
        *op++ = 0;
293
45.5k
        while (tt > 255)
294
20.9k
        {
295
20.9k
            tt -= 255;
296
20.9k
            *op++ = 0;
297
20.9k
        }
298
24.5k
        assert(tt > 0);
299
24.5k
        *op++ = LZO_BYTE(tt);
300
24.5k
        c->lit3_r++;
301
24.5k
    }
302
7.97M
    do *op++ = *ii++; while (--t > 0);
303
304
568k
    return op;
305
568k
}
lzo1y_9x.c:STORE_RUN
Line
Count
Source
267
585k
{
268
585k
    c->lit_bytes += t;
269
270
585k
    if (op == c->out && t <= 238)
271
1.36k
    {
272
1.36k
        *op++ = LZO_BYTE(17 + t);
273
1.36k
    }
274
583k
    else if (t <= 3)
275
533k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
533k
        op[-2] = LZO_BYTE(op[-2] | t);
280
533k
#endif
281
533k
        c->lit1_r++;
282
533k
    }
283
50.2k
    else if (t <= 18)
284
31.9k
    {
285
31.9k
        *op++ = LZO_BYTE(t - 3);
286
31.9k
        c->lit2_r++;
287
31.9k
    }
288
18.3k
    else
289
18.3k
    {
290
18.3k
        lzo_uint tt = t - 18;
291
292
18.3k
        *op++ = 0;
293
71.9k
        while (tt > 255)
294
53.6k
        {
295
53.6k
            tt -= 255;
296
53.6k
            *op++ = 0;
297
53.6k
        }
298
18.3k
        assert(tt > 0);
299
18.3k
        *op++ = LZO_BYTE(tt);
300
18.3k
        c->lit3_r++;
301
18.3k
    }
302
16.0M
    do *op++ = *ii++; while (--t > 0);
303
304
585k
    return op;
305
585k
}
lzo1z_9x.c:STORE_RUN
Line
Count
Source
267
746k
{
268
746k
    c->lit_bytes += t;
269
270
746k
    if (op == c->out && t <= 238)
271
1.60k
    {
272
1.60k
        *op++ = LZO_BYTE(17 + t);
273
1.60k
    }
274
744k
    else if (t <= 3)
275
686k
    {
276
686k
#if defined(LZO1Z)
277
686k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
686k
        c->lit1_r++;
282
686k
    }
283
58.1k
    else if (t <= 18)
284
36.6k
    {
285
36.6k
        *op++ = LZO_BYTE(t - 3);
286
36.6k
        c->lit2_r++;
287
36.6k
    }
288
21.4k
    else
289
21.4k
    {
290
21.4k
        lzo_uint tt = t - 18;
291
292
21.4k
        *op++ = 0;
293
49.6k
        while (tt > 255)
294
28.1k
        {
295
28.1k
            tt -= 255;
296
28.1k
            *op++ = 0;
297
28.1k
        }
298
21.4k
        assert(tt > 0);
299
21.4k
        *op++ = LZO_BYTE(tt);
300
21.4k
        c->lit3_r++;
301
21.4k
    }
302
10.0M
    do *op++ = *ii++; while (--t > 0);
303
304
746k
    return op;
305
746k
}
306
307
308
static lzo_bytep
309
code_run ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii,
310
           lzo_uint lit, lzo_uint m_len )
311
2.46M
{
312
2.46M
    if (lit > 0)
313
1.89M
    {
314
1.89M
        assert(m_len >= 2);
315
1.89M
        op = STORE_RUN(c,op,ii,lit);
316
1.89M
        c->r1_m_len = m_len;
317
1.89M
        c->r1_lit = lit;
318
1.89M
    }
319
570k
    else
320
570k
    {
321
570k
        assert(m_len >= 3);
322
570k
        c->r1_m_len = 0;
323
570k
        c->r1_lit = 0;
324
570k
    }
325
326
2.46M
    return op;
327
2.46M
}
lzo1x_9x.c:code_run
Line
Count
Source
311
767k
{
312
767k
    if (lit > 0)
313
567k
    {
314
567k
        assert(m_len >= 2);
315
567k
        op = STORE_RUN(c,op,ii,lit);
316
567k
        c->r1_m_len = m_len;
317
567k
        c->r1_lit = lit;
318
567k
    }
319
199k
    else
320
199k
    {
321
199k
        assert(m_len >= 3);
322
199k
        c->r1_m_len = 0;
323
199k
        c->r1_lit = 0;
324
199k
    }
325
326
767k
    return op;
327
767k
}
lzo1y_9x.c:code_run
Line
Count
Source
311
759k
{
312
759k
    if (lit > 0)
313
584k
    {
314
584k
        assert(m_len >= 2);
315
584k
        op = STORE_RUN(c,op,ii,lit);
316
584k
        c->r1_m_len = m_len;
317
584k
        c->r1_lit = lit;
318
584k
    }
319
175k
    else
320
175k
    {
321
175k
        assert(m_len >= 3);
322
175k
        c->r1_m_len = 0;
323
175k
        c->r1_lit = 0;
324
175k
    }
325
326
759k
    return op;
327
759k
}
lzo1z_9x.c:code_run
Line
Count
Source
311
940k
{
312
940k
    if (lit > 0)
313
744k
    {
314
744k
        assert(m_len >= 2);
315
744k
        op = STORE_RUN(c,op,ii,lit);
316
744k
        c->r1_m_len = m_len;
317
744k
        c->r1_lit = lit;
318
744k
    }
319
195k
    else
320
195k
    {
321
195k
        assert(m_len >= 3);
322
195k
        c->r1_m_len = 0;
323
195k
        c->r1_lit = 0;
324
195k
    }
325
326
940k
    return op;
327
940k
}
328
329
330
/***********************************************************************
331
//
332
************************************************************************/
333
334
static lzo_uint
335
len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit )
336
5.49M
{
337
5.49M
    lzo_uint n = 4;
338
339
5.49M
    if (m_len < 2)
340
1.16M
        return 0;
341
4.32M
    if (m_len == 2)
342
1.66M
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
2.66M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
1.24M
        return 2;
345
1.42M
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
12.1k
        return 2;
347
1.40M
    if (m_off <= M3_MAX_OFFSET)
348
1.13M
    {
349
1.13M
        if (m_len <= M3_MAX_LEN)
350
992k
            return 3;
351
139k
        m_len -= M3_MAX_LEN;
352
143k
        while (m_len > 255)
353
3.72k
        {
354
3.72k
            m_len -= 255;
355
3.72k
            n++;
356
3.72k
        }
357
139k
        return n;
358
1.13M
    }
359
277k
    if (m_off <= M4_MAX_OFFSET)
360
277k
    {
361
277k
        if (m_len <= M4_MAX_LEN)
362
200k
            return 3;
363
77.0k
        m_len -= M4_MAX_LEN;
364
78.9k
        while (m_len > 255)
365
1.96k
        {
366
1.96k
            m_len -= 255;
367
1.96k
            n++;
368
1.96k
        }
369
77.0k
        return n;
370
277k
    }
371
0
    return 0;
372
277k
}
lzo1x_9x.c:len_of_coded_match
Line
Count
Source
336
1.70M
{
337
1.70M
    lzo_uint n = 4;
338
339
1.70M
    if (m_len < 2)
340
357k
        return 0;
341
1.35M
    if (m_len == 2)
342
451k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
899k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
441k
        return 2;
345
458k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
3.56k
        return 2;
347
454k
    if (m_off <= M3_MAX_OFFSET)
348
371k
    {
349
371k
        if (m_len <= M3_MAX_LEN)
350
330k
            return 3;
351
41.4k
        m_len -= M3_MAX_LEN;
352
42.7k
        while (m_len > 255)
353
1.21k
        {
354
1.21k
            m_len -= 255;
355
1.21k
            n++;
356
1.21k
        }
357
41.4k
        return n;
358
371k
    }
359
82.6k
    if (m_off <= M4_MAX_OFFSET)
360
82.6k
    {
361
82.6k
        if (m_len <= M4_MAX_LEN)
362
55.7k
            return 3;
363
26.9k
        m_len -= M4_MAX_LEN;
364
27.5k
        while (m_len > 255)
365
660
        {
366
660
            m_len -= 255;
367
660
            n++;
368
660
        }
369
26.9k
        return n;
370
82.6k
    }
371
0
    return 0;
372
82.6k
}
lzo1y_9x.c:len_of_coded_match
Line
Count
Source
336
1.68M
{
337
1.68M
    lzo_uint n = 4;
338
339
1.68M
    if (m_len < 2)
340
349k
        return 0;
341
1.33M
    if (m_len == 2)
342
492k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
844k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
376k
        return 2;
345
467k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.70k
        return 2;
347
463k
    if (m_off <= M3_MAX_OFFSET)
348
365k
    {
349
365k
        if (m_len <= M3_MAX_LEN)
350
316k
            return 3;
351
48.7k
        m_len -= M3_MAX_LEN;
352
50.0k
        while (m_len > 255)
353
1.30k
        {
354
1.30k
            m_len -= 255;
355
1.30k
            n++;
356
1.30k
        }
357
48.7k
        return n;
358
365k
    }
359
97.7k
    if (m_off <= M4_MAX_OFFSET)
360
97.7k
    {
361
97.7k
        if (m_len <= M4_MAX_LEN)
362
74.9k
            return 3;
363
22.8k
        m_len -= M4_MAX_LEN;
364
23.4k
        while (m_len > 255)
365
643
        {
366
643
            m_len -= 255;
367
643
            n++;
368
643
        }
369
22.8k
        return n;
370
97.7k
    }
371
0
    return 0;
372
97.7k
}
lzo1z_9x.c:len_of_coded_match
Line
Count
Source
336
2.10M
{
337
2.10M
    lzo_uint n = 4;
338
339
2.10M
    if (m_len < 2)
340
462k
        return 0;
341
1.64M
    if (m_len == 2)
342
720k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
920k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
424k
        return 2;
345
495k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
3.84k
        return 2;
347
492k
    if (m_off <= M3_MAX_OFFSET)
348
395k
    {
349
395k
        if (m_len <= M3_MAX_LEN)
350
345k
            return 3;
351
49.5k
        m_len -= M3_MAX_LEN;
352
50.7k
        while (m_len > 255)
353
1.21k
        {
354
1.21k
            m_len -= 255;
355
1.21k
            n++;
356
1.21k
        }
357
49.5k
        return n;
358
395k
    }
359
96.8k
    if (m_off <= M4_MAX_OFFSET)
360
96.8k
    {
361
96.8k
        if (m_len <= M4_MAX_LEN)
362
69.5k
            return 3;
363
27.2k
        m_len -= M4_MAX_LEN;
364
27.9k
        while (m_len > 255)
365
663
        {
366
663
            m_len -= 255;
367
663
            n++;
368
663
        }
369
27.2k
        return n;
370
96.8k
    }
371
0
    return 0;
372
96.8k
}
373
374
375
static lzo_uint
376
min_gain(lzo_uint ahead, lzo_uint lit1, lzo_uint lit2, lzo_uint l1, lzo_uint l2, lzo_uint l3)
377
1.29M
{
378
1.29M
    lzo_uint lazy_match_min_gain;
379
380
1.29M
    assert (ahead >= 1);
381
1.29M
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
1.29M
    if (lit1 <= 3)
389
1.26M
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
28.7k
    else if (lit1 <= 18)
391
18.2k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
1.29M
    lazy_match_min_gain += (l2 - l1) * 2;
394
1.29M
    if (l3)
395
4.81k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
1.29M
    if ((lzo_int) lazy_match_min_gain < 0)
398
86.1k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
1.29M
    return lazy_match_min_gain;
407
1.29M
}
lzo1x_9x.c:min_gain
Line
Count
Source
377
394k
{
378
394k
    lzo_uint lazy_match_min_gain;
379
380
394k
    assert (ahead >= 1);
381
394k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
394k
    if (lit1 <= 3)
389
383k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
11.4k
    else if (lit1 <= 18)
391
6.81k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
394k
    lazy_match_min_gain += (l2 - l1) * 2;
394
394k
    if (l3)
395
1.78k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
394k
    if ((lzo_int) lazy_match_min_gain < 0)
398
26.6k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
394k
    return lazy_match_min_gain;
407
394k
}
lzo1y_9x.c:min_gain
Line
Count
Source
377
393k
{
378
393k
    lzo_uint lazy_match_min_gain;
379
380
393k
    assert (ahead >= 1);
381
393k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
393k
    if (lit1 <= 3)
389
384k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
8.58k
    else if (lit1 <= 18)
391
5.80k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
393k
    lazy_match_min_gain += (l2 - l1) * 2;
394
393k
    if (l3)
395
922
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
393k
    if ((lzo_int) lazy_match_min_gain < 0)
398
32.0k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
393k
    return lazy_match_min_gain;
407
393k
}
lzo1z_9x.c:min_gain
Line
Count
Source
377
507k
{
378
507k
    lzo_uint lazy_match_min_gain;
379
380
507k
    assert (ahead >= 1);
381
507k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
507k
    if (lit1 <= 3)
389
498k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
8.69k
    else if (lit1 <= 18)
391
5.66k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
507k
    lazy_match_min_gain += (l2 - l1) * 2;
394
507k
    if (l3)
395
2.10k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
507k
    if ((lzo_int) lazy_match_min_gain < 0)
398
27.4k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
507k
    return lazy_match_min_gain;
407
507k
}
408
409
410
/***********************************************************************
411
//
412
************************************************************************/
413
414
#if !defined(NDEBUG)
415
static
416
void assert_match( const lzo_swd_p swd, lzo_uint m_len, lzo_uint m_off )
417
{
418
    const LZO_COMPRESS_T *c = swd->c;
419
    lzo_uint d_off;
420
421
    assert(m_len >= 2);
422
    if (m_off <= (lzo_uint) (c->bp - c->in))
423
    {
424
        assert(c->bp - m_off + m_len < c->ip);
425
        assert(lzo_memcmp(c->bp, c->bp - m_off, m_len) == 0);
426
    }
427
    else
428
    {
429
        assert(swd->dict != NULL);
430
        d_off = m_off - (lzo_uint) (c->bp - c->in);
431
        assert(d_off <= swd->dict_len);
432
        if (m_len > d_off)
433
        {
434
            assert(lzo_memcmp(c->bp, swd->dict_end - d_off, d_off) == 0);
435
            assert(c->in + m_len - d_off < c->ip);
436
            assert(lzo_memcmp(c->bp + d_off, c->in, m_len - d_off) == 0);
437
        }
438
        else
439
        {
440
            assert(lzo_memcmp(c->bp, swd->dict_end - d_off, m_len) == 0);
441
        }
442
    }
443
}
444
#else
445
3.42M
#  define assert_match(a,b,c)   ((void)0)
446
#endif
447
448
449
#if defined(SWD_BEST_OFF)
450
451
static void
452
better_match ( const lzo_swd_p swd, lzo_uint *m_len, lzo_uint *m_off )
453
4.24M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
4.24M
    if (*m_len <= M2_MIN_LEN)
459
2.09M
        return;
460
#if defined(LZO1Z)
461
743k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.2k
        return;
463
733k
#if 1
464
733k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
487k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.30k
    {
467
1.30k
        *m_len = *m_len - 1;
468
1.30k
        *m_off = swd->best_off[*m_len];
469
1.30k
        return;
470
1.30k
    }
471
732k
#endif
472
732k
#endif
473
474
2.14M
    if (*m_off <= M2_MAX_OFFSET)
475
1.12M
        return;
476
477
1.02M
#if 1
478
    /* M3/M4 -> M2 */
479
1.02M
    if (*m_off > M2_MAX_OFFSET &&
480
1.02M
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
734k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
132k
    {
483
132k
        *m_len = *m_len - 1;
484
132k
        *m_off = swd->best_off[*m_len];
485
132k
        return;
486
132k
    }
487
888k
#endif
488
489
888k
#if 1
490
    /* M4 -> M2 */
491
888k
    if (*m_off > M3_MAX_OFFSET &&
492
253k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
34.2k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
4.18k
    {
495
4.18k
        *m_len = *m_len - 2;
496
4.18k
        *m_off = swd->best_off[*m_len];
497
4.18k
        return;
498
4.18k
    }
499
884k
#endif
500
501
884k
#if 1
502
    /* M4 -> M3 */
503
884k
    if (*m_off > M3_MAX_OFFSET &&
504
249k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
73.7k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
11.1k
    {
507
11.1k
        *m_len = *m_len - 1;
508
11.1k
        *m_off = swd->best_off[*m_len];
509
11.1k
    }
510
884k
#endif
511
884k
}
lzo1x_9x.c:better_match
Line
Count
Source
453
1.32M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.32M
    if (*m_len <= M2_MIN_LEN)
459
585k
        return;
460
#if defined(LZO1Z)
461
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
        return;
463
#if 1
464
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
    {
467
        *m_len = *m_len - 1;
468
        *m_off = swd->best_off[*m_len];
469
        return;
470
    }
471
#endif
472
#endif
473
474
741k
    if (*m_off <= M2_MAX_OFFSET)
475
414k
        return;
476
477
327k
#if 1
478
    /* M3/M4 -> M2 */
479
327k
    if (*m_off > M2_MAX_OFFSET &&
480
327k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
204k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
47.5k
    {
483
47.5k
        *m_len = *m_len - 1;
484
47.5k
        *m_off = swd->best_off[*m_len];
485
47.5k
        return;
486
47.5k
    }
487
279k
#endif
488
489
279k
#if 1
490
    /* M4 -> M2 */
491
279k
    if (*m_off > M3_MAX_OFFSET &&
492
80.3k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
7.26k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.14k
    {
495
1.14k
        *m_len = *m_len - 2;
496
1.14k
        *m_off = swd->best_off[*m_len];
497
1.14k
        return;
498
1.14k
    }
499
278k
#endif
500
501
278k
#if 1
502
    /* M4 -> M3 */
503
278k
    if (*m_off > M3_MAX_OFFSET &&
504
79.1k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
26.3k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.09k
    {
507
4.09k
        *m_len = *m_len - 1;
508
4.09k
        *m_off = swd->best_off[*m_len];
509
4.09k
    }
510
278k
#endif
511
278k
}
lzo1y_9x.c:better_match
Line
Count
Source
453
1.30M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.30M
    if (*m_len <= M2_MIN_LEN)
459
637k
        return;
460
#if defined(LZO1Z)
461
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
        return;
463
#if 1
464
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
    {
467
        *m_len = *m_len - 1;
468
        *m_off = swd->best_off[*m_len];
469
        return;
470
    }
471
#endif
472
#endif
473
474
669k
    if (*m_off <= M2_MAX_OFFSET)
475
308k
        return;
476
477
360k
#if 1
478
    /* M3/M4 -> M2 */
479
360k
    if (*m_off > M2_MAX_OFFSET &&
480
360k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
315k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
43.2k
    {
483
43.2k
        *m_len = *m_len - 1;
484
43.2k
        *m_off = swd->best_off[*m_len];
485
43.2k
        return;
486
43.2k
    }
487
316k
#endif
488
489
316k
#if 1
490
    /* M4 -> M2 */
491
316k
    if (*m_off > M3_MAX_OFFSET &&
492
82.7k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
19.2k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.68k
    {
495
1.68k
        *m_len = *m_len - 2;
496
1.68k
        *m_off = swd->best_off[*m_len];
497
1.68k
        return;
498
1.68k
    }
499
315k
#endif
500
501
315k
#if 1
502
    /* M4 -> M3 */
503
315k
    if (*m_off > M3_MAX_OFFSET &&
504
81.0k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
21.5k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
3.00k
    {
507
3.00k
        *m_len = *m_len - 1;
508
3.00k
        *m_off = swd->best_off[*m_len];
509
3.00k
    }
510
315k
#endif
511
315k
}
lzo1z_9x.c:better_match
Line
Count
Source
453
1.61M
{
454
1.61M
#if defined(LZO1Z)
455
1.61M
    const LZO_COMPRESS_T *c = swd->c;
456
1.61M
#endif
457
458
1.61M
    if (*m_len <= M2_MIN_LEN)
459
869k
        return;
460
743k
#if defined(LZO1Z)
461
743k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.2k
        return;
463
733k
#if 1
464
733k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
487k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.30k
    {
467
1.30k
        *m_len = *m_len - 1;
468
1.30k
        *m_off = swd->best_off[*m_len];
469
1.30k
        return;
470
1.30k
    }
471
732k
#endif
472
732k
#endif
473
474
732k
    if (*m_off <= M2_MAX_OFFSET)
475
397k
        return;
476
477
334k
#if 1
478
    /* M3/M4 -> M2 */
479
334k
    if (*m_off > M2_MAX_OFFSET &&
480
334k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
214k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
42.0k
    {
483
42.0k
        *m_len = *m_len - 1;
484
42.0k
        *m_off = swd->best_off[*m_len];
485
42.0k
        return;
486
42.0k
    }
487
292k
#endif
488
489
292k
#if 1
490
    /* M4 -> M2 */
491
292k
    if (*m_off > M3_MAX_OFFSET &&
492
90.3k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
7.70k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.36k
    {
495
1.36k
        *m_len = *m_len - 2;
496
1.36k
        *m_off = swd->best_off[*m_len];
497
1.36k
        return;
498
1.36k
    }
499
290k
#endif
500
501
290k
#if 1
502
    /* M4 -> M3 */
503
290k
    if (*m_off > M3_MAX_OFFSET &&
504
88.9k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
25.9k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
4.03k
    {
507
4.03k
        *m_len = *m_len - 1;
508
4.03k
        *m_off = swd->best_off[*m_len];
509
4.03k
    }
510
290k
#endif
511
290k
}
512
513
#endif
514
515
516
/***********************************************************************
517
//
518
************************************************************************/
519
520
LZO_PUBLIC(int)
521
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
522
                                    lzo_bytep out, lzo_uintp out_len,
523
                                    lzo_voidp wrkmem,
524
                              const lzo_bytep dict, lzo_uint dict_len,
525
                                    lzo_callback_p cb,
526
                                    int try_lazy_parm,
527
                                    lzo_uint good_length,
528
                                    lzo_uint max_lazy,
529
                                    lzo_uint nice_length,
530
                                    lzo_uint max_chain,
531
                                    lzo_uint32_t flags )
532
4.40k
{
533
4.40k
    lzo_bytep op;
534
4.40k
    const lzo_bytep ii;
535
4.40k
    lzo_uint lit;
536
4.40k
    lzo_uint m_len, m_off;
537
4.40k
    LZO_COMPRESS_T cc;
538
4.40k
    LZO_COMPRESS_T * const c = &cc;
539
4.40k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
4.40k
    lzo_uint try_lazy;
541
4.40k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
1.33k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.40k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.66k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
4.40k
    try_lazy = (lzo_uint) try_lazy_parm;
557
4.40k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
4.40k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
4.40k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
4.40k
    if (nice_length == 0)
567
4.40k
        nice_length = 0;
568
    /* don't search more positions than this */
569
4.40k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
4.40k
    c->init = 0;
573
4.40k
    c->ip = c->in = in;
574
4.40k
    c->in_end = in + in_len;
575
4.40k
    c->out = out;
576
4.40k
    c->cb = cb;
577
4.40k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
4.40k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
4.40k
    op = out;
581
4.40k
    ii = c->ip;             /* point to start of literal run */
582
4.40k
    lit = 0;
583
4.40k
    c->r1_lit = c->r1_m_len = 0;
584
585
4.40k
    r = init_match(c,swd,dict,dict_len,flags);
586
4.40k
    if (r != 0)
587
0
        return r;
588
4.40k
    if (max_chain > 0)
589
4.40k
        swd->max_chain = max_chain;
590
4.40k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
4.40k
    r = find_match(c,swd,0,0);
594
4.40k
    if (r != 0)
595
0
        return r;
596
36.4M
    while (c->look > 0)
597
36.4M
    {
598
36.4M
        lzo_uint ahead;
599
36.4M
        lzo_uint max_ahead;
600
36.4M
        lzo_uint l1, l2, l3;
601
602
36.4M
        c->codesize = pd(op, out);
603
604
36.4M
        m_len = c->m_len;
605
36.4M
        m_off = c->m_off;
606
607
36.4M
        assert(c->bp == c->ip - c->look);
608
36.4M
        assert(c->bp >= in);
609
36.4M
        if (lit == 0)
610
2.47M
            ii = c->bp;
611
36.4M
        assert(ii + lit == c->bp);
612
36.4M
        assert(swd->b_char == *(c->bp));
613
614
36.4M
        if ( m_len < 2 ||
615
17.9M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
3.04M
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
3.04M
            (m_len == 2 && op == out) ||
622
3.04M
#endif
623
3.04M
            (op == out && lit == 0))
624
33.3M
        {
625
            /* a literal */
626
33.3M
            m_len = 0;
627
33.3M
        }
628
3.04M
        else if (m_len == M2_MIN_LEN)
629
554k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
554k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
95.3k
                m_len = 0;
633
554k
        }
634
635
36.4M
        if (m_len == 0)
636
33.4M
        {
637
    /* a literal */
638
33.4M
            lit++;
639
33.4M
            swd->max_chain = max_chain;
640
33.4M
            r = find_match(c,swd,1,0);
641
33.4M
            assert(r == 0); LZO_UNUSED(r);
642
33.4M
            continue;
643
33.4M
        }
644
645
    /* a match */
646
2.94M
#if defined(SWD_BEST_OFF)
647
2.94M
        if (swd->use_best_off)
648
2.94M
            better_match(swd,&m_len,&m_off);
649
2.94M
#endif
650
2.94M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
2.94M
        ahead = 0;
655
2.94M
        if (try_lazy == 0 || m_len >= max_lazy)
656
45.6k
        {
657
            /* no */
658
45.6k
            l1 = 0;
659
45.6k
            max_ahead = 0;
660
45.6k
        }
661
2.90M
        else
662
2.90M
        {
663
            /* yes, try a lazy match */
664
2.90M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
2.90M
            assert(l1 > 0);
666
2.90M
#if 1
667
2.90M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
2.90M
        }
672
673
674
6.09M
        while (ahead < max_ahead && c->look > m_len)
675
3.63M
        {
676
3.63M
            lzo_uint lazy_match_min_gain;
677
678
3.63M
            if (m_len >= good_length)
679
195k
                swd->max_chain = max_chain >> 2;
680
3.43M
            else
681
3.43M
                swd->max_chain = max_chain;
682
3.63M
            r = find_match(c,swd,1,0);
683
3.63M
            ahead++;
684
685
3.63M
            assert(r == 0); LZO_UNUSED(r);
686
3.63M
            assert(c->look > 0);
687
3.63M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
1.34M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
358k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.50k
                    c->m_len = 0;
693
#endif
694
3.63M
            if (c->m_len < m_len)
695
2.07M
                continue;
696
1.56M
#if 1
697
1.56M
            if (c->m_len == m_len && c->m_off >= m_off)
698
262k
                continue;
699
1.30M
#endif
700
1.30M
#if defined(SWD_BEST_OFF)
701
1.30M
            if (swd->use_best_off)
702
1.30M
                better_match(swd,&c->m_len,&c->m_off);
703
1.30M
#endif
704
1.30M
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
1.30M
            if (l2 == 0)
706
6.33k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
1.29M
#if 1
714
            /* compressed-data compatibility [see above] */
715
1.29M
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
1.29M
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
1.29M
            if (c->m_len >= m_len + lazy_match_min_gain)
722
482k
            {
723
482k
                c->lazy++;
724
482k
                assert_match(swd,c->m_len,c->m_off);
725
726
482k
                if (l3)
727
2.82k
                {
728
                    /* code previous run */
729
2.82k
                    op = code_run(c,op,ii,lit,ahead);
730
2.82k
                    lit = 0;
731
                    /* code shortened match */
732
2.82k
                    op = code_match(c,op,ahead,m_off);
733
2.82k
                }
734
479k
                else
735
479k
                {
736
479k
                    lit += ahead;
737
479k
                    assert(ii + lit == c->bp);
738
479k
                }
739
482k
                goto lazy_match_done;
740
482k
            }
741
1.29M
        }
742
743
744
2.94M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
2.46M
        op = code_run(c,op,ii,lit,m_len);
748
2.46M
        lit = 0;
749
750
        /* 2 - code match */
751
2.46M
        op = code_match(c,op,m_len,m_off);
752
2.46M
        swd->max_chain = max_chain;
753
2.46M
        r = find_match(c,swd,m_len,1+ahead);
754
2.46M
        assert(r == 0); LZO_UNUSED(r);
755
756
2.94M
lazy_match_done: ;
757
2.94M
    }
758
759
760
    /* store final run */
761
4.40k
    if (lit > 0)
762
2.69k
        op = STORE_RUN(c,op,ii,lit);
763
764
4.40k
#if defined(LZO_EOF_CODE)
765
4.40k
    *op++ = M4_MARKER | 1;
766
4.40k
    *op++ = 0;
767
4.40k
    *op++ = 0;
768
4.40k
#endif
769
770
4.40k
    c->codesize = pd(op, out);
771
4.40k
    assert(c->textsize == in_len);
772
773
4.40k
    *out_len = pd(op, out);
774
775
4.40k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
4.40k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
4.40k
    return LZO_E_OK;
787
4.40k
}
lzo1x_999_compress_internal
Line
Count
Source
532
1.33k
{
533
1.33k
    lzo_bytep op;
534
1.33k
    const lzo_bytep ii;
535
1.33k
    lzo_uint lit;
536
1.33k
    lzo_uint m_len, m_off;
537
1.33k
    LZO_COMPRESS_T cc;
538
1.33k
    LZO_COMPRESS_T * const c = &cc;
539
1.33k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.33k
    lzo_uint try_lazy;
541
1.33k
    int r;
542
543
    /* sanity check */
544
1.33k
#if defined(LZO1X)
545
1.33k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.33k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.33k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.33k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.33k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.33k
    if (nice_length == 0)
567
1.33k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.33k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.33k
    c->init = 0;
573
1.33k
    c->ip = c->in = in;
574
1.33k
    c->in_end = in + in_len;
575
1.33k
    c->out = out;
576
1.33k
    c->cb = cb;
577
1.33k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.33k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.33k
    op = out;
581
1.33k
    ii = c->ip;             /* point to start of literal run */
582
1.33k
    lit = 0;
583
1.33k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.33k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.33k
    if (r != 0)
587
0
        return r;
588
1.33k
    if (max_chain > 0)
589
1.33k
        swd->max_chain = max_chain;
590
1.33k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.33k
    r = find_match(c,swd,0,0);
594
1.33k
    if (r != 0)
595
0
        return r;
596
8.72M
    while (c->look > 0)
597
8.71M
    {
598
8.71M
        lzo_uint ahead;
599
8.71M
        lzo_uint max_ahead;
600
8.71M
        lzo_uint l1, l2, l3;
601
602
8.71M
        c->codesize = pd(op, out);
603
604
8.71M
        m_len = c->m_len;
605
8.71M
        m_off = c->m_off;
606
607
8.71M
        assert(c->bp == c->ip - c->look);
608
8.71M
        assert(c->bp >= in);
609
8.71M
        if (lit == 0)
610
768k
            ii = c->bp;
611
8.71M
        assert(ii + lit == c->bp);
612
8.71M
        assert(swd->b_char == *(c->bp));
613
614
8.71M
        if ( m_len < 2 ||
615
4.08M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
953k
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
953k
            (m_len == 2 && op == out) ||
622
953k
#endif
623
953k
            (op == out && lit == 0))
624
7.76M
        {
625
            /* a literal */
626
7.76M
            m_len = 0;
627
7.76M
        }
628
953k
        else if (m_len == M2_MIN_LEN)
629
165k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
165k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
22.3k
                m_len = 0;
633
165k
        }
634
635
8.71M
        if (m_len == 0)
636
7.78M
        {
637
    /* a literal */
638
7.78M
            lit++;
639
7.78M
            swd->max_chain = max_chain;
640
7.78M
            r = find_match(c,swd,1,0);
641
7.78M
            assert(r == 0); LZO_UNUSED(r);
642
7.78M
            continue;
643
7.78M
        }
644
645
    /* a match */
646
931k
#if defined(SWD_BEST_OFF)
647
931k
        if (swd->use_best_off)
648
931k
            better_match(swd,&m_len,&m_off);
649
931k
#endif
650
931k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
931k
        ahead = 0;
655
931k
        if (try_lazy == 0 || m_len >= max_lazy)
656
14.2k
        {
657
            /* no */
658
14.2k
            l1 = 0;
659
14.2k
            max_ahead = 0;
660
14.2k
        }
661
916k
        else
662
916k
        {
663
            /* yes, try a lazy match */
664
916k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
916k
            assert(l1 > 0);
666
916k
#if 1
667
916k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
916k
        }
672
673
674
1.92M
        while (ahead < max_ahead && c->look > m_len)
675
1.15M
        {
676
1.15M
            lzo_uint lazy_match_min_gain;
677
678
1.15M
            if (m_len >= good_length)
679
60.3k
                swd->max_chain = max_chain >> 2;
680
1.09M
            else
681
1.09M
                swd->max_chain = max_chain;
682
1.15M
            r = find_match(c,swd,1,0);
683
1.15M
            ahead++;
684
685
1.15M
            assert(r == 0); LZO_UNUSED(r);
686
1.15M
            assert(c->look > 0);
687
1.15M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
                    c->m_len = 0;
693
#endif
694
1.15M
            if (c->m_len < m_len)
695
671k
                continue;
696
483k
#if 1
697
483k
            if (c->m_len == m_len && c->m_off >= m_off)
698
86.6k
                continue;
699
396k
#endif
700
396k
#if defined(SWD_BEST_OFF)
701
396k
            if (swd->use_best_off)
702
396k
                better_match(swd,&c->m_len,&c->m_off);
703
396k
#endif
704
396k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
396k
            if (l2 == 0)
706
1.63k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
394k
#if 1
714
            /* compressed-data compatibility [see above] */
715
394k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
394k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
394k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
164k
            {
723
164k
                c->lazy++;
724
164k
                assert_match(swd,c->m_len,c->m_off);
725
726
164k
                if (l3)
727
1.02k
                {
728
                    /* code previous run */
729
1.02k
                    op = code_run(c,op,ii,lit,ahead);
730
1.02k
                    lit = 0;
731
                    /* code shortened match */
732
1.02k
                    op = code_match(c,op,ahead,m_off);
733
1.02k
                }
734
163k
                else
735
163k
                {
736
163k
                    lit += ahead;
737
163k
                    assert(ii + lit == c->bp);
738
163k
                }
739
164k
                goto lazy_match_done;
740
164k
            }
741
394k
        }
742
743
744
931k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
766k
        op = code_run(c,op,ii,lit,m_len);
748
766k
        lit = 0;
749
750
        /* 2 - code match */
751
766k
        op = code_match(c,op,m_len,m_off);
752
766k
        swd->max_chain = max_chain;
753
766k
        r = find_match(c,swd,m_len,1+ahead);
754
766k
        assert(r == 0); LZO_UNUSED(r);
755
756
931k
lazy_match_done: ;
757
931k
    }
758
759
760
    /* store final run */
761
1.33k
    if (lit > 0)
762
776
        op = STORE_RUN(c,op,ii,lit);
763
764
1.33k
#if defined(LZO_EOF_CODE)
765
1.33k
    *op++ = M4_MARKER | 1;
766
1.33k
    *op++ = 0;
767
1.33k
    *op++ = 0;
768
1.33k
#endif
769
770
1.33k
    c->codesize = pd(op, out);
771
1.33k
    assert(c->textsize == in_len);
772
773
1.33k
    *out_len = pd(op, out);
774
775
1.33k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.33k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.33k
    return LZO_E_OK;
787
1.33k
}
lzo1y_999_compress_internal
Line
Count
Source
532
1.40k
{
533
1.40k
    lzo_bytep op;
534
1.40k
    const lzo_bytep ii;
535
1.40k
    lzo_uint lit;
536
1.40k
    lzo_uint m_len, m_off;
537
1.40k
    LZO_COMPRESS_T cc;
538
1.40k
    LZO_COMPRESS_T * const c = &cc;
539
1.40k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.40k
    lzo_uint try_lazy;
541
1.40k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.40k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.40k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.40k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.40k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.40k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.40k
    if (nice_length == 0)
567
1.40k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.40k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.40k
    c->init = 0;
573
1.40k
    c->ip = c->in = in;
574
1.40k
    c->in_end = in + in_len;
575
1.40k
    c->out = out;
576
1.40k
    c->cb = cb;
577
1.40k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.40k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.40k
    op = out;
581
1.40k
    ii = c->ip;             /* point to start of literal run */
582
1.40k
    lit = 0;
583
1.40k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.40k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.40k
    if (r != 0)
587
0
        return r;
588
1.40k
    if (max_chain > 0)
589
1.40k
        swd->max_chain = max_chain;
590
1.40k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.40k
    r = find_match(c,swd,0,0);
594
1.40k
    if (r != 0)
595
0
        return r;
596
16.7M
    while (c->look > 0)
597
16.7M
    {
598
16.7M
        lzo_uint ahead;
599
16.7M
        lzo_uint max_ahead;
600
16.7M
        lzo_uint l1, l2, l3;
601
602
16.7M
        c->codesize = pd(op, out);
603
604
16.7M
        m_len = c->m_len;
605
16.7M
        m_off = c->m_off;
606
607
16.7M
        assert(c->bp == c->ip - c->look);
608
16.7M
        assert(c->bp >= in);
609
16.7M
        if (lit == 0)
610
760k
            ii = c->bp;
611
16.7M
        assert(ii + lit == c->bp);
612
16.7M
        assert(swd->b_char == *(c->bp));
613
614
16.7M
        if ( m_len < 2 ||
615
8.49M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
958k
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
958k
            (m_len == 2 && op == out) ||
622
958k
#endif
623
958k
            (op == out && lit == 0))
624
15.8M
        {
625
            /* a literal */
626
15.8M
            m_len = 0;
627
15.8M
        }
628
958k
        else if (m_len == M2_MIN_LEN)
629
199k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
199k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
46.5k
                m_len = 0;
633
199k
        }
634
635
16.7M
        if (m_len == 0)
636
15.8M
        {
637
    /* a literal */
638
15.8M
            lit++;
639
15.8M
            swd->max_chain = max_chain;
640
15.8M
            r = find_match(c,swd,1,0);
641
15.8M
            assert(r == 0); LZO_UNUSED(r);
642
15.8M
            continue;
643
15.8M
        }
644
645
    /* a match */
646
911k
#if defined(SWD_BEST_OFF)
647
911k
        if (swd->use_best_off)
648
911k
            better_match(swd,&m_len,&m_off);
649
911k
#endif
650
911k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
911k
        ahead = 0;
655
911k
        if (try_lazy == 0 || m_len >= max_lazy)
656
14.2k
        {
657
            /* no */
658
14.2k
            l1 = 0;
659
14.2k
            max_ahead = 0;
660
14.2k
        }
661
897k
        else
662
897k
        {
663
            /* yes, try a lazy match */
664
897k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
897k
            assert(l1 > 0);
666
897k
#if 1
667
897k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
897k
        }
672
673
674
1.89M
        while (ahead < max_ahead && c->look > m_len)
675
1.13M
        {
676
1.13M
            lzo_uint lazy_match_min_gain;
677
678
1.13M
            if (m_len >= good_length)
679
65.4k
                swd->max_chain = max_chain >> 2;
680
1.07M
            else
681
1.07M
                swd->max_chain = max_chain;
682
1.13M
            r = find_match(c,swd,1,0);
683
1.13M
            ahead++;
684
685
1.13M
            assert(r == 0); LZO_UNUSED(r);
686
1.13M
            assert(c->look > 0);
687
1.13M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
                    c->m_len = 0;
693
#endif
694
1.13M
            if (c->m_len < m_len)
695
654k
                continue;
696
481k
#if 1
697
481k
            if (c->m_len == m_len && c->m_off >= m_off)
698
86.3k
                continue;
699
395k
#endif
700
395k
#if defined(SWD_BEST_OFF)
701
395k
            if (swd->use_best_off)
702
395k
                better_match(swd,&c->m_len,&c->m_off);
703
395k
#endif
704
395k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
395k
            if (l2 == 0)
706
2.22k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
393k
#if 1
714
            /* compressed-data compatibility [see above] */
715
393k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
393k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
393k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
152k
            {
723
152k
                c->lazy++;
724
152k
                assert_match(swd,c->m_len,c->m_off);
725
726
152k
                if (l3)
727
693
                {
728
                    /* code previous run */
729
693
                    op = code_run(c,op,ii,lit,ahead);
730
693
                    lit = 0;
731
                    /* code shortened match */
732
693
                    op = code_match(c,op,ahead,m_off);
733
693
                }
734
152k
                else
735
152k
                {
736
152k
                    lit += ahead;
737
152k
                    assert(ii + lit == c->bp);
738
152k
                }
739
152k
                goto lazy_match_done;
740
152k
            }
741
393k
        }
742
743
744
911k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
758k
        op = code_run(c,op,ii,lit,m_len);
748
758k
        lit = 0;
749
750
        /* 2 - code match */
751
758k
        op = code_match(c,op,m_len,m_off);
752
758k
        swd->max_chain = max_chain;
753
758k
        r = find_match(c,swd,m_len,1+ahead);
754
758k
        assert(r == 0); LZO_UNUSED(r);
755
756
911k
lazy_match_done: ;
757
911k
    }
758
759
760
    /* store final run */
761
1.40k
    if (lit > 0)
762
859
        op = STORE_RUN(c,op,ii,lit);
763
764
1.40k
#if defined(LZO_EOF_CODE)
765
1.40k
    *op++ = M4_MARKER | 1;
766
1.40k
    *op++ = 0;
767
1.40k
    *op++ = 0;
768
1.40k
#endif
769
770
1.40k
    c->codesize = pd(op, out);
771
1.40k
    assert(c->textsize == in_len);
772
773
1.40k
    *out_len = pd(op, out);
774
775
1.40k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.40k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.40k
    return LZO_E_OK;
787
1.40k
}
lzo1z_999_compress_internal
Line
Count
Source
532
1.66k
{
533
1.66k
    lzo_bytep op;
534
1.66k
    const lzo_bytep ii;
535
1.66k
    lzo_uint lit;
536
1.66k
    lzo_uint m_len, m_off;
537
1.66k
    LZO_COMPRESS_T cc;
538
1.66k
    LZO_COMPRESS_T * const c = &cc;
539
1.66k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.66k
    lzo_uint try_lazy;
541
1.66k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.66k
    LZO_COMPILE_TIME_ASSERT(LZO1Z_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
550
#else
551
#  error
552
#endif
553
554
/* setup parameter defaults */
555
    /* number of lazy match tries */
556
1.66k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.66k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.66k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.66k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.66k
    if (nice_length == 0)
567
1.66k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.66k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.66k
    c->init = 0;
573
1.66k
    c->ip = c->in = in;
574
1.66k
    c->in_end = in + in_len;
575
1.66k
    c->out = out;
576
1.66k
    c->cb = cb;
577
1.66k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.66k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.66k
    op = out;
581
1.66k
    ii = c->ip;             /* point to start of literal run */
582
1.66k
    lit = 0;
583
1.66k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.66k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.66k
    if (r != 0)
587
0
        return r;
588
1.66k
    if (max_chain > 0)
589
1.66k
        swd->max_chain = max_chain;
590
1.66k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.66k
    r = find_match(c,swd,0,0);
594
1.66k
    if (r != 0)
595
0
        return r;
596
10.9M
    while (c->look > 0)
597
10.9M
    {
598
10.9M
        lzo_uint ahead;
599
10.9M
        lzo_uint max_ahead;
600
10.9M
        lzo_uint l1, l2, l3;
601
602
10.9M
        c->codesize = pd(op, out);
603
604
10.9M
        m_len = c->m_len;
605
10.9M
        m_off = c->m_off;
606
607
10.9M
        assert(c->bp == c->ip - c->look);
608
10.9M
        assert(c->bp >= in);
609
10.9M
        if (lit == 0)
610
941k
            ii = c->bp;
611
10.9M
        assert(ii + lit == c->bp);
612
10.9M
        assert(swd->b_char == *(c->bp));
613
614
10.9M
        if ( m_len < 2 ||
615
5.38M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
1.13M
#if 1
617
            /* Do not accept this match for compressed-data compatibility
618
             * with LZO v1.01 and before
619
             * [ might be a problem for decompress() and optimize() ]
620
             */
621
1.13M
            (m_len == 2 && op == out) ||
622
1.13M
#endif
623
1.13M
            (op == out && lit == 0))
624
9.79M
        {
625
            /* a literal */
626
9.79M
            m_len = 0;
627
9.79M
        }
628
1.13M
        else if (m_len == M2_MIN_LEN)
629
189k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
189k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
26.4k
                m_len = 0;
633
189k
        }
634
635
10.9M
        if (m_len == 0)
636
9.82M
        {
637
    /* a literal */
638
9.82M
            lit++;
639
9.82M
            swd->max_chain = max_chain;
640
9.82M
            r = find_match(c,swd,1,0);
641
9.82M
            assert(r == 0); LZO_UNUSED(r);
642
9.82M
            continue;
643
9.82M
        }
644
645
    /* a match */
646
1.10M
#if defined(SWD_BEST_OFF)
647
1.10M
        if (swd->use_best_off)
648
1.10M
            better_match(swd,&m_len,&m_off);
649
1.10M
#endif
650
1.10M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
1.10M
        ahead = 0;
655
1.10M
        if (try_lazy == 0 || m_len >= max_lazy)
656
17.1k
        {
657
            /* no */
658
17.1k
            l1 = 0;
659
17.1k
            max_ahead = 0;
660
17.1k
        }
661
1.08M
        else
662
1.08M
        {
663
            /* yes, try a lazy match */
664
1.08M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
1.08M
            assert(l1 > 0);
666
1.08M
#if 1
667
1.08M
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
1.08M
        }
672
673
674
2.28M
        while (ahead < max_ahead && c->look > m_len)
675
1.34M
        {
676
1.34M
            lzo_uint lazy_match_min_gain;
677
678
1.34M
            if (m_len >= good_length)
679
69.6k
                swd->max_chain = max_chain >> 2;
680
1.27M
            else
681
1.27M
                swd->max_chain = max_chain;
682
1.34M
            r = find_match(c,swd,1,0);
683
1.34M
            ahead++;
684
685
1.34M
            assert(r == 0); LZO_UNUSED(r);
686
1.34M
            assert(c->look > 0);
687
1.34M
            assert(ii + lit + ahead == c->bp);
688
689
1.34M
#if defined(LZO1Z)
690
1.34M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
358k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
4.50k
                    c->m_len = 0;
693
1.34M
#endif
694
1.34M
            if (c->m_len < m_len)
695
744k
                continue;
696
599k
#if 1
697
599k
            if (c->m_len == m_len && c->m_off >= m_off)
698
89.2k
                continue;
699
509k
#endif
700
509k
#if defined(SWD_BEST_OFF)
701
509k
            if (swd->use_best_off)
702
509k
                better_match(swd,&c->m_len,&c->m_off);
703
509k
#endif
704
509k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
509k
            if (l2 == 0)
706
2.47k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
507k
#if 1
714
            /* compressed-data compatibility [see above] */
715
507k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
507k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
507k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
164k
            {
723
164k
                c->lazy++;
724
164k
                assert_match(swd,c->m_len,c->m_off);
725
726
164k
                if (l3)
727
1.11k
                {
728
                    /* code previous run */
729
1.11k
                    op = code_run(c,op,ii,lit,ahead);
730
1.11k
                    lit = 0;
731
                    /* code shortened match */
732
1.11k
                    op = code_match(c,op,ahead,m_off);
733
1.11k
                }
734
163k
                else
735
163k
                {
736
163k
                    lit += ahead;
737
163k
                    assert(ii + lit == c->bp);
738
163k
                }
739
164k
                goto lazy_match_done;
740
164k
            }
741
507k
        }
742
743
744
1.10M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
939k
        op = code_run(c,op,ii,lit,m_len);
748
939k
        lit = 0;
749
750
        /* 2 - code match */
751
939k
        op = code_match(c,op,m_len,m_off);
752
939k
        swd->max_chain = max_chain;
753
939k
        r = find_match(c,swd,m_len,1+ahead);
754
939k
        assert(r == 0); LZO_UNUSED(r);
755
756
1.10M
lazy_match_done: ;
757
1.10M
    }
758
759
760
    /* store final run */
761
1.66k
    if (lit > 0)
762
1.06k
        op = STORE_RUN(c,op,ii,lit);
763
764
1.66k
#if defined(LZO_EOF_CODE)
765
1.66k
    *op++ = M4_MARKER | 1;
766
1.66k
    *op++ = 0;
767
1.66k
    *op++ = 0;
768
1.66k
#endif
769
770
1.66k
    c->codesize = pd(op, out);
771
1.66k
    assert(c->textsize == in_len);
772
773
1.66k
    *out_len = pd(op, out);
774
775
1.66k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.66k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.66k
    return LZO_E_OK;
787
1.66k
}
788
789
790
/***********************************************************************
791
//
792
************************************************************************/
793
794
LZO_PUBLIC(int)
795
lzo1x_999_compress_level    ( const lzo_bytep in , lzo_uint  in_len,
796
                                    lzo_bytep out, lzo_uintp out_len,
797
                                    lzo_voidp wrkmem,
798
                              const lzo_bytep dict, lzo_uint dict_len,
799
                                    lzo_callback_p cb,
800
                                    int compression_level )
801
4.40k
{
802
4.40k
    static const struct
803
4.40k
    {
804
4.40k
        int try_lazy_parm;
805
4.40k
        lzo_uint good_length;
806
4.40k
        lzo_uint max_lazy;
807
4.40k
        lzo_uint nice_length;
808
4.40k
        lzo_uint max_chain;
809
4.40k
        lzo_uint32_t flags;
810
4.40k
    } c[9] = {
811
        /* faster compression */
812
4.40k
        {   0,     0,     0,     8,    4,   0 },
813
4.40k
        {   0,     0,     0,    16,    8,   0 },
814
4.40k
        {   0,     0,     0,    32,   16,   0 },
815
4.40k
        {   1,     4,     4,    16,   16,   0 },
816
4.40k
        {   1,     8,    16,    32,   32,   0 },
817
4.40k
        {   1,     8,    16,   128,  128,   0 },
818
4.40k
        {   2,     8,    32,   128,  256,   0 },
819
4.40k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
4.40k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
4.40k
    };
823
824
4.40k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
4.40k
    compression_level -= 1;
828
4.40k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
4.40k
                                       dict, dict_len, cb,
830
4.40k
                                       c[compression_level].try_lazy_parm,
831
4.40k
                                       c[compression_level].good_length,
832
4.40k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
4.40k
                                       0,
837
4.40k
#endif
838
4.40k
                                       c[compression_level].max_chain,
839
4.40k
                                       c[compression_level].flags);
840
4.40k
}
lzo1x_999_compress_level
Line
Count
Source
801
1.33k
{
802
1.33k
    static const struct
803
1.33k
    {
804
1.33k
        int try_lazy_parm;
805
1.33k
        lzo_uint good_length;
806
1.33k
        lzo_uint max_lazy;
807
1.33k
        lzo_uint nice_length;
808
1.33k
        lzo_uint max_chain;
809
1.33k
        lzo_uint32_t flags;
810
1.33k
    } c[9] = {
811
        /* faster compression */
812
1.33k
        {   0,     0,     0,     8,    4,   0 },
813
1.33k
        {   0,     0,     0,    16,    8,   0 },
814
1.33k
        {   0,     0,     0,    32,   16,   0 },
815
1.33k
        {   1,     4,     4,    16,   16,   0 },
816
1.33k
        {   1,     8,    16,    32,   32,   0 },
817
1.33k
        {   1,     8,    16,   128,  128,   0 },
818
1.33k
        {   2,     8,    32,   128,  256,   0 },
819
1.33k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.33k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.33k
    };
823
824
1.33k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.33k
    compression_level -= 1;
828
1.33k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.33k
                                       dict, dict_len, cb,
830
1.33k
                                       c[compression_level].try_lazy_parm,
831
1.33k
                                       c[compression_level].good_length,
832
1.33k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.33k
                                       0,
837
1.33k
#endif
838
1.33k
                                       c[compression_level].max_chain,
839
1.33k
                                       c[compression_level].flags);
840
1.33k
}
lzo1y_999_compress_level
Line
Count
Source
801
1.40k
{
802
1.40k
    static const struct
803
1.40k
    {
804
1.40k
        int try_lazy_parm;
805
1.40k
        lzo_uint good_length;
806
1.40k
        lzo_uint max_lazy;
807
1.40k
        lzo_uint nice_length;
808
1.40k
        lzo_uint max_chain;
809
1.40k
        lzo_uint32_t flags;
810
1.40k
    } c[9] = {
811
        /* faster compression */
812
1.40k
        {   0,     0,     0,     8,    4,   0 },
813
1.40k
        {   0,     0,     0,    16,    8,   0 },
814
1.40k
        {   0,     0,     0,    32,   16,   0 },
815
1.40k
        {   1,     4,     4,    16,   16,   0 },
816
1.40k
        {   1,     8,    16,    32,   32,   0 },
817
1.40k
        {   1,     8,    16,   128,  128,   0 },
818
1.40k
        {   2,     8,    32,   128,  256,   0 },
819
1.40k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.40k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.40k
    };
823
824
1.40k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.40k
    compression_level -= 1;
828
1.40k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.40k
                                       dict, dict_len, cb,
830
1.40k
                                       c[compression_level].try_lazy_parm,
831
1.40k
                                       c[compression_level].good_length,
832
1.40k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.40k
                                       0,
837
1.40k
#endif
838
1.40k
                                       c[compression_level].max_chain,
839
1.40k
                                       c[compression_level].flags);
840
1.40k
}
lzo1z_999_compress_level
Line
Count
Source
801
1.66k
{
802
1.66k
    static const struct
803
1.66k
    {
804
1.66k
        int try_lazy_parm;
805
1.66k
        lzo_uint good_length;
806
1.66k
        lzo_uint max_lazy;
807
1.66k
        lzo_uint nice_length;
808
1.66k
        lzo_uint max_chain;
809
1.66k
        lzo_uint32_t flags;
810
1.66k
    } c[9] = {
811
        /* faster compression */
812
1.66k
        {   0,     0,     0,     8,    4,   0 },
813
1.66k
        {   0,     0,     0,    16,    8,   0 },
814
1.66k
        {   0,     0,     0,    32,   16,   0 },
815
1.66k
        {   1,     4,     4,    16,   16,   0 },
816
1.66k
        {   1,     8,    16,    32,   32,   0 },
817
1.66k
        {   1,     8,    16,   128,  128,   0 },
818
1.66k
        {   2,     8,    32,   128,  256,   0 },
819
1.66k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.66k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.66k
    };
823
824
1.66k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.66k
    compression_level -= 1;
828
1.66k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.66k
                                       dict, dict_len, cb,
830
1.66k
                                       c[compression_level].try_lazy_parm,
831
1.66k
                                       c[compression_level].good_length,
832
1.66k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.66k
                                       0,
837
1.66k
#endif
838
1.66k
                                       c[compression_level].max_chain,
839
1.66k
                                       c[compression_level].flags);
840
1.66k
}
841
842
843
/***********************************************************************
844
//
845
************************************************************************/
846
847
LZO_PUBLIC(int)
848
lzo1x_999_compress_dict     ( const lzo_bytep in , lzo_uint  in_len,
849
                                    lzo_bytep out, lzo_uintp out_len,
850
                                    lzo_voidp wrkmem,
851
                              const lzo_bytep dict, lzo_uint dict_len )
852
0
{
853
0
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
854
0
                                    dict, dict_len, 0, 8);
855
0
}
Unexecuted instantiation: lzo1x_999_compress_dict
Unexecuted instantiation: lzo1y_999_compress_dict
Unexecuted instantiation: lzo1z_999_compress_dict
856
857
LZO_PUBLIC(int)
858
lzo1x_999_compress  ( const lzo_bytep in , lzo_uint  in_len,
859
                            lzo_bytep out, lzo_uintp out_len,
860
                            lzo_voidp wrkmem )
861
4.40k
{
862
4.40k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
4.40k
}
lzo1x_999_compress
Line
Count
Source
861
1.33k
{
862
1.33k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.33k
}
lzo1y_999_compress
Line
Count
Source
861
1.40k
{
862
1.40k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.40k
}
lzo1z_999_compress
Line
Count
Source
861
1.66k
{
862
1.66k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.66k
}
865
866
867
/* vim:set ts=4 sw=4 et: */