| GCC Code Coverage Report | |||||||||||||||||||||
        
  | 
    |||||||||||||||||||||
| Line | Branch | Exec | Source | 
1  | 
    /* $OpenBSD: deflate.c,v 1.11 2009/10/27 23:59:31 deraadt Exp $ */  | 
    ||
2  | 
    /* deflate.c -- compress data using the deflation algorithm  | 
    ||
3  | 
    * Copyright (C) 1995-2005 Jean-loup Gailly.  | 
    ||
4  | 
    * For conditions of distribution and use, see copyright notice in zlib.h  | 
    ||
5  | 
    */  | 
    ||
6  | 
    |||
7  | 
    /*  | 
    ||
8  | 
    * ALGORITHM  | 
    ||
9  | 
    *  | 
    ||
10  | 
    * The "deflation" process depends on being able to identify portions  | 
    ||
11  | 
    * of the input text which are identical to earlier input (within a  | 
    ||
12  | 
    * sliding window trailing behind the input currently being processed).  | 
    ||
13  | 
    *  | 
    ||
14  | 
    * The most straightforward technique turns out to be the fastest for  | 
    ||
15  | 
    * most input files: try all possible matches and select the longest.  | 
    ||
16  | 
    * The key feature of this algorithm is that insertions into the string  | 
    ||
17  | 
    * dictionary are very simple and thus fast, and deletions are avoided  | 
    ||
18  | 
    * completely. Insertions are performed at each input character, whereas  | 
    ||
19  | 
    * string matches are performed only when the previous match ends. So it  | 
    ||
20  | 
    * is preferable to spend more time in matches to allow very fast string  | 
    ||
21  | 
    * insertions and avoid deletions. The matching algorithm for small  | 
    ||
22  | 
    * strings is inspired from that of Rabin & Karp. A brute force approach  | 
    ||
23  | 
    * is used to find longer strings when a small match has been found.  | 
    ||
24  | 
    * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze  | 
    ||
25  | 
    * (by Leonid Broukhis).  | 
    ||
26  | 
    * A previous version of this file used a more sophisticated algorithm  | 
    ||
27  | 
    * (by Fiala and Greene) which is guaranteed to run in linear amortized  | 
    ||
28  | 
    * time, but has a larger average cost, uses more memory and is patented.  | 
    ||
29  | 
    * However the F&G algorithm may be faster for some highly redundant  | 
    ||
30  | 
    * files if the parameter max_chain_length (described below) is too large.  | 
    ||
31  | 
    *  | 
    ||
32  | 
    * ACKNOWLEDGEMENTS  | 
    ||
33  | 
    *  | 
    ||
34  | 
    * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and  | 
    ||
35  | 
    * I found it in 'freeze' written by Leonid Broukhis.  | 
    ||
36  | 
    * Thanks to many people for bug reports and testing.  | 
    ||
37  | 
    *  | 
    ||
38  | 
    * REFERENCES  | 
    ||
39  | 
    *  | 
    ||
40  | 
    * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".  | 
    ||
41  | 
    * Available in http://www.ietf.org/rfc/rfc1951.txt  | 
    ||
42  | 
    *  | 
    ||
43  | 
    * A description of the Rabin and Karp algorithm is given in the book  | 
    ||
44  | 
    * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.  | 
    ||
45  | 
    *  | 
    ||
46  | 
    * Fiala,E.R., and Greene,D.H.  | 
    ||
47  | 
    * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595  | 
    ||
48  | 
    *  | 
    ||
49  | 
    */  | 
    ||
50  | 
    |||
51  | 
    |||
52  | 
    #include "deflate.h"  | 
    ||
53  | 
    |||
54  | 
    /*  | 
    ||
55  | 
    If you use the zlib library in a product, an acknowledgment is welcome  | 
    ||
56  | 
    in the documentation of your product. If for some reason you cannot  | 
    ||
57  | 
    include such an acknowledgment, I would appreciate that you keep this  | 
    ||
58  | 
    copyright string in the executable of your product.  | 
    ||
59  | 
    */  | 
    ||
60  | 
    |||
61  | 
    /* ===========================================================================  | 
    ||
62  | 
    * Function prototypes.  | 
    ||
63  | 
    */  | 
    ||
64  | 
    typedef enum { | 
    ||
65  | 
    need_more, /* block not completed, need more input or more output */  | 
    ||
66  | 
    block_done, /* block flush performed */  | 
    ||
67  | 
    finish_started, /* finish started, need only more output at next deflate */  | 
    ||
68  | 
    finish_done /* finish done, accept no more input or output */  | 
    ||
69  | 
    } block_state;  | 
    ||
70  | 
    |||
71  | 
    typedef block_state (*compress_func) OF((deflate_state *s, int flush));  | 
    ||
72  | 
    /* Compression function. Returns the block state after the call. */  | 
    ||
73  | 
    |||
74  | 
    local void fill_window OF((deflate_state *s));  | 
    ||
75  | 
    local block_state deflate_stored OF((deflate_state *s, int flush));  | 
    ||
76  | 
    local block_state deflate_fast OF((deflate_state *s, int flush));  | 
    ||
77  | 
    #ifndef FASTEST  | 
    ||
78  | 
    local block_state deflate_slow OF((deflate_state *s, int flush));  | 
    ||
79  | 
    #endif  | 
    ||
80  | 
    local void lm_init OF((deflate_state *s));  | 
    ||
81  | 
    local void putShortMSB OF((deflate_state *s, uInt b));  | 
    ||
82  | 
    local void flush_pending OF((z_streamp strm));  | 
    ||
83  | 
    local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));  | 
    ||
84  | 
    #ifndef FASTEST  | 
    ||
85  | 
    #ifdef ASMV  | 
    ||
86  | 
    void match_init OF((void)); /* asm code initialization */  | 
    ||
87  | 
    uInt longest_match OF((deflate_state *s, IPos cur_match));  | 
    ||
88  | 
    #else  | 
    ||
89  | 
    local uInt longest_match OF((deflate_state *s, IPos cur_match));  | 
    ||
90  | 
    #endif  | 
    ||
91  | 
    #endif  | 
    ||
92  | 
    local uInt longest_match_fast OF((deflate_state *s, IPos cur_match));  | 
    ||
93  | 
    |||
94  | 
    #ifdef DEBUG  | 
    ||
95  | 
    local void check_match OF((deflate_state *s, IPos start, IPos match,  | 
    ||
96  | 
    int length));  | 
    ||
97  | 
    #endif  | 
    ||
98  | 
    |||
99  | 
    /* ===========================================================================  | 
    ||
100  | 
    * Local data  | 
    ||
101  | 
    */  | 
    ||
102  | 
    |||
103  | 
    #define NIL 0  | 
    ||
104  | 
    /* Tail of hash chains */  | 
    ||
105  | 
    |||
106  | 
    #ifndef TOO_FAR  | 
    ||
107  | 
    # define TOO_FAR 4096  | 
    ||
108  | 
    #endif  | 
    ||
109  | 
    /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */  | 
    ||
110  | 
    |||
111  | 
    #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)  | 
    ||
112  | 
    /* Minimum amount of lookahead, except at the end of the input file.  | 
    ||
113  | 
    * See deflate.c for comments about the MIN_MATCH+1.  | 
    ||
114  | 
    */  | 
    ||
115  | 
    |||
116  | 
    /* Values for max_lazy_match, good_match and max_chain_length, depending on  | 
    ||
117  | 
    * the desired pack level (0..9). The values given below have been tuned to  | 
    ||
118  | 
    * exclude worst case performance for pathological files. Better values may be  | 
    ||
119  | 
    * found for specific files.  | 
    ||
120  | 
    */  | 
    ||
121  | 
    typedef struct config_s { | 
    ||
122  | 
    ush good_length; /* reduce lazy search above this match length */  | 
    ||
123  | 
    ush max_lazy; /* do not perform lazy search above this match length */  | 
    ||
124  | 
    ush nice_length; /* quit search above this match length */  | 
    ||
125  | 
    ush max_chain;  | 
    ||
126  | 
    compress_func func;  | 
    ||
127  | 
    } config;  | 
    ||
128  | 
    |||
129  | 
    #ifdef FASTEST  | 
    ||
130  | 
    local const config configuration_table[2] = { | 
    ||
131  | 
    /* good lazy nice chain */  | 
    ||
132  | 
    /* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */ | 
    ||
133  | 
    /* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */ | 
    ||
134  | 
    #else  | 
    ||
135  | 
    local const config configuration_table[10] = { | 
    ||
136  | 
    /* good lazy nice chain */  | 
    ||
137  | 
    /* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */ | 
    ||
138  | 
    /* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */ | 
    ||
139  | 
    /* 2 */ {4,    5, 16,    8, deflate_fast}, | 
    ||
140  | 
    /* 3 */ {4,    6, 32,   32, deflate_fast}, | 
    ||
141  | 
    |||
142  | 
    /* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */ | 
    ||
143  | 
    /* 5 */ {8,   16, 32,   32, deflate_slow}, | 
    ||
144  | 
    /* 6 */ {8,   16, 128, 128, deflate_slow}, | 
    ||
145  | 
    /* 7 */ {8,   32, 128, 256, deflate_slow}, | 
    ||
146  | 
    /* 8 */ {32, 128, 258, 1024, deflate_slow}, | 
    ||
147  | 
    /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ | 
    ||
148  | 
    #endif  | 
    ||
149  | 
    |||
150  | 
    /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4  | 
    ||
151  | 
    * For deflate_fast() (levels <= 3) good is ignored and lazy has a different  | 
    ||
152  | 
    * meaning.  | 
    ||
153  | 
    */  | 
    ||
154  | 
    |||
155  | 
    #define EQUAL 0  | 
    ||
156  | 
    /* result of memcmp for equal strings */  | 
    ||
157  | 
    |||
158  | 
    #ifndef NO_DUMMY_DECL  | 
    ||
159  | 
    struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ | 
    ||
160  | 
    #endif  | 
    ||
161  | 
    |||
162  | 
    /* ===========================================================================  | 
    ||
163  | 
    * Update a hash value with the given input byte  | 
    ||
164  | 
    * IN assertion: all calls to UPDATE_HASH are made with consecutive  | 
    ||
165  | 
    * input characters, so that a running hash key can be computed from the  | 
    ||
166  | 
    * previous key instead of complete recalculation each time.  | 
    ||
167  | 
    */  | 
    ||
168  | 
    #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)  | 
    ||
169  | 
    |||
170  | 
    |||
171  | 
    /* ===========================================================================  | 
    ||
172  | 
    * Insert string str in the dictionary and set match_head to the previous head  | 
    ||
173  | 
    * of the hash chain (the most recent string with same hash key). Return  | 
    ||
174  | 
    * the previous length of the hash chain.  | 
    ||
175  | 
    * If this file is compiled with -DFASTEST, the compression level is forced  | 
    ||
176  | 
    * to 1, and no hash chains are maintained.  | 
    ||
177  | 
    * IN assertion: all calls to INSERT_STRING are made with consecutive  | 
    ||
178  | 
    * input characters and the first MIN_MATCH bytes of str are valid  | 
    ||
179  | 
    * (except for the last MIN_MATCH-1 bytes of the input file).  | 
    ||
180  | 
    */  | 
    ||
181  | 
    #ifdef FASTEST  | 
    ||
182  | 
    #define INSERT_STRING(s, str, match_head) \  | 
    ||
183  | 
    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \  | 
    ||
184  | 
    match_head = s->head[s->ins_h], \  | 
    ||
185  | 
    s->head[s->ins_h] = (Pos)(str))  | 
    ||
186  | 
    #else  | 
    ||
187  | 
    #define INSERT_STRING(s, str, match_head) \  | 
    ||
188  | 
    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \  | 
    ||
189  | 
    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \  | 
    ||
190  | 
    s->head[s->ins_h] = (Pos)(str))  | 
    ||
191  | 
    #endif  | 
    ||
192  | 
    |||
193  | 
    /* ===========================================================================  | 
    ||
194  | 
    * Initialize the hash table (avoiding 64K overflow for 16 bit systems).  | 
    ||
195  | 
    * prev[] will be initialized on the fly.  | 
    ||
196  | 
    */  | 
    ||
197  | 
    #define CLEAR_HASH(s) \  | 
    ||
198  | 
    s->head[s->hash_size-1] = NIL; \  | 
    ||
199  | 
    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));  | 
    ||
200  | 
    |||
201  | 
    /* ========================================================================= */  | 
    ||
202  | 
    int ZEXPORT deflateInit_(strm, level, version, stream_size)  | 
    ||
203  | 
    z_streamp strm;  | 
    ||
204  | 
    int level;  | 
    ||
205  | 
    const char *version;  | 
    ||
206  | 
    int stream_size;  | 
    ||
207  | 
    { | 
    ||
208  | 
    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,  | 
    ||
209  | 
    Z_DEFAULT_STRATEGY, version, stream_size);  | 
    ||
210  | 
    /* To do: ignore strm->next_in if we use it as window */  | 
    ||
211  | 
    }  | 
    ||
212  | 
    |||
213  | 
    /* ========================================================================= */  | 
    ||
214  | 
    int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,  | 
    ||
215  | 
    version, stream_size)  | 
    ||
216  | 
    z_streamp strm;  | 
    ||
217  | 
    int level;  | 
    ||
218  | 
    int method;  | 
    ||
219  | 
    int windowBits;  | 
    ||
220  | 
    int memLevel;  | 
    ||
221  | 
    int strategy;  | 
    ||
222  | 
    const char *version;  | 
    ||
223  | 
    int stream_size;  | 
    ||
