0000: 2f 2a 20 69 6e 66 62 6c 6f 63 6b 2e 63 20 2d 2d /* infblock.c --
0010: 20 69 6e 74 65 72 70 72 65 74 20 61 6e 64 20 70 interpret and p
0020: 72 6f 63 65 73 73 20 62 6c 6f 63 6b 20 74 79 70 rocess block typ
0030: 65 73 20 74 6f 20 6c 61 73 74 20 62 6c 6f 63 6b es to last block
0040: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 . * Copyright (C
0050: 29 20 31 39 39 35 2d 31 39 39 38 20 4d 61 72 6b ) 1995-1998 Mark
0060: 20 41 64 6c 65 72 0a 20 2a 20 46 6f 72 20 63 6f Adler. * For co
0070: 6e 64 69 74 69 6f 6e 73 20 6f 66 20 64 69 73 74 nditions of dist
0080: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 ribution and use
0090: 2c 20 73 65 65 20 63 6f 70 79 72 69 67 68 74 20 , see copyright
00a0: 6e 6f 74 69 63 65 20 69 6e 20 7a 6c 69 62 2e 68 notice in zlib.h
00b0: 20 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 . */..#include
00c0: 22 7a 75 74 69 6c 2e 68 22 0a 23 69 6e 63 6c 75 "zutil.h".#inclu
00d0: 64 65 20 22 69 6e 66 62 6c 6f 63 6b 2e 68 22 0a de "infblock.h".
00e0: 23 69 6e 63 6c 75 64 65 20 22 69 6e 66 74 72 65 #include "inftre
00f0: 65 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 es.h".#include "
0100: 69 6e 66 63 6f 64 65 73 2e 68 22 0a 23 69 6e 63 infcodes.h".#inc
0110: 6c 75 64 65 20 22 69 6e 66 75 74 69 6c 2e 68 22 lude "infutil.h"
0120: 0a 0a 73 74 72 75 63 74 20 69 6e 66 6c 61 74 65 ..struct inflate
0130: 5f 63 6f 64 65 73 5f 73 74 61 74 65 20 7b 69 6e _codes_state {in
0140: 74 20 64 75 6d 6d 79 3b 7d 3b 20 2f 2a 20 66 6f t dummy;}; /* fo
0150: 72 20 62 75 67 67 79 20 63 6f 6d 70 69 6c 65 72 r buggy compiler
0160: 73 20 2a 2f 0a 0a 2f 2a 20 73 69 6d 70 6c 69 66 s */../* simplif
0170: 79 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 y the use of the
0180: 20 69 6e 66 6c 61 74 65 5f 68 75 66 74 20 74 79 inflate_huft ty
0190: 70 65 20 77 69 74 68 20 73 6f 6d 65 20 64 65 66 pe with some def
01a0: 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ines */.#define
01b0: 65 78 6f 70 20 77 6f 72 64 2e 77 68 61 74 2e 45 exop word.what.E
01c0: 78 6f 70 0a 23 64 65 66 69 6e 65 20 62 69 74 73 xop.#define bits
01d0: 20 77 6f 72 64 2e 77 68 61 74 2e 42 69 74 73 0a word.what.Bits.
01e0: 0a 2f 2a 20 54 61 62 6c 65 20 66 6f 72 20 64 65 ./* Table for de
01f0: 66 6c 61 74 65 20 66 72 6f 6d 20 50 4b 5a 49 50 flate from PKZIP
0200: 27 73 20 61 70 70 6e 6f 74 65 2e 74 78 74 2e 20 's appnote.txt.
0210: 2a 2f 0a 6c 6f 63 61 6c 20 63 6f 6e 73 74 20 75 */.local const u
0220: 49 6e 74 20 62 6f 72 64 65 72 5b 5d 20 3d 20 7b Int border[] = {
0230: 20 2f 2a 20 4f 72 64 65 72 20 6f 66 20 74 68 65 /* Order of the
0240: 20 62 69 74 20 6c 65 6e 67 74 68 20 63 6f 64 65 bit length code
0250: 20 6c 65 6e 67 74 68 73 20 2a 2f 0a 20 20 20 20 lengths */.
0260: 20 20 20 20 31 36 2c 20 31 37 2c 20 31 38 2c 20 16, 17, 18,
0270: 30 2c 20 38 2c 20 37 2c 20 39 2c 20 36 2c 20 31 0, 8, 7, 9, 6, 1
0280: 30 2c 20 35 2c 20 31 31 2c 20 34 2c 20 31 32 2c 0, 5, 11, 4, 12,
0290: 20 33 2c 20 31 33 2c 20 32 2c 20 31 34 2c 20 31 3, 13, 2, 14, 1
02a0: 2c 20 31 35 7d 3b 0a 0a 2f 2a 0a 20 20 20 4e 6f , 15};../*. No
02b0: 74 65 73 20 62 65 79 6f 6e 64 20 74 68 65 20 31 tes beyond the 1
02c0: 2e 39 33 61 20 61 70 70 6e 6f 74 65 2e 74 78 74 .93a appnote.txt
02d0: 3a 0a 0a 20 20 20 31 2e 20 44 69 73 74 61 6e 63 :.. 1. Distanc
02e0: 65 20 70 6f 69 6e 74 65 72 73 20 6e 65 76 65 72 e pointers never
02f0: 20 70 6f 69 6e 74 20 62 65 66 6f 72 65 20 74 68 point before th
0300: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 e beginning of t
0310: 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 he output.
0320: 73 74 72 65 61 6d 2e 0a 20 20 20 32 2e 20 44 69 stream.. 2. Di
0330: 73 74 61 6e 63 65 20 70 6f 69 6e 74 65 72 73 20 stance pointers
0340: 63 61 6e 20 70 6f 69 6e 74 20 62 61 63 6b 20 61 can point back a
0350: 63 72 6f 73 73 20 62 6c 6f 63 6b 73 2c 20 75 70 cross blocks, up
0360: 20 74 6f 20 33 32 6b 20 61 77 61 79 2e 0a 20 20 to 32k away..
0370: 20 33 2e 20 54 68 65 72 65 20 69 73 20 61 6e 20 3. There is an
0380: 69 6d 70 6c 69 65 64 20 6d 61 78 69 6d 75 6d 20 implied maximum
0390: 6f 66 20 37 20 62 69 74 73 20 66 6f 72 20 74 68 of 7 bits for th
03a0: 65 20 62 69 74 20 6c 65 6e 67 74 68 20 74 61 62 e bit length tab
03b0: 6c 65 20 61 6e 64 0a 20 20 20 20 20 20 31 35 20 le and. 15
03c0: 62 69 74 73 20 66 6f 72 20 74 68 65 20 61 63 74 bits for the act
03d0: 75 61 6c 20 64 61 74 61 2e 0a 20 20 20 34 2e 20 ual data.. 4.
03e0: 49 66 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 64 65 If only one code
03f0: 20 65 78 69 73 74 73 2c 20 74 68 65 6e 20 69 74 exists, then it
0400: 20 69 73 20 65 6e 63 6f 64 65 64 20 75 73 69 6e is encoded usin
0410: 67 20 6f 6e 65 20 62 69 74 2e 20 20 28 5a 65 72 g one bit. (Zer
0420: 6f 0a 20 20 20 20 20 20 77 6f 75 6c 64 20 62 65 o. would be
0430: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2c more efficient,
0440: 20 62 75 74 20 70 65 72 68 61 70 73 20 61 20 6c but perhaps a l
0450: 69 74 74 6c 65 20 63 6f 6e 66 75 73 69 6e 67 2e ittle confusing.
0460: 29 20 20 49 66 20 74 77 6f 0a 20 20 20 20 20 20 ) If two.
0470: 63 6f 64 65 73 20 65 78 69 73 74 2c 20 74 68 65 codes exist, the
0480: 79 20 61 72 65 20 63 6f 64 65 64 20 75 73 69 6e y are coded usin
0490: 67 20 6f 6e 65 20 62 69 74 20 65 61 63 68 20 28 g one bit each (
04a0: 30 20 61 6e 64 20 31 29 2e 0a 20 20 20 35 2e 20 0 and 1).. 5.
04b0: 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 There is no way
04c0: 6f 66 20 73 65 6e 64 69 6e 67 20 7a 65 72 6f 20 of sending zero
04d0: 64 69 73 74 61 6e 63 65 20 63 6f 64 65 73 2d 2d distance codes--
04e0: 61 20 64 75 6d 6d 79 20 6d 75 73 74 20 62 65 0a a dummy must be.
04f0: 20 20 20 20 20 20 73 65 6e 74 20 69 66 20 74 68 sent if th
0500: 65 72 65 20 61 72 65 20 6e 6f 6e 65 2e 20 20 28 ere are none. (
0510: 48 69 73 74 6f 72 79 3a 20 61 20 70 72 65 20 32 History: a pre 2
0520: 2e 30 20 76 65 72 73 69 6f 6e 20 6f 66 20 50 4b .0 version of PK
0530: 5a 49 50 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 ZIP would.
0540: 73 74 6f 72 65 20 62 6c 6f 63 6b 73 20 77 69 74 store blocks wit
0550: 68 20 6e 6f 20 64 69 73 74 61 6e 63 65 20 63 6f h no distance co
0560: 64 65 73 2c 20 62 75 74 20 74 68 69 73 20 77 61 des, but this wa
0570: 73 20 64 69 73 63 6f 76 65 72 65 64 20 74 6f 20 s discovered to
0580: 62 65 0a 20 20 20 20 20 20 74 6f 6f 20 68 61 72 be. too har
0590: 73 68 20 61 20 63 72 69 74 65 72 69 6f 6e 2e 29 sh a criterion.)
05a0: 20 20 56 61 6c 69 64 20 6f 6e 6c 79 20 66 6f 72 Valid only for
05b0: 20 31 2e 39 33 61 2e 20 20 32 2e 30 34 63 20 64 1.93a. 2.04c d
05c0: 6f 65 73 20 61 6c 6c 6f 77 0a 20 20 20 20 20 20 oes allow.
05d0: 7a 65 72 6f 20 64 69 73 74 61 6e 63 65 20 63 6f zero distance co
05e0: 64 65 73 2c 20 77 68 69 63 68 20 69 73 20 73 65 des, which is se
05f0: 6e 74 20 61 73 20 6f 6e 65 20 63 6f 64 65 20 6f nt as one code o
0600: 66 20 7a 65 72 6f 20 62 69 74 73 20 69 6e 0a 20 f zero bits in.
0610: 20 20 20 20 20 6c 65 6e 67 74 68 2e 0a 20 20 20 length..
0620: 36 2e 20 54 68 65 72 65 20 61 72 65 20 75 70 20 6. There are up
0630: 74 6f 20 32 38 36 20 6c 69 74 65 72 61 6c 2f 6c to 286 literal/l
0640: 65 6e 67 74 68 20 63 6f 64 65 73 2e 20 20 43 6f ength codes. Co
0650: 64 65 20 32 35 36 20 72 65 70 72 65 73 65 6e 74 de 256 represent
0660: 73 20 74 68 65 0a 20 20 20 20 20 20 65 6e 64 2d s the. end-
0670: 6f 66 2d 62 6c 6f 63 6b 2e 20 20 4e 6f 74 65 20 of-block. Note
0680: 68 6f 77 65 76 65 72 20 74 68 61 74 20 74 68 65 however that the
0690: 20 73 74 61 74 69 63 20 6c 65 6e 67 74 68 20 74 static length t
06a0: 72 65 65 20 64 65 66 69 6e 65 73 0a 20 20 20 20 ree defines.
06b0: 20 20 32 38 38 20 63 6f 64 65 73 20 6a 75 73 74 288 codes just
06c0: 20 74 6f 20 66 69 6c 6c 20 6f 75 74 20 74 68 65 to fill out the
06d0: 20 48 75 66 66 6d 61 6e 20 63 6f 64 65 73 2e 20 Huffman codes.
06e0: 20 43 6f 64 65 73 20 32 38 36 20 61 6e 64 20 32 Codes 286 and 2
06f0: 38 37 0a 20 20 20 20 20 20 63 61 6e 6e 6f 74 20 87. cannot
0700: 62 65 20 75 73 65 64 20 74 68 6f 75 67 68 2c 20 be used though,
0710: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e since there is n
0720: 6f 20 6c 65 6e 67 74 68 20 62 61 73 65 20 6f 72 o length base or
0730: 20 65 78 74 72 61 20 62 69 74 73 0a 20 20 20 20 extra bits.
0740: 20 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68 defined for th
0750: 65 6d 2e 20 20 53 69 6d 69 6c 61 72 69 6c 79 2c em. Similarily,
0760: 20 74 68 65 72 65 20 61 72 65 20 75 70 20 74 6f there are up to
0770: 20 33 30 20 64 69 73 74 61 6e 63 65 20 63 6f 64 30 distance cod
0780: 65 73 2e 0a 20 20 20 20 20 20 48 6f 77 65 76 65 es.. Howeve
0790: 72 2c 20 73 74 61 74 69 63 20 74 72 65 65 73 20 r, static trees
07a0: 64 65 66 69 6e 65 20 33 32 20 63 6f 64 65 73 20 define 32 codes
07b0: 28 61 6c 6c 20 35 20 62 69 74 73 29 20 74 6f 20 (all 5 bits) to
07c0: 66 69 6c 6c 20 6f 75 74 20 74 68 65 0a 20 20 20 fill out the.
07d0: 20 20 20 48 75 66 66 6d 61 6e 20 63 6f 64 65 73 Huffman codes
07e0: 2c 20 62 75 74 20 74 68 65 20 6c 61 73 74 20 74 , but the last t
07f0: 77 6f 20 68 61 64 20 62 65 74 74 65 72 20 6e 6f wo had better no
0800: 74 20 73 68 6f 77 20 75 70 20 69 6e 20 74 68 65 t show up in the
0810: 20 64 61 74 61 2e 0a 20 20 20 37 2e 20 55 6e 7a data.. 7. Unz
0820: 69 70 20 63 61 6e 20 63 68 65 63 6b 20 64 79 6e ip can check dyn
0830: 61 6d 69 63 20 48 75 66 66 6d 61 6e 20 62 6c 6f amic Huffman blo
0840: 63 6b 73 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 cks for complete
0850: 20 63 6f 64 65 20 73 65 74 73 2e 0a 20 20 20 20 code sets..
0860: 20 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 The exception
0870: 69 73 20 74 68 61 74 20 61 20 73 69 6e 67 6c 65 is that a single
0880: 20 63 6f 64 65 20 77 6f 75 6c 64 20 6e 6f 74 20 code would not
0890: 62 65 20 63 6f 6d 70 6c 65 74 65 20 28 73 65 65 be complete (see
08a0: 20 23 34 29 2e 0a 20 20 20 38 2e 20 54 68 65 20 #4).. 8. The
08b0: 66 69 76 65 20 62 69 74 73 20 66 6f 6c 6c 6f 77 five bits follow
08c0: 69 6e 67 20 74 68 65 20 62 6c 6f 63 6b 20 74 79 ing the block ty
08d0: 70 65 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 pe is really the
08e0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 number of.
08f0: 20 6c 69 74 65 72 61 6c 20 63 6f 64 65 73 20 73 literal codes s
0900: 65 6e 74 20 6d 69 6e 75 73 20 32 35 37 2e 0a 20 ent minus 257..
0910: 20 20 39 2e 20 4c 65 6e 67 74 68 20 63 6f 64 65 9. Length code
0920: 73 20 38 2c 31 36 2c 31 36 20 61 72 65 20 69 6e s 8,16,16 are in
0930: 74 65 72 70 72 65 74 65 64 20 61 73 20 31 33 20 terpreted as 13
0940: 6c 65 6e 67 74 68 20 63 6f 64 65 73 20 6f 66 20 length codes of
0950: 38 20 62 69 74 73 0a 20 20 20 20 20 20 28 31 2b 8 bits. (1+
0960: 36 2b 36 29 2e 20 20 54 68 65 72 65 66 6f 72 65 6+6). Therefore
0970: 2c 20 74 6f 20 6f 75 74 70 75 74 20 74 68 72 65 , to output thre
0980: 65 20 74 69 6d 65 73 20 74 68 65 20 6c 65 6e 67 e times the leng
0990: 74 68 2c 20 79 6f 75 20 6f 75 74 70 75 74 0a 20 th, you output.
09a0: 20 20 20 20 20 74 68 72 65 65 20 63 6f 64 65 73 three codes
09b0: 20 28 31 2b 31 2b 31 29 2c 20 77 68 65 72 65 61 (1+1+1), wherea
09c0: 73 20 74 6f 20 6f 75 74 70 75 74 20 66 6f 75 72 s to output four
09d0: 20 74 69 6d 65 73 20 74 68 65 20 73 61 6d 65 20 times the same
09e0: 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20 20 79 6f length,. yo
09f0: 75 20 6f 6e 6c 79 20 6e 65 65 64 20 74 77 6f 20 u only need two
0a00: 63 6f 64 65 73 20 28 31 2b 33 29 2e 20 20 48 6d codes (1+3). Hm
0a10: 6d 2e 0a 20 20 31 30 2e 20 49 6e 20 74 68 65 20 m.. 10. In the
0a20: 74 72 65 65 20 72 65 63 6f 6e 73 74 72 75 63 74 tree reconstruct
0a30: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 2c 20 43 ion algorithm, C
0a40: 6f 64 65 20 3d 20 43 6f 64 65 20 2b 20 49 6e 63 ode = Code + Inc
0a50: 72 65 6d 65 6e 74 0a 20 20 20 20 20 20 6f 6e 6c rement. onl
0a60: 79 20 69 66 20 42 69 74 4c 65 6e 67 74 68 28 69 y if BitLength(i
0a70: 29 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 20 20 ) is not zero.
0a80: 28 50 72 65 74 74 79 20 6f 62 76 69 6f 75 73 2e (Pretty obvious.
0a90: 29 0a 20 20 31 31 2e 20 43 6f 72 72 65 63 74 69 ). 11. Correcti
0aa0: 6f 6e 3a 20 34 20 42 69 74 73 3a 20 23 20 6f 66 on: 4 Bits: # of
0ab0: 20 42 69 74 20 4c 65 6e 67 74 68 20 63 6f 64 65 Bit Length code
0ac0: 73 20 2d 20 34 20 20 20 20 20 28 34 20 2d 20 31 s - 4 (4 - 1
0ad0: 39 29 0a 20 20 31 32 2e 20 4e 6f 74 65 3a 20 6c 9). 12. Note: l
0ae0: 65 6e 67 74 68 20 63 6f 64 65 20 32 38 34 20 63 ength code 284 c
0af0: 61 6e 20 72 65 70 72 65 73 65 6e 74 20 32 32 37 an represent 227
0b00: 2d 32 35 38 2c 20 62 75 74 20 6c 65 6e 67 74 68 -258, but length
0b10: 20 63 6f 64 65 20 32 38 35 0a 20 20 20 20 20 20 code 285.
0b20: 72 65 61 6c 6c 79 20 69 73 20 32 35 38 2e 20 20 really is 258.
0b30: 54 68 65 20 6c 61 73 74 20 6c 65 6e 67 74 68 20 The last length
0b40: 64 65 73 65 72 76 65 73 20 69 74 73 20 6f 77 6e deserves its own
0b50: 2c 20 73 68 6f 72 74 20 63 6f 64 65 0a 20 20 20 , short code.
0b60: 20 20 20 73 69 6e 63 65 20 69 74 20 67 65 74 73 since it gets
0b70: 20 75 73 65 64 20 61 20 6c 6f 74 20 69 6e 20 76 used a lot in v
0b80: 65 72 79 20 72 65 64 75 6e 64 61 6e 74 20 66 69 ery redundant fi
0b90: 6c 65 73 2e 20 20 54 68 65 20 6c 65 6e 67 74 68 les. The length
0ba0: 0a 20 20 20 20 20 20 32 35 38 20 69 73 20 73 70 . 258 is sp
0bb0: 65 63 69 61 6c 20 73 69 6e 63 65 20 32 35 38 20 ecial since 258
0bc0: 2d 20 33 20 28 74 68 65 20 6d 69 6e 20 6d 61 74 - 3 (the min mat
0bd0: 63 68 20 6c 65 6e 67 74 68 29 20 69 73 20 32 35 ch length) is 25
0be0: 35 2e 0a 20 20 31 33 2e 20 54 68 65 20 6c 69 74 5.. 13. The lit
0bf0: 65 72 61 6c 2f 6c 65 6e 67 74 68 20 61 6e 64 20 eral/length and
0c00: 64 69 73 74 61 6e 63 65 20 63 6f 64 65 20 62 69 distance code bi
0c10: 74 20 6c 65 6e 67 74 68 73 20 61 72 65 20 72 65 t lengths are re
0c20: 61 64 20 61 73 20 61 0a 20 20 20 20 20 20 73 69 ad as a. si
0c30: 6e 67 6c 65 20 73 74 72 65 61 6d 20 6f 66 20 6c ngle stream of l
0c40: 65 6e 67 74 68 73 2e 20 20 49 74 20 69 73 20 70 engths. It is p
0c50: 6f 73 73 69 62 6c 65 20 28 61 6e 64 20 61 64 76 ossible (and adv
0c60: 61 6e 74 61 67 65 6f 75 73 29 20 66 6f 72 0a 20 antageous) for.
0c70: 20 20 20 20 20 61 20 72 65 70 65 61 74 20 63 6f a repeat co
0c80: 64 65 20 28 31 36 2c 20 31 37 2c 20 6f 72 20 31 de (16, 17, or 1
0c90: 38 29 20 74 6f 20 67 6f 20 61 63 72 6f 73 73 20 8) to go across
0ca0: 74 68 65 20 62 6f 75 6e 64 61 72 79 20 62 65 74 the boundary bet
0cb0: 77 65 65 6e 0a 20 20 20 20 20 20 74 68 65 20 74 ween. the t
0cc0: 77 6f 20 73 65 74 73 20 6f 66 20 6c 65 6e 67 74 wo sets of lengt
0cd0: 68 73 2e 0a 20 2a 2f 0a 0a 0a 76 6f 69 64 20 69 hs.. */...void i
0ce0: 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 72 65 nflate_blocks_re
0cf0: 73 65 74 28 73 2c 20 7a 2c 20 63 29 0a 69 6e 66 set(s, z, c).inf
0d00: 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 73 74 61 74 late_blocks_stat
0d10: 65 66 20 2a 73 3b 0a 7a 5f 73 74 72 65 61 6d 70 ef *s;.z_streamp
0d20: 20 7a 3b 0a 75 4c 6f 6e 67 66 20 2a 63 3b 0a 7b z;.uLongf *c;.{
0d30: 0a 20 20 69 66 20 28 63 20 21 3d 20 5a 5f 4e 55 . if (c != Z_NU
0d40: 4c 4c 29 0a 20 20 20 20 2a 63 20 3d 20 73 2d 3e LL). *c = s->
0d50: 63 68 65 63 6b 3b 0a 20 20 69 66 20 28 73 2d 3e check;. if (s->
0d60: 6d 6f 64 65 20 3d 3d 20 42 54 52 45 45 20 7c 7c mode == BTREE ||
0d70: 20 73 2d 3e 6d 6f 64 65 20 3d 3d 20 44 54 52 45 s->mode == DTRE
0d80: 45 29 0a 20 20 20 20 5a 46 52 45 45 28 7a 2c 20 E). ZFREE(z,
0d90: 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 62 6c 65 s->sub.trees.ble
0da0: 6e 73 29 3b 0a 20 20 69 66 20 28 73 2d 3e 6d 6f ns);. if (s->mo
0db0: 64 65 20 3d 3d 20 43 4f 44 45 53 29 0a 20 20 20 de == CODES).
0dc0: 20 69 6e 66 6c 61 74 65 5f 63 6f 64 65 73 5f 66 inflate_codes_f
0dd0: 72 65 65 28 73 2d 3e 73 75 62 2e 64 65 63 6f 64 ree(s->sub.decod
0de0: 65 2e 63 6f 64 65 73 2c 20 7a 29 3b 0a 20 20 73 e.codes, z);. s
0df0: 2d 3e 6d 6f 64 65 20 3d 20 54 59 50 45 3b 0a 20 ->mode = TYPE;.
0e00: 20 73 2d 3e 62 69 74 6b 20 3d 20 30 3b 0a 20 20 s->bitk = 0;.
0e10: 73 2d 3e 62 69 74 62 20 3d 20 30 3b 0a 20 20 73 s->bitb = 0;. s
0e20: 2d 3e 72 65 61 64 20 3d 20 73 2d 3e 77 72 69 74 ->read = s->writ
0e30: 65 20 3d 20 73 2d 3e 77 69 6e 64 6f 77 3b 0a 20 e = s->window;.
0e40: 20 69 66 20 28 73 2d 3e 63 68 65 63 6b 66 6e 20 if (s->checkfn
0e50: 21 3d 20 5a 5f 4e 55 4c 4c 29 0a 20 20 20 20 7a != Z_NULL). z
0e60: 2d 3e 61 64 6c 65 72 20 3d 20 73 2d 3e 63 68 65 ->adler = s->che
0e70: 63 6b 20 3d 20 28 2a 73 2d 3e 63 68 65 63 6b 66 ck = (*s->checkf
0e80: 6e 29 28 30 4c 2c 20 28 63 6f 6e 73 74 20 42 79 n)(0L, (const By
0e90: 74 65 66 20 2a 29 5a 5f 4e 55 4c 4c 2c 20 30 29 tef *)Z_NULL, 0)
0ea0: 3b 0a 20 20 54 72 61 63 65 76 28 28 73 74 64 65 ;. Tracev((stde
0eb0: 72 72 2c 20 22 69 6e 66 6c 61 74 65 3a 20 20 20 rr, "inflate:
0ec0: 62 6c 6f 63 6b 73 20 72 65 73 65 74 5c 6e 22 29 blocks reset\n")
0ed0: 29 3b 0a 7d 0a 0a 0a 69 6e 66 6c 61 74 65 5f 62 );.}...inflate_b
0ee0: 6c 6f 63 6b 73 5f 73 74 61 74 65 66 20 2a 69 6e locks_statef *in
0ef0: 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 6e 65 77 flate_blocks_new
0f00: 28 7a 2c 20 63 2c 20 77 29 0a 7a 5f 73 74 72 65 (z, c, w).z_stre
0f10: 61 6d 70 20 7a 3b 0a 63 68 65 63 6b 5f 66 75 6e amp z;.check_fun
0f20: 63 20 63 3b 0a 75 49 6e 74 20 77 3b 0a 7b 0a 20 c c;.uInt w;.{.
0f30: 20 69 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f inflate_blocks_
0f40: 73 74 61 74 65 66 20 2a 73 3b 0a 0a 20 20 69 66 statef *s;.. if
0f50: 20 28 28 73 20 3d 20 28 69 6e 66 6c 61 74 65 5f ((s = (inflate_
0f60: 62 6c 6f 63 6b 73 5f 73 74 61 74 65 66 20 2a 29 blocks_statef *)
0f70: 5a 41 4c 4c 4f 43 0a 20 20 20 20 20 20 20 28 7a ZALLOC. (z
0f80: 2c 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 ,1,sizeof(struct
0f90: 20 69 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f inflate_blocks_
0fa0: 73 74 61 74 65 29 29 29 20 3d 3d 20 5a 5f 4e 55 state))) == Z_NU
0fb0: 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 20 73 LL). return s
0fc0: 3b 0a 20 20 69 66 20 28 28 73 2d 3e 68 75 66 74 ;. if ((s->huft
0fd0: 73 20 3d 0a 20 20 20 20 20 20 20 28 69 6e 66 6c s =. (infl
0fe0: 61 74 65 5f 68 75 66 74 20 2a 29 5a 41 4c 4c 4f ate_huft *)ZALLO
0ff0: 43 28 7a 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6c C(z, sizeof(infl
1000: 61 74 65 5f 68 75 66 74 29 2c 20 4d 41 4e 59 29 ate_huft), MANY)
1010: 29 20 3d 3d 20 5a 5f 4e 55 4c 4c 29 0a 20 20 7b ) == Z_NULL). {
1020: 0a 20 20 20 20 5a 46 52 45 45 28 7a 2c 20 73 29 . ZFREE(z, s)
1030: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 5a 5f 4e ;. return Z_N
1040: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66 20 28 28 ULL;. }. if ((
1050: 73 2d 3e 77 69 6e 64 6f 77 20 3d 20 28 42 79 74 s->window = (Byt
1060: 65 66 20 2a 29 5a 41 4c 4c 4f 43 28 7a 2c 20 31 ef *)ZALLOC(z, 1
1070: 2c 20 77 29 29 20 3d 3d 20 5a 5f 4e 55 4c 4c 29 , w)) == Z_NULL)
1080: 0a 20 20 7b 0a 20 20 20 20 5a 46 52 45 45 28 7a . {. ZFREE(z
1090: 2c 20 73 2d 3e 68 75 66 74 73 29 3b 0a 20 20 20 , s->hufts);.
10a0: 20 5a 46 52 45 45 28 7a 2c 20 73 29 3b 0a 20 20 ZFREE(z, s);.
10b0: 20 20 72 65 74 75 72 6e 20 5a 5f 4e 55 4c 4c 3b return Z_NULL;
10c0: 0a 20 20 7d 0a 20 20 73 2d 3e 65 6e 64 20 3d 20 . }. s->end =
10d0: 73 2d 3e 77 69 6e 64 6f 77 20 2b 20 77 3b 0a 20 s->window + w;.
10e0: 20 73 2d 3e 63 68 65 63 6b 66 6e 20 3d 20 63 3b s->checkfn = c;
10f0: 0a 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 54 59 50 . s->mode = TYP
1100: 45 3b 0a 20 20 54 72 61 63 65 76 28 28 73 74 64 E;. Tracev((std
1110: 65 72 72 2c 20 22 69 6e 66 6c 61 74 65 3a 20 20 err, "inflate:
1120: 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 blocks allocate
1130: 64 5c 6e 22 29 29 3b 0a 20 20 69 6e 66 6c 61 74 d\n"));. inflat
1140: 65 5f 62 6c 6f 63 6b 73 5f 72 65 73 65 74 28 73 e_blocks_reset(s
1150: 2c 20 7a 2c 20 5a 5f 4e 55 4c 4c 29 3b 0a 20 20 , z, Z_NULL);.
1160: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 0a 69 6e return s;.}...in
1170: 74 20 69 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 t inflate_blocks
1180: 28 73 2c 20 7a 2c 20 72 29 0a 69 6e 66 6c 61 74 (s, z, r).inflat
1190: 65 5f 62 6c 6f 63 6b 73 5f 73 74 61 74 65 66 20 e_blocks_statef
11a0: 2a 73 3b 0a 7a 5f 73 74 72 65 61 6d 70 20 7a 3b *s;.z_streamp z;
11b0: 0a 69 6e 74 20 72 3b 0a 7b 0a 20 20 75 49 6e 74 .int r;.{. uInt
11c0: 20 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
11d0: 20 20 2f 2a 20 74 65 6d 70 6f 72 61 72 79 20 73 /* temporary s
11e0: 74 6f 72 61 67 65 20 2a 2f 0a 20 20 75 4c 6f 6e torage */. uLon
11f0: 67 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 g b;
1200: 20 20 2f 2a 20 62 69 74 20 62 75 66 66 65 72 20 /* bit buffer
1210: 2a 2f 0a 20 20 75 49 6e 74 20 6b 3b 20 20 20 20 */. uInt k;
1220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 69 /* bi
1230: 74 73 20 69 6e 20 62 69 74 20 62 75 66 66 65 72 ts in bit buffer
1240: 20 2a 2f 0a 20 20 42 79 74 65 66 20 2a 70 3b 20 */. Bytef *p;
1250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 /* i
1260: 6e 70 75 74 20 64 61 74 61 20 70 6f 69 6e 74 65 nput data pointe
1270: 72 20 2a 2f 0a 20 20 75 49 6e 74 20 6e 3b 20 20 r */. uInt n;
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1290: 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 bytes available
12a0: 74 68 65 72 65 20 2a 2f 0a 20 20 42 79 74 65 66 there */. Bytef
12b0: 20 2a 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 *q;
12c0: 20 2f 2a 20 6f 75 74 70 75 74 20 77 69 6e 64 6f /* output windo
12d0: 77 20 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20 w write pointer
12e0: 2a 2f 0a 20 20 75 49 6e 74 20 6d 3b 20 20 20 20 */. uInt m;
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 79 /* by
1300: 74 65 73 20 74 6f 20 65 6e 64 20 6f 66 20 77 69 tes to end of wi
1310: 6e 64 6f 77 20 6f 72 20 72 65 61 64 20 70 6f 69 ndow or read poi
1320: 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 63 6f nter */.. /* co
1330: 70 79 20 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 py input/output
1340: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6c information to l
1350: 6f 63 61 6c 73 20 28 55 50 44 41 54 45 20 6d 61 ocals (UPDATE ma
1360: 63 72 6f 20 72 65 73 74 6f 72 65 73 29 20 2a 2f cro restores) */
1370: 0a 20 20 4c 4f 41 44 0a 0a 20 20 2f 2a 20 70 72 . LOAD.. /* pr
1380: 6f 63 65 73 73 20 69 6e 70 75 74 20 62 61 73 65 ocess input base
1390: 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 73 74 61 d on current sta
13a0: 74 65 20 2a 2f 0a 20 20 77 68 69 6c 65 20 28 31 te */. while (1
13b0: 29 20 73 77 69 74 63 68 20 28 73 2d 3e 6d 6f 64 ) switch (s->mod
13c0: 65 29 0a 20 20 7b 0a 20 20 20 20 63 61 73 65 20 e). {. case
13d0: 54 59 50 45 3a 0a 20 20 20 20 20 20 4e 45 45 44 TYPE:. NEED
13e0: 42 49 54 53 28 33 29 0a 20 20 20 20 20 20 74 20 BITS(3). t
13f0: 3d 20 28 75 49 6e 74 29 62 20 26 20 37 3b 0a 20 = (uInt)b & 7;.
1400: 20 20 20 20 20 73 2d 3e 6c 61 73 74 20 3d 20 74 s->last = t
1410: 20 26 20 31 3b 0a 20 20 20 20 20 20 73 77 69 74 & 1;. swit
1420: 63 68 20 28 74 20 3e 3e 20 31 29 0a 20 20 20 20 ch (t >> 1).
1430: 20 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 {. case
1440: 20 30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 0:
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
1460: 74 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 tored */.
1470: 20 20 20 54 72 61 63 65 76 28 28 73 74 64 65 72 Tracev((stder
1480: 72 2c 20 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 r, "inflate:
1490: 20 73 74 6f 72 65 64 20 62 6c 6f 63 6b 25 73 5c stored block%s\
14a0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 n",.
14b0: 20 20 20 20 20 73 2d 3e 6c 61 73 74 20 3f 20 22 s->last ? "
14c0: 20 28 6c 61 73 74 29 22 20 3a 20 22 22 29 29 3b (last)" : ""));
14d0: 0a 20 20 20 20 20 20 20 20 20 20 44 55 4d 50 42 . DUMPB
14e0: 49 54 53 28 33 29 0a 20 20 20 20 20 20 20 20 20 ITS(3).
14f0: 20 74 20 3d 20 6b 20 26 20 37 3b 20 20 20 20 20 t = k & 7;
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1510: 2a 20 67 6f 20 74 6f 20 62 79 74 65 20 62 6f 75 * go to byte bou
1520: 6e 64 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 ndary */.
1530: 20 20 20 44 55 4d 50 42 49 54 53 28 74 29 0a 20 DUMPBITS(t).
1540: 20 20 20 20 20 20 20 20 20 73 2d 3e 6d 6f 64 65 s->mode
1550: 20 3d 20 4c 45 4e 53 3b 20 20 20 20 20 20 20 20 = LENS;
1560: 20 20 20 20 20 20 20 2f 2a 20 67 65 74 20 6c 65 /* get le
1570: 6e 67 74 68 20 6f 66 20 73 74 6f 72 65 64 20 62 ngth of stored b
1580: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 lock */.
1590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
15a0: 20 63 61 73 65 20 31 3a 20 20 20 20 20 20 20 20 case 1:
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15c0: 20 2f 2a 20 66 69 78 65 64 20 2a 2f 0a 20 20 20 /* fixed */.
15d0: 20 20 20 20 20 20 20 54 72 61 63 65 76 28 28 73 Tracev((s
15e0: 74 64 65 72 72 2c 20 22 69 6e 66 6c 61 74 65 3a tderr, "inflate:
15f0: 20 20 20 20 20 66 69 78 65 64 20 63 6f 64 65 73 fixed codes
1600: 20 62 6c 6f 63 6b 25 73 5c 6e 22 2c 0a 20 20 20 block%s\n",.
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 2d s-
1620: 3e 6c 61 73 74 20 3f 20 22 20 28 6c 61 73 74 29 >last ? " (last)
1630: 22 20 3a 20 22 22 29 29 3b 0a 20 20 20 20 20 20 " : ""));.
1640: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 {.
1650: 20 20 75 49 6e 74 20 62 6c 2c 20 62 64 3b 0a 20 uInt bl, bd;.
1660: 20 20 20 20 20 20 20 20 20 20 20 69 6e 66 6c 61 infla
1670: 74 65 5f 68 75 66 74 20 2a 74 6c 2c 20 2a 74 64 te_huft *tl, *td
1680: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 ;.. i
1690: 6e 66 6c 61 74 65 5f 74 72 65 65 73 5f 66 69 78 nflate_trees_fix
16a0: 65 64 28 26 62 6c 2c 20 26 62 64 2c 20 26 74 6c ed(&bl, &bd, &tl
16b0: 2c 20 26 74 64 2c 20 7a 29 3b 0a 20 20 20 20 20 , &td, z);.
16c0: 20 20 20 20 20 20 20 73 2d 3e 73 75 62 2e 64 65 s->sub.de
16d0: 63 6f 64 65 2e 63 6f 64 65 73 20 3d 20 69 6e 66 code.codes = inf
16e0: 6c 61 74 65 5f 63 6f 64 65 73 5f 6e 65 77 28 62 late_codes_new(b
16f0: 6c 2c 20 62 64 2c 20 74 6c 2c 20 74 64 2c 20 7a l, bd, tl, td, z
1700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
1710: 66 20 28 73 2d 3e 73 75 62 2e 64 65 63 6f 64 65 f (s->sub.decode
1720: 2e 63 6f 64 65 73 20 3d 3d 20 5a 5f 4e 55 4c 4c .codes == Z_NULL
1730: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a ). {.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20 r
1750: 3d 20 5a 5f 4d 45 4d 5f 45 52 52 4f 52 3b 0a 20 = Z_MEM_ERROR;.
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 45 41 LEA
1770: 56 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d VE. }
1780: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
1790: 20 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 DUMPBITS(
17a0: 33 29 0a 20 20 20 20 20 20 20 20 20 20 73 2d 3e 3). s->
17b0: 6d 6f 64 65 20 3d 20 43 4f 44 45 53 3b 0a 20 20 mode = CODES;.
17c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
17d0: 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 20 case 2:
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f0: 20 20 20 20 20 20 20 2f 2a 20 64 79 6e 61 6d 69 /* dynami
1800: 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 54 c */. T
1810: 72 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 22 racev((stderr, "
1820: 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 64 79 6e inflate: dyn
1830: 61 6d 69 63 20 63 6f 64 65 73 20 62 6c 6f 63 6b amic codes block
1840: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %s\n",.
1850: 20 20 20 20 20 20 20 20 73 2d 3e 6c 61 73 74 20 s->last
1860: 3f 20 22 20 28 6c 61 73 74 29 22 20 3a 20 22 22 ? " (last)" : ""
1870: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 44 55 ));. DU
1880: 4d 50 42 49 54 53 28 33 29 0a 20 20 20 20 20 20 MPBITS(3).
1890: 20 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 54 41 s->mode = TA
18a0: 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 20 20 62 BLE;. b
18b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 reak;. ca
18c0: 73 65 20 33 3a 20 20 20 20 20 20 20 20 20 20 20 se 3:
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
18e0: 20 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 20 20 illegal */.
18f0: 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 33 DUMPBITS(3
1900: 29 0a 20 20 20 20 20 20 20 20 20 20 73 2d 3e 6d ). s->m
1910: 6f 64 65 20 3d 20 42 41 44 3b 0a 20 20 20 20 20 ode = BAD;.
1920: 20 20 20 20 20 7a 2d 3e 6d 73 67 20 3d 20 28 63 z->msg = (c
1930: 68 61 72 2a 29 22 69 6e 76 61 6c 69 64 20 62 6c har*)"invalid bl
1940: 6f 63 6b 20 74 79 70 65 22 3b 0a 20 20 20 20 20 ock type";.
1950: 20 20 20 20 20 72 20 3d 20 5a 5f 44 41 54 41 5f r = Z_DATA_
1960: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 ERROR;.
1970: 20 4c 45 41 56 45 0a 20 20 20 20 20 20 7d 0a 20 LEAVE. }.
1980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1990: 63 61 73 65 20 4c 45 4e 53 3a 0a 20 20 20 20 20 case LENS:.
19a0: 20 4e 45 45 44 42 49 54 53 28 33 32 29 0a 20 20 NEEDBITS(32).
19b0: 20 20 20 20 69 66 20 28 28 28 28 7e 62 29 20 3e if ((((~b) >
19c0: 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 29 20 > 16) & 0xffff)
19d0: 21 3d 20 28 62 20 26 20 30 78 66 66 66 66 29 29 != (b & 0xffff))
19e0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
19f0: 20 73 2d 3e 6d 6f 64 65 20 3d 20 42 41 44 3b 0a s->mode = BAD;.
1a00: 20 20 20 20 20 20 20 20 7a 2d 3e 6d 73 67 20 3d z->msg =
1a10: 20 28 63 68 61 72 2a 29 22 69 6e 76 61 6c 69 64 (char*)"invalid
1a20: 20 73 74 6f 72 65 64 20 62 6c 6f 63 6b 20 6c 65 stored block le
1a30: 6e 67 74 68 73 22 3b 0a 20 20 20 20 20 20 20 20 ngths";.
1a40: 72 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 r = Z_DATA_ERROR
1a50: 3b 0a 20 20 20 20 20 20 20 20 4c 45 41 56 45 0a ;. LEAVE.
1a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 2d }. s-
1a70: 3e 73 75 62 2e 6c 65 66 74 20 3d 20 28 75 49 6e >sub.left = (uIn
1a80: 74 29 62 20 26 20 30 78 66 66 66 66 3b 0a 20 20 t)b & 0xffff;.
1a90: 20 20 20 20 62 20 3d 20 6b 20 3d 20 30 3b 20 20 b = k = 0;
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab0: 20 20 20 20 2f 2a 20 64 75 6d 70 20 62 69 74 73 /* dump bits
1ac0: 20 2a 2f 0a 20 20 20 20 20 20 54 72 61 63 65 76 */. Tracev
1ad0: 28 28 73 74 64 65 72 72 2c 20 22 69 6e 66 6c 61 ((stderr, "infla
1ae0: 74 65 3a 20 20 20 20 20 20 20 73 74 6f 72 65 64 te: stored
1af0: 20 6c 65 6e 67 74 68 20 25 75 5c 6e 22 2c 20 73 length %u\n", s
1b00: 2d 3e 73 75 62 2e 6c 65 66 74 29 29 3b 0a 20 20 ->sub.left));.
1b10: 20 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 73 2d s->mode = s-
1b20: 3e 73 75 62 2e 6c 65 66 74 20 3f 20 53 54 4f 52 >sub.left ? STOR
1b30: 45 44 20 3a 20 28 73 2d 3e 6c 61 73 74 20 3f 20 ED : (s->last ?
1b40: 44 52 59 20 3a 20 54 59 50 45 29 3b 0a 20 20 20 DRY : TYPE);.
1b50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
1b60: 73 65 20 53 54 4f 52 45 44 3a 0a 20 20 20 20 20 se STORED:.
1b70: 20 69 66 20 28 6e 20 3d 3d 20 30 29 0a 20 20 20 if (n == 0).
1b80: 20 20 20 20 20 4c 45 41 56 45 0a 20 20 20 20 20 LEAVE.
1b90: 20 4e 45 45 44 4f 55 54 0a 20 20 20 20 20 20 74 NEEDOUT. t
1ba0: 20 3d 20 73 2d 3e 73 75 62 2e 6c 65 66 74 3b 0a = s->sub.left;.
1bb0: 20 20 20 20 20 20 69 66 20 28 74 20 3e 20 6e 29 if (t > n)
1bc0: 20 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 69 66 t = n;. if
1bd0: 20 28 74 20 3e 20 6d 29 20 74 20 3d 20 6d 3b 0a (t > m) t = m;.
1be0: 20 20 20 20 20 20 7a 6d 65 6d 63 70 79 28 71 2c zmemcpy(q,
1bf0: 20 70 2c 20 74 29 3b 0a 20 20 20 20 20 20 70 20 p, t);. p
1c00: 2b 3d 20 74 3b 20 20 6e 20 2d 3d 20 74 3b 0a 20 += t; n -= t;.
1c10: 20 20 20 20 20 71 20 2b 3d 20 74 3b 20 20 6d 20 q += t; m
1c20: 2d 3d 20 74 3b 0a 20 20 20 20 20 20 69 66 20 28 -= t;. if (
1c30: 28 73 2d 3e 73 75 62 2e 6c 65 66 74 20 2d 3d 20 (s->sub.left -=
1c40: 74 29 20 21 3d 20 30 29 0a 20 20 20 20 20 20 20 t) != 0).
1c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 54 72 break;. Tr
1c60: 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 22 69 acev((stderr, "i
1c70: 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20 73 74 nflate: st
1c80: 6f 72 65 64 20 65 6e 64 2c 20 25 6c 75 20 74 6f ored end, %lu to
1c90: 74 61 6c 20 6f 75 74 5c 6e 22 2c 0a 20 20 20 20 tal out\n",.
1ca0: 20 20 20 20 20 20 20 20 20 20 7a 2d 3e 74 6f 74 z->tot
1cb0: 61 6c 5f 6f 75 74 20 2b 20 28 71 20 3e 3d 20 73 al_out + (q >= s
1cc0: 2d 3e 72 65 61 64 20 3f 20 71 20 2d 20 73 2d 3e ->read ? q - s->
1cd0: 72 65 61 64 20 3a 0a 20 20 20 20 20 20 20 20 20 read :.
1ce0: 20 20 20 20 20 28 73 2d 3e 65 6e 64 20 2d 20 73 (s->end - s
1cf0: 2d 3e 72 65 61 64 29 20 2b 20 28 71 20 2d 20 73 ->read) + (q - s
1d00: 2d 3e 77 69 6e 64 6f 77 29 29 29 29 3b 0a 20 20 ->window))));.
1d10: 20 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 73 2d s->mode = s-
1d20: 3e 6c 61 73 74 20 3f 20 44 52 59 20 3a 20 54 59 >last ? DRY : TY
1d30: 50 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b PE;. break;
1d40: 0a 20 20 20 20 63 61 73 65 20 54 41 42 4c 45 3a . case TABLE:
1d50: 0a 20 20 20 20 20 20 4e 45 45 44 42 49 54 53 28 . NEEDBITS(
1d60: 31 34 29 0a 20 20 20 20 20 20 73 2d 3e 73 75 62 14). s->sub
1d70: 2e 74 72 65 65 73 2e 74 61 62 6c 65 20 3d 20 74 .trees.table = t
1d80: 20 3d 20 28 75 49 6e 74 29 62 20 26 20 30 78 33 = (uInt)b & 0x3
1d90: 66 66 66 3b 0a 23 69 66 6e 64 65 66 20 50 4b 5a fff;.#ifndef PKZ
1da0: 49 50 5f 42 55 47 5f 57 4f 52 4b 41 52 4f 55 4e IP_BUG_WORKAROUN
1db0: 44 0a 20 20 20 20 20 20 69 66 20 28 28 74 20 26 D. if ((t &
1dc0: 20 30 78 31 66 29 20 3e 20 32 39 20 7c 7c 20 28 0x1f) > 29 || (
1dd0: 28 74 20 3e 3e 20 35 29 20 26 20 30 78 31 66 29 (t >> 5) & 0x1f)
1de0: 20 3e 20 32 39 29 0a 20 20 20 20 20 20 7b 0a 20 > 29). {.
1df0: 20 20 20 20 20 20 20 73 2d 3e 6d 6f 64 65 20 3d s->mode =
1e00: 20 42 41 44 3b 0a 20 20 20 20 20 20 20 20 7a 2d BAD;. z-
1e10: 3e 6d 73 67 20 3d 20 28 63 68 61 72 2a 29 22 74 >msg = (char*)"t
1e20: 6f 6f 20 6d 61 6e 79 20 6c 65 6e 67 74 68 20 6f oo many length o
1e30: 72 20 64 69 73 74 61 6e 63 65 20 73 79 6d 62 6f r distance symbo
1e40: 6c 73 22 3b 0a 20 20 20 20 20 20 20 20 72 20 3d ls";. r =
1e50: 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 20 Z_DATA_ERROR;.
1e60: 20 20 20 20 20 20 20 4c 45 41 56 45 0a 20 20 20 LEAVE.
1e70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
1e80: 20 20 74 20 3d 20 32 35 38 20 2b 20 28 74 20 26 t = 258 + (t &
1e90: 20 30 78 31 66 29 20 2b 20 28 28 74 20 3e 3e 20 0x1f) + ((t >>
1ea0: 35 29 20 26 20 30 78 31 66 29 3b 0a 20 20 20 20 5) & 0x1f);.
1eb0: 20 20 69 66 20 28 28 73 2d 3e 73 75 62 2e 74 72 if ((s->sub.tr
1ec0: 65 65 73 2e 62 6c 65 6e 73 20 3d 20 28 75 49 6e ees.blens = (uIn
1ed0: 74 66 2a 29 5a 41 4c 4c 4f 43 28 7a 2c 20 74 2c tf*)ZALLOC(z, t,
1ee0: 20 73 69 7a 65 6f 66 28 75 49 6e 74 29 29 29 20 sizeof(uInt)))
1ef0: 3d 3d 20 5a 5f 4e 55 4c 4c 29 0a 20 20 20 20 20 == Z_NULL).
1f00: 20 7b 0a 20 20 20 20 20 20 20 20 72 20 3d 20 5a {. r = Z
1f10: 5f 4d 45 4d 5f 45 52 52 4f 52 3b 0a 20 20 20 20 _MEM_ERROR;.
1f20: 20 20 20 20 4c 45 41 56 45 0a 20 20 20 20 20 20 LEAVE.
1f30: 7d 0a 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 }. DUMPBITS
1f40: 28 31 34 29 0a 20 20 20 20 20 20 73 2d 3e 73 75 (14). s->su
1f50: 62 2e 74 72 65 65 73 2e 69 6e 64 65 78 20 3d 20 b.trees.index =
1f60: 30 3b 0a 20 20 20 20 20 20 54 72 61 63 65 76 28 0;. Tracev(
1f70: 28 73 74 64 65 72 72 2c 20 22 69 6e 66 6c 61 74 (stderr, "inflat
1f80: 65 3a 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 e: table s
1f90: 69 7a 65 73 20 6f 6b 5c 6e 22 29 29 3b 0a 20 20 izes ok\n"));.
1fa0: 20 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 42 54 s->mode = BT
1fb0: 52 45 45 3b 0a 20 20 20 20 63 61 73 65 20 42 54 REE;. case BT
1fc0: 52 45 45 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 REE:. while
1fd0: 20 28 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 69 (s->sub.trees.i
1fe0: 6e 64 65 78 20 3c 20 34 20 2b 20 28 73 2d 3e 73 ndex < 4 + (s->s
1ff0: 75 62 2e 74 72 65 65 73 2e 74 61 62 6c 65 20 3e ub.trees.table >
2000: 3e 20 31 30 29 29 0a 20 20 20 20 20 20 7b 0a 20 > 10)). {.
2010: 20 20 20 20 20 20 20 4e 45 45 44 42 49 54 53 28 NEEDBITS(
2020: 33 29 0a 20 20 20 20 20 20 20 20 73 2d 3e 73 75 3). s->su
2030: 62 2e 74 72 65 65 73 2e 62 6c 65 6e 73 5b 62 6f b.trees.blens[bo
2040: 72 64 65 72 5b 73 2d 3e 73 75 62 2e 74 72 65 65 rder[s->sub.tree
2050: 73 2e 69 6e 64 65 78 2b 2b 5d 5d 20 3d 20 28 75 s.index++]] = (u
2060: 49 6e 74 29 62 20 26 20 37 3b 0a 20 20 20 20 20 Int)b & 7;.
2070: 20 20 20 44 55 4d 50 42 49 54 53 28 33 29 0a 20 DUMPBITS(3).
2080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 }. whi
2090: 6c 65 20 28 73 2d 3e 73 75 62 2e 74 72 65 65 73 le (s->sub.trees
20a0: 2e 69 6e 64 65 78 20 3c 20 31 39 29 0a 20 20 20 .index < 19).
20b0: 20 20 20 20 20 73 2d 3e 73 75 62 2e 74 72 65 65 s->sub.tree
20c0: 73 2e 62 6c 65 6e 73 5b 62 6f 72 64 65 72 5b 73 s.blens[border[s
20d0: 2d 3e 73 75 62 2e 74 72 65 65 73 2e 69 6e 64 65 ->sub.trees.inde
20e0: 78 2b 2b 5d 5d 20 3d 20 30 3b 0a 20 20 20 20 20 x++]] = 0;.
20f0: 20 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 62 62 s->sub.trees.bb
2100: 20 3d 20 37 3b 0a 20 20 20 20 20 20 74 20 3d 20 = 7;. t =
2110: 69 6e 66 6c 61 74 65 5f 74 72 65 65 73 5f 62 69 inflate_trees_bi
2120: 74 73 28 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e ts(s->sub.trees.
2130: 62 6c 65 6e 73 2c 20 26 73 2d 3e 73 75 62 2e 74 blens, &s->sub.t
2140: 72 65 65 73 2e 62 62 2c 0a 20 20 20 20 20 20 20 rees.bb,.
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2160: 20 20 20 20 20 20 26 73 2d 3e 73 75 62 2e 74 72 &s->sub.tr
2170: 65 65 73 2e 74 62 2c 20 73 2d 3e 68 75 66 74 73 ees.tb, s->hufts
2180: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 20 28 , z);. if (
2190: 74 20 21 3d 20 5a 5f 4f 4b 29 0a 20 20 20 20 20 t != Z_OK).
21a0: 20 7b 0a 20 20 20 20 20 20 20 20 5a 46 52 45 45 {. ZFREE
21b0: 28 7a 2c 20 73 2d 3e 73 75 62 2e 74 72 65 65 73 (z, s->sub.trees
21c0: 2e 62 6c 65 6e 73 29 3b 0a 20 20 20 20 20 20 20 .blens);.
21d0: 20 72 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20 r = t;.
21e0: 69 66 20 28 72 20 3d 3d 20 5a 5f 44 41 54 41 5f if (r == Z_DATA_
21f0: 45 52 52 4f 52 29 0a 20 20 20 20 20 20 20 20 20 ERROR).
2200: 20 73 2d 3e 6d 6f 64 65 20 3d 20 42 41 44 3b 0a s->mode = BAD;.
2210: 20 20 20 20 20 20 20 20 4c 45 41 56 45 0a 20 20 LEAVE.
2220: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 2d 3e 73 }. s->s
2230: 75 62 2e 74 72 65 65 73 2e 69 6e 64 65 78 20 3d ub.trees.index =
2240: 20 30 3b 0a 20 20 20 20 20 20 54 72 61 63 65 76 0;. Tracev
2250: 28 28 73 74 64 65 72 72 2c 20 22 69 6e 66 6c 61 ((stderr, "infla
2260: 74 65 3a 20 20 20 20 20 20 20 62 69 74 73 20 74 te: bits t
2270: 72 65 65 20 6f 6b 5c 6e 22 29 29 3b 0a 20 20 20 ree ok\n"));.
2280: 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 44 54 52 s->mode = DTR
2290: 45 45 3b 0a 20 20 20 20 63 61 73 65 20 44 54 52 EE;. case DTR
22a0: 45 45 3a 0a 20 20 20 20 20 20 77 68 69 6c 65 20 EE:. while
22b0: 28 74 20 3d 20 73 2d 3e 73 75 62 2e 74 72 65 65 (t = s->sub.tree
22c0: 73 2e 74 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 s.table,.
22d0: 20 20 20 20 20 20 73 2d 3e 73 75 62 2e 74 72 65 s->sub.tre
22e0: 65 73 2e 69 6e 64 65 78 20 3c 20 32 35 38 20 2b es.index < 258 +
22f0: 20 28 74 20 26 20 30 78 31 66 29 20 2b 20 28 28 (t & 0x1f) + ((
2300: 74 20 3e 3e 20 35 29 20 26 20 30 78 31 66 29 29 t >> 5) & 0x1f))
2310: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
2320: 20 69 6e 66 6c 61 74 65 5f 68 75 66 74 20 2a 68 inflate_huft *h
2330: 3b 0a 20 20 20 20 20 20 20 20 75 49 6e 74 20 69 ;. uInt i
2340: 2c 20 6a 2c 20 63 3b 0a 0a 20 20 20 20 20 20 20 , j, c;..
2350: 20 74 20 3d 20 73 2d 3e 73 75 62 2e 74 72 65 65 t = s->sub.tree
2360: 73 2e 62 62 3b 0a 20 20 20 20 20 20 20 20 4e 45 s.bb;. NE
2370: 45 44 42 49 54 53 28 74 29 0a 20 20 20 20 20 20 EDBITS(t).
2380: 20 20 68 20 3d 20 73 2d 3e 73 75 62 2e 74 72 65 h = s->sub.tre
2390: 65 73 2e 74 62 20 2b 20 28 28 75 49 6e 74 29 62 es.tb + ((uInt)b
23a0: 20 26 20 69 6e 66 6c 61 74 65 5f 6d 61 73 6b 5b & inflate_mask[
23b0: 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 20 3d t]);. t =
23c0: 20 68 2d 3e 62 69 74 73 3b 0a 20 20 20 20 20 20 h->bits;.
23d0: 20 20 63 20 3d 20 68 2d 3e 62 61 73 65 3b 0a 20 c = h->base;.
23e0: 20 20 20 20 20 20 20 69 66 20 28 63 20 3c 20 31 if (c < 1
23f0: 36 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 6). {.
2400: 20 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 DUMPBITS(
2410: 74 29 0a 20 20 20 20 20 20 20 20 20 20 73 2d 3e t). s->
2420: 73 75 62 2e 74 72 65 65 73 2e 62 6c 65 6e 73 5b sub.trees.blens[
2430: 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 69 6e 64 s->sub.trees.ind
2440: 65 78 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 ex++] = c;.
2450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 }. els
2460: 65 20 2f 2a 20 63 20 3d 3d 20 31 36 2e 2e 31 38 e /* c == 16..18
2470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 */. {.
2480: 20 20 20 20 20 20 20 20 69 20 3d 20 63 20 3d 3d i = c ==
2490: 20 31 38 20 3f 20 37 20 3a 20 63 20 2d 20 31 34 18 ? 7 : c - 14
24a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 ;. j =
24b0: 63 20 3d 3d 20 31 38 20 3f 20 31 31 20 3a 20 33 c == 18 ? 11 : 3
24c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 4e 45 45 44 ;. NEED
24d0: 42 49 54 53 28 74 20 2b 20 69 29 0a 20 20 20 20 BITS(t + i).
24e0: 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 74 DUMPBITS(t
24f0: 29 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d ). j +=
2500: 20 28 75 49 6e 74 29 62 20 26 20 69 6e 66 6c 61 (uInt)b & infla
2510: 74 65 5f 6d 61 73 6b 5b 69 5d 3b 0a 20 20 20 20 te_mask[i];.
2520: 20 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 69 DUMPBITS(i
2530: 29 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 ). i =
2540: 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 69 6e 64 s->sub.trees.ind
2550: 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 74 20 ex;. t
2560: 3d 20 73 2d 3e 73 75 62 2e 74 72 65 65 73 2e 74 = s->sub.trees.t
2570: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 able;.
2580: 69 66 20 28 69 20 2b 20 6a 20 3e 20 32 35 38 20 if (i + j > 258
2590: 2b 20 28 74 20 26 20 30 78 31 66 29 20 2b 20 28 + (t & 0x1f) + (
25a0: 28 74 20 3e 3e 20 35 29 20 26 20 30 78 31 66 29 (t >> 5) & 0x1f)
25b0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ||.
25c0: 20 20 28 63 20 3d 3d 20 31 36 20 26 26 20 69 20 (c == 16 && i
25d0: 3c 20 31 29 29 0a 20 20 20 20 20 20 20 20 20 20 < 1)).
25e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5a 46 {. ZF
25f0: 52 45 45 28 7a 2c 20 73 2d 3e 73 75 62 2e 74 72 REE(z, s->sub.tr
2600: 65 65 73 2e 62 6c 65 6e 73 29 3b 0a 20 20 20 20 ees.blens);.
2610: 20 20 20 20 20 20 20 20 73 2d 3e 6d 6f 64 65 20 s->mode
2620: 3d 20 42 41 44 3b 0a 20 20 20 20 20 20 20 20 20 = BAD;.
2630: 20 20 20 7a 2d 3e 6d 73 67 20 3d 20 28 63 68 61 z->msg = (cha
2640: 72 2a 29 22 69 6e 76 61 6c 69 64 20 62 69 74 20 r*)"invalid bit
2650: 6c 65 6e 67 74 68 20 72 65 70 65 61 74 22 3b 0a length repeat";.
2660: 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 r =
2670: 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 20 20 Z_DATA_ERROR;.
2680: 20 20 20 20 20 20 20 20 20 20 4c 45 41 56 45 0a LEAVE.
2690: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
26a0: 20 20 20 20 20 20 63 20 3d 20 63 20 3d 3d 20 31 c = c == 1
26b0: 36 20 3f 20 73 2d 3e 73 75 62 2e 74 72 65 65 73 6 ? s->sub.trees
26c0: 2e 62 6c 65 6e 73 5b 69 20 2d 20 31 5d 20 3a 20 .blens[i - 1] :
26d0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 20 0;. do
26e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 2d {. s-
26f0: 3e 73 75 62 2e 74 72 65 65 73 2e 62 6c 65 6e 73 >sub.trees.blens
2700: 5b 69 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 [i++] = c;.
2710: 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d } while (--
2720: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 2d j);. s-
2730: 3e 73 75 62 2e 74 72 65 65 73 2e 69 6e 64 65 78 >sub.trees.index
2740: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a = i;. }.
2750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 2d }. s-
2760: 3e 73 75 62 2e 74 72 65 65 73 2e 74 62 20 3d 20 >sub.trees.tb =
2770: 5a 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7b 0a Z_NULL;. {.
2780: 20 20 20 20 20 20 20 20 75 49 6e 74 20 62 6c 2c uInt bl,
2790: 20 62 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 66 bd;. inf
27a0: 6c 61 74 65 5f 68 75 66 74 20 2a 74 6c 2c 20 2a late_huft *tl, *
27b0: 74 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 66 6c td;. infl
27c0: 61 74 65 5f 63 6f 64 65 73 5f 73 74 61 74 65 66 ate_codes_statef
27d0: 20 2a 63 3b 0a 0a 20 20 20 20 20 20 20 20 62 6c *c;.. bl
27e0: 20 3d 20 39 3b 20 20 20 20 20 20 20 20 20 2f 2a = 9; /*
27f0: 20 6d 75 73 74 20 62 65 20 3c 3d 20 39 20 66 6f must be <= 9 fo
2800: 72 20 6c 6f 6f 6b 61 68 65 61 64 20 61 73 73 75 r lookahead assu
2810: 6d 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 mptions */.
2820: 20 20 20 62 64 20 3d 20 36 3b 20 20 20 20 20 20 bd = 6;
2830: 20 20 20 2f 2a 20 6d 75 73 74 20 62 65 20 3c 3d /* must be <=
2840: 20 39 20 66 6f 72 20 6c 6f 6f 6b 61 68 65 61 64 9 for lookahead
2850: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 2a 2f 0a assumptions */.
2860: 20 20 20 20 20 20 20 20 74 20 3d 20 73 2d 3e 73 t = s->s
2870: 75 62 2e 74 72 65 65 73 2e 74 61 62 6c 65 3b 0a ub.trees.table;.
2880: 20 20 20 20 20 20 20 20 74 20 3d 20 69 6e 66 6c t = infl
2890: 61 74 65 5f 74 72 65 65 73 5f 64 79 6e 61 6d 69 ate_trees_dynami
28a0: 63 28 32 35 37 20 2b 20 28 74 20 26 20 30 78 31 c(257 + (t & 0x1
28b0: 66 29 2c 20 31 20 2b 20 28 28 74 20 3e 3e 20 35 f), 1 + ((t >> 5
28c0: 29 20 26 20 30 78 31 66 29 2c 0a 20 20 20 20 20 ) & 0x1f),.
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e s->
28f0: 73 75 62 2e 74 72 65 65 73 2e 62 6c 65 6e 73 2c sub.trees.blens,
2900: 20 26 62 6c 2c 20 26 62 64 2c 20 26 74 6c 2c 20 &bl, &bd, &tl,
2910: 26 74 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 &td,.
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2930: 20 20 20 20 20 20 20 73 2d 3e 68 75 66 74 73 2c s->hufts,
2940: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 5a 46 52 z);. ZFR
2950: 45 45 28 7a 2c 20 73 2d 3e 73 75 62 2e 74 72 65 EE(z, s->sub.tre
2960: 65 73 2e 62 6c 65 6e 73 29 3b 0a 20 20 20 20 20 es.blens);.
2970: 20 20 20 69 66 20 28 74 20 21 3d 20 5a 5f 4f 4b if (t != Z_OK
2980: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 ). {.
2990: 20 20 20 20 20 20 69 66 20 28 74 20 3d 3d 20 28 if (t == (
29a0: 75 49 6e 74 29 5a 5f 44 41 54 41 5f 45 52 52 4f uInt)Z_DATA_ERRO
29b0: 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 R). s
29c0: 2d 3e 6d 6f 64 65 20 3d 20 42 41 44 3b 0a 20 20 ->mode = BAD;.
29d0: 20 20 20 20 20 20 20 20 72 20 3d 20 74 3b 0a 20 r = t;.
29e0: 20 20 20 20 20 20 20 20 20 4c 45 41 56 45 0a 20 LEAVE.
29f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
2a00: 20 54 72 61 63 65 76 28 28 73 74 64 65 72 72 2c Tracev((stderr,
2a10: 20 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 "inflate:
2a20: 20 74 72 65 65 73 20 6f 6b 5c 6e 22 29 29 3b 0a trees ok\n"));.
2a30: 20 20 20 20 20 20 20 20 69 66 20 28 28 63 20 3d if ((c =
2a40: 20 69 6e 66 6c 61 74 65 5f 63 6f 64 65 73 5f 6e inflate_codes_n
2a50: 65 77 28 62 6c 2c 20 62 64 2c 20 74 6c 2c 20 74 ew(bl, bd, tl, t
2a60: 64 2c 20 7a 29 29 20 3d 3d 20 5a 5f 4e 55 4c 4c d, z)) == Z_NULL
2a70: 29 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 ). {.
2a80: 20 20 20 20 20 20 72 20 3d 20 5a 5f 4d 45 4d 5f r = Z_MEM_
2a90: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 ERROR;.
2aa0: 20 4c 45 41 56 45 0a 20 20 20 20 20 20 20 20 7d LEAVE. }
2ab0: 0a 20 20 20 20 20 20 20 20 73 2d 3e 73 75 62 2e . s->sub.
2ac0: 64 65 63 6f 64 65 2e 63 6f 64 65 73 20 3d 20 63 decode.codes = c
2ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
2ae0: 73 2d 3e 6d 6f 64 65 20 3d 20 43 4f 44 45 53 3b s->mode = CODES;
2af0: 0a 20 20 20 20 63 61 73 65 20 43 4f 44 45 53 3a . case CODES:
2b00: 0a 20 20 20 20 20 20 55 50 44 41 54 45 0a 20 20 . UPDATE.
2b10: 20 20 20 20 69 66 20 28 28 72 20 3d 20 69 6e 66 if ((r = inf
2b20: 6c 61 74 65 5f 63 6f 64 65 73 28 73 2c 20 7a 2c late_codes(s, z,
2b30: 20 72 29 29 20 21 3d 20 5a 5f 53 54 52 45 41 4d r)) != Z_STREAM
2b40: 5f 45 4e 44 29 0a 20 20 20 20 20 20 20 20 72 65 _END). re
2b50: 74 75 72 6e 20 69 6e 66 6c 61 74 65 5f 66 6c 75 turn inflate_flu
2b60: 73 68 28 73 2c 20 7a 2c 20 72 29 3b 0a 20 20 20 sh(s, z, r);.
2b70: 20 20 20 72 20 3d 20 5a 5f 4f 4b 3b 0a 20 20 20 r = Z_OK;.
2b80: 20 20 20 69 6e 66 6c 61 74 65 5f 63 6f 64 65 73 inflate_codes
2b90: 5f 66 72 65 65 28 73 2d 3e 73 75 62 2e 64 65 63 _free(s->sub.dec
2ba0: 6f 64 65 2e 63 6f 64 65 73 2c 20 7a 29 3b 0a 20 ode.codes, z);.
2bb0: 20 20 20 20 20 4c 4f 41 44 0a 20 20 20 20 20 20 LOAD.
2bc0: 54 72 61 63 65 76 28 28 73 74 64 65 72 72 2c 20 Tracev((stderr,
2bd0: 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20 "inflate:
2be0: 63 6f 64 65 73 20 65 6e 64 2c 20 25 6c 75 20 74 codes end, %lu t
2bf0: 6f 74 61 6c 20 6f 75 74 5c 6e 22 2c 0a 20 20 20 otal out\n",.
2c00: 20 20 20 20 20 20 20 20 20 20 20 7a 2d 3e 74 6f z->to
2c10: 74 61 6c 5f 6f 75 74 20 2b 20 28 71 20 3e 3d 20 tal_out + (q >=
2c20: 73 2d 3e 72 65 61 64 20 3f 20 71 20 2d 20 73 2d s->read ? q - s-
2c30: 3e 72 65 61 64 20 3a 0a 20 20 20 20 20 20 20 20 >read :.
2c40: 20 20 20 20 20 20 28 73 2d 3e 65 6e 64 20 2d 20 (s->end -
2c50: 73 2d 3e 72 65 61 64 29 20 2b 20 28 71 20 2d 20 s->read) + (q -
2c60: 73 2d 3e 77 69 6e 64 6f 77 29 29 29 29 3b 0a 20 s->window))));.
2c70: 20 20 20 20 20 69 66 20 28 21 73 2d 3e 6c 61 73 if (!s->las
2c80: 74 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 t). {.
2c90: 20 20 20 73 2d 3e 6d 6f 64 65 20 3d 20 54 59 50 s->mode = TYP
2ca0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b E;. break
2cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
2cc0: 73 2d 3e 6d 6f 64 65 20 3d 20 44 52 59 3b 0a 20 s->mode = DRY;.
2cd0: 20 20 20 63 61 73 65 20 44 52 59 3a 0a 20 20 20 case DRY:.
2ce0: 20 20 20 46 4c 55 53 48 0a 20 20 20 20 20 20 69 FLUSH. i
2cf0: 66 20 28 73 2d 3e 72 65 61 64 20 21 3d 20 73 2d f (s->read != s-
2d00: 3e 77 72 69 74 65 29 0a 20 20 20 20 20 20 20 20 >write).
2d10: 4c 45 41 56 45 0a 20 20 20 20 20 20 73 2d 3e 6d LEAVE. s->m
2d20: 6f 64 65 20 3d 20 44 4f 4e 45 3b 0a 20 20 20 20 ode = DONE;.
2d30: 63 61 73 65 20 44 4f 4e 45 3a 0a 20 20 20 20 20 case DONE:.
2d40: 20 72 20 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e r = Z_STREAM_EN
2d50: 44 3b 0a 20 20 20 20 20 20 4c 45 41 56 45 0a 20 D;. LEAVE.
2d60: 20 20 20 63 61 73 65 20 42 41 44 3a 0a 20 20 20 case BAD:.
2d70: 20 20 20 72 20 3d 20 5a 5f 44 41 54 41 5f 45 52 r = Z_DATA_ER
2d80: 52 4f 52 3b 0a 20 20 20 20 20 20 4c 45 41 56 45 ROR;. LEAVE
2d90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 . default:.
2da0: 20 20 20 20 72 20 3d 20 5a 5f 53 54 52 45 41 4d r = Z_STREAM
2db0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 4c 45 _ERROR;. LE
2dc0: 41 56 45 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 AVE. }.}...int
2dd0: 69 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 66 inflate_blocks_f
2de0: 72 65 65 28 73 2c 20 7a 29 0a 69 6e 66 6c 61 74 ree(s, z).inflat
2df0: 65 5f 62 6c 6f 63 6b 73 5f 73 74 61 74 65 66 20 e_blocks_statef
2e00: 2a 73 3b 0a 7a 5f 73 74 72 65 61 6d 70 20 7a 3b *s;.z_streamp z;
2e10: 0a 7b 0a 20 20 69 6e 66 6c 61 74 65 5f 62 6c 6f .{. inflate_blo
2e20: 63 6b 73 5f 72 65 73 65 74 28 73 2c 20 7a 2c 20 cks_reset(s, z,
2e30: 5a 5f 4e 55 4c 4c 29 3b 0a 20 20 5a 46 52 45 45 Z_NULL);. ZFREE
2e40: 28 7a 2c 20 73 2d 3e 77 69 6e 64 6f 77 29 3b 0a (z, s->window);.
2e50: 20 20 5a 46 52 45 45 28 7a 2c 20 73 2d 3e 68 75 ZFREE(z, s->hu
2e60: 66 74 73 29 3b 0a 20 20 5a 46 52 45 45 28 7a 2c fts);. ZFREE(z,
2e70: 20 73 29 3b 0a 20 20 54 72 61 63 65 76 28 28 73 s);. Tracev((s
2e80: 74 64 65 72 72 2c 20 22 69 6e 66 6c 61 74 65 3a tderr, "inflate:
2e90: 20 20 20 62 6c 6f 63 6b 73 20 66 72 65 65 64 5c blocks freed\
2ea0: 6e 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 5a n"));. return Z
2eb0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 69 6e _OK;.}...void in
2ec0: 66 6c 61 74 65 5f 73 65 74 5f 64 69 63 74 69 6f flate_set_dictio
2ed0: 6e 61 72 79 28 73 2c 20 64 2c 20 6e 29 0a 69 6e nary(s, d, n).in
2ee0: 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 73 74 61 flate_blocks_sta
2ef0: 74 65 66 20 2a 73 3b 0a 63 6f 6e 73 74 20 42 79 tef *s;.const By
2f00: 74 65 66 20 2a 64 3b 0a 75 49 6e 74 20 20 6e 3b tef *d;.uInt n;
2f10: 0a 7b 0a 20 20 7a 6d 65 6d 63 70 79 28 73 2d 3e .{. zmemcpy(s->
2f20: 77 69 6e 64 6f 77 2c 20 64 2c 20 6e 29 3b 0a 20 window, d, n);.
2f30: 20 73 2d 3e 72 65 61 64 20 3d 20 73 2d 3e 77 72 s->read = s->wr
2f40: 69 74 65 20 3d 20 73 2d 3e 77 69 6e 64 6f 77 20 ite = s->window
2f50: 2b 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 74 75 + n;.}.../* Retu
2f60: 72 6e 73 20 74 72 75 65 20 69 66 20 69 6e 66 6c rns true if infl
2f70: 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 ate is currently
2f80: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 at the end of a
2f90: 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65 64 block generated
2fa0: 0a 20 2a 20 62 79 20 5a 5f 53 59 4e 43 5f 46 4c . * by Z_SYNC_FL
2fb0: 55 53 48 20 6f 72 20 5a 5f 46 55 4c 4c 5f 46 4c USH or Z_FULL_FL
2fc0: 55 53 48 2e 20 0a 20 2a 20 49 4e 20 61 73 73 65 USH. . * IN asse
2fd0: 72 74 69 6f 6e 3a 20 73 20 21 3d 20 5a 5f 4e 55 rtion: s != Z_NU
2fe0: 4c 4c 0a 20 2a 2f 0a 69 6e 74 20 69 6e 66 6c 61 LL. */.int infla
2ff0: 74 65 5f 62 6c 6f 63 6b 73 5f 73 79 6e 63 5f 70 te_blocks_sync_p
3000: 6f 69 6e 74 28 73 29 0a 69 6e 66 6c 61 74 65 5f oint(s).inflate_
3010: 62 6c 6f 63 6b 73 5f 73 74 61 74 65 66 20 2a 73 blocks_statef *s
3020: 3b 0a 7b 0a 20 20 72 65 74 75 72 6e 20 73 2d 3e ;.{. return s->
3030: 6d 6f 64 65 20 3d 3d 20 4c 45 4e 53 3b 0a 7d 0a mode == LENS;.}.