1*ab9e68a2SToomas Soome /* trees.c -- output deflated data using Huffman coding 2*ab9e68a2SToomas Soome * Copyright (C) 1995-2017 Jean-loup Gailly 3*ab9e68a2SToomas Soome * detect_data_type() function provided freely by Cosmin Truta, 2006 4*ab9e68a2SToomas Soome * For conditions of distribution and use, see copyright notice in zlib.h 5*ab9e68a2SToomas Soome */ 6*ab9e68a2SToomas Soome 7*ab9e68a2SToomas Soome /* 8*ab9e68a2SToomas Soome * ALGORITHM 9*ab9e68a2SToomas Soome * 10*ab9e68a2SToomas Soome * The "deflation" process uses several Huffman trees. The more 11*ab9e68a2SToomas Soome * common source values are represented by shorter bit sequences. 12*ab9e68a2SToomas Soome * 13*ab9e68a2SToomas Soome * Each code tree is stored in a compressed form which is itself 14*ab9e68a2SToomas Soome * a Huffman encoding of the lengths of all the code strings (in 15*ab9e68a2SToomas Soome * ascending order by source values). The actual code strings are 16*ab9e68a2SToomas Soome * reconstructed from the lengths in the inflate process, as described 17*ab9e68a2SToomas Soome * in the deflate specification. 18*ab9e68a2SToomas Soome * 19*ab9e68a2SToomas Soome * REFERENCES 20*ab9e68a2SToomas Soome * 21*ab9e68a2SToomas Soome * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". 22*ab9e68a2SToomas Soome * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc 23*ab9e68a2SToomas Soome * 24*ab9e68a2SToomas Soome * Storer, James A. 25*ab9e68a2SToomas Soome * Data Compression: Methods and Theory, pp. 49-50. 26*ab9e68a2SToomas Soome * Computer Science Press, 1988. ISBN 0-7167-8156-5. 27*ab9e68a2SToomas Soome * 28*ab9e68a2SToomas Soome * Sedgewick, R. 29*ab9e68a2SToomas Soome * Algorithms, p290. 30*ab9e68a2SToomas Soome * Addison-Wesley, 1983. ISBN 0-201-06672-6. 31*ab9e68a2SToomas Soome */ 32*ab9e68a2SToomas Soome 33*ab9e68a2SToomas Soome /* @(#) $Id$ */ 34*ab9e68a2SToomas Soome 35*ab9e68a2SToomas Soome /* #define GEN_TREES_H */ 36*ab9e68a2SToomas Soome 37*ab9e68a2SToomas Soome #include "deflate.h" 38*ab9e68a2SToomas Soome 39*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 40*ab9e68a2SToomas Soome # include <ctype.h> 41*ab9e68a2SToomas Soome #endif 42*ab9e68a2SToomas Soome 43*ab9e68a2SToomas Soome /* =========================================================================== 44*ab9e68a2SToomas Soome * Constants 45*ab9e68a2SToomas Soome */ 46*ab9e68a2SToomas Soome 47*ab9e68a2SToomas Soome #define MAX_BL_BITS 7 48*ab9e68a2SToomas Soome /* Bit length codes must not exceed MAX_BL_BITS bits */ 49*ab9e68a2SToomas Soome 50*ab9e68a2SToomas Soome #define END_BLOCK 256 51*ab9e68a2SToomas Soome /* end of block literal code */ 52*ab9e68a2SToomas Soome 53*ab9e68a2SToomas Soome #define REP_3_6 16 54*ab9e68a2SToomas Soome /* repeat previous bit length 3-6 times (2 bits of repeat count) */ 55*ab9e68a2SToomas Soome 56*ab9e68a2SToomas Soome #define REPZ_3_10 17 57*ab9e68a2SToomas Soome /* repeat a zero length 3-10 times (3 bits of repeat count) */ 58*ab9e68a2SToomas Soome 59*ab9e68a2SToomas Soome #define REPZ_11_138 18 60*ab9e68a2SToomas Soome /* repeat a zero length 11-138 times (7 bits of repeat count) */ 61*ab9e68a2SToomas Soome 62*ab9e68a2SToomas Soome local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ 63*ab9e68a2SToomas Soome = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; 64*ab9e68a2SToomas Soome 65*ab9e68a2SToomas Soome local const int extra_dbits[D_CODES] /* extra bits for each distance code */ 66*ab9e68a2SToomas Soome = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; 67*ab9e68a2SToomas Soome 68*ab9e68a2SToomas Soome local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ 69*ab9e68a2SToomas Soome = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; 70*ab9e68a2SToomas Soome 71*ab9e68a2SToomas Soome local const uch bl_order[BL_CODES] 72*ab9e68a2SToomas Soome = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; 73*ab9e68a2SToomas Soome /* The lengths of the bit length codes are sent in order of decreasing 74*ab9e68a2SToomas Soome * probability, to avoid transmitting the lengths for unused bit length codes. 75*ab9e68a2SToomas Soome */ 76*ab9e68a2SToomas Soome 77*ab9e68a2SToomas Soome /* =========================================================================== 78*ab9e68a2SToomas Soome * Local data. These are initialized only once. 79*ab9e68a2SToomas Soome */ 80*ab9e68a2SToomas Soome 81*ab9e68a2SToomas Soome #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ 82*ab9e68a2SToomas Soome 83*ab9e68a2SToomas Soome #if defined(GEN_TREES_H) || !defined(STDC) 84*ab9e68a2SToomas Soome /* non ANSI compilers may not accept trees.h */ 85*ab9e68a2SToomas Soome 86*ab9e68a2SToomas Soome local ct_data static_ltree[L_CODES+2]; 87*ab9e68a2SToomas Soome /* The static literal tree. Since the bit lengths are imposed, there is no 88*ab9e68a2SToomas Soome * need for the L_CODES extra codes used during heap construction. However 89*ab9e68a2SToomas Soome * The codes 286 and 287 are needed to build a canonical tree (see _tr_init 90*ab9e68a2SToomas Soome * below). 91*ab9e68a2SToomas Soome */ 92*ab9e68a2SToomas Soome 93*ab9e68a2SToomas Soome local ct_data static_dtree[D_CODES]; 94*ab9e68a2SToomas Soome /* The static distance tree. (Actually a trivial tree since all codes use 95*ab9e68a2SToomas Soome * 5 bits.) 96*ab9e68a2SToomas Soome */ 97*ab9e68a2SToomas Soome 98*ab9e68a2SToomas Soome uch _dist_code[DIST_CODE_LEN]; 99*ab9e68a2SToomas Soome /* Distance codes. The first 256 values correspond to the distances 100*ab9e68a2SToomas Soome * 3 .. 258, the last 256 values correspond to the top 8 bits of 101*ab9e68a2SToomas Soome * the 15 bit distances. 102*ab9e68a2SToomas Soome */ 103*ab9e68a2SToomas Soome 104*ab9e68a2SToomas Soome uch _length_code[MAX_MATCH-MIN_MATCH+1]; 105*ab9e68a2SToomas Soome /* length code for each normalized match length (0 == MIN_MATCH) */ 106*ab9e68a2SToomas Soome 107*ab9e68a2SToomas Soome local int base_length[LENGTH_CODES]; 108*ab9e68a2SToomas Soome /* First normalized length for each code (0 = MIN_MATCH) */ 109*ab9e68a2SToomas Soome 110*ab9e68a2SToomas Soome local int base_dist[D_CODES]; 111*ab9e68a2SToomas Soome /* First normalized distance for each code (0 = distance of 1) */ 112*ab9e68a2SToomas Soome 113*ab9e68a2SToomas Soome #else 114*ab9e68a2SToomas Soome # include "trees.h" 115*ab9e68a2SToomas Soome #endif /* GEN_TREES_H */ 116*ab9e68a2SToomas Soome 117*ab9e68a2SToomas Soome struct static_tree_desc_s { 118*ab9e68a2SToomas Soome const ct_data *static_tree; /* static tree or NULL */ 119*ab9e68a2SToomas Soome const intf *extra_bits; /* extra bits for each code or NULL */ 120*ab9e68a2SToomas Soome int extra_base; /* base index for extra_bits */ 121*ab9e68a2SToomas Soome int elems; /* max number of elements in the tree */ 122*ab9e68a2SToomas Soome int max_length; /* max bit length for the codes */ 123*ab9e68a2SToomas Soome }; 124*ab9e68a2SToomas Soome 125*ab9e68a2SToomas Soome local const static_tree_desc static_l_desc = 126*ab9e68a2SToomas Soome {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; 127*ab9e68a2SToomas Soome 128*ab9e68a2SToomas Soome local const static_tree_desc static_d_desc = 129*ab9e68a2SToomas Soome {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; 130*ab9e68a2SToomas Soome 131*ab9e68a2SToomas Soome local const static_tree_desc static_bl_desc = 132*ab9e68a2SToomas Soome {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; 133*ab9e68a2SToomas Soome 134*ab9e68a2SToomas Soome /* =========================================================================== 135*ab9e68a2SToomas Soome * Local (static) routines in this file. 136*ab9e68a2SToomas Soome */ 137*ab9e68a2SToomas Soome 138*ab9e68a2SToomas Soome local void tr_static_init OF((void)); 139*ab9e68a2SToomas Soome local void init_block OF((deflate_state *s)); 140*ab9e68a2SToomas Soome local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); 141*ab9e68a2SToomas Soome local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); 142*ab9e68a2SToomas Soome local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); 143*ab9e68a2SToomas Soome local void build_tree OF((deflate_state *s, tree_desc *desc)); 144*ab9e68a2SToomas Soome local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); 145*ab9e68a2SToomas Soome local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); 146*ab9e68a2SToomas Soome local int build_bl_tree OF((deflate_state *s)); 147*ab9e68a2SToomas Soome local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, 148*ab9e68a2SToomas Soome int blcodes)); 149*ab9e68a2SToomas Soome local void compress_block OF((deflate_state *s, const ct_data *ltree, 150*ab9e68a2SToomas Soome const ct_data *dtree)); 151*ab9e68a2SToomas Soome local int detect_data_type OF((deflate_state *s)); 152*ab9e68a2SToomas Soome local unsigned bi_reverse OF((unsigned value, int length)); 153*ab9e68a2SToomas Soome local void bi_windup OF((deflate_state *s)); 154*ab9e68a2SToomas Soome local void bi_flush OF((deflate_state *s)); 155*ab9e68a2SToomas Soome 156*ab9e68a2SToomas Soome #ifdef GEN_TREES_H 157*ab9e68a2SToomas Soome local void gen_trees_header OF((void)); 158*ab9e68a2SToomas Soome #endif 159*ab9e68a2SToomas Soome 160*ab9e68a2SToomas Soome #ifndef ZLIB_DEBUG 161*ab9e68a2SToomas Soome # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) 162*ab9e68a2SToomas Soome /* Send a code of the given tree. c and tree must not have side effects */ 163*ab9e68a2SToomas Soome 164*ab9e68a2SToomas Soome #else /* !ZLIB_DEBUG */ 165*ab9e68a2SToomas Soome # define send_code(s, c, tree) \ 166*ab9e68a2SToomas Soome { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ 167*ab9e68a2SToomas Soome send_bits(s, tree[c].Code, tree[c].Len); } 168*ab9e68a2SToomas Soome #endif 169*ab9e68a2SToomas Soome 170*ab9e68a2SToomas Soome /* =========================================================================== 171*ab9e68a2SToomas Soome * Output a short LSB first on the stream. 172*ab9e68a2SToomas Soome * IN assertion: there is enough room in pendingBuf. 173*ab9e68a2SToomas Soome */ 174*ab9e68a2SToomas Soome #define put_short(s, w) { \ 175*ab9e68a2SToomas Soome put_byte(s, (uch)((w) & 0xff)); \ 176*ab9e68a2SToomas Soome put_byte(s, (uch)((ush)(w) >> 8)); \ 177*ab9e68a2SToomas Soome } 178*ab9e68a2SToomas Soome 179*ab9e68a2SToomas Soome /* =========================================================================== 180*ab9e68a2SToomas Soome * Send a value on a given number of bits. 181*ab9e68a2SToomas Soome * IN assertion: length <= 16 and value fits in length bits. 182*ab9e68a2SToomas Soome */ 183*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 184*ab9e68a2SToomas Soome local void send_bits OF((deflate_state *s, int value, int length)); 185*ab9e68a2SToomas Soome 186*ab9e68a2SToomas Soome local void send_bits(s, value, length) 187*ab9e68a2SToomas Soome deflate_state *s; 188*ab9e68a2SToomas Soome int value; /* value to send */ 189*ab9e68a2SToomas Soome int length; /* number of bits */ 190*ab9e68a2SToomas Soome { 191*ab9e68a2SToomas Soome Tracevv((stderr," l %2d v %4x ", length, value)); 192*ab9e68a2SToomas Soome Assert(length > 0 && length <= 15, "invalid length"); 193*ab9e68a2SToomas Soome s->bits_sent += (ulg)length; 194*ab9e68a2SToomas Soome 195*ab9e68a2SToomas Soome /* If not enough room in bi_buf, use (valid) bits from bi_buf and 196*ab9e68a2SToomas Soome * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) 197*ab9e68a2SToomas Soome * unused bits in value. 198*ab9e68a2SToomas Soome */ 199*ab9e68a2SToomas Soome if (s->bi_valid > (int)Buf_size - length) { 200*ab9e68a2SToomas Soome s->bi_buf |= (ush)value << s->bi_valid; 201*ab9e68a2SToomas Soome put_short(s, s->bi_buf); 202*ab9e68a2SToomas Soome s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); 203*ab9e68a2SToomas Soome s->bi_valid += length - Buf_size; 204*ab9e68a2SToomas Soome } else { 205*ab9e68a2SToomas Soome s->bi_buf |= (ush)value << s->bi_valid; 206*ab9e68a2SToomas Soome s->bi_valid += length; 207*ab9e68a2SToomas Soome } 208*ab9e68a2SToomas Soome } 209*ab9e68a2SToomas Soome #else /* !ZLIB_DEBUG */ 210*ab9e68a2SToomas Soome 211*ab9e68a2SToomas Soome #define send_bits(s, value, length) \ 212*ab9e68a2SToomas Soome { int len = length;\ 213*ab9e68a2SToomas Soome if (s->bi_valid > (int)Buf_size - len) {\ 214*ab9e68a2SToomas Soome int val = (int)value;\ 215*ab9e68a2SToomas Soome s->bi_buf |= (ush)val << s->bi_valid;\ 216*ab9e68a2SToomas Soome put_short(s, s->bi_buf);\ 217*ab9e68a2SToomas Soome s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ 218*ab9e68a2SToomas Soome s->bi_valid += len - Buf_size;\ 219*ab9e68a2SToomas Soome } else {\ 220*ab9e68a2SToomas Soome s->bi_buf |= (ush)(value) << s->bi_valid;\ 221*ab9e68a2SToomas Soome s->bi_valid += len;\ 222*ab9e68a2SToomas Soome }\ 223*ab9e68a2SToomas Soome } 224*ab9e68a2SToomas Soome #endif /* ZLIB_DEBUG */ 225*ab9e68a2SToomas Soome 226*ab9e68a2SToomas Soome 227*ab9e68a2SToomas Soome /* the arguments must not have side effects */ 228*ab9e68a2SToomas Soome 229*ab9e68a2SToomas Soome /* =========================================================================== 230*ab9e68a2SToomas Soome * Initialize the various 'constant' tables. 231*ab9e68a2SToomas Soome */ 232*ab9e68a2SToomas Soome local void tr_static_init() 233*ab9e68a2SToomas Soome { 234*ab9e68a2SToomas Soome #if defined(GEN_TREES_H) || !defined(STDC) 235*ab9e68a2SToomas Soome static int static_init_done = 0; 236*ab9e68a2SToomas Soome int n; /* iterates over tree elements */ 237*ab9e68a2SToomas Soome int bits; /* bit counter */ 238*ab9e68a2SToomas Soome int length; /* length value */ 239*ab9e68a2SToomas Soome int code; /* code value */ 240*ab9e68a2SToomas Soome int dist; /* distance index */ 241*ab9e68a2SToomas Soome ush bl_count[MAX_BITS+1]; 242*ab9e68a2SToomas Soome /* number of codes at each bit length for an optimal tree */ 243*ab9e68a2SToomas Soome 244*ab9e68a2SToomas Soome if (static_init_done) return; 245*ab9e68a2SToomas Soome 246*ab9e68a2SToomas Soome /* For some embedded targets, global variables are not initialized: */ 247*ab9e68a2SToomas Soome #ifdef NO_INIT_GLOBAL_POINTERS 248*ab9e68a2SToomas Soome static_l_desc.static_tree = static_ltree; 249*ab9e68a2SToomas Soome static_l_desc.extra_bits = extra_lbits; 250*ab9e68a2SToomas Soome static_d_desc.static_tree = static_dtree; 251*ab9e68a2SToomas Soome static_d_desc.extra_bits = extra_dbits; 252*ab9e68a2SToomas Soome static_bl_desc.extra_bits = extra_blbits; 253*ab9e68a2SToomas Soome #endif 254*ab9e68a2SToomas Soome 255*ab9e68a2SToomas Soome /* Initialize the mapping length (0..255) -> length code (0..28) */ 256*ab9e68a2SToomas Soome length = 0; 257*ab9e68a2SToomas Soome for (code = 0; code < LENGTH_CODES-1; code++) { 258*ab9e68a2SToomas Soome base_length[code] = length; 259*ab9e68a2SToomas Soome for (n = 0; n < (1<<extra_lbits[code]); n++) { 260*ab9e68a2SToomas Soome _length_code[length++] = (uch)code; 261*ab9e68a2SToomas Soome } 262*ab9e68a2SToomas Soome } 263*ab9e68a2SToomas Soome Assert (length == 256, "tr_static_init: length != 256"); 264*ab9e68a2SToomas Soome /* Note that the length 255 (match length 258) can be represented 265*ab9e68a2SToomas Soome * in two different ways: code 284 + 5 bits or code 285, so we 266*ab9e68a2SToomas Soome * overwrite length_code[255] to use the best encoding: 267*ab9e68a2SToomas Soome */ 268*ab9e68a2SToomas Soome _length_code[length-1] = (uch)code; 269*ab9e68a2SToomas Soome 270*ab9e68a2SToomas Soome /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ 271*ab9e68a2SToomas Soome dist = 0; 272*ab9e68a2SToomas Soome for (code = 0 ; code < 16; code++) { 273*ab9e68a2SToomas Soome base_dist[code] = dist; 274*ab9e68a2SToomas Soome for (n = 0; n < (1<<extra_dbits[code]); n++) { 275*ab9e68a2SToomas Soome _dist_code[dist++] = (uch)code; 276*ab9e68a2SToomas Soome } 277*ab9e68a2SToomas Soome } 278*ab9e68a2SToomas Soome Assert (dist == 256, "tr_static_init: dist != 256"); 279*ab9e68a2SToomas Soome dist >>= 7; /* from now on, all distances are divided by 128 */ 280*ab9e68a2SToomas Soome for ( ; code < D_CODES; code++) { 281*ab9e68a2SToomas Soome base_dist[code] = dist << 7; 282*ab9e68a2SToomas Soome for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { 283*ab9e68a2SToomas Soome _dist_code[256 + dist++] = (uch)code; 284*ab9e68a2SToomas Soome } 285*ab9e68a2SToomas Soome } 286*ab9e68a2SToomas Soome Assert (dist == 256, "tr_static_init: 256+dist != 512"); 287*ab9e68a2SToomas Soome 288*ab9e68a2SToomas Soome /* Construct the codes of the static literal tree */ 289*ab9e68a2SToomas Soome for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; 290*ab9e68a2SToomas Soome n = 0; 291*ab9e68a2SToomas Soome while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; 292*ab9e68a2SToomas Soome while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; 293*ab9e68a2SToomas Soome while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; 294*ab9e68a2SToomas Soome while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; 295*ab9e68a2SToomas Soome /* Codes 286 and 287 do not exist, but we must include them in the 296*ab9e68a2SToomas Soome * tree construction to get a canonical Huffman tree (longest code 297*ab9e68a2SToomas Soome * all ones) 298*ab9e68a2SToomas Soome */ 299*ab9e68a2SToomas Soome gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); 300*ab9e68a2SToomas Soome 301*ab9e68a2SToomas Soome /* The static distance tree is trivial: */ 302*ab9e68a2SToomas Soome for (n = 0; n < D_CODES; n++) { 303*ab9e68a2SToomas Soome static_dtree[n].Len = 5; 304*ab9e68a2SToomas Soome static_dtree[n].Code = bi_reverse((unsigned)n, 5); 305*ab9e68a2SToomas Soome } 306*ab9e68a2SToomas Soome static_init_done = 1; 307*ab9e68a2SToomas Soome 308*ab9e68a2SToomas Soome # ifdef GEN_TREES_H 309*ab9e68a2SToomas Soome gen_trees_header(); 310*ab9e68a2SToomas Soome # endif 311*ab9e68a2SToomas Soome #endif /* defined(GEN_TREES_H) || !defined(STDC) */ 312*ab9e68a2SToomas Soome } 313*ab9e68a2SToomas Soome 314*ab9e68a2SToomas Soome /* =========================================================================== 315*ab9e68a2SToomas Soome * Genererate the file trees.h describing the static trees. 316*ab9e68a2SToomas Soome */ 317*ab9e68a2SToomas Soome #ifdef GEN_TREES_H 318*ab9e68a2SToomas Soome # ifndef ZLIB_DEBUG 319*ab9e68a2SToomas Soome # include <stdio.h> 320*ab9e68a2SToomas Soome # endif 321*ab9e68a2SToomas Soome 322*ab9e68a2SToomas Soome # define SEPARATOR(i, last, width) \ 323*ab9e68a2SToomas Soome ((i) == (last)? "\n};\n\n" : \ 324*ab9e68a2SToomas Soome ((i) % (width) == (width)-1 ? ",\n" : ", ")) 325*ab9e68a2SToomas Soome 326*ab9e68a2SToomas Soome void gen_trees_header() 327*ab9e68a2SToomas Soome { 328*ab9e68a2SToomas Soome FILE *header = fopen("trees.h", "w"); 329*ab9e68a2SToomas Soome int i; 330*ab9e68a2SToomas Soome 331*ab9e68a2SToomas Soome Assert (header != NULL, "Can't open trees.h"); 332*ab9e68a2SToomas Soome fprintf(header, 333*ab9e68a2SToomas Soome "/* header created automatically with -DGEN_TREES_H */\n\n"); 334*ab9e68a2SToomas Soome 335*ab9e68a2SToomas Soome fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); 336*ab9e68a2SToomas Soome for (i = 0; i < L_CODES+2; i++) { 337*ab9e68a2SToomas Soome fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, 338*ab9e68a2SToomas Soome static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); 339*ab9e68a2SToomas Soome } 340*ab9e68a2SToomas Soome 341*ab9e68a2SToomas Soome fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); 342*ab9e68a2SToomas Soome for (i = 0; i < D_CODES; i++) { 343*ab9e68a2SToomas Soome fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, 344*ab9e68a2SToomas Soome static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); 345*ab9e68a2SToomas Soome } 346*ab9e68a2SToomas Soome 347*ab9e68a2SToomas Soome fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); 348*ab9e68a2SToomas Soome for (i = 0; i < DIST_CODE_LEN; i++) { 349*ab9e68a2SToomas Soome fprintf(header, "%2u%s", _dist_code[i], 350*ab9e68a2SToomas Soome SEPARATOR(i, DIST_CODE_LEN-1, 20)); 351*ab9e68a2SToomas Soome } 352*ab9e68a2SToomas Soome 353*ab9e68a2SToomas Soome fprintf(header, 354*ab9e68a2SToomas Soome "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); 355*ab9e68a2SToomas Soome for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { 356*ab9e68a2SToomas Soome fprintf(header, "%2u%s", _length_code[i], 357*ab9e68a2SToomas Soome SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); 358*ab9e68a2SToomas Soome } 359*ab9e68a2SToomas Soome 360*ab9e68a2SToomas Soome fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); 361*ab9e68a2SToomas Soome for (i = 0; i < LENGTH_CODES; i++) { 362*ab9e68a2SToomas Soome fprintf(header, "%1u%s", base_length[i], 363*ab9e68a2SToomas Soome SEPARATOR(i, LENGTH_CODES-1, 20)); 364*ab9e68a2SToomas Soome } 365*ab9e68a2SToomas Soome 366*ab9e68a2SToomas Soome fprintf(header, "local const int base_dist[D_CODES] = {\n"); 367*ab9e68a2SToomas Soome for (i = 0; i < D_CODES; i++) { 368*ab9e68a2SToomas Soome fprintf(header, "%5u%s", base_dist[i], 369*ab9e68a2SToomas Soome SEPARATOR(i, D_CODES-1, 10)); 370*ab9e68a2SToomas Soome } 371*ab9e68a2SToomas Soome 372*ab9e68a2SToomas Soome fclose(header); 373*ab9e68a2SToomas Soome } 374*ab9e68a2SToomas Soome #endif /* GEN_TREES_H */ 375*ab9e68a2SToomas Soome 376*ab9e68a2SToomas Soome /* =========================================================================== 377*ab9e68a2SToomas Soome * Initialize the tree data structures for a new zlib stream. 378*ab9e68a2SToomas Soome */ 379*ab9e68a2SToomas Soome void ZLIB_INTERNAL _tr_init(s) 380*ab9e68a2SToomas Soome deflate_state *s; 381*ab9e68a2SToomas Soome { 382*ab9e68a2SToomas Soome tr_static_init(); 383*ab9e68a2SToomas Soome 384*ab9e68a2SToomas Soome s->l_desc.dyn_tree = s->dyn_ltree; 385*ab9e68a2SToomas Soome s->l_desc.stat_desc = &static_l_desc; 386*ab9e68a2SToomas Soome 387*ab9e68a2SToomas Soome s->d_desc.dyn_tree = s->dyn_dtree; 388*ab9e68a2SToomas Soome s->d_desc.stat_desc = &static_d_desc; 389*ab9e68a2SToomas Soome 390*ab9e68a2SToomas Soome s->bl_desc.dyn_tree = s->bl_tree; 391*ab9e68a2SToomas Soome s->bl_desc.stat_desc = &static_bl_desc; 392*ab9e68a2SToomas Soome 393*ab9e68a2SToomas Soome s->bi_buf = 0; 394*ab9e68a2SToomas Soome s->bi_valid = 0; 395*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 396*ab9e68a2SToomas Soome s->compressed_len = 0L; 397*ab9e68a2SToomas Soome s->bits_sent = 0L; 398*ab9e68a2SToomas Soome #endif 399*ab9e68a2SToomas Soome 400*ab9e68a2SToomas Soome /* Initialize the first block of the first file: */ 401*ab9e68a2SToomas Soome init_block(s); 402*ab9e68a2SToomas Soome } 403*ab9e68a2SToomas Soome 404*ab9e68a2SToomas Soome /* =========================================================================== 405*ab9e68a2SToomas Soome * Initialize a new block. 406*ab9e68a2SToomas Soome */ 407*ab9e68a2SToomas Soome local void init_block(s) 408*ab9e68a2SToomas Soome deflate_state *s; 409*ab9e68a2SToomas Soome { 410*ab9e68a2SToomas Soome int n; /* iterates over tree elements */ 411*ab9e68a2SToomas Soome 412*ab9e68a2SToomas Soome /* Initialize the trees. */ 413*ab9e68a2SToomas Soome for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; 414*ab9e68a2SToomas Soome for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; 415*ab9e68a2SToomas Soome for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; 416*ab9e68a2SToomas Soome 417*ab9e68a2SToomas Soome s->dyn_ltree[END_BLOCK].Freq = 1; 418*ab9e68a2SToomas Soome s->opt_len = s->static_len = 0L; 419*ab9e68a2SToomas Soome s->last_lit = s->matches = 0; 420*ab9e68a2SToomas Soome } 421*ab9e68a2SToomas Soome 422*ab9e68a2SToomas Soome #define SMALLEST 1 423*ab9e68a2SToomas Soome /* Index within the heap array of least frequent node in the Huffman tree */ 424*ab9e68a2SToomas Soome 425*ab9e68a2SToomas Soome 426*ab9e68a2SToomas Soome /* =========================================================================== 427*ab9e68a2SToomas Soome * Remove the smallest element from the heap and recreate the heap with 428*ab9e68a2SToomas Soome * one less element. Updates heap and heap_len. 429*ab9e68a2SToomas Soome */ 430*ab9e68a2SToomas Soome #define pqremove(s, tree, top) \ 431*ab9e68a2SToomas Soome {\ 432*ab9e68a2SToomas Soome top = s->heap[SMALLEST]; \ 433*ab9e68a2SToomas Soome s->heap[SMALLEST] = s->heap[s->heap_len--]; \ 434*ab9e68a2SToomas Soome pqdownheap(s, tree, SMALLEST); \ 435*ab9e68a2SToomas Soome } 436*ab9e68a2SToomas Soome 437*ab9e68a2SToomas Soome /* =========================================================================== 438*ab9e68a2SToomas Soome * Compares to subtrees, using the tree depth as tie breaker when 439*ab9e68a2SToomas Soome * the subtrees have equal frequency. This minimizes the worst case length. 440*ab9e68a2SToomas Soome */ 441*ab9e68a2SToomas Soome #define smaller(tree, n, m, depth) \ 442*ab9e68a2SToomas Soome (tree[n].Freq < tree[m].Freq || \ 443*ab9e68a2SToomas Soome (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) 444*ab9e68a2SToomas Soome 445*ab9e68a2SToomas Soome /* =========================================================================== 446*ab9e68a2SToomas Soome * Restore the heap property by moving down the tree starting at node k, 447*ab9e68a2SToomas Soome * exchanging a node with the smallest of its two sons if necessary, stopping 448*ab9e68a2SToomas Soome * when the heap property is re-established (each father smaller than its 449*ab9e68a2SToomas Soome * two sons). 450*ab9e68a2SToomas Soome */ 451*ab9e68a2SToomas Soome local void pqdownheap(s, tree, k) 452*ab9e68a2SToomas Soome deflate_state *s; 453*ab9e68a2SToomas Soome ct_data *tree; /* the tree to restore */ 454*ab9e68a2SToomas Soome int k; /* node to move down */ 455*ab9e68a2SToomas Soome { 456*ab9e68a2SToomas Soome int v = s->heap[k]; 457*ab9e68a2SToomas Soome int j = k << 1; /* left son of k */ 458*ab9e68a2SToomas Soome while (j <= s->heap_len) { 459*ab9e68a2SToomas Soome /* Set j to the smallest of the two sons: */ 460*ab9e68a2SToomas Soome if (j < s->heap_len && 461*ab9e68a2SToomas Soome smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { 462*ab9e68a2SToomas Soome j++; 463*ab9e68a2SToomas Soome } 464*ab9e68a2SToomas Soome /* Exit if v is smaller than both sons */ 465*ab9e68a2SToomas Soome if (smaller(tree, v, s->heap[j], s->depth)) break; 466*ab9e68a2SToomas Soome 467*ab9e68a2SToomas Soome /* Exchange v with the smallest son */ 468*ab9e68a2SToomas Soome s->heap[k] = s->heap[j]; k = j; 469*ab9e68a2SToomas Soome 470*ab9e68a2SToomas Soome /* And continue down the tree, setting j to the left son of k */ 471*ab9e68a2SToomas Soome j <<= 1; 472*ab9e68a2SToomas Soome } 473*ab9e68a2SToomas Soome s->heap[k] = v; 474*ab9e68a2SToomas Soome } 475*ab9e68a2SToomas Soome 476*ab9e68a2SToomas Soome /* =========================================================================== 477*ab9e68a2SToomas Soome * Compute the optimal bit lengths for a tree and update the total bit length 478*ab9e68a2SToomas Soome * for the current block. 479*ab9e68a2SToomas Soome * IN assertion: the fields freq and dad are set, heap[heap_max] and 480*ab9e68a2SToomas Soome * above are the tree nodes sorted by increasing frequency. 481*ab9e68a2SToomas Soome * OUT assertions: the field len is set to the optimal bit length, the 482*ab9e68a2SToomas Soome * array bl_count contains the frequencies for each bit length. 483*ab9e68a2SToomas Soome * The length opt_len is updated; static_len is also updated if stree is 484*ab9e68a2SToomas Soome * not null. 485*ab9e68a2SToomas Soome */ 486*ab9e68a2SToomas Soome local void gen_bitlen(s, desc) 487*ab9e68a2SToomas Soome deflate_state *s; 488*ab9e68a2SToomas Soome tree_desc *desc; /* the tree descriptor */ 489*ab9e68a2SToomas Soome { 490*ab9e68a2SToomas Soome ct_data *tree = desc->dyn_tree; 491*ab9e68a2SToomas Soome int max_code = desc->max_code; 492*ab9e68a2SToomas Soome const ct_data *stree = desc->stat_desc->static_tree; 493*ab9e68a2SToomas Soome const intf *extra = desc->stat_desc->extra_bits; 494*ab9e68a2SToomas Soome int base = desc->stat_desc->extra_base; 495*ab9e68a2SToomas Soome int max_length = desc->stat_desc->max_length; 496*ab9e68a2SToomas Soome int h; /* heap index */ 497*ab9e68a2SToomas Soome int n, m; /* iterate over the tree elements */ 498*ab9e68a2SToomas Soome int bits; /* bit length */ 499*ab9e68a2SToomas Soome int xbits; /* extra bits */ 500*ab9e68a2SToomas Soome ush f; /* frequency */ 501*ab9e68a2SToomas Soome int overflow = 0; /* number of elements with bit length too large */ 502*ab9e68a2SToomas Soome 503*ab9e68a2SToomas Soome for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; 504*ab9e68a2SToomas Soome 505*ab9e68a2SToomas Soome /* In a first pass, compute the optimal bit lengths (which may 506*ab9e68a2SToomas Soome * overflow in the case of the bit length tree). 507*ab9e68a2SToomas Soome */ 508*ab9e68a2SToomas Soome tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ 509*ab9e68a2SToomas Soome 510*ab9e68a2SToomas Soome for (h = s->heap_max+1; h < HEAP_SIZE; h++) { 511*ab9e68a2SToomas Soome n = s->heap[h]; 512*ab9e68a2SToomas Soome bits = tree[tree[n].Dad].Len + 1; 513*ab9e68a2SToomas Soome if (bits > max_length) bits = max_length, overflow++; 514*ab9e68a2SToomas Soome tree[n].Len = (ush)bits; 515*ab9e68a2SToomas Soome /* We overwrite tree[n].Dad which is no longer needed */ 516*ab9e68a2SToomas Soome 517*ab9e68a2SToomas Soome if (n > max_code) continue; /* not a leaf node */ 518*ab9e68a2SToomas Soome 519*ab9e68a2SToomas Soome s->bl_count[bits]++; 520*ab9e68a2SToomas Soome xbits = 0; 521*ab9e68a2SToomas Soome if (n >= base) xbits = extra[n-base]; 522*ab9e68a2SToomas Soome f = tree[n].Freq; 523*ab9e68a2SToomas Soome s->opt_len += (ulg)f * (unsigned)(bits + xbits); 524*ab9e68a2SToomas Soome if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); 525*ab9e68a2SToomas Soome } 526*ab9e68a2SToomas Soome if (overflow == 0) return; 527*ab9e68a2SToomas Soome 528*ab9e68a2SToomas Soome Tracev((stderr,"\nbit length overflow\n")); 529*ab9e68a2SToomas Soome /* This happens for example on obj2 and pic of the Calgary corpus */ 530*ab9e68a2SToomas Soome 531*ab9e68a2SToomas Soome /* Find the first bit length which could increase: */ 532*ab9e68a2SToomas Soome do { 533*ab9e68a2SToomas Soome bits = max_length-1; 534*ab9e68a2SToomas Soome while (s->bl_count[bits] == 0) bits--; 535*ab9e68a2SToomas Soome s->bl_count[bits]--; /* move one leaf down the tree */ 536*ab9e68a2SToomas Soome s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ 537*ab9e68a2SToomas Soome s->bl_count[max_length]--; 538*ab9e68a2SToomas Soome /* The brother of the overflow item also moves one step up, 539*ab9e68a2SToomas Soome * but this does not affect bl_count[max_length] 540*ab9e68a2SToomas Soome */ 541*ab9e68a2SToomas Soome overflow -= 2; 542*ab9e68a2SToomas Soome } while (overflow > 0); 543*ab9e68a2SToomas Soome 544*ab9e68a2SToomas Soome /* Now recompute all bit lengths, scanning in increasing frequency. 545*ab9e68a2SToomas Soome * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all 546*ab9e68a2SToomas Soome * lengths instead of fixing only the wrong ones. This idea is taken 547*ab9e68a2SToomas Soome * from 'ar' written by Haruhiko Okumura.) 548*ab9e68a2SToomas Soome */ 549*ab9e68a2SToomas Soome for (bits = max_length; bits != 0; bits--) { 550*ab9e68a2SToomas Soome n = s->bl_count[bits]; 551*ab9e68a2SToomas Soome while (n != 0) { 552*ab9e68a2SToomas Soome m = s->heap[--h]; 553*ab9e68a2SToomas Soome if (m > max_code) continue; 554*ab9e68a2SToomas Soome if ((unsigned) tree[m].Len != (unsigned) bits) { 555*ab9e68a2SToomas Soome Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); 556*ab9e68a2SToomas Soome s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; 557*ab9e68a2SToomas Soome tree[m].Len = (ush)bits; 558*ab9e68a2SToomas Soome } 559*ab9e68a2SToomas Soome n--; 560*ab9e68a2SToomas Soome } 561*ab9e68a2SToomas Soome } 562*ab9e68a2SToomas Soome } 563*ab9e68a2SToomas Soome 564*ab9e68a2SToomas Soome /* =========================================================================== 565*ab9e68a2SToomas Soome * Generate the codes for a given tree and bit counts (which need not be 566*ab9e68a2SToomas Soome * optimal). 567*ab9e68a2SToomas Soome * IN assertion: the array bl_count contains the bit length statistics for 568*ab9e68a2SToomas Soome * the given tree and the field len is set for all tree elements. 569*ab9e68a2SToomas Soome * OUT assertion: the field code is set for all tree elements of non 570*ab9e68a2SToomas Soome * zero code length. 571*ab9e68a2SToomas Soome */ 572*ab9e68a2SToomas Soome local void gen_codes (tree, max_code, bl_count) 573*ab9e68a2SToomas Soome ct_data *tree; /* the tree to decorate */ 574*ab9e68a2SToomas Soome int max_code; /* largest code with non zero frequency */ 575*ab9e68a2SToomas Soome ushf *bl_count; /* number of codes at each bit length */ 576*ab9e68a2SToomas Soome { 577*ab9e68a2SToomas Soome ush next_code[MAX_BITS+1]; /* next code value for each bit length */ 578*ab9e68a2SToomas Soome unsigned code = 0; /* running code value */ 579*ab9e68a2SToomas Soome int bits; /* bit index */ 580*ab9e68a2SToomas Soome int n; /* code index */ 581*ab9e68a2SToomas Soome 582*ab9e68a2SToomas Soome /* The distribution counts are first used to generate the code values 583*ab9e68a2SToomas Soome * without bit reversal. 584*ab9e68a2SToomas Soome */ 585*ab9e68a2SToomas Soome for (bits = 1; bits <= MAX_BITS; bits++) { 586*ab9e68a2SToomas Soome code = (code + bl_count[bits-1]) << 1; 587*ab9e68a2SToomas Soome next_code[bits] = (ush)code; 588*ab9e68a2SToomas Soome } 589*ab9e68a2SToomas Soome /* Check that the bit counts in bl_count are consistent. The last code 590*ab9e68a2SToomas Soome * must be all ones. 591*ab9e68a2SToomas Soome */ 592*ab9e68a2SToomas Soome Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, 593*ab9e68a2SToomas Soome "inconsistent bit counts"); 594*ab9e68a2SToomas Soome Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); 595*ab9e68a2SToomas Soome 596*ab9e68a2SToomas Soome for (n = 0; n <= max_code; n++) { 597*ab9e68a2SToomas Soome int len = tree[n].Len; 598*ab9e68a2SToomas Soome if (len == 0) continue; 599*ab9e68a2SToomas Soome /* Now reverse the bits */ 600*ab9e68a2SToomas Soome tree[n].Code = (ush)bi_reverse(next_code[len]++, len); 601*ab9e68a2SToomas Soome 602*ab9e68a2SToomas Soome Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", 603*ab9e68a2SToomas Soome n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); 604*ab9e68a2SToomas Soome } 605*ab9e68a2SToomas Soome } 606*ab9e68a2SToomas Soome 607*ab9e68a2SToomas Soome /* =========================================================================== 608*ab9e68a2SToomas Soome * Construct one Huffman tree and assigns the code bit strings and lengths. 609*ab9e68a2SToomas Soome * Update the total bit length for the current block. 610*ab9e68a2SToomas Soome * IN assertion: the field freq is set for all tree elements. 611*ab9e68a2SToomas Soome * OUT assertions: the fields len and code are set to the optimal bit length 612*ab9e68a2SToomas Soome * and corresponding code. The length opt_len is updated; static_len is 613*ab9e68a2SToomas Soome * also updated if stree is not null. The field max_code is set. 614*ab9e68a2SToomas Soome */ 615*ab9e68a2SToomas Soome local void build_tree(s, desc) 616*ab9e68a2SToomas Soome deflate_state *s; 617*ab9e68a2SToomas Soome tree_desc *desc; /* the tree descriptor */ 618*ab9e68a2SToomas Soome { 619*ab9e68a2SToomas Soome ct_data *tree = desc->dyn_tree; 620*ab9e68a2SToomas Soome const ct_data *stree = desc->stat_desc->static_tree; 621*ab9e68a2SToomas Soome int elems = desc->stat_desc->elems; 622*ab9e68a2SToomas Soome int n, m; /* iterate over heap elements */ 623*ab9e68a2SToomas Soome int max_code = -1; /* largest code with non zero frequency */ 624*ab9e68a2SToomas Soome int node; /* new node being created */ 625*ab9e68a2SToomas Soome 626*ab9e68a2SToomas Soome /* Construct the initial heap, with least frequent element in 627*ab9e68a2SToomas Soome * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. 628*ab9e68a2SToomas Soome * heap[0] is not used. 629*ab9e68a2SToomas Soome */ 630*ab9e68a2SToomas Soome s->heap_len = 0, s->heap_max = HEAP_SIZE; 631*ab9e68a2SToomas Soome 632*ab9e68a2SToomas Soome for (n = 0; n < elems; n++) { 633*ab9e68a2SToomas Soome if (tree[n].Freq != 0) { 634*ab9e68a2SToomas Soome s->heap[++(s->heap_len)] = max_code = n; 635*ab9e68a2SToomas Soome s->depth[n] = 0; 636*ab9e68a2SToomas Soome } else { 637*ab9e68a2SToomas Soome tree[n].Len = 0; 638*ab9e68a2SToomas Soome } 639*ab9e68a2SToomas Soome } 640*ab9e68a2SToomas Soome 641*ab9e68a2SToomas Soome /* The pkzip format requires that at least one distance code exists, 642*ab9e68a2SToomas Soome * and that at least one bit should be sent even if there is only one 643*ab9e68a2SToomas Soome * possible code. So to avoid special checks later on we force at least 644*ab9e68a2SToomas Soome * two codes of non zero frequency. 645*ab9e68a2SToomas Soome */ 646*ab9e68a2SToomas Soome while (s->heap_len < 2) { 647*ab9e68a2SToomas Soome node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); 648*ab9e68a2SToomas Soome tree[node].Freq = 1; 649*ab9e68a2SToomas Soome s->depth[node] = 0; 650*ab9e68a2SToomas Soome s->opt_len--; if (stree) s->static_len -= stree[node].Len; 651*ab9e68a2SToomas Soome /* node is 0 or 1 so it does not have extra bits */ 652*ab9e68a2SToomas Soome } 653*ab9e68a2SToomas Soome desc->max_code = max_code; 654*ab9e68a2SToomas Soome 655*ab9e68a2SToomas Soome /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, 656*ab9e68a2SToomas Soome * establish sub-heaps of increasing lengths: 657*ab9e68a2SToomas Soome */ 658*ab9e68a2SToomas Soome for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); 659*ab9e68a2SToomas Soome 660*ab9e68a2SToomas Soome /* Construct the Huffman tree by repeatedly combining the least two 661*ab9e68a2SToomas Soome * frequent nodes. 662*ab9e68a2SToomas Soome */ 663*ab9e68a2SToomas Soome node = elems; /* next internal node of the tree */ 664*ab9e68a2SToomas Soome do { 665*ab9e68a2SToomas Soome pqremove(s, tree, n); /* n = node of least frequency */ 666*ab9e68a2SToomas Soome m = s->heap[SMALLEST]; /* m = node of next least frequency */ 667*ab9e68a2SToomas Soome 668*ab9e68a2SToomas Soome s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ 669*ab9e68a2SToomas Soome s->heap[--(s->heap_max)] = m; 670*ab9e68a2SToomas Soome 671*ab9e68a2SToomas Soome /* Create a new node father of n and m */ 672*ab9e68a2SToomas Soome tree[node].Freq = tree[n].Freq + tree[m].Freq; 673*ab9e68a2SToomas Soome s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? 674*ab9e68a2SToomas Soome s->depth[n] : s->depth[m]) + 1); 675*ab9e68a2SToomas Soome tree[n].Dad = tree[m].Dad = (ush)node; 676*ab9e68a2SToomas Soome #ifdef DUMP_BL_TREE 677*ab9e68a2SToomas Soome if (tree == s->bl_tree) { 678*ab9e68a2SToomas Soome fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", 679*ab9e68a2SToomas Soome node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); 680*ab9e68a2SToomas Soome } 681*ab9e68a2SToomas Soome #endif 682*ab9e68a2SToomas Soome /* and insert the new node in the heap */ 683*ab9e68a2SToomas Soome s->heap[SMALLEST] = node++; 684*ab9e68a2SToomas Soome pqdownheap(s, tree, SMALLEST); 685*ab9e68a2SToomas Soome 686*ab9e68a2SToomas Soome } while (s->heap_len >= 2); 687*ab9e68a2SToomas Soome 688*ab9e68a2SToomas Soome s->heap[--(s->heap_max)] = s->heap[SMALLEST]; 689*ab9e68a2SToomas Soome 690*ab9e68a2SToomas Soome /* At this point, the fields freq and dad are set. We can now 691*ab9e68a2SToomas Soome * generate the bit lengths. 692*ab9e68a2SToomas Soome */ 693*ab9e68a2SToomas Soome gen_bitlen(s, (tree_desc *)desc); 694*ab9e68a2SToomas Soome 695*ab9e68a2SToomas Soome /* The field len is now set, we can generate the bit codes */ 696*ab9e68a2SToomas Soome gen_codes ((ct_data *)tree, max_code, s->bl_count); 697*ab9e68a2SToomas Soome } 698*ab9e68a2SToomas Soome 699*ab9e68a2SToomas Soome /* =========================================================================== 700*ab9e68a2SToomas Soome * Scan a literal or distance tree to determine the frequencies of the codes 701*ab9e68a2SToomas Soome * in the bit length tree. 702*ab9e68a2SToomas Soome */ 703*ab9e68a2SToomas Soome local void scan_tree (s, tree, max_code) 704*ab9e68a2SToomas Soome deflate_state *s; 705*ab9e68a2SToomas Soome ct_data *tree; /* the tree to be scanned */ 706*ab9e68a2SToomas Soome int max_code; /* and its largest code of non zero frequency */ 707*ab9e68a2SToomas Soome { 708*ab9e68a2SToomas Soome int n; /* iterates over all tree elements */ 709*ab9e68a2SToomas Soome int prevlen = -1; /* last emitted length */ 710*ab9e68a2SToomas Soome int curlen; /* length of current code */ 711*ab9e68a2SToomas Soome int nextlen = tree[0].Len; /* length of next code */ 712*ab9e68a2SToomas Soome int count = 0; /* repeat count of the current code */ 713*ab9e68a2SToomas Soome int max_count = 7; /* max repeat count */ 714*ab9e68a2SToomas Soome int min_count = 4; /* min repeat count */ 715*ab9e68a2SToomas Soome 716*ab9e68a2SToomas Soome if (nextlen == 0) max_count = 138, min_count = 3; 717*ab9e68a2SToomas Soome tree[max_code+1].Len = (ush)0xffff; /* guard */ 718*ab9e68a2SToomas Soome 719*ab9e68a2SToomas Soome for (n = 0; n <= max_code; n++) { 720*ab9e68a2SToomas Soome curlen = nextlen; nextlen = tree[n+1].Len; 721*ab9e68a2SToomas Soome if (++count < max_count && curlen == nextlen) { 722*ab9e68a2SToomas Soome continue; 723*ab9e68a2SToomas Soome } else if (count < min_count) { 724*ab9e68a2SToomas Soome s->bl_tree[curlen].Freq += count; 725*ab9e68a2SToomas Soome } else if (curlen != 0) { 726*ab9e68a2SToomas Soome if (curlen != prevlen) s->bl_tree[curlen].Freq++; 727*ab9e68a2SToomas Soome s->bl_tree[REP_3_6].Freq++; 728*ab9e68a2SToomas Soome } else if (count <= 10) { 729*ab9e68a2SToomas Soome s->bl_tree[REPZ_3_10].Freq++; 730*ab9e68a2SToomas Soome } else { 731*ab9e68a2SToomas Soome s->bl_tree[REPZ_11_138].Freq++; 732*ab9e68a2SToomas Soome } 733*ab9e68a2SToomas Soome count = 0; prevlen = curlen; 734*ab9e68a2SToomas Soome if (nextlen == 0) { 735*ab9e68a2SToomas Soome max_count = 138, min_count = 3; 736*ab9e68a2SToomas Soome } else if (curlen == nextlen) { 737*ab9e68a2SToomas Soome max_count = 6, min_count = 3; 738*ab9e68a2SToomas Soome } else { 739*ab9e68a2SToomas Soome max_count = 7, min_count = 4; 740*ab9e68a2SToomas Soome } 741*ab9e68a2SToomas Soome } 742*ab9e68a2SToomas Soome } 743*ab9e68a2SToomas Soome 744*ab9e68a2SToomas Soome /* =========================================================================== 745*ab9e68a2SToomas Soome * Send a literal or distance tree in compressed form, using the codes in 746*ab9e68a2SToomas Soome * bl_tree. 747*ab9e68a2SToomas Soome */ 748*ab9e68a2SToomas Soome local void send_tree (s, tree, max_code) 749*ab9e68a2SToomas Soome deflate_state *s; 750*ab9e68a2SToomas Soome ct_data *tree; /* the tree to be scanned */ 751*ab9e68a2SToomas Soome int max_code; /* and its largest code of non zero frequency */ 752*ab9e68a2SToomas Soome { 753*ab9e68a2SToomas Soome int n; /* iterates over all tree elements */ 754*ab9e68a2SToomas Soome int prevlen = -1; /* last emitted length */ 755*ab9e68a2SToomas Soome int curlen; /* length of current code */ 756*ab9e68a2SToomas Soome int nextlen = tree[0].Len; /* length of next code */ 757*ab9e68a2SToomas Soome int count = 0; /* repeat count of the current code */ 758*ab9e68a2SToomas Soome int max_count = 7; /* max repeat count */ 759*ab9e68a2SToomas Soome int min_count = 4; /* min repeat count */ 760*ab9e68a2SToomas Soome 761*ab9e68a2SToomas Soome /* tree[max_code+1].Len = -1; */ /* guard already set */ 762*ab9e68a2SToomas Soome if (nextlen == 0) max_count = 138, min_count = 3; 763*ab9e68a2SToomas Soome 764*ab9e68a2SToomas Soome for (n = 0; n <= max_code; n++) { 765*ab9e68a2SToomas Soome curlen = nextlen; nextlen = tree[n+1].Len; 766*ab9e68a2SToomas Soome if (++count < max_count && curlen == nextlen) { 767*ab9e68a2SToomas Soome continue; 768*ab9e68a2SToomas Soome } else if (count < min_count) { 769*ab9e68a2SToomas Soome do { send_code(s, curlen, s->bl_tree); } while (--count != 0); 770*ab9e68a2SToomas Soome 771*ab9e68a2SToomas Soome } else if (curlen != 0) { 772*ab9e68a2SToomas Soome if (curlen != prevlen) { 773*ab9e68a2SToomas Soome send_code(s, curlen, s->bl_tree); count--; 774*ab9e68a2SToomas Soome } 775*ab9e68a2SToomas Soome Assert(count >= 3 && count <= 6, " 3_6?"); 776*ab9e68a2SToomas Soome send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); 777*ab9e68a2SToomas Soome 778*ab9e68a2SToomas Soome } else if (count <= 10) { 779*ab9e68a2SToomas Soome send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); 780*ab9e68a2SToomas Soome 781*ab9e68a2SToomas Soome } else { 782*ab9e68a2SToomas Soome send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); 783*ab9e68a2SToomas Soome } 784*ab9e68a2SToomas Soome count = 0; prevlen = curlen; 785*ab9e68a2SToomas Soome if (nextlen == 0) { 786*ab9e68a2SToomas Soome max_count = 138, min_count = 3; 787*ab9e68a2SToomas Soome } else if (curlen == nextlen) { 788*ab9e68a2SToomas Soome max_count = 6, min_count = 3; 789*ab9e68a2SToomas Soome } else { 790*ab9e68a2SToomas Soome max_count = 7, min_count = 4; 791*ab9e68a2SToomas Soome } 792*ab9e68a2SToomas Soome } 793*ab9e68a2SToomas Soome } 794*ab9e68a2SToomas Soome 795*ab9e68a2SToomas Soome /* =========================================================================== 796*ab9e68a2SToomas Soome * Construct the Huffman tree for the bit lengths and return the index in 797*ab9e68a2SToomas Soome * bl_order of the last bit length code to send. 798*ab9e68a2SToomas Soome */ 799*ab9e68a2SToomas Soome local int build_bl_tree(s) 800*ab9e68a2SToomas Soome deflate_state *s; 801*ab9e68a2SToomas Soome { 802*ab9e68a2SToomas Soome int max_blindex; /* index of last bit length code of non zero freq */ 803*ab9e68a2SToomas Soome 804*ab9e68a2SToomas Soome /* Determine the bit length frequencies for literal and distance trees */ 805*ab9e68a2SToomas Soome scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); 806*ab9e68a2SToomas Soome scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); 807*ab9e68a2SToomas Soome 808*ab9e68a2SToomas Soome /* Build the bit length tree: */ 809*ab9e68a2SToomas Soome build_tree(s, (tree_desc *)(&(s->bl_desc))); 810*ab9e68a2SToomas Soome /* opt_len now includes the length of the tree representations, except 811*ab9e68a2SToomas Soome * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. 812*ab9e68a2SToomas Soome */ 813*ab9e68a2SToomas Soome 814*ab9e68a2SToomas Soome /* Determine the number of bit length codes to send. The pkzip format 815*ab9e68a2SToomas Soome * requires that at least 4 bit length codes be sent. (appnote.txt says 816*ab9e68a2SToomas Soome * 3 but the actual value used is 4.) 817*ab9e68a2SToomas Soome */ 818*ab9e68a2SToomas Soome for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { 819*ab9e68a2SToomas Soome if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; 820*ab9e68a2SToomas Soome } 821*ab9e68a2SToomas Soome /* Update opt_len to include the bit length tree and counts */ 822*ab9e68a2SToomas Soome s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; 823*ab9e68a2SToomas Soome Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", 824*ab9e68a2SToomas Soome s->opt_len, s->static_len)); 825*ab9e68a2SToomas Soome 826*ab9e68a2SToomas Soome return max_blindex; 827*ab9e68a2SToomas Soome } 828*ab9e68a2SToomas Soome 829*ab9e68a2SToomas Soome /* =========================================================================== 830*ab9e68a2SToomas Soome * Send the header for a block using dynamic Huffman trees: the counts, the 831*ab9e68a2SToomas Soome * lengths of the bit length codes, the literal tree and the distance tree. 832*ab9e68a2SToomas Soome * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. 833*ab9e68a2SToomas Soome */ 834*ab9e68a2SToomas Soome local void send_all_trees(s, lcodes, dcodes, blcodes) 835*ab9e68a2SToomas Soome deflate_state *s; 836*ab9e68a2SToomas Soome int lcodes, dcodes, blcodes; /* number of codes for each tree */ 837*ab9e68a2SToomas Soome { 838*ab9e68a2SToomas Soome int rank; /* index in bl_order */ 839*ab9e68a2SToomas Soome 840*ab9e68a2SToomas Soome Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); 841*ab9e68a2SToomas Soome Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, 842*ab9e68a2SToomas Soome "too many codes"); 843*ab9e68a2SToomas Soome Tracev((stderr, "\nbl counts: ")); 844*ab9e68a2SToomas Soome send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ 845*ab9e68a2SToomas Soome send_bits(s, dcodes-1, 5); 846*ab9e68a2SToomas Soome send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ 847*ab9e68a2SToomas Soome for (rank = 0; rank < blcodes; rank++) { 848*ab9e68a2SToomas Soome Tracev((stderr, "\nbl code %2d ", bl_order[rank])); 849*ab9e68a2SToomas Soome send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); 850*ab9e68a2SToomas Soome } 851*ab9e68a2SToomas Soome Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); 852*ab9e68a2SToomas Soome 853*ab9e68a2SToomas Soome send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ 854*ab9e68a2SToomas Soome Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); 855*ab9e68a2SToomas Soome 856*ab9e68a2SToomas Soome send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ 857*ab9e68a2SToomas Soome Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); 858*ab9e68a2SToomas Soome } 859*ab9e68a2SToomas Soome 860*ab9e68a2SToomas Soome /* =========================================================================== 861*ab9e68a2SToomas Soome * Send a stored block 862*ab9e68a2SToomas Soome */ 863*ab9e68a2SToomas Soome void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) 864*ab9e68a2SToomas Soome deflate_state *s; 865*ab9e68a2SToomas Soome charf *buf; /* input block */ 866*ab9e68a2SToomas Soome ulg stored_len; /* length of input block */ 867*ab9e68a2SToomas Soome int last; /* one if this is the last block for a file */ 868*ab9e68a2SToomas Soome { 869*ab9e68a2SToomas Soome send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ 870*ab9e68a2SToomas Soome bi_windup(s); /* align on byte boundary */ 871*ab9e68a2SToomas Soome put_short(s, (ush)stored_len); 872*ab9e68a2SToomas Soome put_short(s, (ush)~stored_len); 873*ab9e68a2SToomas Soome zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); 874*ab9e68a2SToomas Soome s->pending += stored_len; 875*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 876*ab9e68a2SToomas Soome s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; 877*ab9e68a2SToomas Soome s->compressed_len += (stored_len + 4) << 3; 878*ab9e68a2SToomas Soome s->bits_sent += 2*16; 879*ab9e68a2SToomas Soome s->bits_sent += stored_len<<3; 880*ab9e68a2SToomas Soome #endif 881*ab9e68a2SToomas Soome } 882*ab9e68a2SToomas Soome 883*ab9e68a2SToomas Soome /* =========================================================================== 884*ab9e68a2SToomas Soome * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) 885*ab9e68a2SToomas Soome */ 886*ab9e68a2SToomas Soome void ZLIB_INTERNAL _tr_flush_bits(s) 887*ab9e68a2SToomas Soome deflate_state *s; 888*ab9e68a2SToomas Soome { 889*ab9e68a2SToomas Soome bi_flush(s); 890*ab9e68a2SToomas Soome } 891*ab9e68a2SToomas Soome 892*ab9e68a2SToomas Soome /* =========================================================================== 893*ab9e68a2SToomas Soome * Send one empty static block to give enough lookahead for inflate. 894*ab9e68a2SToomas Soome * This takes 10 bits, of which 7 may remain in the bit buffer. 895*ab9e68a2SToomas Soome */ 896*ab9e68a2SToomas Soome void ZLIB_INTERNAL _tr_align(s) 897*ab9e68a2SToomas Soome deflate_state *s; 898*ab9e68a2SToomas Soome { 899*ab9e68a2SToomas Soome send_bits(s, STATIC_TREES<<1, 3); 900*ab9e68a2SToomas Soome send_code(s, END_BLOCK, static_ltree); 901*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 902*ab9e68a2SToomas Soome s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ 903*ab9e68a2SToomas Soome #endif 904*ab9e68a2SToomas Soome bi_flush(s); 905*ab9e68a2SToomas Soome } 906*ab9e68a2SToomas Soome 907*ab9e68a2SToomas Soome /* =========================================================================== 908*ab9e68a2SToomas Soome * Determine the best encoding for the current block: dynamic trees, static 909*ab9e68a2SToomas Soome * trees or store, and write out the encoded block. 910*ab9e68a2SToomas Soome */ 911*ab9e68a2SToomas Soome void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) 912*ab9e68a2SToomas Soome deflate_state *s; 913*ab9e68a2SToomas Soome charf *buf; /* input block, or NULL if too old */ 914*ab9e68a2SToomas Soome ulg stored_len; /* length of input block */ 915*ab9e68a2SToomas Soome int last; /* one if this is the last block for a file */ 916*ab9e68a2SToomas Soome { 917*ab9e68a2SToomas Soome ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ 918*ab9e68a2SToomas Soome int max_blindex = 0; /* index of last bit length code of non zero freq */ 919*ab9e68a2SToomas Soome 920*ab9e68a2SToomas Soome /* Build the Huffman trees unless a stored block is forced */ 921*ab9e68a2SToomas Soome if (s->level > 0) { 922*ab9e68a2SToomas Soome 923*ab9e68a2SToomas Soome /* Check if the file is binary or text */ 924*ab9e68a2SToomas Soome if (s->strm->data_type == Z_UNKNOWN) 925*ab9e68a2SToomas Soome s->strm->data_type = detect_data_type(s); 926*ab9e68a2SToomas Soome 927*ab9e68a2SToomas Soome /* Construct the literal and distance trees */ 928*ab9e68a2SToomas Soome build_tree(s, (tree_desc *)(&(s->l_desc))); 929*ab9e68a2SToomas Soome Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, 930*ab9e68a2SToomas Soome s->static_len)); 931*ab9e68a2SToomas Soome 932*ab9e68a2SToomas Soome build_tree(s, (tree_desc *)(&(s->d_desc))); 933*ab9e68a2SToomas Soome Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, 934*ab9e68a2SToomas Soome s->static_len)); 935*ab9e68a2SToomas Soome /* At this point, opt_len and static_len are the total bit lengths of 936*ab9e68a2SToomas Soome * the compressed block data, excluding the tree representations. 937*ab9e68a2SToomas Soome */ 938*ab9e68a2SToomas Soome 939*ab9e68a2SToomas Soome /* Build the bit length tree for the above two trees, and get the index 940*ab9e68a2SToomas Soome * in bl_order of the last bit length code to send. 941*ab9e68a2SToomas Soome */ 942*ab9e68a2SToomas Soome max_blindex = build_bl_tree(s); 943*ab9e68a2SToomas Soome 944*ab9e68a2SToomas Soome /* Determine the best encoding. Compute the block lengths in bytes. */ 945*ab9e68a2SToomas Soome opt_lenb = (s->opt_len+3+7)>>3; 946*ab9e68a2SToomas Soome static_lenb = (s->static_len+3+7)>>3; 947*ab9e68a2SToomas Soome 948*ab9e68a2SToomas Soome Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", 949*ab9e68a2SToomas Soome opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, 950*ab9e68a2SToomas Soome s->last_lit)); 951*ab9e68a2SToomas Soome 952*ab9e68a2SToomas Soome if (static_lenb <= opt_lenb) opt_lenb = static_lenb; 953*ab9e68a2SToomas Soome 954*ab9e68a2SToomas Soome } else { 955*ab9e68a2SToomas Soome Assert(buf != (char*)0, "lost buf"); 956*ab9e68a2SToomas Soome opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ 957*ab9e68a2SToomas Soome } 958*ab9e68a2SToomas Soome 959*ab9e68a2SToomas Soome #ifdef FORCE_STORED 960*ab9e68a2SToomas Soome if (buf != (char*)0) { /* force stored block */ 961*ab9e68a2SToomas Soome #else 962*ab9e68a2SToomas Soome if (stored_len+4 <= opt_lenb && buf != (char*)0) { 963*ab9e68a2SToomas Soome /* 4: two words for the lengths */ 964*ab9e68a2SToomas Soome #endif 965*ab9e68a2SToomas Soome /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. 966*ab9e68a2SToomas Soome * Otherwise we can't have processed more than WSIZE input bytes since 967*ab9e68a2SToomas Soome * the last block flush, because compression would have been 968*ab9e68a2SToomas Soome * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to 969*ab9e68a2SToomas Soome * transform a block into a stored block. 970*ab9e68a2SToomas Soome */ 971*ab9e68a2SToomas Soome _tr_stored_block(s, buf, stored_len, last); 972*ab9e68a2SToomas Soome 973*ab9e68a2SToomas Soome #ifdef FORCE_STATIC 974*ab9e68a2SToomas Soome } else if (static_lenb >= 0) { /* force static trees */ 975*ab9e68a2SToomas Soome #else 976*ab9e68a2SToomas Soome } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { 977*ab9e68a2SToomas Soome #endif 978*ab9e68a2SToomas Soome send_bits(s, (STATIC_TREES<<1)+last, 3); 979*ab9e68a2SToomas Soome compress_block(s, (const ct_data *)static_ltree, 980*ab9e68a2SToomas Soome (const ct_data *)static_dtree); 981*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 982*ab9e68a2SToomas Soome s->compressed_len += 3 + s->static_len; 983*ab9e68a2SToomas Soome #endif 984*ab9e68a2SToomas Soome } else { 985*ab9e68a2SToomas Soome send_bits(s, (DYN_TREES<<1)+last, 3); 986*ab9e68a2SToomas Soome send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, 987*ab9e68a2SToomas Soome max_blindex+1); 988*ab9e68a2SToomas Soome compress_block(s, (const ct_data *)s->dyn_ltree, 989*ab9e68a2SToomas Soome (const ct_data *)s->dyn_dtree); 990*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 991*ab9e68a2SToomas Soome s->compressed_len += 3 + s->opt_len; 992*ab9e68a2SToomas Soome #endif 993*ab9e68a2SToomas Soome } 994*ab9e68a2SToomas Soome Assert (s->compressed_len == s->bits_sent, "bad compressed size"); 995*ab9e68a2SToomas Soome /* The above check is made mod 2^32, for files larger than 512 MB 996*ab9e68a2SToomas Soome * and uLong implemented on 32 bits. 997*ab9e68a2SToomas Soome */ 998*ab9e68a2SToomas Soome init_block(s); 999*ab9e68a2SToomas Soome 1000*ab9e68a2SToomas Soome if (last) { 1001*ab9e68a2SToomas Soome bi_windup(s); 1002*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 1003*ab9e68a2SToomas Soome s->compressed_len += 7; /* align on byte boundary */ 1004*ab9e68a2SToomas Soome #endif 1005*ab9e68a2SToomas Soome } 1006*ab9e68a2SToomas Soome Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, 1007*ab9e68a2SToomas Soome s->compressed_len-7*last)); 1008*ab9e68a2SToomas Soome } 1009*ab9e68a2SToomas Soome 1010*ab9e68a2SToomas Soome /* =========================================================================== 1011*ab9e68a2SToomas Soome * Save the match info and tally the frequency counts. Return true if 1012*ab9e68a2SToomas Soome * the current block must be flushed. 1013*ab9e68a2SToomas Soome */ 1014*ab9e68a2SToomas Soome int ZLIB_INTERNAL _tr_tally (s, dist, lc) 1015*ab9e68a2SToomas Soome deflate_state *s; 1016*ab9e68a2SToomas Soome unsigned dist; /* distance of matched string */ 1017*ab9e68a2SToomas Soome unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ 1018*ab9e68a2SToomas Soome { 1019*ab9e68a2SToomas Soome s->d_buf[s->last_lit] = (ush)dist; 1020*ab9e68a2SToomas Soome s->l_buf[s->last_lit++] = (uch)lc; 1021*ab9e68a2SToomas Soome if (dist == 0) { 1022*ab9e68a2SToomas Soome /* lc is the unmatched char */ 1023*ab9e68a2SToomas Soome s->dyn_ltree[lc].Freq++; 1024*ab9e68a2SToomas Soome } else { 1025*ab9e68a2SToomas Soome s->matches++; 1026*ab9e68a2SToomas Soome /* Here, lc is the match length - MIN_MATCH */ 1027*ab9e68a2SToomas Soome dist--; /* dist = match distance - 1 */ 1028*ab9e68a2SToomas Soome Assert((ush)dist < (ush)MAX_DIST(s) && 1029*ab9e68a2SToomas Soome (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && 1030*ab9e68a2SToomas Soome (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); 1031*ab9e68a2SToomas Soome 1032*ab9e68a2SToomas Soome s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; 1033*ab9e68a2SToomas Soome s->dyn_dtree[d_code(dist)].Freq++; 1034*ab9e68a2SToomas Soome } 1035*ab9e68a2SToomas Soome 1036*ab9e68a2SToomas Soome #ifdef TRUNCATE_BLOCK 1037*ab9e68a2SToomas Soome /* Try to guess if it is profitable to stop the current block here */ 1038*ab9e68a2SToomas Soome if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { 1039*ab9e68a2SToomas Soome /* Compute an upper bound for the compressed length */ 1040*ab9e68a2SToomas Soome ulg out_length = (ulg)s->last_lit*8L; 1041*ab9e68a2SToomas Soome ulg in_length = (ulg)((long)s->strstart - s->block_start); 1042*ab9e68a2SToomas Soome int dcode; 1043*ab9e68a2SToomas Soome for (dcode = 0; dcode < D_CODES; dcode++) { 1044*ab9e68a2SToomas Soome out_length += (ulg)s->dyn_dtree[dcode].Freq * 1045*ab9e68a2SToomas Soome (5L+extra_dbits[dcode]); 1046*ab9e68a2SToomas Soome } 1047*ab9e68a2SToomas Soome out_length >>= 3; 1048*ab9e68a2SToomas Soome Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", 1049*ab9e68a2SToomas Soome s->last_lit, in_length, out_length, 1050*ab9e68a2SToomas Soome 100L - out_length*100L/in_length)); 1051*ab9e68a2SToomas Soome if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; 1052*ab9e68a2SToomas Soome } 1053*ab9e68a2SToomas Soome #endif 1054*ab9e68a2SToomas Soome return (s->last_lit == s->lit_bufsize-1); 1055*ab9e68a2SToomas Soome /* We avoid equality with lit_bufsize because of wraparound at 64K 1056*ab9e68a2SToomas Soome * on 16 bit machines and because stored blocks are restricted to 1057*ab9e68a2SToomas Soome * 64K-1 bytes. 1058*ab9e68a2SToomas Soome */ 1059*ab9e68a2SToomas Soome } 1060*ab9e68a2SToomas Soome 1061*ab9e68a2SToomas Soome /* =========================================================================== 1062*ab9e68a2SToomas Soome * Send the block data compressed using the given Huffman trees 1063*ab9e68a2SToomas Soome */ 1064*ab9e68a2SToomas Soome local void compress_block(s, ltree, dtree) 1065*ab9e68a2SToomas Soome deflate_state *s; 1066*ab9e68a2SToomas Soome const ct_data *ltree; /* literal tree */ 1067*ab9e68a2SToomas Soome const ct_data *dtree; /* distance tree */ 1068*ab9e68a2SToomas Soome { 1069*ab9e68a2SToomas Soome unsigned dist; /* distance of matched string */ 1070*ab9e68a2SToomas Soome int lc; /* match length or unmatched char (if dist == 0) */ 1071*ab9e68a2SToomas Soome unsigned lx = 0; /* running index in l_buf */ 1072*ab9e68a2SToomas Soome unsigned code; /* the code to send */ 1073*ab9e68a2SToomas Soome int extra; /* number of extra bits to send */ 1074*ab9e68a2SToomas Soome 1075*ab9e68a2SToomas Soome if (s->last_lit != 0) do { 1076*ab9e68a2SToomas Soome dist = s->d_buf[lx]; 1077*ab9e68a2SToomas Soome lc = s->l_buf[lx++]; 1078*ab9e68a2SToomas Soome if (dist == 0) { 1079*ab9e68a2SToomas Soome send_code(s, lc, ltree); /* send a literal byte */ 1080*ab9e68a2SToomas Soome Tracecv(isgraph(lc), (stderr," '%c' ", lc)); 1081*ab9e68a2SToomas Soome } else { 1082*ab9e68a2SToomas Soome /* Here, lc is the match length - MIN_MATCH */ 1083*ab9e68a2SToomas Soome code = _length_code[lc]; 1084*ab9e68a2SToomas Soome send_code(s, code+LITERALS+1, ltree); /* send the length code */ 1085*ab9e68a2SToomas Soome extra = extra_lbits[code]; 1086*ab9e68a2SToomas Soome if (extra != 0) { 1087*ab9e68a2SToomas Soome lc -= base_length[code]; 1088*ab9e68a2SToomas Soome send_bits(s, lc, extra); /* send the extra length bits */ 1089*ab9e68a2SToomas Soome } 1090*ab9e68a2SToomas Soome dist--; /* dist is now the match distance - 1 */ 1091*ab9e68a2SToomas Soome code = d_code(dist); 1092*ab9e68a2SToomas Soome Assert (code < D_CODES, "bad d_code"); 1093*ab9e68a2SToomas Soome 1094*ab9e68a2SToomas Soome send_code(s, code, dtree); /* send the distance code */ 1095*ab9e68a2SToomas Soome extra = extra_dbits[code]; 1096*ab9e68a2SToomas Soome if (extra != 0) { 1097*ab9e68a2SToomas Soome dist -= (unsigned)base_dist[code]; 1098*ab9e68a2SToomas Soome send_bits(s, dist, extra); /* send the extra distance bits */ 1099*ab9e68a2SToomas Soome } 1100*ab9e68a2SToomas Soome } /* literal or match pair ? */ 1101*ab9e68a2SToomas Soome 1102*ab9e68a2SToomas Soome /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ 1103*ab9e68a2SToomas Soome Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, 1104*ab9e68a2SToomas Soome "pendingBuf overflow"); 1105*ab9e68a2SToomas Soome 1106*ab9e68a2SToomas Soome } while (lx < s->last_lit); 1107*ab9e68a2SToomas Soome 1108*ab9e68a2SToomas Soome send_code(s, END_BLOCK, ltree); 1109*ab9e68a2SToomas Soome } 1110*ab9e68a2SToomas Soome 1111*ab9e68a2SToomas Soome /* =========================================================================== 1112*ab9e68a2SToomas Soome * Check if the data type is TEXT or BINARY, using the following algorithm: 1113*ab9e68a2SToomas Soome * - TEXT if the two conditions below are satisfied: 1114*ab9e68a2SToomas Soome * a) There are no non-portable control characters belonging to the 1115*ab9e68a2SToomas Soome * "black list" (0..6, 14..25, 28..31). 1116*ab9e68a2SToomas Soome * b) There is at least one printable character belonging to the 1117*ab9e68a2SToomas Soome * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). 1118*ab9e68a2SToomas Soome * - BINARY otherwise. 1119*ab9e68a2SToomas Soome * - The following partially-portable control characters form a 1120*ab9e68a2SToomas Soome * "gray list" that is ignored in this detection algorithm: 1121*ab9e68a2SToomas Soome * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). 1122*ab9e68a2SToomas Soome * IN assertion: the fields Freq of dyn_ltree are set. 1123*ab9e68a2SToomas Soome */ 1124*ab9e68a2SToomas Soome local int detect_data_type(s) 1125*ab9e68a2SToomas Soome deflate_state *s; 1126*ab9e68a2SToomas Soome { 1127*ab9e68a2SToomas Soome /* black_mask is the bit mask of black-listed bytes 1128*ab9e68a2SToomas Soome * set bits 0..6, 14..25, and 28..31 1129*ab9e68a2SToomas Soome * 0xf3ffc07f = binary 11110011111111111100000001111111 1130*ab9e68a2SToomas Soome */ 1131*ab9e68a2SToomas Soome unsigned long black_mask = 0xf3ffc07fUL; 1132*ab9e68a2SToomas Soome int n; 1133*ab9e68a2SToomas Soome 1134*ab9e68a2SToomas Soome /* Check for non-textual ("black-listed") bytes. */ 1135*ab9e68a2SToomas Soome for (n = 0; n <= 31; n++, black_mask >>= 1) 1136*ab9e68a2SToomas Soome if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) 1137*ab9e68a2SToomas Soome return Z_BINARY; 1138*ab9e68a2SToomas Soome 1139*ab9e68a2SToomas Soome /* Check for textual ("white-listed") bytes. */ 1140*ab9e68a2SToomas Soome if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 1141*ab9e68a2SToomas Soome || s->dyn_ltree[13].Freq != 0) 1142*ab9e68a2SToomas Soome return Z_TEXT; 1143*ab9e68a2SToomas Soome for (n = 32; n < LITERALS; n++) 1144*ab9e68a2SToomas Soome if (s->dyn_ltree[n].Freq != 0) 1145*ab9e68a2SToomas Soome return Z_TEXT; 1146*ab9e68a2SToomas Soome 1147*ab9e68a2SToomas Soome /* There are no "black-listed" or "white-listed" bytes: 1148*ab9e68a2SToomas Soome * this stream either is empty or has tolerated ("gray-listed") bytes only. 1149*ab9e68a2SToomas Soome */ 1150*ab9e68a2SToomas Soome return Z_BINARY; 1151*ab9e68a2SToomas Soome } 1152*ab9e68a2SToomas Soome 1153*ab9e68a2SToomas Soome /* =========================================================================== 1154*ab9e68a2SToomas Soome * Reverse the first len bits of a code, using straightforward code (a faster 1155*ab9e68a2SToomas Soome * method would use a table) 1156*ab9e68a2SToomas Soome * IN assertion: 1 <= len <= 15 1157*ab9e68a2SToomas Soome */ 1158*ab9e68a2SToomas Soome local unsigned bi_reverse(code, len) 1159*ab9e68a2SToomas Soome unsigned code; /* the value to invert */ 1160*ab9e68a2SToomas Soome int len; /* its bit length */ 1161*ab9e68a2SToomas Soome { 1162*ab9e68a2SToomas Soome register unsigned res = 0; 1163*ab9e68a2SToomas Soome do { 1164*ab9e68a2SToomas Soome res |= code & 1; 1165*ab9e68a2SToomas Soome code >>= 1, res <<= 1; 1166*ab9e68a2SToomas Soome } while (--len > 0); 1167*ab9e68a2SToomas Soome return res >> 1; 1168*ab9e68a2SToomas Soome } 1169*ab9e68a2SToomas Soome 1170*ab9e68a2SToomas Soome /* =========================================================================== 1171*ab9e68a2SToomas Soome * Flush the bit buffer, keeping at most 7 bits in it. 1172*ab9e68a2SToomas Soome */ 1173*ab9e68a2SToomas Soome local void bi_flush(s) 1174*ab9e68a2SToomas Soome deflate_state *s; 1175*ab9e68a2SToomas Soome { 1176*ab9e68a2SToomas Soome if (s->bi_valid == 16) { 1177*ab9e68a2SToomas Soome put_short(s, s->bi_buf); 1178*ab9e68a2SToomas Soome s->bi_buf = 0; 1179*ab9e68a2SToomas Soome s->bi_valid = 0; 1180*ab9e68a2SToomas Soome } else if (s->bi_valid >= 8) { 1181*ab9e68a2SToomas Soome put_byte(s, (Byte)s->bi_buf); 1182*ab9e68a2SToomas Soome s->bi_buf >>= 8; 1183*ab9e68a2SToomas Soome s->bi_valid -= 8; 1184*ab9e68a2SToomas Soome } 1185*ab9e68a2SToomas Soome } 1186*ab9e68a2SToomas Soome 1187*ab9e68a2SToomas Soome /* =========================================================================== 1188*ab9e68a2SToomas Soome * Flush the bit buffer and align the output on a byte boundary 1189*ab9e68a2SToomas Soome */ 1190*ab9e68a2SToomas Soome local void bi_windup(s) 1191*ab9e68a2SToomas Soome deflate_state *s; 1192*ab9e68a2SToomas Soome { 1193*ab9e68a2SToomas Soome if (s->bi_valid > 8) { 1194*ab9e68a2SToomas Soome put_short(s, s->bi_buf); 1195*ab9e68a2SToomas Soome } else if (s->bi_valid > 0) { 1196*ab9e68a2SToomas Soome put_byte(s, (Byte)s->bi_buf); 1197*ab9e68a2SToomas Soome } 1198*ab9e68a2SToomas Soome s->bi_buf = 0; 1199*ab9e68a2SToomas Soome s->bi_valid = 0; 1200*ab9e68a2SToomas Soome #ifdef ZLIB_DEBUG 1201*ab9e68a2SToomas Soome s->bits_sent = (s->bits_sent+7) & ~7; 1202*ab9e68a2SToomas Soome #endif 1203*ab9e68a2SToomas Soome } 1204