0000: 2f 2a 20 74 72 65 65 73 2e 63 20 2d 2d 20 6f 75 /* trees.c -- ou
0010: 74 70 75 74 20 64 65 66 6c 61 74 65 64 20 64 61 tput deflated da
0020: 74 61 20 75 73 69 6e 67 20 48 75 66 66 6d 61 6e ta using Huffman
0030: 20 63 6f 64 69 6e 67 0a 20 2a 20 43 6f 70 79 72 coding. * Copyr
0040: 69 67 68 74 20 28 43 29 20 31 39 39 35 2d 31 39 ight (C) 1995-19
0050: 39 38 20 4a 65 61 6e 2d 6c 6f 75 70 20 47 61 69 98 Jean-loup Gai
0060: 6c 6c 79 0a 20 2a 20 46 6f 72 20 63 6f 6e 64 69 lly. * For condi
0070: 74 69 6f 6e 73 20 6f 66 20 64 69 73 74 72 69 62 tions of distrib
0080: 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 2c 20 73 ution and use, s
0090: 65 65 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74 ee copyright not
00a0: 69 63 65 20 69 6e 20 7a 6c 69 62 2e 68 20 0a 20 ice in zlib.h .
00b0: 2a 2f 0a 0a 2f 2a 0a 20 2a 20 20 41 4c 47 4f 52 */../*. * ALGOR
00c0: 49 54 48 4d 0a 20 2a 0a 20 2a 20 20 20 20 20 20 ITHM. *. *
00d0: 54 68 65 20 22 64 65 66 6c 61 74 69 6f 6e 22 20 The "deflation"
00e0: 70 72 6f 63 65 73 73 20 75 73 65 73 20 73 65 76 process uses sev
00f0: 65 72 61 6c 20 48 75 66 66 6d 61 6e 20 74 72 65 eral Huffman tre
0100: 65 73 2e 20 54 68 65 20 6d 6f 72 65 0a 20 2a 20 es. The more. *
0110: 20 20 20 20 20 63 6f 6d 6d 6f 6e 20 73 6f 75 72 common sour
0120: 63 65 20 76 61 6c 75 65 73 20 61 72 65 20 72 65 ce values are re
0130: 70 72 65 73 65 6e 74 65 64 20 62 79 20 73 68 6f presented by sho
0140: 72 74 65 72 20 62 69 74 20 73 65 71 75 65 6e 63 rter bit sequenc
0150: 65 73 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 20 45 es.. *. * E
0160: 61 63 68 20 63 6f 64 65 20 74 72 65 65 20 69 73 ach code tree is
0170: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 6f 6d stored in a com
0180: 70 72 65 73 73 65 64 20 66 6f 72 6d 20 77 68 69 pressed form whi
0190: 63 68 20 69 73 20 69 74 73 65 6c 66 0a 20 2a 20 ch is itself. *
01a0: 61 20 48 75 66 66 6d 61 6e 20 65 6e 63 6f 64 69 a Huffman encodi
01b0: 6e 67 20 6f 66 20 74 68 65 20 6c 65 6e 67 74 68 ng of the length
01c0: 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 6f 64 s of all the cod
01d0: 65 20 73 74 72 69 6e 67 73 20 28 69 6e 0a 20 2a e strings (in. *
01e0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 ascending order
01f0: 20 62 79 20 73 6f 75 72 63 65 20 76 61 6c 75 65 by source value
0200: 73 29 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 s). The actual
0210: 63 6f 64 65 20 73 74 72 69 6e 67 73 20 61 72 65 code strings are
0220: 0a 20 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 65 . * reconstructe
0230: 64 20 66 72 6f 6d 20 74 68 65 20 6c 65 6e 67 74 d from the lengt
0240: 68 73 20 69 6e 20 74 68 65 20 69 6e 66 6c 61 74 hs in the inflat
0250: 65 20 70 72 6f 63 65 73 73 2c 20 61 73 20 64 65 e process, as de
0260: 73 63 72 69 62 65 64 0a 20 2a 20 69 6e 20 74 68 scribed. * in th
0270: 65 20 64 65 66 6c 61 74 65 20 73 70 65 63 69 66 e deflate specif
0280: 69 63 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 20 ication.. *. *
0290: 52 45 46 45 52 45 4e 43 45 53 0a 20 2a 0a 20 2a REFERENCES. *. *
02a0: 20 20 20 20 20 20 44 65 75 74 73 63 68 2c 20 4c Deutsch, L
02b0: 2e 50 2e 2c 22 27 44 65 66 6c 61 74 65 27 20 43 .P.,"'Deflate' C
02c0: 6f 6d 70 72 65 73 73 65 64 20 44 61 74 61 20 46 ompressed Data F
02d0: 6f 72 6d 61 74 20 53 70 65 63 69 66 69 63 61 74 ormat Specificat
02e0: 69 6f 6e 22 2e 0a 20 2a 20 20 20 20 20 20 41 76 ion".. * Av
02f0: 61 69 6c 61 62 6c 65 20 69 6e 20 66 74 70 2e 75 ailable in ftp.u
0300: 75 2e 6e 65 74 3a 2f 70 75 62 2f 61 72 63 68 69 u.net:/pub/archi
0310: 76 69 6e 67 2f 7a 69 70 2f 64 6f 63 2f 64 65 66 ving/zip/doc/def
0320: 6c 61 74 65 2d 31 2e 31 2e 64 6f 63 0a 20 2a 0a late-1.1.doc. *.
0330: 20 2a 20 20 20 20 20 20 53 74 6f 72 65 72 2c 20 * Storer,
0340: 4a 61 6d 65 73 20 41 2e 0a 20 2a 20 20 20 20 20 James A.. *
0350: 20 20 20 20 20 44 61 74 61 20 43 6f 6d 70 72 65 Data Compre
0360: 73 73 69 6f 6e 3a 20 20 4d 65 74 68 6f 64 73 20 ssion: Methods
0370: 61 6e 64 20 54 68 65 6f 72 79 2c 20 70 70 2e 20 and Theory, pp.
0380: 34 39 2d 35 30 2e 0a 20 2a 20 20 20 20 20 20 20 49-50.. *
0390: 20 20 20 43 6f 6d 70 75 74 65 72 20 53 63 69 65 Computer Scie
03a0: 6e 63 65 20 50 72 65 73 73 2c 20 31 39 38 38 2e nce Press, 1988.
03b0: 20 20 49 53 42 4e 20 30 2d 37 31 36 37 2d 38 31 ISBN 0-7167-81
03c0: 35 36 2d 35 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 56-5.. *. *
03d0: 20 53 65 64 67 65 77 69 63 6b 2c 20 52 2e 0a 20 Sedgewick, R..
03e0: 2a 20 20 20 20 20 20 20 20 20 20 41 6c 67 6f 72 * Algor
03f0: 69 74 68 6d 73 2c 20 70 32 39 30 2e 0a 20 2a 20 ithms, p290.. *
0400: 20 20 20 20 20 20 20 20 20 41 64 64 69 73 6f 6e Addison
0410: 2d 57 65 73 6c 65 79 2c 20 31 39 38 33 2e 20 49 -Wesley, 1983. I
0420: 53 42 4e 20 30 2d 32 30 31 2d 30 36 36 37 32 2d SBN 0-201-06672-
0430: 36 2e 0a 20 2a 2f 0a 0a 2f 2a 20 40 28 23 29 20 6.. */../* @(#)
0440: 24 49 64 24 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 $Id$ */../* #def
0450: 69 6e 65 20 47 45 4e 5f 54 52 45 45 53 5f 48 20 ine GEN_TREES_H
0460: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 64 65 */..#include "de
0470: 66 6c 61 74 65 2e 68 22 0a 0a 23 69 66 64 65 66 flate.h"..#ifdef
0480: 20 44 45 42 55 47 0a 23 20 20 69 6e 63 6c 75 64 DEBUG.# includ
0490: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 65 6e 64 e <ctype.h>.#end
04a0: 69 66 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d if../* =========
04b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
04c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
04d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
04e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
04f0: 3d 3d 0a 20 2a 20 43 6f 6e 73 74 61 6e 74 73 0a ==. * Constants.
0500: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 */..#define MAX
0510: 5f 42 4c 5f 42 49 54 53 20 37 0a 2f 2a 20 42 69 _BL_BITS 7./* Bi
0520: 74 20 6c 65 6e 67 74 68 20 63 6f 64 65 73 20 6d t length codes m
0530: 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 4d ust not exceed M
0540: 41 58 5f 42 4c 5f 42 49 54 53 20 62 69 74 73 20 AX_BL_BITS bits
0550: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f */..#define END_
0560: 42 4c 4f 43 4b 20 32 35 36 0a 2f 2a 20 65 6e 64 BLOCK 256./* end
0570: 20 6f 66 20 62 6c 6f 63 6b 20 6c 69 74 65 72 61 of block litera
0580: 6c 20 63 6f 64 65 20 2a 2f 0a 0a 23 64 65 66 69 l code */..#defi
0590: 6e 65 20 52 45 50 5f 33 5f 36 20 20 20 20 20 20 ne REP_3_6
05a0: 31 36 0a 2f 2a 20 72 65 70 65 61 74 20 70 72 65 16./* repeat pre
05b0: 76 69 6f 75 73 20 62 69 74 20 6c 65 6e 67 74 68 vious bit length
05c0: 20 33 2d 36 20 74 69 6d 65 73 20 28 32 20 62 69 3-6 times (2 bi
05d0: 74 73 20 6f 66 20 72 65 70 65 61 74 20 63 6f 75 ts of repeat cou
05e0: 6e 74 29 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 nt) */..#define
05f0: 52 45 50 5a 5f 33 5f 31 30 20 20 20 20 31 37 0a REPZ_3_10 17.
0600: 2f 2a 20 72 65 70 65 61 74 20 61 20 7a 65 72 6f /* repeat a zero
0610: 20 6c 65 6e 67 74 68 20 33 2d 31 30 20 74 69 6d length 3-10 tim
0620: 65 73 20 20 28 33 20 62 69 74 73 20 6f 66 20 72 es (3 bits of r
0630: 65 70 65 61 74 20 63 6f 75 6e 74 29 20 2a 2f 0a epeat count) */.
0640: 0a 23 64 65 66 69 6e 65 20 52 45 50 5a 5f 31 31 .#define REPZ_11
0650: 5f 31 33 38 20 20 31 38 0a 2f 2a 20 72 65 70 65 _138 18./* repe
0660: 61 74 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 at a zero length
0670: 20 31 31 2d 31 33 38 20 74 69 6d 65 73 20 20 28 11-138 times (
0680: 37 20 62 69 74 73 20 6f 66 20 72 65 70 65 61 74 7 bits of repeat
0690: 20 63 6f 75 6e 74 29 20 2a 2f 0a 0a 6c 6f 63 61 count) */..loca
06a0: 6c 20 63 6f 6e 73 74 20 69 6e 74 20 65 78 74 72 l const int extr
06b0: 61 5f 6c 62 69 74 73 5b 4c 45 4e 47 54 48 5f 43 a_lbits[LENGTH_C
06c0: 4f 44 45 53 5d 20 2f 2a 20 65 78 74 72 61 20 62 ODES] /* extra b
06d0: 69 74 73 20 66 6f 72 20 65 61 63 68 20 6c 65 6e its for each len
06e0: 67 74 68 20 63 6f 64 65 20 2a 2f 0a 20 20 20 3d gth code */. =
06f0: 20 7b 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c {0,0,0,0,0,0,0,
0700: 30 2c 31 2c 31 2c 31 2c 31 2c 32 2c 32 2c 32 2c 0,1,1,1,1,2,2,2,
0710: 32 2c 33 2c 33 2c 33 2c 33 2c 34 2c 34 2c 34 2c 2,3,3,3,3,4,4,4,
0720: 34 2c 35 2c 35 2c 35 2c 35 2c 30 7d 3b 0a 0a 6c 4,5,5,5,5,0};..l
0730: 6f 63 61 6c 20 63 6f 6e 73 74 20 69 6e 74 20 65 ocal const int e
0740: 78 74 72 61 5f 64 62 69 74 73 5b 44 5f 43 4f 44 xtra_dbits[D_COD
0750: 45 53 5d 20 2f 2a 20 65 78 74 72 61 20 62 69 74 ES] /* extra bit
0760: 73 20 66 6f 72 20 65 61 63 68 20 64 69 73 74 61 s for each dista
0770: 6e 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 20 3d nce code */. =
0780: 20 7b 30 2c 30 2c 30 2c 30 2c 31 2c 31 2c 32 2c {0,0,0,0,1,1,2,
0790: 32 2c 33 2c 33 2c 34 2c 34 2c 35 2c 35 2c 36 2c 2,3,3,4,4,5,5,6,
07a0: 36 2c 37 2c 37 2c 38 2c 38 2c 39 2c 39 2c 31 30 6,7,7,8,8,9,9,10
07b0: 2c 31 30 2c 31 31 2c 31 31 2c 31 32 2c 31 32 2c ,10,11,11,12,12,
07c0: 31 33 2c 31 33 7d 3b 0a 0a 6c 6f 63 61 6c 20 63 13,13};..local c
07d0: 6f 6e 73 74 20 69 6e 74 20 65 78 74 72 61 5f 62 onst int extra_b
07e0: 6c 62 69 74 73 5b 42 4c 5f 43 4f 44 45 53 5d 2f lbits[BL_CODES]/
07f0: 2a 20 65 78 74 72 61 20 62 69 74 73 20 66 6f 72 * extra bits for
0800: 20 65 61 63 68 20 62 69 74 20 6c 65 6e 67 74 68 each bit length
0810: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 3d 20 7b 30 code */. = {0
0820: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 ,0,0,0,0,0,0,0,0
0830: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 32 ,0,0,0,0,0,0,0,2
0840: 2c 33 2c 37 7d 3b 0a 0a 6c 6f 63 61 6c 20 63 6f ,3,7};..local co
0850: 6e 73 74 20 75 63 68 20 62 6c 5f 6f 72 64 65 72 nst uch bl_order
0860: 5b 42 4c 5f 43 4f 44 45 53 5d 0a 20 20 20 3d 20 [BL_CODES]. =
0870: 7b 31 36 2c 31 37 2c 31 38 2c 30 2c 38 2c 37 2c {16,17,18,0,8,7,
0880: 39 2c 36 2c 31 30 2c 35 2c 31 31 2c 34 2c 31 32 9,6,10,5,11,4,12
0890: 2c 33 2c 31 33 2c 32 2c 31 34 2c 31 2c 31 35 7d ,3,13,2,14,1,15}
08a0: 3b 0a 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 73 ;./* The lengths
08b0: 20 6f 66 20 74 68 65 20 62 69 74 20 6c 65 6e 67 of the bit leng
08c0: 74 68 20 63 6f 64 65 73 20 61 72 65 20 73 65 6e th codes are sen
08d0: 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 64 65 t in order of de
08e0: 63 72 65 61 73 69 6e 67 0a 20 2a 20 70 72 6f 62 creasing. * prob
08f0: 61 62 69 6c 69 74 79 2c 20 74 6f 20 61 76 6f 69 ability, to avoi
0900: 64 20 74 72 61 6e 73 6d 69 74 74 69 6e 67 20 74 d transmitting t
0910: 68 65 20 6c 65 6e 67 74 68 73 20 66 6f 72 20 75 he lengths for u
0920: 6e 75 73 65 64 20 62 69 74 20 6c 65 6e 67 74 68 nused bit length
0930: 20 63 6f 64 65 73 2e 0a 20 2a 2f 0a 0a 23 64 65 codes.. */..#de
0940: 66 69 6e 65 20 42 75 66 5f 73 69 7a 65 20 28 38 fine Buf_size (8
0950: 20 2a 20 32 2a 73 69 7a 65 6f 66 28 63 68 61 72 * 2*sizeof(char
0960: 29 29 0a 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 ))./* Number of
0970: 62 69 74 73 20 75 73 65 64 20 77 69 74 68 69 6e bits used within
0980: 20 62 69 5f 62 75 66 2e 20 28 62 69 5f 62 75 66 bi_buf. (bi_buf
0990: 20 6d 69 67 68 74 20 62 65 20 69 6d 70 6c 65 6d might be implem
09a0: 65 6e 74 65 64 20 6f 6e 0a 20 2a 20 6d 6f 72 65 ented on. * more
09b0: 20 74 68 61 6e 20 31 36 20 62 69 74 73 20 6f 6e than 16 bits on
09c0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 29 0a some systems.).
09d0: 20 2a 2f 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d */../* ========
09e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
09f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0a20: 3d 3d 3d 0a 20 2a 20 4c 6f 63 61 6c 20 64 61 74 ===. * Local dat
0a30: 61 2e 20 54 68 65 73 65 20 61 72 65 20 69 6e 69 a. These are ini
0a40: 74 69 61 6c 69 7a 65 64 20 6f 6e 6c 79 20 6f 6e tialized only on
0a50: 63 65 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 ce.. */..#define
0a60: 20 44 49 53 54 5f 43 4f 44 45 5f 4c 45 4e 20 20 DIST_CODE_LEN
0a70: 35 31 32 20 2f 2a 20 73 65 65 20 64 65 66 69 6e 512 /* see defin
0a80: 69 74 69 6f 6e 20 6f 66 20 61 72 72 61 79 20 64 ition of array d
0a90: 69 73 74 5f 63 6f 64 65 20 62 65 6c 6f 77 20 2a ist_code below *
0aa0: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 47 /..#if defined(G
0ab0: 45 4e 5f 54 52 45 45 53 5f 48 29 20 7c 7c 20 21 EN_TREES_H) || !
0ac0: 64 65 66 69 6e 65 64 28 53 54 44 43 29 0a 2f 2a defined(STDC)./*
0ad0: 20 6e 6f 6e 20 41 4e 53 49 20 63 6f 6d 70 69 6c non ANSI compil
0ae0: 65 72 73 20 6d 61 79 20 6e 6f 74 20 61 63 63 65 ers may not acce
0af0: 70 74 20 74 72 65 65 73 2e 68 20 2a 2f 0a 0a 6c pt trees.h */..l
0b00: 6f 63 61 6c 20 63 74 5f 64 61 74 61 20 73 74 61 ocal ct_data sta
0b10: 74 69 63 5f 6c 74 72 65 65 5b 4c 5f 43 4f 44 45 tic_ltree[L_CODE
0b20: 53 2b 32 5d 3b 0a 2f 2a 20 54 68 65 20 73 74 61 S+2];./* The sta
0b30: 74 69 63 20 6c 69 74 65 72 61 6c 20 74 72 65 65 tic literal tree
0b40: 2e 20 53 69 6e 63 65 20 74 68 65 20 62 69 74 20 . Since the bit
0b50: 6c 65 6e 67 74 68 73 20 61 72 65 20 69 6d 70 6f lengths are impo
0b60: 73 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f sed, there is no
0b70: 0a 20 2a 20 6e 65 65 64 20 66 6f 72 20 74 68 65 . * need for the
0b80: 20 4c 5f 43 4f 44 45 53 20 65 78 74 72 61 20 63 L_CODES extra c
0b90: 6f 64 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 odes used during
0ba0: 20 68 65 61 70 20 63 6f 6e 73 74 72 75 63 74 69 heap constructi
0bb0: 6f 6e 2e 20 48 6f 77 65 76 65 72 0a 20 2a 20 54 on. However. * T
0bc0: 68 65 20 63 6f 64 65 73 20 32 38 36 20 61 6e 64 he codes 286 and
0bd0: 20 32 38 37 20 61 72 65 20 6e 65 65 64 65 64 20 287 are needed
0be0: 74 6f 20 62 75 69 6c 64 20 61 20 63 61 6e 6f 6e to build a canon
0bf0: 69 63 61 6c 20 74 72 65 65 20 28 73 65 65 20 5f ical tree (see _
0c00: 74 72 5f 69 6e 69 74 0a 20 2a 20 62 65 6c 6f 77 tr_init. * below
0c10: 29 2e 0a 20 2a 2f 0a 0a 6c 6f 63 61 6c 20 63 74 ).. */..local ct
0c20: 5f 64 61 74 61 20 73 74 61 74 69 63 5f 64 74 72 _data static_dtr
0c30: 65 65 5b 44 5f 43 4f 44 45 53 5d 3b 0a 2f 2a 20 ee[D_CODES];./*
0c40: 54 68 65 20 73 74 61 74 69 63 20 64 69 73 74 61 The static dista
0c50: 6e 63 65 20 74 72 65 65 2e 20 28 41 63 74 75 61 nce tree. (Actua
0c60: 6c 6c 79 20 61 20 74 72 69 76 69 61 6c 20 74 72 lly a trivial tr
0c70: 65 65 20 73 69 6e 63 65 20 61 6c 6c 20 63 6f 64 ee since all cod
0c80: 65 73 20 75 73 65 0a 20 2a 20 35 20 62 69 74 73 es use. * 5 bits
0c90: 2e 29 0a 20 2a 2f 0a 0a 75 63 68 20 5f 64 69 73 .). */..uch _dis
0ca0: 74 5f 63 6f 64 65 5b 44 49 53 54 5f 43 4f 44 45 t_code[DIST_CODE
0cb0: 5f 4c 45 4e 5d 3b 0a 2f 2a 20 44 69 73 74 61 6e _LEN];./* Distan
0cc0: 63 65 20 63 6f 64 65 73 2e 20 54 68 65 20 66 69 ce codes. The fi
0cd0: 72 73 74 20 32 35 36 20 76 61 6c 75 65 73 20 63 rst 256 values c
0ce0: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 orrespond to the
0cf0: 20 64 69 73 74 61 6e 63 65 73 0a 20 2a 20 33 20 distances. * 3
0d00: 2e 2e 20 32 35 38 2c 20 74 68 65 20 6c 61 73 74 .. 258, the last
0d10: 20 32 35 36 20 76 61 6c 75 65 73 20 63 6f 72 72 256 values corr
0d20: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 74 6f espond to the to
0d30: 70 20 38 20 62 69 74 73 20 6f 66 0a 20 2a 20 74 p 8 bits of. * t
0d40: 68 65 20 31 35 20 62 69 74 20 64 69 73 74 61 6e he 15 bit distan
0d50: 63 65 73 2e 0a 20 2a 2f 0a 0a 75 63 68 20 5f 6c ces.. */..uch _l
0d60: 65 6e 67 74 68 5f 63 6f 64 65 5b 4d 41 58 5f 4d ength_code[MAX_M
0d70: 41 54 43 48 2d 4d 49 4e 5f 4d 41 54 43 48 2b 31 ATCH-MIN_MATCH+1
0d80: 5d 3b 0a 2f 2a 20 6c 65 6e 67 74 68 20 63 6f 64 ];./* length cod
0d90: 65 20 66 6f 72 20 65 61 63 68 20 6e 6f 72 6d 61 e for each norma
0da0: 6c 69 7a 65 64 20 6d 61 74 63 68 20 6c 65 6e 67 lized match leng
0db0: 74 68 20 28 30 20 3d 3d 20 4d 49 4e 5f 4d 41 54 th (0 == MIN_MAT
0dc0: 43 48 29 20 2a 2f 0a 0a 6c 6f 63 61 6c 20 69 6e CH) */..local in
0dd0: 74 20 62 61 73 65 5f 6c 65 6e 67 74 68 5b 4c 45 t base_length[LE
0de0: 4e 47 54 48 5f 43 4f 44 45 53 5d 3b 0a 2f 2a 20 NGTH_CODES];./*
0df0: 46 69 72 73 74 20 6e 6f 72 6d 61 6c 69 7a 65 64 First normalized
0e00: 20 6c 65 6e 67 74 68 20 66 6f 72 20 65 61 63 68 length for each
0e10: 20 63 6f 64 65 20 28 30 20 3d 20 4d 49 4e 5f 4d code (0 = MIN_M
0e20: 41 54 43 48 29 20 2a 2f 0a 0a 6c 6f 63 61 6c 20 ATCH) */..local
0e30: 69 6e 74 20 62 61 73 65 5f 64 69 73 74 5b 44 5f int base_dist[D_
0e40: 43 4f 44 45 53 5d 3b 0a 2f 2a 20 46 69 72 73 74 CODES];./* First
0e50: 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 64 69 73 74 normalized dist
0e60: 61 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f ance for each co
0e70: 64 65 20 28 30 20 3d 20 64 69 73 74 61 6e 63 65 de (0 = distance
0e80: 20 6f 66 20 31 29 20 2a 2f 0a 0a 23 65 6c 73 65 of 1) */..#else
0e90: 0a 23 20 20 69 6e 63 6c 75 64 65 20 22 74 72 65 .# include "tre
0ea0: 65 73 2e 68 22 0a 23 65 6e 64 69 66 20 2f 2a 20 es.h".#endif /*
0eb0: 47 45 4e 5f 54 52 45 45 53 5f 48 20 2a 2f 0a 0a GEN_TREES_H */..
0ec0: 73 74 72 75 63 74 20 73 74 61 74 69 63 5f 74 72 struct static_tr
0ed0: 65 65 5f 64 65 73 63 5f 73 20 7b 0a 20 20 20 20 ee_desc_s {.
0ee0: 63 6f 6e 73 74 20 63 74 5f 64 61 74 61 20 2a 73 const ct_data *s
0ef0: 74 61 74 69 63 5f 74 72 65 65 3b 20 20 2f 2a 20 tatic_tree; /*
0f00: 73 74 61 74 69 63 20 74 72 65 65 20 6f 72 20 4e static tree or N
0f10: 55 4c 4c 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ULL */. const
0f20: 20 69 6e 74 66 20 2a 65 78 74 72 61 5f 62 69 74 intf *extra_bit
0f30: 73 3b 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 s; /* extra
0f40: 20 62 69 74 73 20 66 6f 72 20 65 61 63 68 20 63 bits for each c
0f50: 6f 64 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 ode or NULL */.
0f60: 20 20 20 69 6e 74 20 20 20 20 20 65 78 74 72 61 int extra
0f70: 5f 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 _base;
0f80: 2f 2a 20 62 61 73 65 20 69 6e 64 65 78 20 66 6f /* base index fo
0f90: 72 20 65 78 74 72 61 5f 62 69 74 73 20 2a 2f 0a r extra_bits */.
0fa0: 20 20 20 20 69 6e 74 20 20 20 20 20 65 6c 65 6d int elem
0fb0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s;
0fc0: 20 2f 2a 20 6d 61 78 20 6e 75 6d 62 65 72 20 6f /* max number o
0fd0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 f elements in th
0fe0: 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 69 6e e tree */. in
0ff0: 74 20 20 20 20 20 6d 61 78 5f 6c 65 6e 67 74 68 t max_length
1000: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 ; /* ma
1010: 78 20 62 69 74 20 6c 65 6e 67 74 68 20 66 6f 72 x bit length for
1020: 20 74 68 65 20 63 6f 64 65 73 20 2a 2f 0a 7d 3b the codes */.};
1030: 0a 0a 6c 6f 63 61 6c 20 73 74 61 74 69 63 5f 74 ..local static_t
1040: 72 65 65 5f 64 65 73 63 20 20 73 74 61 74 69 63 ree_desc static
1050: 5f 6c 5f 64 65 73 63 20 3d 0a 7b 73 74 61 74 69 _l_desc =.{stati
1060: 63 5f 6c 74 72 65 65 2c 20 65 78 74 72 61 5f 6c c_ltree, extra_l
1070: 62 69 74 73 2c 20 4c 49 54 45 52 41 4c 53 2b 31 bits, LITERALS+1
1080: 2c 20 4c 5f 43 4f 44 45 53 2c 20 4d 41 58 5f 42 , L_CODES, MAX_B
1090: 49 54 53 7d 3b 0a 0a 6c 6f 63 61 6c 20 73 74 61 ITS};..local sta
10a0: 74 69 63 5f 74 72 65 65 5f 64 65 73 63 20 20 73 tic_tree_desc s
10b0: 74 61 74 69 63 5f 64 5f 64 65 73 63 20 3d 0a 7b tatic_d_desc =.{
10c0: 73 74 61 74 69 63 5f 64 74 72 65 65 2c 20 65 78 static_dtree, ex
10d0: 74 72 61 5f 64 62 69 74 73 2c 20 30 2c 20 20 20 tra_dbits, 0,
10e0: 20 20 20 20 20 20 20 44 5f 43 4f 44 45 53 2c 20 D_CODES,
10f0: 4d 41 58 5f 42 49 54 53 7d 3b 0a 0a 6c 6f 63 61 MAX_BITS};..loca
1100: 6c 20 73 74 61 74 69 63 5f 74 72 65 65 5f 64 65 l static_tree_de
1110: 73 63 20 20 73 74 61 74 69 63 5f 62 6c 5f 64 65 sc static_bl_de
1120: 73 63 20 3d 0a 7b 28 63 6f 6e 73 74 20 63 74 5f sc =.{(const ct_
1130: 64 61 74 61 20 2a 29 30 2c 20 65 78 74 72 61 5f data *)0, extra_
1140: 62 6c 62 69 74 73 2c 20 30 2c 20 20 20 42 4c 5f blbits, 0, BL_
1150: 43 4f 44 45 53 2c 20 4d 41 58 5f 42 4c 5f 42 49 CODES, MAX_BL_BI
1160: 54 53 7d 3b 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d TS};../* =======
1170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
11a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
11b0: 3d 3d 3d 3d 0a 20 2a 20 4c 6f 63 61 6c 20 28 73 ====. * Local (s
11c0: 74 61 74 69 63 29 20 72 6f 75 74 69 6e 65 73 20 tatic) routines
11d0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 20 2a in this file.. *
11e0: 2f 0a 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 74 72 /..local void tr
11f0: 5f 73 74 61 74 69 63 5f 69 6e 69 74 20 4f 46 28 _static_init OF(
1200: 28 76 6f 69 64 29 29 3b 0a 6c 6f 63 61 6c 20 76 (void));.local v
1210: 6f 69 64 20 69 6e 69 74 5f 62 6c 6f 63 6b 20 20 oid init_block
1220: 20 20 20 4f 46 28 28 64 65 66 6c 61 74 65 5f 73 OF((deflate_s
1230: 74 61 74 65 20 2a 73 29 29 3b 0a 6c 6f 63 61 6c tate *s));.local
1240: 20 76 6f 69 64 20 70 71 64 6f 77 6e 68 65 61 70 void pqdownheap
1250: 20 20 20 20 20 4f 46 28 28 64 65 66 6c 61 74 65 OF((deflate
1260: 5f 73 74 61 74 65 20 2a 73 2c 20 63 74 5f 64 61 _state *s, ct_da
1270: 74 61 20 2a 74 72 65 65 2c 20 69 6e 74 20 6b 29 ta *tree, int k)
1280: 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 67 65 );.local void ge
1290: 6e 5f 62 69 74 6c 65 6e 20 20 20 20 20 4f 46 28 n_bitlen OF(
12a0: 28 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 2a (deflate_state *
12b0: 73 2c 20 74 72 65 65 5f 64 65 73 63 20 2a 64 65 s, tree_desc *de
12c0: 73 63 29 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 sc));.local void
12d0: 20 67 65 6e 5f 63 6f 64 65 73 20 20 20 20 20 20 gen_codes
12e0: 4f 46 28 28 63 74 5f 64 61 74 61 20 2a 74 72 65 OF((ct_data *tre
12f0: 65 2c 20 69 6e 74 20 6d 61 78 5f 63 6f 64 65 2c e, int max_code,
1300: 20 75 73 68 66 20 2a 62 6c 5f 63 6f 75 6e 74 29 ushf *bl_count)
1310: 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 62 75 );.local void bu
1320: 69 6c 64 5f 74 72 65 65 20 20 20 20 20 4f 46 28 ild_tree OF(
1330: 28 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 2a (deflate_state *
1340: 73 2c 20 74 72 65 65 5f 64 65 73 63 20 2a 64 65 s, tree_desc *de
1350: 73 63 29 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 sc));.local void
1360: 20 73 63 61 6e 5f 74 72 65 65 20 20 20 20 20 20 scan_tree
1370: 4f 46 28 28 64 65 66 6c 61 74 65 5f 73 74 61 74 OF((deflate_stat
1380: 65 20 2a 73 2c 20 63 74 5f 64 61 74 61 20 2a 74 e *s, ct_data *t
1390: 72 65 65 2c 20 69 6e 74 20 6d 61 78 5f 63 6f 64 ree, int max_cod
13a0: 65 29 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 e));.local void
13b0: 73 65 6e 64 5f 74 72 65 65 20 20 20 20 20 20 4f send_tree O
13c0: 46 28 28 64 65 66 6c 61 74 65 5f 73 74 61 74 65 F((deflate_state
13d0: 20 2a 73 2c 20 63 74 5f 64 61 74 61 20 2a 74 72 *s, ct_data *tr
13e0: 65 65 2c 20 69 6e 74 20 6d 61 78 5f 63 6f 64 65 ee, int max_code
13f0: 29 29 3b 0a 6c 6f 63 61 6c 20 69 6e 74 20 20 62 ));.local int b
1400: 75 69 6c 64 5f 62 6c 5f 74 72 65 65 20 20 4f 46 uild_bl_tree OF
1410: 28 28 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 ((deflate_state
1420: 2a 73 29 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69 64 *s));.local void
1430: 20 73 65 6e 64 5f 61 6c 6c 5f 74 72 65 65 73 20 send_all_trees
1440: 4f 46 28 28 64 65 66 6c 61 74 65 5f 73 74 61 74 OF((deflate_stat
1450: 65 20 2a 73 2c 20 69 6e 74 20 6c 63 6f 64 65 73 e *s, int lcodes
1460: 2c 20 69 6e 74 20 64 63 6f 64 65 73 2c 0a 20 20 , int dcodes,.
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1480: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 int
1490: 62 6c 63 6f 64 65 73 29 29 3b 0a 6c 6f 63 61 6c blcodes));.local
14a0: 20 76 6f 69 64 20 63 6f 6d 70 72 65 73 73 5f 62 void compress_b
14b0: 6c 6f 63 6b 20 4f 46 28 28 64 65 66 6c 61 74 65 lock OF((deflate
14c0: 5f 73 74 61 74 65 20 2a 73 2c 20 63 74 5f 64 61 _state *s, ct_da
14d0: 74 61 20 2a 6c 74 72 65 65 2c 0a 20 20 20 20 20 ta *ltree,.
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14f0: 20 20 20 20 20 20 20 20 20 63 74 5f 64 61 74 61 ct_data
1500: 20 2a 64 74 72 65 65 29 29 3b 0a 6c 6f 63 61 6c *dtree));.local
1510: 20 76 6f 69 64 20 73 65 74 5f 64 61 74 61 5f 74 void set_data_t
1520: 79 70 65 20 20 4f 46 28 28 64 65 66 6c 61 74 65 ype OF((deflate
1530: 5f 73 74 61 74 65 20 2a 73 29 29 3b 0a 6c 6f 63 _state *s));.loc
1540: 61 6c 20 75 6e 73 69 67 6e 65 64 20 62 69 5f 72 al unsigned bi_r
1550: 65 76 65 72 73 65 20 4f 46 28 28 75 6e 73 69 67 everse OF((unsig
1560: 6e 65 64 20 76 61 6c 75 65 2c 20 69 6e 74 20 6c ned value, int l
1570: 65 6e 67 74 68 29 29 3b 0a 6c 6f 63 61 6c 20 76 ength));.local v
1580: 6f 69 64 20 62 69 5f 77 69 6e 64 75 70 20 20 20 oid bi_windup
1590: 20 20 20 4f 46 28 28 64 65 66 6c 61 74 65 5f 73 OF((deflate_s
15a0: 74 61 74 65 20 2a 73 29 29 3b 0a 6c 6f 63 61 6c tate *s));.local
15b0: 20 76 6f 69 64 20 62 69 5f 66 6c 75 73 68 20 20 void bi_flush
15c0: 20 20 20 20 20 4f 46 28 28 64 65 66 6c 61 74 65 OF((deflate
15d0: 5f 73 74 61 74 65 20 2a 73 29 29 3b 0a 6c 6f 63 _state *s));.loc
15e0: 61 6c 20 76 6f 69 64 20 63 6f 70 79 5f 62 6c 6f al void copy_blo
15f0: 63 6b 20 20 20 20 20 4f 46 28 28 64 65 66 6c 61 ck OF((defla
1600: 74 65 5f 73 74 61 74 65 20 2a 73 2c 20 63 68 61 te_state *s, cha
1610: 72 66 20 2a 62 75 66 2c 20 75 6e 73 69 67 6e 65 rf *buf, unsigne
1620: 64 20 6c 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 d len,.
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1640: 20 20 20 20 20 69 6e 74 20 68 65 61 64 65 72 29 int header)
1650: 29 3b 0a 0a 23 69 66 64 65 66 20 47 45 4e 5f 54 );..#ifdef GEN_T
1660: 52 45 45 53 5f 48 0a 6c 6f 63 61 6c 20 76 6f 69 REES_H.local voi
1670: 64 20 67 65 6e 5f 74 72 65 65 73 5f 68 65 61 64 d gen_trees_head
1680: 65 72 20 4f 46 28 28 76 6f 69 64 29 29 3b 0a 23 er OF((void));.#
1690: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 44 endif..#ifndef D
16a0: 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20 73 EBUG.# define s
16b0: 65 6e 64 5f 63 6f 64 65 28 73 2c 20 63 2c 20 74 end_code(s, c, t
16c0: 72 65 65 29 20 73 65 6e 64 5f 62 69 74 73 28 73 ree) send_bits(s
16d0: 2c 20 74 72 65 65 5b 63 5d 2e 43 6f 64 65 2c 20 , tree[c].Code,
16e0: 74 72 65 65 5b 63 5d 2e 4c 65 6e 29 0a 20 20 20 tree[c].Len).
16f0: 2f 2a 20 53 65 6e 64 20 61 20 63 6f 64 65 20 6f /* Send a code o
1700: 66 20 74 68 65 20 67 69 76 65 6e 20 74 72 65 65 f the given tree
1710: 2e 20 63 20 61 6e 64 20 74 72 65 65 20 6d 75 73 . c and tree mus
1720: 74 20 6e 6f 74 20 68 61 76 65 20 73 69 64 65 20 t not have side
1730: 65 66 66 65 63 74 73 20 2a 2f 0a 0a 23 65 6c 73 effects */..#els
1740: 65 20 2f 2a 20 44 45 42 55 47 20 2a 2f 0a 23 20 e /* DEBUG */.#
1750: 20 64 65 66 69 6e 65 20 73 65 6e 64 5f 63 6f 64 define send_cod
1760: 65 28 73 2c 20 63 2c 20 74 72 65 65 29 20 5c 0a e(s, c, tree) \.
1770: 20 20 20 20 20 7b 20 69 66 20 28 7a 5f 76 65 72 { if (z_ver
1780: 62 6f 73 65 3e 32 29 20 66 70 72 69 6e 74 66 28 bose>2) fprintf(
1790: 73 74 64 65 72 72 2c 22 5c 6e 63 64 20 25 33 64 stderr,"\ncd %3d
17a0: 20 22 2c 28 63 29 29 3b 20 5c 0a 20 20 20 20 20 ",(c)); \.
17b0: 20 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 74 send_bits(s, t
17c0: 72 65 65 5b 63 5d 2e 43 6f 64 65 2c 20 74 72 65 ree[c].Code, tre
17d0: 65 5b 63 5d 2e 4c 65 6e 29 3b 20 7d 0a 23 65 6e e[c].Len); }.#en
17e0: 64 69 66 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d dif../* ========
17f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1830: 3d 3d 3d 0a 20 2a 20 4f 75 74 70 75 74 20 61 20 ===. * Output a
1840: 73 68 6f 72 74 20 4c 53 42 20 66 69 72 73 74 20 short LSB first
1850: 6f 6e 20 74 68 65 20 73 74 72 65 61 6d 2e 0a 20 on the stream..
1860: 2a 20 49 4e 20 61 73 73 65 72 74 69 6f 6e 3a 20 * IN assertion:
1870: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 there is enough
1880: 72 6f 6f 6d 20 69 6e 20 70 65 6e 64 69 6e 67 42 room in pendingB
1890: 75 66 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 uf.. */.#define
18a0: 70 75 74 5f 73 68 6f 72 74 28 73 2c 20 77 29 20 put_short(s, w)
18b0: 7b 20 5c 0a 20 20 20 20 70 75 74 5f 62 79 74 65 { \. put_byte
18c0: 28 73 2c 20 28 75 63 68 29 28 28 77 29 20 26 20 (s, (uch)((w) &
18d0: 30 78 66 66 29 29 3b 20 5c 0a 20 20 20 20 70 75 0xff)); \. pu
18e0: 74 5f 62 79 74 65 28 73 2c 20 28 75 63 68 29 28 t_byte(s, (uch)(
18f0: 28 75 73 68 29 28 77 29 20 3e 3e 20 38 29 29 3b (ush)(w) >> 8));
1900: 20 5c 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d \.}../* =======
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1930: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1950: 3d 3d 3d 3d 0a 20 2a 20 53 65 6e 64 20 61 20 76 ====. * Send a v
1960: 61 6c 75 65 20 6f 6e 20 61 20 67 69 76 65 6e 20 alue on a given
1970: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 2e 0a number of bits..
1980: 20 2a 20 49 4e 20 61 73 73 65 72 74 69 6f 6e 3a * IN assertion:
1990: 20 6c 65 6e 67 74 68 20 3c 3d 20 31 36 20 61 6e length <= 16 an
19a0: 64 20 76 61 6c 75 65 20 66 69 74 73 20 69 6e 20 d value fits in
19b0: 6c 65 6e 67 74 68 20 62 69 74 73 2e 0a 20 2a 2f length bits.. */
19c0: 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 6c 6f .#ifdef DEBUG.lo
19d0: 63 61 6c 20 76 6f 69 64 20 73 65 6e 64 5f 62 69 cal void send_bi
19e0: 74 73 20 20 20 20 20 20 4f 46 28 28 64 65 66 6c ts OF((defl
19f0: 61 74 65 5f 73 74 61 74 65 20 2a 73 2c 20 69 6e ate_state *s, in
1a00: 74 20 76 61 6c 75 65 2c 20 69 6e 74 20 6c 65 6e t value, int len
1a10: 67 74 68 29 29 3b 0a 0a 6c 6f 63 61 6c 20 76 6f gth));..local vo
1a20: 69 64 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 id send_bits(s,
1a30: 76 61 6c 75 65 2c 20 6c 65 6e 67 74 68 29 0a 20 value, length).
1a40: 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65 deflate_state
1a50: 20 2a 73 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c *s;. int val
1a60: 75 65 3b 20 20 2f 2a 20 76 61 6c 75 65 20 74 6f ue; /* value to
1a70: 20 73 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 send */. int
1a80: 20 6c 65 6e 67 74 68 3b 20 2f 2a 20 6e 75 6d 62 length; /* numb
1a90: 65 72 20 6f 66 20 62 69 74 73 20 2a 2f 0a 7b 0a er of bits */.{.
1aa0: 20 20 20 20 54 72 61 63 65 76 76 28 28 73 74 64 Tracevv((std
1ab0: 65 72 72 2c 22 20 6c 20 25 32 64 20 76 20 25 34 err," l %2d v %4
1ac0: 78 20 22 2c 20 6c 65 6e 67 74 68 2c 20 76 61 6c x ", length, val
1ad0: 75 65 29 29 3b 0a 20 20 20 20 41 73 73 65 72 74 ue));. Assert
1ae0: 28 6c 65 6e 67 74 68 20 3e 20 30 20 26 26 20 6c (length > 0 && l
1af0: 65 6e 67 74 68 20 3c 3d 20 31 35 2c 20 22 69 6e ength <= 15, "in
1b00: 76 61 6c 69 64 20 6c 65 6e 67 74 68 22 29 3b 0a valid length");.
1b10: 20 20 20 20 73 2d 3e 62 69 74 73 5f 73 65 6e 74 s->bits_sent
1b20: 20 2b 3d 20 28 75 6c 67 29 6c 65 6e 67 74 68 3b += (ulg)length;
1b30: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 .. /* If not
1b40: 65 6e 6f 75 67 68 20 72 6f 6f 6d 20 69 6e 20 62 enough room in b
1b50: 69 5f 62 75 66 2c 20 75 73 65 20 28 76 61 6c 69 i_buf, use (vali
1b60: 64 29 20 62 69 74 73 20 66 72 6f 6d 20 62 69 5f d) bits from bi_
1b70: 62 75 66 20 61 6e 64 0a 20 20 20 20 20 2a 20 28 buf and. * (
1b80: 31 36 20 2d 20 62 69 5f 76 61 6c 69 64 29 20 62 16 - bi_valid) b
1b90: 69 74 73 20 66 72 6f 6d 20 76 61 6c 75 65 2c 20 its from value,
1ba0: 6c 65 61 76 69 6e 67 20 28 77 69 64 74 68 20 2d leaving (width -
1bb0: 20 28 31 36 2d 62 69 5f 76 61 6c 69 64 29 29 0a (16-bi_valid)).
1bc0: 20 20 20 20 20 2a 20 75 6e 75 73 65 64 20 62 69 * unused bi
1bd0: 74 73 20 69 6e 20 76 61 6c 75 65 2e 0a 20 20 20 ts in value..
1be0: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 2d 3e */. if (s->
1bf0: 62 69 5f 76 61 6c 69 64 20 3e 20 28 69 6e 74 29 bi_valid > (int)
1c00: 42 75 66 5f 73 69 7a 65 20 2d 20 6c 65 6e 67 74 Buf_size - lengt
1c10: 68 29 20 7b 0a 20 20 20 20 20 20 20 20 73 2d 3e h) {. s->
1c20: 62 69 5f 62 75 66 20 7c 3d 20 28 76 61 6c 75 65 bi_buf |= (value
1c30: 20 3c 3c 20 73 2d 3e 62 69 5f 76 61 6c 69 64 29 << s->bi_valid)
1c40: 3b 0a 20 20 20 20 20 20 20 20 70 75 74 5f 73 68 ;. put_sh
1c50: 6f 72 74 28 73 2c 20 73 2d 3e 62 69 5f 62 75 66 ort(s, s->bi_buf
1c60: 29 3b 0a 20 20 20 20 20 20 20 20 73 2d 3e 62 69 );. s->bi
1c70: 5f 62 75 66 20 3d 20 28 75 73 68 29 76 61 6c 75 _buf = (ush)valu
1c80: 65 20 3e 3e 20 28 42 75 66 5f 73 69 7a 65 20 2d e >> (Buf_size -
1c90: 20 73 2d 3e 62 69 5f 76 61 6c 69 64 29 3b 0a 20 s->bi_valid);.
1ca0: 20 20 20 20 20 20 20 73 2d 3e 62 69 5f 76 61 6c s->bi_val
1cb0: 69 64 20 2b 3d 20 6c 65 6e 67 74 68 20 2d 20 42 id += length - B
1cc0: 75 66 5f 73 69 7a 65 3b 0a 20 20 20 20 7d 20 65 uf_size;. } e
1cd0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 2d lse {. s-
1ce0: 3e 62 69 5f 62 75 66 20 7c 3d 20 76 61 6c 75 65 >bi_buf |= value
1cf0: 20 3c 3c 20 73 2d 3e 62 69 5f 76 61 6c 69 64 3b << s->bi_valid;
1d00: 0a 20 20 20 20 20 20 20 20 73 2d 3e 62 69 5f 76 . s->bi_v
1d10: 61 6c 69 64 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a alid += length;.
1d20: 20 20 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a }.}.#else /*
1d30: 20 21 44 45 42 55 47 20 2a 2f 0a 0a 23 64 65 66 !DEBUG */..#def
1d40: 69 6e 65 20 73 65 6e 64 5f 62 69 74 73 28 73 2c ine send_bits(s,
1d50: 20 76 61 6c 75 65 2c 20 6c 65 6e 67 74 68 29 20 value, length)
1d60: 5c 0a 7b 20 69 6e 74 20 6c 65 6e 20 3d 20 6c 65 \.{ int len = le
1d70: 6e 67 74 68 3b 5c 0a 20 20 69 66 20 28 73 2d 3e ngth;\. if (s->
1d80: 62 69 5f 76 61 6c 69 64 20 3e 20 28 69 6e 74 29 bi_valid > (int)
1d90: 42 75 66 5f 73 69 7a 65 20 2d 20 6c 65 6e 29 20 Buf_size - len)
1da0: 7b 5c 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d {\. int val =
1db0: 20 76 61 6c 75 65 3b 5c 0a 20 20 20 20 73 2d 3e value;\. s->
1dc0: 62 69 5f 62 75 66 20 7c 3d 20 28 76 61 6c 20 3c bi_buf |= (val <
1dd0: 3c 20 73 2d 3e 62 69 5f 76 61 6c 69 64 29 3b 5c < s->bi_valid);\
1de0: 0a 20 20 20 20 70 75 74 5f 73 68 6f 72 74 28 73 . put_short(s
1df0: 2c 20 73 2d 3e 62 69 5f 62 75 66 29 3b 5c 0a 20 , s->bi_buf);\.
1e00: 20 20 20 73 2d 3e 62 69 5f 62 75 66 20 3d 20 28 s->bi_buf = (
1e10: 75 73 68 29 76 61 6c 20 3e 3e 20 28 42 75 66 5f ush)val >> (Buf_
1e20: 73 69 7a 65 20 2d 20 73 2d 3e 62 69 5f 76 61 6c size - s->bi_val
1e30: 69 64 29 3b 5c 0a 20 20 20 20 73 2d 3e 62 69 5f id);\. s->bi_
1e40: 76 61 6c 69 64 20 2b 3d 20 6c 65 6e 20 2d 20 42 valid += len - B
1e50: 75 66 5f 73 69 7a 65 3b 5c 0a 20 20 7d 20 65 6c uf_size;\. } el
1e60: 73 65 20 7b 5c 0a 20 20 20 20 73 2d 3e 62 69 5f se {\. s->bi_
1e70: 62 75 66 20 7c 3d 20 28 76 61 6c 75 65 29 20 3c buf |= (value) <
1e80: 3c 20 73 2d 3e 62 69 5f 76 61 6c 69 64 3b 5c 0a < s->bi_valid;\.
1e90: 20 20 20 20 73 2d 3e 62 69 5f 76 61 6c 69 64 20 s->bi_valid
1ea0: 2b 3d 20 6c 65 6e 3b 5c 0a 20 20 7d 5c 0a 7d 0a += len;\. }\.}.
1eb0: 23 65 6e 64 69 66 20 2f 2a 20 44 45 42 55 47 20 #endif /* DEBUG
1ec0: 2a 2f 0a 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 */...#define MAX
1ed0: 28 61 2c 62 29 20 28 61 20 3e 3d 20 62 20 3f 20 (a,b) (a >= b ?
1ee0: 61 20 3a 20 62 29 0a 2f 2a 20 74 68 65 20 61 72 a : b)./* the ar
1ef0: 67 75 6d 65 6e 74 73 20 6d 75 73 74 20 6e 6f 74 guments must not
1f00: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 have side effec
1f10: 74 73 20 2a 2f 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d ts */../* ======
1f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f60: 3d 3d 3d 3d 3d 0a 20 2a 20 49 6e 69 74 69 61 6c =====. * Initial
1f70: 69 7a 65 20 74 68 65 20 76 61 72 69 6f 75 73 20 ize the various
1f80: 27 63 6f 6e 73 74 61 6e 74 27 20 74 61 62 6c 65 'constant' table
1f90: 73 2e 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 76 6f 69 s.. */.local voi
1fa0: 64 20 74 72 5f 73 74 61 74 69 63 5f 69 6e 69 74 d tr_static_init
1fb0: 28 29 0a 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 ().{.#if defined
1fc0: 28 47 45 4e 5f 54 52 45 45 53 5f 48 29 20 7c 7c (GEN_TREES_H) ||
1fd0: 20 21 64 65 66 69 6e 65 64 28 53 54 44 43 29 0a !defined(STDC).
1fe0: 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 static int s
1ff0: 74 61 74 69 63 5f 69 6e 69 74 5f 64 6f 6e 65 20 tatic_init_done
2000: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 = 0;. int n;
2010: 20 20 20 20 20 20 20 2f 2a 20 69 74 65 72 61 74 /* iterat
2020: 65 73 20 6f 76 65 72 20 74 72 65 65 20 65 6c 65 es over tree ele
2030: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 ments */. int
2040: 20 62 69 74 73 3b 20 20 20 20 20 2f 2a 20 62 69 bits; /* bi
2050: 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 t counter */.
2060: 20 69 6e 74 20 6c 65 6e 67 74 68 3b 20 20 20 2f int length; /
2070: 2a 20 6c 65 6e 67 74 68 20 76 61 6c 75 65 20 2a * length value *
2080: 2f 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 20 /. int code;
2090: 20 20 20 20 2f 2a 20 63 6f 64 65 20 76 61 6c 75 /* code valu
20a0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 73 e */. int dis
20b0: 74 3b 20 20 20 20 20 2f 2a 20 64 69 73 74 61 6e t; /* distan
20c0: 63 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 ce index */.
20d0: 75 73 68 20 62 6c 5f 63 6f 75 6e 74 5b 4d 41 58 ush bl_count[MAX
20e0: 5f 42 49 54 53 2b 31 5d 3b 0a 20 20 20 20 2f 2a _BITS+1];. /*
20f0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 64 65 73 number of codes
2100: 20 61 74 20 65 61 63 68 20 62 69 74 20 6c 65 6e at each bit len
2110: 67 74 68 20 66 6f 72 20 61 6e 20 6f 70 74 69 6d gth for an optim
2120: 61 6c 20 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 al tree */..
2130: 69 66 20 28 73 74 61 74 69 63 5f 69 6e 69 74 5f if (static_init_
2140: 64 6f 6e 65 29 20 72 65 74 75 72 6e 3b 0a 0a 20 done) return;..
2150: 20 20 20 2f 2a 20 46 6f 72 20 73 6f 6d 65 20 65 /* For some e
2160: 6d 62 65 64 64 65 64 20 74 61 72 67 65 74 73 2c mbedded targets,
2170: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 global variable
2180: 73 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 s are not initia
2190: 6c 69 7a 65 64 3a 20 2a 2f 0a 20 20 20 20 73 74 lized: */. st
21a0: 61 74 69 63 5f 6c 5f 64 65 73 63 2e 73 74 61 74 atic_l_desc.stat
21b0: 69 63 5f 74 72 65 65 20 3d 20 73 74 61 74 69 63 ic_tree = static
21c0: 5f 6c 74 72 65 65 3b 0a 20 20 20 20 73 74 61 74 _ltree;. stat
21d0: 69 63 5f 6c 5f 64 65 73 63 2e 65 78 74 72 61 5f ic_l_desc.extra_
21e0: 62 69 74 73 20 3d 20 65 78 74 72 61 5f 6c 62 69 bits = extra_lbi
21f0: 74 73 3b 0a 20 20 20 20 73 74 61 74 69 63 5f 64 ts;. static_d
2200: 5f 64 65 73 63 2e 73 74 61 74 69 63 5f 74 72 65 _desc.static_tre
2210: 65 20 3d 20 73 74 61 74 69 63 5f 64 74 72 65 65 e = static_dtree
2220: 3b 0a 20 20 20 20 73 74 61 74 69 63 5f 64 5f 64 ;. static_d_d
2230: 65 73 63 2e 65 78 74 72 61 5f 62 69 74 73 20 3d esc.extra_bits =
2240: 20 65 78 74 72 61 5f 64 62 69 74 73 3b 0a 20 20 extra_dbits;.
2250: 20 20 73 74 61 74 69 63 5f 62 6c 5f 64 65 73 63 static_bl_desc
2260: 2e 65 78 74 72 61 5f 62 69 74 73 20 3d 20 65 78 .extra_bits = ex
2270: 74 72 61 5f 62 6c 62 69 74 73 3b 0a 0a 20 20 20 tra_blbits;..
2280: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 /* Initialize t
2290: 68 65 20 6d 61 70 70 69 6e 67 20 6c 65 6e 67 74 he mapping lengt
22a0: 68 20 28 30 2e 2e 32 35 35 29 20 2d 3e 20 6c 65 h (0..255) -> le
22b0: 6e 67 74 68 20 63 6f 64 65 20 28 30 2e 2e 32 38 ngth code (0..28
22c0: 29 20 2a 2f 0a 20 20 20 20 6c 65 6e 67 74 68 20 ) */. length
22d0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 20 28 63 6f = 0;. for (co
22e0: 64 65 20 3d 20 30 3b 20 63 6f 64 65 20 3c 20 4c de = 0; code < L
22f0: 45 4e 47 54 48 5f 43 4f 44 45 53 2d 31 3b 20 63 ENGTH_CODES-1; c
2300: 6f 64 65 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 ode++) {.
2310: 20 62 61 73 65 5f 6c 65 6e 67 74 68 5b 63 6f 64 base_length[cod
2320: 65 5d 20 3d 20 6c 65 6e 67 74 68 3b 0a 20 20 20 e] = length;.
2330: 20 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b for (n = 0;
2340: 20 6e 20 3c 20 28 31 3c 3c 65 78 74 72 61 5f 6c n < (1<<extra_l
2350: 62 69 74 73 5b 63 6f 64 65 5d 29 3b 20 6e 2b 2b bits[code]); n++
2360: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ) {.
2370: 5f 6c 65 6e 67 74 68 5f 63 6f 64 65 5b 6c 65 6e _length_code[len
2380: 67 74 68 2b 2b 5d 20 3d 20 28 75 63 68 29 63 6f gth++] = (uch)co
2390: 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 de;. }.
23a0: 20 20 7d 0a 20 20 20 20 41 73 73 65 72 74 20 28 }. Assert (
23b0: 6c 65 6e 67 74 68 20 3d 3d 20 32 35 36 2c 20 22 length == 256, "
23c0: 74 72 5f 73 74 61 74 69 63 5f 69 6e 69 74 3a 20 tr_static_init:
23d0: 6c 65 6e 67 74 68 20 21 3d 20 32 35 36 22 29 3b length != 256");
23e0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 . /* Note tha
23f0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 32 35 35 t the length 255
2400: 20 28 6d 61 74 63 68 20 6c 65 6e 67 74 68 20 32 (match length 2
2410: 35 38 29 20 63 61 6e 20 62 65 20 72 65 70 72 65 58) can be repre
2420: 73 65 6e 74 65 64 0a 20 20 20 20 20 2a 20 69 6e sented. * in
2430: 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 77 two different w
2440: 61 79 73 3a 20 63 6f 64 65 20 32 38 34 20 2b 20 ays: code 284 +
2450: 35 20 62 69 74 73 20 6f 72 20 63 6f 64 65 20 32 5 bits or code 2
2460: 38 35 2c 20 73 6f 20 77 65 0a 20 20 20 20 20 2a 85, so we. *
2470: 20 6f 76 65 72 77 72 69 74 65 20 6c 65 6e 67 74 overwrite lengt
2480: 68 5f 63 6f 64 65 5b 32 35 35 5d 20 74 6f 20 75 h_code[255] to u
2490: 73 65 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f se the best enco
24a0: 64 69 6e 67 3a 0a 20 20 20 20 20 2a 2f 0a 20 20 ding:. */.
24b0: 20 20 5f 6c 65 6e 67 74 68 5f 63 6f 64 65 5b 6c _length_code[l
24c0: 65 6e 67 74 68 2d 31 5d 20 3d 20 28 75 63 68 29 ength-1] = (uch)
24d0: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e code;.. /* In
24e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 70 itialize the map
24f0: 70 69 6e 67 20 64 69 73 74 20 28 30 2e 2e 33 32 ping dist (0..32
2500: 4b 29 20 2d 3e 20 64 69 73 74 20 63 6f 64 65 20 K) -> dist code
2510: 28 30 2e 2e 32 39 29 20 2a 2f 0a 20 20 20 20 64 (0..29) */. d
2520: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 ist = 0;. for
2530: 20 28 63 6f 64 65 20 3d 20 30 20 3b 20 63 6f 64 (code = 0 ; cod
2540: 65 20 3c 20 31 36 3b 20 63 6f 64 65 2b 2b 29 20 e < 16; code++)
2550: 7b 0a 20 20 20 20 20 20 20 20 62 61 73 65 5f 64 {. base_d
2560: 69 73 74 5b 63 6f 64 65 5d 20 3d 20 64 69 73 74 ist[code] = dist
2570: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6e ;. for (n
2580: 20 3d 20 30 3b 20 6e 20 3c 20 28 31 3c 3c 65 78 = 0; n < (1<<ex
2590: 74 72 61 5f 64 62 69 74 73 5b 63 6f 64 65 5d 29 tra_dbits[code])
25a0: 3b 20 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 ; n++) {.
25b0: 20 20 20 20 20 5f 64 69 73 74 5f 63 6f 64 65 5b _dist_code[
25c0: 64 69 73 74 2b 2b 5d 20 3d 20 28 75 63 68 29 63 dist++] = (uch)c
25d0: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 ode;. }.
25e0: 20 20 20 7d 0a 20 20 20 20 41 73 73 65 72 74 20 }. Assert
25f0: 28 64 69 73 74 20 3d 3d 20 32 35 36 2c 20 22 74 (dist == 256, "t
2600: 72 5f 73 74 61 74 69 63 5f 69 6e 69 74 3a 20 64 r_static_init: d
2610: 69 73 74 20 21 3d 20 32 35 36 22 29 3b 0a 20 20 ist != 256");.
2620: 20 20 64 69 73 74 20 3e 3e 3d 20 37 3b 20 2f 2a dist >>= 7; /*
2630: 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2c 20 61 6c from now on, al
2640: 6c 20 64 69 73 74 61 6e 63 65 73 20 61 72 65 20 l distances are
2650: 64 69 76 69 64 65 64 20 62 79 20 31 32 38 20 2a divided by 128 *
2660: 2f 0a 20 20 20 20 66 6f 72 20 28 20 3b 20 63 6f /. for ( ; co
2670: 64 65 20 3c 20 44 5f 43 4f 44 45 53 3b 20 63 6f de < D_CODES; co
2680: 64 65 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 de++) {.
2690: 62 61 73 65 5f 64 69 73 74 5b 63 6f 64 65 5d 20 base_dist[code]
26a0: 3d 20 64 69 73 74 20 3c 3c 20 37 3b 0a 20 20 20 = dist << 7;.
26b0: 20 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b for (n = 0;
26c0: 20 6e 20 3c 20 28 31 3c 3c 28 65 78 74 72 61 5f n < (1<<(extra_
26d0: 64 62 69 74 73 5b 63 6f 64 65 5d 2d 37 29 29 3b dbits[code]-7));
26e0: 20 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 n++) {.
26f0: 20 20 20 20 5f 64 69 73 74 5f 63 6f 64 65 5b 32 _dist_code[2
2700: 35 36 20 2b 20 64 69 73 74 2b 2b 5d 20 3d 20 28 56 + dist++] = (
2710: 75 63 68 29 63 6f 64 65 3b 0a 20 20 20 20 20 20 uch)code;.
2720: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 41 73 }. }. As
2730: 73 65 72 74 20 28 64 69 73 74 20 3d 3d 20 32 35 sert (dist == 25
2740: 36 2c 20 22 74 72 5f 73 74 61 74 69 63 5f 69 6e 6, "tr_static_in
2750: 69 74 3a 20 32 35 36 2b 64 69 73 74 20 21 3d 20 it: 256+dist !=
2760: 35 31 32 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 512");.. /* C
2770: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 6f 64 onstruct the cod
2780: 65 73 20 6f 66 20 74 68 65 20 73 74 61 74 69 63 es of the static
2790: 20 6c 69 74 65 72 61 6c 20 74 72 65 65 20 2a 2f literal tree */
27a0: 0a 20 20 20 20 66 6f 72 20 28 62 69 74 73 20 3d . for (bits =
27b0: 20 30 3b 20 62 69 74 73 20 3c 3d 20 4d 41 58 5f 0; bits <= MAX_
27c0: 42 49 54 53 3b 20 62 69 74 73 2b 2b 29 20 62 6c BITS; bits++) bl
27d0: 5f 63 6f 75 6e 74 5b 62 69 74 73 5d 20 3d 20 30 _count[bits] = 0
27e0: 3b 0a 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 ;. n = 0;.
27f0: 20 77 68 69 6c 65 20 28 6e 20 3c 3d 20 31 34 33 while (n <= 143
2800: 29 20 73 74 61 74 69 63 5f 6c 74 72 65 65 5b 6e ) static_ltree[n
2810: 2b 2b 5d 2e 4c 65 6e 20 3d 20 38 2c 20 62 6c 5f ++].Len = 8, bl_
2820: 63 6f 75 6e 74 5b 38 5d 2b 2b 3b 0a 20 20 20 20 count[8]++;.
2830: 77 68 69 6c 65 20 28 6e 20 3c 3d 20 32 35 35 29 while (n <= 255)
2840: 20 73 74 61 74 69 63 5f 6c 74 72 65 65 5b 6e 2b static_ltree[n+
2850: 2b 5d 2e 4c 65 6e 20 3d 20 39 2c 20 62 6c 5f 63 +].Len = 9, bl_c
2860: 6f 75 6e 74 5b 39 5d 2b 2b 3b 0a 20 20 20 20 77 ount[9]++;. w
2870: 68 69 6c 65 20 28 6e 20 3c 3d 20 32 37 39 29 20 hile (n <= 279)
2880: 73 74 61 74 69 63 5f 6c 74 72 65 65 5b 6e 2b 2b static_ltree[n++
2890: 5d 2e 4c 65 6e 20 3d 20 37 2c 20 62 6c 5f 63 6f ].Len = 7, bl_co
28a0: 75 6e 74 5b 37 5d 2b 2b 3b 0a 20 20 20 20 77 68 unt[7]++;. wh
28b0: 69 6c 65 20 28 6e 20 3c 3d 20 32 38 37 29 20 73 ile (n <= 287) s
28c0: 74 61 74 69 63 5f 6c 74 72 65 65 5b 6e 2b 2b 5d tatic_ltree[n++]
28d0: 2e 4c 65 6e 20 3d 20 38 2c 20 62 6c 5f 63 6f 75 .Len = 8, bl_cou
28e0: 6e 74 5b 38 5d 2b 2b 3b 0a 20 20 20 20 2f 2a 20 nt[8]++;. /*
28f0: 43 6f 64 65 73 20 32 38 36 20 61 6e 64 20 32 38 Codes 286 and 28
2900: 37 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 7 do not exist,
2910: 62 75 74 20 77 65 20 6d 75 73 74 20 69 6e 63 6c but we must incl
2920: 75 64 65 20 74 68 65 6d 20 69 6e 20 74 68 65 0a ude them in the.
2930: 20 20 20 20 20 2a 20 74 72 65 65 20 63 6f 6e 73 * tree cons
2940: 74 72 75 63 74 69 6f 6e 20 74 6f 20 67 65 74 20 truction to get
2950: 61 20 63 61 6e 6f 6e 69 63 61 6c 20 48 75 66 66 a canonical Huff
2960: 6d 61 6e 20 74 72 65 65 20 28 6c 6f 6e 67 65 73 man tree (longes
2970: 74 20 63 6f 64 65 0a 20 20 20 20 20 2a 20 61 6c t code. * al
2980: 6c 20 6f 6e 65 73 29 0a 20 20 20 20 20 2a 2f 0a l ones). */.
2990: 20 20 20 20 67 65 6e 5f 63 6f 64 65 73 28 28 63 gen_codes((c
29a0: 74 5f 64 61 74 61 20 2a 29 73 74 61 74 69 63 5f t_data *)static_
29b0: 6c 74 72 65 65 2c 20 4c 5f 43 4f 44 45 53 2b 31 ltree, L_CODES+1
29c0: 2c 20 62 6c 5f 63 6f 75 6e 74 29 3b 0a 0a 20 20 , bl_count);..
29d0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 69 63 20 /* The static
29e0: 64 69 73 74 61 6e 63 65 20 74 72 65 65 20 69 73 distance tree is
29f0: 20 74 72 69 76 69 61 6c 3a 20 2a 2f 0a 20 20 20 trivial: */.
2a00: 20 66 6f 72 20 28 6e 20 3d 20 30 3b 20 6e 20 3c for (n = 0; n <
2a10: 20 44 5f 43 4f 44 45 53 3b 20 6e 2b 2b 29 20 7b D_CODES; n++) {
2a20: 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63 5f . static_
2a30: 64 74 72 65 65 5b 6e 5d 2e 4c 65 6e 20 3d 20 35 dtree[n].Len = 5
2a40: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63 ;. static
2a50: 5f 64 74 72 65 65 5b 6e 5d 2e 43 6f 64 65 20 3d _dtree[n].Code =
2a60: 20 62 69 5f 72 65 76 65 72 73 65 28 28 75 6e 73 bi_reverse((uns
2a70: 69 67 6e 65 64 29 6e 2c 20 35 29 3b 0a 20 20 20 igned)n, 5);.
2a80: 20 7d 0a 20 20 20 20 73 74 61 74 69 63 5f 69 6e }. static_in
2a90: 69 74 5f 64 6f 6e 65 20 3d 20 31 3b 0a 0a 23 20 it_done = 1;..#
2aa0: 20 69 66 64 65 66 20 47 45 4e 5f 54 52 45 45 53 ifdef GEN_TREES
2ab0: 5f 48 0a 20 20 20 20 67 65 6e 5f 74 72 65 65 73 _H. gen_trees
2ac0: 5f 68 65 61 64 65 72 28 29 3b 0a 23 20 20 65 6e _header();.# en
2ad0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 dif.#endif /* de
2ae0: 66 69 6e 65 64 28 47 45 4e 5f 54 52 45 45 53 5f fined(GEN_TREES_
2af0: 48 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 H) || !defined(S
2b00: 54 44 43 29 20 2a 2f 0a 7d 0a 0a 2f 2a 20 3d 3d TDC) */.}../* ==
2b10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 47 65 6e =========. * Gen
2b60: 65 72 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 ererate the file
2b70: 20 74 72 65 65 73 2e 68 20 64 65 73 63 72 69 62 trees.h describ
2b80: 69 6e 67 20 74 68 65 20 73 74 61 74 69 63 20 74 ing the static t
2b90: 72 65 65 73 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 rees.. */.#ifdef
2ba0: 20 47 45 4e 5f 54 52 45 45 53 5f 48 0a 23 20 20 GEN_TREES_H.#
2bb0: 69 66 6e 64 65 66 20 44 45 42 55 47 0a 23 20 20 ifndef DEBUG.#
2bc0: 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f include <stdio
2bd0: 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 .h>.# endif..#
2be0: 20 64 65 66 69 6e 65 20 53 45 50 41 52 41 54 4f define SEPARATO
2bf0: 52 28 69 2c 20 6c 61 73 74 2c 20 77 69 64 74 68 R(i, last, width
2c00: 29 20 5c 0a 20 20 20 20 20 20 28 28 69 29 20 3d ) \. ((i) =
2c10: 3d 20 28 6c 61 73 74 29 3f 20 22 5c 6e 7d 3b 5c = (last)? "\n};\
2c20: 6e 5c 6e 22 20 3a 20 20 20 20 5c 0a 20 20 20 20 n\n" : \.
2c30: 20 20 20 28 28 69 29 20 25 20 28 77 69 64 74 68 ((i) % (width
2c40: 29 20 3d 3d 20 28 77 69 64 74 68 29 2d 31 20 3f ) == (width)-1 ?
2c50: 20 22 2c 5c 6e 22 20 3a 20 22 2c 20 22 29 29 0a ",\n" : ", ")).
2c60: 0a 76 6f 69 64 20 67 65 6e 5f 74 72 65 65 73 5f .void gen_trees_
2c70: 68 65 61 64 65 72 28 29 0a 7b 0a 20 20 20 20 46 header().{. F
2c80: 49 4c 45 20 2a 68 65 61 64 65 72 20 3d 20 66 6f ILE *header = fo
2c90: 70 65 6e 28 22 74 72 65 65 73 2e 68 22 2c 20 22 pen("trees.h", "
2ca0: 77 22 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a w");. int i;.
2cb0: 0a 20 20 20 20 41 73 73 65 72 74 20 28 68 65 61 . Assert (hea
2cc0: 64 65 72 20 21 3d 20 4e 55 4c 4c 2c 20 22 43 61 der != NULL, "Ca
2cd0: 6e 27 74 20 6f 70 65 6e 20 74 72 65 65 73 2e 68 n't open trees.h
2ce0: 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 ");. fprintf(
2cf0: 68 65 61 64 65 72 2c 0a 09 20 20 20 20 22 2f 2a header,.. "/*
2d00: 20 68 65 61 64 65 72 20 63 72 65 61 74 65 64 20 header created
2d10: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 69 automatically wi
2d20: 74 68 20 2d 44 47 45 4e 5f 54 52 45 45 53 5f 48 th -DGEN_TREES_H
2d30: 20 2a 2f 5c 6e 5c 6e 22 29 3b 0a 0a 20 20 20 20 */\n\n");..
2d40: 66 70 72 69 6e 74 66 28 68 65 61 64 65 72 2c 20 fprintf(header,
2d50: 22 6c 6f 63 61 6c 20 63 6f 6e 73 74 20 63 74 5f "local const ct_
2d60: 64 61 74 61 20 73 74 61 74 69 63 5f 6c 74 72 65 data static_ltre
2d70: 65 5b 4c 5f 43 4f 44 45 53 2b 32 5d 20 3d 20 7b e[L_CODES+2] = {
2d80: 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 \n");. for (i
2d90: 20 3d 20 30 3b 20 69 20 3c 20 4c 5f 43 4f 44 45 = 0; i < L_CODE
2da0: 53 2b 32 3b 20 69 2b 2b 29 20 7b 0a 09 66 70 72 S+2; i++) {..fpr
2db0: 69 6e 74 66 28 68 65 61 64 65 72 2c 20 22 7b 7b intf(header, "{{
2dc0: 25 33 75 7d 2c 7b 25 33 75 7d 7d 25 73 22 2c 20 %3u},{%3u}}%s",
2dd0: 73 74 61 74 69 63 5f 6c 74 72 65 65 5b 69 5d 2e static_ltree[i].
2de0: 43 6f 64 65 2c 0a 09 09 73 74 61 74 69 63 5f 6c Code,...static_l
2df0: 74 72 65 65 5b 69 5d 2e 4c 65 6e 2c 20 53 45 50 tree[i].Len, SEP
2e00: 41 52 41 54 4f 52 28 69 2c 20 4c 5f 43 4f 44 45 ARATOR(i, L_CODE
2e10: 53 2b 31 2c 20 35 29 29 3b 0a 20 20 20 20 7d 0a S+1, 5));. }.
2e20: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 68 65 61 . fprintf(hea
2e30: 64 65 72 2c 20 22 6c 6f 63 61 6c 20 63 6f 6e 73 der, "local cons
2e40: 74 20 63 74 5f 64 61 74 61 20 73 74 61 74 69 63 t ct_data static
2e50: 5f 64 74 72 65 65 5b 44 5f 43 4f 44 45 53 5d 20 _dtree[D_CODES]
2e60: 3d 20 7b 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 = {\n");. for
2e70: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 44 5f 43 (i = 0; i < D_C
2e80: 4f 44 45 53 3b 20 69 2b 2b 29 20 7b 0a 09 66 70 ODES; i++) {..fp
2e90: 72 69 6e 74 66 28 68 65 61 64 65 72 2c 20 22 7b rintf(header, "{
2ea0: 7b 25 32 75 7d 2c 7b 25 32 75 7d 7d 25 73 22 2c {%2u},{%2u}}%s",
2eb0: 20 73 74 61 74 69 63 5f 64 74 72 65 65 5b 69 5d static_dtree[i]
2ec0: 2e 43 6f 64 65 2c 0a 09 09 73 74 61 74 69 63 5f .Code,...static_
2ed0: 64 74 72 65 65 5b 69 5d 2e 4c 65 6e 2c 20 53 45 dtree[i].Len, SE
2ee0: 50 41 52 41 54 4f 52 28 69 2c 20 44 5f 43 4f 44 PARATOR(i, D_COD
2ef0: 45 53 2d 31 2c 20 35 29 29 3b 0a 20 20 20 20 7d ES-1, 5));. }
2f00: 0a 0a 20 20 20 20 66 70 72 69 6e 74 66 28 68 65 .. fprintf(he
2f10: 61 64 65 72 2c 20 22 63 6f 6e 73 74 20 75 63 68 ader, "const uch
2f20: 20 5f 64 69 73 74 5f 63 6f 64 65 5b 44 49 53 54 _dist_code[DIST
2f30: 5f 43 4f 44 45 5f 4c 45 4e 5d 20 3d 20 7b 5c 6e _CODE_LEN] = {\n
2f40: 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d ");. for (i =
2f50: 20 30 3b 20 69 20 3c 20 44 49 53 54 5f 43 4f 44 0; i < DIST_COD
2f60: 45 5f 4c 45 4e 3b 20 69 2b 2b 29 20 7b 0a 09 66 E_LEN; i++) {..f
2f70: 70 72 69 6e 74 66 28 68 65 61 64 65 72 2c 20 22 printf(header, "
2f80: 25 32 75 25 73 22 2c 20 5f 64 69 73 74 5f 63 6f %2u%s", _dist_co
2f90: 64 65 5b 69 5d 2c 0a 09 09 53 45 50 41 52 41 54 de[i],...SEPARAT
2fa0: 4f 52 28 69 2c 20 44 49 53 54 5f 43 4f 44 45 5f OR(i, DIST_CODE_
2fb0: 4c 45 4e 2d 31 2c 20 32 30 29 29 3b 0a 20 20 20 LEN-1, 20));.
2fc0: 20 7d 0a 0a 20 20 20 20 66 70 72 69 6e 74 66 28 }.. fprintf(
2fd0: 68 65 61 64 65 72 2c 20 22 63 6f 6e 73 74 20 75 header, "const u
2fe0: 63 68 20 5f 6c 65 6e 67 74 68 5f 63 6f 64 65 5b ch _length_code[
2ff0: 4d 41 58 5f 4d 41 54 43 48 2d 4d 49 4e 5f 4d 41 MAX_MATCH-MIN_MA
3000: 54 43 48 2b 31 5d 3d 20 7b 5c 6e 22 29 3b 0a 20 TCH+1]= {\n");.
3010: 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 for (i = 0; i
3020: 20 3c 20 4d 41 58 5f 4d 41 54 43 48 2d 4d 49 4e < MAX_MATCH-MIN
3030: 5f 4d 41 54 43 48 2b 31 3b 20 69 2b 2b 29 20 7b _MATCH+1; i++) {
3040: 0a 09 66 70 72 69 6e 74 66 28 68 65 61 64 65 72 ..fprintf(header
3050: 2c 20 22 25 32 75 25 73 22 2c 20 5f 6c 65 6e 67 , "%2u%s", _leng
3060: 74 68 5f 63 6f 64 65 5b 69 5d 2c 0a 09 09 53 45 th_code[i],...SE
3070: 50 41 52 41 54 4f 52 28 69 2c 20 4d 41 58 5f 4d PARATOR(i, MAX_M
3080: 41 54 43 48 2d 4d 49 4e 5f 4d 41 54 43 48 2c 20 ATCH-MIN_MATCH,
3090: 32 30 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20));. }..
30a0: 20 66 70 72 69 6e 74 66 28 68 65 61 64 65 72 2c fprintf(header,
30b0: 20 22 6c 6f 63 61 6c 20 63 6f 6e 73 74 20 69 6e "local const in
30c0: 74 20 62 61 73 65 5f 6c 65 6e 67 74 68 5b 4c 45 t base_length[LE
30d0: 4e 47 54 48 5f 43 4f 44 45 53 5d 20 3d 20 7b 5c NGTH_CODES] = {\
30e0: 6e 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 n");. for (i
30f0: 3d 20 30 3b 20 69 20 3c 20 4c 45 4e 47 54 48 5f = 0; i < LENGTH_
3100: 43 4f 44 45 53 3b 20 69 2b 2b 29 20 7b 0a 09 66 CODES; i++) {..f
3110: 70 72 69 6e 74 66 28 68 65 61 64 65 72 2c 20 22 printf(header, "
3120: 25 31 75 25 73 22 2c 20 62 61 73 65 5f 6c 65 6e %1u%s", base_len
3130: 67 74 68 5b 69 5d 2c 0a 09 09 53 45 50 41 52 41 gth[i],...SEPARA
3140: 54 4f 52 28 69 2c 20 4c 45 4e 47 54 48 5f 43 4f TOR(i, LENGTH_CO
3150: 44 45 53 2d 31 2c 20 32 30 29 29 3b 0a 20 20 20 DES-1, 20));.
3160: 20 7d 0a 0a 20 20 20 20 66 70 72 69 6e 74 66 28 }.. fprintf(
3170: 68 65 61 64 65 72 2c 20 22 6c 6f 63 61 6c 20 63 header, "local c
3180: 6f 6e 73 74 20 69 6e 74 20 62 61 73 65 5f 64 69 onst int base_di
3190: 73 74 5b 44 5f 43 4f 44 45 53 5d 20 3d 20 7b 5c st[D_CODES] = {\
31a0: 6e 22 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 n");. for (i
31b0: 3d 20 30 3b 20 69 20 3c 20 44 5f 43 4f 44 45 53 = 0; i < D_CODES
31c0: 3b 20 69 2b 2b 29 20 7b 0a 09 66 70 72 69 6e 74 ; i++) {..fprint
31d0: 66 28 68 65 61 64 65 72 2c 20 22 25 35 75 25 73 f(header, "%5u%s
31e0: 22 2c 20 62 61 73 65 5f 64 69 73 74 5b 69 5d 2c ", base_dist[i],
31f0: 0a 09 09 53 45 50 41 52 41 54 4f 52 28 69 2c 20 ...SEPARATOR(i,
3200: 44 5f 43 4f 44 45 53 2d 31 2c 20 31 30 29 29 3b D_CODES-1, 10));
3210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 63 6c 6f . }.. fclo
3220: 73 65 28 68 65 61 64 65 72 29 3b 0a 7d 0a 23 65 se(header);.}.#e
3230: 6e 64 69 66 20 2f 2a 20 47 45 4e 5f 54 52 45 45 ndif /* GEN_TREE
3240: 53 5f 48 20 2a 2f 0a 0a 2f 2a 20 3d 3d 3d 3d 3d S_H */../* =====
3250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3290: 3d 3d 3d 3d 3d 3d 0a 20 2a 20 49 6e 69 74 69 61 ======. * Initia
32a0: 6c 69 7a 65 20 74 68 65 20 74 72 65 65 20 64 61 lize the tree da
32b0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f ta structures fo
32c0: 72 20 61 20 6e 65 77 20 7a 6c 69 62 20 73 74 72 r a new zlib str
32d0: 65 61 6d 2e 0a 20 2a 2f 0a 76 6f 69 64 20 5f 74 eam.. */.void _t
32e0: 72 5f 69 6e 69 74 28 73 29 0a 20 20 20 20 64 65 r_init(s). de
32f0: 66 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0a flate_state *s;.
3300: 7b 0a 20 20 20 20 74 72 5f 73 74 61 74 69 63 5f {. tr_static_
3310: 69 6e 69 74 28 29 3b 0a 0a 20 20 20 20 73 2d 3e init();.. s->
3320: 6c 5f 64 65 73 63 2e 64 79 6e 5f 74 72 65 65 20 l_desc.dyn_tree
3330: 3d 20 73 2d 3e 64 79 6e 5f 6c 74 72 65 65 3b 0a = s->dyn_ltree;.
3340: 20 20 20 20 73 2d 3e 6c 5f 64 65 73 63 2e 73 74 s->l_desc.st
3350: 61 74 5f 64 65 73 63 20 3d 20 26 73 74 61 74 69 at_desc = &stati
3360: 63 5f 6c 5f 64 65 73 63 3b 0a 0a 20 20 20 20 73 c_l_desc;.. s
3370: 2d 3e 64 5f 64 65 73 63 2e 64 79 6e 5f 74 72 65 ->d_desc.dyn_tre
3380: 65 20 3d 20 73 2d 3e 64 79 6e 5f 64 74 72 65 65 e = s->dyn_dtree
3390: 3b 0a 20 20 20 20 73 2d 3e 64 5f 64 65 73 63 2e ;. s->d_desc.
33a0: 73 74 61 74 5f 64 65 73 63 20 3d 20 26 73 74 61 stat_desc = &sta
33b0: 74 69 63 5f 64 5f 64 65 73 63 3b 0a 0a 20 20 20 tic_d_desc;..
33c0: 20 73 2d 3e 62 6c 5f 64 65 73 63 2e 64 79 6e 5f s->bl_desc.dyn_
33d0: 74 72 65 65 20 3d 20 73 2d 3e 62 6c 5f 74 72 65 tree = s->bl_tre
33e0: 65 3b 0a 20 20 20 20 73 2d 3e 62 6c 5f 64 65 73 e;. s->bl_des
33f0: 63 2e 73 74 61 74 5f 64 65 73 63 20 3d 20 26 73 c.stat_desc = &s
3400: 74 61 74 69 63 5f 62 6c 5f 64 65 73 63 3b 0a 0a tatic_bl_desc;..
3410: 20 20 20 20 73 2d 3e 62 69 5f 62 75 66 20 3d 20 s->bi_buf =
3420: 30 3b 0a 20 20 20 20 73 2d 3e 62 69 5f 76 61 6c 0;. s->bi_val
3430: 69 64 20 3d 20 30 3b 0a 20 20 20 20 73 2d 3e 6c id = 0;. s->l
3440: 61 73 74 5f 65 6f 62 5f 6c 65 6e 20 3d 20 38 3b ast_eob_len = 8;
3450: 20 2f 2a 20 65 6e 6f 75 67 68 20 6c 6f 6f 6b 61 /* enough looka
3460: 68 65 61 64 20 66 6f 72 20 69 6e 66 6c 61 74 65 head for inflate
3470: 20 2a 2f 0a 23 69 66 64 65 66 20 44 45 42 55 47 */.#ifdef DEBUG
3480: 0a 20 20 20 20 73 2d 3e 63 6f 6d 70 72 65 73 73 . s->compress
3490: 65 64 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 ed_len = 0L;.
34a0: 20 73 2d 3e 62 69 74 73 5f 73 65 6e 74 20 3d 20 s->bits_sent =
34b0: 30 4c 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 0L;.#endif..
34c0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 /* Initialize th
34d0: 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 6f 66 e first block of
34e0: 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65 3a the first file:
34f0: 20 2a 2f 0a 20 20 20 20 69 6e 69 74 5f 62 6c 6f */. init_blo
3500: 63 6b 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d ck(s);.}../* ===
3510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3550: 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 49 6e 69 74 ========. * Init
3560: 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 62 6c 6f ialize a new blo
3570: 63 6b 2e 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 76 6f ck.. */.local vo
3580: 69 64 20 69 6e 69 74 5f 62 6c 6f 63 6b 28 73 29 id init_block(s)
3590: 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 . deflate_sta
35a0: 74 65 20 2a 73 3b 0a 7b 0a 20 20 20 20 69 6e 74 te *s;.{. int
35b0: 20 6e 3b 20 2f 2a 20 69 74 65 72 61 74 65 73 20 n; /* iterates
35c0: 6f 76 65 72 20 74 72 65 65 20 65 6c 65 6d 65 6e over tree elemen
35d0: 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 6e ts */.. /* In
35e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 72 65 itialize the tre
35f0: 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 es. */. for (
3600: 6e 20 3d 20 30 3b 20 6e 20 3c 20 4c 5f 43 4f 44 n = 0; n < L_COD
3610: 45 53 3b 20 20 6e 2b 2b 29 20 73 2d 3e 64 79 6e ES; n++) s->dyn
3620: 5f 6c 74 72 65 65 5b 6e 5d 2e 46 72 65 71 20 3d _ltree[n].Freq =
3630: 20 30 3b 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 0;. for (n =
3640: 20 30 3b 20 6e 20 3c 20 44 5f 43 4f 44 45 53 3b 0; n < D_CODES;
3650: 20 20 6e 2b 2b 29 20 73 2d 3e 64 79 6e 5f 64 74 n++) s->dyn_dt
3660: 72 65 65 5b 6e 5d 2e 46 72 65 71 20 3d 20 30 3b ree[n].Freq = 0;
3670: 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b . for (n = 0;
3680: 20 6e 20 3c 20 42 4c 5f 43 4f 44 45 53 3b 20 6e n < BL_CODES; n
3690: 2b 2b 29 20 73 2d 3e 62 6c 5f 74 72 65 65 5b 6e ++) s->bl_tree[n
36a0: 5d 2e 46 72 65 71 20 3d 20 30 3b 0a 0a 20 20 20 ].Freq = 0;..
36b0: 20 73 2d 3e 64 79 6e 5f 6c 74 72 65 65 5b 45 4e s->dyn_ltree[EN
36c0: 44 5f 42 4c 4f 43 4b 5d 2e 46 72 65 71 20 3d 20 D_BLOCK].Freq =
36d0: 31 3b 0a 20 20 20 20 73 2d 3e 6f 70 74 5f 6c 65 1;. s->opt_le
36e0: 6e 20 3d 20 73 2d 3e 73 74 61 74 69 63 5f 6c 65 n = s->static_le
36f0: 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 73 2d 3e 6c n = 0L;. s->l
3700: 61 73 74 5f 6c 69 74 20 3d 20 73 2d 3e 6d 61 74 ast_lit = s->mat
3710: 63 68 65 73 20 3d 20 30 3b 0a 7d 0a 0a 23 64 65 ches = 0;.}..#de
3720: 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 20 31 0a fine SMALLEST 1.
3730: 2f 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20 /* Index within
3740: 74 68 65 20 68 65 61 70 20 61 72 72 61 79 20 6f the heap array o
3750: 66 20 6c 65 61 73 74 20 66 72 65 71 75 65 6e 74 f least frequent
3760: 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 48 75 66 node in the Huf
3770: 66 6d 61 6e 20 74 72 65 65 20 2a 2f 0a 0a 0a 2f fman tree */.../
3780: 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d * ==============
3790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a =============. *
37d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6d 61 6c Remove the smal
37e0: 6c 65 73 74 20 65 6c 65 6d 65 6e 74 20 66 72 6f lest element fro
37f0: 6d 20 74 68 65 20 68 65 61 70 20 61 6e 64 20 72 m the heap and r
3800: 65 63 72 65 61 74 65 20 74 68 65 20 68 65 61 70 ecreate the heap
3810: 20 77 69 74 68 0a 20 2a 20 6f 6e 65 20 6c 65 73 with. * one les
3820: 73 20 65 6c 65 6d 65 6e 74 2e 20 55 70 64 61 74 s element. Updat
3830: 65 73 20 68 65 61 70 20 61 6e 64 20 68 65 61 70 es heap and heap
3840: 5f 6c 65 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e _len.. */.#defin
3850: 65 20 70 71 72 65 6d 6f 76 65 28 73 2c 20 74 72 e pqremove(s, tr
3860: 65 65 2c 20 74 6f 70 29 20 5c 0a 7b 5c 0a 20 20 ee, top) \.{\.
3870: 20 20 74 6f 70 20 3d 20 73 2d 3e 68 65 61 70 5b top = s->heap[
3880: 53 4d 41 4c 4c 45 53 54 5d 3b 20 5c 0a 20 20 20 SMALLEST]; \.
3890: 20 73 2d 3e 68 65 61 70 5b 53 4d 41 4c 4c 45 53 s->heap[SMALLES
38a0: 54 5d 20 3d 20 73 2d 3e 68 65 61 70 5b 73 2d 3e T] = s->heap[s->
38b0: 68 65 61 70 5f 6c 65 6e 2d 2d 5d 3b 20 5c 0a 20 heap_len--]; \.
38c0: 20 20 20 70 71 64 6f 77 6e 68 65 61 70 28 73 2c pqdownheap(s,
38d0: 20 74 72 65 65 2c 20 53 4d 41 4c 4c 45 53 54 29 tree, SMALLEST)
38e0: 3b 20 5c 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d ; \.}../* ======
38f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3930: 3d 3d 3d 3d 3d 0a 20 2a 20 43 6f 6d 70 61 72 65 =====. * Compare
3940: 73 20 74 6f 20 73 75 62 74 72 65 65 73 2c 20 75 s to subtrees, u
3950: 73 69 6e 67 20 74 68 65 20 74 72 65 65 20 64 65 sing the tree de
3960: 70 74 68 20 61 73 20 74 69 65 20 62 72 65 61 6b pth as tie break
3970: 65 72 20 77 68 65 6e 0a 20 2a 20 74 68 65 20 73 er when. * the s
3980: 75 62 74 72 65 65 73 20 68 61 76 65 20 65 71 75 ubtrees have equ
3990: 61 6c 20 66 72 65 71 75 65 6e 63 79 2e 20 54 68 al frequency. Th
39a0: 69 73 20 6d 69 6e 69 6d 69 7a 65 73 20 74 68 65 is minimizes the
39b0: 20 77 6f 72 73 74 20 63 61 73 65 20 6c 65 6e 67 worst case leng
39c0: 74 68 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 th.. */.#define
39d0: 73 6d 61 6c 6c 65 72 28 74 72 65 65 2c 20 6e 2c smaller(tree, n,
39e0: 20 6d 2c 20 64 65 70 74 68 29 20 5c 0a 20 20 20 m, depth) \.
39f0: 28 74 72 65 65 5b 6e 5d 2e 46 72 65 71 20 3c 20 (tree[n].Freq <
3a00: 74 72 65 65 5b 6d 5d 2e 46 72 65 71 20 7c 7c 20 tree[m].Freq ||
3a10: 5c 0a 20 20 20 28 74 72 65 65 5b 6e 5d 2e 46 72 \. (tree[n].Fr
3a20: 65 71 20 3d 3d 20 74 72 65 65 5b 6d 5d 2e 46 72 eq == tree[m].Fr
3a30: 65 71 20 26 26 20 64 65 70 74 68 5b 6e 5d 20 3c eq && depth[n] <
3a40: 3d 20 64 65 70 74 68 5b 6d 5d 29 29 0a 0a 2f 2a = depth[m]))../*
3a50: 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ===============
3a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 ============. *
3aa0: 52 65 73 74 6f 72 65 20 74 68 65 20 68 65 61 70 Restore the heap
3ab0: 20 70 72 6f 70 65 72 74 79 20 62 79 20 6d 6f 76 property by mov
3ac0: 69 6e 67 20 64 6f 77 6e 20 74 68 65 20 74 72 65 ing down the tre
3ad0: 65 20 73 74 61 72 74 69 6e 67 20 61 74 20 6e 6f e starting at no
3ae0: 64 65 20 6b 2c 0a 20 2a 20 65 78 63 68 61 6e 67 de k,. * exchang
3af0: 69 6e 67 20 61 20 6e 6f 64 65 20 77 69 74 68 20 ing a node with
3b00: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6f 66 20 the smallest of
3b10: 69 74 73 20 74 77 6f 20 73 6f 6e 73 20 69 66 20 its two sons if
3b20: 6e 65 63 65 73 73 61 72 79 2c 20 73 74 6f 70 70 necessary, stopp
3b30: 69 6e 67 0a 20 2a 20 77 68 65 6e 20 74 68 65 20 ing. * when the
3b40: 68 65 61 70 20 70 72 6f 70 65 72 74 79 20 69 73 heap property is
3b50: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 20 re-established
3b60: 28 65 61 63 68 20 66 61 74 68 65 72 20 73 6d 61 (each father sma
3b70: 6c 6c 65 72 20 74 68 61 6e 20 69 74 73 0a 20 2a ller than its. *
3b80: 20 74 77 6f 20 73 6f 6e 73 29 2e 0a 20 2a 2f 0a two sons).. */.
3b90: 6c 6f 63 61 6c 20 76 6f 69 64 20 70 71 64 6f 77 local void pqdow
3ba0: 6e 68 65 61 70 28 73 2c 20 74 72 65 65 2c 20 6b nheap(s, tree, k
3bb0: 29 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 ). deflate_st
3bc0: 61 74 65 20 2a 73 3b 0a 20 20 20 20 63 74 5f 64 ate *s;. ct_d
3bd0: 61 74 61 20 2a 74 72 65 65 3b 20 20 2f 2a 20 74 ata *tree; /* t
3be0: 68 65 20 74 72 65 65 20 74 6f 20 72 65 73 74 6f he tree to resto
3bf0: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6b 3b re */. int k;
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
3c10: 2a 20 6e 6f 64 65 20 74 6f 20 6d 6f 76 65 20 64 * node to move d
3c20: 6f 77 6e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 own */.{. int
3c30: 20 76 20 3d 20 73 2d 3e 68 65 61 70 5b 6b 5d 3b v = s->heap[k];
3c40: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 6b 20 3c . int j = k <
3c50: 3c 20 31 3b 20 20 2f 2a 20 6c 65 66 74 20 73 6f < 1; /* left so
3c60: 6e 20 6f 66 20 6b 20 2a 2f 0a 20 20 20 20 77 68 n of k */. wh
3c70: 69 6c 65 20 28 6a 20 3c 3d 20 73 2d 3e 68 65 61 ile (j <= s->hea
3c80: 70 5f 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 p_len) {.
3c90: 20 2f 2a 20 53 65 74 20 6a 20 74 6f 20 74 68 65 /* Set j to the
3ca0: 20 73 6d 61 6c 6c 65 73 74 20 6f 66 20 74 68 65 smallest of the
3cb0: 20 74 77 6f 20 73 6f 6e 73 3a 20 2a 2f 0a 20 20 two sons: */.
3cc0: 20 20 20 20 20 20 69 66 20 28 6a 20 3c 20 73 2d if (j < s-
3cd0: 3e 68 65 61 70 5f 6c 65 6e 20 26 26 0a 20 20 20 >heap_len &&.
3ce0: 20 20 20 20 20 20 20 20 20 73 6d 61 6c 6c 65 72 smaller
3cf0: 28 74 72 65 65 2c 20 73 2d 3e 68 65 61 70 5b 6a (tree, s->heap[j
3d00: 2b 31 5d 2c 20 73 2d 3e 68 65 61 70 5b 6a 5d 2c +1], s->heap[j],
3d10: 20 73 2d 3e 64 65 70 74 68 29 29 20 7b 0a 20 20 s->depth)) {.
3d20: 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 j++;.
3d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
3d40: 20 2f 2a 20 45 78 69 74 20 69 66 20 76 20 69 73 /* Exit if v is
3d50: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 62 6f smaller than bo
3d60: 74 68 20 73 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 th sons */.
3d70: 20 20 20 69 66 20 28 73 6d 61 6c 6c 65 72 28 74 if (smaller(t
3d80: 72 65 65 2c 20 76 2c 20 73 2d 3e 68 65 61 70 5b ree, v, s->heap[
3d90: 6a 5d 2c 20 73 2d 3e 64 65 70 74 68 29 29 20 62 j], s->depth)) b
3da0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f reak;.. /
3db0: 2a 20 45 78 63 68 61 6e 67 65 20 76 20 77 69 74 * Exchange v wit
3dc0: 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 73 h the smallest s
3dd0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 2d on */. s-
3de0: 3e 68 65 61 70 5b 6b 5d 20 3d 20 73 2d 3e 68 65 >heap[k] = s->he
3df0: 61 70 5b 6a 5d 3b 20 20 6b 20 3d 20 6a 3b 0a 0a ap[j]; k = j;..
3e00: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 64 20 63 /* And c
3e10: 6f 6e 74 69 6e 75 65 20 64 6f 77 6e 20 74 68 65 ontinue down the
3e20: 20 74 72 65 65 2c 20 73 65 74 74 69 6e 67 20 6a tree, setting j
3e30: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 73 6f 6e to the left son
3e40: 20 6f 66 20 6b 20 2a 2f 0a 20 20 20 20 20 20 20 of k */.
3e50: 20 6a 20 3c 3c 3d 20 31 3b 0a 20 20 20 20 7d 0a j <<= 1;. }.
3e60: 20 20 20 20 73 2d 3e 68 65 61 70 5b 6b 5d 20 3d s->heap[k] =
3e70: 20 76 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d v;.}../* ======
3e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ec0: 3d 3d 3d 3d 3d 0a 20 2a 20 43 6f 6d 70 75 74 65 =====. * Compute
3ed0: 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 62 69 74 the optimal bit
3ee0: 20 6c 65 6e 67 74 68 73 20 66 6f 72 20 61 20 74 lengths for a t
3ef0: 72 65 65 20 61 6e 64 20 75 70 64 61 74 65 20 74 ree and update t
3f00: 68 65 20 74 6f 74 61 6c 20 62 69 74 20 6c 65 6e he total bit len
3f10: 67 74 68 0a 20 2a 20 66 6f 72 20 74 68 65 20 63 gth. * for the c
3f20: 75 72 72 65 6e 74 20 62 6c 6f 63 6b 2e 0a 20 2a urrent block.. *
3f30: 20 49 4e 20 61 73 73 65 72 74 69 6f 6e 3a 20 74 IN assertion: t
3f40: 68 65 20 66 69 65 6c 64 73 20 66 72 65 71 20 61 he fields freq a
3f50: 6e 64 20 64 61 64 20 61 72 65 20 73 65 74 2c 20 nd dad are set,
3f60: 68 65 61 70 5b 68 65 61 70 5f 6d 61 78 5d 20 61 heap[heap_max] a
3f70: 6e 64 0a 20 2a 20 20 20 20 61 62 6f 76 65 20 61 nd. * above a
3f80: 72 65 20 74 68 65 20 74 72 65 65 20 6e 6f 64 65 re the tree node
3f90: 73 20 73 6f 72 74 65 64 20 62 79 20 69 6e 63 72 s sorted by incr
3fa0: 65 61 73 69 6e 67 20 66 72 65 71 75 65 6e 63 79 easing frequency
3fb0: 2e 0a 20 2a 20 4f 55 54 20 61 73 73 65 72 74 69 .. * OUT asserti
3fc0: 6f 6e 73 3a 20 74 68 65 20 66 69 65 6c 64 20 6c ons: the field l
3fd0: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 en is set to the
3fe0: 20 6f 70 74 69 6d 61 6c 20 62 69 74 20 6c 65 6e optimal bit len
3ff0: 67 74 68 2c 20 74 68 65 0a 20 2a 20 20 20 20 20 gth, the. *
4000: 61 72 72 61 79 20 62 6c 5f 63 6f 75 6e 74 20 63 array bl_count c
4010: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 72 65 71 ontains the freq
4020: 75 65 6e 63 69 65 73 20 66 6f 72 20 65 61 63 68 uencies for each
4030: 20 62 69 74 20 6c 65 6e 67 74 68 2e 0a 20 2a 20 bit length.. *
4040: 20 20 20 20 54 68 65 20 6c 65 6e 67 74 68 20 6f The length o
4050: 70 74 5f 6c 65 6e 20 69 73 20 75 70 64 61 74 65 pt_len is update
4060: 64 3b 20 73 74 61 74 69 63 5f 6c 65 6e 20 69 73 d; static_len is
4070: 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 69 66 also updated if
4080: 20 73 74 72 65 65 20 69 73 0a 20 2a 20 20 20 20 stree is. *
4090: 20 6e 6f 74 20 6e 75 6c 6c 2e 0a 20 2a 2f 0a 6c not null.. */.l
40a0: 6f 63 61 6c 20 76 6f 69 64 20 67 65 6e 5f 62 69 ocal void gen_bi
40b0: 74 6c 65 6e 28 73 2c 20 64 65 73 63 29 0a 20 20 tlen(s, desc).
40c0: 20 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 deflate_state
40d0: 2a 73 3b 0a 20 20 20 20 74 72 65 65 5f 64 65 73 *s;. tree_des
40e0: 63 20 2a 64 65 73 63 3b 20 20 20 20 2f 2a 20 74 c *desc; /* t
40f0: 68 65 20 74 72 65 65 20 64 65 73 63 72 69 70 74 he tree descript
4100: 6f 72 20 2a 2f 0a 7b 0a 20 20 20 20 63 74 5f 64 or */.{. ct_d
4110: 61 74 61 20 2a 74 72 65 65 20 20 20 20 20 20 20 ata *tree
4120: 20 3d 20 64 65 73 63 2d 3e 64 79 6e 5f 74 72 65 = desc->dyn_tre
4130: 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 78 5f 63 e;. int max_c
4140: 6f 64 65 20 20 20 20 20 20 20 20 20 3d 20 64 65 ode = de
4150: 73 63 2d 3e 6d 61 78 5f 63 6f 64 65 3b 0a 20 20 sc->max_code;.
4160: 20 20 63 6f 6e 73 74 20 63 74 5f 64 61 74 61 20 const ct_data
4170: 2a 73 74 72 65 65 20 3d 20 64 65 73 63 2d 3e 73 *stree = desc->s
4180: 74 61 74 5f 64 65 73 63 2d 3e 73 74 61 74 69 63 tat_desc->static
4190: 5f 74 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74 _tree;. const
41a0: 20 69 6e 74 66 20 2a 65 78 74 72 61 20 20 20 20 intf *extra
41b0: 3d 20 64 65 73 63 2d 3e 73 74 61 74 5f 64 65 73 = desc->stat_des
41c0: 63 2d 3e 65 78 74 72 61 5f 62 69 74 73 3b 0a 20 c->extra_bits;.
41d0: 20 20 20 69 6e 74 20 62 61 73 65 20 20 20 20 20 int base
41e0: 20 20 20 20 20 20 20 20 3d 20 64 65 73 63 2d 3e = desc->
41f0: 73 74 61 74 5f 64 65 73 63 2d 3e 65 78 74 72 61 stat_desc->extra
4200: 5f 62 61 73 65 3b 0a 20 20 20 20 69 6e 74 20 6d _base;. int m
4210: 61 78 5f 6c 65 6e 67 74 68 20 20 20 20 20 20 20 ax_length
4220: 3d 20 64 65 73 63 2d 3e 73 74 61 74 5f 64 65 73 = desc->stat_des
4230: 63 2d 3e 6d 61 78 5f 6c 65 6e 67 74 68 3b 0a 20 c->max_length;.
4240: 20 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 int h;
4250: 20 20 20 20 20 20 20 2f 2a 20 68 65 61 70 20 69 /* heap i
4260: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ndex */. int
4270: 6e 2c 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 n, m;
4280: 2f 2a 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 /* iterate over
4290: 74 68 65 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 the tree element
42a0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 69 74 s */. int bit
42b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 s; /*
42c0: 62 69 74 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 bit length */.
42d0: 20 20 69 6e 74 20 78 62 69 74 73 3b 20 20 20 20 int xbits;
42e0: 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 20 62 /* extra b
42f0: 69 74 73 20 2a 2f 0a 20 20 20 20 75 73 68 20 66 its */. ush f
4300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
4310: 2a 20 66 72 65 71 75 65 6e 63 79 20 2a 2f 0a 20 * frequency */.
4320: 20 20 20 69 6e 74 20 6f 76 65 72 66 6c 6f 77 20 int overflow
4330: 3d 20 30 3b 20 20 20 2f 2a 20 6e 75 6d 62 65 72 = 0; /* number
4340: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 77 69 74 of elements wit
4350: 68 20 62 69 74 20 6c 65 6e 67 74 68 20 74 6f 6f h bit length too
4360: 20 6c 61 72 67 65 20 2a 2f 0a 0a 20 20 20 20 66 large */.. f
4370: 6f 72 20 28 62 69 74 73 20 3d 20 30 3b 20 62 69 or (bits = 0; bi
4380: 74 73 20 3c 3d 20 4d 41 58 5f 42 49 54 53 3b 20 ts <= MAX_BITS;
4390: 62 69 74 73 2b 2b 29 20 73 2d 3e 62 6c 5f 63 6f bits++) s->bl_co
43a0: 75 6e 74 5b 62 69 74 73 5d 20 3d 20 30 3b 0a 0a unt[bits] = 0;..
43b0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 66 69 72 73 /* In a firs
43c0: 74 20 70 61 73 73 2c 20 63 6f 6d 70 75 74 65 20 t pass, compute
43d0: 74 68 65 20 6f 70 74 69 6d 61 6c 20 62 69 74 20 the optimal bit
43e0: 6c 65 6e 67 74 68 73 20 28 77 68 69 63 68 20 6d lengths (which m
43f0: 61 79 0a 20 20 20 20 20 2a 20 6f 76 65 72 66 6c ay. * overfl
4400: 6f 77 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f ow in the case o
4410: 66 20 74 68 65 20 62 69 74 20 6c 65 6e 67 74 68 f the bit length
4420: 20 74 72 65 65 29 2e 0a 20 20 20 20 20 2a 2f 0a tree).. */.
4430: 20 20 20 20 74 72 65 65 5b 73 2d 3e 68 65 61 70 tree[s->heap
4440: 5b 73 2d 3e 68 65 61 70 5f 6d 61 78 5d 5d 2e 4c [s->heap_max]].L
4450: 65 6e 20 3d 20 30 3b 20 2f 2a 20 72 6f 6f 74 20 en = 0; /* root
4460: 6f 66 20 74 68 65 20 68 65 61 70 20 2a 2f 0a 0a of the heap */..
4470: 20 20 20 20 66 6f 72 20 28 68 20 3d 20 73 2d 3e for (h = s->
4480: 68 65 61 70 5f 6d 61 78 2b 31 3b 20 68 20 3c 20 heap_max+1; h <
4490: 48 45 41 50 5f 53 49 5a 45 3b 20 68 2b 2b 29 20 HEAP_SIZE; h++)
44a0: 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73 2d {. n = s-
44b0: 3e 68 65 61 70 5b 68 5d 3b 0a 20 20 20 20 20 20 >heap[h];.
44c0: 20 20 62 69 74 73 20 3d 20 74 72 65 65 5b 74 72 bits = tree[tr
44d0: 65 65 5b 6e 5d 2e 44 61 64 5d 2e 4c 65 6e 20 2b ee[n].Dad].Len +
44e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 1;. if (
44f0: 62 69 74 73 20 3e 20 6d 61 78 5f 6c 65 6e 67 74 bits > max_lengt
4500: 68 29 20 62 69 74 73 20 3d 20 6d 61 78 5f 6c 65 h) bits = max_le
4510: 6e 67 74 68 2c 20 6f 76 65 72 66 6c 6f 77 2b 2b ngth, overflow++
4520: 3b 0a 20 20 20 20 20 20 20 20 74 72 65 65 5b 6e ;. tree[n
4530: 5d 2e 4c 65 6e 20 3d 20 28 75 73 68 29 62 69 74 ].Len = (ush)bit
4540: 73 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 s;. /* We
4550: 20 6f 76 65 72 77 72 69 74 65 20 74 72 65 65 5b overwrite tree[
4560: 6e 5d 2e 44 61 64 20 77 68 69 63 68 20 69 73 20 n].Dad which is
4570: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 no longer needed
4580: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 20 */.. if
4590: 28 6e 20 3e 20 6d 61 78 5f 63 6f 64 65 29 20 63 (n > max_code) c
45a0: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 6e 6f 74 20 ontinue; /* not
45b0: 61 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 0a a leaf node */..
45c0: 20 20 20 20 20 20 20 20 73 2d 3e 62 6c 5f 63 6f s->bl_co
45d0: 75 6e 74 5b 62 69 74 73 5d 2b 2b 3b 0a 20 20 20 unt[bits]++;.
45e0: 20 20 20 20 20 78 62 69 74 73 20 3d 20 30 3b 0a xbits = 0;.
45f0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 20 3e 3d if (n >=
4600: 20 62 61 73 65 29 20 78 62 69 74 73 20 3d 20 65 base) xbits = e
4610: 78 74 72 61 5b 6e 2d 62 61 73 65 5d 3b 0a 20 20 xtra[n-base];.
4620: 20 20 20 20 20 20 66 20 3d 20 74 72 65 65 5b 6e f = tree[n
4630: 5d 2e 46 72 65 71 3b 0a 20 20 20 20 20 20 20 20 ].Freq;.
4640: 73 2d 3e 6f 70 74 5f 6c 65 6e 20 2b 3d 20 28 75 s->opt_len += (u
4650: 6c 67 29 66 20 2a 20 28 62 69 74 73 20 2b 20 78 lg)f * (bits + x
4660: 62 69 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 bits);. i
4670: 66 20 28 73 74 72 65 65 29 20 73 2d 3e 73 74 61 f (stree) s->sta
4680: 74 69 63 5f 6c 65 6e 20 2b 3d 20 28 75 6c 67 29 tic_len += (ulg)
4690: 66 20 2a 20 28 73 74 72 65 65 5b 6e 5d 2e 4c 65 f * (stree[n].Le
46a0: 6e 20 2b 20 78 62 69 74 73 29 3b 0a 20 20 20 20 n + xbits);.
46b0: 7d 0a 20 20 20 20 69 66 20 28 6f 76 65 72 66 6c }. if (overfl
46c0: 6f 77 20 3d 3d 20 30 29 20 72 65 74 75 72 6e 3b ow == 0) return;
46d0: 0a 0a 20 20 20 20 54 72 61 63 65 28 28 73 74 64 .. Trace((std
46e0: 65 72 72 2c 22 5c 6e 62 69 74 20 6c 65 6e 67 74 err,"\nbit lengt
46f0: 68 20 6f 76 65 72 66 6c 6f 77 5c 6e 22 29 29 3b h overflow\n"));
4700: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 . /* This hap
4710: 70 65 6e 73 20 66 6f 72 20 65 78 61 6d 70 6c 65 pens for example
4720: 20 6f 6e 20 6f 62 6a 32 20 61 6e 64 20 70 69 63 on obj2 and pic
4730: 20 6f 66 20 74 68 65 20 43 61 6c 67 61 72 79 20 of the Calgary
4740: 63 6f 72 70 75 73 20 2a 2f 0a 0a 20 20 20 20 2f corpus */.. /
4750: 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73 74 * Find the first
4760: 20 62 69 74 20 6c 65 6e 67 74 68 20 77 68 69 63 bit length whic
4770: 68 20 63 6f 75 6c 64 20 69 6e 63 72 65 61 73 65 h could increase
4780: 3a 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 : */. do {.
4790: 20 20 20 20 20 20 62 69 74 73 20 3d 20 6d 61 78 bits = max
47a0: 5f 6c 65 6e 67 74 68 2d 31 3b 0a 20 20 20 20 20 _length-1;.
47b0: 20 20 20 77 68 69 6c 65 20 28 73 2d 3e 62 6c 5f while (s->bl_
47c0: 63 6f 75 6e 74 5b 62 69 74 73 5d 20 3d 3d 20 30 count[bits] == 0
47d0: 29 20 62 69 74 73 2d 2d 3b 0a 20 20 20 20 20 20 ) bits--;.
47e0: 20 20 73 2d 3e 62 6c 5f 63 6f 75 6e 74 5b 62 69 s->bl_count[bi
47f0: 74 73 5d 2d 2d 3b 20 20 20 20 20 20 2f 2a 20 6d ts]--; /* m
4800: 6f 76 65 20 6f 6e 65 20 6c 65 61 66 20 64 6f 77 ove one leaf dow
4810: 6e 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 n the tree */.
4820: 20 20 20 20 20 20 73 2d 3e 62 6c 5f 63 6f 75 6e s->bl_coun
4830: 74 5b 62 69 74 73 2b 31 5d 20 2b 3d 20 32 3b 20 t[bits+1] += 2;
4840: 2f 2a 20 6d 6f 76 65 20 6f 6e 65 20 6f 76 65 72 /* move one over
4850: 66 6c 6f 77 20 69 74 65 6d 20 61 73 20 69 74 73 flow item as its
4860: 20 62 72 6f 74 68 65 72 20 2a 2f 0a 20 20 20 20 brother */.
4870: 20 20 20 20 73 2d 3e 62 6c 5f 63 6f 75 6e 74 5b s->bl_count[
4880: 6d 61 78 5f 6c 65 6e 67 74 68 5d 2d 2d 3b 0a 20 max_length]--;.
4890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 72 /* The br
48a0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 6f 76 65 other of the ove
48b0: 72 66 6c 6f 77 20 69 74 65 6d 20 61 6c 73 6f 20 rflow item also
48c0: 6d 6f 76 65 73 20 6f 6e 65 20 73 74 65 70 20 75 moves one step u
48d0: 70 2c 0a 20 20 20 20 20 20 20 20 20 2a 20 62 75 p,. * bu
48e0: 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 t this does not
48f0: 61 66 66 65 63 74 20 62 6c 5f 63 6f 75 6e 74 5b affect bl_count[
4900: 6d 61 78 5f 6c 65 6e 67 74 68 5d 0a 20 20 20 20 max_length].
4910: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 */.
4920: 6f 76 65 72 66 6c 6f 77 20 2d 3d 20 32 3b 0a 20 overflow -= 2;.
4930: 20 20 20 7d 20 77 68 69 6c 65 20 28 6f 76 65 72 } while (over
4940: 66 6c 6f 77 20 3e 20 30 29 3b 0a 0a 20 20 20 20 flow > 0);..
4950: 2f 2a 20 4e 6f 77 20 72 65 63 6f 6d 70 75 74 65 /* Now recompute
4960: 20 61 6c 6c 20 62 69 74 20 6c 65 6e 67 74 68 73 all bit lengths
4970: 2c 20 73 63 61 6e 6e 69 6e 67 20 69 6e 20 69 6e , scanning in in
4980: 63 72 65 61 73 69 6e 67 20 66 72 65 71 75 65 6e creasing frequen
4990: 63 79 2e 0a 20 20 20 20 20 2a 20 68 20 69 73 20 cy.. * h is
49a0: 73 74 69 6c 6c 20 65 71 75 61 6c 20 74 6f 20 48 still equal to H
49b0: 45 41 50 5f 53 49 5a 45 2e 20 28 49 74 20 69 73 EAP_SIZE. (It is
49c0: 20 73 69 6d 70 6c 65 72 20 74 6f 20 72 65 63 6f simpler to reco
49d0: 6e 73 74 72 75 63 74 20 61 6c 6c 0a 20 20 20 20 nstruct all.
49e0: 20 2a 20 6c 65 6e 67 74 68 73 20 69 6e 73 74 65 * lengths inste
49f0: 61 64 20 6f 66 20 66 69 78 69 6e 67 20 6f 6e 6c ad of fixing onl
4a00: 79 20 74 68 65 20 77 72 6f 6e 67 20 6f 6e 65 73 y the wrong ones
4a10: 2e 20 54 68 69 73 20 69 64 65 61 20 69 73 20 74 . This idea is t
4a20: 61 6b 65 6e 0a 20 20 20 20 20 2a 20 66 72 6f 6d aken. * from
4a30: 20 27 61 72 27 20 77 72 69 74 74 65 6e 20 62 79 'ar' written by
4a40: 20 48 61 72 75 68 69 6b 6f 20 4f 6b 75 6d 75 72 Haruhiko Okumur
4a50: 61 2e 29 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 a.). */.
4a60: 66 6f 72 20 28 62 69 74 73 20 3d 20 6d 61 78 5f for (bits = max_
4a70: 6c 65 6e 67 74 68 3b 20 62 69 74 73 20 21 3d 20 length; bits !=
4a80: 30 3b 20 62 69 74 73 2d 2d 29 20 7b 0a 20 20 20 0; bits--) {.
4a90: 20 20 20 20 20 6e 20 3d 20 73 2d 3e 62 6c 5f 63 n = s->bl_c
4aa0: 6f 75 6e 74 5b 62 69 74 73 5d 3b 0a 20 20 20 20 ount[bits];.
4ab0: 20 20 20 20 77 68 69 6c 65 20 28 6e 20 21 3d 20 while (n !=
4ac0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0) {.
4ad0: 20 6d 20 3d 20 73 2d 3e 68 65 61 70 5b 2d 2d 68 m = s->heap[--h
4ae0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 ];. i
4af0: 66 20 28 6d 20 3e 20 6d 61 78 5f 63 6f 64 65 29 f (m > max_code)
4b00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 continue;.
4b10: 20 20 20 20 20 20 20 69 66 20 28 74 72 65 65 5b if (tree[
4b20: 6d 5d 2e 4c 65 6e 20 21 3d 20 28 75 6e 73 69 67 m].Len != (unsig
4b30: 6e 65 64 29 20 62 69 74 73 29 20 7b 0a 20 20 20 ned) bits) {.
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 Tra
4b50: 63 65 28 28 73 74 64 65 72 72 2c 22 63 6f 64 65 ce((stderr,"code
4b60: 20 25 64 20 62 69 74 73 20 25 64 2d 3e 25 64 5c %d bits %d->%d\
4b70: 6e 22 2c 20 6d 2c 20 74 72 65 65 5b 6d 5d 2e 4c n", m, tree[m].L
4b80: 65 6e 2c 20 62 69 74 73 29 29 3b 0a 20 20 20 20 en, bits));.
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e 6f s->o
4ba0: 70 74 5f 6c 65 6e 20 2b 3d 20 28 28 6c 6f 6e 67 pt_len += ((long
4bb0: 29 62 69 74 73 20 2d 20 28 6c 6f 6e 67 29 74 72 )bits - (long)tr
4bc0: 65 65 5b 6d 5d 2e 4c 65 6e 29 0a 20 20 20 20 20 ee[m].Len).
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4be0: 20 20 20 20 20 20 20 20 20 2a 28 6c 6f 6e 67 29 *(long)
4bf0: 74 72 65 65 5b 6d 5d 2e 46 72 65 71 3b 0a 20 20 tree[m].Freq;.
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 tr
4c10: 65 65 5b 6d 5d 2e 4c 65 6e 20 3d 20 28 75 73 68 ee[m].Len = (ush
4c20: 29 62 69 74 73 3b 0a 20 20 20 20 20 20 20 20 20 )bits;.
4c30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
4c40: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a n--;. }.
4c50: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d }.}../* ====
4c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4ca0: 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 47 65 6e 65 72 =======. * Gener
4cb0: 61 74 65 20 74 68 65 20 63 6f 64 65 73 20 66 6f ate the codes fo
4cc0: 72 20 61 20 67 69 76 65 6e 20 74 72 65 65 20 61 r a given tree a
4cd0: 6e 64 20 62 69 74 20 63 6f 75 6e 74 73 20 28 77 nd bit counts (w
4ce0: 68 69 63 68 20 6e 65 65 64 20 6e 6f 74 20 62 65 hich need not be
4cf0: 0a 20 2a 20 6f 70 74 69 6d 61 6c 29 2e 0a 20 2a . * optimal).. *
4d00: 20 49 4e 20 61 73 73 65 72 74 69 6f 6e 3a 20 74 IN assertion: t
4d10: 68 65 20 61 72 72 61 79 20 62 6c 5f 63 6f 75 6e he array bl_coun
4d20: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 62 t contains the b
4d30: 69 74 20 6c 65 6e 67 74 68 20 73 74 61 74 69 73 it length statis
4d40: 74 69 63 73 20 66 6f 72 0a 20 2a 20 74 68 65 20 tics for. * the
4d50: 67 69 76 65 6e 20 74 72 65 65 20 61 6e 64 20 74 given tree and t
4d60: 68 65 20 66 69 65 6c 64 20 6c 65 6e 20 69 73 20 he field len is
4d70: 73 65 74 20 66 6f 72 20 61 6c 6c 20 74 72 65 65 set for all tree
4d80: 20 65 6c 65 6d 65 6e 74 73 2e 0a 20 2a 20 4f 55 elements.. * OU
4d90: 54 20 61 73 73 65 72 74 69 6f 6e 3a 20 74 68 65 T assertion: the
4da0: 20 66 69 65 6c 64 20 63 6f 64 65 20 69 73 20 73 field code is s
4db0: 65 74 20 66 6f 72 20 61 6c 6c 20 74 72 65 65 20 et for all tree
4dc0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 6e 6f 6e 0a elements of non.
4dd0: 20 2a 20 20 20 20 20 7a 65 72 6f 20 63 6f 64 65 * zero code
4de0: 20 6c 65 6e 67 74 68 2e 0a 20 2a 2f 0a 6c 6f 63 length.. */.loc
4df0: 61 6c 20 76 6f 69 64 20 67 65 6e 5f 63 6f 64 65 al void gen_code
4e00: 73 20 28 74 72 65 65 2c 20 6d 61 78 5f 63 6f 64 s (tree, max_cod
4e10: 65 2c 20 62 6c 5f 63 6f 75 6e 74 29 0a 20 20 20 e, bl_count).
4e20: 20 63 74 5f 64 61 74 61 20 2a 74 72 65 65 3b 20 ct_data *tree;
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 /* t
4e40: 68 65 20 74 72 65 65 20 74 6f 20 64 65 63 6f 72 he tree to decor
4e50: 61 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d ate */. int m
4e60: 61 78 5f 63 6f 64 65 3b 20 20 20 20 20 20 20 20 ax_code;
4e70: 20 20 20 20 20 20 2f 2a 20 6c 61 72 67 65 73 74 /* largest
4e80: 20 63 6f 64 65 20 77 69 74 68 20 6e 6f 6e 20 7a code with non z
4e90: 65 72 6f 20 66 72 65 71 75 65 6e 63 79 20 2a 2f ero frequency */
4ea0: 0a 20 20 20 20 75 73 68 66 20 2a 62 6c 5f 63 6f . ushf *bl_co
4eb0: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 unt;
4ec0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 64 /* number of cod
4ed0: 65 73 20 61 74 20 65 61 63 68 20 62 69 74 20 6c es at each bit l
4ee0: 65 6e 67 74 68 20 2a 2f 0a 7b 0a 20 20 20 20 75 ength */.{. u
4ef0: 73 68 20 6e 65 78 74 5f 63 6f 64 65 5b 4d 41 58 sh next_code[MAX
4f00: 5f 42 49 54 53 2b 31 5d 3b 20 2f 2a 20 6e 65 78 _BITS+1]; /* nex
4f10: 74 20 63 6f 64 65 20 76 61 6c 75 65 20 66 6f 72 t code value for
4f20: 20 65 61 63 68 20 62 69 74 20 6c 65 6e 67 74 68 each bit length
4f30: 20 2a 2f 0a 20 20 20 20 75 73 68 20 63 6f 64 65 */. ush code
4f40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
4f50: 20 20 20 2f 2a 20 72 75 6e 6e 69 6e 67 20 63 6f /* running co
4f60: 64 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 de value */.
4f70: 69 6e 74 20 62 69 74 73 3b 20 20 20 20 20 20 20 int bits;
4f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 69 /* bi
4f90: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 t index */. i
4fa0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 nt n;
4fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 64 /* cod
4fc0: 65 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 e index */..
4fd0: 2f 2a 20 54 68 65 20 64 69 73 74 72 69 62 75 74 /* The distribut
4fe0: 69 6f 6e 20 63 6f 75 6e 74 73 20 61 72 65 20 66 ion counts are f
4ff0: 69 72 73 74 20 75 73 65 64 20 74 6f 20 67 65 6e irst used to gen
5000: 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 76 erate the code v
5010: 61 6c 75 65 73 0a 20 20 20 20 20 2a 20 77 69 74 alues. * wit
5020: 68 6f 75 74 20 62 69 74 20 72 65 76 65 72 73 61 hout bit reversa
5030: 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 l.. */. f
5040: 6f 72 20 28 62 69 74 73 20 3d 20 31 3b 20 62 69 or (bits = 1; bi
5050: 74 73 20 3c 3d 20 4d 41 58 5f 42 49 54 53 3b 20 ts <= MAX_BITS;
5060: 62 69 74 73 2b 2b 29 20 7b 0a 20 20 20 20 20 20 bits++) {.
5070: 20 20 6e 65 78 74 5f 63 6f 64 65 5b 62 69 74 73 next_code[bits
5080: 5d 20 3d 20 63 6f 64 65 20 3d 20 28 63 6f 64 65 ] = code = (code
5090: 20 2b 20 62 6c 5f 63 6f 75 6e 74 5b 62 69 74 73 + bl_count[bits
50a0: 2d 31 5d 29 20 3c 3c 20 31 3b 0a 20 20 20 20 7d -1]) << 1;. }
50b0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 . /* Check th
50c0: 61 74 20 74 68 65 20 62 69 74 20 63 6f 75 6e 74 at the bit count
50d0: 73 20 69 6e 20 62 6c 5f 63 6f 75 6e 74 20 61 72 s in bl_count ar
50e0: 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 54 68 e consistent. Th
50f0: 65 20 6c 61 73 74 20 63 6f 64 65 0a 20 20 20 20 e last code.
5100: 20 2a 20 6d 75 73 74 20 62 65 20 61 6c 6c 20 6f * must be all o
5110: 6e 65 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 nes.. */.
5120: 20 41 73 73 65 72 74 20 28 63 6f 64 65 20 2b 20 Assert (code +
5130: 62 6c 5f 63 6f 75 6e 74 5b 4d 41 58 5f 42 49 54 bl_count[MAX_BIT
5140: 53 5d 2d 31 20 3d 3d 20 28 31 3c 3c 4d 41 58 5f S]-1 == (1<<MAX_
5150: 42 49 54 53 29 2d 31 2c 0a 20 20 20 20 20 20 20 BITS)-1,.
5160: 20 20 20 20 20 22 69 6e 63 6f 6e 73 69 73 74 65 "inconsiste
5170: 6e 74 20 62 69 74 20 63 6f 75 6e 74 73 22 29 3b nt bit counts");
5180: 0a 20 20 20 20 54 72 61 63 65 76 28 28 73 74 64 . Tracev((std
5190: 65 72 72 2c 22 5c 6e 67 65 6e 5f 63 6f 64 65 73 err,"\ngen_codes
51a0: 3a 20 6d 61 78 5f 63 6f 64 65 20 25 64 20 22 2c : max_code %d ",
51b0: 20 6d 61 78 5f 63 6f 64 65 29 29 3b 0a 0a 20 20 max_code));..
51c0: 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b 20 20 6e for (n = 0; n
51d0: 20 3c 3d 20 6d 61 78 5f 63 6f 64 65 3b 20 6e 2b <= max_code; n+
51e0: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 +) {. int
51f0: 20 6c 65 6e 20 3d 20 74 72 65 65 5b 6e 5d 2e 4c len = tree[n].L
5200: 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 en;. if (
5210: 6c 65 6e 20 3d 3d 20 30 29 20 63 6f 6e 74 69 6e len == 0) contin
5220: 75 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e ue;. /* N
5230: 6f 77 20 72 65 76 65 72 73 65 20 74 68 65 20 62 ow reverse the b
5240: 69 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 its */. t
5250: 72 65 65 5b 6e 5d 2e 43 6f 64 65 20 3d 20 62 69 ree[n].Code = bi
5260: 5f 72 65 76 65 72 73 65 28 6e 65 78 74 5f 63 6f _reverse(next_co
5270: 64 65 5b 6c 65 6e 5d 2b 2b 2c 20 6c 65 6e 29 3b de[len]++, len);
5280: 0a 0a 20 20 20 20 20 20 20 20 54 72 61 63 65 63 .. Tracec
5290: 76 28 74 72 65 65 20 21 3d 20 73 74 61 74 69 63 v(tree != static
52a0: 5f 6c 74 72 65 65 2c 20 28 73 74 64 65 72 72 2c _ltree, (stderr,
52b0: 22 5c 6e 6e 20 25 33 64 20 25 63 20 6c 20 25 32 "\nn %3d %c l %2
52c0: 64 20 63 20 25 34 78 20 28 25 78 29 20 22 2c 0a d c %4x (%x) ",.
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 2c 20 n,
52e0: 28 69 73 67 72 61 70 68 28 6e 29 20 3f 20 6e 20 (isgraph(n) ? n
52f0: 3a 20 27 20 27 29 2c 20 6c 65 6e 2c 20 74 72 65 : ' '), len, tre
5300: 65 5b 6e 5d 2e 43 6f 64 65 2c 20 6e 65 78 74 5f e[n].Code, next_
5310: 63 6f 64 65 5b 6c 65 6e 5d 2d 31 29 29 3b 0a 20 code[len]-1));.
5320: 20 20 20 7d 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d }.}../* =====
5330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5370: 3d 3d 3d 3d 3d 3d 0a 20 2a 20 43 6f 6e 73 74 72 ======. * Constr
5380: 75 63 74 20 6f 6e 65 20 48 75 66 66 6d 61 6e 20 uct one Huffman
5390: 74 72 65 65 20 61 6e 64 20 61 73 73 69 67 6e 73 tree and assigns
53a0: 20 74 68 65 20 63 6f 64 65 20 62 69 74 20 73 74 the code bit st
53b0: 72 69 6e 67 73 20 61 6e 64 20 6c 65 6e 67 74 68 rings and length
53c0: 73 2e 0a 20 2a 20 55 70 64 61 74 65 20 74 68 65 s.. * Update the
53d0: 20 74 6f 74 61 6c 20 62 69 74 20 6c 65 6e 67 74 total bit lengt
53e0: 68 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e h for the curren
53f0: 74 20 62 6c 6f 63 6b 2e 0a 20 2a 20 49 4e 20 61 t block.. * IN a
5400: 73 73 65 72 74 69 6f 6e 3a 20 74 68 65 20 66 69 ssertion: the fi
5410: 65 6c 64 20 66 72 65 71 20 69 73 20 73 65 74 20 eld freq is set
5420: 66 6f 72 20 61 6c 6c 20 74 72 65 65 20 65 6c 65 for all tree ele
5430: 6d 65 6e 74 73 2e 0a 20 2a 20 4f 55 54 20 61 73 ments.. * OUT as
5440: 73 65 72 74 69 6f 6e 73 3a 20 74 68 65 20 66 69 sertions: the fi
5450: 65 6c 64 73 20 6c 65 6e 20 61 6e 64 20 63 6f 64 elds len and cod
5460: 65 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 e are set to the
5470: 20 6f 70 74 69 6d 61 6c 20 62 69 74 20 6c 65 6e optimal bit len
5480: 67 74 68 0a 20 2a 20 20 20 20 20 61 6e 64 20 63 gth. * and c
5490: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 64 orresponding cod
54a0: 65 2e 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 70 e. The length op
54b0: 74 5f 6c 65 6e 20 69 73 20 75 70 64 61 74 65 64 t_len is updated
54c0: 3b 20 73 74 61 74 69 63 5f 6c 65 6e 20 69 73 0a ; static_len is.
54d0: 20 2a 20 20 20 20 20 61 6c 73 6f 20 75 70 64 61 * also upda
54e0: 74 65 64 20 69 66 20 73 74 72 65 65 20 69 73 20 ted if stree is
54f0: 6e 6f 74 20 6e 75 6c 6c 2e 20 54 68 65 20 66 69 not null. The fi
5500: 65 6c 64 20 6d 61 78 5f 63 6f 64 65 20 69 73 20 eld max_code is
5510: 73 65 74 2e 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 76 set.. */.local v
5520: 6f 69 64 20 62 75 69 6c 64 5f 74 72 65 65 28 73 oid build_tree(s
5530: 2c 20 64 65 73 63 29 0a 20 20 20 20 64 65 66 6c , desc). defl
5540: 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0a 20 20 ate_state *s;.
5550: 20 20 74 72 65 65 5f 64 65 73 63 20 2a 64 65 73 tree_desc *des
5560: 63 3b 20 2f 2a 20 74 68 65 20 74 72 65 65 20 64 c; /* the tree d
5570: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 7b 0a 20 escriptor */.{.
5580: 20 20 20 63 74 5f 64 61 74 61 20 2a 74 72 65 65 ct_data *tree
5590: 20 20 20 20 20 20 20 20 20 3d 20 64 65 73 63 2d = desc-
55a0: 3e 64 79 6e 5f 74 72 65 65 3b 0a 20 20 20 20 63 >dyn_tree;. c
55b0: 6f 6e 73 74 20 63 74 5f 64 61 74 61 20 2a 73 74 onst ct_data *st
55c0: 72 65 65 20 20 3d 20 64 65 73 63 2d 3e 73 74 61 ree = desc->sta
55d0: 74 5f 64 65 73 63 2d 3e 73 74 61 74 69 63 5f 74 t_desc->static_t
55e0: 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 65 6c 65 ree;. int ele
55f0: 6d 73 20 20 20 20 20 20 20 20 20 20 20 20 20 3d ms =
5600: 20 64 65 73 63 2d 3e 73 74 61 74 5f 64 65 73 63 desc->stat_desc
5610: 2d 3e 65 6c 65 6d 73 3b 0a 20 20 20 20 69 6e 74 ->elems;. int
5620: 20 6e 2c 20 6d 3b 20 20 20 20 20 20 20 20 20 20 n, m;
5630: 2f 2a 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 /* iterate over
5640: 68 65 61 70 20 65 6c 65 6d 65 6e 74 73 20 2a 2f heap elements */
5650: 0a 20 20 20 20 69 6e 74 20 6d 61 78 5f 63 6f 64 . int max_cod
5660: 65 20 3d 20 2d 31 3b 20 2f 2a 20 6c 61 72 67 65 e = -1; /* large
5670: 73 74 20 63 6f 64 65 20 77 69 74 68 20 6e 6f 6e st code with non
5680: 20 7a 65 72 6f 20 66 72 65 71 75 65 6e 63 79 20 zero frequency
5690: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 6f 64 65 3b */. int node;
56a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 77 /* new
56b0: 20 6e 6f 64 65 20 62 65 69 6e 67 20 63 72 65 61 node being crea
56c0: 74 65 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 ted */.. /* C
56d0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6e 69 onstruct the ini
56e0: 74 69 61 6c 20 68 65 61 70 2c 20 77 69 74 68 20 tial heap, with
56f0: 6c 65 61 73 74 20 66 72 65 71 75 65 6e 74 20 65 least frequent e
5700: 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 20 20 20 2a lement in. *
5710: 20 68 65 61 70 5b 53 4d 41 4c 4c 45 53 54 5d 2e heap[SMALLEST].
5720: 20 54 68 65 20 73 6f 6e 73 20 6f 66 20 68 65 61 The sons of hea
5730: 70 5b 6e 5d 20 61 72 65 20 68 65 61 70 5b 32 2a p[n] are heap[2*
5740: 6e 5d 20 61 6e 64 20 68 65 61 70 5b 32 2a 6e 2b n] and heap[2*n+
5750: 31 5d 2e 0a 20 20 20 20 20 2a 20 68 65 61 70 5b 1].. * heap[
5760: 30 5d 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 0a 0] is not used..
5770: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 2d 3e 68 */. s->h
5780: 65 61 70 5f 6c 65 6e 20 3d 20 30 2c 20 73 2d 3e eap_len = 0, s->
5790: 68 65 61 70 5f 6d 61 78 20 3d 20 48 45 41 50 5f heap_max = HEAP_
57a0: 53 49 5a 45 3b 0a 0a 20 20 20 20 66 6f 72 20 28 SIZE;.. for (
57b0: 6e 20 3d 20 30 3b 20 6e 20 3c 20 65 6c 65 6d 73 n = 0; n < elems
57c0: 3b 20 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 ; n++) {.
57d0: 20 69 66 20 28 74 72 65 65 5b 6e 5d 2e 46 72 65 if (tree[n].Fre
57e0: 71 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 q != 0) {.
57f0: 20 20 20 20 20 20 73 2d 3e 68 65 61 70 5b 2b 2b s->heap[++
5800: 28 73 2d 3e 68 65 61 70 5f 6c 65 6e 29 5d 20 3d (s->heap_len)] =
5810: 20 6d 61 78 5f 63 6f 64 65 20 3d 20 6e 3b 0a 20 max_code = n;.
5820: 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e 64 65 s->de
5830: 70 74 68 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 pth[n] = 0;.
5840: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 } else {.
5850: 20 20 20 20 20 20 20 20 20 74 72 65 65 5b 6e 5d tree[n]
5860: 2e 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 .Len = 0;.
5870: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
5880: 2a 20 54 68 65 20 70 6b 7a 69 70 20 66 6f 72 6d * The pkzip form
5890: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 61 74 at requires that
58a0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 64 69 at least one di
58b0: 73 74 61 6e 63 65 20 63 6f 64 65 20 65 78 69 73 stance code exis
58c0: 74 73 2c 0a 20 20 20 20 20 2a 20 61 6e 64 20 74 ts,. * and t
58d0: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 hat at least one
58e0: 20 62 69 74 20 73 68 6f 75 6c 64 20 62 65 20 73 bit should be s
58f0: 65 6e 74 20 65 76 65 6e 20 69 66 20 74 68 65 72 ent even if ther
5900: 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 20 20 e is only one.
5910: 20 20 20 2a 20 70 6f 73 73 69 62 6c 65 20 63 6f * possible co
5920: 64 65 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 de. So to avoid
5930: 73 70 65 63 69 61 6c 20 63 68 65 63 6b 73 20 6c special checks l
5940: 61 74 65 72 20 6f 6e 20 77 65 20 66 6f 72 63 65 ater on we force
5950: 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 2a at least. *
5960: 20 74 77 6f 20 63 6f 64 65 73 20 6f 66 20 6e 6f two codes of no
5970: 6e 20 7a 65 72 6f 20 66 72 65 71 75 65 6e 63 79 n zero frequency
5980: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 .. */. wh
5990: 69 6c 65 20 28 73 2d 3e 68 65 61 70 5f 6c 65 6e ile (s->heap_len
59a0: 20 3c 20 32 29 20 7b 0a 20 20 20 20 20 20 20 20 < 2) {.
59b0: 6e 6f 64 65 20 3d 20 73 2d 3e 68 65 61 70 5b 2b node = s->heap[+
59c0: 2b 28 73 2d 3e 68 65 61 70 5f 6c 65 6e 29 5d 20 +(s->heap_len)]
59d0: 3d 20 28 6d 61 78 5f 63 6f 64 65 20 3c 20 32 20 = (max_code < 2
59e0: 3f 20 2b 2b 6d 61 78 5f 63 6f 64 65 20 3a 20 30 ? ++max_code : 0
59f0: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 65 65 5b );. tree[
5a00: 6e 6f 64 65 5d 2e 46 72 65 71 20 3d 20 31 3b 0a node].Freq = 1;.
5a10: 20 20 20 20 20 20 20 20 73 2d 3e 64 65 70 74 68 s->depth
5a20: 5b 6e 6f 64 65 5d 20 3d 20 30 3b 0a 20 20 20 20 [node] = 0;.
5a30: 20 20 20 20 73 2d 3e 6f 70 74 5f 6c 65 6e 2d 2d s->opt_len--
5a40: 3b 20 69 66 20 28 73 74 72 65 65 29 20 73 2d 3e ; if (stree) s->
5a50: 73 74 61 74 69 63 5f 6c 65 6e 20 2d 3d 20 73 74 static_len -= st
5a60: 72 65 65 5b 6e 6f 64 65 5d 2e 4c 65 6e 3b 0a 20 ree[node].Len;.
5a70: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 64 65 20 69 /* node i
5a80: 73 20 30 20 6f 72 20 31 20 73 6f 20 69 74 20 64 s 0 or 1 so it d
5a90: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 78 74 oes not have ext
5aa0: 72 61 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 7d ra bits */. }
5ab0: 0a 20 20 20 20 64 65 73 63 2d 3e 6d 61 78 5f 63 . desc->max_c
5ac0: 6f 64 65 20 3d 20 6d 61 78 5f 63 6f 64 65 3b 0a ode = max_code;.
5ad0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6c 65 6d . /* The elem
5ae0: 65 6e 74 73 20 68 65 61 70 5b 68 65 61 70 5f 6c ents heap[heap_l
5af0: 65 6e 2f 32 2b 31 20 2e 2e 20 68 65 61 70 5f 6c en/2+1 .. heap_l
5b00: 65 6e 5d 20 61 72 65 20 6c 65 61 76 65 73 20 6f en] are leaves o
5b10: 66 20 74 68 65 20 74 72 65 65 2c 0a 20 20 20 20 f the tree,.
5b20: 20 2a 20 65 73 74 61 62 6c 69 73 68 20 73 75 62 * establish sub
5b30: 2d 68 65 61 70 73 20 6f 66 20 69 6e 63 72 65 61 -heaps of increa
5b40: 73 69 6e 67 20 6c 65 6e 67 74 68 73 3a 0a 20 20 sing lengths:.
5b50: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 6e */. for (n
5b60: 20 3d 20 73 2d 3e 68 65 61 70 5f 6c 65 6e 2f 32 = s->heap_len/2
5b70: 3b 20 6e 20 3e 3d 20 31 3b 20 6e 2d 2d 29 20 70 ; n >= 1; n--) p
5b80: 71 64 6f 77 6e 68 65 61 70 28 73 2c 20 74 72 65 qdownheap(s, tre
5b90: 65 2c 20 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 e, n);.. /* C
5ba0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 48 75 66 onstruct the Huf
5bb0: 66 6d 61 6e 20 74 72 65 65 20 62 79 20 72 65 70 fman tree by rep
5bc0: 65 61 74 65 64 6c 79 20 63 6f 6d 62 69 6e 69 6e eatedly combinin
5bd0: 67 20 74 68 65 20 6c 65 61 73 74 20 74 77 6f 0a g the least two.
5be0: 20 20 20 20 20 2a 20 66 72 65 71 75 65 6e 74 20 * frequent
5bf0: 6e 6f 64 65 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 nodes.. */.
5c00: 20 20 20 6e 6f 64 65 20 3d 20 65 6c 65 6d 73 3b node = elems;
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
5c20: 20 6e 65 78 74 20 69 6e 74 65 72 6e 61 6c 20 6e next internal n
5c30: 6f 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 ode of the tree
5c40: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 */. do {.
5c50: 20 20 20 20 70 71 72 65 6d 6f 76 65 28 73 2c 20 pqremove(s,
5c60: 74 72 65 65 2c 20 6e 29 3b 20 20 2f 2a 20 6e 20 tree, n); /* n
5c70: 3d 20 6e 6f 64 65 20 6f 66 20 6c 65 61 73 74 20 = node of least
5c80: 66 72 65 71 75 65 6e 63 79 20 2a 2f 0a 20 20 20 frequency */.
5c90: 20 20 20 20 20 6d 20 3d 20 73 2d 3e 68 65 61 70 m = s->heap
5ca0: 5b 53 4d 41 4c 4c 45 53 54 5d 3b 20 2f 2a 20 6d [SMALLEST]; /* m
5cb0: 20 3d 20 6e 6f 64 65 20 6f 66 20 6e 65 78 74 20 = node of next
5cc0: 6c 65 61 73 74 20 66 72 65 71 75 65 6e 63 79 20 least frequency
5cd0: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 2d 3e 68 */.. s->h
5ce0: 65 61 70 5b 2d 2d 28 73 2d 3e 68 65 61 70 5f 6d eap[--(s->heap_m
5cf0: 61 78 29 5d 20 3d 20 6e 3b 20 2f 2a 20 6b 65 65 ax)] = n; /* kee
5d00: 70 20 74 68 65 20 6e 6f 64 65 73 20 73 6f 72 74 p the nodes sort
5d10: 65 64 20 62 79 20 66 72 65 71 75 65 6e 63 79 20 ed by frequency
5d20: 2a 2f 0a 20 20 20 20 20 20 20 20 73 2d 3e 68 65 */. s->he
5d30: 61 70 5b 2d 2d 28 73 2d 3e 68 65 61 70 5f 6d 61 ap[--(s->heap_ma
5d40: 78 29 5d 20 3d 20 6d 3b 0a 0a 20 20 20 20 20 20 x)] = m;..
5d50: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 /* Create a ne
5d60: 77 20 6e 6f 64 65 20 66 61 74 68 65 72 20 6f 66 w node father of
5d70: 20 6e 20 61 6e 64 20 6d 20 2a 2f 0a 20 20 20 20 n and m */.
5d80: 20 20 20 20 74 72 65 65 5b 6e 6f 64 65 5d 2e 46 tree[node].F
5d90: 72 65 71 20 3d 20 74 72 65 65 5b 6e 5d 2e 46 72 req = tree[n].Fr
5da0: 65 71 20 2b 20 74 72 65 65 5b 6d 5d 2e 46 72 65 eq + tree[m].Fre
5db0: 71 3b 0a 20 20 20 20 20 20 20 20 73 2d 3e 64 65 q;. s->de
5dc0: 70 74 68 5b 6e 6f 64 65 5d 20 3d 20 28 75 63 68 pth[node] = (uch
5dd0: 29 20 28 4d 41 58 28 73 2d 3e 64 65 70 74 68 5b ) (MAX(s->depth[
5de0: 6e 5d 2c 20 73 2d 3e 64 65 70 74 68 5b 6d 5d 29 n], s->depth[m])
5df0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 74 + 1);. t
5e00: 72 65 65 5b 6e 5d 2e 44 61 64 20 3d 20 74 72 65 ree[n].Dad = tre
5e10: 65 5b 6d 5d 2e 44 61 64 20 3d 20 28 75 73 68 29 e[m].Dad = (ush)
5e20: 6e 6f 64 65 3b 0a 23 69 66 64 65 66 20 44 55 4d node;.#ifdef DUM
5e30: 50 5f 42 4c 5f 54 52 45 45 0a 20 20 20 20 20 20 P_BL_TREE.
5e40: 20 20 69 66 20 28 74 72 65 65 20 3d 3d 20 73 2d if (tree == s-
5e50: 3e 62 6c 5f 74 72 65 65 29 20 7b 0a 20 20 20 20 >bl_tree) {.
5e60: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
5e70: 73 74 64 65 72 72 2c 22 5c 6e 6e 6f 64 65 20 25 stderr,"\nnode %
5e80: 64 28 25 64 29 2c 20 73 6f 6e 73 20 25 64 28 25 d(%d), sons %d(%
5e90: 64 29 20 25 64 28 25 64 29 22 2c 0a 20 20 20 20 d) %d(%d)",.
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5eb0: 6e 6f 64 65 2c 20 74 72 65 65 5b 6e 6f 64 65 5d node, tree[node]
5ec0: 2e 46 72 65 71 2c 20 6e 2c 20 74 72 65 65 5b 6e .Freq, n, tree[n
5ed0: 5d 2e 46 72 65 71 2c 20 6d 2c 20 74 72 65 65 5b ].Freq, m, tree[
5ee0: 6d 5d 2e 46 72 65 71 29 3b 0a 20 20 20 20 20 20 m].Freq);.
5ef0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 }.#endif.
5f00: 20 20 20 2f 2a 20 61 6e 64 20 69 6e 73 65 72 74 /* and insert
5f10: 20 74 68 65 20 6e 65 77 20 6e 6f 64 65 20 69 6e the new node in
5f20: 20 74 68 65 20 68 65 61 70 20 2a 2f 0a 20 20 20 the heap */.
5f30: 20 20 20 20 20 73 2d 3e 68 65 61 70 5b 53 4d 41 s->heap[SMA
5f40: 4c 4c 45 53 54 5d 20 3d 20 6e 6f 64 65 2b 2b 3b LLEST] = node++;
5f50: 0a 20 20 20 20 20 20 20 20 70 71 64 6f 77 6e 68 . pqdownh
5f60: 65 61 70 28 73 2c 20 74 72 65 65 2c 20 53 4d 41 eap(s, tree, SMA
5f70: 4c 4c 45 53 54 29 3b 0a 0a 20 20 20 20 7d 20 77 LLEST);.. } w
5f80: 68 69 6c 65 20 28 73 2d 3e 68 65 61 70 5f 6c 65 hile (s->heap_le
5f90: 6e 20 3e 3d 20 32 29 3b 0a 0a 20 20 20 20 73 2d n >= 2);.. s-
5fa0: 3e 68 65 61 70 5b 2d 2d 28 73 2d 3e 68 65 61 70 >heap[--(s->heap
5fb0: 5f 6d 61 78 29 5d 20 3d 20 73 2d 3e 68 65 61 70 _max)] = s->heap
5fc0: 5b 53 4d 41 4c 4c 45 53 54 5d 3b 0a 0a 20 20 20 [SMALLEST];..
5fd0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e /* At this poin
5fe0: 74 2c 20 74 68 65 20 66 69 65 6c 64 73 20 66 72 t, the fields fr
5ff0: 65 71 20 61 6e 64 20 64 61 64 20 61 72 65 20 73 eq and dad are s
6000: 65 74 2e 20 57 65 20 63 61 6e 20 6e 6f 77 0a 20 et. We can now.
6010: 20 20 20 20 2a 20 67 65 6e 65 72 61 74 65 20 74 * generate t
6020: 68 65 20 62 69 74 20 6c 65 6e 67 74 68 73 2e 0a he bit lengths..
6030: 20 20 20 20 20 2a 2f 0a 20 20 20 20 67 65 6e 5f */. gen_
6040: 62 69 74 6c 65 6e 28 73 2c 20 28 74 72 65 65 5f bitlen(s, (tree_
6050: 64 65 73 63 20 2a 29 64 65 73 63 29 3b 0a 0a 20 desc *)desc);..
6060: 20 20 20 2f 2a 20 54 68 65 20 66 69 65 6c 64 20 /* The field
6070: 6c 65 6e 20 69 73 20 6e 6f 77 20 73 65 74 2c 20 len is now set,
6080: 77 65 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20 we can generate
6090: 74 68 65 20 62 69 74 20 63 6f 64 65 73 20 2a 2f the bit codes */
60a0: 0a 20 20 20 20 67 65 6e 5f 63 6f 64 65 73 20 28 . gen_codes (
60b0: 28 63 74 5f 64 61 74 61 20 2a 29 74 72 65 65 2c (ct_data *)tree,
60c0: 20 6d 61 78 5f 63 6f 64 65 2c 20 73 2d 3e 62 6c max_code, s->bl
60d0: 5f 63 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 20 3d _count);.}../* =
60e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
60f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 53 63 ==========. * Sc
6130: 61 6e 20 61 20 6c 69 74 65 72 61 6c 20 6f 72 20 an a literal or
6140: 64 69 73 74 61 6e 63 65 20 74 72 65 65 20 74 6f distance tree to
6150: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 66 determine the f
6160: 72 65 71 75 65 6e 63 69 65 73 20 6f 66 20 74 68 requencies of th
6170: 65 20 63 6f 64 65 73 0a 20 2a 20 69 6e 20 74 68 e codes. * in th
6180: 65 20 62 69 74 20 6c 65 6e 67 74 68 20 74 72 65 e bit length tre
6190: 65 2e 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 76 6f 69 e.. */.local voi
61a0: 64 20 73 63 61 6e 5f 74 72 65 65 20 28 73 2c 20 d scan_tree (s,
61b0: 74 72 65 65 2c 20 6d 61 78 5f 63 6f 64 65 29 0a tree, max_code).
61c0: 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 74 deflate_stat
61d0: 65 20 2a 73 3b 0a 20 20 20 20 63 74 5f 64 61 74 e *s;. ct_dat
61e0: 61 20 2a 74 72 65 65 3b 20 20 20 2f 2a 20 74 68 a *tree; /* th
61f0: 65 20 74 72 65 65 20 74 6f 20 62 65 20 73 63 61 e tree to be sca
6200: 6e 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 nned */. int
6210: 6d 61 78 5f 63 6f 64 65 3b 20 20 20 20 2f 2a 20 max_code; /*
6220: 61 6e 64 20 69 74 73 20 6c 61 72 67 65 73 74 20 and its largest
6230: 63 6f 64 65 20 6f 66 20 6e 6f 6e 20 7a 65 72 6f code of non zero
6240: 20 66 72 65 71 75 65 6e 63 79 20 2a 2f 0a 7b 0a frequency */.{.
6250: 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 int n;
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
6270: 2a 20 69 74 65 72 61 74 65 73 20 6f 76 65 72 20 * iterates over
6280: 61 6c 6c 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 all tree element
6290: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 72 65 s */. int pre
62a0: 76 6c 65 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 vlen = -1;
62b0: 20 20 20 20 2f 2a 20 6c 61 73 74 20 65 6d 69 74 /* last emit
62c0: 74 65 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 ted length */.
62d0: 20 20 69 6e 74 20 63 75 72 6c 65 6e 3b 20 20 20 int curlen;
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
62f0: 6c 65 6e 67 74 68 20 6f 66 20 63 75 72 72 65 6e length of curren
6300: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e t code */. in
6310: 74 20 6e 65 78 74 6c 65 6e 20 3d 20 74 72 65 65 t nextlen = tree
6320: 5b 30 5d 2e 4c 65 6e 3b 20 2f 2a 20 6c 65 6e 67 [0].Len; /* leng
6330: 74 68 20 6f 66 20 6e 65 78 74 20 63 6f 64 65 20 th of next code
6340: 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 */. int count
6350: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
6360: 20 20 2f 2a 20 72 65 70 65 61 74 20 63 6f 75 6e /* repeat coun
6370: 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 t of the current
6380: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 code */. int
6390: 20 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 37 3b 20 max_count = 7;
63a0: 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 78 20 72 /* max r
63b0: 65 70 65 61 74 20 63 6f 75 6e 74 20 2a 2f 0a 20 epeat count */.
63c0: 20 20 20 69 6e 74 20 6d 69 6e 5f 63 6f 75 6e 74 int min_count
63d0: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 20 2f 2a = 4; /*
63e0: 20 6d 69 6e 20 72 65 70 65 61 74 20 63 6f 75 6e min repeat coun
63f0: 74 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 65 t */.. if (ne
6400: 78 74 6c 65 6e 20 3d 3d 20 30 29 20 6d 61 78 5f xtlen == 0) max_
6410: 63 6f 75 6e 74 20 3d 20 31 33 38 2c 20 6d 69 6e count = 138, min
6420: 5f 63 6f 75 6e 74 20 3d 20 33 3b 0a 20 20 20 20 _count = 3;.
6430: 74 72 65 65 5b 6d 61 78 5f 63 6f 64 65 2b 31 5d tree[max_code+1]
6440: 2e 4c 65 6e 20 3d 20 28 75 73 68 29 30 78 66 66 .Len = (ush)0xff
6450: 66 66 3b 20 2f 2a 20 67 75 61 72 64 20 2a 2f 0a ff; /* guard */.
6460: 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 30 3b . for (n = 0;
6470: 20 6e 20 3c 3d 20 6d 61 78 5f 63 6f 64 65 3b 20 n <= max_code;
6480: 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 63 n++) {. c
6490: 75 72 6c 65 6e 20 3d 20 6e 65 78 74 6c 65 6e 3b urlen = nextlen;
64a0: 20 6e 65 78 74 6c 65 6e 20 3d 20 74 72 65 65 5b nextlen = tree[
64b0: 6e 2b 31 5d 2e 4c 65 6e 3b 0a 20 20 20 20 20 20 n+1].Len;.
64c0: 20 20 69 66 20 28 2b 2b 63 6f 75 6e 74 20 3c 20 if (++count <
64d0: 6d 61 78 5f 63 6f 75 6e 74 20 26 26 20 63 75 72 max_count && cur
64e0: 6c 65 6e 20 3d 3d 20 6e 65 78 74 6c 65 6e 29 20 len == nextlen)
64f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f {. co
6500: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 ntinue;.
6510: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 75 6e 74 } else if (count
6520: 20 3c 20 6d 69 6e 5f 63 6f 75 6e 74 29 20 7b 0a < min_count) {.
6530: 20 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e 62 s->b
6540: 6c 5f 74 72 65 65 5b 63 75 72 6c 65 6e 5d 2e 46 l_tree[curlen].F
6550: 72 65 71 20 2b 3d 20 63 6f 75 6e 74 3b 0a 20 20 req += count;.
6560: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 } else if
6570: 28 63 75 72 6c 65 6e 20 21 3d 20 30 29 20 7b 0a (curlen != 0) {.
6580: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 if (
6590: 63 75 72 6c 65 6e 20 21 3d 20 70 72 65 76 6c 65 curlen != prevle
65a0: 6e 29 20 73 2d 3e 62 6c 5f 74 72 65 65 5b 63 75 n) s->bl_tree[cu
65b0: 72 6c 65 6e 5d 2e 46 72 65 71 2b 2b 3b 0a 20 20 rlen].Freq++;.
65c0: 20 20 20 20 20 20 20 20 20 20 73 2d 3e 62 6c 5f s->bl_
65d0: 74 72 65 65 5b 52 45 50 5f 33 5f 36 5d 2e 46 72 tree[REP_3_6].Fr
65e0: 65 71 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 eq++;. }
65f0: 65 6c 73 65 20 69 66 20 28 63 6f 75 6e 74 20 3c else if (count <
6600: 3d 20 31 30 29 20 7b 0a 20 20 20 20 20 20 20 20 = 10) {.
6610: 20 20 20 20 73 2d 3e 62 6c 5f 74 72 65 65 5b 52 s->bl_tree[R
6620: 45 50 5a 5f 33 5f 31 30 5d 2e 46 72 65 71 2b 2b EPZ_3_10].Freq++
6630: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 ;. } else
6640: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 {. s
6650: 2d 3e 62 6c 5f 74 72 65 65 5b 52 45 50 5a 5f 31 ->bl_tree[REPZ_1
6660: 31 5f 31 33 38 5d 2e 46 72 65 71 2b 2b 3b 0a 20 1_138].Freq++;.
6670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
6680: 20 63 6f 75 6e 74 20 3d 20 30 3b 20 70 72 65 76 count = 0; prev
6690: 6c 65 6e 20 3d 20 63 75 72 6c 65 6e 3b 0a 20 20 len = curlen;.
66a0: 20 20 20 20 20 20 69 66 20 28 6e 65 78 74 6c 65 if (nextle
66b0: 6e 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 n == 0) {.
66c0: 20 20 20 20 20 20 6d 61 78 5f 63 6f 75 6e 74 20 max_count
66d0: 3d 20 31 33 38 2c 20 6d 69 6e 5f 63 6f 75 6e 74 = 138, min_count
66e0: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 20 = 3;. }
66f0: 65 6c 73 65 20 69 66 20 28 63 75 72 6c 65 6e 20 else if (curlen
6700: 3d 3d 20 6e 65 78 74 6c 65 6e 29 20 7b 0a 20 20 == nextlen) {.
6710: 20 20 20 20 20 20 20 20 20 20 6d 61 78 5f 63 6f max_co
6720: 75 6e 74 20 3d 20 36 2c 20 6d 69 6e 5f 63 6f 75 unt = 6, min_cou
6730: 6e 74 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 nt = 3;.
6740: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 } else {.
6750: 20 20 20 20 20 6d 61 78 5f 63 6f 75 6e 74 20 3d max_count =
6760: 20 37 2c 20 6d 69 6e 5f 63 6f 75 6e 74 20 3d 20 7, min_count =
6770: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 4;. }.
6780: 20 7d 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d }.}../* =======
6790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
67a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
67b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
67c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
67d0: 3d 3d 3d 3d 0a 20 2a 20 53 65 6e 64 20 61 20 6c ====. * Send a l
67e0: 69 74 65 72 61 6c 20 6f 72 20 64 69 73 74 61 6e iteral or distan
67f0: 63 65 20 74 72 65 65 20 69 6e 20 63 6f 6d 70 72 ce tree in compr
6800: 65 73 73 65 64 20 66 6f 72 6d 2c 20 75 73 69 6e essed form, usin
6810: 67 20 74 68 65 20 63 6f 64 65 73 20 69 6e 0a 20 g the codes in.
6820: 2a 20 62 6c 5f 74 72 65 65 2e 0a 20 2a 2f 0a 6c * bl_tree.. */.l
6830: 6f 63 61 6c 20 76 6f 69 64 20 73 65 6e 64 5f 74 ocal void send_t
6840: 72 65 65 20 28 73 2c 20 74 72 65 65 2c 20 6d 61 ree (s, tree, ma
6850: 78 5f 63 6f 64 65 29 0a 20 20 20 20 64 65 66 6c x_code). defl
6860: 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0a 20 20 ate_state *s;.
6870: 20 20 63 74 5f 64 61 74 61 20 2a 74 72 65 65 3b ct_data *tree;
6880: 20 2f 2a 20 74 68 65 20 74 72 65 65 20 74 6f 20 /* the tree to
6890: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 be scanned */.
68a0: 20 20 69 6e 74 20 6d 61 78 5f 63 6f 64 65 3b 20 int max_code;
68b0: 20 20 20 20 20 20 2f 2a 20 61 6e 64 20 69 74 73 /* and its
68c0: 20 6c 61 72 67 65 73 74 20 63 6f 64 65 20 6f 66 largest code of
68d0: 20 6e 6f 6e 20 7a 65 72 6f 20 66 72 65 71 75 65 non zero freque
68e0: 6e 63 79 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 ncy */.{. int
68f0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 n;
6900: 20 20 20 20 20 20 20 20 2f 2a 20 69 74 65 72 61 /* itera
6910: 74 65 73 20 6f 76 65 72 20 61 6c 6c 20 74 72 65 tes over all tre
6920: 65 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 e elements */.
6930: 20 20 69 6e 74 20 70 72 65 76 6c 65 6e 20 3d 20 int prevlen =
6940: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 -1; /*
6950: 6c 61 73 74 20 65 6d 69 74 74 65 64 20 6c 65 6e last emitted len
6960: 67 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 gth */. int c
6970: 75 72 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 urlen;
6980: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 /* length
6990: 6f 66 20 63 75 72 72 65 6e 74 20 63 6f 64 65 20 of current code
69a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 6c */. int nextl
69b0: 65 6e 20 3d 20 74 72 65 65 5b 30 5d 2e 4c 65 6e en = tree[0].Len
69c0: 3b 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 6e ; /* length of n
69d0: 65 78 74 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 ext code */.
69e0: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 20 20 int count = 0;
69f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 /* re
6a00: 70 65 61 74 20 63 6f 75 6e 74 20 6f 66 20 74 68 peat count of th
6a10: 65 20 63 75 72 72 65 6e 74 20 63 6f 64 65 20 2a e current code *
6a20: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 5f 63 6f /. int max_co
6a30: 75 6e 74 20 3d 20 37 3b 20 20 20 20 20 20 20 20 unt = 7;
6a40: 20 2f 2a 20 6d 61 78 20 72 65 70 65 61 74 20 63 /* max repeat c
6a50: 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ount */. int
6a60: 6d 69 6e 5f 63 6f 75 6e 74 20 3d 20 34 3b 20 20 min_count = 4;
6a70: 20 20 20 20 20 20 20 2f 2a 20 6d 69 6e 20 72 65 /* min re
6a80: 70 65 61 74 20 63 6f 75 6e 74 20 2a 2f 0a 0a 20 peat count */..
6a90: 20 20 20 2f 2a 20 74 72 65 65 5b 6d 61 78 5f 63 /* tree[max_c
6aa0: 6f 64 65 2b 31 5d 2e 4c 65 6e 20 3d 20 2d 31 3b ode+1].Len = -1;
6ab0: 20 2a 2f 20 20 2f 2a 20 67 75 61 72 64 20 61 6c */ /* guard al
6ac0: 72 65 61 64 79 20 73 65 74 20 2a 2f 0a 20 20 20 ready set */.
6ad0: 20 69 66 20 28 6e 65 78 74 6c 65 6e 20 3d 3d 20 if (nextlen ==
6ae0: 30 29 20 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 31 0) max_count = 1
6af0: 33 38 2c 20 6d 69 6e 5f 63 6f 75 6e 74 20 3d 20 38, min_count =
6b00: 33 3b 0a 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 3;.. for (n =
6b10: 20 30 3b 20 6e 20 3c 3d 20 6d 61 78 5f 63 6f 64 0; n <= max_cod
6b20: 65 3b 20 6e 2b 2b 29 20 7b 0a 20 20 20 20 20 20 e; n++) {.
6b30: 20 20 63 75 72 6c 65 6e 20 3d 20 6e 65 78 74 6c curlen = nextl
6b40: 65 6e 3b 20 6e 65 78 74 6c 65 6e 20 3d 20 74 72 en; nextlen = tr
6b50: 65 65 5b 6e 2b 31 5d 2e 4c 65 6e 3b 0a 20 20 20 ee[n+1].Len;.
6b60: 20 20 20 20 20 69 66 20 28 2b 2b 63 6f 75 6e 74 if (++count
6b70: 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 20 26 26 20 < max_count &&
6b80: 63 75 72 6c 65 6e 20 3d 3d 20 6e 65 78 74 6c 65 curlen == nextle
6b90: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 n) {.
6ba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 continue;.
6bb0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
6bc0: 75 6e 74 20 3c 20 6d 69 6e 5f 63 6f 75 6e 74 29 unt < min_count)
6bd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 {. d
6be0: 6f 20 7b 20 73 65 6e 64 5f 63 6f 64 65 28 73 2c o { send_code(s,
6bf0: 20 63 75 72 6c 65 6e 2c 20 73 2d 3e 62 6c 5f 74 curlen, s->bl_t
6c00: 72 65 65 29 3b 20 7d 20 77 68 69 6c 65 20 28 2d ree); } while (-
6c10: 2d 63 6f 75 6e 74 20 21 3d 20 30 29 3b 0a 0a 20 -count != 0);..
6c20: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 } else if
6c30: 20 28 63 75 72 6c 65 6e 20 21 3d 20 30 29 20 7b (curlen != 0) {
6c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 . if
6c50: 28 63 75 72 6c 65 6e 20 21 3d 20 70 72 65 76 6c (curlen != prevl
6c60: 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 en) {.
6c70: 20 20 20 20 20 20 73 65 6e 64 5f 63 6f 64 65 28 send_code(
6c80: 73 2c 20 63 75 72 6c 65 6e 2c 20 73 2d 3e 62 6c s, curlen, s->bl
6c90: 5f 74 72 65 65 29 3b 20 63 6f 75 6e 74 2d 2d 3b _tree); count--;
6ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
6cb0: 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65 72 Asser
6cc0: 74 28 63 6f 75 6e 74 20 3e 3d 20 33 20 26 26 20 t(count >= 3 &&
6cd0: 63 6f 75 6e 74 20 3c 3d 20 36 2c 20 22 20 33 5f count <= 6, " 3_
6ce0: 36 3f 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6?");.
6cf0: 20 20 73 65 6e 64 5f 63 6f 64 65 28 73 2c 20 52 send_code(s, R
6d00: 45 50 5f 33 5f 36 2c 20 73 2d 3e 62 6c 5f 74 72 EP_3_6, s->bl_tr
6d10: 65 65 29 3b 20 73 65 6e 64 5f 62 69 74 73 28 73 ee); send_bits(s
6d20: 2c 20 63 6f 75 6e 74 2d 33 2c 20 32 29 3b 0a 0a , count-3, 2);..
6d30: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 } else i
6d40: 66 20 28 63 6f 75 6e 74 20 3c 3d 20 31 30 29 20 f (count <= 10)
6d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 {. se
6d60: 6e 64 5f 63 6f 64 65 28 73 2c 20 52 45 50 5a 5f nd_code(s, REPZ_
6d70: 33 5f 31 30 2c 20 73 2d 3e 62 6c 5f 74 72 65 65 3_10, s->bl_tree
6d80: 29 3b 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 ); send_bits(s,
6d90: 63 6f 75 6e 74 2d 33 2c 20 33 29 3b 0a 0a 20 20 count-3, 3);..
6da0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 } else {.
6db0: 20 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 5f send_
6dc0: 63 6f 64 65 28 73 2c 20 52 45 50 5a 5f 31 31 5f code(s, REPZ_11_
6dd0: 31 33 38 2c 20 73 2d 3e 62 6c 5f 74 72 65 65 29 138, s->bl_tree)
6de0: 3b 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 63 ; send_bits(s, c
6df0: 6f 75 6e 74 2d 31 31 2c 20 37 29 3b 0a 20 20 20 ount-11, 7);.
6e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 }. c
6e10: 6f 75 6e 74 20 3d 20 30 3b 20 70 72 65 76 6c 65 ount = 0; prevle
6e20: 6e 20 3d 20 63 75 72 6c 65 6e 3b 0a 20 20 20 20 n = curlen;.
6e30: 20 20 20 20 69 66 20 28 6e 65 78 74 6c 65 6e 20 if (nextlen
6e40: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 == 0) {.
6e50: 20 20 20 20 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 max_count =
6e60: 31 33 38 2c 20 6d 69 6e 5f 63 6f 75 6e 74 20 3d 138, min_count =
6e70: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 3;. } el
6e80: 73 65 20 69 66 20 28 63 75 72 6c 65 6e 20 3d 3d se if (curlen ==
6e90: 20 6e 65 78 74 6c 65 6e 29 20 7b 0a 20 20 20 20 nextlen) {.
6ea0: 20 20 20 20 20 20 20 20 6d 61 78 5f 63 6f 75 6e max_coun
6eb0: 74 20 3d 20 36 2c 20 6d 69 6e 5f 63 6f 75 6e 74 t = 6, min_count
6ec0: 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 20 = 3;. }
6ed0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
6ee0: 20 20 20 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 37 max_count = 7
6ef0: 2c 20 6d 69 6e 5f 63 6f 75 6e 74 20 3d 20 34 3b , min_count = 4;
6f00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d . }. }
6f10: 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d .}../* =========
6f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6f30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6f60: 3d 3d 0a 20 2a 20 43 6f 6e 73 74 72 75 63 74 20 ==. * Construct
6f70: 74 68 65 20 48 75 66 66 6d 61 6e 20 74 72 65 65 the Huffman tree
6f80: 20 66 6f 72 20 74 68 65 20 62 69 74 20 6c 65 6e for the bit len
6f90: 67 74 68 73 20 61 6e 64 20 72 65 74 75 72 6e 20 gths and return
6fa0: 74 68 65 20 69 6e 64 65 78 20 69 6e 0a 20 2a 20 the index in. *
6fb0: 62 6c 5f 6f 72 64 65 72 20 6f 66 20 74 68 65 20 bl_order of the
6fc0: 6c 61 73 74 20 62 69 74 20 6c 65 6e 67 74 68 20 last bit length
6fd0: 63 6f 64 65 20 74 6f 20 73 65 6e 64 2e 0a 20 2a code to send.. *
6fe0: 2f 0a 6c 6f 63 61 6c 20 69 6e 74 20 62 75 69 6c /.local int buil
6ff0: 64 5f 62 6c 5f 74 72 65 65 28 73 29 0a 20 20 20 d_bl_tree(s).
7000: 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 2a deflate_state *
7010: 73 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 6d 61 78 s;.{. int max
7020: 5f 62 6c 69 6e 64 65 78 3b 20 20 2f 2a 20 69 6e _blindex; /* in
7030: 64 65 78 20 6f 66 20 6c 61 73 74 20 62 69 74 20 dex of last bit
7040: 6c 65 6e 67 74 68 20 63 6f 64 65 20 6f 66 20 6e length code of n
7050: 6f 6e 20 7a 65 72 6f 20 66 72 65 71 20 2a 2f 0a on zero freq */.
7060: 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e . /* Determin
7070: 65 20 74 68 65 20 62 69 74 20 6c 65 6e 67 74 68 e the bit length
7080: 20 66 72 65 71 75 65 6e 63 69 65 73 20 66 6f 72 frequencies for
7090: 20 6c 69 74 65 72 61 6c 20 61 6e 64 20 64 69 73 literal and dis
70a0: 74 61 6e 63 65 20 74 72 65 65 73 20 2a 2f 0a 20 tance trees */.
70b0: 20 20 20 73 63 61 6e 5f 74 72 65 65 28 73 2c 20 scan_tree(s,
70c0: 28 63 74 5f 64 61 74 61 20 2a 29 73 2d 3e 64 79 (ct_data *)s->dy
70d0: 6e 5f 6c 74 72 65 65 2c 20 73 2d 3e 6c 5f 64 65 n_ltree, s->l_de
70e0: 73 63 2e 6d 61 78 5f 63 6f 64 65 29 3b 0a 20 20 sc.max_code);.
70f0: 20 20 73 63 61 6e 5f 74 72 65 65 28 73 2c 20 28 scan_tree(s, (
7100: 63 74 5f 64 61 74 61 20 2a 29 73 2d 3e 64 79 6e ct_data *)s->dyn
7110: 5f 64 74 72 65 65 2c 20 73 2d 3e 64 5f 64 65 73 _dtree, s->d_des
7120: 63 2e 6d 61 78 5f 63 6f 64 65 29 3b 0a 0a 20 20 c.max_code);..
7130: 20 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 62 /* Build the b
7140: 69 74 20 6c 65 6e 67 74 68 20 74 72 65 65 3a 20 it length tree:
7150: 2a 2f 0a 20 20 20 20 62 75 69 6c 64 5f 74 72 65 */. build_tre
7160: 65 28 73 2c 20 28 74 72 65 65 5f 64 65 73 63 20 e(s, (tree_desc
7170: 2a 29 28 26 28 73 2d 3e 62 6c 5f 64 65 73 63 29 *)(&(s->bl_desc)
7180: 29 29 3b 0a 20 20 20 20 2f 2a 20 6f 70 74 5f 6c ));. /* opt_l
7190: 65 6e 20 6e 6f 77 20 69 6e 63 6c 75 64 65 73 20 en now includes
71a0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 the length of th
71b0: 65 20 74 72 65 65 20 72 65 70 72 65 73 65 6e 74 e tree represent
71c0: 61 74 69 6f 6e 73 2c 20 65 78 63 65 70 74 0a 20 ations, except.
71d0: 20 20 20 20 2a 20 74 68 65 20 6c 65 6e 67 74 68 * the length
71e0: 73 20 6f 66 20 74 68 65 20 62 69 74 20 6c 65 6e s of the bit len
71f0: 67 74 68 73 20 63 6f 64 65 73 20 61 6e 64 20 74 gths codes and t
7200: 68 65 20 35 2b 35 2b 34 20 62 69 74 73 20 66 6f he 5+5+4 bits fo
7210: 72 20 74 68 65 20 63 6f 75 6e 74 73 2e 0a 20 20 r the counts..
7220: 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 65 */.. /* De
7230: 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 termine the numb
7240: 65 72 20 6f 66 20 62 69 74 20 6c 65 6e 67 74 68 er of bit length
7250: 20 63 6f 64 65 73 20 74 6f 20 73 65 6e 64 2e 20 codes to send.
7260: 54 68 65 20 70 6b 7a 69 70 20 66 6f 72 6d 61 74 The pkzip format
7270: 0a 20 20 20 20 20 2a 20 72 65 71 75 69 72 65 73 . * requires
7280: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 34 that at least 4
7290: 20 62 69 74 20 6c 65 6e 67 74 68 20 63 6f 64 65 bit length code
72a0: 73 20 62 65 20 73 65 6e 74 2e 20 28 61 70 70 6e s be sent. (appn
72b0: 6f 74 65 2e 74 78 74 20 73 61 79 73 0a 20 20 20 ote.txt says.
72c0: 20 20 2a 20 33 20 62 75 74 20 74 68 65 20 61 63 * 3 but the ac
72d0: 74 75 61 6c 20 76 61 6c 75 65 20 75 73 65 64 20 tual value used
72e0: 69 73 20 34 2e 29 0a 20 20 20 20 20 2a 2f 0a 20 is 4.). */.
72f0: 20 20 20 66 6f 72 20 28 6d 61 78 5f 62 6c 69 6e for (max_blin
7300: 64 65 78 20 3d 20 42 4c 5f 43 4f 44 45 53 2d 31 dex = BL_CODES-1
7310: 3b 20 6d 61 78 5f 62 6c 69 6e 64 65 78 20 3e 3d ; max_blindex >=
7320: 20 33 3b 20 6d 61 78 5f 62 6c 69 6e 64 65 78 2d 3; max_blindex-
7330: 2d 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 -) {. if
7340: 28 73 2d 3e 62 6c 5f 74 72 65 65 5b 62 6c 5f 6f (s->bl_tree[bl_o
7350: 72 64 65 72 5b 6d 61 78 5f 62 6c 69 6e 64 65 78 rder[max_blindex
7360: 5d 5d 2e 4c 65 6e 20 21 3d 20 30 29 20 62 72 65 ]].Len != 0) bre
7370: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a ak;. }. /*
7380: 20 55 70 64 61 74 65 20 6f 70 74 5f 6c 65 6e 20 Update opt_len
7390: 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 62 to include the b
73a0: 69 74 20 6c 65 6e 67 74 68 20 74 72 65 65 20 61 it length tree a
73b0: 6e 64 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 nd counts */.
73c0: 20 73 2d 3e 6f 70 74 5f 6c 65 6e 20 2b 3d 20 33 s->opt_len += 3
73d0: 2a 28 6d 61 78 5f 62 6c 69 6e 64 65 78 2b 31 29 *(max_blindex+1)
73e0: 20 2b 20 35 2b 35 2b 34 3b 0a 20 20 20 20 54 72 + 5+5+4;. Tr
73f0: 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 22 5c acev((stderr, "\
7400: 6e 64 79 6e 20 74 72 65 65 73 3a 20 64 79 6e 20 ndyn trees: dyn
7410: 25 6c 64 2c 20 73 74 61 74 20 25 6c 64 22 2c 0a %ld, stat %ld",.
7420: 20 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e 6f s->o
7430: 70 74 5f 6c 65 6e 2c 20 73 2d 3e 73 74 61 74 69 pt_len, s->stati
7440: 63 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 72 65 c_len));.. re
7450: 74 75 72 6e 20 6d 61 78 5f 62 6c 69 6e 64 65 78 turn max_blindex
7460: 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d ;.}../* ========
7470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
74a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
74b0: 3d 3d 3d 0a 20 2a 20 53 65 6e 64 20 74 68 65 20 ===. * Send the
74c0: 68 65 61 64 65 72 20 66 6f 72 20 61 20 62 6c 6f header for a blo
74d0: 63 6b 20 75 73 69 6e 67 20 64 79 6e 61 6d 69 63 ck using dynamic
74e0: 20 48 75 66 66 6d 61 6e 20 74 72 65 65 73 3a 20 Huffman trees:
74f0: 74 68 65 20 63 6f 75 6e 74 73 2c 20 74 68 65 0a the counts, the.
7500: 20 2a 20 6c 65 6e 67 74 68 73 20 6f 66 20 74 68 * lengths of th
7510: 65 20 62 69 74 20 6c 65 6e 67 74 68 20 63 6f 64 e bit length cod
7520: 65 73 2c 20 74 68 65 20 6c 69 74 65 72 61 6c 20 es, the literal
7530: 74 72 65 65 20 61 6e 64 20 74 68 65 20 64 69 73 tree and the dis
7540: 74 61 6e 63 65 20 74 72 65 65 2e 0a 20 2a 20 49 tance tree.. * I
7550: 4e 20 61 73 73 65 72 74 69 6f 6e 3a 20 6c 63 6f N assertion: lco
7560: 64 65 73 20 3e 3d 20 32 35 37 2c 20 64 63 6f 64 des >= 257, dcod
7570: 65 73 20 3e 3d 20 31 2c 20 62 6c 63 6f 64 65 73 es >= 1, blcodes
7580: 20 3e 3d 20 34 2e 0a 20 2a 2f 0a 6c 6f 63 61 6c >= 4.. */.local
7590: 20 76 6f 69 64 20 73 65 6e 64 5f 61 6c 6c 5f 74 void send_all_t
75a0: 72 65 65 73 28 73 2c 20 6c 63 6f 64 65 73 2c 20 rees(s, lcodes,
75b0: 64 63 6f 64 65 73 2c 20 62 6c 63 6f 64 65 73 29 dcodes, blcodes)
75c0: 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 . deflate_sta
75d0: 74 65 20 2a 73 3b 0a 20 20 20 20 69 6e 74 20 6c te *s;. int l
75e0: 63 6f 64 65 73 2c 20 64 63 6f 64 65 73 2c 20 62 codes, dcodes, b
75f0: 6c 63 6f 64 65 73 3b 20 2f 2a 20 6e 75 6d 62 65 lcodes; /* numbe
7600: 72 20 6f 66 20 63 6f 64 65 73 20 66 6f 72 20 65 r of codes for e
7610: 61 63 68 20 74 72 65 65 20 2a 2f 0a 7b 0a 20 20 ach tree */.{.
7620: 20 20 69 6e 74 20 72 61 6e 6b 3b 20 20 20 20 20 int rank;
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
7640: 2a 20 69 6e 64 65 78 20 69 6e 20 62 6c 5f 6f 72 * index in bl_or
7650: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 41 73 73 65 der */.. Asse
7660: 72 74 20 28 6c 63 6f 64 65 73 20 3e 3d 20 32 35 rt (lcodes >= 25
7670: 37 20 26 26 20 64 63 6f 64 65 73 20 3e 3d 20 31 7 && dcodes >= 1
7680: 20 26 26 20 62 6c 63 6f 64 65 73 20 3e 3d 20 34 && blcodes >= 4
7690: 2c 20 22 6e 6f 74 20 65 6e 6f 75 67 68 20 63 6f , "not enough co
76a0: 64 65 73 22 29 3b 0a 20 20 20 20 41 73 73 65 72 des");. Asser
76b0: 74 20 28 6c 63 6f 64 65 73 20 3c 3d 20 4c 5f 43 t (lcodes <= L_C
76c0: 4f 44 45 53 20 26 26 20 64 63 6f 64 65 73 20 3c ODES && dcodes <
76d0: 3d 20 44 5f 43 4f 44 45 53 20 26 26 20 62 6c 63 = D_CODES && blc
76e0: 6f 64 65 73 20 3c 3d 20 42 4c 5f 43 4f 44 45 53 odes <= BL_CODES
76f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74 ,. "t
7700: 6f 6f 20 6d 61 6e 79 20 63 6f 64 65 73 22 29 3b oo many codes");
7710: 0a 20 20 20 20 54 72 61 63 65 76 28 28 73 74 64 . Tracev((std
7720: 65 72 72 2c 20 22 5c 6e 62 6c 20 63 6f 75 6e 74 err, "\nbl count
7730: 73 3a 20 22 29 29 3b 0a 20 20 20 20 73 65 6e 64 s: "));. send
7740: 5f 62 69 74 73 28 73 2c 20 6c 63 6f 64 65 73 2d _bits(s, lcodes-
7750: 32 35 37 2c 20 35 29 3b 20 2f 2a 20 6e 6f 74 20 257, 5); /* not
7760: 2b 32 35 35 20 61 73 20 73 74 61 74 65 64 20 69 +255 as stated i
7770: 6e 20 61 70 70 6e 6f 74 65 2e 74 78 74 20 2a 2f n appnote.txt */
7780: 0a 20 20 20 20 73 65 6e 64 5f 62 69 74 73 28 73 . send_bits(s
7790: 2c 20 64 63 6f 64 65 73 2d 31 2c 20 20 20 35 29 , dcodes-1, 5)
77a0: 3b 0a 20 20 20 20 73 65 6e 64 5f 62 69 74 73 28 ;. send_bits(
77b0: 73 2c 20 62 6c 63 6f 64 65 73 2d 34 2c 20 20 34 s, blcodes-4, 4
77c0: 29 3b 20 2f 2a 20 6e 6f 74 20 2d 33 20 61 73 20 ); /* not -3 as
77d0: 73 74 61 74 65 64 20 69 6e 20 61 70 70 6e 6f 74 stated in appnot
77e0: 65 2e 74 78 74 20 2a 2f 0a 20 20 20 20 66 6f 72 e.txt */. for
77f0: 20 28 72 61 6e 6b 20 3d 20 30 3b 20 72 61 6e 6b (rank = 0; rank
7800: 20 3c 20 62 6c 63 6f 64 65 73 3b 20 72 61 6e 6b < blcodes; rank
7810: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 54 72 ++) {. Tr
7820: 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 22 5c acev((stderr, "\
7830: 6e 62 6c 20 63 6f 64 65 20 25 32 64 20 22 2c 20 nbl code %2d ",
7840: 62 6c 5f 6f 72 64 65 72 5b 72 61 6e 6b 5d 29 29 bl_order[rank]))
7850: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 64 5f 62 ;. send_b
7860: 69 74 73 28 73 2c 20 73 2d 3e 62 6c 5f 74 72 65 its(s, s->bl_tre
7870: 65 5b 62 6c 5f 6f 72 64 65 72 5b 72 61 6e 6b 5d e[bl_order[rank]
7880: 5d 2e 4c 65 6e 2c 20 33 29 3b 0a 20 20 20 20 7d ].Len, 3);. }
7890: 0a 20 20 20 20 54 72 61 63 65 76 28 28 73 74 64 . Tracev((std
78a0: 65 72 72 2c 20 22 5c 6e 62 6c 20 74 72 65 65 3a err, "\nbl tree:
78b0: 20 73 65 6e 74 20 25 6c 64 22 2c 20 73 2d 3e 62 sent %ld", s->b
78c0: 69 74 73 5f 73 65 6e 74 29 29 3b 0a 0a 20 20 20 its_sent));..
78d0: 20 73 65 6e 64 5f 74 72 65 65 28 73 2c 20 28 63 send_tree(s, (c
78e0: 74 5f 64 61 74 61 20 2a 29 73 2d 3e 64 79 6e 5f t_data *)s->dyn_
78f0: 6c 74 72 65 65 2c 20 6c 63 6f 64 65 73 2d 31 29 ltree, lcodes-1)
7900: 3b 20 2f 2a 20 6c 69 74 65 72 61 6c 20 74 72 65 ; /* literal tre
7910: 65 20 2a 2f 0a 20 20 20 20 54 72 61 63 65 76 28 e */. Tracev(
7920: 28 73 74 64 65 72 72 2c 20 22 5c 6e 6c 69 74 20 (stderr, "\nlit
7930: 74 72 65 65 3a 20 73 65 6e 74 20 25 6c 64 22 2c tree: sent %ld",
7940: 20 73 2d 3e 62 69 74 73 5f 73 65 6e 74 29 29 3b s->bits_sent));
7950: 0a 0a 20 20 20 20 73 65 6e 64 5f 74 72 65 65 28 .. send_tree(
7960: 73 2c 20 28 63 74 5f 64 61 74 61 20 2a 29 73 2d s, (ct_data *)s-
7970: 3e 64 79 6e 5f 64 74 72 65 65 2c 20 64 63 6f 64 >dyn_dtree, dcod
7980: 65 73 2d 31 29 3b 20 2f 2a 20 64 69 73 74 61 6e es-1); /* distan
7990: 63 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 54 ce tree */. T
79a0: 72 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 22 racev((stderr, "
79b0: 5c 6e 64 69 73 74 20 74 72 65 65 3a 20 73 65 6e \ndist tree: sen
79c0: 74 20 25 6c 64 22 2c 20 73 2d 3e 62 69 74 73 5f t %ld", s->bits_
79d0: 73 65 6e 74 29 29 3b 0a 7d 0a 0a 2f 2a 20 3d 3d sent));.}../* ==
79e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
79f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 53 65 6e =========. * Sen
7a30: 64 20 61 20 73 74 6f 72 65 64 20 62 6c 6f 63 6b d a stored block
7a40: 0a 20 2a 2f 0a 76 6f 69 64 20 5f 74 72 5f 73 74 . */.void _tr_st
7a50: 6f 72 65 64 5f 62 6c 6f 63 6b 28 73 2c 20 62 75 ored_block(s, bu
7a60: 66 2c 20 73 74 6f 72 65 64 5f 6c 65 6e 2c 20 65 f, stored_len, e
7a70: 6f 66 29 0a 20 20 20 20 64 65 66 6c 61 74 65 5f of). deflate_
7a80: 73 74 61 74 65 20 2a 73 3b 0a 20 20 20 20 63 68 state *s;. ch
7a90: 61 72 66 20 2a 62 75 66 3b 20 20 20 20 20 20 20 arf *buf;
7aa0: 2f 2a 20 69 6e 70 75 74 20 62 6c 6f 63 6b 20 2a /* input block *
7ab0: 2f 0a 20 20 20 20 75 6c 67 20 73 74 6f 72 65 64 /. ulg stored
7ac0: 5f 6c 65 6e 3b 20 20 20 2f 2a 20 6c 65 6e 67 74 _len; /* lengt
7ad0: 68 20 6f 66 20 69 6e 70 75 74 20 62 6c 6f 63 6b h of input block
7ae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6f 66 3b */. int eof;
7af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 /* tru
7b00: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 e if this is the
7b10: 20 6c 61 73 74 20 62 6c 6f 63 6b 20 66 6f 72 20 last block for
7b20: 61 20 66 69 6c 65 20 2a 2f 0a 7b 0a 20 20 20 20 a file */.{.
7b30: 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 28 53 54 send_bits(s, (ST
7b40: 4f 52 45 44 5f 42 4c 4f 43 4b 3c 3c 31 29 2b 65 ORED_BLOCK<<1)+e
7b50: 6f 66 2c 20 33 29 3b 20 20 2f 2a 20 73 65 6e 64 of, 3); /* send
7b60: 20 62 6c 6f 63 6b 20 74 79 70 65 20 2a 2f 0a 23 block type */.#
7b70: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 20 20 ifdef DEBUG.
7b80: 73 2d 3e 63 6f 6d 70 72 65 73 73 65 64 5f 6c 65 s->compressed_le
7b90: 6e 20 3d 20 28 73 2d 3e 63 6f 6d 70 72 65 73 73 n = (s->compress
7ba0: 65 64 5f 6c 65 6e 20 2b 20 33 20 2b 20 37 29 20 ed_len + 3 + 7)
7bb0: 26 20 28 75 6c 67 29 7e 37 4c 3b 0a 20 20 20 20 & (ulg)~7L;.
7bc0: 73 2d 3e 63 6f 6d 70 72 65 73 73 65 64 5f 6c 65 s->compressed_le
7bd0: 6e 20 2b 3d 20 28 73 74 6f 72 65 64 5f 6c 65 6e n += (stored_len
7be0: 20 2b 20 34 29 20 3c 3c 20 33 3b 0a 23 65 6e 64 + 4) << 3;.#end
7bf0: 69 66 0a 20 20 20 20 63 6f 70 79 5f 62 6c 6f 63 if. copy_bloc
7c00: 6b 28 73 2c 20 62 75 66 2c 20 28 75 6e 73 69 67 k(s, buf, (unsig
7c10: 6e 65 64 29 73 74 6f 72 65 64 5f 6c 65 6e 2c 20 ned)stored_len,
7c20: 31 29 3b 20 2f 2a 20 77 69 74 68 20 68 65 61 64 1); /* with head
7c30: 65 72 20 2a 2f 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d er */.}../* ====
7c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7c80: 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 53 65 6e 64 20 =======. * Send
7c90: 6f 6e 65 20 65 6d 70 74 79 20 73 74 61 74 69 63 one empty static
7ca0: 20 62 6c 6f 63 6b 20 74 6f 20 67 69 76 65 20 65 block to give e
7cb0: 6e 6f 75 67 68 20 6c 6f 6f 6b 61 68 65 61 64 20 nough lookahead
7cc0: 66 6f 72 20 69 6e 66 6c 61 74 65 2e 0a 20 2a 20 for inflate.. *
7cd0: 54 68 69 73 20 74 61 6b 65 73 20 31 30 20 62 69 This takes 10 bi
7ce0: 74 73 2c 20 6f 66 20 77 68 69 63 68 20 37 20 6d ts, of which 7 m
7cf0: 61 79 20 72 65 6d 61 69 6e 20 69 6e 20 74 68 65 ay remain in the
7d00: 20 62 69 74 20 62 75 66 66 65 72 2e 0a 20 2a 20 bit buffer.. *
7d10: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6e 66 6c The current infl
7d20: 61 74 65 20 63 6f 64 65 20 72 65 71 75 69 72 65 ate code require
7d30: 73 20 39 20 62 69 74 73 20 6f 66 20 6c 6f 6f 6b s 9 bits of look
7d40: 61 68 65 61 64 2e 20 49 66 20 74 68 65 0a 20 2a ahead. If the. *
7d50: 20 6c 61 73 74 20 74 77 6f 20 63 6f 64 65 73 20 last two codes
7d60: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 for the previous
7d70: 20 62 6c 6f 63 6b 20 28 72 65 61 6c 20 63 6f 64 block (real cod
7d80: 65 20 70 6c 75 73 20 45 4f 42 29 20 77 65 72 65 e plus EOB) were
7d90: 20 63 6f 64 65 64 0a 20 2a 20 6f 6e 20 35 20 62 coded. * on 5 b
7da0: 69 74 73 20 6f 72 20 6c 65 73 73 2c 20 69 6e 66 its or less, inf
7db0: 6c 61 74 65 20 6d 61 79 20 68 61 76 65 20 6f 6e late may have on
7dc0: 6c 79 20 35 2b 33 20 62 69 74 73 20 6f 66 20 6c ly 5+3 bits of l
7dd0: 6f 6f 6b 61 68 65 61 64 20 74 6f 20 64 65 63 6f ookahead to deco
7de0: 64 65 0a 20 2a 20 74 68 65 20 6c 61 73 74 20 72 de. * the last r
7df0: 65 61 6c 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 eal code. In thi
7e00: 73 20 63 61 73 65 20 77 65 20 73 65 6e 64 20 74 s case we send t
7e10: 77 6f 20 65 6d 70 74 79 20 73 74 61 74 69 63 20 wo empty static
7e20: 62 6c 6f 63 6b 73 20 69 6e 73 74 65 61 64 0a 20 blocks instead.
7e30: 2a 20 6f 66 20 6f 6e 65 2e 20 28 54 68 65 72 65 * of one. (There
7e40: 20 61 72 65 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 are no problems
7e50: 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 if the previous
7e60: 20 62 6c 6f 63 6b 20 69 73 20 73 74 6f 72 65 64 block is stored
7e70: 20 6f 72 20 66 69 78 65 64 2e 29 0a 20 2a 20 54 or fixed.). * T
7e80: 6f 20 73 69 6d 70 6c 69 66 79 20 74 68 65 20 63 o simplify the c
7e90: 6f 64 65 2c 20 77 65 20 61 73 73 75 6d 65 20 74 ode, we assume t
7ea0: 68 65 20 77 6f 72 73 74 20 63 61 73 65 20 6f 66 he worst case of
7eb0: 20 6c 61 73 74 20 72 65 61 6c 20 63 6f 64 65 20 last real code
7ec0: 65 6e 63 6f 64 65 64 0a 20 2a 20 6f 6e 20 6f 6e encoded. * on on
7ed0: 65 20 62 69 74 20 6f 6e 6c 79 2e 0a 20 2a 2f 0a e bit only.. */.
7ee0: 76 6f 69 64 20 5f 74 72 5f 61 6c 69 67 6e 28 73 void _tr_align(s
7ef0: 29 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 ). deflate_st
7f00: 61 74 65 20 2a 73 3b 0a 7b 0a 20 20 20 20 73 65 ate *s;.{. se
7f10: 6e 64 5f 62 69 74 73 28 73 2c 20 53 54 41 54 49 nd_bits(s, STATI
7f20: 43 5f 54 52 45 45 53 3c 3c 31 2c 20 33 29 3b 0a C_TREES<<1, 3);.
7f30: 20 20 20 20 73 65 6e 64 5f 63 6f 64 65 28 73 2c send_code(s,
7f40: 20 45 4e 44 5f 42 4c 4f 43 4b 2c 20 73 74 61 74 END_BLOCK, stat
7f50: 69 63 5f 6c 74 72 65 65 29 3b 0a 23 69 66 64 65 ic_ltree);.#ifde
7f60: 66 20 44 45 42 55 47 0a 20 20 20 20 73 2d 3e 63 f DEBUG. s->c
7f70: 6f 6d 70 72 65 73 73 65 64 5f 6c 65 6e 20 2b 3d ompressed_len +=
7f80: 20 31 30 4c 3b 20 2f 2a 20 33 20 66 6f 72 20 62 10L; /* 3 for b
7f90: 6c 6f 63 6b 20 74 79 70 65 2c 20 37 20 66 6f 72 lock type, 7 for
7fa0: 20 45 4f 42 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 EOB */.#endif.
7fb0: 20 20 20 62 69 5f 66 6c 75 73 68 28 73 29 3b 0a bi_flush(s);.
7fc0: 20 20 20 20 2f 2a 20 4f 66 20 74 68 65 20 31 30 /* Of the 10
7fd0: 20 62 69 74 73 20 66 6f 72 20 74 68 65 20 65 6d bits for the em
7fe0: 70 74 79 20 62 6c 6f 63 6b 2c 20 77 65 20 68 61 pty block, we ha
7ff0: 76 65 20 61 6c 72 65 61 64 79 20 73 65 6e 74 0a ve already sent.
8000: 20 20 20 20 20 2a 20 28 31 30 20 2d 20 62 69 5f * (10 - bi_
8010: 76 61 6c 69 64 29 20 62 69 74 73 2e 20 54 68 65 valid) bits. The
8020: 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 74 lookahead for t
8030: 68 65 20 6c 61 73 74 20 72 65 61 6c 20 63 6f 64 he last real cod
8040: 65 20 28 62 65 66 6f 72 65 0a 20 20 20 20 20 2a e (before. *
8050: 20 74 68 65 20 45 4f 42 20 6f 66 20 74 68 65 20 the EOB of the
8060: 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 29 20 previous block)
8070: 77 61 73 20 74 68 75 73 20 61 74 20 6c 65 61 73 was thus at leas
8080: 74 20 6f 6e 65 20 70 6c 75 73 20 74 68 65 20 6c t one plus the l
8090: 65 6e 67 74 68 0a 20 20 20 20 20 2a 20 6f 66 20 ength. * of
80a0: 74 68 65 20 45 4f 42 20 70 6c 75 73 20 77 68 61 the EOB plus wha
80b0: 74 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 73 t we have just s
80c0: 65 6e 74 20 6f 66 20 74 68 65 20 65 6d 70 74 79 ent of the empty
80d0: 20 73 74 61 74 69 63 20 62 6c 6f 63 6b 2e 0a 20 static block..
80e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 31 */. if (1
80f0: 20 2b 20 73 2d 3e 6c 61 73 74 5f 65 6f 62 5f 6c + s->last_eob_l
8100: 65 6e 20 2b 20 31 30 20 2d 20 73 2d 3e 62 69 5f en + 10 - s->bi_
8110: 76 61 6c 69 64 20 3c 20 39 29 20 7b 0a 20 20 20 valid < 9) {.
8120: 20 20 20 20 20 73 65 6e 64 5f 62 69 74 73 28 73 send_bits(s
8130: 2c 20 53 54 41 54 49 43 5f 54 52 45 45 53 3c 3c , STATIC_TREES<<
8140: 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 73 1, 3);. s
8150: 65 6e 64 5f 63 6f 64 65 28 73 2c 20 45 4e 44 5f end_code(s, END_
8160: 42 4c 4f 43 4b 2c 20 73 74 61 74 69 63 5f 6c 74 BLOCK, static_lt
8170: 72 65 65 29 3b 0a 23 69 66 64 65 66 20 44 45 42 ree);.#ifdef DEB
8180: 55 47 0a 20 20 20 20 20 20 20 20 73 2d 3e 63 6f UG. s->co
8190: 6d 70 72 65 73 73 65 64 5f 6c 65 6e 20 2b 3d 20 mpressed_len +=
81a0: 31 30 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 10L;.#endif.
81b0: 20 20 20 20 62 69 5f 66 6c 75 73 68 28 73 29 3b bi_flush(s);
81c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 2d 3e 6c 61 . }. s->la
81d0: 73 74 5f 65 6f 62 5f 6c 65 6e 20 3d 20 37 3b 0a st_eob_len = 7;.
81e0: 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d }../* ==========
81f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8230: 3d 0a 20 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 =. * Determine t
8240: 68 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 he best encoding
8250: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
8260: 20 62 6c 6f 63 6b 3a 20 64 79 6e 61 6d 69 63 20 block: dynamic
8270: 74 72 65 65 73 2c 20 73 74 61 74 69 63 0a 20 2a trees, static. *
8280: 20 74 72 65 65 73 20 6f 72 20 73 74 6f 72 65 2c trees or store,
8290: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 and output the
82a0: 65 6e 63 6f 64 65 64 20 62 6c 6f 63 6b 20 74 6f encoded block to
82b0: 20 74 68 65 20 7a 69 70 20 66 69 6c 65 2e 0a 20 the zip file..
82c0: 2a 2f 0a 76 6f 69 64 20 5f 74 72 5f 66 6c 75 73 */.void _tr_flus
82d0: 68 5f 62 6c 6f 63 6b 28 73 2c 20 62 75 66 2c 20 h_block(s, buf,
82e0: 73 74 6f 72 65 64 5f 6c 65 6e 2c 20 65 6f 66 29 stored_len, eof)
82f0: 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 . deflate_sta
8300: 74 65 20 2a 73 3b 0a 20 20 20 20 63 68 61 72 66 te *s;. charf
8310: 20 2a 62 75 66 3b 20 20 20 20 20 20 20 2f 2a 20 *buf; /*
8320: 69 6e 70 75 74 20 62 6c 6f 63 6b 2c 20 6f 72 20 input block, or
8330: 4e 55 4c 4c 20 69 66 20 74 6f 6f 20 6f 6c 64 20 NULL if too old
8340: 2a 2f 0a 20 20 20 20 75 6c 67 20 73 74 6f 72 65 */. ulg store
8350: 64 5f 6c 65 6e 3b 20 20 20 2f 2a 20 6c 65 6e 67 d_len; /* leng
8360: 74 68 20 6f 66 20 69 6e 70 75 74 20 62 6c 6f 63 th of input bloc
8370: 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6f 66 k */. int eof
8380: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 ; /* tr
8390: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 ue if this is th
83a0: 65 20 6c 61 73 74 20 62 6c 6f 63 6b 20 66 6f 72 e last block for
83b0: 20 61 20 66 69 6c 65 20 2a 2f 0a 7b 0a 20 20 20 a file */.{.
83c0: 20 75 6c 67 20 6f 70 74 5f 6c 65 6e 62 2c 20 73 ulg opt_lenb, s
83d0: 74 61 74 69 63 5f 6c 65 6e 62 3b 20 2f 2a 20 6f tatic_lenb; /* o
83e0: 70 74 5f 6c 65 6e 20 61 6e 64 20 73 74 61 74 69 pt_len and stati
83f0: 63 5f 6c 65 6e 20 69 6e 20 62 79 74 65 73 20 2a c_len in bytes *
8400: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 5f 62 6c /. int max_bl
8410: 69 6e 64 65 78 20 3d 20 30 3b 20 20 2f 2a 20 69 index = 0; /* i
8420: 6e 64 65 78 20 6f 66 20 6c 61 73 74 20 62 69 74 ndex of last bit
8430: 20 6c 65 6e 67 74 68 20 63 6f 64 65 20 6f 66 20 length code of
8440: 6e 6f 6e 20 7a 65 72 6f 20 66 72 65 71 20 2a 2f non zero freq */
8450: 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 74 .. /* Build t
8460: 68 65 20 48 75 66 66 6d 61 6e 20 74 72 65 65 73 he Huffman trees
8470: 20 75 6e 6c 65 73 73 20 61 20 73 74 6f 72 65 64 unless a stored
8480: 20 62 6c 6f 63 6b 20 69 73 20 66 6f 72 63 65 64 block is forced
8490: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 2d 3e 6c */. if (s->l
84a0: 65 76 65 6c 20 3e 20 30 29 20 7b 0a 0a 09 20 2f evel > 0) {... /
84b0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 * Check if the f
84c0: 69 6c 65 20 69 73 20 61 73 63 69 69 20 6f 72 20 ile is ascii or
84d0: 62 69 6e 61 72 79 20 2a 2f 0a 09 69 66 20 28 73 binary */..if (s
84e0: 2d 3e 64 61 74 61 5f 74 79 70 65 20 3d 3d 20 5a ->data_type == Z
84f0: 5f 55 4e 4b 4e 4f 57 4e 29 20 73 65 74 5f 64 61 _UNKNOWN) set_da
8500: 74 61 5f 74 79 70 65 28 73 29 3b 0a 0a 09 2f 2a ta_type(s);.../*
8510: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6c Construct the l
8520: 69 74 65 72 61 6c 20 61 6e 64 20 64 69 73 74 61 iteral and dista
8530: 6e 63 65 20 74 72 65 65 73 20 2a 2f 0a 09 62 75 nce trees */..bu
8540: 69 6c 64 5f 74 72 65 65 28 73 2c 20 28 74 72 65 ild_tree(s, (tre
8550: 65 5f 64 65 73 63 20 2a 29 28 26 28 73 2d 3e 6c e_desc *)(&(s->l
8560: 5f 64 65 73 63 29 29 29 3b 0a 09 54 72 61 63 65 _desc)));..Trace
8570: 76 28 28 73 74 64 65 72 72 2c 20 22 5c 6e 6c 69 v((stderr, "\nli
8580: 74 20 64 61 74 61 3a 20 64 79 6e 20 25 6c 64 2c t data: dyn %ld,
8590: 20 73 74 61 74 20 25 6c 64 22 2c 20 73 2d 3e 6f stat %ld", s->o
85a0: 70 74 5f 6c 65 6e 2c 0a 09 09 73 2d 3e 73 74 61 pt_len,...s->sta
85b0: 74 69 63 5f 6c 65 6e 29 29 3b 0a 0a 09 62 75 69 tic_len));...bui
85c0: 6c 64 5f 74 72 65 65 28 73 2c 20 28 74 72 65 65 ld_tree(s, (tree
85d0: 5f 64 65 73 63 20 2a 29 28 26 28 73 2d 3e 64 5f _desc *)(&(s->d_
85e0: 64 65 73 63 29 29 29 3b 0a 09 54 72 61 63 65 76 desc)));..Tracev
85f0: 28 28 73 74 64 65 72 72 2c 20 22 5c 6e 64 69 73 ((stderr, "\ndis
8600: 74 20 64 61 74 61 3a 20 64 79 6e 20 25 6c 64 2c t data: dyn %ld,
8610: 20 73 74 61 74 20 25 6c 64 22 2c 20 73 2d 3e 6f stat %ld", s->o
8620: 70 74 5f 6c 65 6e 2c 0a 09 09 73 2d 3e 73 74 61 pt_len,...s->sta
8630: 74 69 63 5f 6c 65 6e 29 29 3b 0a 09 2f 2a 20 41 tic_len));../* A
8640: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 t this point, op
8650: 74 5f 6c 65 6e 20 61 6e 64 20 73 74 61 74 69 63 t_len and static
8660: 5f 6c 65 6e 20 61 72 65 20 74 68 65 20 74 6f 74 _len are the tot
8670: 61 6c 20 62 69 74 20 6c 65 6e 67 74 68 73 20 6f al bit lengths o
8680: 66 0a 09 20 2a 20 74 68 65 20 63 6f 6d 70 72 65 f.. * the compre
8690: 73 73 65 64 20 62 6c 6f 63 6b 20 64 61 74 61 2c ssed block data,
86a0: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 excluding the t
86b0: 72 65 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 ree representati
86c0: 6f 6e 73 2e 0a 09 20 2a 2f 0a 0a 09 2f 2a 20 42 ons... */.../* B
86d0: 75 69 6c 64 20 74 68 65 20 62 69 74 20 6c 65 6e uild the bit len
86e0: 67 74 68 20 74 72 65 65 20 66 6f 72 20 74 68 65 gth tree for the
86f0: 20 61 62 6f 76 65 20 74 77 6f 20 74 72 65 65 73 above two trees
8700: 2c 20 61 6e 64 20 67 65 74 20 74 68 65 20 69 6e , and get the in
8710: 64 65 78 0a 09 20 2a 20 69 6e 20 62 6c 5f 6f 72 dex.. * in bl_or
8720: 64 65 72 20 6f 66 20 74 68 65 20 6c 61 73 74 20 der of the last
8730: 62 69 74 20 6c 65 6e 67 74 68 20 63 6f 64 65 20 bit length code
8740: 74 6f 20 73 65 6e 64 2e 0a 09 20 2a 2f 0a 09 6d to send... */..m
8750: 61 78 5f 62 6c 69 6e 64 65 78 20 3d 20 62 75 69 ax_blindex = bui
8760: 6c 64 5f 62 6c 5f 74 72 65 65 28 73 29 3b 0a 0a ld_bl_tree(s);..
8770: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 ./* Determine th
8780: 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 2e e best encoding.
8790: 20 43 6f 6d 70 75 74 65 20 66 69 72 73 74 20 74 Compute first t
87a0: 68 65 20 62 6c 6f 63 6b 20 6c 65 6e 67 74 68 20 he block length
87b0: 69 6e 20 62 79 74 65 73 2a 2f 0a 09 6f 70 74 5f in bytes*/..opt_
87c0: 6c 65 6e 62 20 3d 20 28 73 2d 3e 6f 70 74 5f 6c lenb = (s->opt_l
87d0: 65 6e 2b 33 2b 37 29 3e 3e 33 3b 0a 09 73 74 61 en+3+7)>>3;..sta
87e0: 74 69 63 5f 6c 65 6e 62 20 3d 20 28 73 2d 3e 73 tic_lenb = (s->s
87f0: 74 61 74 69 63 5f 6c 65 6e 2b 33 2b 37 29 3e 3e tatic_len+3+7)>>
8800: 33 3b 0a 0a 09 54 72 61 63 65 76 28 28 73 74 64 3;...Tracev((std
8810: 65 72 72 2c 20 22 5c 6e 6f 70 74 20 25 6c 75 28 err, "\nopt %lu(
8820: 25 6c 75 29 20 73 74 61 74 20 25 6c 75 28 25 6c %lu) stat %lu(%l
8830: 75 29 20 73 74 6f 72 65 64 20 25 6c 75 20 6c 69 u) stored %lu li
8840: 74 20 25 75 20 22 2c 0a 09 09 6f 70 74 5f 6c 65 t %u ",...opt_le
8850: 6e 62 2c 20 73 2d 3e 6f 70 74 5f 6c 65 6e 2c 20 nb, s->opt_len,
8860: 73 74 61 74 69 63 5f 6c 65 6e 62 2c 20 73 2d 3e static_lenb, s->
8870: 73 74 61 74 69 63 5f 6c 65 6e 2c 20 73 74 6f 72 static_len, stor
8880: 65 64 5f 6c 65 6e 2c 0a 09 09 73 2d 3e 6c 61 73 ed_len,...s->las
8890: 74 5f 6c 69 74 29 29 3b 0a 0a 09 69 66 20 28 73 t_lit));...if (s
88a0: 74 61 74 69 63 5f 6c 65 6e 62 20 3c 3d 20 6f 70 tatic_lenb <= op
88b0: 74 5f 6c 65 6e 62 29 20 6f 70 74 5f 6c 65 6e 62 t_lenb) opt_lenb
88c0: 20 3d 20 73 74 61 74 69 63 5f 6c 65 6e 62 3b 0a = static_lenb;.
88d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 . } else {.
88e0: 20 20 20 20 20 20 41 73 73 65 72 74 28 62 75 66 Assert(buf
88f0: 20 21 3d 20 28 63 68 61 72 2a 29 30 2c 20 22 6c != (char*)0, "l
8900: 6f 73 74 20 62 75 66 22 29 3b 0a 09 6f 70 74 5f ost buf");..opt_
8910: 6c 65 6e 62 20 3d 20 73 74 61 74 69 63 5f 6c 65 lenb = static_le
8920: 6e 62 20 3d 20 73 74 6f 72 65 64 5f 6c 65 6e 20 nb = stored_len
8930: 2b 20 35 3b 20 2f 2a 20 66 6f 72 63 65 20 61 20 + 5; /* force a
8940: 73 74 6f 72 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a stored block */.
8950: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 4f }..#ifdef FO
8960: 52 43 45 5f 53 54 4f 52 45 44 0a 20 20 20 20 69 RCE_STORED. i
8970: 66 20 28 62 75 66 20 21 3d 20 28 63 68 61 72 2a f (buf != (char*
8980: 29 30 29 20 7b 20 2f 2a 20 66 6f 72 63 65 20 73 )0) { /* force s
8990: 74 6f 72 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 23 tored block */.#
89a0: 65 6c 73 65 0a 20 20 20 20 69 66 20 28 73 74 6f else. if (sto
89b0: 72 65 64 5f 6c 65 6e 2b 34 20 3c 3d 20 6f 70 74 red_len+4 <= opt
89c0: 5f 6c 65 6e 62 20 26 26 20 62 75 66 20 21 3d 20 _lenb && buf !=
89d0: 28 63 68 61 72 2a 29 30 29 20 7b 0a 20 20 20 20 (char*)0) {.
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
89f0: 20 20 20 2f 2a 20 34 3a 20 74 77 6f 20 77 6f 72 /* 4: two wor
8a00: 64 73 20 66 6f 72 20 74 68 65 20 6c 65 6e 67 74 ds for the lengt
8a10: 68 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 hs */.#endif.
8a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 73 74 /* The test
8a30: 20 62 75 66 20 21 3d 20 4e 55 4c 4c 20 69 73 20 buf != NULL is
8a40: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 69 only necessary i
8a50: 66 20 4c 49 54 5f 42 55 46 53 49 5a 45 20 3e 20 f LIT_BUFSIZE >
8a60: 57 53 49 5a 45 2e 0a 20 20 20 20 20 20 20 20 20 WSIZE..
8a70: 2a 20 4f 74 68 65 72 77 69 73 65 20 77 65 20 63 * Otherwise we c
8a80: 61 6e 27 74 20 68 61 76 65 20 70 72 6f 63 65 73 an't have proces
8a90: 73 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 57 53 sed more than WS
8aa0: 49 5a 45 20 69 6e 70 75 74 20 62 79 74 65 73 20 IZE input bytes
8ab0: 73 69 6e 63 65 0a 20 20 20 20 20 20 20 20 20 2a since. *
8ac0: 20 74 68 65 20 6c 61 73 74 20 62 6c 6f 63 6b 20 the last block
8ad0: 66 6c 75 73 68 2c 20 62 65 63 61 75 73 65 20 63 flush, because c
8ae0: 6f 6d 70 72 65 73 73 69 6f 6e 20 77 6f 75 6c 64 ompression would
8af0: 20 68 61 76 65 20 62 65 65 6e 0a 20 20 20 20 20 have been.
8b00: 20 20 20 20 2a 20 73 75 63 63 65 73 73 66 75 6c * successful
8b10: 2e 20 49 66 20 4c 49 54 5f 42 55 46 53 49 5a 45 . If LIT_BUFSIZE
8b20: 20 3c 3d 20 57 53 49 5a 45 2c 20 69 74 20 69 73 <= WSIZE, it is
8b30: 20 6e 65 76 65 72 20 74 6f 6f 20 6c 61 74 65 20 never too late
8b40: 74 6f 0a 20 20 20 20 20 20 20 20 20 2a 20 74 72 to. * tr
8b50: 61 6e 73 66 6f 72 6d 20 61 20 62 6c 6f 63 6b 20 ansform a block
8b60: 69 6e 74 6f 20 61 20 73 74 6f 72 65 64 20 62 6c into a stored bl
8b70: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 20 2a 2f ock.. */
8b80: 0a 20 20 20 20 20 20 20 20 5f 74 72 5f 73 74 6f . _tr_sto
8b90: 72 65 64 5f 62 6c 6f 63 6b 28 73 2c 20 62 75 66 red_block(s, buf
8ba0: 2c 20 73 74 6f 72 65 64 5f 6c 65 6e 2c 20 65 6f , stored_len, eo
8bb0: 66 29 3b 0a 0a 23 69 66 64 65 66 20 46 4f 52 43 f);..#ifdef FORC
8bc0: 45 5f 53 54 41 54 49 43 0a 20 20 20 20 7d 20 65 E_STATIC. } e
8bd0: 6c 73 65 20 69 66 20 28 73 74 61 74 69 63 5f 6c lse if (static_l
8be0: 65 6e 62 20 3e 3d 20 30 29 20 7b 20 2f 2a 20 66 enb >= 0) { /* f
8bf0: 6f 72 63 65 20 73 74 61 74 69 63 20 74 72 65 65 orce static tree
8c00: 73 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 20 20 7d s */.#else. }
8c10: 20 65 6c 73 65 20 69 66 20 28 73 74 61 74 69 63 else if (static
8c20: 5f 6c 65 6e 62 20 3d 3d 20 6f 70 74 5f 6c 65 6e _lenb == opt_len
8c30: 62 29 20 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 b) {.#endif.
8c40: 20 20 20 20 73 65 6e 64 5f 62 69 74 73 28 73 2c send_bits(s,
8c50: 20 28 53 54 41 54 49 43 5f 54 52 45 45 53 3c 3c (STATIC_TREES<<
8c60: 31 29 2b 65 6f 66 2c 20 33 29 3b 0a 20 20 20 20 1)+eof, 3);.
8c70: 20 20 20 20 63 6f 6d 70 72 65 73 73 5f 62 6c 6f compress_blo
8c80: 63 6b 28 73 2c 20 28 63 74 5f 64 61 74 61 20 2a ck(s, (ct_data *
8c90: 29 73 74 61 74 69 63 5f 6c 74 72 65 65 2c 20 28 )static_ltree, (
8ca0: 63 74 5f 64 61 74 61 20 2a 29 73 74 61 74 69 63 ct_data *)static
8cb0: 5f 64 74 72 65 65 29 3b 0a 23 69 66 64 65 66 20 _dtree);.#ifdef
8cc0: 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 73 2d DEBUG. s-
8cd0: 3e 63 6f 6d 70 72 65 73 73 65 64 5f 6c 65 6e 20 >compressed_len
8ce0: 2b 3d 20 33 20 2b 20 73 2d 3e 73 74 61 74 69 63 += 3 + s->static
8cf0: 5f 6c 65 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 _len;.#endif.
8d00: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 } else {.
8d10: 20 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 28 send_bits(s, (
8d20: 44 59 4e 5f 54 52 45 45 53 3c 3c 31 29 2b 65 6f DYN_TREES<<1)+eo
8d30: 66 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 73 f, 3);. s
8d40: 65 6e 64 5f 61 6c 6c 5f 74 72 65 65 73 28 73 2c end_all_trees(s,
8d50: 20 73 2d 3e 6c 5f 64 65 73 63 2e 6d 61 78 5f 63 s->l_desc.max_c
8d60: 6f 64 65 2b 31 2c 20 73 2d 3e 64 5f 64 65 73 63 ode+1, s->d_desc
8d70: 2e 6d 61 78 5f 63 6f 64 65 2b 31 2c 0a 20 20 20 .max_code+1,.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8d90: 20 20 20 20 6d 61 78 5f 62 6c 69 6e 64 65 78 2b max_blindex+
8da0: 31 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 1);. comp
8db0: 72 65 73 73 5f 62 6c 6f 63 6b 28 73 2c 20 28 63 ress_block(s, (c
8dc0: 74 5f 64 61 74 61 20 2a 29 73 2d 3e 64 79 6e 5f t_data *)s->dyn_
8dd0: 6c 74 72 65 65 2c 20 28 63 74 5f 64 61 74 61 20 ltree, (ct_data
8de0: 2a 29 73 2d 3e 64 79 6e 5f 64 74 72 65 65 29 3b *)s->dyn_dtree);
8df0: 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 .#ifdef DEBUG.
8e00: 20 20 20 20 20 20 73 2d 3e 63 6f 6d 70 72 65 73 s->compres
8e10: 73 65 64 5f 6c 65 6e 20 2b 3d 20 33 20 2b 20 73 sed_len += 3 + s
8e20: 2d 3e 6f 70 74 5f 6c 65 6e 3b 0a 23 65 6e 64 69 ->opt_len;.#endi
8e30: 66 0a 20 20 20 20 7d 0a 20 20 20 20 41 73 73 65 f. }. Asse
8e40: 72 74 20 28 73 2d 3e 63 6f 6d 70 72 65 73 73 65 rt (s->compresse
8e50: 64 5f 6c 65 6e 20 3d 3d 20 73 2d 3e 62 69 74 73 d_len == s->bits
8e60: 5f 73 65 6e 74 2c 20 22 62 61 64 20 63 6f 6d 70 _sent, "bad comp
8e70: 72 65 73 73 65 64 20 73 69 7a 65 22 29 3b 0a 20 ressed size");.
8e80: 20 20 20 2f 2a 20 54 68 65 20 61 62 6f 76 65 20 /* The above
8e90: 63 68 65 63 6b 20 69 73 20 6d 61 64 65 20 6d 6f check is made mo
8ea0: 64 20 32 5e 33 32 2c 20 66 6f 72 20 66 69 6c 65 d 2^32, for file
8eb0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 35 31 s larger than 51
8ec0: 32 20 4d 42 0a 20 20 20 20 20 2a 20 61 6e 64 20 2 MB. * and
8ed0: 75 4c 6f 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 uLong implemente
8ee0: 64 20 6f 6e 20 33 32 20 62 69 74 73 2e 0a 20 20 d on 32 bits..
8ef0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 69 74 5f 62 */. init_b
8f00: 6c 6f 63 6b 28 73 29 3b 0a 0a 20 20 20 20 69 66 lock(s);.. if
8f10: 20 28 65 6f 66 29 20 7b 0a 20 20 20 20 20 20 20 (eof) {.
8f20: 20 62 69 5f 77 69 6e 64 75 70 28 73 29 3b 0a 23 bi_windup(s);.#
8f30: 69 66 64 65 66 20 44 45 42 55 47 0a 20 20 20 20 ifdef DEBUG.
8f40: 20 20 20 20 73 2d 3e 63 6f 6d 70 72 65 73 73 65 s->compresse
8f50: 64 5f 6c 65 6e 20 2b 3d 20 37 3b 20 20 2f 2a 20 d_len += 7; /*
8f60: 61 6c 69 67 6e 20 6f 6e 20 62 79 74 65 20 62 6f align on byte bo
8f70: 75 6e 64 61 72 79 20 2a 2f 0a 23 65 6e 64 69 66 undary */.#endif
8f80: 0a 20 20 20 20 7d 0a 20 20 20 20 54 72 61 63 65 . }. Trace
8f90: 76 28 28 73 74 64 65 72 72 2c 22 5c 6e 63 6f 6d v((stderr,"\ncom
8fa0: 70 72 6c 65 6e 20 25 6c 75 28 25 6c 75 29 20 22 prlen %lu(%lu) "
8fb0: 2c 20 73 2d 3e 63 6f 6d 70 72 65 73 73 65 64 5f , s->compressed_
8fc0: 6c 65 6e 3e 3e 33 2c 0a 20 20 20 20 20 20 20 20 len>>3,.
8fd0: 20 20 20 73 2d 3e 63 6f 6d 70 72 65 73 73 65 64 s->compressed
8fe0: 5f 6c 65 6e 2d 37 2a 65 6f 66 29 29 3b 0a 7d 0a _len-7*eof));.}.
8ff0: 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ./* ============
9000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
9040: 20 2a 20 53 61 76 65 20 74 68 65 20 6d 61 74 63 * Save the matc
9050: 68 20 69 6e 66 6f 20 61 6e 64 20 74 61 6c 6c 79 h info and tally
9060: 20 74 68 65 20 66 72 65 71 75 65 6e 63 79 20 63 the frequency c
9070: 6f 75 6e 74 73 2e 20 52 65 74 75 72 6e 20 74 72 ounts. Return tr
9080: 75 65 20 69 66 0a 20 2a 20 74 68 65 20 63 75 72 ue if. * the cur
9090: 72 65 6e 74 20 62 6c 6f 63 6b 20 6d 75 73 74 20 rent block must
90a0: 62 65 20 66 6c 75 73 68 65 64 2e 0a 20 2a 2f 0a be flushed.. */.
90b0: 69 6e 74 20 5f 74 72 5f 74 61 6c 6c 79 20 28 73 int _tr_tally (s
90c0: 2c 20 64 69 73 74 2c 20 6c 63 29 0a 20 20 20 20 , dist, lc).
90d0: 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 deflate_state *s
90e0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 64 ;. unsigned d
90f0: 69 73 74 3b 20 20 2f 2a 20 64 69 73 74 61 6e 63 ist; /* distanc
9100: 65 20 6f 66 20 6d 61 74 63 68 65 64 20 73 74 72 e of matched str
9110: 69 6e 67 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 ing */. unsig
9120: 6e 65 64 20 6c 63 3b 20 20 20 20 2f 2a 20 6d 61 ned lc; /* ma
9130: 74 63 68 20 6c 65 6e 67 74 68 2d 4d 49 4e 5f 4d tch length-MIN_M
9140: 41 54 43 48 20 6f 72 20 75 6e 6d 61 74 63 68 65 ATCH or unmatche
9150: 64 20 63 68 61 72 20 28 69 66 20 64 69 73 74 3d d char (if dist=
9160: 3d 30 29 20 2a 2f 0a 7b 0a 20 20 20 20 73 2d 3e =0) */.{. s->
9170: 64 5f 62 75 66 5b 73 2d 3e 6c 61 73 74 5f 6c 69 d_buf[s->last_li
9180: 74 5d 20 3d 20 28 75 73 68 29 64 69 73 74 3b 0a t] = (ush)dist;.
9190: 20 20 20 20 73 2d 3e 6c 5f 62 75 66 5b 73 2d 3e s->l_buf[s->
91a0: 6c 61 73 74 5f 6c 69 74 2b 2b 5d 20 3d 20 28 75 last_lit++] = (u
91b0: 63 68 29 6c 63 3b 0a 20 20 20 20 69 66 20 28 64 ch)lc;. if (d
91c0: 69 73 74 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 ist == 0) {.
91d0: 20 20 20 20 2f 2a 20 6c 63 20 69 73 20 74 68 65 /* lc is the
91e0: 20 75 6e 6d 61 74 63 68 65 64 20 63 68 61 72 20 unmatched char
91f0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 2d 3e 64 79 */. s->dy
9200: 6e 5f 6c 74 72 65 65 5b 6c 63 5d 2e 46 72 65 71 n_ltree[lc].Freq
9210: 2b 2b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ++;. } else {
9220: 0a 20 20 20 20 20 20 20 20 73 2d 3e 6d 61 74 63 . s->matc
9230: 68 65 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f hes++;. /
9240: 2a 20 48 65 72 65 2c 20 6c 63 20 69 73 20 74 68 * Here, lc is th
9250: 65 20 6d 61 74 63 68 20 6c 65 6e 67 74 68 20 2d e match length -
9260: 20 4d 49 4e 5f 4d 41 54 43 48 20 2a 2f 0a 20 20 MIN_MATCH */.
9270: 20 20 20 20 20 20 64 69 73 74 2d 2d 3b 20 20 20 dist--;
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69 73 /* dis
9290: 74 20 3d 20 6d 61 74 63 68 20 64 69 73 74 61 6e t = match distan
92a0: 63 65 20 2d 20 31 20 2a 2f 0a 20 20 20 20 20 20 ce - 1 */.
92b0: 20 20 41 73 73 65 72 74 28 28 75 73 68 29 64 69 Assert((ush)di
92c0: 73 74 20 3c 20 28 75 73 68 29 4d 41 58 5f 44 49 st < (ush)MAX_DI
92d0: 53 54 28 73 29 20 26 26 0a 20 20 20 20 20 20 20 ST(s) &&.
92e0: 20 20 20 20 20 20 20 20 28 75 73 68 29 6c 63 20 (ush)lc
92f0: 3c 3d 20 28 75 73 68 29 28 4d 41 58 5f 4d 41 54 <= (ush)(MAX_MAT
9300: 43 48 2d 4d 49 4e 5f 4d 41 54 43 48 29 20 26 26 CH-MIN_MATCH) &&
9310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
9320: 28 75 73 68 29 64 5f 63 6f 64 65 28 64 69 73 74 (ush)d_code(dist
9330: 29 20 3c 20 28 75 73 68 29 44 5f 43 4f 44 45 53 ) < (ush)D_CODES
9340: 2c 20 20 22 5f 74 72 5f 74 61 6c 6c 79 3a 20 62 , "_tr_tally: b
9350: 61 64 20 6d 61 74 63 68 22 29 3b 0a 0a 20 20 20 ad match");..
9360: 20 20 20 20 20 73 2d 3e 64 79 6e 5f 6c 74 72 65 s->dyn_ltre
9370: 65 5b 5f 6c 65 6e 67 74 68 5f 63 6f 64 65 5b 6c e[_length_code[l
9380: 63 5d 2b 4c 49 54 45 52 41 4c 53 2b 31 5d 2e 46 c]+LITERALS+1].F
9390: 72 65 71 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 req++;. s
93a0: 2d 3e 64 79 6e 5f 64 74 72 65 65 5b 64 5f 63 6f ->dyn_dtree[d_co
93b0: 64 65 28 64 69 73 74 29 5d 2e 46 72 65 71 2b 2b de(dist)].Freq++
93c0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 ;. }..#ifdef
93d0: 54 52 55 4e 43 41 54 45 5f 42 4c 4f 43 4b 0a 20 TRUNCATE_BLOCK.
93e0: 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 67 75 65 /* Try to gue
93f0: 73 73 20 69 66 20 69 74 20 69 73 20 70 72 6f 66 ss if it is prof
9400: 69 74 61 62 6c 65 20 74 6f 20 73 74 6f 70 20 74 itable to stop t
9410: 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b he current block
9420: 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 here */. if
9430: 28 28 73 2d 3e 6c 61 73 74 5f 6c 69 74 20 26 20 ((s->last_lit &
9440: 30 78 31 66 66 66 29 20 3d 3d 20 30 20 26 26 20 0x1fff) == 0 &&
9450: 73 2d 3e 6c 65 76 65 6c 20 3e 20 32 29 20 7b 0a s->level > 2) {.
9460: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 75 /* Compu
9470: 74 65 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e te an upper boun
9480: 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 72 65 d for the compre
9490: 73 73 65 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 ssed length */.
94a0: 20 20 20 20 20 20 20 75 6c 67 20 6f 75 74 5f 6c ulg out_l
94b0: 65 6e 67 74 68 20 3d 20 28 75 6c 67 29 73 2d 3e ength = (ulg)s->
94c0: 6c 61 73 74 5f 6c 69 74 2a 38 4c 3b 0a 20 20 20 last_lit*8L;.
94d0: 20 20 20 20 20 75 6c 67 20 69 6e 5f 6c 65 6e 67 ulg in_leng
94e0: 74 68 20 3d 20 28 75 6c 67 29 28 28 6c 6f 6e 67 th = (ulg)((long
94f0: 29 73 2d 3e 73 74 72 73 74 61 72 74 20 2d 20 73 )s->strstart - s
9500: 2d 3e 62 6c 6f 63 6b 5f 73 74 61 72 74 29 3b 0a ->block_start);.
9510: 20 20 20 20 20 20 20 20 69 6e 74 20 64 63 6f 64 int dcod
9520: 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 e;. for (
9530: 64 63 6f 64 65 20 3d 20 30 3b 20 64 63 6f 64 65 dcode = 0; dcode
9540: 20 3c 20 44 5f 43 4f 44 45 53 3b 20 64 63 6f 64 < D_CODES; dcod
9550: 65 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 e++) {.
9560: 20 20 20 6f 75 74 5f 6c 65 6e 67 74 68 20 2b 3d out_length +=
9570: 20 28 75 6c 67 29 73 2d 3e 64 79 6e 5f 64 74 72 (ulg)s->dyn_dtr
9580: 65 65 5b 64 63 6f 64 65 5d 2e 46 72 65 71 20 2a ee[dcode].Freq *
9590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
95a0: 20 28 35 4c 2b 65 78 74 72 61 5f 64 62 69 74 73 (5L+extra_dbits
95b0: 5b 64 63 6f 64 65 5d 29 3b 0a 20 20 20 20 20 20 [dcode]);.
95c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 75 74 5f }. out_
95d0: 6c 65 6e 67 74 68 20 3e 3e 3d 20 33 3b 0a 20 20 length >>= 3;.
95e0: 20 20 20 20 20 20 54 72 61 63 65 76 28 28 73 74 Tracev((st
95f0: 64 65 72 72 2c 22 5c 6e 6c 61 73 74 5f 6c 69 74 derr,"\nlast_lit
9600: 20 25 75 2c 20 69 6e 20 25 6c 64 2c 20 6f 75 74 %u, in %ld, out
9610: 20 7e 25 6c 64 28 25 6c 64 25 25 29 20 22 2c 0a ~%ld(%ld%%) ",.
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
9630: 2d 3e 6c 61 73 74 5f 6c 69 74 2c 20 69 6e 5f 6c ->last_lit, in_l
9640: 65 6e 67 74 68 2c 20 6f 75 74 5f 6c 65 6e 67 74 ength, out_lengt
9650: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 h,.
9660: 20 20 31 30 30 4c 20 2d 20 6f 75 74 5f 6c 65 6e 100L - out_len
9670: 67 74 68 2a 31 30 30 4c 2f 69 6e 5f 6c 65 6e 67 gth*100L/in_leng
9680: 74 68 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 th));. if
9690: 20 28 73 2d 3e 6d 61 74 63 68 65 73 20 3c 20 73 (s->matches < s
96a0: 2d 3e 6c 61 73 74 5f 6c 69 74 2f 32 20 26 26 20 ->last_lit/2 &&
96b0: 6f 75 74 5f 6c 65 6e 67 74 68 20 3c 20 69 6e 5f out_length < in_
96c0: 6c 65 6e 67 74 68 2f 32 29 20 72 65 74 75 72 6e length/2) return
96d0: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 1;. }.#endif
96e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 2d 3e . return (s->
96f0: 6c 61 73 74 5f 6c 69 74 20 3d 3d 20 73 2d 3e 6c last_lit == s->l
9700: 69 74 5f 62 75 66 73 69 7a 65 2d 31 29 3b 0a 20 it_bufsize-1);.
9710: 20 20 20 2f 2a 20 57 65 20 61 76 6f 69 64 20 65 /* We avoid e
9720: 71 75 61 6c 69 74 79 20 77 69 74 68 20 6c 69 74 quality with lit
9730: 5f 62 75 66 73 69 7a 65 20 62 65 63 61 75 73 65 _bufsize because
9740: 20 6f 66 20 77 72 61 70 61 72 6f 75 6e 64 20 61 of wraparound a
9750: 74 20 36 34 4b 0a 20 20 20 20 20 2a 20 6f 6e 20 t 64K. * on
9760: 31 36 20 62 69 74 20 6d 61 63 68 69 6e 65 73 20 16 bit machines
9770: 61 6e 64 20 62 65 63 61 75 73 65 20 73 74 6f 72 and because stor
9780: 65 64 20 62 6c 6f 63 6b 73 20 61 72 65 20 72 65 ed blocks are re
9790: 73 74 72 69 63 74 65 64 20 74 6f 0a 20 20 20 20 stricted to.
97a0: 20 2a 20 36 34 4b 2d 31 20 62 79 74 65 73 2e 0a * 64K-1 bytes..
97b0: 20 20 20 20 20 2a 2f 0a 7d 0a 0a 2f 2a 20 3d 3d */.}../* ==
97c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
97d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
97e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
97f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 53 65 6e =========. * Sen
9810: 64 20 74 68 65 20 62 6c 6f 63 6b 20 64 61 74 61 d the block data
9820: 20 63 6f 6d 70 72 65 73 73 65 64 20 75 73 69 6e compressed usin
9830: 67 20 74 68 65 20 67 69 76 65 6e 20 48 75 66 66 g the given Huff
9840: 6d 61 6e 20 74 72 65 65 73 0a 20 2a 2f 0a 6c 6f man trees. */.lo
9850: 63 61 6c 20 76 6f 69 64 20 63 6f 6d 70 72 65 73 cal void compres
9860: 73 5f 62 6c 6f 63 6b 28 73 2c 20 6c 74 72 65 65 s_block(s, ltree
9870: 2c 20 64 74 72 65 65 29 0a 20 20 20 20 64 65 66 , dtree). def
9880: 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0a 20 late_state *s;.
9890: 20 20 20 63 74 5f 64 61 74 61 20 2a 6c 74 72 65 ct_data *ltre
98a0: 65 3b 20 2f 2a 20 6c 69 74 65 72 61 6c 20 74 72 e; /* literal tr
98b0: 65 65 20 2a 2f 0a 20 20 20 20 63 74 5f 64 61 74 ee */. ct_dat
98c0: 61 20 2a 64 74 72 65 65 3b 20 2f 2a 20 64 69 73 a *dtree; /* dis
98d0: 74 61 6e 63 65 20 74 72 65 65 20 2a 2f 0a 7b 0a tance tree */.{.
98e0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 64 69 73 unsigned dis
98f0: 74 3b 20 20 20 20 20 20 2f 2a 20 64 69 73 74 61 t; /* dista
9900: 6e 63 65 20 6f 66 20 6d 61 74 63 68 65 64 20 73 nce of matched s
9910: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 tring */. int
9920: 20 6c 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 lc;
9930: 20 2f 2a 20 6d 61 74 63 68 20 6c 65 6e 67 74 68 /* match length
9940: 20 6f 72 20 75 6e 6d 61 74 63 68 65 64 20 63 68 or unmatched ch
9950: 61 72 20 28 69 66 20 64 69 73 74 20 3d 3d 20 30 ar (if dist == 0
9960: 29 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 ) */. unsigne
9970: 64 20 6c 78 20 3d 20 30 3b 20 20 20 20 2f 2a 20 d lx = 0; /*
9980: 72 75 6e 6e 69 6e 67 20 69 6e 64 65 78 20 69 6e running index in
9990: 20 6c 5f 62 75 66 20 2a 2f 0a 20 20 20 20 75 6e l_buf */. un
99a0: 73 69 67 6e 65 64 20 63 6f 64 65 3b 20 20 20 20 signed code;
99b0: 20 20 2f 2a 20 74 68 65 20 63 6f 64 65 20 74 6f /* the code to
99c0: 20 73 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 send */. int
99d0: 20 65 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 extra;
99e0: 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 /* number of ex
99f0: 74 72 61 20 62 69 74 73 20 74 6f 20 73 65 6e 64 tra bits to send
9a00: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 2d 3e */.. if (s->
9a10: 6c 61 73 74 5f 6c 69 74 20 21 3d 20 30 29 20 64 last_lit != 0) d
9a20: 6f 20 7b 0a 20 20 20 20 20 20 20 20 64 69 73 74 o {. dist
9a30: 20 3d 20 73 2d 3e 64 5f 62 75 66 5b 6c 78 5d 3b = s->d_buf[lx];
9a40: 0a 20 20 20 20 20 20 20 20 6c 63 20 3d 20 73 2d . lc = s-
9a50: 3e 6c 5f 62 75 66 5b 6c 78 2b 2b 5d 3b 0a 20 20 >l_buf[lx++];.
9a60: 20 20 20 20 20 20 69 66 20 28 64 69 73 74 20 3d if (dist =
9a70: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 = 0) {.
9a80: 20 20 20 73 65 6e 64 5f 63 6f 64 65 28 73 2c 20 send_code(s,
9a90: 6c 63 2c 20 6c 74 72 65 65 29 3b 20 2f 2a 20 73 lc, ltree); /* s
9aa0: 65 6e 64 20 61 20 6c 69 74 65 72 61 6c 20 62 79 end a literal by
9ab0: 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 te */.
9ac0: 20 20 54 72 61 63 65 63 76 28 69 73 67 72 61 70 Tracecv(isgrap
9ad0: 68 28 6c 63 29 2c 20 28 73 74 64 65 72 72 2c 22 h(lc), (stderr,"
9ae0: 20 27 25 63 27 20 22 2c 20 6c 63 29 29 3b 0a 20 '%c' ", lc));.
9af0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a } else {.
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 /* H
9b10: 65 72 65 2c 20 6c 63 20 69 73 20 74 68 65 20 6d ere, lc is the m
9b20: 61 74 63 68 20 6c 65 6e 67 74 68 20 2d 20 4d 49 atch length - MI
9b30: 4e 5f 4d 41 54 43 48 20 2a 2f 0a 20 20 20 20 20 N_MATCH */.
9b40: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 5f 6c code = _l
9b50: 65 6e 67 74 68 5f 63 6f 64 65 5b 6c 63 5d 3b 0a ength_code[lc];.
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 send
9b70: 5f 63 6f 64 65 28 73 2c 20 63 6f 64 65 2b 4c 49 _code(s, code+LI
9b80: 54 45 52 41 4c 53 2b 31 2c 20 6c 74 72 65 65 29 TERALS+1, ltree)
9b90: 3b 20 2f 2a 20 73 65 6e 64 20 74 68 65 20 6c 65 ; /* send the le
9ba0: 6e 67 74 68 20 63 6f 64 65 20 2a 2f 0a 20 20 20 ngth code */.
9bb0: 20 20 20 20 20 20 20 20 20 65 78 74 72 61 20 3d extra =
9bc0: 20 65 78 74 72 61 5f 6c 62 69 74 73 5b 63 6f 64 extra_lbits[cod
9bd0: 65 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 e];.
9be0: 69 66 20 28 65 78 74 72 61 20 21 3d 20 30 29 20 if (extra != 0)
9bf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
9c00: 20 20 6c 63 20 2d 3d 20 62 61 73 65 5f 6c 65 6e lc -= base_len
9c10: 67 74 68 5b 63 6f 64 65 5d 3b 0a 20 20 20 20 20 gth[code];.
9c20: 20 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 5f send_
9c30: 62 69 74 73 28 73 2c 20 6c 63 2c 20 65 78 74 72 bits(s, lc, extr
9c40: 61 29 3b 20 20 20 20 20 20 20 2f 2a 20 73 65 6e a); /* sen
9c50: 64 20 74 68 65 20 65 78 74 72 61 20 6c 65 6e 67 d the extra leng
9c60: 74 68 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 20 th bits */.
9c70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
9c80: 20 20 20 20 20 64 69 73 74 2d 2d 3b 20 2f 2a 20 dist--; /*
9c90: 64 69 73 74 20 69 73 20 6e 6f 77 20 74 68 65 20 dist is now the
9ca0: 6d 61 74 63 68 20 64 69 73 74 61 6e 63 65 20 2d match distance -
9cb0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 1 */.
9cc0: 20 20 63 6f 64 65 20 3d 20 64 5f 63 6f 64 65 28 code = d_code(
9cd0: 64 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 dist);.
9ce0: 20 20 20 41 73 73 65 72 74 20 28 63 6f 64 65 20 Assert (code
9cf0: 3c 20 44 5f 43 4f 44 45 53 2c 20 22 62 61 64 20 < D_CODES, "bad
9d00: 64 5f 63 6f 64 65 22 29 3b 0a 0a 20 20 20 20 20 d_code");..
9d10: 20 20 20 20 20 20 20 73 65 6e 64 5f 63 6f 64 65 send_code
9d20: 28 73 2c 20 63 6f 64 65 2c 20 64 74 72 65 65 29 (s, code, dtree)
9d30: 3b 20 20 20 20 20 20 20 2f 2a 20 73 65 6e 64 20 ; /* send
9d40: 74 68 65 20 64 69 73 74 61 6e 63 65 20 63 6f 64 the distance cod
9d50: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 e */.
9d60: 20 65 78 74 72 61 20 3d 20 65 78 74 72 61 5f 64 extra = extra_d
9d70: 62 69 74 73 5b 63 6f 64 65 5d 3b 0a 20 20 20 20 bits[code];.
9d80: 20 20 20 20 20 20 20 20 69 66 20 28 65 78 74 72 if (extr
9d90: 61 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 a != 0) {.
9da0: 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 2d dist -
9db0: 3d 20 62 61 73 65 5f 64 69 73 74 5b 63 6f 64 65 = base_dist[code
9dc0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ];.
9dd0: 20 20 20 73 65 6e 64 5f 62 69 74 73 28 73 2c 20 send_bits(s,
9de0: 64 69 73 74 2c 20 65 78 74 72 61 29 3b 20 20 20 dist, extra);
9df0: 2f 2a 20 73 65 6e 64 20 74 68 65 20 65 78 74 72 /* send the extr
9e00: 61 20 64 69 73 74 61 6e 63 65 20 62 69 74 73 20 a distance bits
9e10: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d */. }
9e20: 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 6c 69 . } /* li
9e30: 74 65 72 61 6c 20 6f 72 20 6d 61 74 63 68 20 70 teral or match p
9e40: 61 69 72 20 3f 20 2a 2f 0a 0a 20 20 20 20 20 20 air ? */..
9e50: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 /* Check that
9e60: 74 68 65 20 6f 76 65 72 6c 61 79 20 62 65 74 77 the overlay betw
9e70: 65 65 6e 20 70 65 6e 64 69 6e 67 5f 62 75 66 20 een pending_buf
9e80: 61 6e 64 20 64 5f 62 75 66 2b 6c 5f 62 75 66 20 and d_buf+l_buf
9e90: 69 73 20 6f 6b 3a 20 2a 2f 0a 20 20 20 20 20 20 is ok: */.
9ea0: 20 20 41 73 73 65 72 74 28 73 2d 3e 70 65 6e 64 Assert(s->pend
9eb0: 69 6e 67 20 3c 20 73 2d 3e 6c 69 74 5f 62 75 66 ing < s->lit_buf
9ec0: 73 69 7a 65 20 2b 20 32 2a 6c 78 2c 20 22 70 65 size + 2*lx, "pe
9ed0: 6e 64 69 6e 67 42 75 66 20 6f 76 65 72 66 6c 6f ndingBuf overflo
9ee0: 77 22 29 3b 0a 0a 20 20 20 20 7d 20 77 68 69 6c w");.. } whil
9ef0: 65 20 28 6c 78 20 3c 20 73 2d 3e 6c 61 73 74 5f e (lx < s->last_
9f00: 6c 69 74 29 3b 0a 0a 20 20 20 20 73 65 6e 64 5f lit);.. send_
9f10: 63 6f 64 65 28 73 2c 20 45 4e 44 5f 42 4c 4f 43 code(s, END_BLOC
9f20: 4b 2c 20 6c 74 72 65 65 29 3b 0a 20 20 20 20 73 K, ltree);. s
9f30: 2d 3e 6c 61 73 74 5f 65 6f 62 5f 6c 65 6e 20 3d ->last_eob_len =
9f40: 20 6c 74 72 65 65 5b 45 4e 44 5f 42 4c 4f 43 4b ltree[END_BLOCK
9f50: 5d 2e 4c 65 6e 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d ].Len;.}../* ===
9f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9fa0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a 20 53 65 74 20 ========. * Set
9fb0: 74 68 65 20 64 61 74 61 20 74 79 70 65 20 74 6f the data type to
9fc0: 20 41 53 43 49 49 20 6f 72 20 42 49 4e 41 52 59 ASCII or BINARY
9fd0: 2c 20 75 73 69 6e 67 20 61 20 63 72 75 64 65 20 , using a crude
9fe0: 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 3a 0a 20 approximation:.
9ff0: 2a 20 62 69 6e 61 72 79 20 69 66 20 6d 6f 72 65 * binary if more
a000: 20 74 68 61 6e 20 32 30 25 20 6f 66 20 74 68 65 than 20% of the
a010: 20 62 79 74 65 73 20 61 72 65 20 3c 3d 20 36 20 bytes are <= 6
a020: 6f 72 20 3e 3d 20 31 32 38 2c 20 61 73 63 69 69 or >= 128, ascii
a030: 20 6f 74 68 65 72 77 69 73 65 2e 0a 20 2a 20 49 otherwise.. * I
a040: 4e 20 61 73 73 65 72 74 69 6f 6e 3a 20 74 68 65 N assertion: the
a050: 20 66 69 65 6c 64 73 20 66 72 65 71 20 6f 66 20 fields freq of
a060: 64 79 6e 5f 6c 74 72 65 65 20 61 72 65 20 73 65 dyn_ltree are se
a070: 74 20 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 t and the total
a080: 6f 66 20 61 6c 6c 0a 20 2a 20 66 72 65 71 75 65 of all. * freque
a090: 6e 63 69 65 73 20 64 6f 65 73 20 6e 6f 74 20 65 ncies does not e
a0a0: 78 63 65 65 64 20 36 34 4b 20 28 74 6f 20 66 69 xceed 64K (to fi
a0b0: 74 20 69 6e 20 61 6e 20 69 6e 74 20 6f 6e 20 31 t in an int on 1
a0c0: 36 20 62 69 74 20 6d 61 63 68 69 6e 65 73 29 2e 6 bit machines).
a0d0: 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 . */.local void
a0e0: 73 65 74 5f 64 61 74 61 5f 74 79 70 65 28 73 29 set_data_type(s)
a0f0: 0a 20 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 . deflate_sta
a100: 74 65 20 2a 73 3b 0a 7b 0a 20 20 20 20 69 6e 74 te *s;.{. int
a110: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 n = 0;. unsi
a120: 67 6e 65 64 20 61 73 63 69 69 5f 66 72 65 71 20 gned ascii_freq
a130: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
a140: 64 20 62 69 6e 5f 66 72 65 71 20 3d 20 30 3b 0a d bin_freq = 0;.
a150: 20 20 20 20 77 68 69 6c 65 20 28 6e 20 3c 20 37 while (n < 7
a160: 29 20 20 20 20 20 20 20 20 62 69 6e 5f 66 72 65 ) bin_fre
a170: 71 20 2b 3d 20 73 2d 3e 64 79 6e 5f 6c 74 72 65 q += s->dyn_ltre
a180: 65 5b 6e 2b 2b 5d 2e 46 72 65 71 3b 0a 20 20 20 e[n++].Freq;.
a190: 20 77 68 69 6c 65 20 28 6e 20 3c 20 31 32 38 29 while (n < 128)
a1a0: 20 20 20 20 61 73 63 69 69 5f 66 72 65 71 20 2b ascii_freq +
a1b0: 3d 20 73 2d 3e 64 79 6e 5f 6c 74 72 65 65 5b 6e = s->dyn_ltree[n
a1c0: 2b 2b 5d 2e 46 72 65 71 3b 0a 20 20 20 20 77 68 ++].Freq;. wh
a1d0: 69 6c 65 20 28 6e 20 3c 20 4c 49 54 45 52 41 4c ile (n < LITERAL
a1e0: 53 29 20 62 69 6e 5f 66 72 65 71 20 2b 3d 20 73 S) bin_freq += s
a1f0: 2d 3e 64 79 6e 5f 6c 74 72 65 65 5b 6e 2b 2b 5d ->dyn_ltree[n++]
a200: 2e 46 72 65 71 3b 0a 20 20 20 20 73 2d 3e 64 61 .Freq;. s->da
a210: 74 61 5f 74 79 70 65 20 3d 20 28 42 79 74 65 29 ta_type = (Byte)
a220: 28 62 69 6e 5f 66 72 65 71 20 3e 20 28 61 73 63 (bin_freq > (asc
a230: 69 69 5f 66 72 65 71 20 3e 3e 20 32 29 20 3f 20 ii_freq >> 2) ?
a240: 5a 5f 42 49 4e 41 52 59 20 3a 20 5a 5f 41 53 43 Z_BINARY : Z_ASC
a250: 49 49 29 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d II);.}../* =====
a260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a2a0: 3d 3d 3d 3d 3d 3d 0a 20 2a 20 52 65 76 65 72 73 ======. * Revers
a2b0: 65 20 74 68 65 20 66 69 72 73 74 20 6c 65 6e 20 e the first len
a2c0: 62 69 74 73 20 6f 66 20 61 20 63 6f 64 65 2c 20 bits of a code,
a2d0: 75 73 69 6e 67 20 73 74 72 61 69 67 68 74 66 6f using straightfo
a2e0: 72 77 61 72 64 20 63 6f 64 65 20 28 61 20 66 61 rward code (a fa
a2f0: 73 74 65 72 0a 20 2a 20 6d 65 74 68 6f 64 20 77 ster. * method w
a300: 6f 75 6c 64 20 75 73 65 20 61 20 74 61 62 6c 65 ould use a table
a310: 29 0a 20 2a 20 49 4e 20 61 73 73 65 72 74 69 6f ). * IN assertio
a320: 6e 3a 20 31 20 3c 3d 20 6c 65 6e 20 3c 3d 20 31 n: 1 <= len <= 1
a330: 35 0a 20 2a 2f 0a 6c 6f 63 61 6c 20 75 6e 73 69 5. */.local unsi
a340: 67 6e 65 64 20 62 69 5f 72 65 76 65 72 73 65 28 gned bi_reverse(
a350: 63 6f 64 65 2c 20 6c 65 6e 29 0a 20 20 20 20 75 code, len). u
a360: 6e 73 69 67 6e 65 64 20 63 6f 64 65 3b 20 2f 2a nsigned code; /*
a370: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 69 6e the value to in
a380: 76 65 72 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 vert */. int
a390: 6c 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 69 74 len; /* it
a3a0: 73 20 62 69 74 20 6c 65 6e 67 74 68 20 2a 2f 0a s bit length */.
a3b0: 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 {. register u
a3c0: 6e 73 69 67 6e 65 64 20 72 65 73 20 3d 20 30 3b nsigned res = 0;
a3d0: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 . do {.
a3e0: 20 20 72 65 73 20 7c 3d 20 63 6f 64 65 20 26 20 res |= code &
a3f0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 1;. code
a400: 3e 3e 3d 20 31 2c 20 72 65 73 20 3c 3c 3d 20 31 >>= 1, res <<= 1
a410: 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d ;. } while (-
a420: 2d 6c 65 6e 20 3e 20 30 29 3b 0a 20 20 20 20 72 -len > 0);. r
a430: 65 74 75 72 6e 20 72 65 73 20 3e 3e 20 31 3b 0a eturn res >> 1;.
a440: 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d }../* ==========
a450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a490: 3d 0a 20 2a 20 46 6c 75 73 68 20 74 68 65 20 62 =. * Flush the b
a4a0: 69 74 20 62 75 66 66 65 72 2c 20 6b 65 65 70 69 it buffer, keepi
a4b0: 6e 67 20 61 74 20 6d 6f 73 74 20 37 20 62 69 74 ng at most 7 bit
a4c0: 73 20 69 6e 20 69 74 2e 0a 20 2a 2f 0a 6c 6f 63 s in it.. */.loc
a4d0: 61 6c 20 76 6f 69 64 20 62 69 5f 66 6c 75 73 68 al void bi_flush
a4e0: 28 73 29 0a 20 20 20 20 64 65 66 6c 61 74 65 5f (s). deflate_
a4f0: 73 74 61 74 65 20 2a 73 3b 0a 7b 0a 20 20 20 20 state *s;.{.
a500: 69 66 20 28 73 2d 3e 62 69 5f 76 61 6c 69 64 20 if (s->bi_valid
a510: 3d 3d 20 31 36 29 20 7b 0a 20 20 20 20 20 20 20 == 16) {.
a520: 20 70 75 74 5f 73 68 6f 72 74 28 73 2c 20 73 2d put_short(s, s-
a530: 3e 62 69 5f 62 75 66 29 3b 0a 20 20 20 20 20 20 >bi_buf);.
a540: 20 20 73 2d 3e 62 69 5f 62 75 66 20 3d 20 30 3b s->bi_buf = 0;
a550: 0a 20 20 20 20 20 20 20 20 73 2d 3e 62 69 5f 76 . s->bi_v
a560: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 20 alid = 0;. }
a570: 65 6c 73 65 20 69 66 20 28 73 2d 3e 62 69 5f 76 else if (s->bi_v
a580: 61 6c 69 64 20 3e 3d 20 38 29 20 7b 0a 20 20 20 alid >= 8) {.
a590: 20 20 20 20 20 70 75 74 5f 62 79 74 65 28 73 2c put_byte(s,
a5a0: 20 28 42 79 74 65 29 73 2d 3e 62 69 5f 62 75 66 (Byte)s->bi_buf
a5b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 2d 3e 62 69 );. s->bi
a5c0: 5f 62 75 66 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 _buf >>= 8;.
a5d0: 20 20 20 20 73 2d 3e 62 69 5f 76 61 6c 69 64 20 s->bi_valid
a5e0: 2d 3d 20 38 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f -= 8;. }.}../
a5f0: 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d * ==============
a600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a630: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 2a =============. *
a640: 20 46 6c 75 73 68 20 74 68 65 20 62 69 74 20 62 Flush the bit b
a650: 75 66 66 65 72 20 61 6e 64 20 61 6c 69 67 6e 20 uffer and align
a660: 74 68 65 20 6f 75 74 70 75 74 20 6f 6e 20 61 20 the output on a
a670: 62 79 74 65 20 62 6f 75 6e 64 61 72 79 0a 20 2a byte boundary. *
a680: 2f 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 62 69 5f /.local void bi_
a690: 77 69 6e 64 75 70 28 73 29 0a 20 20 20 20 64 65 windup(s). de
a6a0: 66 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0a flate_state *s;.
a6b0: 7b 0a 20 20 20 20 69 66 20 28 73 2d 3e 62 69 5f {. if (s->bi_
a6c0: 76 61 6c 69 64 20 3e 20 38 29 20 7b 0a 20 20 20 valid > 8) {.
a6d0: 20 20 20 20 20 70 75 74 5f 73 68 6f 72 74 28 73 put_short(s
a6e0: 2c 20 73 2d 3e 62 69 5f 62 75 66 29 3b 0a 20 20 , s->bi_buf);.
a6f0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 2d 3e } else if (s->
a700: 62 69 5f 76 61 6c 69 64 20 3e 20 30 29 20 7b 0a bi_valid > 0) {.
a710: 20 20 20 20 20 20 20 20 70 75 74 5f 62 79 74 65 put_byte
a720: 28 73 2c 20 28 42 79 74 65 29 73 2d 3e 62 69 5f (s, (Byte)s->bi_
a730: 62 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 buf);. }.
a740: 73 2d 3e 62 69 5f 62 75 66 20 3d 20 30 3b 0a 20 s->bi_buf = 0;.
a750: 20 20 20 73 2d 3e 62 69 5f 76 61 6c 69 64 20 3d s->bi_valid =
a760: 20 30 3b 0a 23 69 66 64 65 66 20 44 45 42 55 47 0;.#ifdef DEBUG
a770: 0a 20 20 20 20 73 2d 3e 62 69 74 73 5f 73 65 6e . s->bits_sen
a780: 74 20 3d 20 28 73 2d 3e 62 69 74 73 5f 73 65 6e t = (s->bits_sen
a790: 74 2b 37 29 20 26 20 7e 37 3b 0a 23 65 6e 64 69 t+7) & ~7;.#endi
a7a0: 66 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d f.}../* ========
a7b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
a7f0: 3d 3d 3d 0a 20 2a 20 43 6f 70 79 20 61 20 73 74 ===. * Copy a st
a800: 6f 72 65 64 20 62 6c 6f 63 6b 2c 20 73 74 6f 72 ored block, stor
a810: 69 6e 67 20 66 69 72 73 74 20 74 68 65 20 6c 65 ing first the le
a820: 6e 67 74 68 20 61 6e 64 20 69 74 73 0a 20 2a 20 ngth and its. *
a830: 6f 6e 65 27 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 one's complement
a840: 20 69 66 20 72 65 71 75 65 73 74 65 64 2e 0a 20 if requested..
a850: 2a 2f 0a 6c 6f 63 61 6c 20 76 6f 69 64 20 63 6f */.local void co
a860: 70 79 5f 62 6c 6f 63 6b 28 73 2c 20 62 75 66 2c py_block(s, buf,
a870: 20 6c 65 6e 2c 20 68 65 61 64 65 72 29 0a 20 20 len, header).
a880: 20 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 deflate_state
a890: 2a 73 3b 0a 20 20 20 20 63 68 61 72 66 20 20 20 *s;. charf
a8a0: 20 2a 62 75 66 3b 20 20 20 20 2f 2a 20 74 68 65 *buf; /* the
a8b0: 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 input data */.
a8c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 6e 3b unsigned len;
a8d0: 20 20 20 20 20 2f 2a 20 69 74 73 20 6c 65 6e 67 /* its leng
a8e0: 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 20 20 th */. int
a8f0: 20 20 20 68 65 61 64 65 72 3b 20 20 2f 2a 20 74 header; /* t
a900: 72 75 65 20 69 66 20 62 6c 6f 63 6b 20 68 65 61 rue if block hea
a910: 64 65 72 20 6d 75 73 74 20 62 65 20 77 72 69 74 der must be writ
a920: 74 65 6e 20 2a 2f 0a 7b 0a 20 20 20 20 62 69 5f ten */.{. bi_
a930: 77 69 6e 64 75 70 28 73 29 3b 20 20 20 20 20 20 windup(s);
a940: 20 20 2f 2a 20 61 6c 69 67 6e 20 6f 6e 20 62 79 /* align on by
a950: 74 65 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 20 te boundary */.
a960: 20 20 20 73 2d 3e 6c 61 73 74 5f 65 6f 62 5f 6c s->last_eob_l
a970: 65 6e 20 3d 20 38 3b 20 2f 2a 20 65 6e 6f 75 67 en = 8; /* enoug
a980: 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 h lookahead for
a990: 69 6e 66 6c 61 74 65 20 2a 2f 0a 0a 20 20 20 20 inflate */..
a9a0: 69 66 20 28 68 65 61 64 65 72 29 20 7b 0a 20 20 if (header) {.
a9b0: 20 20 20 20 20 20 70 75 74 5f 73 68 6f 72 74 28 put_short(
a9c0: 73 2c 20 28 75 73 68 29 6c 65 6e 29 3b 20 20 20 s, (ush)len);
a9d0: 0a 20 20 20 20 20 20 20 20 70 75 74 5f 73 68 6f . put_sho
a9e0: 72 74 28 73 2c 20 28 75 73 68 29 7e 6c 65 6e 29 rt(s, (ush)~len)
a9f0: 3b 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20 ;.#ifdef DEBUG.
aa00: 20 20 20 20 20 20 20 73 2d 3e 62 69 74 73 5f 73 s->bits_s
aa10: 65 6e 74 20 2b 3d 20 32 2a 31 36 3b 0a 23 65 6e ent += 2*16;.#en
aa20: 64 69 66 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 dif. }.#ifdef
aa30: 20 44 45 42 55 47 0a 20 20 20 20 73 2d 3e 62 69 DEBUG. s->bi
aa40: 74 73 5f 73 65 6e 74 20 2b 3d 20 28 75 6c 67 29 ts_sent += (ulg)
aa50: 6c 65 6e 3c 3c 33 3b 0a 23 65 6e 64 69 66 0a 20 len<<3;.#endif.
aa60: 20 20 20 77 68 69 6c 65 20 28 6c 65 6e 2d 2d 29 while (len--)
aa70: 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74 5f 62 {. put_b
aa80: 79 74 65 28 73 2c 20 2a 62 75 66 2b 2b 29 3b 0a yte(s, *buf++);.
aa90: 20 20 20 20 7d 0a 7d 0a }.}.