Coverage Report

Created: 2023-09-25 06:16

/src/lzo-2.10/src/lzo1x_9x.c
Line
Count
Source (jump to first uncovered line)
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
5.30k
#define SWD_N           M4_MAX_OFFSET   /* size of ring buffer */
49
54.9M
#define SWD_THRESHOLD       1           /* lower limit for match length */
50
26.5k
#define SWD_F            2048           /* upper limit for match length */
51
52
1.84G
#define SWD_BEST_OFF    (LZO_MAX3( M2_MAX_LEN, M3_MAX_LEN, M4_MAX_LEN ) + 1)
53
54
#if defined(LZO1X)
55
3.36k
#  define LZO_COMPRESS_T                lzo1x_999_t
56
1.68k
#  define lzo_swd_t                     lzo1x_999_swd_t
57
#elif defined(LZO1Y)
58
3.30k
#  define LZO_COMPRESS_T                lzo1y_999_t
59
1.65k
#  define lzo_swd_t                     lzo1y_999_swd_t
60
1.65k
#  define lzo1x_999_compress_internal   lzo1y_999_compress_internal
61
#  define lzo1x_999_compress_dict       lzo1y_999_compress_dict
62
1.65k
#  define lzo1x_999_compress_level      lzo1y_999_compress_level
63
#  define lzo1x_999_compress            lzo1y_999_compress
64
#elif defined(LZO1Z)
65
3.93k
#  define LZO_COMPRESS_T                lzo1z_999_t
66
1.96k
#  define lzo_swd_t                     lzo1z_999_swd_t
67
1.96k
#  define lzo1x_999_compress_internal   lzo1z_999_compress_internal
68
#  define lzo1x_999_compress_dict       lzo1z_999_compress_dict
69
1.96k
#  define lzo1x_999_compress_level      lzo1z_999_compress_level
70
#  define lzo1x_999_compress            lzo1z_999_compress
71
#else
72
#  error
73
#endif
74
75
#if 0
76
#  define HEAD3(b,p) \
77
    ((((((lzo_xint)b[p]<<3)^b[p+1])<<3)^b[p+2]) & (SWD_HSIZE-1))
78
#endif
79
#if 0 && (LZO_OPT_UNALIGNED32) && (LZO_ABI_LITTLE_ENDIAN)
80
#  define HEAD3(b,p) \
81
    (((* (lzo_uint32_tp) &b[p]) ^ ((* (lzo_uint32_tp) &b[p])>>10)) & (SWD_HSIZE-1))
82
#endif
83
84
#include "lzo_mchw.ch"
85
86
87
/* this is a public functions, but there is no prototype in a header file */
88
LZO_EXTERN(int)
89
lzo1x_999_compress_internal ( const lzo_bytep in , lzo_uint  in_len,
90
                                    lzo_bytep out, lzo_uintp out_len,
91
                                    lzo_voidp wrkmem,
92
                              const lzo_bytep dict, lzo_uint dict_len,
93
                                    lzo_callback_p cb,
94
                                    int try_lazy_parm,
95
                                    lzo_uint good_length,
96
                                    lzo_uint max_lazy,
97
                                    lzo_uint nice_length,
98
                                    lzo_uint max_chain,
99
                                    lzo_uint32_t flags );
100
101
102
/***********************************************************************
103
//
104
************************************************************************/
105
106
static lzo_bytep
107
code_match ( LZO_COMPRESS_T *c, lzo_bytep op, lzo_uint m_len, lzo_uint m_off )
108
2.38M
{
109
2.38M
    lzo_uint x_len = m_len;
110
2.38M
    lzo_uint x_off = m_off;
111
112
2.38M
    c->match_bytes += m_len;
113
114
#if 0
115
/*
116
    static lzo_uint last_m_len = 0, last_m_off = 0;
117
    static lzo_uint prev_m_off[4];
118
    static unsigned prev_m_off_ptr = 0;
119
    unsigned i;
120
121
    //if (m_len >= 3 && m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
122
    if (m_len >= 3 && m_len <= M2_MAX_LEN)
123
    {
124
    //if (m_len == last_m_len && m_off == last_m_off)
125
        //printf("last_m_len + last_m_off\n");
126
    //else
127
    if (m_off == last_m_off)
128
        printf("last_m_off\n");
129
    else
130
    {
131
        for (i = 0; i < 4; i++)
132
            if (m_off == prev_m_off[i])
133
                printf("prev_m_off %u: %5ld\n",i,(long)m_off);
134
    }
135
    }
136
    last_m_len = m_len;
137
    last_m_off = prev_m_off[prev_m_off_ptr] = m_off;
138
    prev_m_off_ptr = (prev_m_off_ptr + 1) & 3;
139
*/
140
#endif
141
142
2.38M
    assert(op > c->out);
143
2.38M
    if (m_len == 2)
144
921k
    {
145
921k
        assert(m_off <= M1_MAX_OFFSET);
146
921k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
921k
        m_off -= 1;
148
#if defined(LZO1Z)
149
359k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
359k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
561k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
561k
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
921k
        c->m1a_m++;
156
921k
    }
157
#if defined(LZO1Z)
158
515k
    else if (m_len <= M2_MAX_LEN && (m_off <= M2_MAX_OFFSET || m_off == c->last_m_off))
159
#else
160
947k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
462k
#endif
162
722k
    {
163
722k
        assert(m_len >= 3);
164
#if defined(LZO1X)
165
        m_off -= 1;
166
230k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
230k
        *op++ = LZO_BYTE(m_off >> 3);
168
        assert(op[-2] >= M2_MARKER);
169
#elif defined(LZO1Y)
170
        m_off -= 1;
171
231k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
231k
        *op++ = LZO_BYTE(m_off >> 2);
173
        assert(op[-2] >= M2_MARKER);
174
#elif defined(LZO1Z)
175
259k
        if (m_off == c->last_m_off)
176
14.6k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
245k
        else
178
245k
        {
179
245k
            m_off -= 1;
180
245k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
245k
            *op++ = LZO_BYTE(m_off << 2);
182
245k
        }
183
#endif
184
722k
        c->m2_m++;
185
722k
    }
186
741k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
12.8k
    {
188
12.8k
        assert(m_len == 3);
189
12.8k
        assert(m_off > M2_MAX_OFFSET);
190
12.8k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
4.16k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
4.16k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
8.65k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
8.65k
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
12.8k
        c->m1b_m++;
199
12.8k
    }
200
728k
    else if (m_off <= M3_MAX_OFFSET)
201
600k
    {
202
600k
        assert(m_len >= 3);
203
600k
        m_off -= 1;
204
600k
        if (m_len <= M3_MAX_LEN)
205
453k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
147k
        else
207
147k
        {
208
147k
            m_len -= M3_MAX_LEN;
209
147k
            *op++ = M3_MARKER | 0;
210
220k
            while (m_len > 255)
211
73.1k
            {
212
73.1k
                m_len -= 255;
213
73.1k
                *op++ = 0;
214
73.1k
            }
215
147k
            assert(m_len > 0);
216
147k
            *op++ = LZO_BYTE(m_len);
217
147k
        }
218
#if defined(LZO1Z)
219
209k
        *op++ = LZO_BYTE(m_off >> 6);
220
209k
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
391k
        *op++ = LZO_BYTE(m_off << 2);
223
391k
        *op++ = LZO_BYTE(m_off >> 6);
224
#endif
225
600k
        c->m3_m++;
226
600k
    }
227
127k
    else
228
127k
    {
229
127k
        lzo_uint k;
230
231
127k
        assert(m_len >= 3);
232
127k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
127k
        m_off -= 0x4000;
234
127k
        k = (m_off & 0x4000) >> 11;
235
127k
        if (m_len <= M4_MAX_LEN)
236
72.5k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
54.8k
        else
238
54.8k
        {
239
54.8k
            m_len -= M4_MAX_LEN;
240
54.8k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
77.3k
            while (m_len > 255)
242
22.4k
            {
243
22.4k
                m_len -= 255;
244
22.4k
                *op++ = 0;
245
22.4k
            }
246
54.8k
            assert(m_len > 0);
247
54.8k
            *op++ = LZO_BYTE(m_len);
248
54.8k
        }
249
#if defined(LZO1Z)
250
41.7k
        *op++ = LZO_BYTE(m_off >> 6);
251
41.7k
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
85.6k
        *op++ = LZO_BYTE(m_off << 2);
254
85.6k
        *op++ = LZO_BYTE(m_off >> 6);
255
#endif
256
127k
        c->m4_m++;
257
127k
    }
258
259
2.38M
    c->last_m_len = x_len;
260
2.38M
    c->last_m_off = x_off;
261
2.38M
    return op;
262
2.38M
}
lzo1x_9x.c:code_match
Line
Count
Source
108
707k
{
109
707k
    lzo_uint x_len = m_len;
110
707k
    lzo_uint x_off = m_off;
111
112
707k
    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
707k
    assert(op > c->out);
143
707k
    if (m_len == 2)
144
242k
    {
145
242k
        assert(m_off <= M1_MAX_OFFSET);
146
242k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
242k
        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
242k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
242k
        *op++ = LZO_BYTE(m_off >> 2);
154
242k
#endif
155
242k
        c->m1a_m++;
156
242k
    }
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
464k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
230k
#endif
162
230k
    {
163
230k
        assert(m_len >= 3);
164
230k
#if defined(LZO1X)
165
230k
        m_off -= 1;
166
230k
        *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2));
167
230k
        *op++ = LZO_BYTE(m_off >> 3);
168
230k
        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
230k
        c->m2_m++;
185
230k
    }
186
234k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
3.32k
    {
188
3.32k
        assert(m_len == 3);
189
3.32k
        assert(m_off > M2_MAX_OFFSET);
190
3.32k
        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.32k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
3.32k
        *op++ = LZO_BYTE(m_off >> 2);
197
3.32k
#endif
198
3.32k
        c->m1b_m++;
199
3.32k
    }
200
231k
    else if (m_off <= M3_MAX_OFFSET)