224  | 
    { | 
    ||
225  | 
    deflate_state *s;  | 
    ||
226  | 
    int wrap = 1;  | 
    ||
227  | 
    static const char my_version[] = ZLIB_VERSION;  | 
    ||
228  | 
    |||
229  | 
    ushf *overlay;  | 
    ||
230  | 
    /* We overlay pending_buf and d_buf+l_buf. This works since the average  | 
    ||
231  | 
    * output size for (length,distance) codes is <= 24 bits.  | 
    ||
232  | 
    */  | 
    ||
233  | 
    |||
234  | 
    ✓✗✓✗ ✗✓  | 
    104  | 
    if (version == Z_NULL || version[0] != my_version[0] ||  | 
    
235  | 
    26  | 
            stream_size != sizeof(z_stream)) { | 
    |
236  | 
    return Z_VERSION_ERROR;  | 
    ||
237  | 
    }  | 
    ||
238  | 
    ✗✓ | 26  | 
    if (strm == Z_NULL) return Z_STREAM_ERROR;  | 
    
239  | 
    |||
240  | 
    26  | 
    strm->msg = Z_NULL;  | 
    |
241  | 
    ✓✗ | 26  | 
        if (strm->zalloc == (alloc_func)0) { | 
    
242  | 
    26  | 
    strm->zalloc = zcalloc;  | 
    |
243  | 
    26  | 
    strm->opaque = (voidpf)0;  | 
    |
244  | 
    26  | 
    }  | 
    |
245  | 
    ✓✗ | 52  | 
    if (strm->zfree == (free_func)0) strm->zfree = zcfree;  | 
    
246  | 
    |||
247  | 
    #ifdef FASTEST  | 
    ||
248  | 
    if (level != 0) level = 1;  | 
    ||
249  | 
    #else  | 
    ||
250  | 
    ✗✓ | 26  | 
    if (level == Z_DEFAULT_COMPRESSION) level = 6;  | 
    
251  | 
    #endif  | 
    ||
252  | 
    |||
253  | 
    ✓✗ | 26  | 
        if (windowBits < 0) { /* suppress zlib wrapper */ | 
    
254  | 
    wrap = 0;  | 
    ||
255  | 
    26  | 
    windowBits = -windowBits;  | 
    |
256  | 
    26  | 
    }  | 
    |
257  | 
    #ifdef GZIP  | 
    ||
258  | 
        else if (windowBits > 15) { | 
    ||
259  | 
    wrap = 2; /* write gzip wrapper instead */  | 
    ||
260  | 
    windowBits -= 16;  | 
    ||
261  | 
    }  | 
    ||
262  | 
    #endif  | 
    ||
263  | 
    ✗✓ | 182  | 
    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||  | 
    
264  | 
    104  | 
    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||  | 
    |
265  | 
    52  | 
            strategy < 0 || strategy > Z_FIXED) { | 
    |
266  | 
    return Z_STREAM_ERROR;  | 
    ||
267  | 
    }  | 
    ||
268  | 
    ✗✓ | 26  | 
    if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */  | 
    
269  | 
    26  | 
    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));  | 
    |
270  | 
    ✗✓ | 26  | 
    if (s == Z_NULL) return Z_MEM_ERROR;  | 
    
271  | 
    26  | 
    strm->state = (struct internal_state FAR *)s;  | 
    |
272  | 
    26  | 
    s->strm = strm;  | 
    |
273  | 
    |||
274  | 
    26  | 
    s->wrap = wrap;  | 
    |
275  | 
    26  | 
    s->gzhead = Z_NULL;  | 
    |
276  | 
    26  | 
    s->w_bits = windowBits;  | 
    |
277  | 
    26  | 
    s->w_size = 1 << s->w_bits;  | 
    |
278  | 
    26  | 
    s->w_mask = s->w_size - 1;  | 
    |
279  | 
    |||
280  | 
    26  | 
    s->hash_bits = memLevel + 7;  | 
    |
281  | 
    26  | 
    s->hash_size = 1 << s->hash_bits;  | 
    |
282  | 
    26  | 
    s->hash_mask = s->hash_size - 1;  | 
    |
283  | 
    26  | 
    s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);  | 
    |
284  | 
    |||
285  | 
    26  | 
    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));  | 
    |
286  | 
    26  | 
    s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));  | 
    |
287  | 
    26  | 
    s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));  | 
    |
288  | 
    |||
289  | 
    26  | 
    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */  | 
    |
290  | 
    |||
291  | 
    26  | 
    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);  | 
    |
292  | 
    26  | 
    s->pending_buf = (uchf *) overlay;  | 
    |
293  | 
    26  | 
    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);  | 
    |
294  | 
    |||
295  | 
    ✓✗✓✗ ✓✗✗✓  | 
    104  | 
    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||  | 
    
296  | 
    26  | 
            s->pending_buf == Z_NULL) { | 
    |
297  | 
    s->status = FINISH_STATE;  | 
    ||
298  | 
    strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);  | 
    ||
299  | 
    deflateEnd (strm);  | 
    ||
300  | 
    return Z_MEM_ERROR;  | 
    ||
301  | 
    }  | 
    ||
302  | 
    26  | 
    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);  | 
    |
303  | 
    26  | 
    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;  | 
    |
304  | 
    |||
305  | 
    26  | 
    s->level = level;  | 
    |
306  | 
    26  | 
    s->strategy = strategy;  | 
    |
307  | 
    26  | 
    s->method = (Byte)method;  | 
    |
308  | 
    |||
309  | 
    26  | 
    return deflateReset(strm);  | 
    |
310  | 
    26  | 
    }  | 
    |
311  | 
    |||
312  | 
    /* ========================================================================= */  | 
    ||
313  | 
    int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)  | 
    ||
314  | 
    z_streamp strm;  | 
    ||
315  | 
    const Bytef *dictionary;  | 
    ||
316  | 
    uInt dictLength;  | 
    ||
317  | 
    { | 
    ||
318  | 
    deflate_state *s;  | 
    ||
319  | 
    uInt length = dictLength;  | 
    ||
320  | 
    uInt n;  | 
    ||
321  | 
    IPos hash_head = 0;  | 
    ||
322  | 
    |||
323  | 
    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||  | 
    ||
324  | 
    strm->state->wrap == 2 ||  | 
    ||
325  | 
    (strm->state->wrap == 1 && strm->state->status != INIT_STATE))  | 
    ||
326  | 
    return Z_STREAM_ERROR;  | 
    ||
327  | 
    |||
328  | 
    s = strm->state;  | 
    ||
329  | 
    if (s->wrap)  | 
    ||
330  | 
    strm->adler = adler32(strm->adler, dictionary, dictLength);  | 
    ||
331  | 
    |||
332  | 
    if (length < MIN_MATCH) return Z_OK;  | 
    ||
333  | 
        if (length > MAX_DIST(s)) { | 
    ||
334  | 
    length = MAX_DIST(s);  | 
    ||
335  | 
    dictionary += dictLength - length; /* use the tail of the dictionary */  | 
    ||
336  | 
    }  | 
    ||
337  | 
    zmemcpy(s->window, dictionary, length);  | 
    ||
338  | 
    s->strstart = length;  | 
    ||
339  | 
    s->block_start = (long)length;  | 
    ||
340  | 
    |||
341  | 
    /* Insert all strings in the hash table (except for the last two bytes).  | 
    ||
342  | 
    * s->lookahead stays null, so s->ins_h will be recomputed at the next  | 
    ||
343  | 
    * call of fill_window.  | 
    ||
344  | 
    */  | 
    ||
345  | 
    s->ins_h = s->window[0];  | 
    ||
346  | 
    UPDATE_HASH(s, s->ins_h, s->window[1]);  | 
    ||
347  | 
        for (n = 0; n <= length - MIN_MATCH; n++) { | 
    ||
348  | 
    INSERT_STRING(s, n, hash_head);  | 
    ||
349  | 
    }  | 
    ||
350  | 
    if (hash_head) hash_head = 0; /* to make compiler happy */  | 
    ||
351  | 
    return Z_OK;  | 
    ||
352  | 
    }  | 
    ||
353  | 
    |||
354  | 
    /* ========================================================================= */  | 
    ||
355  | 
    int ZEXPORT deflateReset (strm)  | 
    ||
356  | 
    z_streamp strm;  | 
    ||
357  | 
    { | 
    ||
358  | 
    deflate_state *s;  | 
    ||
359  | 
    |||
360  | 
    ✓✗✓✗ ✗✓  | 
    104  | 
    if (strm == Z_NULL || strm->state == Z_NULL ||  | 
    
361  | 
    ✓✗ | 52  | 
            strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { | 
    
362  | 
    return Z_STREAM_ERROR;  | 
    ||
363  | 
    }  | 
    ||
364  | 
    |||
365  | 
    26  | 
    strm->total_in = strm->total_out = 0;  | 
    |
366  | 
    26  | 
    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */  | 
    |
367  | 
    26  | 
    strm->data_type = Z_UNKNOWN;  | 
    |
368  | 
    |||
369  | 
    26  | 
    s = (deflate_state *)strm->state;  | 
    |
370  | 
    26  | 
    s->pending = 0;  | 
    |
371  | 
    26  | 
    s->pending_out = s->pending_buf;  | 
    |
372  | 
    |||
373  | 
    ✗✓ | 26  | 
        if (s->wrap < 0) { | 
    
374  | 
    s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */  | 
    ||
375  | 
    }  | 
    ||
376  | 
    26  | 
    s->status = s->wrap ? INIT_STATE : BUSY_STATE;  | 
    |
377  | 
    26  | 
    strm->adler =  | 
    |
378  | 
    #ifdef GZIP  | 
    ||
379  | 
    ✗✓ | 78  | 
    s->wrap == 2 ? crc32(0L, Z_NULL, 0) :  | 
    
380  | 
    #endif  | 
    ||
381  | 
    26  | 
    adler32(0L, Z_NULL, 0);  | 
    |
382  | 
    26  | 
    s->last_flush = Z_NO_FLUSH;  | 
    |
383  | 
    |||
384  | 
    26  | 
    _tr_init(s);  | 
    |
385  | 
    26  | 
    lm_init(s);  | 
    |
386  | 
    |||
387  | 
    26  | 
    return Z_OK;  | 
    |
388  | 
    26  | 
    }  | 
    |
389  | 
    |||
390  | 
    /* ========================================================================= */  | 
    ||
391  | 
    int ZEXPORT deflateSetHeader (strm, head)  | 
    ||
392  | 
    z_streamp strm;  | 
    ||
393  | 
    gz_headerp head;  | 
    ||
394  | 
    { | 
    ||
395  | 
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;  | 
    ||
396  | 
    if (strm->state->wrap != 2) return Z_STREAM_ERROR;  | 
    ||
397  | 
    strm->state->gzhead = head;  | 
    ||
398  | 
    return Z_OK;  | 
    ||
399  | 
    }  | 
    ||
400  | 
    |||
401  | 
    /* ========================================================================= */  | 
    ||
402  | 
    int ZEXPORT deflatePrime (strm, bits, value)  | 
    ||
403  | 
    z_streamp strm;  | 
    ||
404  | 
    int bits;  | 
    ||
405  | 
    int value;  | 
    ||
406  | 
    { | 
    ||
407  | 
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;  | 
    ||
408  | 
    strm->state->bi_valid = bits;  | 
    ||
409  | 
    strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));  | 
    ||
410  | 
    return Z_OK;  | 
    ||
411  | 
    }  | 
    ||
412  | 
    |||
413  | 
    /* ========================================================================= */  | 
    ||
414  | 
    int ZEXPORT deflateParams(strm, level, strategy)  | 
    ||
415  | 
    z_streamp strm;  | 
    ||
416  | 
    int level;  | 
    ||
417  | 
    int strategy;  | 
    ||
418  | 
    { | 
    ||
419  | 
    deflate_state *s;  | 
    ||
420  | 
    compress_func func;  | 
    ||
421  | 
    int err = Z_OK;  | 
    ||
422  | 
    |||
423  | 
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;  | 
    ||
424  | 
    s = strm->state;  | 
    ||
425  | 
    |||
426  | 
    #ifdef FASTEST  | 
    ||
427  | 
    if (level != 0) level = 1;  | 
    ||
428  | 
    #else  | 
    ||
429  | 
    if (level == Z_DEFAULT_COMPRESSION) level = 6;  | 
    ||
430  | 
    #endif  | 
    ||
431  | 
        if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { | 
    ||
432  | 
    return Z_STREAM_ERROR;  | 
    ||
433  | 
    }  | 
    ||
434  | 
    func = configuration_table[s->level].func;  | 
    ||
435  | 
    |||
436  | 
        if (func != configuration_table[level].func && strm->total_in != 0) { | 
    ||
437  | 
    /* Flush the last buffer: */  | 
    ||
438  | 
    err = deflate(strm, Z_PARTIAL_FLUSH);  | 
    ||
439  | 
    }  | 
    ||
440  | 
        if (s->level != level) { | 
    ||
441  | 
    s->level = level;  | 
    ||
442  | 
    s->max_lazy_match = configuration_table[level].max_lazy;  | 
    ||
443  | 
    s->good_match = configuration_table[level].good_length;  | 
    ||
444  | 
    s->nice_match = configuration_table[level].nice_length;  | 
    ||
445  | 
    s->max_chain_length = configuration_table[level].max_chain;  | 
    ||
446  | 
    }  | 
    ||
447  | 
    s->strategy = strategy;  | 
    ||
448  | 
    return err;  | 
    ||
449  | 
    }  | 
    ||
