查看本类的 API文档回源码主页即时通讯网 - 即时通讯开发者社区!
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  /*
17  Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
18  
19  Redistribution and use in source and binary forms, with or without
20  modification, are permitted provided that the following conditions are met:
21  
22    1. Redistributions of source code must retain the above copyright notice,
23       this list of conditions and the following disclaimer.
24  
25    2. Redistributions in binary form must reproduce the above copyright
26       notice, this list of conditions and the following disclaimer in
27       the documentation and/or other materials provided with the distribution.
28  
29    3. The names of the authors may not be used to endorse or promote products
30       derived from this software without specific prior written permission.
31  
32  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
33  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
35  INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
36  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
38  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
41  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42   */
43  /*
44   * This program is based on zlib-1.1.3, so all credit should go authors
45   * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
46   * and contributors of zlib.
47   */
48  package org.jboss.netty.util.internal.jzlib;
49  
50  import org.jboss.netty.util.internal.jzlib.JZlib.WrapperType;
51  
52  final class Deflate {
53  
54      private static final class Config {
55          final int good_length; // reduce lazy search above this match length
56          final int max_lazy; // do not perform lazy search above this match length
57          final int nice_length; // quit search above this match length
58          final int max_chain;
59          final int func;
60  
61          Config(int good_length, int max_lazy, int nice_length, int max_chain,
62                  int func) {
63              this.good_length = good_length;
64              this.max_lazy = max_lazy;
65              this.nice_length = nice_length;
66              this.max_chain = max_chain;
67              this.func = func;
68          }
69      }
70  
71      private static final int STORED = 0;
72      private static final int FAST = 1;
73      private static final int SLOW = 2;
74  
75      private static final Config[] config_table;
76      static {
77          config_table = new Config[10];
78          config_table[0] = new Config(0, 0, 0, 0, STORED);
79          config_table[1] = new Config(4, 4, 8, 4, FAST);
80          config_table[2] = new Config(4, 5, 16, 8, FAST);
81          config_table[3] = new Config(4, 6, 32, 32, FAST);
82  
83          config_table[4] = new Config(4, 4, 16, 16, SLOW);
84          config_table[5] = new Config(8, 16, 32, 32, SLOW);
85          config_table[6] = new Config(8, 16, 128, 128, SLOW);
86          config_table[7] = new Config(8, 32, 128, 256, SLOW);
87          config_table[8] = new Config(32, 128, 258, 1024, SLOW);
88          config_table[9] = new Config(32, 258, 258, 4096, SLOW);
89      }
90  
91      private static final String[] z_errmsg = { "need dictionary", // Z_NEED_DICT       2
92              "stream end", // Z_STREAM_END      1
93              "", // Z_OK              0
94              "file error", // Z_ERRNO         (-1)
95              "stream error", // Z_STREAM_ERROR  (-2)
96              "data error", // Z_DATA_ERROR    (-3)
97              "insufficient memory", // Z_MEM_ERROR     (-4)
98              "buffer error", // Z_BUF_ERROR     (-5)
99              "incompatible version", // Z_VERSION_ERROR (-6)
100             "" };
101 
102     // block not completed, need more input or more output
103     private static final int NeedMore = 0;
104     // block flush performed
105     private static final int BlockDone = 1;
106     // finish started, need only more output at next deflate
107     private static final int FinishStarted = 2;
108     // finish done, accept no more input or output
109     private static final int FinishDone = 3;
110     private static final int INIT_STATE = 42;
111     private static final int BUSY_STATE = 113;
112     private static final int FINISH_STATE = 666;
113     private static final int STORED_BLOCK = 0;
114     private static final int STATIC_TREES = 1;
115     private static final int DYN_TREES = 2;
116     // The three kinds of block type
117     private static final int Z_BINARY = 0;
118     private static final int Z_ASCII = 1;
119     private static final int Z_UNKNOWN = 2;
120     private static final int Buf_size = 8 * 2;
121     // repeat previous bit length 3-6 times (2 bits of repeat count)
122     private static final int REP_3_6 = 16;
123     // repeat a zero length 3-10 times  (3 bits of repeat count)
124     private static final int REPZ_3_10 = 17;
125     // repeat a zero length 11-138 times  (7 bits of repeat count)
126     private static final int REPZ_11_138 = 18;
127     private static final int MIN_MATCH = 3;
128     private static final int MAX_MATCH = 258;
129     private static final int MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1;
130     private static final int END_BLOCK = 256;
131     ZStream strm; // pointer back to this zlib stream
132     int status; // as the name implies
133     byte[] pending_buf; // output still pending
134     int pending_buf_size; // size of pending_buf
135     int pending_out; // next pending byte to output to the stream
136     int pending; // nb of bytes in the pending buffer
137     WrapperType wrapperType;
138     private boolean wroteTrailer;
139     byte data_type; // UNKNOWN, BINARY or ASCII
140     int last_flush; // value of flush param for previous deflate call
141     int w_size; // LZ77 window size (32K by default)
142     int w_bits; // log2(w_size)  (8..16)
143     int w_mask; // w_size - 1
144     byte[] window;
145     // Sliding window. Input bytes are read into the second half of the window,
146     // and move to the first half later to keep a dictionary of at least wSize
147     // bytes. With this organization, matches are limited to a distance of
148     // wSize-MAX_MATCH bytes, but this ensures that IO is always
149     // performed with a length multiple of the block size. Also, it limits
150     // the window size to 64K, which is quite useful on MSDOS.
151     // To do: use the user input buffer as sliding window.
152     int window_size;
153     // Actual size of window: 2*wSize, except when the user input buffer
154     // is directly used as sliding window.
155     short[] prev;
156     // Link to older string with same hash index. To limit the size of this
157     // array to 64K, this link is maintained only for the last 32K strings.
158     // An index in this array is thus a window index modulo 32K.
159     short[] head; // Heads of the hash chains or NIL.
160     int ins_h; // hash index of string to be inserted
161     int hash_size; // number of elements in hash table
162     int hash_bits; // log2(hash_size)
163     int hash_mask; // hash_size-1
164     // Number of bits by which ins_h must be shifted at each input
165     // step. It must be such that after MIN_MATCH steps, the oldest
166     // byte no longer takes part in the hash key, that is:
167     // hash_shift * MIN_MATCH >= hash_bits
168     int hash_shift;
169     // Window position at the beginning of the current output block. Gets
170     // negative when the window is moved backwards.
171     int block_start;
172     int match_length; // length of best match
173     int prev_match; // previous match
174     int match_available; // set if previous match exists
175     int strstart; // start of string to insert
176     int match_start; // start of matching string
177     int lookahead; // number of valid bytes ahead in window
178     // Length of the best match at previous step. Matches not greater than this
179     // are discarded. This is used in the lazy match evaluation.
180     int prev_length;
181     // To speed up deflation, hash chains are never searched beyond this
182     // length.  A higher limit improves compression ratio but degrades the speed.
183     int max_chain_length;
184     // Attempt to find a better match only when the current match is strictly
185     // smaller than this value. This mechanism is used only for compression
186     // levels >= 4.
187     int max_lazy_match;
188     // Insert new strings in the hash table only if the match length is not
189     // greater than this length. This saves time but degrades compression.
190     // max_insert_length is used only for compression levels <= 3.
191     int level; // compression level (1..9)
192     int strategy; // favor or force Huffman coding
193     // Use a faster search when the previous match is longer than this
194     int good_match;
195     // Stop searching when current match exceeds this
196     int nice_match;
197     final short[] dyn_ltree; // literal and length tree
198     final short[] dyn_dtree; // distance tree
199     final short[] bl_tree; // Huffman tree for bit lengths
200     final Tree l_desc = new Tree(); // desc for literal tree
201     final Tree d_desc = new Tree(); // desc for distance tree
202     final Tree bl_desc = new Tree(); // desc for bit length tree
203     // number of codes at each bit length for an optimal tree
204     final short[] bl_count = new short[JZlib.MAX_BITS + 1];
205     // heap used to build the Huffman trees
206     final int[] heap = new int[2 * JZlib.L_CODES + 1];
207     int heap_len; // number of elements in the heap
208     int heap_max; // element of largest frequency
209     // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
210     // The same heap array is used to build all trees.
211     // Depth of each subtree used as tie breaker for trees of equal frequency
212     final byte[] depth = new byte[2 * JZlib.L_CODES + 1];
213     int l_buf; // index for literals or lengths */
214     // Size of match buffer for literals/lengths.  There are 4 reasons for
215     // limiting lit_bufsize to 64K:
216     //   - frequencies can be kept in 16 bit counters
217     //   - if compression is not successful for the first block, all input
218     //     data is still in the window so we can still emit a stored block even
219     //     when input comes from standard input.  (This can also be done for
220     //     all blocks if lit_bufsize is not greater than 32K.)
221     //   - if compression is not successful for a file smaller than 64K, we can
222     //     even emit a stored file instead of a stored block (saving 5 bytes).
223     //     This is applicable only for zip (not gzip or zlib).
224     //   - creating new Huffman trees less frequently may not provide fast
225     //     adaptation to changes in the input data statistics. (Take for
226     //     example a binary file with poorly compressible code followed by
227     //     a highly compressible string table.) Smaller buffer sizes give
228     //     fast adaptation but have of course the overhead of transmitting
229     //     trees more frequently.
230     //   - I can't count above 4
231     int lit_bufsize;
232     int last_lit; // running index in l_buf
233     // Buffer for distances. To simplify the code, d_buf and l_buf have
234     // the same number of elements. To use different lengths, an extra flag
235     // array would be necessary.
236     int d_buf; // index of pendig_buf
237     int opt_len; // bit length of current block with optimal trees
238     int static_len; // bit length of current block with static trees
239     int matches; // number of string matches in current block
240     int last_eob_len; // bit length of EOB code for last block
241     // Output buffer. bits are inserted starting at the bottom (least
242     // significant bits).
243     short bi_buf;
244     // Number of valid bits in bi_buf.  All bits above the last valid bit
245     // are always zero.
246     int bi_valid;
247     private int gzipUncompressedBytes;
248 
249     Deflate() {
250         dyn_ltree = new short[JZlib.HEAP_SIZE * 2];
251         dyn_dtree = new short[(2 * JZlib.D_CODES + 1) * 2]; // distance tree
252         bl_tree = new short[(2 * JZlib.BL_CODES + 1) * 2]; // Huffman tree for bit lengths
253     }
254 
255     private void lm_init() {
256         window_size = 2 * w_size;
257 
258         // Set the default configuration parameters:
259         max_lazy_match = config_table[level].max_lazy;
260         good_match = config_table[level].good_length;
261         nice_match = config_table[level].nice_length;
262         max_chain_length = config_table[level].max_chain;
263 
264         strstart = 0;
265         block_start = 0;
266         lookahead = 0;
267         match_length = prev_length = MIN_MATCH - 1;
268         match_available = 0;
269         ins_h = 0;
270     }
271 
272     // Initialize the tree data structures for a new zlib stream.
273     private void tr_init() {
274 
275         l_desc.dyn_tree = dyn_ltree;
276         l_desc.stat_desc = StaticTree.static_l_desc;
277 
278         d_desc.dyn_tree = dyn_dtree;
279         d_desc.stat_desc = StaticTree.static_d_desc;
280 
281         bl_desc.dyn_tree = bl_tree;
282         bl_desc.stat_desc = StaticTree.static_bl_desc;
283 
284         bi_buf = 0;
285         bi_valid = 0;
286         last_eob_len = 8; // enough lookahead for inflate
287 
288         // Initialize the first block of the first file:
289         init_block();
290     }
291 
292     private void init_block() {
293         // Initialize the trees.
294         for (int i = 0; i < JZlib.L_CODES; i ++) {
295             dyn_ltree[i * 2] = 0;
296         }
297         for (int i = 0; i < JZlib.D_CODES; i ++) {
298             dyn_dtree[i * 2] = 0;
299         }
300         for (int i = 0; i < JZlib.BL_CODES; i ++) {
301             bl_tree[i * 2] = 0;
302         }
303 
304         dyn_ltree[END_BLOCK * 2] = 1;
305         opt_len = static_len = 0;
306         last_lit = matches = 0;
307     }
308 
309     // Restore the heap property by moving down the tree starting at node k,
310     // exchanging a node with the smallest of its two sons if necessary, stopping
311     // when the heap property is re-established (each father smaller than its
312     // two sons).
313     void pqdownheap(short[] tree, // the tree to restore
314             int k // node to move down
315     ) {
316         int v = heap[k];
317         int j = k << 1; // left son of k
318         while (j <= heap_len) {
319             // Set j to the smallest of the two sons:
320             if (j < heap_len && smaller(tree, heap[j + 1], heap[j], depth)) {
321                 j ++;
322             }
323             // Exit if v is smaller than both sons
324             if (smaller(tree, v, heap[j], depth)) {
325                 break;
326             }
327 
328             // Exchange v with the smallest son
329             heap[k] = heap[j];
330             k = j;
331             // And continue down the tree, setting j to the left son of k
332             j <<= 1;
333         }
334         heap[k] = v;
335     }
336 
337     private static boolean smaller(short[] tree, int n, int m, byte[] depth) {
338         short tn2 = tree[n * 2];
339         short tm2 = tree[m * 2];
340         return tn2 < tm2 || tn2 == tm2 && depth[n] <= depth[m];
341     }
342 
343     // Scan a literal or distance tree to determine the frequencies of the codes
344     // in the bit length tree.
345     private void scan_tree(short[] tree, // the tree to be scanned
346             int max_code // and its largest code of non zero frequency
347     ) {
348         int n; // iterates over all tree elements
349         int prevlen = -1; // last emitted length
350         int curlen; // length of current code
351         int nextlen = tree[1]; // length of next code
352         int count = 0; // repeat count of the current code
353         int max_count = 7; // max repeat count
354         int min_count = 4; // min repeat count
355 
356         if (nextlen == 0) {
357             max_count = 138;
358             min_count = 3;
359         }
360         tree[(max_code + 1) * 2 + 1] = (short) 0xffff; // guard
361 
362         for (n = 0; n <= max_code; n ++) {
363             curlen = nextlen;
364             nextlen = tree[(n + 1) * 2 + 1];
365             if (++ count < max_count && curlen == nextlen) {
366                 continue;
367             }
368             if (count < min_count) {
369                 bl_tree[curlen * 2] += count;
370             } else if (curlen != 0) {
371                 if (curlen != prevlen) {
372                     bl_tree[curlen * 2] ++;
373                 }
374                 bl_tree[REP_3_6 * 2] ++;
375             } else if (count <= 10) {
376                 bl_tree[REPZ_3_10 * 2] ++;
377             } else {
378                 bl_tree[REPZ_11_138 * 2] ++;
379             }
380             count = 0;
381             prevlen = curlen;
382             if (nextlen == 0) {
383                 max_count = 138;
384                 min_count = 3;
385             } else if (curlen == nextlen) {
386                 max_count = 6;
387                 min_count = 3;
388             } else {
389                 max_count = 7;
390                 min_count = 4;
391             }
392         }
393     }
394 
395     // Construct the Huffman tree for the bit lengths and return the index in
396     // bl_order of the last bit length code to send.
397     private int build_bl_tree() {
398         int max_blindex; // index of last bit length code of non zero freq
399 
400         // Determine the bit length frequencies for literal and distance trees
401         scan_tree(dyn_ltree, l_desc.max_code);
402         scan_tree(dyn_dtree, d_desc.max_code);
403 
404         // Build the bit length tree:
405         bl_desc.build_tree(this);
406         // opt_len now includes the length of the tree representations, except
407         // the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
408 
409         // Determine the number of bit length codes to send. The pkzip format
410         // requires that at least 4 bit length codes be sent. (appnote.txt says
411         // 3 but the actual value used is 4.)
412         for (max_blindex = JZlib.BL_CODES - 1; max_blindex >= 3; max_blindex --) {
413             if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) {
414                 break;
415             }
416         }
417         // Update opt_len to include the bit length tree and counts
418         opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
419 
420         return max_blindex;
421     }
422 
423     // Send the header for a block using dynamic Huffman trees: the counts, the
424     // lengths of the bit length codes, the literal tree and the distance tree.
425     // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
426     private void send_all_trees(int lcodes, int dcodes, int blcodes) {
427         int rank; // index in bl_order
428 
429         send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt
430         send_bits(dcodes - 1, 5);
431         send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt
432         for (rank = 0; rank < blcodes; rank ++) {
433             send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3);
434         }
435         send_tree(dyn_ltree, lcodes - 1); // literal tree
436         send_tree(dyn_dtree, dcodes - 1); // distance tree
437     }
438 
439     // Send a literal or distance tree in compressed form, using the codes in
440     // bl_tree.
441     private void send_tree(short[] tree, // the tree to be sent
442             int max_code // and its largest code of non zero frequency
443     ) {
444         int n; // iterates over all tree elements
445         int prevlen = -1; // last emitted length
446         int curlen; // length of current code
447         int nextlen = tree[1]; // length of next code
448         int count = 0; // repeat count of the current code
449         int max_count = 7; // max repeat count
450         int min_count = 4; // min repeat count
451 
452         if (nextlen == 0) {
453             max_count = 138;
454             min_count = 3;
455         }
456 
457         for (n = 0; n <= max_code; n ++) {
458             curlen = nextlen;
459             nextlen = tree[(n + 1) * 2 + 1];
460             if (++ count < max_count && curlen == nextlen) {
461                 continue;
462             }
463             if (count < min_count) {
464                 do {
465                     send_code(curlen, bl_tree);
466                 } while (-- count != 0);
467             } else if (curlen != 0) {
468                 if (curlen != prevlen) {
469                     send_code(curlen, bl_tree);
470                     count --;
471                 }
472                 send_code(REP_3_6, bl_tree);
473                 send_bits(count - 3, 2);
474             } else if (count <= 10) {
475                 send_code(REPZ_3_10, bl_tree);
476                 send_bits(count - 3, 3);
477             } else {
478                 send_code(REPZ_11_138, bl_tree);
479                 send_bits(count - 11, 7);
480             }
481             count = 0;
482             prevlen = curlen;
483             if (nextlen == 0) {
484                 max_count = 138;
485                 min_count = 3;
486             } else if (curlen == nextlen) {
487                 max_count = 6;
488                 min_count = 3;
489             } else {
490                 max_count = 7;
491                 min_count = 4;
492             }
493         }
494     }
495 
496     // Output a byte on the stream.
497     // IN assertion: there is enough room in pending_buf.
498     private void put_byte(byte[] p, int start, int len) {
499         System.arraycopy(p, start, pending_buf, pending, len);
500         pending += len;
501     }
502 
503     private void put_byte(byte c) {
504         pending_buf[pending ++] = c;
505     }
506 
507     private void put_short(int w) {
508         put_byte((byte) w/*&0xff*/);
509         put_byte((byte) (w >>> 8));
510     }
511 
512     private void putShortMSB(int b) {
513         put_byte((byte) (b >> 8));
514         put_byte((byte) b/*&0xff*/);
515     }
516 
517     private void send_code(int c, short[] tree) {
518         int c2 = c * 2;
519         send_bits(tree[c2] & 0xffff, tree[c2 + 1] & 0xffff);
520     }
521 
522     private void send_bits(int value, int length) {
523         int len = length;
524         if (bi_valid > Buf_size - len) {
525             int val = value;
526             //      bi_buf |= (val << bi_valid);
527             bi_buf |= val << bi_valid & 0xffff;
528             put_short(bi_buf);
529             bi_buf = (short) (val >>> Buf_size - bi_valid);
530             bi_valid += len - Buf_size;
531         } else {
532             //      bi_buf |= (value) << bi_valid;
533             bi_buf |= value << bi_valid & 0xffff;
534             bi_valid += len;
535         }
536     }
537 
538     // Send one empty static block to give enough lookahead for inflate.
539     // This takes 10 bits, of which 7 may remain in the bit buffer.
540     // The current inflate code requires 9 bits of lookahead. If the
541     // last two codes for the previous block (real code plus EOB) were coded
542     // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
543     // the last real code. In this case we send two empty static blocks instead
544     // of one. (There are no problems if the previous block is stored or fixed.)
545     // To simplify the code, we assume the worst case of last real code encoded
546     // on one bit only.
547     private void _tr_align() {
548         send_bits(STATIC_TREES << 1, 3);
549         send_code(END_BLOCK, StaticTree.static_ltree);
550 
551         bi_flush();
552 
553         // Of the 10 bits for the empty block, we have already sent
554         // (10 - bi_valid) bits. The lookahead for the last real code (before
555         // the EOB of the previous block) was thus at least one plus the length
556         // of the EOB plus what we have just sent of the empty static block.
557         if (1 + last_eob_len + 10 - bi_valid < 9) {
558             send_bits(STATIC_TREES << 1, 3);
559             send_code(END_BLOCK, StaticTree.static_ltree);
560             bi_flush();
561         }
562         last_eob_len = 7;
563     }
564 
565     // Save the match info and tally the frequency counts. Return true if
566     // the current block must be flushed.
567     private boolean _tr_tally(int dist, // distance of matched string
568             int lc // match length-MIN_MATCH or unmatched char (if dist==0)
569     ) {
570 
571         pending_buf[d_buf + last_lit * 2] = (byte) (dist >>> 8);
572         pending_buf[d_buf + last_lit * 2 + 1] = (byte) dist;
573 
574         pending_buf[l_buf + last_lit] = (byte) lc;
575         last_lit ++;
576 
577         if (dist == 0) {
578             // lc is the unmatched char
579             dyn_ltree[lc * 2] ++;
580         } else {
581             matches ++;
582             // Here, lc is the match length - MIN_MATCH
583             dist --; // dist = match distance - 1
584             dyn_ltree[(Tree._length_code[lc] + JZlib.LITERALS + 1) * 2] ++;
585             dyn_dtree[Tree.d_code(dist) * 2] ++;
586         }
587 
588         if ((last_lit & 0x1fff) == 0 && level > 2) {
589             // Compute an upper bound for the compressed length
590             int out_length = last_lit * 8;
591             int in_length = strstart - block_start;
592             int dcode;
593             for (dcode = 0; dcode < JZlib.D_CODES; dcode ++) {
594                 out_length += dyn_dtree[dcode * 2] *
595                         (5L + Tree.extra_dbits[dcode]);
596             }
597             out_length >>>= 3;
598             if (matches < last_lit / 2 && out_length < in_length / 2) {
599                 return true;
600             }
601         }
602 
603         return last_lit == lit_bufsize - 1;
604         // We avoid equality with lit_bufsize because of wraparound at 64K
605         // on 16 bit machines and because stored blocks are restricted to
606         // 64K-1 bytes.
607     }
608 
609     // Send the block data compressed using the given Huffman trees
610     private void compress_block(short[] ltree, short[] dtree) {
611         int dist; // distance of matched string
612         int lc; // match length or unmatched char (if dist == 0)
613         int lx = 0; // running index in l_buf
614         int code; // the code to send
615         int extra; // number of extra bits to send
616 
617         if (last_lit != 0) {
618             do {
619                 dist = pending_buf[d_buf + lx * 2] << 8 & 0xff00 |
620                         pending_buf[d_buf + lx * 2 + 1] & 0xff;
621                 lc = pending_buf[l_buf + lx] & 0xff;
622                 lx ++;
623 
624                 if (dist == 0) {
625                     send_code(lc, ltree); // send a literal byte
626                 } else {
627                     // Here, lc is the match length - MIN_MATCH
628                     code = Tree._length_code[lc];
629 
630                     send_code(code + JZlib.LITERALS + 1, ltree); // send the length code
631                     extra = Tree.extra_lbits[code];
632                     if (extra != 0) {
633                         lc -= Tree.base_length[code];
634                         send_bits(lc, extra); // send the extra length bits
635                     }
636                     dist --; // dist is now the match distance - 1
637                     code = Tree.d_code(dist);
638 
639                     send_code(code, dtree); // send the distance code
640                     extra = Tree.extra_dbits[code];
641                     if (extra != 0) {
642                         dist -= Tree.base_dist[code];
643                         send_bits(dist, extra); // send the extra distance bits
644                     }
645                 } // literal or match pair ?
646 
647                 // Check that the overlay between pending_buf and d_buf+l_buf is ok:
648             } while (lx < last_lit);
649         }
650 
651         send_code(END_BLOCK, ltree);
652         last_eob_len = ltree[END_BLOCK * 2 + 1];
653     }
654 
655     // Set the data type to ASCII or BINARY, using a crude approximation:
656     // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
657     // IN assertion: the fields freq of dyn_ltree are set and the total of all
658     // frequencies does not exceed 64K (to fit in an int on 16 bit machines).
659     private void set_data_type() {
660         int n = 0;
661         int ascii_freq = 0;
662         int bin_freq = 0;
663         while (n < 7) {
664             bin_freq += dyn_ltree[n * 2];
665             n ++;
666         }
667         while (n < 128) {
668             ascii_freq += dyn_ltree[n * 2];
669             n ++;
670         }
671         while (n < JZlib.LITERALS) {
672             bin_freq += dyn_ltree[n * 2];
673             n ++;
674         }
675         data_type = (byte) (bin_freq > ascii_freq >>> 2? Z_BINARY : Z_ASCII);
676     }
677 
678     // Flush the bit buffer, keeping at most 7 bits in it.
679     private void bi_flush() {
680         if (bi_valid == 16) {
681             put_short(bi_buf);
682             bi_buf = 0;
683             bi_valid = 0;
684         } else if (bi_valid >= 8) {
685             put_byte((byte) bi_buf);
686             bi_buf >>>= 8;
687             bi_valid -= 8;
688         }
689     }
690 
691     // Flush the bit buffer and align the output on a byte boundary
692     private void bi_windup() {
693         if (bi_valid > 8) {
694             put_short(bi_buf);
695         } else if (bi_valid > 0) {
696             put_byte((byte) bi_buf);
697         }
698         bi_buf = 0;
699         bi_valid = 0;
700     }
701 
702     // Copy a stored block, storing first the length and its
703     // one's complement if requested.
704     private void copy_block(int buf, // the input data
705             int len, // its length
706             boolean header // true if block header must be written
707     ) {
708         bi_windup(); // align on byte boundary
709         last_eob_len = 8; // enough lookahead for inflate
710 
711         if (header) {
712             put_short((short) len);
713             put_short((short) ~len);
714         }
715 
716         //  while(len--!=0) {
717         //    put_byte(window[buf+index]);
718         //    index++;
719         //  }
720         put_byte(window, buf, len);
721     }
722 
723     private void flush_block_only(boolean eof) {
724         _tr_flush_block(block_start >= 0? block_start : -1, strstart -
725                 block_start, eof);
726         block_start = strstart;
727         strm.flush_pending();
728     }
729 
730     // Copy without compression as much as possible from the input stream, return
731     // the current block state.
732     // This function does not insert new strings in the dictionary since
733     // uncompressible data is probably not useful. This function is used
734     // only for the level=0 compression option.
735     // NOTE: this function should be optimized to avoid extra copying from
736     // window to pending_buf.
737     private int deflate_stored(int flush) {
738         // Stored blocks are limited to 0xffff bytes, pending_buf is limited
739         // to pending_buf_size, and each stored block has a 5 byte header:
740 
741         int max_block_size = 0xffff;
742         int max_start;
743 
744         if (max_block_size > pending_buf_size - 5) {
745             max_block_size = pending_buf_size - 5;
746         }
747 
748         // Copy as much as possible from input to output:
749         while (true) {
750             // Fill the window as much as possible:
751             if (lookahead <= 1) {
752                 fill_window();
753                 if (lookahead == 0 && flush == JZlib.Z_NO_FLUSH) {
754                     return NeedMore;
755                 }
756                 if (lookahead == 0) {
757                     break; // flush the current block
758                 }
759             }
760 
761             strstart += lookahead;
762             lookahead = 0;
763 
764             // Emit a stored block if pending_buf will be full:
765             max_start = block_start + max_block_size;
766             if (strstart == 0 || strstart >= max_start) {
767                 // strstart == 0 is possible when wraparound on 16-bit machine
768                 lookahead = strstart - max_start;
769                 strstart = max_start;
770 
771                 flush_block_only(false);
772                 if (strm.avail_out == 0) {
773                     return NeedMore;
774                 }
775 
776             }
777 
778             // Flush if we may have to slide, otherwise block_start may become
779             // negative and the data will be gone:
780             if (strstart - block_start >= w_size - MIN_LOOKAHEAD) {
781                 flush_block_only(false);
782                 if (strm.avail_out == 0) {
783                     return NeedMore;
784                 }
785             }
786         }
787 
788         flush_block_only(flush == JZlib.Z_FINISH);
789         if (strm.avail_out == 0) {
790             return flush == JZlib.Z_FINISH? FinishStarted : NeedMore;
791         }
792 
793         return flush == JZlib.Z_FINISH? FinishDone : BlockDone;
794     }
795 
796     // Send a stored block
797     private void _tr_stored_block(int buf, // input block
798             int stored_len, // length of input block
799             boolean eof // true if this is the last block for a file
800     ) {
801         //noinspection PointlessArithmeticExpression
802         send_bits((STORED_BLOCK << 1) + (eof? 1 : 0), 3); // send block type
803         copy_block(buf, stored_len, true); // with header
804     }
805 
806     // Determine the best encoding for the current block: dynamic trees, static
807     // trees or store, and output the encoded block to the zip file.
808     private void _tr_flush_block(int buf, // input block, or NULL if too old
809             int stored_len, // length of input block
810             boolean eof // true if this is the last block for a file
811     ) {
812         int opt_lenb, static_lenb; // opt_len and static_len in bytes
813         int max_blindex = 0; // index of last bit length code of non zero freq
814 
815         // Build the Huffman trees unless a stored block is forced
816         if (level > 0) {
817             // Check if the file is ascii or binary
818             if (data_type == Z_UNKNOWN) {
819                 set_data_type();
820             }
821 
822             // Construct the literal and distance trees
823             l_desc.build_tree(this);
824 
825             d_desc.build_tree(this);
826 
827             // At this point, opt_len and static_len are the total bit lengths of
828             // the compressed block data, excluding the tree representations.
829 
830             // Build the bit length tree for the above two trees, and get the index
831             // in bl_order of the last bit length code to send.
832             max_blindex = build_bl_tree();
833 
834             // Determine the best encoding. Compute first the block length in bytes
835             opt_lenb = opt_len + 3 + 7 >>> 3;
836             static_lenb = static_len + 3 + 7 >>> 3;
837 
838             if (static_lenb <= opt_lenb) {
839                 opt_lenb = static_lenb;
840             }
841         } else {
842             opt_lenb = static_lenb = stored_len + 5; // force a stored block
843         }
844 
845         if (stored_len + 4 <= opt_lenb && buf != -1) {
846             // 4: two words for the lengths
847             // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
848             // Otherwise we can't have processed more than WSIZE input bytes since
849             // the last block flush, because compression would have been
850             // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
851             // transform a block into a stored block.
852             _tr_stored_block(buf, stored_len, eof);
853         } else if (static_lenb == opt_lenb) {
854             send_bits((STATIC_TREES << 1) + (eof? 1 : 0), 3);
855             compress_block(StaticTree.static_ltree, StaticTree.static_dtree);
856         } else {
857             send_bits((DYN_TREES << 1) + (eof? 1 : 0), 3);
858             send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1,
859                     max_blindex + 1);
860             compress_block(dyn_ltree, dyn_dtree);
861         }
862 
863         // The above check is made mod 2^32, for files larger than 512 MB
864         // and uLong implemented on 32 bits.
865 
866         init_block();
867 
868         if (eof) {
869             bi_windup();
870         }
871     }
872 
873     // Fill the window when the lookahead becomes insufficient.
874     // Updates strstart and lookahead.
875     //
876     // IN assertion: lookahead < MIN_LOOKAHEAD
877     // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
878     //    At least one byte has been read, or avail_in == 0; reads are
879     //    performed for at least two bytes (required for the zip translate_eol
880     //    option -- not supported here).
881     private void fill_window() {
882         int n, m;
883         int p;
884         int more; // Amount of free space at the end of the window.
885 
886         do {
887             more = window_size - lookahead - strstart;
888 
889             // Deal with !@#$% 64K limit:
890             if (more == 0 && strstart == 0 && lookahead == 0) {
891                 more = w_size;
892             } else if (more == -1) {
893                 // Very unlikely, but possible on 16 bit machine if strstart == 0
894                 // and lookahead == 1 (input done one byte at time)
895                 more --;
896 
897                 // If the window is almost full and there is insufficient lookahead,
898                 // move the upper half to the lower one to make room in the upper half.
899             } else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) {
900                 System.arraycopy(window, w_size, window, 0, w_size);
901                 match_start -= w_size;
902                 strstart -= w_size; // we now have strstart >= MAX_DIST
903                 block_start -= w_size;
904 
905                 // Slide the hash table (could be avoided with 32 bit values
906                 // at the expense of memory usage). We slide even when level == 0
907                 // to keep the hash table consistent if we switch back to level > 0
908                 // later. (Using level 0 permanently is not an optimal usage of
909                 // zlib, so we don't care about this pathological case.)
910 
911                 n = hash_size;
912                 p = n;
913                 do {
914                     m = head[-- p] & 0xffff;
915                     head[p] = m >= w_size? (short) (m - w_size) : 0;
916                 } while (-- n != 0);
917 
918                 n = w_size;
919                 p = n;
920                 do {
921                     m = prev[-- p] & 0xffff;
922                     prev[p] = m >= w_size? (short) (m - w_size) : 0;
923                     // If n is not on any hash chain, prev[n] is garbage but
924                     // its value will never be used.
925                 } while (-- n != 0);
926                 more += w_size;
927             }
928 
929             if (strm.avail_in == 0) {
930                 return;
931             }
932 
933             // If there was no sliding:
934             //    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
935             //    more == window_size - lookahead - strstart
936             // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
937             // => more >= window_size - 2*WSIZE + 2
938             // In the BIG_MEM or MMAP case (not yet supported),
939             //   window_size == input_size + MIN_LOOKAHEAD  &&
940             //   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
941             // Otherwise, window_size == 2*WSIZE so more >= 2.
942             // If there was sliding, more >= WSIZE. So in all cases, more >= 2.
943 
944             n = strm.read_buf(window, strstart + lookahead, more);
945             lookahead += n;
946 
947             // Initialize the hash value now that we have some input:
948             if (lookahead >= MIN_MATCH) {
949                 ins_h = window[strstart] & 0xff;
950                 ins_h = (ins_h << hash_shift ^ window[strstart + 1] & 0xff) &
951                         hash_mask;
952             }
953             // If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
954             // but this is not important since only literal bytes will be emitted.
955         } while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0);
956     }
957 
958     // Compress as much as possible from the input stream, return the current
959     // block state.
960     // This function does not perform lazy evaluation of matches and inserts
961     // new strings in the dictionary only for unmatched strings or for short
962     // matches. It is used only for the fast compression options.
963     private int deflate_fast(int flush) {
964         //    short hash_head = 0; // head of the hash chain
965         int hash_head = 0; // head of the hash chain
966         boolean bflush; // set if current block must be flushed
967 
968         while (true) {
969             // Make sure that we always have enough lookahead, except
970             // at the end of the input file. We need MAX_MATCH bytes
971             // for the next match, plus MIN_MATCH bytes to insert the
972             // string following the next match.
973             if (lookahead < MIN_LOOKAHEAD) {
974                 fill_window();
975                 if (lookahead < MIN_LOOKAHEAD && flush == JZlib.Z_NO_FLUSH) {
976                     return NeedMore;
977                 }
978                 if (lookahead == 0) {
979                     break; // flush the current block
980                 }
981             }
982 
983             // Insert the string window[strstart .. strstart+2] in the
984             // dictionary, and set hash_head to the head of the hash chain:
985             if (lookahead >= MIN_MATCH) {
986                 ins_h = (ins_h << hash_shift ^ window[strstart + MIN_MATCH - 1] & 0xff) &
987                         hash_mask;
988 
989                 // prev[strstart&w_mask]=hash_head=head[ins_h];
990                 hash_head = head[ins_h] & 0xffff;
991                 prev[strstart & w_mask] = head[ins_h];
992                 head[ins_h] = (short) strstart;
993             }
994 
995             // Find the longest match, discarding those <= prev_length.
996             // At this point we have always match_length < MIN_MATCH
997 
998             if (hash_head != 0L &&
999                     (strstart - hash_head & 0xffff) <= w_size - MIN_LOOKAHEAD) {
1000                 // To simplify the code, we prevent matches with the string
1001                 // of window index 0 (in particular we have to avoid a match
1002                 // of the string with itself at the start of the input file).
1003                 if (strategy != JZlib.Z_HUFFMAN_ONLY) {
1004                     match_length = longest_match(hash_head);
1005                 }
1006                 // longest_match() sets match_start
1007             }
1008             if (match_length >= MIN_MATCH) {
1009                 //        check_match(strstart, match_start, match_length);
1010 
1011                 bflush = _tr_tally(strstart - match_start, match_length -
1012                         MIN_MATCH);
1013 
1014                 lookahead -= match_length;
1015 
1016                 // Insert new strings in the hash table only if the match length
1017                 // is not too large. This saves time but degrades compression.
1018                 if (match_length <= max_lazy_match && lookahead >= MIN_MATCH) {
1019                     match_length --; // string at strstart already in hash table
1020                     do {
1021                         strstart ++;
1022 
1023                         ins_h = (ins_h << hash_shift ^ window[strstart +
1024                                 MIN_MATCH - 1] & 0xff) &
1025                                 hash_mask;
1026                         //        prev[strstart&w_mask]=hash_head=head[ins_h];
1027                         hash_head = head[ins_h] & 0xffff;
1028                         prev[strstart & w_mask] = head[ins_h];
1029                         head[ins_h] = (short) strstart;
1030 
1031                         // strstart never exceeds WSIZE-MAX_MATCH, so there are
1032                         // always MIN_MATCH bytes ahead.
1033                     } while (-- match_length != 0);
1034                     strstart ++;
1035                 } else {
1036                     strstart += match_length;
1037                     match_length = 0;
1038                     ins_h = window[strstart] & 0xff;
1039 
1040                     ins_h = (ins_h << hash_shift ^ window[strstart + 1] & 0xff) &
1041                             hash_mask;
1042                     // If lookahead < MIN_MATCH, ins_h is garbage, but it does not
1043                     // matter since it will be recomputed at next deflate call.
1044                 }
1045             } else {
1046                 // No match, output a literal byte
1047 
1048                 bflush = _tr_tally(0, window[strstart] & 0xff);
1049                 lookahead --;
1050                 strstart ++;
1051             }
1052             if (bflush) {
1053 
1054                 flush_block_only(false);
1055                 if (strm.avail_out == 0) {
1056                     return NeedMore;
1057                 }
1058             }
1059         }
1060 
1061         flush_block_only(flush == JZlib.Z_FINISH);
1062         if (strm.avail_out == 0) {
1063             if (flush == JZlib.Z_FINISH) {
1064                 return FinishStarted;
1065             } else {
1066                 return NeedMore;
1067             }
1068         }
1069         return flush == JZlib.Z_FINISH? FinishDone : BlockDone;
1070     }
1071 
1072     // Same as above, but achieves better compression. We use a lazy
1073     // evaluation for matches: a match is finally adopted only if there is
1074     // no better match at the next window position.
1075     private int deflate_slow(int flush) {
1076         //    short hash_head = 0;    // head of hash chain
1077         int hash_head = 0; // head of hash chain
1078         boolean bflush; // set if current block must be flushed
1079 
1080         // Process the input block.
1081         while (true) {
1082             // Make sure that we always have enough lookahead, except
1083             // at the end of the input file. We need MAX_MATCH bytes
1084             // for the next match, plus MIN_MATCH bytes to insert the
1085             // string following the next match.
1086 
1087             if (lookahead < MIN_LOOKAHEAD) {
1088                 fill_window();
1089                 if (lookahead < MIN_LOOKAHEAD && flush == JZlib.Z_NO_FLUSH) {
1090                     return NeedMore;
1091                 }
1092                 if (lookahead == 0) {
1093                     break; // flush the current block
1094                 }
1095             }
1096 
1097             // Insert the string window[strstart .. strstart+2] in the
1098             // dictionary, and set hash_head to the head of the hash chain:
1099 
1100             if (lookahead >= MIN_MATCH) {
1101                 ins_h = (ins_h << hash_shift ^ window[strstart + MIN_MATCH - 1] & 0xff) &
1102                         hash_mask;
1103                 //    prev[strstart&w_mask]=hash_head=head[ins_h];
1104                 hash_head = head[ins_h] & 0xffff;
1105                 prev[strstart & w_mask] = head[ins_h];
1106                 head[ins_h] = (short) strstart;
1107             }
1108 
1109             // Find the longest match, discarding those <= prev_length.
1110             prev_length = match_length;
1111             prev_match = match_start;
1112             match_length = MIN_MATCH - 1;
1113 
1114             if (hash_head != 0 && prev_length < max_lazy_match &&
1115                     (strstart - hash_head & 0xffff) <= w_size - MIN_LOOKAHEAD) {
1116                 // To simplify the code, we prevent matches with the string
1117                 // of window index 0 (in particular we have to avoid a match
1118                 // of the string with itself at the start of the input file).
1119 
1120                 if (strategy != JZlib.Z_HUFFMAN_ONLY) {
1121                     match_length = longest_match(hash_head);
1122                 }
1123                 // longest_match() sets match_start
1124 
1125                 if (match_length <= 5 &&
1126                         (strategy == JZlib.Z_FILTERED || match_length == MIN_MATCH &&
1127                                 strstart - match_start > 4096)) {
1128 
1129                     // If prev_match is also MIN_MATCH, match_start is garbage
1130                     // but we will ignore the current match anyway.
1131                     match_length = MIN_MATCH - 1;
1132                 }
1133             }
1134 
1135             // If there was a match at the previous step and the current
1136             // match is not better, output the previous match:
1137             if (prev_length >= MIN_MATCH && match_length <= prev_length) {
1138                 int max_insert = strstart + lookahead - MIN_MATCH;
1139                 // Do not insert strings in hash table beyond this.
1140 
1141                 //          check_match(strstart-1, prev_match, prev_length);
1142 
1143                 bflush = _tr_tally(strstart - 1 - prev_match, prev_length -
1144                         MIN_MATCH);
1145 
1146                 // Insert in hash table all strings up to the end of the match.
1147                 // strstart-1 and strstart are already inserted. If there is not
1148                 // enough lookahead, the last two strings are not inserted in
1149                 // the hash table.
1150                 lookahead -= prev_length - 1;
1151                 prev_length -= 2;
1152                 do {
1153                     if (++ strstart <= max_insert) {
1154                         ins_h = (ins_h << hash_shift ^ window[strstart +
1155                                 MIN_MATCH - 1] & 0xff) &
1156                                 hash_mask;
1157                         //prev[strstart&w_mask]=hash_head=head[ins_h];
1158                         hash_head = head[ins_h] & 0xffff;
1159                         prev[strstart & w_mask] = head[ins_h];
1160                         head[ins_h] = (short) strstart;
1161                     }
1162                 } while (-- prev_length != 0);
1163                 match_available = 0;
1164                 match_length = MIN_MATCH - 1;
1165                 strstart ++;
1166 
1167                 if (bflush) {
1168                     flush_block_only(false);
1169                     if (strm.avail_out == 0) {
1170                         return NeedMore;
1171                     }
1172                 }
1173             } else if (match_available != 0) {
1174 
1175                 // If there was no match at the previous position, output a
1176                 // single literal. If there was a match but the current match
1177                 // is longer, truncate the previous match to a single literal.
1178 
1179                 bflush = _tr_tally(0, window[strstart - 1] & 0xff);
1180 
1181                 if (bflush) {
1182                     flush_block_only(false);
1183                 }
1184                 strstart ++;
1185                 lookahead --;
1186                 if (strm.avail_out == 0) {
1187                     return NeedMore;
1188                 }
1189             } else {
1190                 // There is no previous match to compare with, wait for
1191                 // the next step to decide.
1192 
1193                 match_available = 1;
1194                 strstart ++;
1195                 lookahead --;
1196             }
1197         }
1198 
1199         if (match_available != 0) {
1200             _tr_tally(0, window[strstart - 1] & 0xff);
1201             match_available = 0;
1202         }
1203         flush_block_only(flush == JZlib.Z_FINISH);
1204 
1205         if (strm.avail_out == 0) {
1206             if (flush == JZlib.Z_FINISH) {
1207                 return FinishStarted;
1208             } else {
1209                 return NeedMore;
1210             }
1211         }
1212 
1213         return flush == JZlib.Z_FINISH? FinishDone : BlockDone;
1214     }
1215 
1216     private int longest_match(int cur_match) {
1217         int chain_length = max_chain_length; // max hash chain length
1218         int scan = strstart; // current string
1219         int match; // matched string
1220         int len; // length of current match
1221         int best_len = prev_length; // best match length so far
1222         int limit = strstart > w_size - MIN_LOOKAHEAD? strstart -
1223                 (w_size - MIN_LOOKAHEAD) : 0;
1224         int nice_match = this.nice_match;
1225 
1226         // Stop when cur_match becomes <= limit. To simplify the code,
1227         // we prevent matches with the string of window index 0.
1228 
1229         int wmask = w_mask;
1230 
1231         int strend = strstart + MAX_MATCH;
1232         byte scan_end1 = window[scan + best_len - 1];
1233         byte scan_end = window[scan + best_len];
1234 
1235         // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
1236         // It is easy to get rid of this optimization if necessary.
1237 
1238         // Do not waste too much time if we already have a good match:
1239         if (prev_length >= good_match) {
1240             chain_length >>= 2;
1241         }
1242 
1243         // Do not look for matches beyond the end of the input. This is necessary
1244         // to make deflate deterministic.
1245         if (nice_match > lookahead) {
1246             nice_match = lookahead;
1247         }
1248 
1249         do {
1250             match = cur_match;
1251 
1252             // Skip to next match if the match length cannot increase
1253             // or if the match length is less than 2:
1254             if (window[match + best_len] != scan_end ||
1255                     window[match + best_len - 1] != scan_end1 ||
1256                     window[match] != window[scan] ||
1257                     window[++ match] != window[scan + 1]) {
1258                 continue;
1259             }
1260 
1261             // The check at best_len-1 can be removed because it will be made
1262             // again later. (This heuristic is not always a win.)
1263             // It is not necessary to compare scan[2] and match[2] since they
1264             // are always equal when the other bytes match, given that
1265             // the hash keys are equal and that HASH_BITS >= 8.
1266             scan += 2;
1267             match ++;
1268 
1269             // We check for insufficient lookahead only every 8th comparison;
1270             // the 256th check will be made at strstart+258.
1271             while (window[++ scan] == window[++ match] &&
1272                     window[++ scan] == window[++ match] &&
1273                     window[++ scan] == window[++ match] &&
1274                     window[++ scan] == window[++ match] &&
1275                     window[++ scan] == window[++ match] &&
1276                     window[++ scan] == window[++ match] &&
1277                     window[++ scan] == window[++ match] &&
1278                     window[++ scan] == window[++ match] && scan < strend) {
1279                 continue;
1280             }
1281 
1282             len = MAX_MATCH - (strend - scan);
1283             scan = strend - MAX_MATCH;
1284 
1285             if (len > best_len) {
1286                 match_start = cur_match;
1287                 best_len = len;
1288                 if (len >= nice_match) {
1289                     break;
1290                 }
1291                 scan_end1 = window[scan + best_len - 1];
1292                 scan_end = window[scan + best_len];
1293             }
1294 
1295         } while ((cur_match = prev[cur_match & wmask] & 0xffff) > limit &&
1296                 -- chain_length != 0);
1297 
1298         if (best_len <= lookahead) {
1299             return best_len;
1300         }
1301         return lookahead;
1302     }
1303 
1304     int deflateInit(ZStream strm, int level, int bits, int memLevel, WrapperType wrapperType) {
1305         return deflateInit2(strm, level, JZlib.Z_DEFLATED, bits,
1306                 memLevel, JZlib.Z_DEFAULT_STRATEGY, wrapperType);
1307     }
1308 
1309     private int deflateInit2(ZStream strm, int level, int method, int windowBits,
1310             int memLevel, int strategy, WrapperType wrapperType) {
1311 
1312         if (wrapperType == WrapperType.ZLIB_OR_NONE) {
1313             throw new IllegalArgumentException("ZLIB_OR_NONE allowed only for inflate");
1314         }
1315 
1316         //    byte[] my_version=ZLIB_VERSION;
1317 
1318         //
1319         //  if (version == null || version[0] != my_version[0]
1320         //  || stream_size != sizeof(z_stream)) {
1321         //  return Z_VERSION_ERROR;
1322         //  }
1323 
1324         strm.msg = null;
1325 
1326         if (level == JZlib.Z_DEFAULT_COMPRESSION) {
1327             level = 6;
1328         }
1329 
1330         if (windowBits < 0) { // undocumented feature: suppress zlib header
1331             throw new IllegalArgumentException("windowBits: " + windowBits);
1332         }
1333 
1334         if (memLevel < 1 || memLevel > JZlib.MAX_MEM_LEVEL ||
1335                 method != JZlib.Z_DEFLATED || windowBits < 9 ||
1336                 windowBits > 15 || level < 0 || level > 9 || strategy < 0 ||
1337                 strategy > JZlib.Z_HUFFMAN_ONLY) {
1338             return JZlib.Z_STREAM_ERROR;
1339         }
1340 
1341         strm.dstate = this;
1342 
1343         this.wrapperType = wrapperType;
1344         w_bits = windowBits;
1345         w_size = 1 << w_bits;
1346         w_mask = w_size - 1;
1347 
1348         hash_bits = memLevel + 7;
1349         hash_size = 1 << hash_bits;
1350         hash_mask = hash_size - 1;
1351         hash_shift = (hash_bits + MIN_MATCH - 1) / MIN_MATCH;
1352 
1353         window = new byte[w_size * 2];
1354         prev = new short[w_size];
1355         head = new short[hash_size];
1356 
1357         lit_bufsize = 1 << memLevel + 6; // 16K elements by default
1358 
1359         // We overlay pending_buf and d_buf+l_buf. This works since the average
1360         // output size for (length,distance) codes is <= 24 bits.
1361         pending_buf = new byte[lit_bufsize * 4];
1362         pending_buf_size = lit_bufsize * 4;
1363 
1364         d_buf = lit_bufsize / 2;
1365         l_buf = (1 + 2) * lit_bufsize;
1366 
1367         this.level = level;
1368 
1369         //System.out.println("level="+level);
1370 
1371         this.strategy = strategy;
1372 
1373         return deflateReset(strm);
1374     }
1375 
1376     private int deflateReset(ZStream strm) {
1377         strm.total_in = strm.total_out = 0;
1378         strm.msg = null; //
1379 
1380         pending = 0;
1381         pending_out = 0;
1382 
1383         wroteTrailer = false;
1384         status = wrapperType == WrapperType.NONE? BUSY_STATE : INIT_STATE;
1385         strm.adler = Adler32.adler32(0, null, 0, 0);
1386         strm.crc32 = 0;
1387         gzipUncompressedBytes = 0;
1388 
1389         last_flush = JZlib.Z_NO_FLUSH;
1390 
1391         tr_init();
1392         lm_init();
1393         return JZlib.Z_OK;
1394     }
1395 
1396     int deflateEnd() {
1397         if (status != INIT_STATE && status != BUSY_STATE &&
1398                 status != FINISH_STATE) {
1399             return JZlib.Z_STREAM_ERROR;
1400         }
1401         // Deallocate in reverse order of allocations:
1402         pending_buf = null;
1403         head = null;
1404         prev = null;
1405         window = null;
1406         // free
1407         // dstate=null;
1408         return status == BUSY_STATE? JZlib.Z_DATA_ERROR : JZlib.Z_OK;
1409     }
1410 
1411     int deflateParams(ZStream strm, int _level, int _strategy) {
1412         int err = JZlib.Z_OK;
1413 
1414         if (_level == JZlib.Z_DEFAULT_COMPRESSION) {
1415             _level = 6;
1416         }
1417         if (_level < 0 || _level > 9 || _strategy < 0 ||
1418                 _strategy > JZlib.Z_HUFFMAN_ONLY) {
1419             return JZlib.Z_STREAM_ERROR;
1420         }
1421 
1422         if (config_table[level].func != config_table[_level].func &&
1423                 strm.total_in != 0) {
1424             // Flush the last buffer:
1425             err = strm.deflate(JZlib.Z_PARTIAL_FLUSH);
1426         }
1427 
1428         if (level != _level) {
1429             level = _level;
1430             max_lazy_match = config_table[level].max_lazy;
1431             good_match = config_table[level].good_length;
1432             nice_match = config_table[level].nice_length;
1433             max_chain_length = config_table[level].max_chain;
1434         }
1435         strategy = _strategy;
1436         return err;
1437     }
1438 
1439     int deflateSetDictionary(ZStream strm, byte[] dictionary, int dictLength) {
1440         int length = dictLength;
1441         int index = 0;
1442 
1443         if (dictionary == null || status != INIT_STATE) {
1444             return JZlib.Z_STREAM_ERROR;
1445         }
1446 
1447         strm.adler = Adler32.adler32(strm.adler, dictionary, 0, dictLength);
1448 
1449         if (length < MIN_MATCH) {
1450             return JZlib.Z_OK;
1451         }
1452         if (length > w_size - MIN_LOOKAHEAD) {
1453             length = w_size - MIN_LOOKAHEAD;
1454             index = dictLength - length; // use the tail of the dictionary
1455         }
1456         System.arraycopy(dictionary, index, window, 0, length);
1457         strstart = length;
1458         block_start = length;
1459 
1460         // Insert all strings in the hash table (except for the last two bytes).
1461         // s->lookahead stays null, so s->ins_h will be recomputed at the next
1462         // call of fill_window.
1463 
1464         ins_h = window[0] & 0xff;
1465         ins_h = (ins_h << hash_shift ^ window[1] & 0xff) & hash_mask;
1466 
1467         for (int n = 0; n <= length - MIN_MATCH; n ++) {
1468             ins_h = (ins_h << hash_shift ^ window[n + MIN_MATCH - 1] & 0xff) &
1469                     hash_mask;
1470             prev[n & w_mask] = head[ins_h];
1471             head[ins_h] = (short) n;
1472         }
1473         return JZlib.Z_OK;
1474     }
1475 
1476     int deflate(ZStream strm, int flush) {
1477         int old_flush;
1478 
1479         if (flush > JZlib.Z_FINISH || flush < 0) {
1480             return JZlib.Z_STREAM_ERROR;
1481         }
1482 
1483         if (strm.next_out == null || strm.next_in == null &&
1484                 strm.avail_in != 0 || status == FINISH_STATE &&
1485                 flush != JZlib.Z_FINISH) {
1486             strm.msg = z_errmsg[JZlib.Z_NEED_DICT - JZlib.Z_STREAM_ERROR];
1487             return JZlib.Z_STREAM_ERROR;
1488         }
1489         if (strm.avail_out == 0) {
1490             strm.msg = z_errmsg[JZlib.Z_NEED_DICT - JZlib.Z_BUF_ERROR];
1491             return JZlib.Z_BUF_ERROR;
1492         }
1493 
1494         this.strm = strm; // just in case
1495         old_flush = last_flush;
1496         last_flush = flush;
1497 
1498         // Write the zlib header
1499         if (status == INIT_STATE) {
1500             switch (wrapperType) {
1501             case ZLIB:
1502                 int header = JZlib.Z_DEFLATED + (w_bits - 8 << 4) << 8;
1503                 int level_flags = (level - 1 & 0xff) >> 1;
1504 
1505                 if (level_flags > 3) {
1506                     level_flags = 3;
1507                 }
1508                 header |= level_flags << 6;
1509                 if (strstart != 0) {
1510                     header |= JZlib.PRESET_DICT;
1511                 }
1512                 header += 31 - header % 31;
1513 
1514                 putShortMSB(header);
1515 
1516                 // Save the adler32 of the preset dictionary:
1517                 if (strstart != 0) {
1518                     putShortMSB((int) (strm.adler >>> 16));
1519                     putShortMSB((int) (strm.adler & 0xffff));
1520                 }
1521                 strm.adler = Adler32.adler32(0, null, 0, 0);
1522                 break;
1523             case GZIP:
1524                 // Identification
1525                 put_byte((byte) 0x1f);
1526                 put_byte((byte) 0x8b);
1527                 // Compression method: DEFLATE
1528                 put_byte((byte) 8);
1529                 // Flags
1530                 put_byte((byte) 0);
1531                 // MTIME
1532                 put_byte((byte) 0);
1533                 put_byte((byte) 0);
1534                 put_byte((byte) 0);
1535                 put_byte((byte) 0);
1536                 // XFL
1537                 switch (config_table[level].func) {
1538                 case FAST:
1539                     put_byte((byte) 4);
1540                     break;
1541                 case SLOW:
1542                     put_byte((byte) 2);
1543                     break;
1544                 default:
1545                     put_byte((byte) 0);
1546                     break;
1547                 }
1548                 // OS
1549                 put_byte((byte) 255);
1550 
1551                 strm.crc32 = 0;
1552                 break;
1553             }
1554 
1555             status = BUSY_STATE;
1556         }
1557 
1558         // Flush as much pending output as possible
1559         if (pending != 0) {
1560             strm.flush_pending();
1561             if (strm.avail_out == 0) {
1562                 //System.out.println("  avail_out==0");
1563                 // Since avail_out is 0, deflate will be called again with
1564                 // more output space, but possibly with both pending and
1565                 // avail_in equal to zero. There won't be anything to do,
1566                 // but this is not an error situation so make sure we
1567                 // return OK instead of BUF_ERROR at next call of deflate:
1568                 last_flush = -1;
1569                 return JZlib.Z_OK;
1570             }
1571 
1572             // Make sure there is something to do and avoid duplicate consecutive
1573             // flushes. For repeated and useless calls with Z_FINISH, we keep
1574             // returning Z_STREAM_END instead of Z_BUFF_ERROR.
1575         } else if (strm.avail_in == 0 && flush <= old_flush &&
1576                 flush != JZlib.Z_FINISH) {
1577             strm.msg = z_errmsg[JZlib.Z_NEED_DICT - JZlib.Z_BUF_ERROR];
1578             return JZlib.Z_BUF_ERROR;
1579         }
1580 
1581         // User must not provide more input after the first FINISH:
1582         if (status == FINISH_STATE && strm.avail_in != 0) {
1583             strm.msg = z_errmsg[JZlib.Z_NEED_DICT - JZlib.Z_BUF_ERROR];
1584             return JZlib.Z_BUF_ERROR;
1585         }
1586 
1587         // Start a new block or continue the current one.
1588         int old_next_in_index = strm.next_in_index;
1589         try {
1590             if (strm.avail_in != 0 || lookahead != 0 || flush != JZlib.Z_NO_FLUSH &&
1591                     status != FINISH_STATE) {
1592                 int bstate = -1;
1593                 switch (config_table[level].func) {
1594                 case STORED:
1595                     bstate = deflate_stored(flush);
1596                     break;
1597                 case FAST:
1598                     bstate = deflate_fast(flush);
1599                     break;
1600                 case SLOW:
1601                     bstate = deflate_slow(flush);
1602                     break;
1603                 default:
1604                 }
1605 
1606                 if (bstate == FinishStarted || bstate == FinishDone) {
1607                     status = FINISH_STATE;
1608                 }
1609                 if (bstate == NeedMore || bstate == FinishStarted) {
1610                     if (strm.avail_out == 0) {
1611                         last_flush = -1; // avoid BUF_ERROR next call, see above
1612                     }
1613                     return JZlib.Z_OK;
1614                     // If flush != Z_NO_FLUSH && avail_out == 0, the next call
1615                     // of deflate should use the same flush parameter to make sure
1616                     // that the flush is complete. So we don't have to output an
1617                     // empty block here, this will be done at next call. This also
1618                     // ensures that for a very small output buffer, we emit at most
1619                     // one empty block.
1620                 }
1621 
1622                 if (bstate == BlockDone) {
1623                     if (flush == JZlib.Z_PARTIAL_FLUSH) {
1624                         _tr_align();
1625                     } else { // FULL_FLUSH or SYNC_FLUSH
1626                         _tr_stored_block(0, 0, false);
1627                         // For a full flush, this empty block will be recognized
1628                         // as a special marker by inflate_sync().
1629                         if (flush == JZlib.Z_FULL_FLUSH) {
1630                             //state.head[s.hash_size-1]=0;
1631                             for (int i = 0; i < hash_size/*-1*/; i ++) {
1632                                 head[i] = 0;
1633                             }
1634                         }
1635                     }
1636                     strm.flush_pending();
1637                     if (strm.avail_out == 0) {
1638                         last_flush = -1; // avoid BUF_ERROR at next call, see above
1639                         return JZlib.Z_OK;
1640                     }
1641                 }
1642             }
1643         } finally {
1644             gzipUncompressedBytes += strm.next_in_index - old_next_in_index;
1645         }
1646 
1647         if (flush != JZlib.Z_FINISH) {
1648             return JZlib.Z_OK;
1649         }
1650 
1651         if (wrapperType == WrapperType.NONE || wroteTrailer) {
1652             return JZlib.Z_STREAM_END;
1653         }
1654 
1655         switch (wrapperType) {
1656         case ZLIB:
1657             // Write the zlib trailer (adler32)
1658             putShortMSB((int) (strm.adler >>> 16));
1659             putShortMSB((int) (strm.adler & 0xffff));
1660             break;
1661         case GZIP:
1662             // Write the gzip trailer (CRC32 & ISIZE)
1663             put_byte((byte) (strm.crc32 & 0xFF));
1664             put_byte((byte) (strm.crc32 >>> 8 & 0xFF));
1665             put_byte((byte) (strm.crc32 >>> 16 & 0xFF));
1666             put_byte((byte) (strm.crc32 >>> 24 & 0xFF));
1667             put_byte((byte) (gzipUncompressedBytes & 0xFF));
1668             put_byte((byte) (gzipUncompressedBytes >>> 8 & 0xFF));
1669             put_byte((byte) (gzipUncompressedBytes >>> 16 & 0xFF));
1670             put_byte((byte) (gzipUncompressedBytes >>> 24 & 0xFF));
1671             break;
1672         }
1673 
1674         strm.flush_pending();
1675         // If avail_out is zero, the application will call deflate again
1676         // to flush the rest.
1677         wroteTrailer = true; // write the trailer only once!
1678         return pending != 0? JZlib.Z_OK : JZlib.Z_STREAM_END;
1679     }
1680 }