201
192k
    {
202
192k
        assert(m_len >= 3);
203
192k
        m_off -= 1;
204
192k
        if (m_len <= M3_MAX_LEN)
205
144k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
48.4k
        else
207
48.4k
        {
208
48.4k
            m_len -= M3_MAX_LEN;
209
48.4k
            *op++ = M3_MARKER | 0;
210
69.8k
            while (m_len > 255)
211
21.3k
            {
212
21.3k
                m_len -= 255;
213
21.3k
                *op++ = 0;
214
21.3k
            }
215
48.4k
            assert(m_len > 0);
216
48.4k
            *op++ = LZO_BYTE(m_len);
217
48.4k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
192k
        *op++ = LZO_BYTE(m_off << 2);
223
192k
        *op++ = LZO_BYTE(m_off >> 6);
224
192k
#endif
225
192k
        c->m3_m++;
226
192k
    }
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
21.7k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
16.8k
        else
238
16.8k
        {
239
16.8k
            m_len -= M4_MAX_LEN;
240
16.8k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
23.7k
            while (m_len > 255)
242
6.90k
            {
243
6.90k
                m_len -= 255;
244
6.90k
                *op++ = 0;
245
6.90k
            }
246
16.8k
            assert(m_len > 0);
247
16.8k
            *op++ = LZO_BYTE(m_len);
248
16.8k
        }
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
707k
    c->last_m_len = x_len;
260
707k
    c->last_m_off = x_off;
261
707k
    return op;
262
707k
}
lzo1y_9x.c:code_match
Line
Count
Source
108
802k
{
109
802k
    lzo_uint x_len = m_len;
110
802k
    lzo_uint x_off = m_off;
111
112
802k
    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
802k
    assert(op > c->out);
143
802k
    if (m_len == 2)
144
319k
    {
145
319k
        assert(m_off <= M1_MAX_OFFSET);
146
319k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
319k
        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
319k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
319k
        *op++ = LZO_BYTE(m_off >> 2);
154
319k
#endif
155
319k
        c->m1a_m++;
156
319k
    }
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
482k
    else if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
161
231k
#endif
162
231k
    {
163
231k
        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
231k
        m_off -= 1;
171
231k
        *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2));
172
231k
        *op++ = LZO_BYTE(m_off >> 2);
173
231k
        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
231k
        c->m2_m++;
185
231k
    }
186
251k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
5.32k
    {
188
5.32k
        assert(m_len == 3);
189
5.32k
        assert(m_off > M2_MAX_OFFSET);
190
5.32k
        m_off -= 1 + M2_MAX_OFFSET;
191
#if defined(LZO1Z)
192
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
5.32k
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
5.32k
        *op++ = LZO_BYTE(m_off >> 2);
197
5.32k
#endif
198
5.32k
        c->m1b_m++;
199
5.32k
    }
200
245k
    else if (m_off <= M3_MAX_OFFSET)
201
198k
    {
202
198k
        assert(m_len >= 3);
203
198k
        m_off -= 1;
204
198k
        if (m_len <= M3_MAX_LEN)
205
149k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
49.4k
        else
207
49.4k
        {
208
49.4k
            m_len -= M3_MAX_LEN;
209
49.4k
            *op++ = M3_MARKER | 0;
210
72.8k
            while (m_len > 255)
211
23.4k
            {
212
23.4k
                m_len -= 255;
213
23.4k
                *op++ = 0;
214
23.4k
            }
215
49.4k
            assert(m_len > 0);
216
49.4k
            *op++ = LZO_BYTE(m_len);
217
49.4k
        }
218
#if defined(LZO1Z)
219
        *op++ = LZO_BYTE(m_off >> 6);
220
        *op++ = LZO_BYTE(m_off << 2);
221
#else
222
198k
        *op++ = LZO_BYTE(m_off << 2);
223
198k
        *op++ = LZO_BYTE(m_off >> 6);
224
198k
#endif
225
198k
        c->m3_m++;
226
198k
    }
227
47.0k
    else
228
47.0k
    {
229
47.0k
        lzo_uint k;
230
231
47.0k
        assert(m_len >= 3);
232
47.0k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
47.0k
        m_off -= 0x4000;
234
47.0k
        k = (m_off & 0x4000) >> 11;
235
47.0k
        if (m_len <= M4_MAX_LEN)
236
28.4k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
18.5k
        else
238
18.5k
        {
239
18.5k
            m_len -= M4_MAX_LEN;
240
18.5k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
25.5k
            while (m_len > 255)
242
7.02k
            {
243
7.02k
                m_len -= 255;
244
7.02k
                *op++ = 0;
245
7.02k
            }
246
18.5k
            assert(m_len > 0);
247
18.5k
            *op++ = LZO_BYTE(m_len);
248
18.5k
        }
249
#if defined(LZO1Z)
250
        *op++ = LZO_BYTE(m_off >> 6);
251
        *op++ = LZO_BYTE(m_off << 2);
252
#else
253
47.0k
        *op++ = LZO_BYTE(m_off << 2);
254
47.0k
        *op++ = LZO_BYTE(m_off >> 6);
255
47.0k
#endif
256
47.0k
        c->m4_m++;
257
47.0k
    }
258
259
802k
    c->last_m_len = x_len;
260
802k
    c->last_m_off = x_off;
261
802k
    return op;
262
802k
}
lzo1z_9x.c:code_match
Line
Count
Source
108
875k
{
109
875k
    lzo_uint x_len = m_len;
110
875k
    lzo_uint x_off = m_off;
111
112
875k
    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
875k
    assert(op > c->out);
143
875k
    if (m_len == 2)
144
359k
    {
145
359k
        assert(m_off <= M1_MAX_OFFSET);
146
359k
        assert(c->r1_lit > 0); assert(c->r1_lit < 4);
147
359k
        m_off -= 1;
148
359k
#if defined(LZO1Z)
149
359k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
150
359k
        *op++ = LZO_BYTE(m_off << 2);
151
#else
152
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
153
        *op++ = LZO_BYTE(m_off >> 2);
154
#endif
155
359k
        c->m1a_m++;
156
359k
    }
157
515k
#if defined(LZO1Z)
158
515k
    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
259k
    {
163
259k
        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
259k
        if (m_off == c->last_m_off)
176
14.6k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (0x700 >> 6));
177
245k
        else
178
245k
        {
179
245k
            m_off -= 1;
180
245k
            *op++ = LZO_BYTE(((m_len - 1) << 5) | (m_off >> 6));
181
245k
            *op++ = LZO_BYTE(m_off << 2);
182
245k
        }
183
259k
#endif
184
259k
        c->m2_m++;
185
259k
    }
186
255k
    else if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && c->r1_lit >= 4)
187
4.16k
    {
188
4.16k
        assert(m_len == 3);
189
4.16k
        assert(m_off > M2_MAX_OFFSET);
190
4.16k
        m_off -= 1 + M2_MAX_OFFSET;
191
4.16k
#if defined(LZO1Z)
192
4.16k
        *op++ = LZO_BYTE(M1_MARKER | (m_off >> 6));
193
4.16k
        *op++ = LZO_BYTE(m_off << 2);
194
#else
195
        *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2));
196
        *op++ = LZO_BYTE(m_off >> 2);
197
#endif
198
4.16k
        c->m1b_m++;
199
4.16k
    }
200
251k
    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
159k
            *op++ = LZO_BYTE(M3_MARKER | (m_len - 2));
206
49.6k
        else
207
49.6k
        {
208
49.6k
            m_len -= M3_MAX_LEN;
209
49.6k
            *op++ = M3_MARKER | 0;
210
78.0k
            while (m_len > 255)
211
28.3k
            {
212
28.3k
                m_len -= 255;
213
28.3k
                *op++ = 0;
214
28.3k
            }
215
49.6k
            assert(m_len > 0);
216
49.6k
            *op++ = LZO_BYTE(m_len);
217
49.6k
        }
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
41.7k
    else
228
41.7k
    {
229
41.7k
        lzo_uint k;
230
231
41.7k
        assert(m_len >= 3);
232
41.7k
        assert(m_off > 0x4000); assert(m_off <= 0xbfff);
233
41.7k
        m_off -= 0x4000;
234
41.7k
        k = (m_off & 0x4000) >> 11;
235
41.7k
        if (m_len <= M4_MAX_LEN)
236
22.2k
            *op++ = LZO_BYTE(M4_MARKER | k | (m_len - 2));
237
19.5k
        else
238
19.5k
        {
239
19.5k
            m_len -= M4_MAX_LEN;
240
19.5k
            *op++ = LZO_BYTE(M4_MARKER | k | 0);
241
28.0k
            while (m_len > 255)
242
8.51k
            {
243
8.51k
                m_len -= 255;
244
8.51k
                *op++ = 0;
245
8.51k
            }
246
19.5k
            assert(m_len > 0);
247
19.5k
            *op++ = LZO_BYTE(m_len);
248
19.5k
        }
249
41.7k
#if defined(LZO1Z)
250
41.7k
        *op++ = LZO_BYTE(m_off >> 6);
251
41.7k
        *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
41.7k
        c->m4_m++;
257
41.7k
    }
258
259
875k
    c->last_m_len = x_len;
260
875k
    c->last_m_off = x_off;
261
875k
    return op;