450  | 
    |||
451  | 
    /* ========================================================================= */  | 
    ||
452  | 
    int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)  | 
    ||
453  | 
    z_streamp strm;  | 
    ||
454  | 
    int good_length;  | 
    ||
455  | 
    int max_lazy;  | 
    ||
456  | 
    int nice_length;  | 
    ||
457  | 
    int max_chain;  | 
    ||
458  | 
    { | 
    ||
459  | 
    deflate_state *s;  | 
    ||
460  | 
    |||
461  | 
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;  | 
    ||
462  | 
    s = strm->state;  | 
    ||
463  | 
    s->good_match = good_length;  | 
    ||
464  | 
    s->max_lazy_match = max_lazy;  | 
    ||
465  | 
    s->nice_match = nice_length;  | 
    ||
466  | 
    s->max_chain_length = max_chain;  | 
    ||
467  | 
    return Z_OK;  | 
    ||
468  | 
    }  | 
    ||
469  | 
    |||
470  | 
    /* =========================================================================  | 
    ||
471  | 
    * For the default windowBits of 15 and memLevel of 8, this function returns  | 
    ||
472  | 
    * a close to exact, as well as small, upper bound on the compressed size.  | 
    ||
473  | 
    * They are coded as constants here for a reason--if the #define's are  | 
    ||
474  | 
    * changed, then this function needs to be changed as well. The return  | 
    ||
475  | 
    * value for 15 and 8 only works for those exact settings.  | 
    ||
476  | 
    *  | 
    ||
477  | 
    * For any setting other than those defaults for windowBits and memLevel,  | 
    ||
478  | 
    * the value returned is a conservative worst case for the maximum expansion  | 
    ||
479  | 
    * resulting from using fixed blocks instead of stored blocks, which deflate  | 
    ||
480  | 
    * can emit on compressed data for some combinations of the parameters.  | 
    ||
481  | 
    *  | 
    ||
482  | 
    * This function could be more sophisticated to provide closer upper bounds  | 
    ||
483  | 
    * for every combination of windowBits and memLevel, as well as wrap.  | 
    ||
484  | 
    * But even the conservative upper bound of about 14% expansion does not  | 
    ||
485  | 
    * seem onerous for output buffer allocation.  | 
    ||
486  | 
    */  | 
    ||
487  | 
    uLong ZEXPORT deflateBound(strm, sourceLen)  | 
    ||
488  | 
    z_streamp strm;  | 
    ||
489  | 
    uLong sourceLen;  | 
    ||
490  | 
    { | 
    ||
491  | 
    deflate_state *s;  | 
    ||
492  | 
    uLong destLen;  | 
    ||
493  | 
    |||
494  | 
    /* conservative upper bound */  | 
    ||
495  | 
    destLen = sourceLen +  | 
    ||
496  | 
    ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11;  | 
    ||
497  | 
    |||
498  | 
    /* if can't get parameters, return conservative bound */  | 
    ||
499  | 
    if (strm == Z_NULL || strm->state == Z_NULL)  | 
    ||
500  | 
    return destLen;  | 
    ||
501  | 
    |||
502  | 
    /* if not default parameters, return conservative bound */  | 
    ||
503  | 
    s = strm->state;  | 
    ||
504  | 
    if (s->w_bits != 15 || s->hash_bits != 8 + 7)  | 
    ||
505  | 
    return destLen;  | 
    ||
506  | 
    |||
507  | 
    /* default settings: return tight bound for that case */  | 
    ||
508  | 
    return compressBound(sourceLen);  | 
    ||
509  | 
    }  | 
    ||
510  | 
    |||
511  | 
    /* =========================================================================  | 
    ||
512  | 
    * Put a short in the pending buffer. The 16-bit value is put in MSB order.  | 
    ||
513  | 
    * IN assertion: the stream state is correct and there is enough room in  | 
    ||
514  | 
    * pending_buf.  | 
    ||
515  | 
    */  | 
    ||
516  | 
    local void putShortMSB (s, b)  | 
    ||
517  | 
    deflate_state *s;  | 
    ||
518  | 
    uInt b;  | 
    ||
519  | 
    { | 
    ||
520  | 
    put_byte(s, (Byte)(b >> 8));  | 
    ||
521  | 
    put_byte(s, (Byte)(b & 0xff));  | 
    ||
522  | 
    }  | 
    ||
523  | 
    |||
524  | 
    /* =========================================================================  | 
    ||
525  | 
    * Flush as much pending output as possible. All deflate() output goes  | 
    ||
526  | 
    * through this function so some applications may wish to modify it  | 
    ||
527  | 
    * to avoid allocating a large strm->next_out buffer and copying into it.  | 
    ||
528  | 
    * (See also read_buf()).  | 
    ||
529  | 
    */  | 
    ||
530  | 
    local void flush_pending(strm)  | 
    ||
531  | 
    z_streamp strm;  | 
    ||
532  | 
    { | 
    ||
533  | 
    52  | 
    unsigned len = strm->state->pending;  | 
    |
534  | 
    |||
535  | 
    ✗✓ | 26  | 
    if (len > strm->avail_out) len = strm->avail_out;  | 
    
536  | 
    ✗✓ | 26  | 
    if (len == 0) return;  | 
    
537  | 
    |||
538  | 
    26  | 
    zmemcpy(strm->next_out, strm->state->pending_out, len);  | 
    |
539  | 
    26  | 
    strm->next_out += len;  | 
    |
540  | 
    26  | 
    strm->state->pending_out += len;  | 
    |
541  | 
    26  | 
    strm->total_out += len;  | 
    |
542  | 
    26  | 
    strm->avail_out -= len;  | 
    |
543  | 
    26  | 
    strm->state->pending -= len;  | 
    |
544  | 
    ✓✗ | 26  | 
        if (strm->state->pending == 0) { | 
    
545  | 
    26  | 
    strm->state->pending_out = strm->state->pending_buf;  | 
    |
546  | 
    26  | 
    }  | 
    |
547  | 
    52  | 
    }  | 
    |
548  | 
    |||
549  | 
    /* ========================================================================= */  | 
    ||
550  | 
    int ZEXPORT deflate (strm, flush)  | 
    ||
551  | 
    z_streamp strm;  | 
    ||
552  | 
    int flush;  | 
    ||
553  | 
    { | 
    ||
554  | 
    int old_flush; /* value of flush param for previous deflate call */  | 
    ||
555  | 
    deflate_state *s;  | 
    ||
556  | 
    |||
557  | 
    ✓✗✗✓ | 
    275  | 
    if (strm == Z_NULL || strm->state == Z_NULL ||  | 
    
558  | 
    110  | 
            flush > Z_FINISH || flush < 0) { | 
    |
559  | 
    return Z_STREAM_ERROR;  | 
    ||
560  | 
    }  | 
    ||
561  | 
    s = strm->state;  | 
    ||
562  | 
    |||
563  | 
    ✓✗ | 55  | 
    if (strm->next_out == Z_NULL ||  | 
    
564  | 
    ✗✓✗✗ | 
    55  | 
    (strm->next_in == Z_NULL && strm->avail_in != 0) ||  | 
    
565  | 
    ✗✓ | 55  | 
            (s->status == FINISH_STATE && flush != Z_FINISH)) { | 
    
566  | 
    ERR_RETURN(strm, Z_STREAM_ERROR);  | 
    ||
567  | 
    }  | 
    ||
568  | 
    ✗✓ | 55  | 
    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);  | 
    
569  | 
    |||
570  | 
    55  | 
    s->strm = strm; /* just in case */  | 
    |
571  | 
    55  | 
    old_flush = s->last_flush;  | 
    |
572  | 
    55  | 
    s->last_flush = flush;  | 
    |
573  | 
    |||
574  | 
    /* Write the header */  | 
    ||
575  | 
    ✗✓ | 55  | 
        if (s->status == INIT_STATE) { | 
    
576  | 
    #ifdef GZIP  | 
    ||
577  | 
            if (s->wrap == 2) { | 
    ||
578  | 
    strm->adler = crc32(0L, Z_NULL, 0);  | 
    ||
579  | 
    put_byte(s, 31);  | 
    ||
580  | 
    put_byte(s, 139);  | 
    ||
581  | 
    put_byte(s, 8);  | 
    ||
582  | 
                if (s->gzhead == NULL) { | 
    ||
583  | 
    put_byte(s, 0);  | 
    ||
584  | 
    put_byte(s, 0);  | 
    ||
585  | 
    put_byte(s, 0);  | 
    ||
586  | 
    put_byte(s, 0);  | 
    ||
587  | 
    put_byte(s, 0);  | 
    ||
588  | 
    put_byte(s, s->level == 9 ? 2 :  | 
    ||
589  | 
    (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?  | 
    ||
590  | 
    4 : 0));  | 
    ||
591  | 
    put_byte(s, OS_CODE);  | 
    ||
592  | 
    s->status = BUSY_STATE;  | 
    ||
593  | 
    }  | 
    ||
594  | 
                else { | 
    ||
595  | 
    put_byte(s, (s->gzhead->text ? 1 : 0) +  | 
    ||
596  | 
    (s->gzhead->hcrc ? 2 : 0) +  | 
    ||
597  | 
    (s->gzhead->extra == Z_NULL ? 0 : 4) +  | 
    ||
598  | 
    (s->gzhead->name == Z_NULL ? 0 : 8) +  | 
    ||
599  | 
    (s->gzhead->comment == Z_NULL ? 0 : 16)  | 
    ||
600  | 
    );  | 
    ||
601  | 
    put_byte(s, (Byte)(s->gzhead->time & 0xff));  | 
    ||
602  | 
    put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));  | 
    ||
603  | 
    put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));  | 
    ||
604  | 
    put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));  | 
    ||
605  | 
    put_byte(s, s->level == 9 ? 2 :  | 
    ||
606  | 
    (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?  | 
    ||
607  | 
    4 : 0));  | 
    ||
608  | 
    put_byte(s, s->gzhead->os & 0xff);  | 
    ||
609  | 
                    if (s->gzhead->extra != NULL) { | 
    ||
610  | 
    put_byte(s, s->gzhead->extra_len & 0xff);  | 
    ||
611  | 
    put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);  | 
    ||
612  | 
    }  | 
    ||
613  | 
    if (s->gzhead->hcrc)  | 
    ||
614  | 
    strm->adler = crc32(strm->adler, s->pending_buf,  | 
    ||
615  | 
    s->pending);  | 
    ||
616  | 
    s->gzindex = 0;  | 
    ||
617  | 
    s->status = EXTRA_STATE;  | 
    ||
618  | 
    }  | 
    ||
619  | 
    }  | 
    ||
620  | 
    else  | 
    ||
621  | 
    #endif  | 
    ||
622  | 
            { | 
    ||
623  | 
    uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;  | 
    ||
624  | 
    uInt level_flags;  | 
    ||
625  | 
    |||
626  | 
    if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)  | 
    ||
627  | 
    level_flags = 0;  | 
    ||
628  | 
    else if (s->level < 6)  | 
    ||
629  | 
    level_flags = 1;  | 
    ||
630  | 
    else if (s->level == 6)  | 
    ||
631  | 
    level_flags = 2;  | 
    ||
632  | 
    else  | 
    ||
633  | 
    level_flags = 3;  | 
    ||
634  | 
    header |= (level_flags << 6);  | 
    ||
635  | 
    if (s->strstart != 0) header |= PRESET_DICT;  | 
    ||
636  | 
    header += 31 - (header % 31);  | 
    ||
637  | 
    |||
638  | 
    s->status = BUSY_STATE;  | 
    ||
639  | 
    putShortMSB(s, header);  | 
    ||
640  | 
    |||
641  | 
    /* Save the adler32 of the preset dictionary: */  | 
    ||
642  | 
                if (s->strstart != 0) { | 
    ||
643  | 
    putShortMSB(s, (uInt)(strm->adler >> 16));  | 
    ||
644  | 
    putShortMSB(s, (uInt)(strm->adler & 0xffff));  | 
    ||
645  | 
    }  | 
    ||
646  | 
    strm->adler = adler32(0L, Z_NULL, 0);  | 
    ||
647  | 
    }  | 
    ||
648  | 
    }  | 
    ||
649  | 
    #ifdef GZIP  | 
    ||
650  | 
    ✗✓ | 55  | 
        if (s->status == EXTRA_STATE) { | 
    
651  | 
            if (s->gzhead->extra != NULL) { | 
    ||
652  | 
    uInt beg = s->pending; /* start of bytes to update crc */  | 
    ||
653  | 
    |||
654  | 
                while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { | 
    ||
655  | 
                    if (s->pending == s->pending_buf_size) { | 
    ||
656  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
657  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
658  | 
    s->pending - beg);  | 
    ||
659  | 
    flush_pending(strm);  | 
    ||
660  | 
    beg = s->pending;  | 
    ||
661  | 
    if (s->pending == s->pending_buf_size)  | 
    ||
662  | 
    break;  | 
    ||
663  | 
    }  | 
    ||
664  | 
    put_byte(s, s->gzhead->extra[s->gzindex]);  | 
    ||
665  | 
    s->gzindex++;  | 
    ||
666  | 
    }  | 
    ||
667  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
668  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
669  | 
    s->pending - beg);  | 
    ||
670  | 
                if (s->gzindex == s->gzhead->extra_len) { | 
    ||
671  | 
    s->gzindex = 0;  | 
    ||
672  | 
    s->status = NAME_STATE;  | 
    ||
673  | 
    }  | 
    ||
674  | 
    }  | 
    ||
675  | 
    else  | 
    ||
