Hex Artifact Content

Not logged in

Artifact 247ccc67935ee81d7f6240290aa06d2f8ba3f33f:


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;.}.