262
875k
}
263
264
265
static lzo_bytep
266
STORE_RUN ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii, lzo_uint t )
267
1.74M
{
268
1.74M
    c->lit_bytes += t;
269
270
1.74M
    if (op == c->out && t <= 238)
271
5.07k
    {
272
5.07k
        *op++ = LZO_BYTE(17 + t);
273
5.07k
    }
274
1.74M
    else if (t <= 3)
275
1.57M
    {
276
#if defined(LZO1Z)
277
592k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
980k
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
1.57M
        c->lit1_r++;
282
1.57M
    }
283
169k
    else if (t <= 18)
284
101k
    {
285
101k
        *op++ = LZO_BYTE(t - 3);
286
101k
        c->lit2_r++;
287
101k
    }
288
67.6k
    else
289
67.6k
    {
290
67.6k
        lzo_uint tt = t - 18;
291
292
67.6k
        *op++ = 0;
293
232k
        while (tt > 255)
294
165k
        {
295
165k
            tt -= 255;
296
165k
            *op++ = 0;
297
165k
        }
298
67.6k
        assert(tt > 0);
299
67.6k
        *op++ = LZO_BYTE(tt);
300
67.6k
        c->lit3_r++;
301
67.6k
    }
302
49.5M
    do *op++ = *ii++; while (--t > 0);
303
304
1.74M
    return op;
305
1.74M
}
lzo1x_9x.c:STORE_RUN
Line
Count
Source
267
513k
{
268
513k
    c->lit_bytes += t;
269
270
513k
    if (op == c->out && t <= 238)
271
1.60k
    {
272
1.60k
        *op++ = LZO_BYTE(17 + t);
273
1.60k
    }
274
511k
    else if (t <= 3)
275
454k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
454k
        op[-2] = LZO_BYTE(op[-2] | t);
280
454k
#endif
281
454k
        c->lit1_r++;
282
454k
    }
283
57.2k
    else if (t <= 18)
284
34.6k
    {
285
34.6k
        *op++ = LZO_BYTE(t - 3);
286
34.6k
        c->lit2_r++;
287
34.6k
    }
288
22.6k
    else
289
22.6k
    {
290
22.6k
        lzo_uint tt = t - 18;
291
292
22.6k
        *op++ = 0;
293
74.7k
        while (tt > 255)
294
52.1k
        {
295
52.1k
            tt -= 255;
296
52.1k
            *op++ = 0;
297
52.1k
        }
298
22.6k
        assert(tt > 0);
299
22.6k
        *op++ = LZO_BYTE(tt);
300
22.6k
        c->lit3_r++;
301
22.6k
    }
302
15.7M
    do *op++ = *ii++; while (--t > 0);
303
304
513k
    return op;
305
513k
}
lzo1y_9x.c:STORE_RUN
Line
Count
Source
267
579k
{
268
579k
    c->lit_bytes += t;
269
270
579k
    if (op == c->out && t <= 238)
271
1.57k
    {
272
1.57k
        *op++ = LZO_BYTE(17 + t);
273
1.57k
    }
274
578k
    else if (t <= 3)
275
526k
    {
276
#if defined(LZO1Z)
277
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
526k
        op[-2] = LZO_BYTE(op[-2] | t);
280
526k
#endif
281
526k
        c->lit1_r++;
282
526k
    }
283
51.7k
    else if (t <= 18)
284
31.5k
    {
285
31.5k
        *op++ = LZO_BYTE(t - 3);
286
31.5k
        c->lit2_r++;
287
31.5k
    }
288
20.1k
    else
289
20.1k
    {
290
20.1k
        lzo_uint tt = t - 18;
291
292
20.1k
        *op++ = 0;
293
74.5k
        while (tt > 255)
294
54.3k
        {
295
54.3k
            tt -= 255;
296
54.3k
            *op++ = 0;
297
54.3k
        }
298
20.1k
        assert(tt > 0);
299
20.1k
        *op++ = LZO_BYTE(tt);
300
20.1k
        c->lit3_r++;
301
20.1k
    }
302
16.1M
    do *op++ = *ii++; while (--t > 0);
303
304
579k
    return op;
305
579k
}
lzo1z_9x.c:STORE_RUN
Line
Count
Source
267
654k
{
268
654k
    c->lit_bytes += t;
269
270
654k
    if (op == c->out && t <= 238)
271
1.89k
    {
272
1.89k
        *op++ = LZO_BYTE(17 + t);
273
1.89k
    }
274
652k
    else if (t <= 3)
275
592k
    {
276
592k
#if defined(LZO1Z)
277
592k
        op[-1] = LZO_BYTE(op[-1] | t);
278
#else
279
        op[-2] = LZO_BYTE(op[-2] | t);
280
#endif
281
592k
        c->lit1_r++;
282
592k
    }
283
60.0k
    else if (t <= 18)
284
35.1k
    {
285
35.1k
        *op++ = LZO_BYTE(t - 3);
286
35.1k
        c->lit2_r++;
287
35.1k
    }
288
24.8k
    else
289
24.8k
    {
290
24.8k
        lzo_uint tt = t - 18;
291
292
24.8k
        *op++ = 0;
293
83.4k
        while (tt > 255)
294
58.5k
        {
295
58.5k
            tt -= 255;
296
58.5k
            *op++ = 0;
297
58.5k
        }
298
24.8k
        assert(tt > 0);
299
24.8k
        *op++ = LZO_BYTE(tt);
300
24.8k
        c->lit3_r++;
301
24.8k
    }
302
17.6M
    do *op++ = *ii++; while (--t > 0);
303
304
654k
    return op;
305
654k
}
306
307
308
static lzo_bytep
309
code_run ( LZO_COMPRESS_T *c, lzo_bytep op, const lzo_bytep ii,
310
           lzo_uint lit, lzo_uint m_len )
311
2.38M
{
312
2.38M
    if (lit > 0)
313
1.74M
    {
314
1.74M
        assert(m_len >= 2);
315
1.74M
        op = STORE_RUN(c,op,ii,lit);
316
1.74M
        c->r1_m_len = m_len;
317
1.74M
        c->r1_lit = lit;
318
1.74M
    }
319
640k
    else
320
640k
    {
321
640k
        assert(m_len >= 3);
322
640k
        c->r1_m_len = 0;
323
640k
        c->r1_lit = 0;
324
640k
    }
325
326
2.38M
    return op;
327
2.38M
}
lzo1x_9x.c:code_run
Line
Count
Source
311
707k
{
312
707k
    if (lit > 0)
313
512k
    {
314
512k
        assert(m_len >= 2);
315
512k
        op = STORE_RUN(c,op,ii,lit);
316
512k
        c->r1_m_len = m_len;
317
512k
        c->r1_lit = lit;
318
512k
    }
319
194k
    else
320
194k
    {
321
194k
        assert(m_len >= 3);
322
194k
        c->r1_m_len = 0;
323
194k
        c->r1_lit = 0;
324
194k
    }
325
326
707k
    return op;
327
707k
}
lzo1y_9x.c:code_run
Line
Count
Source
311
802k
{
312
802k
    if (lit > 0)
313
578k
    {
314
578k
        assert(m_len >= 2);
315
578k
        op = STORE_RUN(c,op,ii,lit);
316
578k
        c->r1_m_len = m_len;
317
578k
        c->r1_lit = lit;
318
578k
    }
319
223k
    else
320
223k
    {
321
223k
        assert(m_len >= 3);
322
223k
        c->r1_m_len = 0;
323
223k
        c->r1_lit = 0;
324
223k
    }
325
326
802k
    return op;
327
802k
}
lzo1z_9x.c:code_run
Line
Count
Source
311
875k
{
312
875k
    if (lit > 0)
313
653k
    {
314
653k
        assert(m_len >= 2);
315
653k
        op = STORE_RUN(c,op,ii,lit);
316
653k
        c->r1_m_len = m_len;
317
653k
        c->r1_lit = lit;
318
653k
    }
319
221k
    else
320
221k
    {
321
221k
        assert(m_len >= 3);
322
221k
        c->r1_m_len = 0;
323
221k
        c->r1_lit = 0;
324
221k
    }
325
326
875k
    return op;
327
875k
}
328
329
330
/***********************************************************************
331
//
332
************************************************************************/
333
334
static lzo_uint
335
len_of_coded_match ( lzo_uint m_len, lzo_uint m_off, lzo_uint lit )
336
4.89M
{
337
4.89M
    lzo_uint n = 4;
338
339
4.89M
    if (m_len < 2)
340
959k
        return 0;
341
3.93M
    if (m_len == 2)
342
1.56M
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
2.36M
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
1.05M
        return 2;
345
1.30M
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
15.1k
        return 2;
347
1.29M
    if (m_off <= M3_MAX_OFFSET)
348
1.05M
    {
349
1.05M
        if (m_len <= M3_MAX_LEN)
350
844k
            return 3;
351
208k
        m_len -= M3_MAX_LEN;
352
212k
        while (m_len > 255)
353
4.41k
        {
354
4.41k
            m_len -= 255;
355
4.41k
            n++;
356
4.41k
        }
357
208k
        return n;
358
1.05M
    }
359
238k
    if (m_off <= M4_MAX_OFFSET)
360
238k
    {
361
238k
        if (m_len <= M4_MAX_LEN)
362
153k
            return 3;
363
85.3k
        m_len -= M4_MAX_LEN;
364
87.7k
        while (m_len > 255)
365
2.32k
        {
366
2.32k
            m_len -= 255;
367
2.32k
            n++;
368
2.32k
        }
369
85.3k
        return n;
370
238k
    }
371
0
    return 0;
372
238k
}
lzo1x_9x.c:len_of_coded_match
Line
Count
Source
336
1.41M
{
337
1.41M
    lzo_uint n = 4;
338
339
1.41M
    if (m_len < 2)
340
262k
        return 0;
341
1.15M
    if (m_len == 2)
342
400k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
754k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
339k
        return 2;
345
414k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.12k
        return 2;
347
410k
    if (m_off <= M3_MAX_OFFSET)
348
335k
    {
349
335k
        if (m_len <= M3_MAX_LEN)
350
267k
            return 3;
351
68.0k
        m_len -= M3_MAX_LEN;
352
69.5k
        while (m_len > 255)
353
1.46k
        {
354
1.46k
            m_len -= 255;
355
1.46k
            n++;
356
1.46k
        }
357
68.0k
        return n;
358
335k
    }
359
75.1k
    if (m_off <= M4_MAX_OFFSET)
360
75.1k
    {
361
75.1k
        if (m_len <= M4_MAX_LEN)
362
48.6k
            return 3;
363
26.5k
        m_len -= M4_MAX_LEN;
364
27.2k
        while (m_len > 255)
365
674
        {
366
674
            m_len -= 255;
367
674
            n++;
368
674
        }
369
26.5k
        return n;
370
75.1k
    }
371
0
    return 0;
372
75.1k
}
lzo1y_9x.c:len_of_coded_match
Line
Count
Source
336
1.66M
{
337
1.66M
    lzo_uint n = 4;
338
339
1.66M
    if (m_len < 2)
340
332k
        return 0;
341
1.33M
    if (m_len == 2)
342
554k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
782k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
339k
        return 2;
345
442k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
6.16k
        return 2;
347
436k
    if (m_off <= M3_MAX_OFFSET)
348
353k
    {
349
353k
        if (m_len <= M3_MAX_LEN)
350
279k
            return 3;
351
73.6k
        m_len -= M3_MAX_LEN;
352
75.1k
        while (m_len > 255)
353
1.50k
        {
354
1.50k
            m_len -= 255;
355
1.50k
            n++;
356
1.50k
        }
357
73.6k
        return n;
358
353k
    }
359
83.5k
    if (m_off <= M4_MAX_OFFSET)
360
83.5k
    {
361
83.5k
        if (m_len <= M4_MAX_LEN)
362
55.1k
            return 3;
363
28.4k
        m_len -= M4_MAX_LEN;
364
29.2k
        while (m_len > 255)
365
783
        {
366
783
            m_len -= 255;
367
783
            n++;
368
783
        }
369
28.4k
        return n;
370
83.5k
    }
371
0
    return 0;
372
83.5k
}
lzo1z_9x.c:len_of_coded_match
Line
Count
Source
336
1.80M
{
337
1.80M
    lzo_uint n = 4;
338
339
1.80M
    if (m_len < 2)
340
364k
        return 0;
341
1.44M
    if (m_len == 2)
342
612k
        return (m_off <= M1_MAX_OFFSET && lit > 0 && lit < 4) ? 2 : 0;
343
830k
    if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET)