676  | 
    s->status = NAME_STATE;  | 
    ||
677  | 
    }  | 
    ||
678  | 
    ✗✓ | 55  | 
        if (s->status == NAME_STATE) { | 
    
679  | 
            if (s->gzhead->name != NULL) { | 
    ||
680  | 
    uInt beg = s->pending; /* start of bytes to update crc */  | 
    ||
681  | 
    int val;  | 
    ||
682  | 
    |||
683  | 
                do { | 
    ||
684  | 
                    if (s->pending == s->pending_buf_size) { | 
    ||
685  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
686  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
687  | 
    s->pending - beg);  | 
    ||
688  | 
    flush_pending(strm);  | 
    ||
689  | 
    beg = s->pending;  | 
    ||
690  | 
                        if (s->pending == s->pending_buf_size) { | 
    ||
691  | 
    val = 1;  | 
    ||
692  | 
    break;  | 
    ||
693  | 
    }  | 
    ||
694  | 
    }  | 
    ||
695  | 
    val = s->gzhead->name[s->gzindex++];  | 
    ||
696  | 
    put_byte(s, val);  | 
    ||
697  | 
    } while (val != 0);  | 
    ||
698  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
699  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
700  | 
    s->pending - beg);  | 
    ||
701  | 
                if (val == 0) { | 
    ||
702  | 
    s->gzindex = 0;  | 
    ||
703  | 
    s->status = COMMENT_STATE;  | 
    ||
704  | 
    }  | 
    ||
705  | 
    }  | 
    ||
706  | 
    else  | 
    ||
707  | 
    s->status = COMMENT_STATE;  | 
    ||
708  | 
    }  | 
    ||
709  | 
    ✗✓ | 55  | 
        if (s->status == COMMENT_STATE) { | 
    
710  | 
            if (s->gzhead->comment != NULL) { | 
    ||
711  | 
    uInt beg = s->pending; /* start of bytes to update crc */  | 
    ||
712  | 
    int val;  | 
    ||
713  | 
    |||
714  | 
                do { | 
    ||
715  | 
                    if (s->pending == s->pending_buf_size) { | 
    ||
716  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
717  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
718  | 
    s->pending - beg);  | 
    ||
719  | 
    flush_pending(strm);  | 
    ||
720  | 
    beg = s->pending;  | 
    ||
721  | 
                        if (s->pending == s->pending_buf_size) { | 
    ||
722  | 
    val = 1;  | 
    ||
723  | 
    break;  | 
    ||
724  | 
    }  | 
    ||
725  | 
    }  | 
    ||
726  | 
    val = s->gzhead->comment[s->gzindex++];  | 
    ||
727  | 
    put_byte(s, val);  | 
    ||
728  | 
    } while (val != 0);  | 
    ||
729  | 
    if (s->gzhead->hcrc && s->pending > beg)  | 
    ||
730  | 
    strm->adler = crc32(strm->adler, s->pending_buf + beg,  | 
    ||
731  | 
    s->pending - beg);  | 
    ||
732  | 
    if (val == 0)  | 
    ||
733  | 
    s->status = HCRC_STATE;  | 
    ||
734  | 
    }  | 
    ||
735  | 
    else  | 
    ||
736  | 
    s->status = HCRC_STATE;  | 
    ||
737  | 
    }  | 
    ||
738  | 
    ✗✓ | 55  | 
        if (s->status == HCRC_STATE) { | 
    
739  | 
            if (s->gzhead->hcrc) { | 
    ||
740  | 
    if (s->pending + 2 > s->pending_buf_size)  | 
    ||
741  | 
    flush_pending(strm);  | 
    ||
742  | 
                if (s->pending + 2 <= s->pending_buf_size) { | 
    ||
743  | 
    put_byte(s, (Byte)(strm->adler & 0xff));  | 
    ||
744  | 
    put_byte(s, (Byte)((strm->adler >> 8) & 0xff));  | 
    ||
745  | 
    strm->adler = crc32(0L, Z_NULL, 0);  | 
    ||
746  | 
    s->status = BUSY_STATE;  | 
    ||
747  | 
    }  | 
    ||
748  | 
    }  | 
    ||
749  | 
    else  | 
    ||
750  | 
    s->status = BUSY_STATE;  | 
    ||
751  | 
    }  | 
    ||
752  | 
    #endif  | 
    ||
753  | 
    |||
754  | 
    /* Flush as much pending output as possible */  | 
    ||
755  | 
    ✗✓ | 55  | 
        if (s->pending != 0) { | 
    
756  | 
    flush_pending(strm);  | 
    ||
757  | 
            if (strm->avail_out == 0) { | 
    ||
758  | 
    /* Since avail_out is 0, deflate will be called again with  | 
    ||
759  | 
    * more output space, but possibly with both pending and  | 
    ||
760  | 
    * avail_in equal to zero. There won't be anything to do,  | 
    ||
761  | 
    * but this is not an error situation so make sure we  | 
    ||
762  | 
    * return OK instead of BUF_ERROR at next call of deflate:  | 
    ||
763  | 
    */  | 
    ||
764  | 
    s->last_flush = -1;  | 
    ||
765  | 
    return Z_OK;  | 
    ||
766  | 
    }  | 
    ||
767  | 
    |||
768  | 
    /* Make sure there is something to do and avoid duplicate consecutive  | 
    ||
769  | 
    * flushes. For repeated and useless calls with Z_FINISH, we keep  | 
    ||
770  | 
    * returning Z_STREAM_END instead of Z_BUF_ERROR.  | 
    ||
771  | 
    */  | 
    ||
772  | 
    ✓✓✗✓ | 
    81  | 
    } else if (strm->avail_in == 0 && flush <= old_flush &&  | 
    
773  | 
                   flush != Z_FINISH) { | 
    ||
774  | 
    ERR_RETURN(strm, Z_BUF_ERROR);  | 
    ||
775  | 
    }  | 
    ||
776  | 
    |||
777  | 
    /* User must not provide more input after the first FINISH: */  | 
    ||
778  | 
    ✗✓✗✗ | 
    55  | 
        if (s->status == FINISH_STATE && strm->avail_in != 0) { | 
    
779  | 
    ERR_RETURN(strm, Z_BUF_ERROR);  | 
    ||
780  | 
    }  | 
    ||
781  | 
    |||
782  | 
    /* Start a new block or continue the current one.  | 
    ||
783  | 
    */  | 
    ||
784  | 
    ✓✓✗✓ ✗✗  | 
    81  | 
    if (strm->avail_in != 0 || s->lookahead != 0 ||  | 
    
785  | 
            (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { | 
    ||
786  | 
    block_state bstate;  | 
    ||
787  | 
    |||
788  | 
    55  | 
    bstate = (*(configuration_table[s->level].func))(s, flush);  | 
    |
789  | 
    |||
790  | 
    ✓✓ | 55  | 
            if (bstate == finish_started || bstate == finish_done) { | 
    
791  | 
    26  | 
    s->status = FINISH_STATE;  | 
    |
792  | 
    26  | 
    }  | 
    |
793  | 
    ✓✓ | 55  | 
            if (bstate == need_more || bstate == finish_started) { | 
    
794  | 
    ✗✓ | 29  | 
                if (strm->avail_out == 0) { | 
    
795  | 
    s->last_flush = -1; /* avoid BUF_ERROR next call, see above */  | 
    ||
796  | 
    }  | 
    ||
797  | 
    29  | 
    return Z_OK;  | 
    |
798  | 
    /* If flush != Z_NO_FLUSH && avail_out == 0, the next call  | 
    ||
799  | 
    * of deflate should use the same flush parameter to make sure  | 
    ||
800  | 
    * that the flush is complete. So we don't have to output an  | 
    ||
801  | 
    * empty block here, this will be done at next call. This also  | 
    ||
802  | 
    * ensures that for a very small output buffer, we emit at most  | 
    ||
803  | 
    * one empty block.  | 
    ||
804  | 
    */  | 
    ||
805  | 
    }  | 
    ||
806  | 
    ✗✓ | 26  | 
            if (bstate == block_done) { | 
    
807  | 
                if (flush == Z_PARTIAL_FLUSH) { | 
    ||
808  | 
    _tr_align(s);  | 
    ||
809  | 
                } else { /* FULL_FLUSH or SYNC_FLUSH */ | 
    ||
810  | 
    _tr_stored_block(s, (char*)0, 0L, 0);  | 
    ||
811  | 
    /* For a full flush, this empty block will be recognized  | 
    ||
812  | 
    * as a special marker by inflate_sync().  | 
    ||
813  | 
    */  | 
    ||
814  | 
                    if (flush == Z_FULL_FLUSH) { | 
    ||
815  | 
    CLEAR_HASH(s); /* forget history */  | 
    ||
816  | 
    }  | 
    ||
817  | 
    }  | 
    ||
818  | 
    flush_pending(strm);  | 
    ||
819  | 
                if (strm->avail_out == 0) { | 
    ||
820  | 
    s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */  | 
    ||
821  | 
    return Z_OK;  | 
    ||
822  | 
    }  | 
    ||
823  | 
    }  | 
    ||
824  | 
    ✓✓ | 26  | 
    }  | 
    
825  | 
    Assert(strm->avail_out > 0, "bug2");  | 
    ||
826  | 
    |||
827  | 
    ✗✓ | 26  | 
    if (flush != Z_FINISH) return Z_OK;  | 
    
828  | 
    ✓✗ | 52  | 
    if (s->wrap <= 0) return Z_STREAM_END;  | 
    
829  | 
    |||
830  | 
    /* Write the trailer */  | 
    ||
831  | 
    #ifdef GZIP  | 
    ||
832  | 
        if (s->wrap == 2) { | 
    ||
833  | 
    put_byte(s, (Byte)(strm->adler & 0xff));  | 
    ||
834  | 
    put_byte(s, (Byte)((strm->adler >> 8) & 0xff));  | 
    ||
835  | 
    put_byte(s, (Byte)((strm->adler >> 16) & 0xff));  | 
    ||
836  | 
    put_byte(s, (Byte)((strm->adler >> 24) & 0xff));  | 
    ||
837  | 
    put_byte(s, (Byte)(strm->total_in & 0xff));  | 
    ||
838  | 
    put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));  | 
    ||
839  | 
    put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));  | 
    ||
840  | 
    put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));  | 
    ||
841  | 
    }  | 
    ||
842  | 
    else  | 
    ||
843  | 
    #endif  | 
    ||
844  | 
        { | 
    ||
845  | 
    putShortMSB(s, (uInt)(strm->adler >> 16));  | 
    ||
846  | 
    putShortMSB(s, (uInt)(strm->adler & 0xffff));  | 
    ||
847  | 
    }  | 
    ||
848  | 
    flush_pending(strm);  | 
    ||
849  | 
    /* If avail_out is zero, the application will call deflate again  | 
    ||
850  | 
    * to flush the rest.  | 
    ||
851  | 
    */  | 
    ||
852  | 
    if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */  | 
    ||
853  | 
    return s->pending != 0 ? Z_OK : Z_STREAM_END;  | 
    ||
854  | 
    55  | 
    }  | 
    |
855  | 
    |||
856  | 
    /* ========================================================================= */  | 
    ||
857  | 
    int ZEXPORT deflateEnd (strm)  | 
    ||
858  | 
    z_streamp strm;  | 
    ||
859  | 
    { | 
    ||
860  | 
    int status;  | 
    ||
861  | 
    |||
862  | 
    ✓✗✗✓ | 
    78  | 
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;  | 
    
863  | 
    |||
864  | 
    26  | 
    status = strm->state->status;  | 
    |
865  | 
    ✗✓ | 182  | 
    if (status != INIT_STATE &&  | 
    
866  | 
    26  | 
    status != EXTRA_STATE &&  | 
    |
867  | 
    26  | 
    status != NAME_STATE &&  | 
    |
868  | 
    26  | 
    status != COMMENT_STATE &&  | 
    |
869  | 
    26  | 
    status != HCRC_STATE &&  | 
    |
870  | 
    26  | 
    status != BUSY_STATE &&  | 
    |
871  | 
    26  | 
            status != FINISH_STATE) { | 
    |
872  | 
    return Z_STREAM_ERROR;  | 
    ||
873  | 
    }  | 
    ||
874  | 
    |||
875  | 
    /* Deallocate in reverse order of allocations: */  | 
    ||
876  | 
    ✓✗ | 52  | 
    TRY_FREE(strm, strm->state->pending_buf);  | 
    
877  | 
    ✓✗ | 52  | 
    TRY_FREE(strm, strm->state->head);  | 
    
878  | 
    ✓✗ | 52  | 
    TRY_FREE(strm, strm->state->prev);  | 
    
879  | 
    ✓✗ | 52  | 
    TRY_FREE(strm, strm->state->window);  | 
    
880  | 
    |||
881  | 
    26  | 
    ZFREE(strm, strm->state);  | 
    |
882  | 
    26  | 
    strm->state = Z_NULL;  | 
    |
883  | 
    |||
884  | 
    26  | 
    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;  | 
    |
885  | 
    26  | 
    }  | 
    |
886  | 
    |||
887  | 
    /* =========================================================================  | 
    ||
888  | 
    * Copy the source state to the destination state.  | 
    ||
889  | 
    * To simplify the source, this is not supported for 16-bit MSDOS (which  | 
    ||
890  | 
    * doesn't have enough memory anyway to duplicate compression states).  | 
    ||
891  | 
    */  | 
    ||
892  | 
    int ZEXPORT deflateCopy (dest, source)  | 
    ||
893  | 
    z_streamp dest;  | 
    ||
894  | 
    z_streamp source;  | 
    ||
