1*2d60b848STomohiro Kusumi /* deflate.c -- compress data using the deflation algorithm
2*2d60b848STomohiro Kusumi  * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
3*2d60b848STomohiro Kusumi  * For conditions of distribution and use, see copyright notice in zlib.h
4*2d60b848STomohiro Kusumi  */
5*2d60b848STomohiro Kusumi 
6*2d60b848STomohiro Kusumi /*
7*2d60b848STomohiro Kusumi  *  ALGORITHM
8*2d60b848STomohiro Kusumi  *
9*2d60b848STomohiro Kusumi  *      The "deflation" process depends on being able to identify portions
10*2d60b848STomohiro Kusumi  *      of the input text which are identical to earlier input (within a
11*2d60b848STomohiro Kusumi  *      sliding window trailing behind the input currently being processed).
12*2d60b848STomohiro Kusumi  *
13*2d60b848STomohiro Kusumi  *      The most straightforward technique turns out to be the fastest for
14*2d60b848STomohiro Kusumi  *      most input files: try all possible matches and select the longest.
15*2d60b848STomohiro Kusumi  *      The key feature of this algorithm is that insertions into the string
16*2d60b848STomohiro Kusumi  *      dictionary are very simple and thus fast, and deletions are avoided
17*2d60b848STomohiro Kusumi  *      completely. Insertions are performed at each input character, whereas
18*2d60b848STomohiro Kusumi  *      string matches are performed only when the previous match ends. So it
19*2d60b848STomohiro Kusumi  *      is preferable to spend more time in matches to allow very fast string
20*2d60b848STomohiro Kusumi  *      insertions and avoid deletions. The matching algorithm for small
21*2d60b848STomohiro Kusumi  *      strings is inspired from that of Rabin & Karp. A brute force approach
22*2d60b848STomohiro Kusumi  *      is used to find longer strings when a small match has been found.
23*2d60b848STomohiro Kusumi  *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
24*2d60b848STomohiro Kusumi  *      (by Leonid Broukhis).
25*2d60b848STomohiro Kusumi  *         A previous version of this file used a more sophisticated algorithm
26*2d60b848STomohiro Kusumi  *      (by Fiala and Greene) which is guaranteed to run in linear amortized
27*2d60b848STomohiro Kusumi  *      time, but has a larger average cost, uses more memory and is patented.
28*2d60b848STomohiro Kusumi  *      However the F&G algorithm may be faster for some highly redundant
29*2d60b848STomohiro Kusumi  *      files if the parameter max_chain_length (described below) is too large.
30*2d60b848STomohiro Kusumi  *
31*2d60b848STomohiro Kusumi  *  ACKNOWLEDGEMENTS
32*2d60b848STomohiro Kusumi  *
33*2d60b848STomohiro Kusumi  *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
34*2d60b848STomohiro Kusumi  *      I found it in 'freeze' written by Leonid Broukhis.
35*2d60b848STomohiro Kusumi  *      Thanks to many people for bug reports and testing.
36*2d60b848STomohiro Kusumi  *
37*2d60b848STomohiro Kusumi  *  REFERENCES
38*2d60b848STomohiro Kusumi  *
39*2d60b848STomohiro Kusumi  *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
40*2d60b848STomohiro Kusumi  *      Available in http://tools.ietf.org/html/rfc1951
41*2d60b848STomohiro Kusumi  *
42*2d60b848STomohiro Kusumi  *      A description of the Rabin and Karp algorithm is given in the book
43*2d60b848STomohiro Kusumi  *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
44*2d60b848STomohiro Kusumi  *
45*2d60b848STomohiro Kusumi  *      Fiala,E.R., and Greene,D.H.
46*2d60b848STomohiro Kusumi  *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
47*2d60b848STomohiro Kusumi  *
48*2d60b848STomohiro Kusumi  */
49*2d60b848STomohiro Kusumi 
50*2d60b848STomohiro Kusumi /* @(#) $Id$ */
51*2d60b848STomohiro Kusumi 
52*2d60b848STomohiro Kusumi #include "hammer2_zlib_deflate.h"
53*2d60b848STomohiro Kusumi #include "../hammer2.h"
54*2d60b848STomohiro Kusumi //#include <sys/malloc.h> //for malloc macros
55*2d60b848STomohiro Kusumi 
56*2d60b848STomohiro Kusumi MALLOC_DECLARE(C_ZLIB_BUFFER_DEFLATE);
57*2d60b848STomohiro Kusumi MALLOC_DEFINE(C_ZLIB_BUFFER_DEFLATE, "compzlibbufferdeflate",
58*2d60b848STomohiro Kusumi 	"A private buffer used by zlib library for deflate function.");
59*2d60b848STomohiro Kusumi 
60*2d60b848STomohiro Kusumi const char deflate_copyright[] =
61*2d60b848STomohiro Kusumi    " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
62*2d60b848STomohiro Kusumi /*
63*2d60b848STomohiro Kusumi   If you use the zlib library in a product, an acknowledgment is welcome
64*2d60b848STomohiro Kusumi   in the documentation of your product. If for some reason you cannot
65*2d60b848STomohiro Kusumi   include such an acknowledgment, I would appreciate that you keep this
66*2d60b848STomohiro Kusumi   copyright string in the executable of your product.
67*2d60b848STomohiro Kusumi  */
68*2d60b848STomohiro Kusumi 
69*2d60b848STomohiro Kusumi /* ===========================================================================
70*2d60b848STomohiro Kusumi  *  Function prototypes.
71*2d60b848STomohiro Kusumi  */
72*2d60b848STomohiro Kusumi typedef enum {
73*2d60b848STomohiro Kusumi     need_more,      /* block not completed, need more input or more output */
74*2d60b848STomohiro Kusumi     block_done,     /* block flush performed */
75*2d60b848STomohiro Kusumi     finish_started, /* finish started, need only more output at next deflate */
76*2d60b848STomohiro Kusumi     finish_done     /* finish done, accept no more input or output */
77*2d60b848STomohiro Kusumi } block_state;
78*2d60b848STomohiro Kusumi 
79*2d60b848STomohiro Kusumi typedef block_state (*compress_func)(deflate_state *s, int flush);
80*2d60b848STomohiro Kusumi /* Compression function. Returns the block state after the call. */
81*2d60b848STomohiro Kusumi 
82*2d60b848STomohiro Kusumi local void fill_window (deflate_state *s);
83*2d60b848STomohiro Kusumi #ifndef FASTEST
84*2d60b848STomohiro Kusumi local block_state deflate_slow(deflate_state *s, int flush);
85*2d60b848STomohiro Kusumi #endif
86*2d60b848STomohiro Kusumi local block_state deflate_rle(deflate_state *s, int flush);
87*2d60b848STomohiro Kusumi local block_state deflate_huff(deflate_state *s, int flush);
88*2d60b848STomohiro Kusumi local void lm_init(deflate_state *s);
89*2d60b848STomohiro Kusumi local void putShortMSB(deflate_state *s, uInt b);
90*2d60b848STomohiro Kusumi local void flush_pending(z_streamp strm);
91*2d60b848STomohiro Kusumi local int read_buf(z_streamp strm, Bytef *buf, unsigned size);
92*2d60b848STomohiro Kusumi #ifdef ASMV
93*2d60b848STomohiro Kusumi       void match_init(void); /* asm code initialization */
94*2d60b848STomohiro Kusumi       uInt longest_match(deflate_state *s, IPos cur_match);
95*2d60b848STomohiro Kusumi #else
96*2d60b848STomohiro Kusumi local uInt longest_match(deflate_state *s, IPos cur_match);
97*2d60b848STomohiro Kusumi #endif
98*2d60b848STomohiro Kusumi 
99*2d60b848STomohiro Kusumi #ifdef H2_ZLIB_DEBUG
100*2d60b848STomohiro Kusumi local  void check_match(deflate_state *s, IPos start, IPos match,
101*2d60b848STomohiro Kusumi                             int length);
102*2d60b848STomohiro Kusumi #endif
103*2d60b848STomohiro Kusumi 
104*2d60b848STomohiro Kusumi int deflateInit2_(z_streamp strm, int level, int method, int windowBits,
105*2d60b848STomohiro Kusumi 					int memLevel, int strategy, const char *version,
106*2d60b848STomohiro Kusumi 					int stream_size);
107*2d60b848STomohiro Kusumi int deflateReset (z_streamp strm);
108*2d60b848STomohiro Kusumi int deflateResetKeep (z_streamp strm);
109*2d60b848STomohiro Kusumi 
110*2d60b848STomohiro Kusumi /* ===========================================================================
111*2d60b848STomohiro Kusumi  * Local data
112*2d60b848STomohiro Kusumi  */
113*2d60b848STomohiro Kusumi 
114*2d60b848STomohiro Kusumi #define NIL 0
115*2d60b848STomohiro Kusumi /* Tail of hash chains */
116*2d60b848STomohiro Kusumi 
117*2d60b848STomohiro Kusumi #ifndef TOO_FAR
118*2d60b848STomohiro Kusumi #  define TOO_FAR 4096
119*2d60b848STomohiro Kusumi #endif
120*2d60b848STomohiro Kusumi /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
121*2d60b848STomohiro Kusumi 
122*2d60b848STomohiro Kusumi /* Values for max_lazy_match, good_match and max_chain_length, depending on
123*2d60b848STomohiro Kusumi  * the desired pack level (0..9). The values given below have been tuned to
124*2d60b848STomohiro Kusumi  * exclude worst case performance for pathological files. Better values may be
125*2d60b848STomohiro Kusumi  * found for specific files.
126*2d60b848STomohiro Kusumi  */
127*2d60b848STomohiro Kusumi typedef struct config_s {
128*2d60b848STomohiro Kusumi    ush good_length; /* reduce lazy search above this match length */
129*2d60b848STomohiro Kusumi    ush max_lazy;    /* do not perform lazy search above this match length */
130*2d60b848STomohiro Kusumi    ush nice_length; /* quit search above this match length */
131*2d60b848STomohiro Kusumi    ush max_chain;
132*2d60b848STomohiro Kusumi    compress_func func;
133*2d60b848STomohiro Kusumi } config;
134*2d60b848STomohiro Kusumi 
135*2d60b848STomohiro Kusumi local const config configuration_table[10] = {
136*2d60b848STomohiro Kusumi /*      good lazy nice chain */
137*2d60b848STomohiro Kusumi /* 0 */ {0,    0,  0,    0, deflate_slow/*deflate_stored*/},  /* store only */
138*2d60b848STomohiro Kusumi /* 1 */ {4,    4,  8,    4, deflate_slow/*deflate_fast*/}, /* max speed, no lazy matches */
139*2d60b848STomohiro Kusumi /* 2 */ {4,    5, 16,    8, deflate_slow/*deflate_fast*/},
140*2d60b848STomohiro Kusumi /* 3 */ {4,    6, 32,   32, deflate_slow/*deflate_fast*/},
141*2d60b848STomohiro Kusumi 
142*2d60b848STomohiro Kusumi /* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
143*2d60b848STomohiro Kusumi /* 5 */ {8,   16, 32,   32, deflate_slow},
144*2d60b848STomohiro Kusumi /* 6 */ {8,   16, 128, 128, deflate_slow},
145*2d60b848STomohiro Kusumi /* 7 */ {8,   32, 128, 256, deflate_slow},
146*2d60b848STomohiro Kusumi /* 8 */ {32, 128, 258, 1024, deflate_slow},
147*2d60b848STomohiro Kusumi /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
148*2d60b848STomohiro Kusumi 
149*2d60b848STomohiro Kusumi /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
150*2d60b848STomohiro Kusumi  * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
151*2d60b848STomohiro Kusumi  * meaning.
152*2d60b848STomohiro Kusumi  */
153*2d60b848STomohiro Kusumi 
154*2d60b848STomohiro Kusumi #define EQUAL 0
155*2d60b848STomohiro Kusumi /* result of memcmp for equal strings */
156*2d60b848STomohiro Kusumi 
157*2d60b848STomohiro Kusumi #ifndef NO_DUMMY_DECL
158*2d60b848STomohiro Kusumi struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
159*2d60b848STomohiro Kusumi #endif
160*2d60b848STomohiro Kusumi 
161*2d60b848STomohiro Kusumi /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
162*2d60b848STomohiro Kusumi #define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
163*2d60b848STomohiro Kusumi 
164*2d60b848STomohiro Kusumi /* ===========================================================================
165*2d60b848STomohiro Kusumi  * Update a hash value with the given input byte
166*2d60b848STomohiro Kusumi  * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
167*2d60b848STomohiro Kusumi  *    input characters, so that a running hash key can be computed from the
168*2d60b848STomohiro Kusumi  *    previous key instead of complete recalculation each time.
169*2d60b848STomohiro Kusumi  */
170*2d60b848STomohiro Kusumi #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
171*2d60b848STomohiro Kusumi 
172*2d60b848STomohiro Kusumi 
173*2d60b848STomohiro Kusumi /* ===========================================================================
174*2d60b848STomohiro Kusumi  * Insert string str in the dictionary and set match_head to the previous head
175*2d60b848STomohiro Kusumi  * of the hash chain (the most recent string with same hash key). Return
176*2d60b848STomohiro Kusumi  * the previous length of the hash chain.
177*2d60b848STomohiro Kusumi  * If this file is compiled with -DFASTEST, the compression level is forced
178*2d60b848STomohiro Kusumi  * to 1, and no hash chains are maintained.
179*2d60b848STomohiro Kusumi  * IN  assertion: all calls to to INSERT_STRING are made with consecutive
180*2d60b848STomohiro Kusumi  *    input characters and the first MIN_MATCH bytes of str are valid
181*2d60b848STomohiro Kusumi  *    (except for the last MIN_MATCH-1 bytes of the input file).
182*2d60b848STomohiro Kusumi  */
183*2d60b848STomohiro Kusumi #define INSERT_STRING(s, str, match_head) \
184*2d60b848STomohiro Kusumi    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
185*2d60b848STomohiro Kusumi     match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
186*2d60b848STomohiro Kusumi     s->head[s->ins_h] = (Pos)(str))
187*2d60b848STomohiro Kusumi 
188*2d60b848STomohiro Kusumi /* ===========================================================================
189*2d60b848STomohiro Kusumi  * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
190*2d60b848STomohiro Kusumi  * prev[] will be initialized on the fly.
191*2d60b848STomohiro Kusumi  */
192*2d60b848STomohiro Kusumi #define CLEAR_HASH(s) \
193*2d60b848STomohiro Kusumi     s->head[s->hash_size-1] = NIL; \
194*2d60b848STomohiro Kusumi     zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
195*2d60b848STomohiro Kusumi 
196*2d60b848STomohiro Kusumi /* ========================================================================= */
197*2d60b848STomohiro Kusumi int
deflateInit_(z_streamp strm,int level,const char * version,int stream_size)198*2d60b848STomohiro Kusumi deflateInit_(z_streamp strm, int level, const char *version, int stream_size)
199*2d60b848STomohiro Kusumi {
200*2d60b848STomohiro Kusumi     return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
201*2d60b848STomohiro Kusumi                          Z_DEFAULT_STRATEGY, version, stream_size);
202*2d60b848STomohiro Kusumi     /* To do: ignore strm->next_in if we use it as window */
203*2d60b848STomohiro Kusumi }
204*2d60b848STomohiro Kusumi 
205*2d60b848STomohiro Kusumi /* ========================================================================= */
206*2d60b848STomohiro Kusumi int
deflateInit2_(z_streamp strm,int level,int method,int windowBits,int memLevel,int strategy,const char * version,int stream_size)207*2d60b848STomohiro Kusumi deflateInit2_(z_streamp strm, int level, int method, int windowBits,
208*2d60b848STomohiro Kusumi 	int memLevel, int strategy, const char *version, int stream_size)
209*2d60b848STomohiro Kusumi {
210*2d60b848STomohiro Kusumi     deflate_state *s;
211*2d60b848STomohiro Kusumi     int wrap = 1;
212*2d60b848STomohiro Kusumi     static const char my_version[] = ZLIB_VERSION;
213*2d60b848STomohiro Kusumi 
214*2d60b848STomohiro Kusumi     ushf *overlay;
215*2d60b848STomohiro Kusumi     /* We overlay pending_buf and d_buf+l_buf. This works since the average
216*2d60b848STomohiro Kusumi      * output size for (length,distance) codes is <= 24 bits.
217*2d60b848STomohiro Kusumi      */
218*2d60b848STomohiro Kusumi 
219*2d60b848STomohiro Kusumi     if (version == Z_NULL || version[0] != my_version[0] ||
220*2d60b848STomohiro Kusumi         stream_size != sizeof(z_stream)) {
221*2d60b848STomohiro Kusumi         return Z_VERSION_ERROR;
222*2d60b848STomohiro Kusumi     }
223*2d60b848STomohiro Kusumi     if (strm == Z_NULL) return Z_STREAM_ERROR;
224*2d60b848STomohiro Kusumi 
225*2d60b848STomohiro Kusumi     strm->msg = Z_NULL;
226*2d60b848STomohiro Kusumi 
227*2d60b848STomohiro Kusumi     if (level == Z_DEFAULT_COMPRESSION) level = 6;
228*2d60b848STomohiro Kusumi 
229*2d60b848STomohiro Kusumi     if (windowBits < 0) { /* suppress zlib wrapper */
230*2d60b848STomohiro Kusumi         wrap = 0;
231*2d60b848STomohiro Kusumi         windowBits = -windowBits;
232*2d60b848STomohiro Kusumi     }
233*2d60b848STomohiro Kusumi     if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
234*2d60b848STomohiro Kusumi         windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
235*2d60b848STomohiro Kusumi         strategy < 0 || strategy > Z_FIXED) {
236*2d60b848STomohiro Kusumi         return Z_STREAM_ERROR;
237*2d60b848STomohiro Kusumi     }
238*2d60b848STomohiro Kusumi     if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */
239*2d60b848STomohiro Kusumi     s = (deflate_state *) kmalloc(sizeof(*s), C_ZLIB_BUFFER_DEFLATE, M_INTWAIT);
240*2d60b848STomohiro Kusumi     if (s == Z_NULL) return Z_MEM_ERROR;
241*2d60b848STomohiro Kusumi     strm->state = (struct internal_state FAR *)s;
242*2d60b848STomohiro Kusumi     s->strm = strm;
243*2d60b848STomohiro Kusumi 
244*2d60b848STomohiro Kusumi     s->wrap = wrap;
245*2d60b848STomohiro Kusumi     s->w_bits = windowBits;
246*2d60b848STomohiro Kusumi     s->w_size = 1 << s->w_bits;
247*2d60b848STomohiro Kusumi     s->w_mask = s->w_size - 1;
248*2d60b848STomohiro Kusumi 
249*2d60b848STomohiro Kusumi     s->hash_bits = memLevel + 7;
250*2d60b848STomohiro Kusumi     s->hash_size = 1 << s->hash_bits;
251*2d60b848STomohiro Kusumi     s->hash_mask = s->hash_size - 1;
252*2d60b848STomohiro Kusumi     s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
253*2d60b848STomohiro Kusumi 
254*2d60b848STomohiro Kusumi     s->window = (Bytef *) kmalloc((s->w_size)*2*sizeof(Byte), C_ZLIB_BUFFER_DEFLATE, M_INTWAIT);
255*2d60b848STomohiro Kusumi     s->prev   = (Posf *)  kmalloc((s->w_size)*sizeof(Pos), C_ZLIB_BUFFER_DEFLATE, M_INTWAIT);
256*2d60b848STomohiro Kusumi     s->head   = (Posf *)  kmalloc((s->hash_size)*sizeof(Pos), C_ZLIB_BUFFER_DEFLATE, M_INTWAIT);
257*2d60b848STomohiro Kusumi 
258*2d60b848STomohiro Kusumi     s->high_water = 0;      /* nothing written to s->window yet */
259*2d60b848STomohiro Kusumi 
260*2d60b848STomohiro Kusumi     s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
261*2d60b848STomohiro Kusumi 
262*2d60b848STomohiro Kusumi     overlay = (ushf *) kmalloc((s->lit_bufsize)*(sizeof(ush)+2), C_ZLIB_BUFFER_DEFLATE, M_INTWAIT);
263*2d60b848STomohiro Kusumi     s->pending_buf = (uchf *) overlay;
264*2d60b848STomohiro Kusumi     s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
265*2d60b848STomohiro Kusumi 
266*2d60b848STomohiro Kusumi     if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
267*2d60b848STomohiro Kusumi         s->pending_buf == Z_NULL) {
268*2d60b848STomohiro Kusumi         s->status = FINISH_STATE;
269*2d60b848STomohiro Kusumi         strm->msg = ERR_MSG(Z_MEM_ERROR);
270*2d60b848STomohiro Kusumi         deflateEnd (strm);
271*2d60b848STomohiro Kusumi         return Z_MEM_ERROR;
272*2d60b848STomohiro Kusumi     }
273*2d60b848STomohiro Kusumi     s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
274*2d60b848STomohiro Kusumi     s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
275*2d60b848STomohiro Kusumi 
276*2d60b848STomohiro Kusumi     s->level = level;
277*2d60b848STomohiro Kusumi     s->strategy = strategy;
278*2d60b848STomohiro Kusumi     s->method = (Byte)method;
279*2d60b848STomohiro Kusumi 
280*2d60b848STomohiro Kusumi     return deflateReset(strm);
281*2d60b848STomohiro Kusumi }
282*2d60b848STomohiro Kusumi 
283*2d60b848STomohiro Kusumi /* ========================================================================= */
284*2d60b848STomohiro Kusumi int
deflateResetKeep(z_streamp strm)285*2d60b848STomohiro Kusumi deflateResetKeep (z_streamp strm)
286*2d60b848STomohiro Kusumi {
287*2d60b848STomohiro Kusumi     deflate_state *s;
288*2d60b848STomohiro Kusumi 
289*2d60b848STomohiro Kusumi     if (strm == Z_NULL || strm->state == Z_NULL) {
290*2d60b848STomohiro Kusumi         return Z_STREAM_ERROR;
291*2d60b848STomohiro Kusumi     }
292*2d60b848STomohiro Kusumi 
293*2d60b848STomohiro Kusumi     strm->total_in = strm->total_out = 0;
294*2d60b848STomohiro Kusumi     strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
295*2d60b848STomohiro Kusumi     strm->data_type = Z_UNKNOWN;
296*2d60b848STomohiro Kusumi 
297*2d60b848STomohiro Kusumi     s = (deflate_state *)strm->state;
298*2d60b848STomohiro Kusumi     s->pending = 0;
299*2d60b848STomohiro Kusumi     s->pending_out = s->pending_buf;
300*2d60b848STomohiro Kusumi 
301*2d60b848STomohiro Kusumi     if (s->wrap < 0) {
302*2d60b848STomohiro Kusumi         s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
303*2d60b848STomohiro Kusumi     }
304*2d60b848STomohiro Kusumi     s->status = s->wrap ? INIT_STATE : BUSY_STATE;
305*2d60b848STomohiro Kusumi     strm->adler = adler32(0L, Z_NULL, 0);
306*2d60b848STomohiro Kusumi     s->last_flush = Z_NO_FLUSH;
307*2d60b848STomohiro Kusumi 
308*2d60b848STomohiro Kusumi     _tr_init(s);
309*2d60b848STomohiro Kusumi 
310*2d60b848STomohiro Kusumi     return Z_OK;
311*2d60b848STomohiro Kusumi }
312*2d60b848STomohiro Kusumi 
313*2d60b848STomohiro Kusumi /* ========================================================================= */
314*2d60b848STomohiro Kusumi int
deflateReset(z_streamp strm)315*2d60b848STomohiro Kusumi deflateReset (z_streamp strm)
316*2d60b848STomohiro Kusumi {
317*2d60b848STomohiro Kusumi     int ret;
318*2d60b848STomohiro Kusumi 
319*2d60b848STomohiro Kusumi     ret = deflateResetKeep(strm);
320*2d60b848STomohiro Kusumi     if (ret == Z_OK)
321*2d60b848STomohiro Kusumi         lm_init(strm->state);
322*2d60b848STomohiro Kusumi     return ret;
323*2d60b848STomohiro Kusumi }
324*2d60b848STomohiro Kusumi 
325*2d60b848STomohiro Kusumi /* =========================================================================
326*2d60b848STomohiro Kusumi  * Put a short in the pending buffer. The 16-bit value is put in MSB order.
327*2d60b848STomohiro Kusumi  * IN assertion: the stream state is correct and there is enough room in
328*2d60b848STomohiro Kusumi  * pending_buf.
329*2d60b848STomohiro Kusumi  */
330*2d60b848STomohiro Kusumi local
331*2d60b848STomohiro Kusumi void
putShortMSB(deflate_state * s,uInt b)332*2d60b848STomohiro Kusumi putShortMSB (deflate_state *s, uInt b)
333*2d60b848STomohiro Kusumi {
334*2d60b848STomohiro Kusumi     put_byte(s, (Byte)(b >> 8));
335*2d60b848STomohiro Kusumi     put_byte(s, (Byte)(b & 0xff));
336*2d60b848STomohiro Kusumi }
337*2d60b848STomohiro Kusumi 
338*2d60b848STomohiro Kusumi /* =========================================================================
339*2d60b848STomohiro Kusumi  * Flush as much pending output as possible. All deflate() output goes
340*2d60b848STomohiro Kusumi  * through this function so some applications may wish to modify it
341*2d60b848STomohiro Kusumi  * to avoid allocating a large strm->next_out buffer and copying into it.
342*2d60b848STomohiro Kusumi  * (See also read_buf()).
343*2d60b848STomohiro Kusumi  */
344*2d60b848STomohiro Kusumi local
345*2d60b848STomohiro Kusumi void
flush_pending(z_streamp strm)346*2d60b848STomohiro Kusumi flush_pending(z_streamp strm)
347*2d60b848STomohiro Kusumi {
348*2d60b848STomohiro Kusumi     unsigned len;
349*2d60b848STomohiro Kusumi     deflate_state *s = strm->state;
350*2d60b848STomohiro Kusumi 
351*2d60b848STomohiro Kusumi     _tr_flush_bits(s);
352*2d60b848STomohiro Kusumi     len = s->pending;
353*2d60b848STomohiro Kusumi     if (len > strm->avail_out) len = strm->avail_out;
354*2d60b848STomohiro Kusumi     if (len == 0) return;
355*2d60b848STomohiro Kusumi 
356*2d60b848STomohiro Kusumi     zmemcpy(strm->next_out, s->pending_out, len);
357*2d60b848STomohiro Kusumi     strm->next_out  += len;
358*2d60b848STomohiro Kusumi     s->pending_out  += len;
359*2d60b848STomohiro Kusumi     strm->total_out += len;
360*2d60b848STomohiro Kusumi     strm->avail_out  -= len;
361*2d60b848STomohiro Kusumi     s->pending -= len;
362*2d60b848STomohiro Kusumi     if (s->pending == 0) {
363*2d60b848STomohiro Kusumi         s->pending_out = s->pending_buf;
364*2d60b848STomohiro Kusumi     }
365*2d60b848STomohiro Kusumi }
366*2d60b848STomohiro Kusumi 
367*2d60b848STomohiro Kusumi /* ========================================================================= */
368*2d60b848STomohiro Kusumi int
deflate(z_streamp strm,int flush)369*2d60b848STomohiro Kusumi deflate (z_streamp strm, int flush)
370*2d60b848STomohiro Kusumi {
371*2d60b848STomohiro Kusumi     int old_flush; /* value of flush param for previous deflate call */
372*2d60b848STomohiro Kusumi     deflate_state *s;
373*2d60b848STomohiro Kusumi 
374*2d60b848STomohiro Kusumi     if (strm == Z_NULL || strm->state == Z_NULL ||
375*2d60b848STomohiro Kusumi         flush > Z_BLOCK || flush < 0) {
376*2d60b848STomohiro Kusumi         return Z_STREAM_ERROR;
377*2d60b848STomohiro Kusumi     }
378*2d60b848STomohiro Kusumi     s = strm->state;
379*2d60b848STomohiro Kusumi 
380*2d60b848STomohiro Kusumi     if (strm->next_out == Z_NULL ||
381*2d60b848STomohiro Kusumi         (strm->next_in == Z_NULL && strm->avail_in != 0) ||
382*2d60b848STomohiro Kusumi         (s->status == FINISH_STATE && flush != Z_FINISH)) {
383*2d60b848STomohiro Kusumi         ERR_RETURN(strm, Z_STREAM_ERROR);
384*2d60b848STomohiro Kusumi     }
385*2d60b848STomohiro Kusumi     if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
386*2d60b848STomohiro Kusumi 
387*2d60b848STomohiro Kusumi     s->strm = strm; /* just in case */
388*2d60b848STomohiro Kusumi     old_flush = s->last_flush;
389*2d60b848STomohiro Kusumi     s->last_flush = flush;
390*2d60b848STomohiro Kusumi 
391*2d60b848STomohiro Kusumi     /* Write the header */
392*2d60b848STomohiro Kusumi     uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
393*2d60b848STomohiro Kusumi     uInt level_flags;
394*2d60b848STomohiro Kusumi 
395*2d60b848STomohiro Kusumi     if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
396*2d60b848STomohiro Kusumi         level_flags = 0;
397*2d60b848STomohiro Kusumi     else if (s->level < 6)
398*2d60b848STomohiro Kusumi         level_flags = 1;
399*2d60b848STomohiro Kusumi     else if (s->level == 6)
400*2d60b848STomohiro Kusumi         level_flags = 2;
401*2d60b848STomohiro Kusumi     else
402*2d60b848STomohiro Kusumi         level_flags = 3;
403*2d60b848STomohiro Kusumi     header |= (level_flags << 6);
404*2d60b848STomohiro Kusumi     if (s->strstart != 0) header |= PRESET_DICT;
405*2d60b848STomohiro Kusumi     header += 31 - (header % 31);
406*2d60b848STomohiro Kusumi 
407*2d60b848STomohiro Kusumi     s->status = BUSY_STATE;
408*2d60b848STomohiro Kusumi     putShortMSB(s, header);
409*2d60b848STomohiro Kusumi 
410*2d60b848STomohiro Kusumi     /* Save the adler32 of the preset dictionary: */
411*2d60b848STomohiro Kusumi     if (s->strstart != 0) {
412*2d60b848STomohiro Kusumi         putShortMSB(s, (uInt)(strm->adler >> 16));
413*2d60b848STomohiro Kusumi         putShortMSB(s, (uInt)(strm->adler & 0xffff));
414*2d60b848STomohiro Kusumi     }
415*2d60b848STomohiro Kusumi     strm->adler = adler32(0L, Z_NULL, 0);
416*2d60b848STomohiro Kusumi 
417*2d60b848STomohiro Kusumi     /* Flush as much pending output as possible */
418*2d60b848STomohiro Kusumi     if (s->pending != 0) {
419*2d60b848STomohiro Kusumi         flush_pending(strm);
420*2d60b848STomohiro Kusumi         if (strm->avail_out == 0) {
421*2d60b848STomohiro Kusumi             /* Since avail_out is 0, deflate will be called again with
422*2d60b848STomohiro Kusumi              * more output space, but possibly with both pending and
423*2d60b848STomohiro Kusumi              * avail_in equal to zero. There won't be anything to do,
424*2d60b848STomohiro Kusumi              * but this is not an error situation so make sure we
425*2d60b848STomohiro Kusumi              * return OK instead of BUF_ERROR at next call of deflate:
426*2d60b848STomohiro Kusumi              */
427*2d60b848STomohiro Kusumi             s->last_flush = -1;
428*2d60b848STomohiro Kusumi             return Z_OK;
429*2d60b848STomohiro Kusumi         }
430*2d60b848STomohiro Kusumi 
431*2d60b848STomohiro Kusumi     /* Make sure there is something to do and avoid duplicate consecutive
432*2d60b848STomohiro Kusumi      * flushes. For repeated and useless calls with Z_FINISH, we keep
433*2d60b848STomohiro Kusumi      * returning Z_STREAM_END instead of Z_BUF_ERROR.
434*2d60b848STomohiro Kusumi      */
435*2d60b848STomohiro Kusumi     } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
436*2d60b848STomohiro Kusumi                flush != Z_FINISH) {
437*2d60b848STomohiro Kusumi         ERR_RETURN(strm, Z_BUF_ERROR);
438*2d60b848STomohiro Kusumi     }
439*2d60b848STomohiro Kusumi 
440*2d60b848STomohiro Kusumi     /* User must not provide more input after the first FINISH: */
441*2d60b848STomohiro Kusumi     if (s->status == FINISH_STATE && strm->avail_in != 0) {
442*2d60b848STomohiro Kusumi         ERR_RETURN(strm, Z_BUF_ERROR);
443*2d60b848STomohiro Kusumi     }
444*2d60b848STomohiro Kusumi 
445*2d60b848STomohiro Kusumi     /* Start a new block or continue the current one.
446*2d60b848STomohiro Kusumi      */
447*2d60b848STomohiro Kusumi     if (strm->avail_in != 0 || s->lookahead != 0 ||
448*2d60b848STomohiro Kusumi         (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
449*2d60b848STomohiro Kusumi         block_state bstate;
450*2d60b848STomohiro Kusumi 
451*2d60b848STomohiro Kusumi         bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
452*2d60b848STomohiro Kusumi                     (s->strategy == Z_RLE ? deflate_rle(s, flush) :
453*2d60b848STomohiro Kusumi                         (*(configuration_table[s->level].func))(s, flush));
454*2d60b848STomohiro Kusumi 
455*2d60b848STomohiro Kusumi         if (bstate == finish_started || bstate == finish_done) {
456*2d60b848STomohiro Kusumi             s->status = FINISH_STATE;
457*2d60b848STomohiro Kusumi         }
458*2d60b848STomohiro Kusumi         if (bstate == need_more || bstate == finish_started) {
459*2d60b848STomohiro Kusumi             if (strm->avail_out == 0) {
460*2d60b848STomohiro Kusumi                 s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
461*2d60b848STomohiro Kusumi             }
462*2d60b848STomohiro Kusumi             return Z_OK;
463*2d60b848STomohiro Kusumi             /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
464*2d60b848STomohiro Kusumi              * of deflate should use the same flush parameter to make sure
465*2d60b848STomohiro Kusumi              * that the flush is complete. So we don't have to output an
466*2d60b848STomohiro Kusumi              * empty block here, this will be done at next call. This also
467*2d60b848STomohiro Kusumi              * ensures that for a very small output buffer, we emit at most
468*2d60b848STomohiro Kusumi              * one empty block.
469*2d60b848STomohiro Kusumi              */
470*2d60b848STomohiro Kusumi         }
471*2d60b848STomohiro Kusumi         if (bstate == block_done) {
472*2d60b848STomohiro Kusumi             if (flush == Z_PARTIAL_FLUSH) {
473*2d60b848STomohiro Kusumi                 _tr_align(s);
474*2d60b848STomohiro Kusumi             } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
475*2d60b848STomohiro Kusumi                 _tr_stored_block(s, (char*)0, 0L, 0);
476*2d60b848STomohiro Kusumi                 /* For a full flush, this empty block will be recognized
477*2d60b848STomohiro Kusumi                  * as a special marker by inflate_sync().
478*2d60b848STomohiro Kusumi                  */
479*2d60b848STomohiro Kusumi                 if (flush == Z_FULL_FLUSH) {
480*2d60b848STomohiro Kusumi                     CLEAR_HASH(s);             /* forget history */
481*2d60b848STomohiro Kusumi                     if (s->lookahead == 0) {
482*2d60b848STomohiro Kusumi                         s->strstart = 0;
483*2d60b848STomohiro Kusumi                         s->block_start = 0L;
484*2d60b848STomohiro Kusumi                         s->insert = 0;
485*2d60b848STomohiro Kusumi                     }
486*2d60b848STomohiro Kusumi                 }
487*2d60b848STomohiro Kusumi             }
488*2d60b848STomohiro Kusumi             flush_pending(strm);
489*2d60b848STomohiro Kusumi             if (strm->avail_out == 0) {
490*2d60b848STomohiro Kusumi               s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
491*2d60b848STomohiro Kusumi               return Z_OK;
492*2d60b848STomohiro Kusumi             }
493*2d60b848STomohiro Kusumi         }
494*2d60b848STomohiro Kusumi     }
495*2d60b848STomohiro Kusumi     Assert(strm->avail_out > 0, "bug2");
496*2d60b848STomohiro Kusumi 
497*2d60b848STomohiro Kusumi     if (flush != Z_FINISH) return Z_OK;
498*2d60b848STomohiro Kusumi     if (s->wrap <= 0) return Z_STREAM_END;
499*2d60b848STomohiro Kusumi 
500*2d60b848STomohiro Kusumi     /* Write the trailer */
501*2d60b848STomohiro Kusumi     putShortMSB(s, (uInt)(strm->adler >> 16));
502*2d60b848STomohiro Kusumi     putShortMSB(s, (uInt)(strm->adler & 0xffff));
503*2d60b848STomohiro Kusumi 
504*2d60b848STomohiro Kusumi     flush_pending(strm);
505*2d60b848STomohiro Kusumi     /* If avail_out is zero, the application will call deflate again
506*2d60b848STomohiro Kusumi      * to flush the rest.
507*2d60b848STomohiro Kusumi      */
508*2d60b848STomohiro Kusumi     if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
509*2d60b848STomohiro Kusumi     return s->pending != 0 ? Z_OK : Z_STREAM_END;
510*2d60b848STomohiro Kusumi }
511*2d60b848STomohiro Kusumi 
512*2d60b848STomohiro Kusumi /* ========================================================================= */
513*2d60b848STomohiro Kusumi int
deflateEnd(z_streamp strm)514*2d60b848STomohiro Kusumi deflateEnd (z_streamp strm)
515*2d60b848STomohiro Kusumi {
516*2d60b848STomohiro Kusumi     int status;
517*2d60b848STomohiro Kusumi 
518*2d60b848STomohiro Kusumi     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
519*2d60b848STomohiro Kusumi 
520*2d60b848STomohiro Kusumi     status = strm->state->status;
521*2d60b848STomohiro Kusumi     if (status != INIT_STATE &&
522*2d60b848STomohiro Kusumi         status != EXTRA_STATE &&
523*2d60b848STomohiro Kusumi         status != NAME_STATE &&
524*2d60b848STomohiro Kusumi         status != COMMENT_STATE &&
525*2d60b848STomohiro Kusumi         status != HCRC_STATE &&
526*2d60b848STomohiro Kusumi         status != BUSY_STATE &&
527*2d60b848STomohiro Kusumi         status != FINISH_STATE) {
528*2d60b848STomohiro Kusumi       return Z_STREAM_ERROR;
529*2d60b848STomohiro Kusumi     }
530*2d60b848STomohiro Kusumi 
531*2d60b848STomohiro Kusumi     /* Deallocate in reverse order of allocations: */
532*2d60b848STomohiro Kusumi     kfree(strm->state->pending_buf, C_ZLIB_BUFFER_DEFLATE);
533*2d60b848STomohiro Kusumi     kfree(strm->state->head, C_ZLIB_BUFFER_DEFLATE);
534*2d60b848STomohiro Kusumi     kfree(strm->state->prev, C_ZLIB_BUFFER_DEFLATE);
535*2d60b848STomohiro Kusumi     kfree(strm->state->window, C_ZLIB_BUFFER_DEFLATE);
536*2d60b848STomohiro Kusumi 
537*2d60b848STomohiro Kusumi     kfree(strm->state, C_ZLIB_BUFFER_DEFLATE);
538*2d60b848STomohiro Kusumi     strm->state = Z_NULL;
539*2d60b848STomohiro Kusumi 
540*2d60b848STomohiro Kusumi     return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
541*2d60b848STomohiro Kusumi }
542*2d60b848STomohiro Kusumi 
543*2d60b848STomohiro Kusumi /* ===========================================================================
544*2d60b848STomohiro Kusumi  * Read a new buffer from the current input stream, update the adler32
545*2d60b848STomohiro Kusumi  * and total number of bytes read.  All deflate() input goes through
546*2d60b848STomohiro Kusumi  * this function so some applications may wish to modify it to avoid
547*2d60b848STomohiro Kusumi  * allocating a large strm->next_in buffer and copying from it.
548*2d60b848STomohiro Kusumi  * (See also flush_pending()).
549*2d60b848STomohiro Kusumi  */
550*2d60b848STomohiro Kusumi local
551*2d60b848STomohiro Kusumi int
read_buf(z_streamp strm,Bytef * buf,unsigned size)552*2d60b848STomohiro Kusumi read_buf(z_streamp strm, Bytef *buf, unsigned size)
553*2d60b848STomohiro Kusumi {
554*2d60b848STomohiro Kusumi     unsigned len = strm->avail_in;
555*2d60b848STomohiro Kusumi 
556*2d60b848STomohiro Kusumi     if (len > size) len = size;
557*2d60b848STomohiro Kusumi     if (len == 0) return 0;
558*2d60b848STomohiro Kusumi 
559*2d60b848STomohiro Kusumi     strm->avail_in  -= len;
560*2d60b848STomohiro Kusumi 
561*2d60b848STomohiro Kusumi     zmemcpy(buf, strm->next_in, len);
562*2d60b848STomohiro Kusumi     if (strm->state->wrap == 1) {
563*2d60b848STomohiro Kusumi         strm->adler = adler32(strm->adler, buf, len);
564*2d60b848STomohiro Kusumi     }
565*2d60b848STomohiro Kusumi 
566*2d60b848STomohiro Kusumi     strm->next_in  += len;
567*2d60b848STomohiro Kusumi     strm->total_in += len;
568*2d60b848STomohiro Kusumi 
569*2d60b848STomohiro Kusumi     return (int)len;
570*2d60b848STomohiro Kusumi }
571*2d60b848STomohiro Kusumi 
572*2d60b848STomohiro Kusumi /* ===========================================================================
573*2d60b848STomohiro Kusumi  * Initialize the "longest match" routines for a new zlib stream
574*2d60b848STomohiro Kusumi  */
575*2d60b848STomohiro Kusumi local
576*2d60b848STomohiro Kusumi void
lm_init(deflate_state * s)577*2d60b848STomohiro Kusumi lm_init (deflate_state *s)
578*2d60b848STomohiro Kusumi {
579*2d60b848STomohiro Kusumi     s->window_size = (ulg)2L*s->w_size;
580*2d60b848STomohiro Kusumi 
581*2d60b848STomohiro Kusumi     CLEAR_HASH(s);
582*2d60b848STomohiro Kusumi 
583*2d60b848STomohiro Kusumi     /* Set the default configuration parameters:
584*2d60b848STomohiro Kusumi      */
585*2d60b848STomohiro Kusumi     s->max_lazy_match   = configuration_table[s->level].max_lazy;
586*2d60b848STomohiro Kusumi     s->good_match       = configuration_table[s->level].good_length;
587*2d60b848STomohiro Kusumi     s->nice_match       = configuration_table[s->level].nice_length;
588*2d60b848STomohiro Kusumi     s->max_chain_length = configuration_table[s->level].max_chain;
589*2d60b848STomohiro Kusumi 
590*2d60b848STomohiro Kusumi     s->strstart = 0;
591*2d60b848STomohiro Kusumi     s->block_start = 0L;
592*2d60b848STomohiro Kusumi     s->lookahead = 0;
593*2d60b848STomohiro Kusumi     s->insert = 0;
594*2d60b848STomohiro Kusumi     s->match_length = s->prev_length = MIN_MATCH-1;
595*2d60b848STomohiro Kusumi     s->match_available = 0;
596*2d60b848STomohiro Kusumi     s->ins_h = 0;
597*2d60b848STomohiro Kusumi #ifndef FASTEST
598*2d60b848STomohiro Kusumi #ifdef ASMV
599*2d60b848STomohiro Kusumi     match_init(); /* initialize the asm code */
600*2d60b848STomohiro Kusumi #endif
601*2d60b848STomohiro Kusumi #endif
602*2d60b848STomohiro Kusumi }
603*2d60b848STomohiro Kusumi 
604*2d60b848STomohiro Kusumi #ifndef FASTEST
605*2d60b848STomohiro Kusumi /* ===========================================================================
606*2d60b848STomohiro Kusumi  * Set match_start to the longest match starting at the given string and
607*2d60b848STomohiro Kusumi  * return its length. Matches shorter or equal to prev_length are discarded,
608*2d60b848STomohiro Kusumi  * in which case the result is equal to prev_length and match_start is
609*2d60b848STomohiro Kusumi  * garbage.
610*2d60b848STomohiro Kusumi  * IN assertions: cur_match is the head of the hash chain for the current
611*2d60b848STomohiro Kusumi  *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
612*2d60b848STomohiro Kusumi  * OUT assertion: the match length is not greater than s->lookahead.
613*2d60b848STomohiro Kusumi  */
614*2d60b848STomohiro Kusumi #ifndef ASMV
615*2d60b848STomohiro Kusumi /* For 80x86 and 680x0, an optimized version will be provided in match.asm or
616*2d60b848STomohiro Kusumi  * match.S. The code will be functionally equivalent.
617*2d60b848STomohiro Kusumi  */
618*2d60b848STomohiro Kusumi local
619*2d60b848STomohiro Kusumi uInt
longest_match(deflate_state * s,IPos cur_match)620*2d60b848STomohiro Kusumi longest_match(deflate_state *s, IPos cur_match) /* cur_match = current match */
621*2d60b848STomohiro Kusumi {
622*2d60b848STomohiro Kusumi     unsigned chain_length = s->max_chain_length;/* max hash chain length */
623*2d60b848STomohiro Kusumi     register Bytef *scan = s->window + s->strstart; /* current string */
624*2d60b848STomohiro Kusumi     register Bytef *match;                       /* matched string */
625*2d60b848STomohiro Kusumi     register int len;                           /* length of current match */
626*2d60b848STomohiro Kusumi     int best_len = s->prev_length;              /* best match length so far */
627*2d60b848STomohiro Kusumi     int nice_match = s->nice_match;             /* stop if match long enough */
628*2d60b848STomohiro Kusumi     IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
629*2d60b848STomohiro Kusumi         s->strstart - (IPos)MAX_DIST(s) : NIL;
630*2d60b848STomohiro Kusumi     /* Stop when cur_match becomes <= limit. To simplify the code,
631*2d60b848STomohiro Kusumi      * we prevent matches with the string of window index 0.
632*2d60b848STomohiro Kusumi      */
633*2d60b848STomohiro Kusumi     Posf *prev = s->prev;
634*2d60b848STomohiro Kusumi     uInt wmask = s->w_mask;
635*2d60b848STomohiro Kusumi 
636*2d60b848STomohiro Kusumi #ifdef UNALIGNED_OK
637*2d60b848STomohiro Kusumi     /* Compare two bytes at a time. Note: this is not always beneficial.
638*2d60b848STomohiro Kusumi      * Try with and without -DUNALIGNED_OK to check.
639*2d60b848STomohiro Kusumi      */
640*2d60b848STomohiro Kusumi     register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
641*2d60b848STomohiro Kusumi     register ush scan_start = *(ushf*)scan;
642*2d60b848STomohiro Kusumi     register ush scan_end   = *(ushf*)(scan+best_len-1);
643*2d60b848STomohiro Kusumi #else
644*2d60b848STomohiro Kusumi     register Bytef *strend = s->window + s->strstart + MAX_MATCH;
645*2d60b848STomohiro Kusumi     register Byte scan_end1  = scan[best_len-1];
646*2d60b848STomohiro Kusumi     register Byte scan_end   = scan[best_len];
647*2d60b848STomohiro Kusumi #endif
648*2d60b848STomohiro Kusumi 
649*2d60b848STomohiro Kusumi     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
650*2d60b848STomohiro Kusumi      * It is easy to get rid of this optimization if necessary.
651*2d60b848STomohiro Kusumi      */
652*2d60b848STomohiro Kusumi     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
653*2d60b848STomohiro Kusumi 
654*2d60b848STomohiro Kusumi     /* Do not waste too much time if we already have a good match: */
655*2d60b848STomohiro Kusumi     if (s->prev_length >= s->good_match) {
656*2d60b848STomohiro Kusumi         chain_length >>= 2;
657*2d60b848STomohiro Kusumi     }
658*2d60b848STomohiro Kusumi     /* Do not look for matches beyond the end of the input. This is necessary
659*2d60b848STomohiro Kusumi      * to make deflate deterministic.
660*2d60b848STomohiro Kusumi      */
661*2d60b848STomohiro Kusumi     if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
662*2d60b848STomohiro Kusumi 
663*2d60b848STomohiro Kusumi     Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
664*2d60b848STomohiro Kusumi 
665*2d60b848STomohiro Kusumi     do {
666*2d60b848STomohiro Kusumi         Assert(cur_match < s->strstart, "no future");
667*2d60b848STomohiro Kusumi         match = s->window + cur_match;
668*2d60b848STomohiro Kusumi 
669*2d60b848STomohiro Kusumi         /* Skip to next match if the match length cannot increase
670*2d60b848STomohiro Kusumi          * or if the match length is less than 2.  Note that the checks below
671*2d60b848STomohiro Kusumi          * for insufficient lookahead only occur occasionally for performance
672*2d60b848STomohiro Kusumi          * reasons.  Therefore uninitialized memory will be accessed, and
673*2d60b848STomohiro Kusumi          * conditional jumps will be made that depend on those values.
674*2d60b848STomohiro Kusumi          * However the length of the match is limited to the lookahead, so
675*2d60b848STomohiro Kusumi          * the output of deflate is not affected by the uninitialized values.
676*2d60b848STomohiro Kusumi          */
677*2d60b848STomohiro Kusumi #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
678*2d60b848STomohiro Kusumi         /* This code assumes sizeof(unsigned short) == 2. Do not use
679*2d60b848STomohiro Kusumi          * UNALIGNED_OK if your compiler uses a different size.
680*2d60b848STomohiro Kusumi          */
681*2d60b848STomohiro Kusumi         if (*(ushf*)(match+best_len-1) != scan_end ||
682*2d60b848STomohiro Kusumi             *(ushf*)match != scan_start) continue;
683*2d60b848STomohiro Kusumi 
684*2d60b848STomohiro Kusumi         /* It is not necessary to compare scan[2] and match[2] since they are
685*2d60b848STomohiro Kusumi          * always equal when the other bytes match, given that the hash keys
686*2d60b848STomohiro Kusumi          * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
687*2d60b848STomohiro Kusumi          * strstart+3, +5, ... up to strstart+257. We check for insufficient
688*2d60b848STomohiro Kusumi          * lookahead only every 4th comparison; the 128th check will be made
689*2d60b848STomohiro Kusumi          * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
690*2d60b848STomohiro Kusumi          * necessary to put more guard bytes at the end of the window, or
691*2d60b848STomohiro Kusumi          * to check more often for insufficient lookahead.
692*2d60b848STomohiro Kusumi          */
693*2d60b848STomohiro Kusumi         Assert(scan[2] == match[2], "scan[2]?");
694*2d60b848STomohiro Kusumi         scan++, match++;
695*2d60b848STomohiro Kusumi         do {
696*2d60b848STomohiro Kusumi         } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
697*2d60b848STomohiro Kusumi                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
698*2d60b848STomohiro Kusumi                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
699*2d60b848STomohiro Kusumi                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
700*2d60b848STomohiro Kusumi                  scan < strend);
701*2d60b848STomohiro Kusumi         /* The funny "do {}" generates better code on most compilers */
702*2d60b848STomohiro Kusumi 
703*2d60b848STomohiro Kusumi         /* Here, scan <= window+strstart+257 */
704*2d60b848STomohiro Kusumi         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
705*2d60b848STomohiro Kusumi         if (*scan == *match) scan++;
706*2d60b848STomohiro Kusumi 
707*2d60b848STomohiro Kusumi         len = (MAX_MATCH - 1) - (int)(strend-scan);
708*2d60b848STomohiro Kusumi         scan = strend - (MAX_MATCH-1);
709*2d60b848STomohiro Kusumi 
710*2d60b848STomohiro Kusumi #else /* UNALIGNED_OK */
711*2d60b848STomohiro Kusumi 
712*2d60b848STomohiro Kusumi         if (match[best_len]   != scan_end  ||
713*2d60b848STomohiro Kusumi             match[best_len-1] != scan_end1 ||
714*2d60b848STomohiro Kusumi             *match            != *scan     ||
715*2d60b848STomohiro Kusumi             *++match          != scan[1])      continue;
716*2d60b848STomohiro Kusumi 
717*2d60b848STomohiro Kusumi         /* The check at best_len-1 can be removed because it will be made
718*2d60b848STomohiro Kusumi          * again later. (This heuristic is not always a win.)
719*2d60b848STomohiro Kusumi          * It is not necessary to compare scan[2] and match[2] since they
720*2d60b848STomohiro Kusumi          * are always equal when the other bytes match, given that
721*2d60b848STomohiro Kusumi          * the hash keys are equal and that HASH_BITS >= 8.
722*2d60b848STomohiro Kusumi          */
723*2d60b848STomohiro Kusumi         scan += 2, match++;
724*2d60b848STomohiro Kusumi         Assert(*scan == *match, "match[2]?");
725*2d60b848STomohiro Kusumi 
726*2d60b848STomohiro Kusumi         /* We check for insufficient lookahead only every 8th comparison;
727*2d60b848STomohiro Kusumi          * the 256th check will be made at strstart+258.
728*2d60b848STomohiro Kusumi          */
729*2d60b848STomohiro Kusumi         do {
730*2d60b848STomohiro Kusumi         } while (*++scan == *++match && *++scan == *++match &&
731*2d60b848STomohiro Kusumi                  *++scan == *++match && *++scan == *++match &&
732*2d60b848STomohiro Kusumi                  *++scan == *++match && *++scan == *++match &&
733*2d60b848STomohiro Kusumi                  *++scan == *++match && *++scan == *++match &&
734*2d60b848STomohiro Kusumi                  scan < strend);
735*2d60b848STomohiro Kusumi 
736*2d60b848STomohiro Kusumi         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
737*2d60b848STomohiro Kusumi 
738*2d60b848STomohiro Kusumi         len = MAX_MATCH - (int)(strend - scan);
739*2d60b848STomohiro Kusumi         scan = strend - MAX_MATCH;
740*2d60b848STomohiro Kusumi 
741*2d60b848STomohiro Kusumi #endif /* UNALIGNED_OK */
742*2d60b848STomohiro Kusumi 
743*2d60b848STomohiro Kusumi         if (len > best_len) {
744*2d60b848STomohiro Kusumi             s->match_start = cur_match;
745*2d60b848STomohiro Kusumi             best_len = len;
746*2d60b848STomohiro Kusumi             if (len >= nice_match) break;
747*2d60b848STomohiro Kusumi #ifdef UNALIGNED_OK
748*2d60b848STomohiro Kusumi             scan_end = *(ushf*)(scan+best_len-1);
749*2d60b848STomohiro Kusumi #else
750*2d60b848STomohiro Kusumi             scan_end1  = scan[best_len-1];
751*2d60b848STomohiro Kusumi             scan_end   = scan[best_len];
752*2d60b848STomohiro Kusumi #endif
753*2d60b848STomohiro Kusumi         }
754*2d60b848STomohiro Kusumi     } while ((cur_match = prev[cur_match & wmask]) > limit
755*2d60b848STomohiro Kusumi              && --chain_length != 0);
756*2d60b848STomohiro Kusumi 
757*2d60b848STomohiro Kusumi     if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
758*2d60b848STomohiro Kusumi     return s->lookahead;
759*2d60b848STomohiro Kusumi }
760*2d60b848STomohiro Kusumi #endif /* ASMV */
761*2d60b848STomohiro Kusumi 
762*2d60b848STomohiro Kusumi #endif /* FASTEST */
763*2d60b848STomohiro Kusumi 
764*2d60b848STomohiro Kusumi #ifdef H2_ZLIB_DEBUG
765*2d60b848STomohiro Kusumi /* ===========================================================================
766*2d60b848STomohiro Kusumi  * Check that the match at match_start is indeed a match.
767*2d60b848STomohiro Kusumi  */
768*2d60b848STomohiro Kusumi local
769*2d60b848STomohiro Kusumi void
check_match(deflate_state * s,IPos start,IPos match,int length)770*2d60b848STomohiro Kusumi check_match(deflate_state *s, IPos start, IPos match, int length)
771*2d60b848STomohiro Kusumi {
772*2d60b848STomohiro Kusumi     /* check that the match is indeed a match */
773*2d60b848STomohiro Kusumi     if (zmemcmp(s->window + match,
774*2d60b848STomohiro Kusumi                 s->window + start, length) != EQUAL) {
775*2d60b848STomohiro Kusumi         fprintf(stderr, " start %u, match %u, length %d\n",
776*2d60b848STomohiro Kusumi                 start, match, length);
777*2d60b848STomohiro Kusumi         do {
778*2d60b848STomohiro Kusumi             fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
779*2d60b848STomohiro Kusumi         } while (--length != 0);
780*2d60b848STomohiro Kusumi         z_error("invalid match");
781*2d60b848STomohiro Kusumi     }
782*2d60b848STomohiro Kusumi     if (z_verbose > 1) {
783*2d60b848STomohiro Kusumi         fprintf(stderr,"\\[%d,%d]", start-match, length);
784*2d60b848STomohiro Kusumi         do { putc(s->window[start++], stderr); } while (--length != 0);
785*2d60b848STomohiro Kusumi     }
786*2d60b848STomohiro Kusumi }
787*2d60b848STomohiro Kusumi #else
788*2d60b848STomohiro Kusumi #  define check_match(s, start, match, length)
789*2d60b848STomohiro Kusumi #endif /* H2_ZLIB_DEBUG */
790*2d60b848STomohiro Kusumi 
791*2d60b848STomohiro Kusumi /* ===========================================================================
792*2d60b848STomohiro Kusumi  * Fill the window when the lookahead becomes insufficient.
793*2d60b848STomohiro Kusumi  * Updates strstart and lookahead.
794*2d60b848STomohiro Kusumi  *
795*2d60b848STomohiro Kusumi  * IN assertion: lookahead < MIN_LOOKAHEAD
796*2d60b848STomohiro Kusumi  * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
797*2d60b848STomohiro Kusumi  *    At least one byte has been read, or avail_in == 0; reads are
798*2d60b848STomohiro Kusumi  *    performed for at least two bytes (required for the zip translate_eol
799*2d60b848STomohiro Kusumi  *    option -- not supported here).
800*2d60b848STomohiro Kusumi  */
801*2d60b848STomohiro Kusumi local
802*2d60b848STomohiro Kusumi void
fill_window(deflate_state * s)803*2d60b848STomohiro Kusumi fill_window(deflate_state *s)
804*2d60b848STomohiro Kusumi {
805*2d60b848STomohiro Kusumi     register unsigned n, m;
806*2d60b848STomohiro Kusumi     register Posf *p;
807*2d60b848STomohiro Kusumi     unsigned more;    /* Amount of free space at the end of the window. */
808*2d60b848STomohiro Kusumi     uInt wsize = s->w_size;
809*2d60b848STomohiro Kusumi 
810*2d60b848STomohiro Kusumi     Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
811*2d60b848STomohiro Kusumi 
812*2d60b848STomohiro Kusumi     do {
813*2d60b848STomohiro Kusumi         more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
814*2d60b848STomohiro Kusumi 
815*2d60b848STomohiro Kusumi         /* Deal with !@#$% 64K limit: */
816*2d60b848STomohiro Kusumi         if (sizeof(int) <= 2) {
817*2d60b848STomohiro Kusumi             if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
818*2d60b848STomohiro Kusumi                 more = wsize;
819*2d60b848STomohiro Kusumi 
820*2d60b848STomohiro Kusumi             } else if (more == (unsigned)(-1)) {
821*2d60b848STomohiro Kusumi                 /* Very unlikely, but possible on 16 bit machine if
822*2d60b848STomohiro Kusumi                  * strstart == 0 && lookahead == 1 (input done a byte at time)
823*2d60b848STomohiro Kusumi                  */
824*2d60b848STomohiro Kusumi                 more--;
825*2d60b848STomohiro Kusumi             }
826*2d60b848STomohiro Kusumi         }
827*2d60b848STomohiro Kusumi 
828*2d60b848STomohiro Kusumi         /* If the window is almost full and there is insufficient lookahead,
829*2d60b848STomohiro Kusumi          * move the upper half to the lower one to make room in the upper half.
830*2d60b848STomohiro Kusumi          */
831*2d60b848STomohiro Kusumi         if (s->strstart >= wsize+MAX_DIST(s)) {
832*2d60b848STomohiro Kusumi 
833*2d60b848STomohiro Kusumi             zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
834*2d60b848STomohiro Kusumi             s->match_start -= wsize;
835*2d60b848STomohiro Kusumi             s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
836*2d60b848STomohiro Kusumi             s->block_start -= (long) wsize;
837*2d60b848STomohiro Kusumi 
838*2d60b848STomohiro Kusumi             /* Slide the hash table (could be avoided with 32 bit values
839*2d60b848STomohiro Kusumi                at the expense of memory usage). We slide even when level == 0
840*2d60b848STomohiro Kusumi                to keep the hash table consistent if we switch back to level > 0
841*2d60b848STomohiro Kusumi                later. (Using level 0 permanently is not an optimal usage of
842*2d60b848STomohiro Kusumi                zlib, so we don't care about this pathological case.)
843*2d60b848STomohiro Kusumi              */
844*2d60b848STomohiro Kusumi             n = s->hash_size;
845*2d60b848STomohiro Kusumi             p = &s->head[n];
846*2d60b848STomohiro Kusumi             do {
847*2d60b848STomohiro Kusumi                 m = *--p;
848*2d60b848STomohiro Kusumi                 *p = (Pos)(m >= wsize ? m-wsize : NIL);
849*2d60b848STomohiro Kusumi             } while (--n);
850*2d60b848STomohiro Kusumi 
851*2d60b848STomohiro Kusumi             n = wsize;
852*2d60b848STomohiro Kusumi #ifndef FASTEST
853*2d60b848STomohiro Kusumi             p = &s->prev[n];
854*2d60b848STomohiro Kusumi             do {
855*2d60b848STomohiro Kusumi                 m = *--p;
856*2d60b848STomohiro Kusumi                 *p = (Pos)(m >= wsize ? m-wsize : NIL);
857*2d60b848STomohiro Kusumi                 /* If n is not on any hash chain, prev[n] is garbage but
858*2d60b848STomohiro Kusumi                  * its value will never be used.
859*2d60b848STomohiro Kusumi                  */
860*2d60b848STomohiro Kusumi             } while (--n);
861*2d60b848STomohiro Kusumi #endif
862*2d60b848STomohiro Kusumi             more += wsize;
863*2d60b848STomohiro Kusumi         }
864*2d60b848STomohiro Kusumi         if (s->strm->avail_in == 0) break;
865*2d60b848STomohiro Kusumi 
866*2d60b848STomohiro Kusumi         /* If there was no sliding:
867*2d60b848STomohiro Kusumi          *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
868*2d60b848STomohiro Kusumi          *    more == window_size - lookahead - strstart
869*2d60b848STomohiro Kusumi          * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
870*2d60b848STomohiro Kusumi          * => more >= window_size - 2*WSIZE + 2
871*2d60b848STomohiro Kusumi          * In the BIG_MEM or MMAP case (not yet supported),
872*2d60b848STomohiro Kusumi          *   window_size == input_size + MIN_LOOKAHEAD  &&
873*2d60b848STomohiro Kusumi          *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
874*2d60b848STomohiro Kusumi          * Otherwise, window_size == 2*WSIZE so more >= 2.
875*2d60b848STomohiro Kusumi          * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
876*2d60b848STomohiro Kusumi          */
877*2d60b848STomohiro Kusumi         Assert(more >= 2, "more < 2");
878*2d60b848STomohiro Kusumi 
879*2d60b848STomohiro Kusumi         n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
880*2d60b848STomohiro Kusumi         s->lookahead += n;
881*2d60b848STomohiro Kusumi 
882*2d60b848STomohiro Kusumi         /* Initialize the hash value now that we have some input: */
883*2d60b848STomohiro Kusumi         if (s->lookahead + s->insert >= MIN_MATCH) {
884*2d60b848STomohiro Kusumi             uInt str = s->strstart - s->insert;
885*2d60b848STomohiro Kusumi             s->ins_h = s->window[str];
886*2d60b848STomohiro Kusumi             UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
887*2d60b848STomohiro Kusumi #if MIN_MATCH != 3
888*2d60b848STomohiro Kusumi             Call UPDATE_HASH() MIN_MATCH-3 more times
889*2d60b848STomohiro Kusumi #endif
890*2d60b848STomohiro Kusumi             while (s->insert) {
891*2d60b848STomohiro Kusumi                 UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
892*2d60b848STomohiro Kusumi #ifndef FASTEST
893*2d60b848STomohiro Kusumi                 s->prev[str & s->w_mask] = s->head[s->ins_h];
894*2d60b848STomohiro Kusumi #endif
895*2d60b848STomohiro Kusumi                 s->head[s->ins_h] = (Pos)str;
896*2d60b848STomohiro Kusumi                 str++;
897*2d60b848STomohiro Kusumi                 s->insert--;
898*2d60b848STomohiro Kusumi                 if (s->lookahead + s->insert < MIN_MATCH)
899*2d60b848STomohiro Kusumi                     break;
900*2d60b848STomohiro Kusumi             }
901*2d60b848STomohiro Kusumi         }
902*2d60b848STomohiro Kusumi         /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
903*2d60b848STomohiro Kusumi          * but this is not important since only literal bytes will be emitted.
904*2d60b848STomohiro Kusumi          */
905*2d60b848STomohiro Kusumi 
906*2d60b848STomohiro Kusumi     } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
907*2d60b848STomohiro Kusumi 
908*2d60b848STomohiro Kusumi     /* If the WIN_INIT bytes after the end of the current data have never been
909*2d60b848STomohiro Kusumi      * written, then zero those bytes in order to avoid memory check reports of
910*2d60b848STomohiro Kusumi      * the use of uninitialized (or uninitialised as Julian writes) bytes by
911*2d60b848STomohiro Kusumi      * the longest match routines.  Update the high water mark for the next
912*2d60b848STomohiro Kusumi      * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
913*2d60b848STomohiro Kusumi      * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
914*2d60b848STomohiro Kusumi      */
915*2d60b848STomohiro Kusumi     if (s->high_water < s->window_size) {
916*2d60b848STomohiro Kusumi         ulg curr = s->strstart + (ulg)(s->lookahead);
917*2d60b848STomohiro Kusumi         ulg init;
918*2d60b848STomohiro Kusumi 
919*2d60b848STomohiro Kusumi         if (s->high_water < curr) {
920*2d60b848STomohiro Kusumi             /* Previous high water mark below current data -- zero WIN_INIT
921*2d60b848STomohiro Kusumi              * bytes or up to end of window, whichever is less.
922*2d60b848STomohiro Kusumi              */
923*2d60b848STomohiro Kusumi             init = s->window_size - curr;
924*2d60b848STomohiro Kusumi             if (init > WIN_INIT)
925*2d60b848STomohiro Kusumi                 init = WIN_INIT;
926*2d60b848STomohiro Kusumi             zmemzero(s->window + curr, (unsigned)init);
927*2d60b848STomohiro Kusumi             s->high_water = curr + init;
928*2d60b848STomohiro Kusumi         }
929*2d60b848STomohiro Kusumi         else if (s->high_water < (ulg)curr + WIN_INIT) {
930*2d60b848STomohiro Kusumi             /* High water mark at or above current data, but below current data
931*2d60b848STomohiro Kusumi              * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
932*2d60b848STomohiro Kusumi              * to end of window, whichever is less.
933*2d60b848STomohiro Kusumi              */
934*2d60b848STomohiro Kusumi             init = (ulg)curr + WIN_INIT - s->high_water;
935*2d60b848STomohiro Kusumi             if (init > s->window_size - s->high_water)
936*2d60b848STomohiro Kusumi                 init = s->window_size - s->high_water;
937*2d60b848STomohiro Kusumi             zmemzero(s->window + s->high_water, (unsigned)init);
938*2d60b848STomohiro Kusumi             s->high_water += init;
939*2d60b848STomohiro Kusumi         }
940*2d60b848STomohiro Kusumi     }
941*2d60b848STomohiro Kusumi 
942*2d60b848STomohiro Kusumi     Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
943*2d60b848STomohiro Kusumi            "not enough room for search");
944*2d60b848STomohiro Kusumi }
945*2d60b848STomohiro Kusumi 
946*2d60b848STomohiro Kusumi /* ===========================================================================
947*2d60b848STomohiro Kusumi  * Flush the current block, with given end-of-file flag.
948*2d60b848STomohiro Kusumi  * IN assertion: strstart is set to the end of the current match.
949*2d60b848STomohiro Kusumi  */
950*2d60b848STomohiro Kusumi #define FLUSH_BLOCK_ONLY(s, last) { \
951*2d60b848STomohiro Kusumi    _tr_flush_block(s, (s->block_start >= 0L ? \
952*2d60b848STomohiro Kusumi                    (charf *)&s->window[(unsigned)s->block_start] : \
953*2d60b848STomohiro Kusumi                    (charf *)Z_NULL), \
954*2d60b848STomohiro Kusumi                 (ulg)((long)s->strstart - s->block_start), \
955*2d60b848STomohiro Kusumi                 (last)); \
956*2d60b848STomohiro Kusumi    s->block_start = s->strstart; \
957*2d60b848STomohiro Kusumi    flush_pending(s->strm); \
958*2d60b848STomohiro Kusumi    Tracev((stderr,"[FLUSH]")); \
959*2d60b848STomohiro Kusumi }
960*2d60b848STomohiro Kusumi 
961*2d60b848STomohiro Kusumi /* Same but force premature exit if necessary. */
962*2d60b848STomohiro Kusumi #define FLUSH_BLOCK(s, last) { \
963*2d60b848STomohiro Kusumi    FLUSH_BLOCK_ONLY(s, last); \
964*2d60b848STomohiro Kusumi    if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
965*2d60b848STomohiro Kusumi }
966*2d60b848STomohiro Kusumi 
967*2d60b848STomohiro Kusumi #ifndef FASTEST
968*2d60b848STomohiro Kusumi /* ===========================================================================
969*2d60b848STomohiro Kusumi  * Same as above, but achieves better compression. We use a lazy
970*2d60b848STomohiro Kusumi  * evaluation for matches: a match is finally adopted only if there is
971*2d60b848STomohiro Kusumi  * no better match at the next window position.
972*2d60b848STomohiro Kusumi  */
973*2d60b848STomohiro Kusumi local
974*2d60b848STomohiro Kusumi block_state
deflate_slow(deflate_state * s,int flush)975*2d60b848STomohiro Kusumi deflate_slow(deflate_state *s, int flush)
976*2d60b848STomohiro Kusumi {
977*2d60b848STomohiro Kusumi     IPos hash_head;          /* head of hash chain */
978*2d60b848STomohiro Kusumi     int bflush;              /* set if current block must be flushed */
979*2d60b848STomohiro Kusumi 
980*2d60b848STomohiro Kusumi     /* Process the input block. */
981*2d60b848STomohiro Kusumi     for (;;) {
982*2d60b848STomohiro Kusumi         /* Make sure that we always have enough lookahead, except
983*2d60b848STomohiro Kusumi          * at the end of the input file. We need MAX_MATCH bytes
984*2d60b848STomohiro Kusumi          * for the next match, plus MIN_MATCH bytes to insert the
985*2d60b848STomohiro Kusumi          * string following the next match.
986*2d60b848STomohiro Kusumi          */
987*2d60b848STomohiro Kusumi         if (s->lookahead < MIN_LOOKAHEAD) {
988*2d60b848STomohiro Kusumi             fill_window(s);
989*2d60b848STomohiro Kusumi             if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
990*2d60b848STomohiro Kusumi                 return need_more;
991*2d60b848STomohiro Kusumi             }
992*2d60b848STomohiro Kusumi             if (s->lookahead == 0) break; /* flush the current block */
993*2d60b848STomohiro Kusumi         }
994*2d60b848STomohiro Kusumi 
995*2d60b848STomohiro Kusumi         /* Insert the string window[strstart .. strstart+2] in the
996*2d60b848STomohiro Kusumi          * dictionary, and set hash_head to the head of the hash chain:
997*2d60b848STomohiro Kusumi          */
998*2d60b848STomohiro Kusumi         hash_head = NIL;
999*2d60b848STomohiro Kusumi         if (s->lookahead >= MIN_MATCH) {
1000*2d60b848STomohiro Kusumi             INSERT_STRING(s, s->strstart, hash_head);
1001*2d60b848STomohiro Kusumi         }
1002*2d60b848STomohiro Kusumi 
1003*2d60b848STomohiro Kusumi         /* Find the longest match, discarding those <= prev_length.
1004*2d60b848STomohiro Kusumi          */
1005*2d60b848STomohiro Kusumi         s->prev_length = s->match_length, s->prev_match = s->match_start;
1006*2d60b848STomohiro Kusumi         s->match_length = MIN_MATCH-1;
1007*2d60b848STomohiro Kusumi 
1008*2d60b848STomohiro Kusumi         if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
1009*2d60b848STomohiro Kusumi             s->strstart - hash_head <= MAX_DIST(s)) {
1010*2d60b848STomohiro Kusumi             /* To simplify the code, we prevent matches with the string
1011*2d60b848STomohiro Kusumi              * of window index 0 (in particular we have to avoid a match
1012*2d60b848STomohiro Kusumi              * of the string with itself at the start of the input file).
1013*2d60b848STomohiro Kusumi              */
1014*2d60b848STomohiro Kusumi             s->match_length = longest_match (s, hash_head);
1015*2d60b848STomohiro Kusumi             /* longest_match() sets match_start */
1016*2d60b848STomohiro Kusumi 
1017*2d60b848STomohiro Kusumi             if (s->match_length <= 5 && (s->strategy == Z_FILTERED
1018*2d60b848STomohiro Kusumi #if TOO_FAR <= 32767
1019*2d60b848STomohiro Kusumi                 || (s->match_length == MIN_MATCH &&
1020*2d60b848STomohiro Kusumi                     s->strstart - s->match_start > TOO_FAR)
1021*2d60b848STomohiro Kusumi #endif
1022*2d60b848STomohiro Kusumi                 )) {
1023*2d60b848STomohiro Kusumi 
1024*2d60b848STomohiro Kusumi                 /* If prev_match is also MIN_MATCH, match_start is garbage
1025*2d60b848STomohiro Kusumi                  * but we will ignore the current match anyway.
1026*2d60b848STomohiro Kusumi                  */
1027*2d60b848STomohiro Kusumi                 s->match_length = MIN_MATCH-1;
1028*2d60b848STomohiro Kusumi             }
1029*2d60b848STomohiro Kusumi         }
1030*2d60b848STomohiro Kusumi         /* If there was a match at the previous step and the current
1031*2d60b848STomohiro Kusumi          * match is not better, output the previous match:
1032*2d60b848STomohiro Kusumi          */
1033*2d60b848STomohiro Kusumi         if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
1034*2d60b848STomohiro Kusumi             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
1035*2d60b848STomohiro Kusumi             /* Do not insert strings in hash table beyond this. */
1036*2d60b848STomohiro Kusumi 
1037*2d60b848STomohiro Kusumi             check_match(s, s->strstart-1, s->prev_match, s->prev_length);
1038*2d60b848STomohiro Kusumi 
1039*2d60b848STomohiro Kusumi             _tr_tally_dist(s, s->strstart -1 - s->prev_match,
1040*2d60b848STomohiro Kusumi                            s->prev_length - MIN_MATCH, bflush);
1041*2d60b848STomohiro Kusumi 
1042*2d60b848STomohiro Kusumi             /* Insert in hash table all strings up to the end of the match.
1043*2d60b848STomohiro Kusumi              * strstart-1 and strstart are already inserted. If there is not
1044*2d60b848STomohiro Kusumi              * enough lookahead, the last two strings are not inserted in
1045*2d60b848STomohiro Kusumi              * the hash table.
1046*2d60b848STomohiro Kusumi              */
1047*2d60b848STomohiro Kusumi             s->lookahead -= s->prev_length-1;
1048*2d60b848STomohiro Kusumi             s->prev_length -= 2;
1049*2d60b848STomohiro Kusumi             do {
1050*2d60b848STomohiro Kusumi                 if (++s->strstart <= max_insert) {
1051*2d60b848STomohiro Kusumi                     INSERT_STRING(s, s->strstart, hash_head);
1052*2d60b848STomohiro Kusumi                 }
1053*2d60b848STomohiro Kusumi             } while (--s->prev_length != 0);
1054*2d60b848STomohiro Kusumi             s->match_available = 0;
1055*2d60b848STomohiro Kusumi             s->match_length = MIN_MATCH-1;
1056*2d60b848STomohiro Kusumi             s->strstart++;
1057*2d60b848STomohiro Kusumi 
1058*2d60b848STomohiro Kusumi             if (bflush) FLUSH_BLOCK(s, 0);
1059*2d60b848STomohiro Kusumi 
1060*2d60b848STomohiro Kusumi         } else if (s->match_available) {
1061*2d60b848STomohiro Kusumi             /* If there was no match at the previous position, output a
1062*2d60b848STomohiro Kusumi              * single literal. If there was a match but the current match
1063*2d60b848STomohiro Kusumi              * is longer, truncate the previous match to a single literal.
1064*2d60b848STomohiro Kusumi              */
1065*2d60b848STomohiro Kusumi             Tracevv((stderr,"%c", s->window[s->strstart-1]));
1066*2d60b848STomohiro Kusumi             _tr_tally_lit(s, s->window[s->strstart-1], bflush);
1067*2d60b848STomohiro Kusumi             if (bflush) {
1068*2d60b848STomohiro Kusumi                 FLUSH_BLOCK_ONLY(s, 0);
1069*2d60b848STomohiro Kusumi             }
1070*2d60b848STomohiro Kusumi             s->strstart++;
1071*2d60b848STomohiro Kusumi             s->lookahead--;
1072*2d60b848STomohiro Kusumi             if (s->strm->avail_out == 0) return need_more;
1073*2d60b848STomohiro Kusumi         } else {
1074*2d60b848STomohiro Kusumi             /* There is no previous match to compare with, wait for
1075*2d60b848STomohiro Kusumi              * the next step to decide.
1076*2d60b848STomohiro Kusumi              */
1077*2d60b848STomohiro Kusumi             s->match_available = 1;
1078*2d60b848STomohiro Kusumi             s->strstart++;
1079*2d60b848STomohiro Kusumi             s->lookahead--;
1080*2d60b848STomohiro Kusumi         }
1081*2d60b848STomohiro Kusumi     }
1082*2d60b848STomohiro Kusumi     Assert (flush != Z_NO_FLUSH, "no flush?");
1083*2d60b848STomohiro Kusumi     if (s->match_available) {
1084*2d60b848STomohiro Kusumi         Tracevv((stderr,"%c", s->window[s->strstart-1]));
1085*2d60b848STomohiro Kusumi         _tr_tally_lit(s, s->window[s->strstart-1], bflush);
1086*2d60b848STomohiro Kusumi         s->match_available = 0;
1087*2d60b848STomohiro Kusumi     }
1088*2d60b848STomohiro Kusumi     s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
1089*2d60b848STomohiro Kusumi     if (flush == Z_FINISH) {
1090*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 1);
1091*2d60b848STomohiro Kusumi         return finish_done;
1092*2d60b848STomohiro Kusumi     }
1093*2d60b848STomohiro Kusumi     if (s->last_lit)
1094*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 0);
1095*2d60b848STomohiro Kusumi     return block_done;
1096*2d60b848STomohiro Kusumi }
1097*2d60b848STomohiro Kusumi #endif /* FASTEST */
1098*2d60b848STomohiro Kusumi 
1099*2d60b848STomohiro Kusumi /* ===========================================================================
1100*2d60b848STomohiro Kusumi  * For Z_RLE, simply look for runs of bytes, generate matches only of distance
1101*2d60b848STomohiro Kusumi  * one.  Do not maintain a hash table.  (It will be regenerated if this run of
1102*2d60b848STomohiro Kusumi  * deflate switches away from Z_RLE.)
1103*2d60b848STomohiro Kusumi  */
1104*2d60b848STomohiro Kusumi local
1105*2d60b848STomohiro Kusumi block_state
deflate_rle(deflate_state * s,int flush)1106*2d60b848STomohiro Kusumi deflate_rle(deflate_state *s, int flush)
1107*2d60b848STomohiro Kusumi {
1108*2d60b848STomohiro Kusumi     int bflush;             /* set if current block must be flushed */
1109*2d60b848STomohiro Kusumi     uInt prev;              /* byte at distance one to match */
1110*2d60b848STomohiro Kusumi     Bytef *scan, *strend;   /* scan goes up to strend for length of run */
1111*2d60b848STomohiro Kusumi 
1112*2d60b848STomohiro Kusumi     for (;;) {
1113*2d60b848STomohiro Kusumi         /* Make sure that we always have enough lookahead, except
1114*2d60b848STomohiro Kusumi          * at the end of the input file. We need MAX_MATCH bytes
1115*2d60b848STomohiro Kusumi          * for the longest run, plus one for the unrolled loop.
1116*2d60b848STomohiro Kusumi          */
1117*2d60b848STomohiro Kusumi         if (s->lookahead <= MAX_MATCH) {
1118*2d60b848STomohiro Kusumi             fill_window(s);
1119*2d60b848STomohiro Kusumi             if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
1120*2d60b848STomohiro Kusumi                 return need_more;
1121*2d60b848STomohiro Kusumi             }
1122*2d60b848STomohiro Kusumi             if (s->lookahead == 0) break; /* flush the current block */
1123*2d60b848STomohiro Kusumi         }
1124*2d60b848STomohiro Kusumi 
1125*2d60b848STomohiro Kusumi         /* See how many times the previous byte repeats */
1126*2d60b848STomohiro Kusumi         s->match_length = 0;
1127*2d60b848STomohiro Kusumi         if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
1128*2d60b848STomohiro Kusumi             scan = s->window + s->strstart - 1;
1129*2d60b848STomohiro Kusumi             prev = *scan;
1130*2d60b848STomohiro Kusumi             if (prev == *++scan && prev == *++scan && prev == *++scan) {
1131*2d60b848STomohiro Kusumi                 strend = s->window + s->strstart + MAX_MATCH;
1132*2d60b848STomohiro Kusumi                 do {
1133*2d60b848STomohiro Kusumi                 } while (prev == *++scan && prev == *++scan &&
1134*2d60b848STomohiro Kusumi                          prev == *++scan && prev == *++scan &&
1135*2d60b848STomohiro Kusumi                          prev == *++scan && prev == *++scan &&
1136*2d60b848STomohiro Kusumi                          prev == *++scan && prev == *++scan &&
1137*2d60b848STomohiro Kusumi                          scan < strend);
1138*2d60b848STomohiro Kusumi                 s->match_length = MAX_MATCH - (int)(strend - scan);
1139*2d60b848STomohiro Kusumi                 if (s->match_length > s->lookahead)
1140*2d60b848STomohiro Kusumi                     s->match_length = s->lookahead;
1141*2d60b848STomohiro Kusumi             }
1142*2d60b848STomohiro Kusumi             Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
1143*2d60b848STomohiro Kusumi         }
1144*2d60b848STomohiro Kusumi 
1145*2d60b848STomohiro Kusumi         /* Emit match if have run of MIN_MATCH or longer, else emit literal */
1146*2d60b848STomohiro Kusumi         if (s->match_length >= MIN_MATCH) {
1147*2d60b848STomohiro Kusumi             check_match(s, s->strstart, s->strstart - 1, s->match_length);
1148*2d60b848STomohiro Kusumi 
1149*2d60b848STomohiro Kusumi             _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
1150*2d60b848STomohiro Kusumi 
1151*2d60b848STomohiro Kusumi             s->lookahead -= s->match_length;
1152*2d60b848STomohiro Kusumi             s->strstart += s->match_length;
1153*2d60b848STomohiro Kusumi             s->match_length = 0;
1154*2d60b848STomohiro Kusumi         } else {
1155*2d60b848STomohiro Kusumi             /* No match, output a literal byte */
1156*2d60b848STomohiro Kusumi             Tracevv((stderr,"%c", s->window[s->strstart]));
1157*2d60b848STomohiro Kusumi             _tr_tally_lit (s, s->window[s->strstart], bflush);
1158*2d60b848STomohiro Kusumi             s->lookahead--;
1159*2d60b848STomohiro Kusumi             s->strstart++;
1160*2d60b848STomohiro Kusumi         }
1161*2d60b848STomohiro Kusumi         if (bflush) FLUSH_BLOCK(s, 0);
1162*2d60b848STomohiro Kusumi     }
1163*2d60b848STomohiro Kusumi     s->insert = 0;
1164*2d60b848STomohiro Kusumi     if (flush == Z_FINISH) {
1165*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 1);
1166*2d60b848STomohiro Kusumi         return finish_done;
1167*2d60b848STomohiro Kusumi     }
1168*2d60b848STomohiro Kusumi     if (s->last_lit)
1169*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 0);
1170*2d60b848STomohiro Kusumi     return block_done;
1171*2d60b848STomohiro Kusumi }
1172*2d60b848STomohiro Kusumi 
1173*2d60b848STomohiro Kusumi /* ===========================================================================
1174*2d60b848STomohiro Kusumi  * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
1175*2d60b848STomohiro Kusumi  * (It will be regenerated if this run of deflate switches away from Huffman.)
1176*2d60b848STomohiro Kusumi  */
1177*2d60b848STomohiro Kusumi local
1178*2d60b848STomohiro Kusumi block_state
deflate_huff(deflate_state * s,int flush)1179*2d60b848STomohiro Kusumi deflate_huff(deflate_state *s, int flush)
1180*2d60b848STomohiro Kusumi {
1181*2d60b848STomohiro Kusumi     int bflush;             /* set if current block must be flushed */
1182*2d60b848STomohiro Kusumi 
1183*2d60b848STomohiro Kusumi     for (;;) {
1184*2d60b848STomohiro Kusumi         /* Make sure that we have a literal to write. */
1185*2d60b848STomohiro Kusumi         if (s->lookahead == 0) {
1186*2d60b848STomohiro Kusumi             fill_window(s);
1187*2d60b848STomohiro Kusumi             if (s->lookahead == 0) {
1188*2d60b848STomohiro Kusumi                 if (flush == Z_NO_FLUSH)
1189*2d60b848STomohiro Kusumi                     return need_more;
1190*2d60b848STomohiro Kusumi                 break;      /* flush the current block */
1191*2d60b848STomohiro Kusumi             }
1192*2d60b848STomohiro Kusumi         }
1193*2d60b848STomohiro Kusumi 
1194*2d60b848STomohiro Kusumi         /* Output a literal byte */
1195*2d60b848STomohiro Kusumi         s->match_length = 0;
1196*2d60b848STomohiro Kusumi         Tracevv((stderr,"%c", s->window[s->strstart]));
1197*2d60b848STomohiro Kusumi         _tr_tally_lit (s, s->window[s->strstart], bflush);
1198*2d60b848STomohiro Kusumi         s->lookahead--;
1199*2d60b848STomohiro Kusumi         s->strstart++;
1200*2d60b848STomohiro Kusumi         if (bflush) FLUSH_BLOCK(s, 0);
1201*2d60b848STomohiro Kusumi     }
1202*2d60b848STomohiro Kusumi     s->insert = 0;
1203*2d60b848STomohiro Kusumi     if (flush == Z_FINISH) {
1204*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 1);
1205*2d60b848STomohiro Kusumi         return finish_done;
1206*2d60b848STomohiro Kusumi     }
1207*2d60b848STomohiro Kusumi     if (s->last_lit)
1208*2d60b848STomohiro Kusumi         FLUSH_BLOCK(s, 0);
1209*2d60b848STomohiro Kusumi     return block_done;
1210*2d60b848STomohiro Kusumi }
1211