344
380k
        return 2;
345
449k
    if (m_len == M2_MIN_LEN && m_off <= MX_MAX_OFFSET && lit >= 4)
346
4.85k
        return 2;
347
444k
    if (m_off <= M3_MAX_OFFSET)
348
364k
    {
349
364k
        if (m_len <= M3_MAX_LEN)
350
298k
            return 3;
351
66.6k
        m_len -= M3_MAX_LEN;
352
68.0k
        while (m_len > 255)
353
1.43k
        {
354
1.43k
            m_len -= 255;
355
1.43k
            n++;
356
1.43k
        }
357
66.6k
        return n;
358
364k
    }
359
79.8k
    if (m_off <= M4_MAX_OFFSET)
360
79.8k
    {
361
79.8k
        if (m_len <= M4_MAX_LEN)
362
49.5k
            return 3;
363
30.3k
        m_len -= M4_MAX_LEN;
364
31.2k
        while (m_len > 255)
365
869
        {
366
869
            m_len -= 255;
367
869
            n++;
368
869
        }
369
30.3k
        return n;
370
79.8k
    }
371
0
    return 0;
372
79.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.08M
{
378
1.08M
    lzo_uint lazy_match_min_gain;
379
380
1.08M
    assert (ahead >= 1);
381
1.08M
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
1.08M
    if (lit1 <= 3)
389
1.06M
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
18.7k
    else if (lit1 <= 18)
391
11.7k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
1.08M
    lazy_match_min_gain += (l2 - l1) * 2;
394
1.08M
    if (l3)
395
4.95k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
1.08M
    if ((lzo_int) lazy_match_min_gain < 0)
398
43.7k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
1.08M
    return lazy_match_min_gain;
407
1.08M
}
lzo1x_9x.c:min_gain
Line
Count
Source
377
301k
{
378
301k
    lzo_uint lazy_match_min_gain;
379
380
301k
    assert (ahead >= 1);
381
301k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
301k
    if (lit1 <= 3)
389
295k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
6.44k
    else if (lit1 <= 18)
391
3.95k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
301k
    lazy_match_min_gain += (l2 - l1) * 2;
394
301k
    if (l3)
395
1.71k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
301k
    if ((lzo_int) lazy_match_min_gain < 0)
398
13.8k
        lazy_match_min_gain = 0;
399
400
#if 0
401
    if (l1 == 2)
402
        if (lazy_match_min_gain == 0)
403
            lazy_match_min_gain = 1;
404
#endif
405
406
301k
    return lazy_match_min_gain;
407
301k
}
lzo1y_9x.c:min_gain
Line
Count
Source
377
378k
{
378
378k
    lzo_uint lazy_match_min_gain;
379
380
378k
    assert (ahead >= 1);
381
378k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
378k
    if (lit1 <= 3)
389
372k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
5.91k
    else if (lit1 <= 18)
391
3.84k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
378k
    lazy_match_min_gain += (l2 - l1) * 2;
394
378k
    if (l3)
395
1.41k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
378k
    if ((lzo_int) lazy_match_min_gain < 0)
398
15.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
378k
    return lazy_match_min_gain;
407
378k
}
lzo1z_9x.c:min_gain
Line
Count
Source
377
406k
{
378
406k
    lzo_uint lazy_match_min_gain;
379
380
406k
    assert (ahead >= 1);
381
406k
    lazy_match_min_gain = ahead;
382
383
#if 0
384
    if (l3)
385
        lit2 -= ahead;
386
#endif
387
388
406k
    if (lit1 <= 3)
389
400k
        lazy_match_min_gain += (lit2 <= 3) ? 0 : 2;
390
6.41k
    else if (lit1 <= 18)
391
3.97k
        lazy_match_min_gain += (lit2 <= 18) ? 0 : 1;
392
393
406k
    lazy_match_min_gain += (l2 - l1) * 2;
394
406k
    if (l3)
395
1.82k
        lazy_match_min_gain -= (ahead - l3) * 2;
396
397
406k
    if ((lzo_int) lazy_match_min_gain < 0)
398
14.2k
        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
406k
    return lazy_match_min_gain;
407
406k
}
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.14M
#  define assert_match(a,b,c)   ((void)0)
446
#endif
447
448
449
#if defined(SWD_BEST_OFF)
450
451
static void
452
better_match ( const lzo_swd_p swd, lzo_uint *m_len, lzo_uint *m_off )
453
3.85M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
3.85M
    if (*m_len <= M2_MIN_LEN)
459
1.97M
        return;
460
#if defined(LZO1Z)
461
661k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.2k
        return;
463
651k
#if 1
464
651k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
651k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.17k
    {
467
1.17k
        *m_len = *m_len - 1;
468
1.17k
        *m_off = swd->best_off[*m_len];
469
1.17k
        return;
470
1.17k
    }
471
650k
#endif
472
650k
#endif
473
474
1.86M
    if (*m_off <= M2_MAX_OFFSET)
475
1.08M
        return;
476
477
781k
#if 1
478
    /* M3/M4 -> M2 */