895  | 
    { | 
    ||
896  | 
    #ifdef MAXSEG_64K  | 
    ||
897  | 
    return Z_STREAM_ERROR;  | 
    ||
898  | 
    #else  | 
    ||
899  | 
    deflate_state *ds;  | 
    ||
900  | 
    deflate_state *ss;  | 
    ||
901  | 
    ushf *overlay;  | 
    ||
902  | 
    |||
903  | 
    |||
904  | 
        if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { | 
    ||
905  | 
    return Z_STREAM_ERROR;  | 
    ||
906  | 
    }  | 
    ||
907  | 
    |||
908  | 
    ss = source->state;  | 
    ||
909  | 
    |||
910  | 
    zmemcpy(dest, source, sizeof(z_stream));  | 
    ||
911  | 
    |||
912  | 
    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));  | 
    ||
913  | 
    if (ds == Z_NULL) return Z_MEM_ERROR;  | 
    ||
914  | 
    dest->state = (struct internal_state FAR *) ds;  | 
    ||
915  | 
    zmemcpy(ds, ss, sizeof(deflate_state));  | 
    ||
916  | 
    ds->strm = dest;  | 
    ||
917  | 
    |||
918  | 
    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));  | 
    ||
919  | 
    ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));  | 
    ||
920  | 
    ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));  | 
    ||
921  | 
    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);  | 
    ||
922  | 
    ds->pending_buf = (uchf *) overlay;  | 
    ||
923  | 
    |||
924  | 
    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||  | 
    ||
925  | 
            ds->pending_buf == Z_NULL) { | 
    ||
926  | 
    deflateEnd (dest);  | 
    ||
927  | 
    return Z_MEM_ERROR;  | 
    ||
928  | 
    }  | 
    ||
929  | 
    /* following zmemcpy do not work for 16-bit MSDOS */  | 
    ||
930  | 
    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));  | 
    ||
931  | 
    zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));  | 
    ||
932  | 
    zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));  | 
    ||
933  | 
    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);  | 
    ||
934  | 
    |||
935  | 
    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);  | 
    ||
936  | 
    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);  | 
    ||
937  | 
    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;  | 
    ||
938  | 
    |||
939  | 
    ds->l_desc.dyn_tree = ds->dyn_ltree;  | 
    ||
940  | 
    ds->d_desc.dyn_tree = ds->dyn_dtree;  | 
    ||
941  | 
    ds->bl_desc.dyn_tree = ds->bl_tree;  | 
    ||
942  | 
    |||
943  | 
    return Z_OK;  | 
    ||
944  | 
    #endif /* MAXSEG_64K */  | 
    ||
945  | 
    }  | 
    ||
946  | 
    |||
947  | 
    /* ===========================================================================  | 
    ||
948  | 
    * Read a new buffer from the current input stream, update the adler32  | 
    ||
949  | 
    * and total number of bytes read. All deflate() input goes through  | 
    ||
950  | 
    * this function so some applications may wish to modify it to avoid  | 
    ||
951  | 
    * allocating a large strm->next_in buffer and copying from it.  | 
    ||
952  | 
    * (See also flush_pending()).  | 
    ||
953  | 
    */  | 
    ||
954  | 
    local int read_buf(strm, buf, size)  | 
    ||
955  | 
    z_streamp strm;  | 
    ||
956  | 
    Bytef *buf;  | 
    ||
957  | 
    unsigned size;  | 
    ||
958  | 
    { | 
    ||
959  | 
    58  | 
    unsigned len = strm->avail_in;  | 
    |
960  | 
    |||
961  | 
    ✗✓ | 29  | 
    if (len > size) len = size;  | 
    
962  | 
    ✗✓ | 29  | 
    if (len == 0) return 0;  | 
    
963  | 
    |||
964  | 
    29  | 
    strm->avail_in -= len;  | 
    |
965  | 
    |||
966  | 
    ✗✓ | 29  | 
        if (strm->state->wrap == 1) { | 
    
967  | 
    strm->adler = adler32(strm->adler, strm->next_in, len);  | 
    ||
968  | 
    }  | 
    ||
969  | 
    #ifdef GZIP  | 
    ||
970  | 
    ✗✓ | 29  | 
        else if (strm->state->wrap == 2) { | 
    
971  | 
    strm->adler = crc32(strm->adler, strm->next_in, len);  | 
    ||
972  | 
    }  | 
    ||
973  | 
    #endif  | 
    ||
974  | 
    29  | 
    zmemcpy(buf, strm->next_in, len);  | 
    |
975  | 
    29  | 
    strm->next_in += len;  | 
    |
976  | 
    29  | 
    strm->total_in += len;  | 
    |
977  | 
    |||
978  | 
    29  | 
    return (int)len;  | 
    |
979  | 
    29  | 
    }  | 
    |
980  | 
    |||
981  | 
    /* ===========================================================================  | 
    ||
982  | 
    * Initialize the "longest match" routines for a new zlib stream  | 
    ||
983  | 
    */  | 
    ||
984  | 
    local void lm_init (s)  | 
    ||
985  | 
    deflate_state *s;  | 
    ||
986  | 
    { | 
    ||
987  | 
    52  | 
    s->window_size = (ulg)2L*s->w_size;  | 
    |
988  | 
    |||
989  | 
    26  | 
    CLEAR_HASH(s);  | 
    |
990  | 
    |||
991  | 
    /* Set the default configuration parameters:  | 
    ||
992  | 
    */  | 
    ||
993  | 
    26  | 
    s->max_lazy_match = configuration_table[s->level].max_lazy;  | 
    |
994  | 
    26  | 
    s->good_match = configuration_table[s->level].good_length;  | 
    |
995  | 
    26  | 
    s->nice_match = configuration_table[s->level].nice_length;  | 
    |
996  | 
    26  | 
    s->max_chain_length = configuration_table[s->level].max_chain;  | 
    |
997  | 
    |||
998  | 
    26  | 
    s->strstart = 0;  | 
    |
999  | 
    26  | 
    s->block_start = 0L;  | 
    |
1000  | 
    26  | 
    s->lookahead = 0;  | 
    |
1001  | 
    26  | 
    s->match_length = s->prev_length = MIN_MATCH-1;  | 
    |
1002  | 
    26  | 
    s->match_available = 0;  | 
    |
1003  | 
    26  | 
    s->ins_h = 0;  | 
    |
1004  | 
    #ifndef FASTEST  | 
    ||
1005  | 
    #ifdef ASMV  | 
    ||
1006  | 
    match_init(); /* initialize the asm code */  | 
    ||
1007  | 
    #endif  | 
    ||
1008  | 
    #endif  | 
    ||
1009  | 
    26  | 
    }  | 
    |
1010  | 
    |||
1011  | 
    #ifndef FASTEST  | 
    ||
1012  | 
    /* ===========================================================================  | 
    ||
1013  | 
    * Set match_start to the longest match starting at the given string and  | 
    ||
1014  | 
    * return its length. Matches shorter or equal to prev_length are discarded,  | 
    ||
1015  | 
    * in which case the result is equal to prev_length and match_start is  | 
    ||
1016  | 
    * garbage.  | 
    ||
1017  | 
    * IN assertions: cur_match is the head of the hash chain for the current  | 
    ||
1018  | 
    * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1  | 
    ||
1019  | 
    * OUT assertion: the match length is not greater than s->lookahead.  | 
    ||
1020  | 
    */  | 
    ||
1021  | 
    #ifndef ASMV  | 
    ||
1022  | 
    /* For 80x86 and 680x0, an optimized version will be provided in match.asm or  | 
    ||
1023  | 
    * match.S. The code will be functionally equivalent.  | 
    ||
1024  | 
    */  | 
    ||
1025  | 
    local uInt longest_match(s, cur_match)  | 
    ||
1026  | 
    deflate_state *s;  | 
    ||
1027  | 
    IPos cur_match; /* current match */  | 
    ||
1028  | 
    { | 
    ||
1029  | 
    177062  | 
    unsigned chain_length = s->max_chain_length;/* max hash chain length */  | 
    |
1030  | 
    88531  | 
    register Bytef *scan = s->window + s->strstart; /* current string */  | 
    |
1031  | 
    register Bytef *match; /* matched string */  | 
    ||
1032  | 
    register int len; /* length of current match */  | 
    ||
1033  | 
    88531  | 
    int best_len = s->prev_length; /* best match length so far */  | 
    |
1034  | 
    88531  | 
    int nice_match = s->nice_match; /* stop if match long enough */  | 
    |
1035  | 
    ✗✓ | 177062  | 
    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?  | 
    
1036  | 
    s->strstart - (IPos)MAX_DIST(s) : NIL;  | 
    ||
1037  | 
    /* Stop when cur_match becomes <= limit. To simplify the code,  | 
    ||
1038  | 
    * we prevent matches with the string of window index 0.  | 
    ||
1039  | 
    */  | 
    ||
1040  | 
    88531  | 
    Posf *prev = s->prev;  | 
    |
1041  | 
    88531  | 
    uInt wmask = s->w_mask;  | 
    |
1042  | 
    |||
1043  | 
    #ifdef UNALIGNED_OK  | 
    ||
1044  | 
    /* Compare two bytes at a time. Note: this is not always beneficial.  | 
    ||
1045  | 
    * Try with and without -DUNALIGNED_OK to check.  | 
    ||
1046  | 
    */  | 
    ||
1047  | 
    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;  | 
    ||
1048  | 
    register ush scan_start = *(ushf*)scan;  | 
    ||
1049  | 
    register ush scan_end = *(ushf*)(scan+best_len-1);  | 
    ||
1050  | 
    #else  | 
    ||
1051  | 
    88531  | 
    register Bytef *strend = s->window + s->strstart + MAX_MATCH;  | 
    |
1052  | 
    88531  | 
    register Byte scan_end1 = scan[best_len-1];  | 
    |
1053  | 
    88531  | 
    register Byte scan_end = scan[best_len];  | 
    |
1054  | 
    #endif  | 
    ||
1055  | 
    |||
1056  | 
    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.  | 
    ||
1057  | 
    * It is easy to get rid of this optimization if necessary.  | 
    ||
1058  | 
    */  | 
    ||
1059  | 
    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");  | 
    ||
1060  | 
    |||
1061  | 
    /* Do not waste too much time if we already have a good match: */  | 
    ||
1062  | 
    ✓✓ | 88531  | 
        if (s->prev_length >= s->good_match) { | 
    
1063  | 
    9406  | 
    chain_length >>= 2;  | 
    |
1064  | 
    9406  | 
    }  | 
    |
1065  | 
    /* Do not look for matches beyond the end of the input. This is necessary  | 
    ||
1066  | 
    * to make deflate deterministic.  | 
    ||
1067  | 
    */  | 
    ||
1068  | 
    ✓✓ | 89525  | 
    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;  | 
    
1069  | 
    |||
1070  | 
    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");  | 
    ||
1071  | 
    |||
1072  | 
        do { | 
    ||
1073  | 
    Assert(cur_match < s->strstart, "no future");  | 
    ||
1074  | 
    785127  | 
    match = s->window + cur_match;  | 
    |
1075  | 
    |||
1076  | 
    /* Skip to next match if the match length cannot increase  | 
    ||
1077  | 
    * or if the match length is less than 2. Note that the checks below  | 
    ||
1078  | 
    * for insufficient lookahead only occur occasionally for performance  | 
    ||
1079  | 
    * reasons. Therefore uninitialized memory will be accessed, and  | 
    ||
1080  | 
    * conditional jumps will be made that depend on those values.  | 
    ||
1081  | 
    * However the length of the match is limited to the lookahead, so  | 
    ||
1082  | 
    * the output of deflate is not affected by the uninitialized values.  | 
    ||
1083  | 
    */  | 
    ||
1084  | 
    #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)  | 
    ||
1085  | 
    /* This code assumes sizeof(unsigned short) == 2. Do not use  | 
    ||
1086  | 
    * UNALIGNED_OK if your compiler uses a different size.  | 
    ||
1087  | 
    */  | 
    ||
1088  | 
    if (*(ushf*)(match+best_len-1) != scan_end ||  | 
    ||
1089  | 
    *(ushf*)match != scan_start) continue;  | 
    ||
1090  | 
    |||
1091  | 
    /* It is not necessary to compare scan[2] and match[2] since they are  | 
    ||
1092  | 
    * always equal when the other bytes match, given that the hash keys  | 
    ||
1093  | 
    * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at  | 
    ||
1094  | 
    * strstart+3, +5, ... up to strstart+257. We check for insufficient  | 
    ||
1095  | 
    * lookahead only every 4th comparison; the 128th check will be made  | 
    ||
1096  | 
    * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is  | 
    ||
1097  | 
    * necessary to put more guard bytes at the end of the window, or  | 
    ||
1098  | 
    * to check more often for insufficient lookahead.  | 
    ||
1099  | 
    */  | 
    ||
1100  | 
    Assert(scan[2] == match[2], "scan[2]?");  | 
    ||
1101  | 
    scan++, match++;  | 
    ||
1102  | 
            do { | 
    ||
1103  | 
    } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&  | 
    ||
1104  | 
    *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&  | 
    ||
1105  | 
    *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&  | 
    ||
1106  | 
    *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&  | 
    ||
1107  | 
    scan < strend);  | 
    ||
1108  | 
            /* The funny "do {}" generates better code on most compilers */ | 
    ||
1109  | 
    |||
1110  | 
    /* Here, scan <= window+strstart+257 */  | 
    ||
1111  | 
    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");  | 
    ||
1112  | 
    if (*scan == *match) scan++;  | 
    ||
1113  | 
    |||
1114  | 
    len = (MAX_MATCH - 1) - (int)(strend-scan);  | 
    ||
1115  | 
    scan = strend - (MAX_MATCH-1);  | 
    ||
1116  | 
    |||
1117  | 
    #else /* UNALIGNED_OK */  | 
    ||
1118  | 
    |||
1119  | 
    ✓✓✓✓ | 
    854018  | 
    if (match[best_len] != scan_end ||  | 
    
1120  | 
    ✓✓ | 104598  | 
    match[best_len-1] != scan_end1 ||  | 
    
1121  | 
    ✓✓ | 82140  | 
    *match != *scan ||  | 
    
1122  | 
    68891  | 
    *++match != scan[1]) continue;  | 
    |
1123  | 
    |||
1124  | 
    /* The check at best_len-1 can be removed because it will be made  | 
    ||
1125  | 
    * again later. (This heuristic is not always a win.)  | 
    ||
1126  | 
    * It is not necessary to compare scan[2] and match[2] since they  | 
    ||
1127  | 
    * are always equal when the other bytes match, given that  | 
    ||
1128  | 
    * the hash keys are equal and that HASH_BITS >= 8.  | 
    ||
1129  | 
    */  | 
    ||
1130  | 
    68869  | 
    scan += 2, match++;  | 
    |
1131  | 
    Assert(*scan == *match, "match[2]?");  | 
    ||
1132  | 
    |||
1133  | 
    /* We check for insufficient lookahead only every 8th comparison;  | 
    ||
1134  | 
    * the 256th check will be made at strstart+258.  | 
    ||
1135  | 
    */  | 
    ||
1136  | 
    68869  | 
            do { | 
    |
1137  | 
    ✓✓✓✓ ✓✓  | 
    201732  | 
    } while (*++scan == *++match && *++scan == *++match &&  | 
    
1138  | 
    ✓✓✓✓ | 
    111085  | 
    *++scan == *++match && *++scan == *++match &&  | 
    
1139  | 
    ✓✓✓✓ | 
    82772  | 
    *++scan == *++match && *++scan == *++match &&  | 
    
1140  | 
    ✓✓✓✓ | 
    67078  | 
    *++scan == *++match && *++scan == *++match &&  | 
    
1141  | 
    29474  | 
    scan < strend);  | 
    |
1142  | 
    |||
1143  | 
    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");  | 
    ||
1144  | 
    |||
1145  | 
    68869  | 
    len = MAX_MATCH - (int)(strend - scan);  | 
    |
1146  | 
    68869  | 
    scan = strend - MAX_MATCH;  | 
    |
1147  | 
    |||
1148  | 
    #endif /* UNALIGNED_OK */  | 
    ||
1149  | 
    |||
1150  | 
    ✓✓ | 68869  | 
            if (len > best_len) { | 
    
1151  | 
    67011  | 
    s->match_start = cur_match;  | 
    |
1152  | 
    best_len = len;  | 
    ||
1153  | 
    ✓✓ | 67011  | 
    if (len >= nice_match) break;  | 
    
1154  | 
    #ifdef UNALIGNED_OK  | 
    ||
1155  | 
    scan_end = *(ushf*)(scan+best_len-1);  | 
    ||
1156  | 
    #else  | 
    ||
1157  | 
    66840  | 
    scan_end1 = scan[best_len-1];  | 
    |
1158  | 
    66840  | 
    scan_end = scan[best_len];  | 
    |
1159  | 
    #endif  | 
    ||
1160  | 
    66840  | 
    }  | 
    |
1161  | 
    ✓✓ | 1482218  | 
    } while ((cur_match = prev[cur_match & wmask]) > limit  | 
    
1162  | 
    ✓✓ | 1482218  | 
    && --chain_length != 0);  | 
    
