annotate src/zlib-1.2.8/trees.c @ 83:ae30d91d2ffe

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