479
781k
    if (*m_off > M2_MAX_OFFSET &&
480
781k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
781k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
47.0k
    {
483
47.0k
        *m_len = *m_len - 1;
484
47.0k
        *m_off = swd->best_off[*m_len];
485
47.0k
        return;
486
47.0k
    }
487
734k
#endif
488
489
734k
#if 1
490
    /* M4 -> M2 */
491
734k
    if (*m_off > M3_MAX_OFFSET &&
492
734k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
734k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
3.00k
    {
495
3.00k
        *m_len = *m_len - 2;
496
3.00k
        *m_off = swd->best_off[*m_len];
497
3.00k
        return;
498
3.00k
    }
499
731k
#endif
500
501
731k
#if 1
502
    /* M4 -> M3 */
503
731k
    if (*m_off > M3_MAX_OFFSET &&
504
731k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
731k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
5.39k
    {
507
5.39k
        *m_len = *m_len - 1;
508
5.39k
        *m_off = swd->best_off[*m_len];
509
5.39k
    }
510
731k
#endif
511
731k
}
lzo1x_9x.c:better_match
Line
Count
Source
453
1.13M
{
454
#if defined(LZO1Z)
455
    const LZO_COMPRESS_T *c = swd->c;
456
#endif
457
458
1.13M
    if (*m_len <= M2_MIN_LEN)
459
545k
        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
586k
    if (*m_off <= M2_MAX_OFFSET)
475
361k
        return;
476
477
225k
#if 1
478
    /* M3/M4 -> M2 */
479
225k
    if (*m_off > M2_MAX_OFFSET &&
480
225k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
225k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
14.6k
    {
483
14.6k
        *m_len = *m_len - 1;
484
14.6k
        *m_off = swd->best_off[*m_len];
485
14.6k
        return;
486
14.6k
    }
487
210k
#endif
488
489
210k
#if 1
490
    /* M4 -> M2 */
491
210k
    if (*m_off > M3_MAX_OFFSET &&
492
210k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
210k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
915
    {
495
915
        *m_len = *m_len - 2;
496
915
        *m_off = swd->best_off[*m_len];
497
915
        return;
498
915
    }
499
209k
#endif
500
501
209k
#if 1
502
    /* M4 -> M3 */
503
209k
    if (*m_off > M3_MAX_OFFSET &&
504
209k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
209k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
1.77k
    {
507
1.77k
        *m_len = *m_len - 1;
508
1.77k
        *m_off = swd->best_off[*m_len];
509
1.77k
    }
510
209k
#endif
511
209k
}
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
677k
        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
629k
    if (*m_off <= M2_MAX_OFFSET)
475
328k
        return;
476
477
301k
#if 1
478
    /* M3/M4 -> M2 */
479
301k
    if (*m_off > M2_MAX_OFFSET &&
480
301k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
301k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
15.0k
    {
483
15.0k
        *m_len = *m_len - 1;
484
15.0k
        *m_off = swd->best_off[*m_len];
485
15.0k
        return;
486
15.0k
    }
487
286k
#endif
488
489
286k
#if 1
490
    /* M4 -> M2 */
491
286k
    if (*m_off > M3_MAX_OFFSET &&
492
286k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
286k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
1.23k
    {
495
1.23k
        *m_len = *m_len - 2;
496
1.23k
        *m_off = swd->best_off[*m_len];
497
1.23k
        return;
498
1.23k
    }
499
285k
#endif
500
501
285k
#if 1
502
    /* M4 -> M3 */
503
285k
    if (*m_off > M3_MAX_OFFSET &&
504
285k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
285k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
1.53k
    {
507
1.53k
        *m_len = *m_len - 1;
508
1.53k
        *m_off = swd->best_off[*m_len];
509
1.53k
    }
510
285k
#endif
511
285k
}
lzo1z_9x.c:better_match
Line
Count
Source
453
1.41M
{
454
1.41M
#if defined(LZO1Z)
455
1.41M
    const LZO_COMPRESS_T *c = swd->c;
456
1.41M
#endif
457
458
1.41M
    if (*m_len <= M2_MIN_LEN)
459
756k
        return;
460
661k
#if defined(LZO1Z)
461
661k
    if (*m_off == c->last_m_off && *m_len <= M2_MAX_LEN)
462
10.2k
        return;
463
651k
#if 1
464
651k
    if (*m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
465
651k
        c->last_m_off && swd->best_off[*m_len-1] == c->last_m_off)
466
1.17k
    {
467
1.17k
        *m_len = *m_len - 1;
468
1.17k
        *m_off = swd->best_off[*m_len];
469
1.17k
        return;
470
1.17k
    }
471
650k
#endif
472
650k
#endif
473
474
650k
    if (*m_off <= M2_MAX_OFFSET)
475
395k
        return;
476
477
255k
#if 1
478
    /* M3/M4 -> M2 */
479
255k
    if (*m_off > M2_MAX_OFFSET &&
480
255k
        *m_len >= M2_MIN_LEN + 1 && *m_len <= M2_MAX_LEN + 1 &&
481
255k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M2_MAX_OFFSET)
482
17.3k
    {
483
17.3k
        *m_len = *m_len - 1;
484
17.3k
        *m_off = swd->best_off[*m_len];
485
17.3k
        return;
486
17.3k
    }
487
237k
#endif
488
489
237k
#if 1
490
    /* M4 -> M2 */
491
237k
    if (*m_off > M3_MAX_OFFSET &&
492
237k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M2_MAX_LEN + 2 &&
493
237k
        swd->best_off[*m_len-2] && swd->best_off[*m_len-2] <= M2_MAX_OFFSET)
494
860
    {
495
860
        *m_len = *m_len - 2;
496
860
        *m_off = swd->best_off[*m_len];
497
860
        return;
498
860
    }
499
237k
#endif
500
501
237k
#if 1
502
    /* M4 -> M3 */
503
237k
    if (*m_off > M3_MAX_OFFSET &&
504
237k
        *m_len >= M4_MAX_LEN + 1 && *m_len <= M3_MAX_LEN + 1 &&
505
237k
        swd->best_off[*m_len-1] && swd->best_off[*m_len-1] <= M3_MAX_OFFSET)
506
2.07k
    {
507
2.07k
        *m_len = *m_len - 1;
508
2.07k
        *m_off = swd->best_off[*m_len];
509
2.07k
    }
510
237k
#endif
511
237k
}
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
5.30k
{
533
5.30k
    lzo_bytep op;
534
5.30k
    const lzo_bytep ii;
535
5.30k
    lzo_uint lit;
536
5.30k
    lzo_uint m_len, m_off;
537
5.30k
    LZO_COMPRESS_T cc;
538
5.30k
    LZO_COMPRESS_T * const c = &cc;
539
5.30k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
5.30k
    lzo_uint try_lazy;
541
5.30k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
1.68k
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.65k
    LZO_COMPILE_TIME_ASSERT(LZO1Y_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
548
#elif defined(LZO1Z)
549
1.96k
    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
5.30k
    try_lazy = (lzo_uint) try_lazy_parm;
557
5.30k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
5.30k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
5.30k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
5.30k
    if (nice_length == 0)
567
5.30k
        nice_length = 0;
568
    /* don't search more positions than this */
569
5.30k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
5.30k
    c->init = 0;
573
5.30k
    c->ip = c->in = in;
574
5.30k
    c->in_end = in + in_len;
575
5.30k
    c->out = out;
576
5.30k
    c->cb = cb;
577
5.30k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
5.30k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
5.30k
    op = out;
581
5.30k
    ii = c->ip;             /* point to start of literal run */
582
5.30k
    lit = 0;
583
5.30k
    c->r1_lit = c->r1_m_len = 0;
584
585
5.30k
    r = init_match(c,swd,dict,dict_len,flags);
586
5.30k
    if (r != 0)
587
0
        return r;
588
5.30k
    if (max_chain > 0)
589
5.30k
        swd->max_chain = max_chain;
590
5.30k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
5.30k
    r = find_match(c,swd,0,0);
594
5.30k
    if (r != 0)
595
0
        return r;
596
51.9M
    while (c->look > 0)
597
51.9M
    {
598
51.9M
        lzo_uint ahead;
599
51.9M
        lzo_uint max_ahead;
600
51.9M
        lzo_uint l1, l2, l3;
601
602
51.9M
        c->codesize = pd(op, out);
603
604
51.9M
        m_len = c->m_len;
605
51.9M
        m_off = c->m_off;
606
607
51.9M
        assert(c->bp == c->ip - c->look);
608
51.9M
        assert(c->bp >= in);
609
51.9M
        if (lit == 0)
610
2.38M
            ii = c->bp;
611
51.9M
        assert(ii + lit == c->bp);
612
51.9M
        assert(swd->b_char == *(c->bp));
613
614
51.9M
        if ( m_len < 2 ||
615
51.9M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
51.9M
#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
51.9M
            (m_len == 2 && op == out) ||
622
51.9M
#endif
623
51.9M
            (op == out && lit == 0))
624
49.0M
        {
625
            /* a literal */
626
49.0M
            m_len = 0;
627
49.0M
        }
628
2.90M
        else if (m_len == M2_MIN_LEN)
629
591k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
591k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
141k
                m_len = 0;
633
591k
        }
634
635
51.9M
        if (m_len == 0)
636
49.1M
        {
637
    /* a literal */
638
49.1M
            lit++;
639
49.1M
            swd->max_chain = max_chain;
640
49.1M
            r = find_match(c,swd,1,0);
641
49.1M
            assert(r == 0); LZO_UNUSED(r);
642
49.1M
            continue;
643
49.1M
        }
644
645
    /* a match */
646
2.76M
#if defined(SWD_BEST_OFF)
647
2.76M
        if (swd->use_best_off)
648
2.76M
            better_match(swd,&m_len,&m_off);
649
2.76M
#endif
650
2.76M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
2.76M
        ahead = 0;
655
2.76M
        if (try_lazy == 0 || m_len >= max_lazy)
656
50.0k
        {
657
            /* no */
658
50.0k
            l1 = 0;
659
50.0k
            max_ahead = 0;
660
50.0k
        }
661
2.71M
        else
662
2.71M
        {
663
            /* yes, try a lazy match */
664
2.71M
            l1 = len_of_coded_match(m_len,m_off,lit);
665
2.71M
            assert(l1 > 0);
666
2.71M
#if 1
667
2.71M
            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.71M
        }
672
673
674
5.83M
        while (ahead < max_ahead && c->look > m_len)
675
3.45M
        {
676
3.45M
            lzo_uint lazy_match_min_gain;
677
678
3.45M
            if (m_len >= good_length)
679
283k
                swd->max_chain = max_chain >> 2;
680
3.16M
            else
681
3.16M
                swd->max_chain = max_chain;
682
3.45M
            r = find_match(c,swd,1,0);
683
3.45M
            ahead++;
684
685
3.45M
            assert(r == 0); LZO_UNUSED(r);
686
3.45M
            assert(c->look > 0);
687
3.45M
            assert(ii + lit + ahead == c->bp);
688
689
#if defined(LZO1Z)
690
1.24M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
308k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
3.68k
                    c->m_len = 0;
693
#endif
694
3.45M
            if (c->m_len < m_len)
695
2.15M
                continue;
696
1.29M
#if 1
697
1.29M
            if (c->m_len == m_len && c->m_off >= m_off)
698
198k
                continue;
699
1.09M
#endif
700
1.09M
#if defined(SWD_BEST_OFF)
701
1.09M
            if (swd->use_best_off)
702
1.09M
                better_match(swd,&c->m_len,&c->m_off);
703
1.09M
#endif
704
1.09M
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
1.09M
            if (l2 == 0)
706
6.43k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
1.08M
#if 1
714
            /* compressed-data compatibility [see above] */
715
1.08M
            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.08M
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
1.08M
            if (c->m_len >= m_len + lazy_match_min_gain)
722
382k
            {
723
382k
                c->lazy++;
724
382k
                assert_match(swd,c->m_len,c->m_off);
725
726
382k
                if (l3)
727
2.76k
                {
728
                    /* code previous run */
729
2.76k
                    op = code_run(c,op,ii,lit,ahead);
730
2.76k
                    lit = 0;
731
                    /* code shortened match */
732
2.76k
                    op = code_match(c,op,ahead,m_off);
733
2.76k
                }
734
379k
                else
735
379k
                {
736
379k
                    lit += ahead;
737
379k
                    assert(ii + lit == c->bp);
738
379k
                }
739
382k
                goto lazy_match_done;
740
382k
            }
741
1.08M
        }
742
743
744
2.38M
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
2.38M
        op = code_run(c,op,ii,lit,m_len);
748
2.38M
        lit = 0;
749
750
        /* 2 - code match */
751
2.38M
        op = code_match(c,op,m_len,m_off);
752
2.38M
        swd->max_chain = max_chain;
753
2.38M
        r = find_match(c,swd,m_len,1+ahead);
754
2.38M
        assert(r == 0); LZO_UNUSED(r);
755
756
2.76M
lazy_match_done: ;
757
2.76M
    }
758
759
760
    /* store final run */
761
5.30k
    if (lit > 0)
762
3.15k
        op = STORE_RUN(c,op,ii,lit);
763
764
5.30k
#if defined(LZO_EOF_CODE)
765
5.30k
    *op++ = M4_MARKER | 1;
766
5.30k
    *op++ = 0;
767
5.30k
    *op++ = 0;
768
5.30k
#endif
769
770
5.30k
    c->codesize = pd(op, out);
771
5.30k
    assert(c->textsize == in_len);
772
773
5.30k
    *out_len = pd(op, out);
774
775
5.30k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
5.30k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
5.30k
    return LZO_E_OK;
787
5.30k
}
lzo1x_999_compress_internal
Line
Count
Source
532
1.68k
{
533
1.68k
    lzo_bytep op;
534
1.68k
    const lzo_bytep ii;
535
1.68k
    lzo_uint lit;
536
1.68k
    lzo_uint m_len, m_off;
537
1.68k
    LZO_COMPRESS_T cc;
538
1.68k
    LZO_COMPRESS_T * const c = &cc;
539
1.68k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.68k
    lzo_uint try_lazy;
541
1.68k
    int r;
542
543
    /* sanity check */
544
1.68k
#if defined(LZO1X)
545
1.68k
    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.68k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.68k
    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.68k
    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.68k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.68k
    if (nice_length == 0)
567
1.68k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.68k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.68k
    c->init = 0;
573
1.68k
    c->ip = c->in = in;
574
1.68k
    c->in_end = in + in_len;
575
1.68k
    c->out = out;
576
1.68k
    c->cb = cb;
577
1.68k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.68k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.68k
    op = out;
581
1.68k
    ii = c->ip;             /* point to start of literal run */
582
1.68k
    lit = 0;
583
1.68k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.68k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.68k
    if (r != 0)
587
0
        return r;
588
1.68k
    if (max_chain > 0)
589
1.68k
        swd->max_chain = max_chain;
590
1.68k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.68k
    r = find_match(c,swd,0,0);
594
1.68k
    if (r != 0)
595
0
        return r;
596
16.4M
    while (c->look > 0)
597
16.4M
    {
598
16.4M
        lzo_uint ahead;
599
16.4M
        lzo_uint max_ahead;
600
16.4M
        lzo_uint l1, l2, l3;
601
602
16.4M
        c->codesize = pd(op, out);
603
604
16.4M
        m_len = c->m_len;
605
16.4M
        m_off = c->m_off;
606
607
16.4M
        assert(c->bp == c->ip - c->look);
608
16.4M
        assert(c->bp >= in);
609
16.4M
        if (lit == 0)
610
708k
            ii = c->bp;
611
16.4M
        assert(ii + lit == c->bp);
612
16.4M
        assert(swd->b_char == *(c->bp));
613
614
16.4M
        if ( m_len < 2 ||
615
16.4M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
16.4M
#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
16.4M
            (m_len == 2 && op == out) ||
622
16.4M
#endif
623
16.4M
            (op == out && lit == 0))
624
15.5M
        {
625
            /* a literal */
626
15.5M
            m_len = 0;
627
15.5M
        }
628
871k
        else if (m_len == M2_MIN_LEN)
629
195k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
195k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
43.7k
                m_len = 0;
633
195k
        }
634
635
16.4M
        if (m_len == 0)
636
15.5M
        {
637
    /* a literal */
638
15.5M
            lit++;
639
15.5M
            swd->max_chain = max_chain;
640
15.5M
            r = find_match(c,swd,1,0);
641
15.5M
            assert(r == 0); LZO_UNUSED(r);
642
15.5M
            continue;
643
15.5M
        }
644
645
    /* a match */
646
828k
#if defined(SWD_BEST_OFF)
647
828k
        if (swd->use_best_off)
648
828k
            better_match(swd,&m_len,&m_off);
649
828k
#endif
650
828k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
828k
        ahead = 0;
655
828k
        if (try_lazy == 0 || m_len >= max_lazy)
656
16.2k
        {
657
            /* no */
658
16.2k
            l1 = 0;
659
16.2k
            max_ahead = 0;
660
16.2k
        }
661
812k
        else
662
812k
        {
663
            /* yes, try a lazy match */
664
812k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
812k
            assert(l1 > 0);
666
812k
#if 1
667
812k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
812k
        }
672
673
674
1.75M
        while (ahead < max_ahead && c->look > m_len)
675
1.04M
        {
676
1.04M
            lzo_uint lazy_match_min_gain;
677
678
1.04M
            if (m_len >= good_length)
679
91.7k
                swd->max_chain = max_chain >> 2;
680
953k
            else
681
953k
                swd->max_chain = max_chain;
682
1.04M
            r = find_match(c,swd,1,0);
683
1.04M
            ahead++;
684
685
1.04M
            assert(r == 0); LZO_UNUSED(r);
686
1.04M
            assert(c->look > 0);
687
1.04M
            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.04M
            if (c->m_len < m_len)
695
673k
                continue;
696
371k
#if 1
697
371k
            if (c->m_len == m_len && c->m_off >= m_off)
698
67.5k
                continue;
699
303k
#endif
700
303k
#if defined(SWD_BEST_OFF)
701
303k
            if (swd->use_best_off)
702
303k
                better_match(swd,&c->m_len,&c->m_off);
703
303k
#endif
704
303k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
303k
            if (l2 == 0)
706
2.04k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
301k
#if 1
714
            /* compressed-data compatibility [see above] */
715
301k
            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
301k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
301k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
122k
            {
723
122k
                c->lazy++;
724
122k
                assert_match(swd,c->m_len,c->m_off);
725
726
122k
                if (l3)
727
1.04k
                {
728
                    /* code previous run */
729
1.04k
                    op = code_run(c,op,ii,lit,ahead);
730
1.04k
                    lit = 0;
731
                    /* code shortened match */
732
1.04k
                    op = code_match(c,op,ahead,m_off);
733
1.04k
                }
734
120k
                else
735
120k
                {
736
120k
                    lit += ahead;
737
120k
                    assert(ii + lit == c->bp);
738
120k
                }
739
122k
                goto lazy_match_done;
740
122k
            }
741
301k
        }
742
743
744
706k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
706k
        op = code_run(c,op,ii,lit,m_len);
748
706k
        lit = 0;
749
750
        /* 2 - code match */
751
706k
        op = code_match(c,op,m_len,m_off);
752
706k
        swd->max_chain = max_chain;
753
706k
        r = find_match(c,swd,m_len,1+ahead);
754
706k
        assert(r == 0); LZO_UNUSED(r);
755
756
828k
lazy_match_done: ;
757
828k
    }
758
759
760
    /* store final run */
761
1.68k
    if (lit > 0)
762
1.01k
        op = STORE_RUN(c,op,ii,lit);
763
764
1.68k
#if defined(LZO_EOF_CODE)
765
1.68k
    *op++ = M4_MARKER | 1;
766
1.68k
    *op++ = 0;
767
1.68k
    *op++ = 0;
768
1.68k
#endif
769
770
1.68k
    c->codesize = pd(op, out);
771
1.68k
    assert(c->textsize == in_len);
772
773
1.68k
    *out_len = pd(op, out);
774
775
1.68k
    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.68k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.68k
    return LZO_E_OK;
787
1.68k
}
lzo1y_999_compress_internal
Line
Count
Source
532
1.65k
{
533
1.65k
    lzo_bytep op;
534
1.65k
    const lzo_bytep ii;
535
1.65k
    lzo_uint lit;
536
1.65k
    lzo_uint m_len, m_off;
537
1.65k
    LZO_COMPRESS_T cc;
538
1.65k
    LZO_COMPRESS_T * const c = &cc;
539
1.65k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.65k
    lzo_uint try_lazy;
541
1.65k
    int r;
542
543
    /* sanity check */
544
#if defined(LZO1X)
545
    LZO_COMPILE_TIME_ASSERT(LZO1X_999_MEM_COMPRESS >= SIZEOF_LZO_SWD_T)
546
#elif defined(LZO1Y)
547
1.65k
    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.65k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.65k
    if (try_lazy_parm < 0)
558
0
        try_lazy = 1;
559
    /* reduce lazy match search if we already have a match with this length */
560
1.65k
    if (good_length == 0)
561
0
        good_length = 32;
562
    /* do not try a lazy match if we already have a match with this length */
563
1.65k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.65k
    if (nice_length == 0)
567
1.65k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.65k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.65k
    c->init = 0;
573
1.65k
    c->ip = c->in = in;
574
1.65k
    c->in_end = in + in_len;
575
1.65k
    c->out = out;
576
1.65k
    c->cb = cb;
577
1.65k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.65k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.65k
    op = out;
581
1.65k
    ii = c->ip;             /* point to start of literal run */
582
1.65k
    lit = 0;
583
1.65k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.65k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.65k
    if (r != 0)
587
0
        return r;
588
1.65k
    if (max_chain > 0)
589
1.65k
        swd->max_chain = max_chain;
590
1.65k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.65k
    r = find_match(c,swd,0,0);
594
1.65k
    if (r != 0)
595
0
        return r;
596
16.9M
    while (c->look > 0)
597
16.9M
    {
598
16.9M
        lzo_uint ahead;
599
16.9M
        lzo_uint max_ahead;
600
16.9M
        lzo_uint l1, l2, l3;
601
602
16.9M
        c->codesize = pd(op, out);
603
604
16.9M
        m_len = c->m_len;
605
16.9M
        m_off = c->m_off;
606
607
16.9M
        assert(c->bp == c->ip - c->look);
608
16.9M
        assert(c->bp >= in);
609
16.9M
        if (lit == 0)
610
803k
            ii = c->bp;
611
16.9M
        assert(ii + lit == c->bp);
612
16.9M
        assert(swd->b_char == *(c->bp));
613
614
16.9M
        if ( m_len < 2 ||
615
16.9M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
16.9M
#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
16.9M
            (m_len == 2 && op == out) ||
622
16.9M
#endif
623
16.9M
            (op == out && lit == 0))
624
15.9M
        {
625
            /* a literal */
626
15.9M
            m_len = 0;
627
15.9M
        }
628
973k
        else if (m_len == M2_MIN_LEN)
629
190k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
190k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
47.1k
                m_len = 0;
633
190k
        }
634
635
16.9M
        if (m_len == 0)
636
16.0M
        {
637
    /* a literal */
638
16.0M
            lit++;
639
16.0M
            swd->max_chain = max_chain;
640
16.0M
            r = find_match(c,swd,1,0);
641
16.0M
            assert(r == 0); LZO_UNUSED(r);
642
16.0M
            continue;
643
16.0M
        }
644
645
    /* a match */
646
926k
#if defined(SWD_BEST_OFF)
647
926k
        if (swd->use_best_off)
648
926k
            better_match(swd,&m_len,&m_off);
649
926k
#endif
650
926k
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
926k
        ahead = 0;
655
926k
        if (try_lazy == 0 || m_len >= max_lazy)
656
16.2k
        {
657
            /* no */
658
16.2k
            l1 = 0;
659
16.2k
            max_ahead = 0;
660
16.2k
        }
661
910k
        else
662
910k
        {
663
            /* yes, try a lazy match */
664
910k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
910k
            assert(l1 > 0);
666
910k
#if 1
667
910k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
910k
        }
672
673
674
1.96M
        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
98.2k
                swd->max_chain = max_chain >> 2;
680
1.06M
            else
681
1.06M
                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
717k
                continue;
696
441k
#if 1
697
441k
            if (c->m_len == m_len && c->m_off >= m_off)
698
61.7k
                continue;
699
380k
#endif
700
380k
#if defined(SWD_BEST_OFF)
701
380k
            if (swd->use_best_off)
702
380k
                better_match(swd,&c->m_len,&c->m_off);
703
380k
#endif
704
380k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
380k
            if (l2 == 0)
706
1.93k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
378k
#if 1
714
            /* compressed-data compatibility [see above] */
715
378k
            l3 = (op == out) ? 0 : len_of_coded_match(ahead,m_off,lit);
716
#else
717
            l3 = len_of_coded_match(ahead,m_off,lit);
718
#endif
719
720
378k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
378k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
125k
            {
723
125k
                c->lazy++;
724
125k
                assert_match(swd,c->m_len,c->m_off);
725
726
125k
                if (l3)
727
726
                {
728
                    /* code previous run */
729
726
                    op = code_run(c,op,ii,lit,ahead);
730
726
                    lit = 0;
731
                    /* code shortened match */
732
726
                    op = code_match(c,op,ahead,m_off);
733
726
                }
734
124k
                else
735
124k
                {
736
124k
                    lit += ahead;
737
124k
                    assert(ii + lit == c->bp);
738
124k
                }
739
125k
                goto lazy_match_done;
740
125k
            }
741
378k
        }
742
743
744
801k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
801k
        op = code_run(c,op,ii,lit,m_len);
748
801k
        lit = 0;
749
750
        /* 2 - code match */
751
801k
        op = code_match(c,op,m_len,m_off);
752
801k
        swd->max_chain = max_chain;
753
801k
        r = find_match(c,swd,m_len,1+ahead);
754
801k
        assert(r == 0); LZO_UNUSED(r);
755
756
926k
lazy_match_done: ;
757
926k
    }
758
759
760
    /* store final run */
761
1.65k
    if (lit > 0)
762
949
        op = STORE_RUN(c,op,ii,lit);
763
764
1.65k
#if defined(LZO_EOF_CODE)
765
1.65k
    *op++ = M4_MARKER | 1;
766
1.65k
    *op++ = 0;
767
1.65k
    *op++ = 0;
768
1.65k
#endif
769
770
1.65k
    c->codesize = pd(op, out);
771
1.65k
    assert(c->textsize == in_len);
772
773
1.65k
    *out_len = pd(op, out);
774
775
1.65k
    if (c->cb && c->cb->nprogress)
776
0
        (*c->cb->nprogress)(c->cb, c->textsize, c->codesize, 0);
777
778
#if 0
779
    printf("%ld %ld -> %ld  %ld: %ld %ld %ld %ld %ld  %ld: %ld %ld %ld  %ld\n",
780
        (long) c->textsize, (long) in_len, (long) c->codesize,
781
        c->match_bytes, c->m1a_m, c->m1b_m, c->m2_m, c->m3_m, c->m4_m,
782
        c->lit_bytes, c->lit1_r, c->lit2_r, c->lit3_r, c->lazy);
783
#endif
784
1.65k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.65k
    return LZO_E_OK;
787
1.65k
}
lzo1z_999_compress_internal
Line
Count
Source
532
1.96k
{
533
1.96k
    lzo_bytep op;
534
1.96k
    const lzo_bytep ii;
535
1.96k
    lzo_uint lit;
536
1.96k
    lzo_uint m_len, m_off;
537
1.96k
    LZO_COMPRESS_T cc;
538
1.96k
    LZO_COMPRESS_T * const c = &cc;
539
1.96k
    lzo_swd_p const swd = (lzo_swd_p) wrkmem;
540
1.96k
    lzo_uint try_lazy;
541
1.96k
    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.96k
    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.96k
    try_lazy = (lzo_uint) try_lazy_parm;
557
1.96k
    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.96k
    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.96k
    if (max_lazy == 0)
564
0
        max_lazy = 32;
565
    /* stop searching for longer matches than this one */
566
1.96k
    if (nice_length == 0)
567
1.96k
        nice_length = 0;
568
    /* don't search more positions than this */
569
1.96k
    if (max_chain == 0)
570
0
        max_chain = SWD_MAX_CHAIN;
571
572
1.96k
    c->init = 0;
573
1.96k
    c->ip = c->in = in;
574
1.96k
    c->in_end = in + in_len;
575
1.96k
    c->out = out;
576
1.96k
    c->cb = cb;
577
1.96k
    c->m1a_m = c->m1b_m = c->m2_m = c->m3_m = c->m4_m = 0;
578
1.96k
    c->lit1_r = c->lit2_r = c->lit3_r = 0;
579
580
1.96k
    op = out;
581
1.96k
    ii = c->ip;             /* point to start of literal run */
582
1.96k
    lit = 0;
583
1.96k
    c->r1_lit = c->r1_m_len = 0;
584
585
1.96k
    r = init_match(c,swd,dict,dict_len,flags);
586
1.96k
    if (r != 0)
587
0
        return r;
588
1.96k
    if (max_chain > 0)
589
1.96k
        swd->max_chain = max_chain;
590
1.96k
    if (nice_length > 0)
591
0
        swd->nice_length = nice_length;
592
593
1.96k
    r = find_match(c,swd,0,0);
594
1.96k
    if (r != 0)
595
0
        return r;
596
18.5M
    while (c->look > 0)
597
18.5M
    {
598
18.5M
        lzo_uint ahead;
599
18.5M
        lzo_uint max_ahead;
600
18.5M
        lzo_uint l1, l2, l3;
601
602
18.5M
        c->codesize = pd(op, out);
603
604
18.5M
        m_len = c->m_len;
605
18.5M
        m_off = c->m_off;
606
607
18.5M
        assert(c->bp == c->ip - c->look);
608
18.5M
        assert(c->bp >= in);
609
18.5M
        if (lit == 0)
610
876k
            ii = c->bp;
611
18.5M
        assert(ii + lit == c->bp);
612
18.5M
        assert(swd->b_char == *(c->bp));
613
614
18.5M
        if ( m_len < 2 ||
615
18.5M
            (m_len == 2 && (m_off > M1_MAX_OFFSET || lit == 0 || lit >= 4)) ||
616
18.5M
#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
18.5M
            (m_len == 2 && op == out) ||
622
18.5M
#endif
623
18.5M
            (op == out && lit == 0))
624
17.4M
        {
625
            /* a literal */
626
17.4M
            m_len = 0;
627
17.4M
        }
628
1.05M
        else if (m_len == M2_MIN_LEN)
629
205k
        {
630
            /* compression ratio improves if we code a literal in some cases */
631
205k
            if (m_off > MX_MAX_OFFSET && lit >= 4)
632
50.5k
                m_len = 0;
633
205k
        }
634
635
18.5M
        if (m_len == 0)
636
17.5M
        {
637
    /* a literal */
638
17.5M
            lit++;
639
17.5M
            swd->max_chain = max_chain;
640
17.5M
            r = find_match(c,swd,1,0);
641
17.5M
            assert(r == 0); LZO_UNUSED(r);
642
17.5M
            continue;
643
17.5M
        }
644
645
    /* a match */
646
1.00M
#if defined(SWD_BEST_OFF)
647
1.00M
        if (swd->use_best_off)
648
1.00M
            better_match(swd,&m_len,&m_off);
649
1.00M
#endif
650
1.00M
        assert_match(swd,m_len,m_off);
651
652
653
        /* shall we try a lazy match ? */
654
1.00M
        ahead = 0;
655
1.00M
        if (try_lazy == 0 || m_len >= max_lazy)
656
17.5k
        {
657
            /* no */
658
17.5k
            l1 = 0;
659
17.5k
            max_ahead = 0;
660
17.5k
        }
661
991k
        else
662
991k
        {
663
            /* yes, try a lazy match */
664
991k
            l1 = len_of_coded_match(m_len,m_off,lit);
665
991k
            assert(l1 > 0);
666
991k
#if 1
667
991k
            max_ahead = LZO_MIN(try_lazy, l1 - 1);
668
#else
669
            max_ahead = LZO_MIN3(try_lazy, l1, m_len - 1);
670
#endif
671
991k
        }
672
673
674
2.12M
        while (ahead < max_ahead && c->look > m_len)
675
1.24M
        {
676
1.24M
            lzo_uint lazy_match_min_gain;
677
678
1.24M
            if (m_len >= good_length)
679
94.0k
                swd->max_chain = max_chain >> 2;
680
1.15M
            else
681
1.15M
                swd->max_chain = max_chain;
682
1.24M
            r = find_match(c,swd,1,0);
683
1.24M
            ahead++;
684
685
1.24M
            assert(r == 0); LZO_UNUSED(r);
686
1.24M
            assert(c->look > 0);
687
1.24M
            assert(ii + lit + ahead == c->bp);
688
689
1.24M
#if defined(LZO1Z)
690
1.24M
            if (m_off == c->last_m_off && c->m_off != c->last_m_off)
691
308k
                if (m_len >= M2_MIN_LEN && m_len <= M2_MAX_LEN)
692
3.68k
                    c->m_len = 0;
693
1.24M
#endif
694
1.24M
            if (c->m_len < m_len)
695
768k
                continue;
696
478k
#if 1
697
478k
            if (c->m_len == m_len && c->m_off >= m_off)
698
69.4k
                continue;
699
408k
#endif
700
408k
#if defined(SWD_BEST_OFF)
701
408k
            if (swd->use_best_off)
702
408k
                better_match(swd,&c->m_len,&c->m_off);
703
408k
#endif
704
408k
            l2 = len_of_coded_match(c->m_len,c->m_off,lit+ahead);
705
408k
            if (l2 == 0)
706
2.45k
                continue;
707
#if 0
708
            if (c->m_len == m_len && l2 >= l1)
709
                continue;
710
#endif
711
712
713
406k
#if 1
714
            /* compressed-data compatibility [see above] */
715
406k
            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
406k
            lazy_match_min_gain = min_gain(ahead,lit,lit+ahead,l1,l2,l3);
721
406k
            if (c->m_len >= m_len + lazy_match_min_gain)
722
135k
            {
723
135k
                c->lazy++;
724
135k
                assert_match(swd,c->m_len,c->m_off);
725
726
135k
                if (l3)
727
998
                {
728
                    /* code previous run */
729
998
                    op = code_run(c,op,ii,lit,ahead);
730
998
                    lit = 0;
731
                    /* code shortened match */
732
998
                    op = code_match(c,op,ahead,m_off);
733
998
                }
734
134k
                else
735
134k
                {
736
134k
                    lit += ahead;
737
134k
                    assert(ii + lit == c->bp);
738
134k
                }
739
135k
                goto lazy_match_done;
740
135k
            }
741
406k
        }
742
743
744
874k
        assert(ii + lit + ahead == c->bp);
745
746
        /* 1 - code run */
747
874k
        op = code_run(c,op,ii,lit,m_len);
748
874k
        lit = 0;
749
750
        /* 2 - code match */
751
874k
        op = code_match(c,op,m_len,m_off);
752
874k
        swd->max_chain = max_chain;
753
874k
        r = find_match(c,swd,m_len,1+ahead);
754
874k
        assert(r == 0); LZO_UNUSED(r);
755
756
1.00M
lazy_match_done: ;
757
1.00M
    }
758
759
760
    /* store final run */
761
1.96k
    if (lit > 0)
762
1.18k
        op = STORE_RUN(c,op,ii,lit);
763
764
1.96k
#if defined(LZO_EOF_CODE)
765
1.96k
    *op++ = M4_MARKER | 1;
766
1.96k
    *op++ = 0;
767
1.96k
    *op++ = 0;
768
1.96k
#endif
769
770
1.96k
    c->codesize = pd(op, out);
771
1.96k
    assert(c->textsize == in_len);
772
773
1.96k
    *out_len = pd(op, out);
774
775
1.96k
    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.96k
    assert(c->lit_bytes + c->match_bytes == in_len);
785
786
1.96k
    return LZO_E_OK;
787
1.96k
}
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
5.30k
{
802
5.30k
    static const struct
803
5.30k
    {
804
5.30k
        int try_lazy_parm;
805
5.30k
        lzo_uint good_length;
806
5.30k
        lzo_uint max_lazy;
807
5.30k
        lzo_uint nice_length;
808
5.30k
        lzo_uint max_chain;
809
5.30k
        lzo_uint32_t flags;
810
5.30k
    } c[9] = {
811
        /* faster compression */
812
5.30k
        {   0,     0,     0,     8,    4,   0 },
813
5.30k
        {   0,     0,     0,    16,    8,   0 },
814
5.30k
        {   0,     0,     0,    32,   16,   0 },
815
5.30k
        {   1,     4,     4,    16,   16,   0 },
816
5.30k
        {   1,     8,    16,    32,   32,   0 },
817
5.30k
        {   1,     8,    16,   128,  128,   0 },
818
5.30k
        {   2,     8,    32,   128,  256,   0 },
819
5.30k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
5.30k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
5.30k
    };
823
824
5.30k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
5.30k
    compression_level -= 1;
828
5.30k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
5.30k
                                       dict, dict_len, cb,
830
5.30k
                                       c[compression_level].try_lazy_parm,
831
5.30k
                                       c[compression_level].good_length,
832
5.30k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
5.30k
                                       0,
837
5.30k
#endif
838
5.30k
                                       c[compression_level].max_chain,
839
5.30k
                                       c[compression_level].flags);
840
5.30k
}
lzo1x_999_compress_level
Line
Count
Source
801
1.68k
{
802
1.68k
    static const struct
803
1.68k
    {
804
1.68k
        int try_lazy_parm;
805
1.68k
        lzo_uint good_length;
806
1.68k
        lzo_uint max_lazy;
807
1.68k
        lzo_uint nice_length;
808
1.68k
        lzo_uint max_chain;
809
1.68k
        lzo_uint32_t flags;
810
1.68k
    } c[9] = {
811
        /* faster compression */
812
1.68k
        {   0,     0,     0,     8,    4,   0 },
813
1.68k
        {   0,     0,     0,    16,    8,   0 },
814
1.68k
        {   0,     0,     0,    32,   16,   0 },
815
1.68k
        {   1,     4,     4,    16,   16,   0 },
816
1.68k
        {   1,     8,    16,    32,   32,   0 },
817
1.68k
        {   1,     8,    16,   128,  128,   0 },
818
1.68k
        {   2,     8,    32,   128,  256,   0 },
819
1.68k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.68k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.68k
    };
823
824
1.68k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.68k
    compression_level -= 1;
828
1.68k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.68k
                                       dict, dict_len, cb,
830
1.68k
                                       c[compression_level].try_lazy_parm,
831
1.68k
                                       c[compression_level].good_length,
832
1.68k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.68k
                                       0,
837
1.68k
#endif
838
1.68k
                                       c[compression_level].max_chain,
839
1.68k
                                       c[compression_level].flags);
840
1.68k
}
lzo1y_999_compress_level
Line
Count
Source
801
1.65k
{
802
1.65k
    static const struct
803
1.65k
    {
804
1.65k
        int try_lazy_parm;
805
1.65k
        lzo_uint good_length;
806
1.65k
        lzo_uint max_lazy;
807
1.65k
        lzo_uint nice_length;
808
1.65k
        lzo_uint max_chain;
809
1.65k
        lzo_uint32_t flags;
810
1.65k
    } c[9] = {
811
        /* faster compression */
812
1.65k
        {   0,     0,     0,     8,    4,   0 },
813
1.65k
        {   0,     0,     0,    16,    8,   0 },
814
1.65k
        {   0,     0,     0,    32,   16,   0 },
815
1.65k
        {   1,     4,     4,    16,   16,   0 },
816
1.65k
        {   1,     8,    16,    32,   32,   0 },
817
1.65k
        {   1,     8,    16,   128,  128,   0 },
818
1.65k
        {   2,     8,    32,   128,  256,   0 },
819
1.65k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.65k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.65k
    };
823
824
1.65k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.65k
    compression_level -= 1;
828
1.65k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.65k
                                       dict, dict_len, cb,
830
1.65k
                                       c[compression_level].try_lazy_parm,
831
1.65k
                                       c[compression_level].good_length,
832
1.65k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.65k
                                       0,
837
1.65k
#endif
838
1.65k
                                       c[compression_level].max_chain,
839
1.65k
                                       c[compression_level].flags);
840
1.65k
}
lzo1z_999_compress_level
Line
Count
Source
801
1.96k
{
802
1.96k
    static const struct
803
1.96k
    {
804
1.96k
        int try_lazy_parm;
805
1.96k
        lzo_uint good_length;
806
1.96k
        lzo_uint max_lazy;
807
1.96k
        lzo_uint nice_length;
808
1.96k
        lzo_uint max_chain;
809
1.96k
        lzo_uint32_t flags;
810
1.96k
    } c[9] = {
811
        /* faster compression */
812
1.96k
        {   0,     0,     0,     8,    4,   0 },
813
1.96k
        {   0,     0,     0,    16,    8,   0 },
814
1.96k
        {   0,     0,     0,    32,   16,   0 },
815
1.96k
        {   1,     4,     4,    16,   16,   0 },
816
1.96k
        {   1,     8,    16,    32,   32,   0 },
817
1.96k
        {   1,     8,    16,   128,  128,   0 },
818
1.96k
        {   2,     8,    32,   128,  256,   0 },
819
1.96k
        {   2,    32,   128, SWD_F, 2048,   1 },
820
1.96k
        {   2, SWD_F, SWD_F, SWD_F, 4096,   1 }
821
        /* max. compression */
822
1.96k
    };
823
824
1.96k
    if (compression_level < 1 || compression_level > 9)
825
0
        return LZO_E_ERROR;
826
827
1.96k
    compression_level -= 1;
828
1.96k
    return lzo1x_999_compress_internal(in, in_len, out, out_len, wrkmem,
829
1.96k
                                       dict, dict_len, cb,
830
1.96k
                                       c[compression_level].try_lazy_parm,
831
1.96k
                                       c[compression_level].good_length,
832
1.96k
                                       c[compression_level].max_lazy,
833
#if 0
834
                                       c[compression_level].nice_length,
835
#else
836
1.96k
                                       0,
837
1.96k
#endif
838
1.96k
                                       c[compression_level].max_chain,
839
1.96k
                                       c[compression_level].flags);
840
1.96k
}
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
5.30k
{
862
5.30k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
5.30k
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
5.30k
}
lzo1x_999_compress
Line
Count
Source
861
1.68k
{
862
1.68k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
1.68k
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.68k
}
lzo1y_999_compress
Line
Count
Source
861
1.65k
{
862
1.65k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
1.65k
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.65k
}
lzo1z_999_compress
Line
Count
Source
861
1.96k
{
862
1.96k
    return lzo1x_999_compress_level(in, in_len, out, out_len, wrkmem,
863
1.96k
                                    NULL, 0, (lzo_callback_p) 0, 8);
864
1.96k
}
865
866
867
/* vim:set ts=4 sw=4 et: */