1163  | 
    |||
1164  | 
    ✓✓ | 177036  | 
    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;  | 
    
1165  | 
    26  | 
    return s->lookahead;  | 
    |
1166  | 
    88531  | 
    }  | 
    |
1167  | 
    #endif /* ASMV */  | 
    ||
1168  | 
    #endif /* FASTEST */  | 
    ||
1169  | 
    |||
1170  | 
    /* ---------------------------------------------------------------------------  | 
    ||
1171  | 
    * Optimized version for level == 1 or strategy == Z_RLE only  | 
    ||
1172  | 
    */  | 
    ||
1173  | 
    local uInt longest_match_fast(s, cur_match)  | 
    ||
1174  | 
    deflate_state *s;  | 
    ||
1175  | 
    IPos cur_match; /* current match */  | 
    ||
1176  | 
    { | 
    ||
1177  | 
    register Bytef *scan = s->window + s->strstart; /* current string */  | 
    ||
1178  | 
    register Bytef *match; /* matched string */  | 
    ||
1179  | 
    register int len; /* length of current match */  | 
    ||
1180  | 
    register Bytef *strend = s->window + s->strstart + MAX_MATCH;  | 
    ||
1181  | 
    |||
1182  | 
    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.  | 
    ||
1183  | 
    * It is easy to get rid of this optimization if necessary.  | 
    ||
1184  | 
    */  | 
    ||
1185  | 
    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");  | 
    ||
1186  | 
    |||
1187  | 
    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");  | 
    ||
1188  | 
    |||
1189  | 
    Assert(cur_match < s->strstart, "no future");  | 
    ||
1190  | 
    |||
1191  | 
    match = s->window + cur_match;  | 
    ||
1192  | 
    |||
1193  | 
    /* Return failure if the match length is less than 2:  | 
    ||
1194  | 
    */  | 
    ||
1195  | 
    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;  | 
    ||
1196  | 
    |||
1197  | 
    /* The check at best_len-1 can be removed because it will be made  | 
    ||
1198  | 
    * again later. (This heuristic is not always a win.)  | 
    ||
1199  | 
    * It is not necessary to compare scan[2] and match[2] since they  | 
    ||
1200  | 
    * are always equal when the other bytes match, given that  | 
    ||
1201  | 
    * the hash keys are equal and that HASH_BITS >= 8.  | 
    ||
1202  | 
    */  | 
    ||
1203  | 
    scan += 2, match += 2;  | 
    ||
1204  | 
    Assert(*scan == *match, "match[2]?");  | 
    ||
1205  | 
    |||
1206  | 
    /* We check for insufficient lookahead only every 8th comparison;  | 
    ||
1207  | 
    * the 256th check will be made at strstart+258.  | 
    ||
1208  | 
    */  | 
    ||
1209  | 
        do { | 
    ||
1210  | 
    } while (*++scan == *++match && *++scan == *++match &&  | 
    ||
1211  | 
    *++scan == *++match && *++scan == *++match &&  | 
    ||
1212  | 
    *++scan == *++match && *++scan == *++match &&  | 
    ||
1213  | 
    *++scan == *++match && *++scan == *++match &&  | 
    ||
1214  | 
    scan < strend);  | 
    ||
1215  | 
    |||
1216  | 
    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");  | 
    ||
1217  | 
    |||
1218  | 
    len = MAX_MATCH - (int)(strend - scan);  | 
    ||
1219  | 
    |||
1220  | 
    if (len < MIN_MATCH) return MIN_MATCH - 1;  | 
    ||
1221  | 
    |||
1222  | 
    s->match_start = cur_match;  | 
    ||
1223  | 
    return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;  | 
    ||
1224  | 
    }  | 
    ||
1225  | 
    |||
1226  | 
    #ifdef DEBUG  | 
    ||
1227  | 
    /* ===========================================================================  | 
    ||
1228  | 
    * Check that the match at match_start is indeed a match.  | 
    ||
1229  | 
    */  | 
    ||
1230  | 
    local void check_match(s, start, match, length)  | 
    ||
1231  | 
    deflate_state *s;  | 
    ||
1232  | 
    IPos start, match;  | 
    ||
1233  | 
    int length;  | 
    ||
1234  | 
    { | 
    ||
1235  | 
    /* check that the match is indeed a match */  | 
    ||
1236  | 
    if (zmemcmp(s->window + match,  | 
    ||
1237  | 
                    s->window + start, length) != EQUAL) { | 
    ||
1238  | 
    fprintf(stderr, " start %u, match %u, length %d\n",  | 
    ||
1239  | 
    start, match, length);  | 
    ||
1240  | 
            do { | 
    ||
1241  | 
    fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);  | 
    ||
1242  | 
    } while (--length != 0);  | 
    ||
1243  | 
            z_error("invalid match"); | 
    ||
1244  | 
    }  | 
    ||
1245  | 
        if (z_verbose > 1) { | 
    ||
1246  | 
    fprintf(stderr,"\\[%d,%d]", start-match, length);  | 
    ||
1247  | 
            do { putc(s->window[start++], stderr); } while (--length != 0); | 
    ||
1248  | 
    }  | 
    ||
1249  | 
    }  | 
    ||
1250  | 
    #else  | 
    ||
1251  | 
    # define check_match(s, start, match, length)  | 
    ||
1252  | 
    #endif /* DEBUG */  | 
    ||
1253  | 
    |||
1254  | 
    /* ===========================================================================  | 
    ||
1255  | 
    * Fill the window when the lookahead becomes insufficient.  | 
    ||
1256  | 
    * Updates strstart and lookahead.  | 
    ||
1257  | 
    *  | 
    ||
1258  | 
    * IN assertion: lookahead < MIN_LOOKAHEAD  | 
    ||
1259  | 
    * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD  | 
    ||
1260  | 
    * At least one byte has been read, or avail_in == 0; reads are  | 
    ||
1261  | 
    * performed for at least two bytes (required for the zip translate_eol  | 
    ||
1262  | 
    * option -- not supported here).  | 
    ||
1263  | 
    */  | 
    ||
1264  | 
    local void fill_window(s)  | 
    ||
1265  | 
    deflate_state *s;  | 
    ||
1266  | 
    { | 
    ||
1267  | 
    register unsigned n, m;  | 
    ||
1268  | 
    register Posf *p;  | 
    ||
1269  | 
    unsigned more; /* Amount of free space at the end of the window. */  | 
    ||
1270  | 
    5308  | 
    uInt wsize = s->w_size;  | 
    |
1271  | 
    |||
1272  | 
    2654  | 
        do { | 
    |
1273  | 
    2654  | 
    more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);  | 
    |
1274  | 
    |||
1275  | 
    /* Deal with !@#$% 64K limit: */  | 
    ||
1276  | 
            if (sizeof(int) <= 2) { | 
    ||
1277  | 
                if (more == 0 && s->strstart == 0 && s->lookahead == 0) { | 
    ||
1278  | 
    more = wsize;  | 
    ||
1279  | 
    |||
1280  | 
                } else if (more == (unsigned)(-1)) { | 
    ||
1281  | 
    /* Very unlikely, but possible on 16 bit machine if  | 
    ||
1282  | 
    * strstart == 0 && lookahead == 1 (input done a byte at time)  | 
    ||
1283  | 
    */  | 
    ||
1284  | 
    more--;  | 
    ||
1285  | 
    }  | 
    ||
1286  | 
    }  | 
    ||
1287  | 
    |||
1288  | 
    /* If the window is almost full and there is insufficient lookahead,  | 
    ||
1289  | 
    * move the upper half to the lower one to make room in the upper half.  | 
    ||
1290  | 
    */  | 
    ||
1291  | 
    ✗✓ | 2654  | 
            if (s->strstart >= wsize+MAX_DIST(s)) { | 
    
1292  | 
    |||
1293  | 
    zmemcpy(s->window, s->window+wsize, (unsigned)wsize);  | 
    ||
1294  | 
    s->match_start -= wsize;  | 
    ||
1295  | 
    s->strstart -= wsize; /* we now have strstart >= MAX_DIST */  | 
    ||
1296  | 
    s->block_start -= (long) wsize;  | 
    ||
1297  | 
    |||
1298  | 
    /* Slide the hash table (could be avoided with 32 bit values  | 
    ||
1299  | 
    at the expense of memory usage). We slide even when level == 0  | 
    ||
1300  | 
    to keep the hash table consistent if we switch back to level > 0  | 
    ||
1301  | 
    later. (Using level 0 permanently is not an optimal usage of  | 
    ||
1302  | 
    zlib, so we don't care about this pathological case.)  | 
    ||
1303  | 
    */  | 
    ||
1304  | 
    /* %%% avoid this when Z_RLE */  | 
    ||
1305  | 
    n = s->hash_size;  | 
    ||
1306  | 
    p = &s->head[n];  | 
    ||
1307  | 
                do { | 
    ||
1308  | 
    m = *--p;  | 
    ||
1309  | 
    *p = (Pos)(m >= wsize ? m-wsize : NIL);  | 
    ||
1310  | 
    } while (--n);  | 
    ||
1311  | 
    |||
1312  | 
    n = wsize;  | 
    ||
1313  | 
    #ifndef FASTEST  | 
    ||
1314  | 
    p = &s->prev[n];  | 
    ||
1315  | 
                do { | 
    ||
1316  | 
    m = *--p;  | 
    ||
1317  | 
    *p = (Pos)(m >= wsize ? m-wsize : NIL);  | 
    ||
1318  | 
    /* If n is not on any hash chain, prev[n] is garbage but  | 
    ||
1319  | 
    * its value will never be used.  | 
    ||
1320  | 
    */  | 
    ||
1321  | 
    } while (--n);  | 
    ||
1322  | 
    #endif  | 
    ||
1323  | 
    more += wsize;  | 
    ||
1324  | 
    }  | 
    ||
1325  | 
    ✓✓ | 5279  | 
    if (s->strm->avail_in == 0) return;  | 
    
1326  | 
    |||
1327  | 
    /* If there was no sliding:  | 
    ||
1328  | 
    * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&  | 
    ||
1329  | 
    * more == window_size - lookahead - strstart  | 
    ||
1330  | 
    * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)  | 
    ||
1331  | 
    * => more >= window_size - 2*WSIZE + 2  | 
    ||
1332  | 
    * In the BIG_MEM or MMAP case (not yet supported),  | 
    ||
1333  | 
    * window_size == input_size + MIN_LOOKAHEAD &&  | 
    ||
1334  | 
    * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.  | 
    ||
1335  | 
    * Otherwise, window_size == 2*WSIZE so more >= 2.  | 
    ||
1336  | 
    * If there was sliding, more >= WSIZE. So in all cases, more >= 2.  | 
    ||
1337  | 
    */  | 
    ||
1338  | 
    Assert(more >= 2, "more < 2");  | 
    ||
1339  | 
    |||
1340  | 
    29  | 
    n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);  | 
    |
1341  | 
    29  | 
    s->lookahead += n;  | 
    |
1342  | 
    |||
1343  | 
    /* Initialize the hash value now that we have some input: */  | 
    ||
1344  | 
    ✓✗ | 29  | 
            if (s->lookahead >= MIN_MATCH) { | 
    
1345  | 
    29  | 
    s->ins_h = s->window[s->strstart];  | 
    |
1346  | 
    29  | 
    UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);  | 
    |
1347  | 
    #if MIN_MATCH != 3  | 
    ||
1348  | 
    Call UPDATE_HASH() MIN_MATCH-3 more times  | 
    ||
1349  | 
    #endif  | 
    ||
1350  | 
    29  | 
    }  | 
    |
1351  | 
    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,  | 
    ||
1352  | 
    * but this is not important since only literal bytes will be emitted.  | 
    ||
1353  | 
    */  | 
    ||
1354  | 
    |||
1355  | 
    ✗✓✗✗ | 
    29  | 
    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);  | 
    
1356  | 
    2683  | 
    }  | 
    |
1357  | 
    |||
1358  | 
    /* ===========================================================================  | 
    ||
1359  | 
    * Flush the current block, with given end-of-file flag.  | 
    ||
1360  | 
    * IN assertion: strstart is set to the end of the current match.  | 
    ||
1361  | 
    */  | 
    ||
1362  | 
    #define FLUSH_BLOCK_ONLY(s, eof) { \ | 
    ||
1363  | 
    _tr_flush_block(s, (s->block_start >= 0L ? \  | 
    ||
1364  | 
    (charf *)&s->window[(unsigned)s->block_start] : \  | 
    ||
1365  | 
    (charf *)Z_NULL), \  | 
    ||
1366  | 
    (ulg)((long)s->strstart - s->block_start), \  | 
    ||
1367  | 
    (eof)); \  | 
    ||
1368  | 
    s->block_start = s->strstart; \  | 
    ||
1369  | 
    flush_pending(s->strm); \  | 
    ||
1370  | 
    Tracev((stderr,"[FLUSH]")); \  | 
    ||
1371  | 
    }  | 
    ||
1372  | 
    |||
1373  | 
    /* Same but force premature exit if necessary. */  | 
    ||
1374  | 
    #define FLUSH_BLOCK(s, eof) { \ | 
    ||
1375  | 
    FLUSH_BLOCK_ONLY(s, eof); \  | 
    ||
1376  | 
    if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \  | 
    ||
1377  | 
    }  | 
    ||
1378  | 
    |||
1379  | 
    /* ===========================================================================  | 
    ||
1380  | 
    * Copy without compression as much as possible from the input stream, return  | 
    ||
1381  | 
    * the current block state.  | 
    ||
1382  | 
    * This function does not insert new strings in the dictionary since  | 
    ||
1383  | 
    * uncompressible data is probably not useful. This function is used  | 
    ||
1384  | 
    * only for the level=0 compression option.  | 
    ||
1385  | 
    * NOTE: this function should be optimized to avoid extra copying from  | 
    ||
1386  | 
    * window to pending_buf.  | 
    ||
1387  | 
    */  | 
    ||
1388  | 
    local block_state deflate_stored(s, flush)  | 
    ||
1389  | 
    deflate_state *s;  | 
    ||
1390  | 
    int flush;  | 
    ||
1391  | 
    { | 
    ||
1392  | 
    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited  | 
    ||
1393  | 
    * to pending_buf_size, and each stored block has a 5 byte header:  | 
    ||
1394  | 
    */  | 
    ||
1395  | 
    ulg max_block_size = 0xffff;  | 
    ||
1396  | 
    ulg max_start;  | 
    ||
1397  | 
    |||
1398  | 
        if (max_block_size > s->pending_buf_size - 5) { | 
    ||
1399  | 
    max_block_size = s->pending_buf_size - 5;  | 
    ||
1400  | 
    }  | 
    ||
1401  | 
    |||
1402  | 
    /* Copy as much as possible from input to output: */  | 
    ||
1403  | 
        for (;;) { | 
    ||
1404  | 
    /* Fill the window as much as possible: */  | 
    ||
1405  | 
            if (s->lookahead <= 1) { | 
    ||
1406  | 
    |||
1407  | 
    Assert(s->strstart < s->w_size+MAX_DIST(s) ||  | 
    ||
1408  | 
    s->block_start >= (long)s->w_size, "slide too late");  | 
    ||
1409  | 
    |||
1410  | 
    fill_window(s);  | 
    ||
1411  | 
    if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;  | 
    ||
1412  | 
    |||
1413  | 
    if (s->lookahead == 0) break; /* flush the current block */  | 
    ||
1414  | 
    }  | 
    ||
1415  | 
    Assert(s->block_start >= 0L, "block gone");  | 
    ||
1416  | 
    |||
1417  | 
    s->strstart += s->lookahead;  | 
    ||
1418  | 
    s->lookahead = 0;  | 
    ||
1419  | 
    |||
1420  | 
    /* Emit a stored block if pending_buf will be full: */  | 
    ||
1421  | 
    max_start = s->block_start + max_block_size;  | 
    ||
1422  | 
            if (s->strstart == 0 || (ulg)s->strstart >= max_start) { | 
    ||
1423  | 
    /* strstart == 0 is possible when wraparound on 16-bit machine */  | 
    ||
1424  | 
    s->lookahead = (uInt)(s->strstart - max_start);  | 
    ||
1425  | 
    s->strstart = (uInt)max_start;  | 
    ||
1426  | 
    FLUSH_BLOCK(s, 0);  | 
    ||
1427  | 
    }  | 
    ||
1428  | 
    /* Flush if we may have to slide, otherwise block_start may become  | 
    ||
1429  | 
    * negative and the data will be gone:  | 
    ||
1430  | 
    */  | 
    ||
1431  | 
            if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { | 
    ||
1432  | 
    FLUSH_BLOCK(s, 0);  | 
    ||
1433  | 
    }  | 
    ||
1434  | 
    }  | 
    ||
1435  | 
    FLUSH_BLOCK(s, flush == Z_FINISH);  | 
    ||
1436  | 
    return flush == Z_FINISH ? finish_done : block_done;  | 
    ||
1437  | 
    }  | 
    ||
1438  | 
    |||
1439  | 
    /* ===========================================================================  | 
    ||
1440  | 
    * Compress as much as possible from the input stream, return the current  | 
    ||
1441  | 
    * block state.  | 
    ||
1442  | 
    * This function does not perform lazy evaluation of matches and inserts  | 
    ||
1443  | 
    * new strings in the dictionary only for unmatched strings or for short  | 
    ||
1444  | 
    * matches. It is used only for the fast compression options.  | 
    ||
1445  | 
    */  | 
    ||
1446  | 
    local block_state deflate_fast(s, flush)  | 
    ||
1447  | 
    deflate_state *s;  | 
    ||
1448  | 
    int flush;  | 
    ||
1449  | 
    { | 
    ||
1450  | 
    IPos hash_head = NIL; /* head of the hash chain */  | 
    ||
1451  | 
    int bflush; /* set if current block must be flushed */  | 
    ||
1452  | 
    |||
1453  | 
        for (;;) { | 
    ||
1454  | 
    /* Make sure that we always have enough lookahead, except  | 
    ||
1455  | 
    * at the end of the input file. We need MAX_MATCH bytes  | 
    ||
1456  | 
    * for the next match, plus MIN_MATCH bytes to insert the  | 
    ||
1457  | 
    * string following the next match.  | 
    ||
1458  | 
    */  | 
    ||
1459  | 
            if (s->lookahead < MIN_LOOKAHEAD) { | 
    ||
1460  | 
    fill_window(s);  | 
    ||
1461  | 
                if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { | 
    ||
1462  | 
    return need_more;  | 
    ||
1463  | 
    }  | 
    ||
1464  | 
    if (s->lookahead == 0) break; /* flush the current block */  | 
    ||
1465  | 
    }  | 
    ||
1466  | 
    |||
1467  | 
    /* Insert the string window[strstart .. strstart+2] in the  | 
    ||
1468  | 
    * dictionary, and set hash_head to the head of the hash chain:  | 
    ||
1469  | 
    */  | 
    ||
1470  | 
            if (s->lookahead >= MIN_MATCH) { | 
    ||
1471  | 
    INSERT_STRING(s, s->strstart, hash_head);  | 
    ||
1472  | 
    }  | 
    ||
1473  | 
    |||
1474  | 
    /* Find the longest match, discarding those <= prev_length.  | 
    ||
1475  | 
    * At this point we have always match_length < MIN_MATCH  | 
    ||
1476  | 
    */  | 
    ||
1477  | 
            if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { | 
    ||
1478  | 
    /* To simplify the code, we prevent matches with the string  | 
    ||
1479  | 
    * of window index 0 (in particular we have to avoid a match  | 
    ||
1480  | 
    * of the string with itself at the start of the input file).  | 
    ||
1481  | 
    */  | 
    ||
1482  | 
    #ifdef FASTEST  | 
    ||
1483  | 
    if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) ||  | 
    ||
1484  | 
                    (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { | 
    ||
1485  | 
    s->match_length = longest_match_fast (s, hash_head);  | 
    ||
1486  | 
    }  | 
    ||
1487  | 
    #else  | 
    ||
1488  | 
                if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { | 
    ||
1489  | 
    s->match_length = longest_match (s, hash_head);  | 
    ||
1490  | 
                } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { | 
    ||
1491  | 
    s->match_length = longest_match_fast (s, hash_head);  | 
    ||
1492  | 
    }  | 
    ||
1493  | 
    #endif  | 
    ||
1494  | 
    /* longest_match() or longest_match_fast() sets match_start */  | 
    ||
1495  | 
    }  | 
    ||
1496  | 
            if (s->match_length >= MIN_MATCH) { | 
    ||
1497  | 
    check_match(s, s->strstart, s->match_start, s->match_length);  | 
    ||
1498  | 
    |||
1499  | 
    _tr_tally_dist(s, s->strstart - s->match_start,  | 
    ||
1500  | 
    s->match_length - MIN_MATCH, bflush);  | 
    ||
1501  | 
    |||
1502  | 
    s->lookahead -= s->match_length;  | 
    ||
1503  | 
    |||
1504  | 
    /* Insert new strings in the hash table only if the match length  | 
    ||
1505  | 
    * is not too large. This saves time but degrades compression.  | 
    ||
1506  | 
    */  | 
    ||
1507  | 
    #ifndef FASTEST  | 
    ||
1508  | 
    if (s->match_length <= s->max_insert_length &&  | 
    ||
1509  | 
                    s->lookahead >= MIN_MATCH) { | 
    ||
1510  | 
    s->match_length--; /* string at strstart already in table */  | 
    ||
1511  | 
                    do { | 
    ||
1512  | 
    s->strstart++;  | 
    ||
1513  | 
    INSERT_STRING(s, s->strstart, hash_head);  | 
    ||
1514  | 
    /* strstart never exceeds WSIZE-MAX_MATCH, so there are  | 
    ||
1515  | 
    * always MIN_MATCH bytes ahead.  | 
    ||
1516  | 
    */  | 
    ||
1517  | 
    } while (--s->match_length != 0);  | 
    ||
1518  | 
    s->strstart++;  | 
    ||
1519  | 
    } else  | 
    ||
1520  | 
    #endif  | 
    ||
1521  | 
                { | 
    ||
1522  | 
    s->strstart += s->match_length;  | 
    ||
1523  | 
    s->match_length = 0;  | 
    ||
1524  | 
    s->ins_h = s->window[s->strstart];  | 
    ||
1525  | 
    UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);  | 
    ||
1526  | 
    #if MIN_MATCH != 3  | 
    ||
1527  | 
    Call UPDATE_HASH() MIN_MATCH-3 more times  | 
    ||
1528  | 
    #endif  | 
    ||
1529  | 
    /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not  | 
    ||
1530  | 
    * matter since it will be recomputed at next deflate call.  | 
    ||
1531  | 
    */  | 
    ||
1532  | 
    }  | 
    ||
1533  | 
            } else { | 
    ||
1534  | 
    /* No match, output a literal byte */  | 
    ||
1535  | 
    Tracevv((stderr,"%c", s->window[s->strstart]));  | 
    ||
1536  | 
    _tr_tally_lit (s, s->window[s->strstart], bflush);  | 
    ||
1537  | 
    s->lookahead--;  | 
    ||
1538  | 
    s->strstart++;  | 
    ||
1539  | 
    }  | 
    ||
1540  | 
    if (bflush) FLUSH_BLOCK(s, 0);  | 
    ||
1541  | 
    }  | 
    ||
1542  | 
    FLUSH_BLOCK(s, flush == Z_FINISH);  | 
    ||
1543  | 
    return flush == Z_FINISH ? finish_done : block_done;  | 
    ||
1544  | 
    }  | 
    ||
1545  | 
    |||
1546  | 
    #ifndef FASTEST  | 
    ||
1547  | 
    /* ===========================================================================  | 
    ||
1548  | 
    * Same as above, but achieves better compression. We use a lazy  | 
    ||
1549  | 
    * evaluation for matches: a match is finally adopted only if there is  | 
    ||
1550  | 
    * no better match at the next window position.  | 
    ||
1551  | 
    */  | 
    ||
1552  | 
    local block_state deflate_slow(s, flush)  | 
    ||
1553  | 
    deflate_state *s;  | 
    ||
1554  | 
    int flush;  | 
    ||
1555  | 
    { | 
    ||
1556  | 
    IPos hash_head = NIL; /* head of hash chain */  | 
    ||
1557  | 
    int bflush; /* set if current block must be flushed */  | 
    ||
1558  | 
    |||
1559  | 
    /* Process the input block. */  | 
    ||
1560  | 
    110  | 
        for (;;) { | 
    |
1561  | 
    /* Make sure that we always have enough lookahead, except  | 
    ||
1562  | 
    * at the end of the input file. We need MAX_MATCH bytes  | 
    ||
1563  | 
    * for the next match, plus MIN_MATCH bytes to insert the  | 
    ||
1564  | 
    * string following the next match.  | 
    ||
1565  | 
    */  | 
    ||
1566  | 
    ✓✓ | 150089  | 
            if (s->lookahead < MIN_LOOKAHEAD) { | 
    
1567  | 
    2654  | 
    fill_window(s);  | 
    |
1568  | 
    ✓✓ | 2654  | 
                if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { | 
    
1569  | 
    29  | 
    return need_more;  | 
    |
1570  | 
    }  | 
    ||
1571  | 
    ✓✓ | 2625  | 
    if (s->lookahead == 0) break; /* flush the current block */  | 
    
1572  | 
    }  | 
    ||
1573  | 
    |||
1574  | 
    /* Insert the string window[strstart .. strstart+2] in the  | 
    ||
1575  | 
    * dictionary, and set hash_head to the head of the hash chain:  | 
    ||
1576  | 
    */  | 
    ||
1577  | 
    ✓✓ | 150034  | 
            if (s->lookahead >= MIN_MATCH) { | 
    
1578  | 
    150032  | 
    INSERT_STRING(s, s->strstart, hash_head);  | 
    |
1579  | 
    150032  | 
    }  | 
    |
1580  | 
    |||
1581  | 
    /* Find the longest match, discarding those <= prev_length.  | 
    ||
1582  | 
    */  | 
    ||
1583  | 
    150034  | 
    s->prev_length = s->match_length, s->prev_match = s->match_start;  | 
    |
1584  | 
    150034  | 
    s->match_length = MIN_MATCH-1;  | 
    |
1585  | 
    |||
1586  | 
    ✓✓✓✓ ✓✗  | 
    329858  | 
    if (hash_head != NIL && s->prev_length < s->max_lazy_match &&  | 
    
1587  | 
    88531  | 
                s->strstart - hash_head <= MAX_DIST(s)) { | 
    |
1588  | 
    /* To simplify the code, we prevent matches with the string  | 
    ||
1589  | 
    * of window index 0 (in particular we have to avoid a match  | 
    ||
1590  | 
    * of the string with itself at the start of the input file).  | 
    ||
1591  | 
    */  | 
    ||
1592  | 
    ✓✗✓✗ | 
    177062  | 
                if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { | 
    
1593  | 
    88531  | 
    s->match_length = longest_match (s, hash_head);  | 
    |
1594  | 
    ✗✗✗✗ | 
    88531  | 
                } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { | 
    
1595  | 
    s->match_length = longest_match_fast (s, hash_head);  | 
    ||
1596  | 
    }  | 
    ||
1597  | 
    /* longest_match() or longest_match_fast() sets match_start */  | 
    ||
1598  | 
    |||
1599  | 
    ✓✓✓✓ | 
    159487  | 
    if (s->match_length <= 5 && (s->strategy == Z_FILTERED  | 
    
1600  | 
    #if TOO_FAR <= 32767  | 
    ||
1601  | 
    ✓✗✓✓ | 
    105398  | 
    || (s->match_length == MIN_MATCH &&  | 
    
1602  | 
    18257  | 
    s->strstart - s->match_start > TOO_FAR)  | 
    |
1603  | 
    #endif  | 
    ||
1604  | 
                    )) { | 
    ||
1605  | 
    |||
1606  | 
    /* If prev_match is also MIN_MATCH, match_start is garbage  | 
    ||
1607  | 
    * but we will ignore the current match anyway.  | 
    ||
1608  | 
    */  | 
    ||
1609  | 
    2899  | 
    s->match_length = MIN_MATCH-1;  | 
    |
1610  | 
    2899  | 
    }  | 
    |
1611  | 
    }  | 
    ||
1612  | 
    /* If there was a match at the previous step and the current  | 
    ||
1613  | 
    * match is not better, output the previous match:  | 
    ||
1614  | 
    */  | 
    ||
1615  | 
    ✓✓✓✓ | 
    196618  | 
            if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { | 
    
1616  | 
    42728  | 
    uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;  | 
    |
1617  | 
    /* Do not insert strings in hash table beyond this. */  | 
    ||
1618  | 
    |||
1619  | 
    check_match(s, s->strstart-1, s->prev_match, s->prev_length);  | 
    ||
1620  | 
    |||
1621  | 
    ✓✓ | 128184  | 
    _tr_tally_dist(s, s->strstart -1 - s->prev_match,  | 
    
1622  | 
    s->prev_length - MIN_MATCH, bflush);  | 
    ||
1623  | 
    |||
1624  | 
    /* Insert in hash table all strings up to the end of the match.  | 
    ||
1625  | 
    * strstart-1 and strstart are already inserted. If there is not  | 
    ||
1626  | 
    * enough lookahead, the last two strings are not inserted in  | 
    ||
1627  | 
    * the hash table.  | 
    ||
1628  | 
    */  | 
    ||
1629  | 
    42728  | 
    s->lookahead -= s->prev_length-1;  | 
    |
1630  | 
    42728  | 
    s->prev_length -= 2;  | 
    |
1631  | 
    42728  | 
                do { | 
    |
1632  | 
    ✓✓ | 248624  | 
                    if (++s->strstart <= max_insert) { | 
    
1633  | 
    248574  | 
    INSERT_STRING(s, s->strstart, hash_head);  | 
    |
1634  | 
    248574  | 
    }  | 
    |
1635  | 
    ✓✓ | 248624  | 
    } while (--s->prev_length != 0);  | 
    
1636  | 
    42728  | 
    s->match_available = 0;  | 
    |
1637  | 
    42728  | 
    s->match_length = MIN_MATCH-1;  | 
    |
1638  | 
    42728  | 
    s->strstart++;  | 
    |
1639  | 
    |||
1640  | 
    ✗✓✗✗ ✗✗  | 
    42728  | 
    if (bflush) FLUSH_BLOCK(s, 0);  | 
    
1641  | 
    |||
1642  | 
    ✓✗✓✓ | 
    150034  | 
            } else if (s->match_available) { | 
    
1643  | 
    /* If there was no match at the previous position, output a  | 
    ||
1644  | 
    * single literal. If there was a match but the current match  | 
    ||
1645  | 
    * is longer, truncate the previous match to a single literal.  | 
    ||
1646  | 
    */  | 
    ||
1647  | 
    Tracevv((stderr,"%c", s->window[s->strstart-1]));  | 
    ||
1648  | 
    64578  | 
    _tr_tally_lit(s, s->window[s->strstart-1], bflush);  | 
    |
1649  | 
    ✗✓ | 64578  | 
                if (bflush) { | 
    
1650  | 
    FLUSH_BLOCK_ONLY(s, 0);  | 
    ||
1651  | 
    }  | 
    ||
1652  | 
    64578  | 
    s->strstart++;  | 
    |
1653  | 
    64578  | 
    s->lookahead--;  | 
    |
1654  | 
    ✓✗ | 64578  | 
    if (s->strm->avail_out == 0) return need_more;  | 
    
1655  | 
            } else { | 
    ||
1656  | 
    /* There is no previous match to compare with, wait for  | 
    ||
1657  | 
    * the next step to decide.  | 
    ||
1658  | 
    */  | 
    ||
1659  | 
    42728  | 
    s->match_available = 1;  | 
    |
1660  | 
    42728  | 
    s->strstart++;  | 
    |
1661  | 
    42728  | 
    s->lookahead--;  | 
    |
1662  | 
    }  | 
    ||
1663  | 
    }  | 
    ||
1664  | 
    Assert (flush != Z_NO_FLUSH, "no flush?");  | 
    ||
1665  | 
    ✗✓ | 26  | 
        if (s->match_available) { | 
    
1666  | 
    Tracevv((stderr,"%c", s->window[s->strstart-1]));  | 
    ||
1667  | 
    _tr_tally_lit(s, s->window[s->strstart-1], bflush);  | 
    ||
1668  | 
    s->match_available = 0;  | 
    ||
1669  | 
    }  | 
    ||
1670  | 
    ✓✗✗✓ | 
    78  | 
    FLUSH_BLOCK(s, flush == Z_FINISH);  | 
    
1671  | 
    26  | 
    return flush == Z_FINISH ? finish_done : block_done;  | 
    |
1672  | 
    55  | 
    }  | 
    |
1673  | 
    #endif /* FASTEST */  | 
    ||
1674  | 
    |||
1675  | 
    #if 0  | 
    ||
1676  | 
    /* ===========================================================================  | 
    ||
1677  | 
    * For Z_RLE, simply look for runs of bytes, generate matches only of distance  | 
    ||
1678  | 
    * one. Do not maintain a hash table. (It will be regenerated if this run of  | 
    ||
1679  | 
    * deflate switches away from Z_RLE.)  | 
    ||
1680  | 
    */  | 
    ||
1681  | 
    local block_state deflate_rle(s, flush)  | 
    ||
1682  | 
    deflate_state *s;  | 
    ||
1683  | 
    int flush;  | 
    ||
1684  | 
    { | 
    ||
1685  | 
    int bflush; /* set if current block must be flushed */  | 
    ||
1686  | 
    uInt run; /* length of run */  | 
    ||
1687  | 
    uInt max; /* maximum length of run */  | 
    ||
1688  | 
    uInt prev; /* byte at distance one to match */  | 
    ||
1689  | 
    Bytef *scan; /* scan for end of run */  | 
    ||
1690  | 
    |||
1691  | 
        for (;;) { | 
    ||
1692  | 
    /* Make sure that we always have enough lookahead, except  | 
    ||
1693  | 
    * at the end of the input file. We need MAX_MATCH bytes  | 
    ||
1694  | 
    * for the longest encodable run.  | 
    ||
1695  | 
    */  | 
    ||
1696  | 
            if (s->lookahead < MAX_MATCH) { | 
    ||
1697  | 
    fill_window(s);  | 
    ||
1698  | 
                if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { | 
    ||
1699  | 
    return need_more;  | 
    ||
1700  | 
    }  | 
    ||
1701  | 
    if (s->lookahead == 0) break; /* flush the current block */  | 
    ||
1702  | 
    }  | 
    ||
1703  | 
    |||
1704  | 
    /* See how many times the previous byte repeats */  | 
    ||
1705  | 
    run = 0;  | 
    ||
1706  | 
            if (s->strstart > 0) {      /* if there is a previous byte, that is */ | 
    ||
1707  | 
    max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH;  | 
    ||
1708  | 
    scan = s->window + s->strstart - 1;  | 
    ||
1709  | 
    prev = *scan++;  | 
    ||
1710  | 
                do { | 
    ||
1711  | 
    if (*scan++ != prev)  | 
    ||
1712  | 
    break;  | 
    ||
1713  | 
    } while (++run < max);  | 
    ||
1714  | 
    }  | 
    ||
1715  | 
    |||
1716  | 
    /* Emit match if have run of MIN_MATCH or longer, else emit literal */  | 
    ||
1717  | 
            if (run >= MIN_MATCH) { | 
    ||
1718  | 
    check_match(s, s->strstart, s->strstart - 1, run);  | 
    ||
1719  | 
    _tr_tally_dist(s, 1, run - MIN_MATCH, bflush);  | 
    ||
1720  | 
    s->lookahead -= run;  | 
    ||
1721  | 
    s->strstart += run;  | 
    ||
1722  | 
            } else { | 
    ||
1723  | 
    /* No match, output a literal byte */  | 
    ||
1724  | 
    Tracevv((stderr,"%c", s->window[s->strstart]));  | 
    ||
1725  | 
    _tr_tally_lit (s, s->window[s->strstart], bflush);  | 
    ||
1726  | 
    s->lookahead--;  | 
    ||
1727  | 
    s->strstart++;  | 
    ||
1728  | 
    }  | 
    ||
1729  | 
    if (bflush) FLUSH_BLOCK(s, 0);  | 
    ||
1730  | 
    }  | 
    ||
1731  | 
    FLUSH_BLOCK(s, flush == Z_FINISH);  | 
    ||
1732  | 
    return flush == Z_FINISH ? finish_done : block_done;  | 
    ||
1733  | 
    }  | 
    ||
1734  | 
    #endif  | 
    
| Generated by: GCOVR (Version 3.3) |