Hex Artifact Content

Not logged in

Artifact 7f23ab87bf41988d2b75743f597edcfb705af7fb:


0000: 2f 2a 20 69 6e 66 63 6f 64 65 73 2e 63 20 2d 2d  /* infcodes.c --
0010: 20 70 72 6f 63 65 73 73 20 6c 69 74 65 72 61 6c   process literal
0020: 73 20 61 6e 64 20 6c 65 6e 67 74 68 2f 64 69 73  s and length/dis
0030: 74 61 6e 63 65 20 70 61 69 72 73 0a 20 2a 20 43  tance pairs. * C
0040: 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 39  opyright (C) 199
0050: 35 2d 31 39 39 38 20 4d 61 72 6b 20 41 64 6c 65  5-1998 Mark Adle
0060: 72 0a 20 2a 20 46 6f 72 20 63 6f 6e 64 69 74 69  r. * For conditi
0070: 6f 6e 73 20 6f 66 20 64 69 73 74 72 69 62 75 74  ons of distribut
0080: 69 6f 6e 20 61 6e 64 20 75 73 65 2c 20 73 65 65  ion and use, see
0090: 20 63 6f 70 79 72 69 67 68 74 20 6e 6f 74 69 63   copyright notic
00a0: 65 20 69 6e 20 7a 6c 69 62 2e 68 20 0a 20 2a 2f  e in zlib.h . */
00b0: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 7a 75 74 69  ..#include "zuti
00c0: 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 69  l.h".#include "i
00d0: 6e 66 74 72 65 65 73 2e 68 22 0a 23 69 6e 63 6c  nftrees.h".#incl
00e0: 75 64 65 20 22 69 6e 66 62 6c 6f 63 6b 2e 68 22  ude "infblock.h"
00f0: 0a 23 69 6e 63 6c 75 64 65 20 22 69 6e 66 63 6f  .#include "infco
0100: 64 65 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  des.h".#include 
0110: 22 69 6e 66 75 74 69 6c 2e 68 22 0a 23 69 6e 63  "infutil.h".#inc
0120: 6c 75 64 65 20 22 69 6e 66 66 61 73 74 2e 68 22  lude "inffast.h"
0130: 0a 0a 2f 2a 20 73 69 6d 70 6c 69 66 79 20 74 68  ../* simplify th
0140: 65 20 75 73 65 20 6f 66 20 74 68 65 20 69 6e 66  e use of the inf
0150: 6c 61 74 65 5f 68 75 66 74 20 74 79 70 65 20 77  late_huft type w
0160: 69 74 68 20 73 6f 6d 65 20 64 65 66 69 6e 65 73  ith some defines
0170: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 78 6f 70   */.#define exop
0180: 20 77 6f 72 64 2e 77 68 61 74 2e 45 78 6f 70 0a   word.what.Exop.
0190: 23 64 65 66 69 6e 65 20 62 69 74 73 20 77 6f 72  #define bits wor
01a0: 64 2e 77 68 61 74 2e 42 69 74 73 0a 0a 74 79 70  d.what.Bits..typ
01b0: 65 64 65 66 20 65 6e 75 6d 20 7b 20 20 20 20 20  edef enum {     
01c0: 20 20 20 2f 2a 20 77 61 69 74 69 6e 67 20 66 6f     /* waiting fo
01d0: 72 20 22 69 3a 22 3d 69 6e 70 75 74 2c 20 22 6f  r "i:"=input, "o
01e0: 3a 22 3d 6f 75 74 70 75 74 2c 20 22 78 3a 22 3d  :"=output, "x:"=
01f0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
0200: 20 53 54 41 52 54 2c 20 20 20 20 2f 2a 20 78 3a   START,    /* x:
0210: 20 73 65 74 20 75 70 20 66 6f 72 20 4c 45 4e 20   set up for LEN 
0220: 2a 2f 0a 20 20 20 20 20 20 4c 45 4e 2c 20 20 20  */.      LEN,   
0230: 20 20 20 2f 2a 20 69 3a 20 67 65 74 20 6c 65 6e     /* i: get len
0240: 67 74 68 2f 6c 69 74 65 72 61 6c 2f 65 6f 62 20  gth/literal/eob 
0250: 6e 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 4c 45  next */.      LE
0260: 4e 45 58 54 2c 20 20 20 2f 2a 20 69 3a 20 67 65  NEXT,   /* i: ge
0270: 74 74 69 6e 67 20 6c 65 6e 67 74 68 20 65 78 74  tting length ext
0280: 72 61 20 28 68 61 76 65 20 62 61 73 65 29 20 2a  ra (have base) *
0290: 2f 0a 20 20 20 20 20 20 44 49 53 54 2c 20 20 20  /.      DIST,   
02a0: 20 20 2f 2a 20 69 3a 20 67 65 74 20 64 69 73 74    /* i: get dist
02b0: 61 6e 63 65 20 6e 65 78 74 20 2a 2f 0a 20 20 20  ance next */.   
02c0: 20 20 20 44 49 53 54 45 58 54 2c 20 20 2f 2a 20     DISTEXT,  /* 
02d0: 69 3a 20 67 65 74 74 69 6e 67 20 64 69 73 74 61  i: getting dista
02e0: 6e 63 65 20 65 78 74 72 61 20 2a 2f 0a 20 20 20  nce extra */.   
02f0: 20 20 20 43 4f 50 59 2c 20 20 20 20 20 2f 2a 20     COPY,     /* 
0300: 6f 3a 20 63 6f 70 79 69 6e 67 20 62 79 74 65 73  o: copying bytes
0310: 20 69 6e 20 77 69 6e 64 6f 77 2c 20 77 61 69 74   in window, wait
0320: 69 6e 67 20 66 6f 72 20 73 70 61 63 65 20 2a 2f  ing for space */
0330: 0a 20 20 20 20 20 20 4c 49 54 2c 20 20 20 20 20  .      LIT,     
0340: 20 2f 2a 20 6f 3a 20 67 6f 74 20 6c 69 74 65 72   /* o: got liter
0350: 61 6c 2c 20 77 61 69 74 69 6e 67 20 66 6f 72 20  al, waiting for 
0360: 6f 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f 0a  output space */.
0370: 20 20 20 20 20 20 57 41 53 48 2c 20 20 20 20 20        WASH,     
0380: 2f 2a 20 6f 3a 20 67 6f 74 20 65 6f 62 2c 20 70  /* o: got eob, p
0390: 6f 73 73 69 62 6c 79 20 73 74 69 6c 6c 20 6f 75  ossibly still ou
03a0: 74 70 75 74 20 77 61 69 74 69 6e 67 20 2a 2f 0a  tput waiting */.
03b0: 20 20 20 20 20 20 45 4e 44 2c 20 20 20 20 20 20        END,      
03c0: 2f 2a 20 78 3a 20 67 6f 74 20 65 6f 62 20 61 6e  /* x: got eob an
03d0: 64 20 61 6c 6c 20 64 61 74 61 20 66 6c 75 73 68  d all data flush
03e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 42 41 44 43  ed */.      BADC
03f0: 4f 44 45 7d 20 20 2f 2a 20 78 3a 20 67 6f 74 20  ODE}  /* x: got 
0400: 65 72 72 6f 72 20 2a 2f 0a 69 6e 66 6c 61 74 65  error */.inflate
0410: 5f 63 6f 64 65 73 5f 6d 6f 64 65 3b 0a 0a 2f 2a  _codes_mode;../*
0420: 20 69 6e 66 6c 61 74 65 20 63 6f 64 65 73 20 70   inflate codes p
0430: 72 69 76 61 74 65 20 73 74 61 74 65 20 2a 2f 0a  rivate state */.
0440: 73 74 72 75 63 74 20 69 6e 66 6c 61 74 65 5f 63  struct inflate_c
0450: 6f 64 65 73 5f 73 74 61 74 65 20 7b 0a 0a 20 20  odes_state {..  
0460: 2f 2a 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 66  /* mode */.  inf
0470: 6c 61 74 65 5f 63 6f 64 65 73 5f 6d 6f 64 65 20  late_codes_mode 
0480: 6d 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 63 75  mode;      /* cu
0490: 72 72 65 6e 74 20 69 6e 66 6c 61 74 65 5f 63 6f  rrent inflate_co
04a0: 64 65 73 20 6d 6f 64 65 20 2a 2f 0a 0a 20 20 2f  des mode */..  /
04b0: 2a 20 6d 6f 64 65 20 64 65 70 65 6e 64 65 6e 74  * mode dependent
04c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
04d0: 20 20 75 49 6e 74 20 6c 65 6e 3b 0a 20 20 75 6e    uInt len;.  un
04e0: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
04f0: 20 7b 0a 20 20 20 20 20 20 69 6e 66 6c 61 74 65   {.      inflate
0500: 5f 68 75 66 74 20 2a 74 72 65 65 3b 20 20 20 20  _huft *tree;    
0510: 20 20 20 2f 2a 20 70 6f 69 6e 74 65 72 20 69 6e     /* pointer in
0520: 74 6f 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 20  to tree */.     
0530: 20 75 49 6e 74 20 6e 65 65 64 3b 20 20 20 20 20   uInt need;     
0540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 69             /* bi
0550: 74 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20  ts needed */.   
0560: 20 7d 20 63 6f 64 65 3b 20 20 20 20 20 20 20 20   } code;        
0570: 20 20 20 20 20 2f 2a 20 69 66 20 4c 45 4e 20 6f       /* if LEN o
0580: 72 20 44 49 53 54 2c 20 77 68 65 72 65 20 69 6e  r DIST, where in
0590: 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 75 49 6e   tree */.    uIn
05a0: 74 20 6c 69 74 3b 20 20 20 20 20 20 20 20 20 20  t lit;          
05b0: 20 2f 2a 20 69 66 20 4c 49 54 2c 20 6c 69 74 65   /* if LIT, lite
05c0: 72 61 6c 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ral */.    struc
05d0: 74 20 7b 0a 20 20 20 20 20 20 75 49 6e 74 20 67  t {.      uInt g
05e0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
05f0: 20 20 20 20 2f 2a 20 62 69 74 73 20 74 6f 20 67      /* bits to g
0600: 65 74 20 66 6f 72 20 65 78 74 72 61 20 2a 2f 0a  et for extra */.
0610: 20 20 20 20 20 20 75 49 6e 74 20 64 69 73 74 3b        uInt dist;
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 2f 2a 20 64 69 73 74 61 6e 63 65 20 62 61 63 6b  /* distance back
0640: 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 2a 2f   to copy from */
0650: 0a 20 20 20 20 7d 20 63 6f 70 79 3b 20 20 20 20  .    } copy;    
0660: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 45           /* if E
0670: 58 54 20 6f 72 20 43 4f 50 59 2c 20 77 68 65 72  XT or COPY, wher
0680: 65 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 2a  e and how much *
0690: 2f 0a 20 20 7d 20 73 75 62 3b 20 20 20 20 20 20  /.  } sub;      
06a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 75 62            /* sub
06b0: 6d 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 6d 6f  mode */..  /* mo
06c0: 64 65 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 69  de independent i
06d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
06e0: 42 79 74 65 20 6c 62 69 74 73 3b 20 20 20 20 20  Byte lbits;     
06f0: 20 20 20 20 20 20 2f 2a 20 6c 74 72 65 65 20 62        /* ltree b
0700: 69 74 73 20 64 65 63 6f 64 65 64 20 70 65 72 20  its decoded per 
0710: 62 72 61 6e 63 68 20 2a 2f 0a 20 20 42 79 74 65  branch */.  Byte
0720: 20 64 62 69 74 73 3b 20 20 20 20 20 20 20 20 20   dbits;         
0730: 20 20 2f 2a 20 64 74 72 65 65 20 62 69 74 73 20    /* dtree bits 
0740: 64 65 63 6f 64 65 72 20 70 65 72 20 62 72 61 6e  decoder per bran
0750: 63 68 20 2a 2f 0a 20 20 69 6e 66 6c 61 74 65 5f  ch */.  inflate_
0760: 68 75 66 74 20 2a 6c 74 72 65 65 3b 20 20 20 20  huft *ltree;    
0770: 20 20 20 20 20 20 2f 2a 20 6c 69 74 65 72 61 6c        /* literal
0780: 2f 6c 65 6e 67 74 68 2f 65 6f 62 20 74 72 65 65  /length/eob tree
0790: 20 2a 2f 0a 20 20 69 6e 66 6c 61 74 65 5f 68 75   */.  inflate_hu
07a0: 66 74 20 2a 64 74 72 65 65 3b 20 20 20 20 20 20  ft *dtree;      
07b0: 20 20 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20      /* distance 
07c0: 74 72 65 65 20 2a 2f 0a 0a 7d 3b 0a 0a 0a 69 6e  tree */..};...in
07d0: 66 6c 61 74 65 5f 63 6f 64 65 73 5f 73 74 61 74  flate_codes_stat
07e0: 65 66 20 2a 69 6e 66 6c 61 74 65 5f 63 6f 64 65  ef *inflate_code
07f0: 73 5f 6e 65 77 28 62 6c 2c 20 62 64 2c 20 74 6c  s_new(bl, bd, tl
0800: 2c 20 74 64 2c 20 7a 29 0a 75 49 6e 74 20 62 6c  , td, z).uInt bl
0810: 2c 20 62 64 3b 0a 69 6e 66 6c 61 74 65 5f 68 75  , bd;.inflate_hu
0820: 66 74 20 2a 74 6c 3b 0a 69 6e 66 6c 61 74 65 5f  ft *tl;.inflate_
0830: 68 75 66 74 20 2a 74 64 3b 20 2f 2a 20 6e 65 65  huft *td; /* nee
0840: 64 20 73 65 70 61 72 61 74 65 20 64 65 63 6c 61  d separate decla
0850: 72 61 74 69 6f 6e 20 66 6f 72 20 42 6f 72 6c 61  ration for Borla
0860: 6e 64 20 43 2b 2b 20 2a 2f 0a 7a 5f 73 74 72 65  nd C++ */.z_stre
0870: 61 6d 70 20 7a 3b 0a 7b 0a 20 20 69 6e 66 6c 61  amp z;.{.  infla
0880: 74 65 5f 63 6f 64 65 73 5f 73 74 61 74 65 66 20  te_codes_statef 
0890: 2a 63 3b 0a 0a 20 20 69 66 20 28 28 63 20 3d 20  *c;..  if ((c = 
08a0: 28 69 6e 66 6c 61 74 65 5f 63 6f 64 65 73 5f 73  (inflate_codes_s
08b0: 74 61 74 65 66 20 2a 29 0a 20 20 20 20 20 20 20  tatef *).       
08c0: 5a 41 4c 4c 4f 43 28 7a 2c 31 2c 73 69 7a 65 6f  ZALLOC(z,1,sizeo
08d0: 66 28 73 74 72 75 63 74 20 69 6e 66 6c 61 74 65  f(struct inflate
08e0: 5f 63 6f 64 65 73 5f 73 74 61 74 65 29 29 29 20  _codes_state))) 
08f0: 21 3d 20 5a 5f 4e 55 4c 4c 29 0a 20 20 7b 0a 20  != Z_NULL).  {. 
0900: 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 53 54 41     c->mode = STA
0910: 52 54 3b 0a 20 20 20 20 63 2d 3e 6c 62 69 74 73  RT;.    c->lbits
0920: 20 3d 20 28 42 79 74 65 29 62 6c 3b 0a 20 20 20   = (Byte)bl;.   
0930: 20 63 2d 3e 64 62 69 74 73 20 3d 20 28 42 79 74   c->dbits = (Byt
0940: 65 29 62 64 3b 0a 20 20 20 20 63 2d 3e 6c 74 72  e)bd;.    c->ltr
0950: 65 65 20 3d 20 74 6c 3b 0a 20 20 20 20 63 2d 3e  ee = tl;.    c->
0960: 64 74 72 65 65 20 3d 20 74 64 3b 0a 20 20 20 20  dtree = td;.    
0970: 54 72 61 63 65 76 28 28 73 74 64 65 72 72 2c 20  Tracev((stderr, 
0980: 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20  "inflate:       
0990: 63 6f 64 65 73 20 6e 65 77 5c 6e 22 29 29 3b 0a  codes new\n"));.
09a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a    }.  return c;.
09b0: 7d 0a 0a 0a 69 6e 74 20 69 6e 66 6c 61 74 65 5f  }...int inflate_
09c0: 63 6f 64 65 73 28 73 2c 20 7a 2c 20 72 29 0a 69  codes(s, z, r).i
09d0: 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b 73 5f 73 74  nflate_blocks_st
09e0: 61 74 65 66 20 2a 73 3b 0a 7a 5f 73 74 72 65 61  atef *s;.z_strea
09f0: 6d 70 20 7a 3b 0a 69 6e 74 20 72 3b 0a 7b 0a 20  mp z;.int r;.{. 
0a00: 20 75 49 6e 74 20 6a 3b 20 20 20 20 20 20 20 20   uInt j;        
0a10: 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72         /* tempor
0a20: 61 72 79 20 73 74 6f 72 61 67 65 20 2a 2f 0a 20  ary storage */. 
0a30: 20 69 6e 66 6c 61 74 65 5f 68 75 66 74 20 2a 74   inflate_huft *t
0a40: 3b 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72  ;      /* tempor
0a50: 61 72 79 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ary pointer */. 
0a60: 20 75 49 6e 74 20 65 3b 20 20 20 20 20 20 20 20   uInt e;        
0a70: 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 20         /* extra 
0a80: 62 69 74 73 20 6f 72 20 6f 70 65 72 61 74 69 6f  bits or operatio
0a90: 6e 20 2a 2f 0a 20 20 75 4c 6f 6e 67 20 62 3b 20  n */.  uLong b; 
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ab0: 62 69 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  bit buffer */.  
0ac0: 75 49 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20  uInt k;         
0ad0: 20 20 20 20 20 20 2f 2a 20 62 69 74 73 20 69 6e        /* bits in
0ae0: 20 62 69 74 20 62 75 66 66 65 72 20 2a 2f 0a 20   bit buffer */. 
0af0: 20 42 79 74 65 66 20 2a 70 3b 20 20 20 20 20 20   Bytef *p;      
0b00: 20 20 20 20 20 20 20 2f 2a 20 69 6e 70 75 74 20         /* input 
0b10: 64 61 74 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  data pointer */.
0b20: 20 20 75 49 6e 74 20 6e 3b 20 20 20 20 20 20 20    uInt n;       
0b30: 20 20 20 20 20 20 20 20 2f 2a 20 62 79 74 65 73          /* bytes
0b40: 20 61 76 61 69 6c 61 62 6c 65 20 74 68 65 72 65   available there
0b50: 20 2a 2f 0a 20 20 42 79 74 65 66 20 2a 71 3b 20   */.  Bytef *q; 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
0b70: 75 74 70 75 74 20 77 69 6e 64 6f 77 20 77 72 69  utput window wri
0b80: 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  te pointer */.  
0b90: 75 49 6e 74 20 6d 3b 20 20 20 20 20 20 20 20 20  uInt m;         
0ba0: 20 20 20 20 20 20 2f 2a 20 62 79 74 65 73 20 74        /* bytes t
0bb0: 6f 20 65 6e 64 20 6f 66 20 77 69 6e 64 6f 77 20  o end of window 
0bc0: 6f 72 20 72 65 61 64 20 70 6f 69 6e 74 65 72 20  or read pointer 
0bd0: 2a 2f 0a 20 20 42 79 74 65 66 20 2a 66 3b 20 20  */.  Bytef *f;  
0be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f             /* po
0bf0: 69 6e 74 65 72 20 74 6f 20 63 6f 70 79 20 73 74  inter to copy st
0c00: 72 69 6e 67 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  rings from */.  
0c10: 69 6e 66 6c 61 74 65 5f 63 6f 64 65 73 5f 73 74  inflate_codes_st
0c20: 61 74 65 66 20 2a 63 20 3d 20 73 2d 3e 73 75 62  atef *c = s->sub
0c30: 2e 64 65 63 6f 64 65 2e 63 6f 64 65 73 3b 20 20  .decode.codes;  
0c40: 2f 2a 20 63 6f 64 65 73 20 73 74 61 74 65 20 2a  /* codes state *
0c50: 2f 0a 0a 20 20 2f 2a 20 63 6f 70 79 20 69 6e 70  /..  /* copy inp
0c60: 75 74 2f 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d  ut/output inform
0c70: 61 74 69 6f 6e 20 74 6f 20 6c 6f 63 61 6c 73 20  ation to locals 
0c80: 28 55 50 44 41 54 45 20 6d 61 63 72 6f 20 72 65  (UPDATE macro re
0c90: 73 74 6f 72 65 73 29 20 2a 2f 0a 20 20 4c 4f 41  stores) */.  LOA
0ca0: 44 0a 0a 20 20 2f 2a 20 70 72 6f 63 65 73 73 20  D..  /* process 
0cb0: 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75 74  input and output
0cc0: 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e   based on curren
0cd0: 74 20 73 74 61 74 65 20 2a 2f 0a 20 20 77 68 69  t state */.  whi
0ce0: 6c 65 20 28 31 29 20 73 77 69 74 63 68 20 28 63  le (1) switch (c
0cf0: 2d 3e 6d 6f 64 65 29 0a 20 20 7b 20 20 20 20 20  ->mode).  {     
0d00: 20 20 20 20 20 20 20 20 2f 2a 20 77 61 69 74 69          /* waiti
0d10: 6e 67 20 66 6f 72 20 22 69 3a 22 3d 69 6e 70 75  ng for "i:"=inpu
0d20: 74 2c 20 22 6f 3a 22 3d 6f 75 74 70 75 74 2c 20  t, "o:"=output, 
0d30: 22 78 3a 22 3d 6e 6f 74 68 69 6e 67 20 2a 2f 0a  "x:"=nothing */.
0d40: 20 20 20 20 63 61 73 65 20 53 54 41 52 54 3a 20      case START: 
0d50: 20 20 20 20 20 20 20 20 2f 2a 20 78 3a 20 73 65          /* x: se
0d60: 74 20 75 70 20 66 6f 72 20 4c 45 4e 20 2a 2f 0a  t up for LEN */.
0d70: 23 69 66 6e 64 65 66 20 53 4c 4f 57 0a 20 20 20  #ifndef SLOW.   
0d80: 20 20 20 69 66 20 28 6d 20 3e 3d 20 32 35 38 20     if (m >= 258 
0d90: 26 26 20 6e 20 3e 3d 20 31 30 29 0a 20 20 20 20  && n >= 10).    
0da0: 20 20 7b 0a 20 20 20 20 20 20 20 20 55 50 44 41    {.        UPDA
0db0: 54 45 0a 20 20 20 20 20 20 20 20 72 20 3d 20 69  TE.        r = i
0dc0: 6e 66 6c 61 74 65 5f 66 61 73 74 28 63 2d 3e 6c  nflate_fast(c->l
0dd0: 62 69 74 73 2c 20 63 2d 3e 64 62 69 74 73 2c 20  bits, c->dbits, 
0de0: 63 2d 3e 6c 74 72 65 65 2c 20 63 2d 3e 64 74 72  c->ltree, c->dtr
0df0: 65 65 2c 20 73 2c 20 7a 29 3b 0a 20 20 20 20 20  ee, s, z);.     
0e00: 20 20 20 4c 4f 41 44 0a 20 20 20 20 20 20 20 20     LOAD.        
0e10: 69 66 20 28 72 20 21 3d 20 5a 5f 4f 4b 29 0a 20  if (r != Z_OK). 
0e20: 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
0e30: 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 72 20 3d     c->mode = r =
0e40: 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 20 3f  = Z_STREAM_END ?
0e50: 20 57 41 53 48 20 3a 20 42 41 44 43 4f 44 45 3b   WASH : BADCODE;
0e60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
0e70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0e80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53    }.#endif /* !S
0e90: 4c 4f 57 20 2a 2f 0a 20 20 20 20 20 20 63 2d 3e  LOW */.      c->
0ea0: 73 75 62 2e 63 6f 64 65 2e 6e 65 65 64 20 3d 20  sub.code.need = 
0eb0: 63 2d 3e 6c 62 69 74 73 3b 0a 20 20 20 20 20 20  c->lbits;.      
0ec0: 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 74 72 65 65  c->sub.code.tree
0ed0: 20 3d 20 63 2d 3e 6c 74 72 65 65 3b 0a 20 20 20   = c->ltree;.   
0ee0: 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 4c 45 4e     c->mode = LEN
0ef0: 3b 0a 20 20 20 20 63 61 73 65 20 4c 45 4e 3a 20  ;.    case LEN: 
0f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 3a 20            /* i: 
0f10: 67 65 74 20 6c 65 6e 67 74 68 2f 6c 69 74 65 72  get length/liter
0f20: 61 6c 2f 65 6f 62 20 6e 65 78 74 20 2a 2f 0a 20  al/eob next */. 
0f30: 20 20 20 20 20 6a 20 3d 20 63 2d 3e 73 75 62 2e       j = c->sub.
0f40: 63 6f 64 65 2e 6e 65 65 64 3b 0a 20 20 20 20 20  code.need;.     
0f50: 20 4e 45 45 44 42 49 54 53 28 6a 29 0a 20 20 20   NEEDBITS(j).   
0f60: 20 20 20 74 20 3d 20 63 2d 3e 73 75 62 2e 63 6f     t = c->sub.co
0f70: 64 65 2e 74 72 65 65 20 2b 20 28 28 75 49 6e 74  de.tree + ((uInt
0f80: 29 62 20 26 20 69 6e 66 6c 61 74 65 5f 6d 61 73  )b & inflate_mas
0f90: 6b 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 44 55 4d  k[j]);.      DUM
0fa0: 50 42 49 54 53 28 74 2d 3e 62 69 74 73 29 0a 20  PBITS(t->bits). 
0fb0: 20 20 20 20 20 65 20 3d 20 28 75 49 6e 74 29 28       e = (uInt)(
0fc0: 74 2d 3e 65 78 6f 70 29 3b 0a 20 20 20 20 20 20  t->exop);.      
0fd0: 69 66 20 28 65 20 3d 3d 20 30 29 20 20 20 20 20  if (e == 0)     
0fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 69 74            /* lit
0ff0: 65 72 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  eral */.      {.
1000: 20 20 20 20 20 20 20 20 63 2d 3e 73 75 62 2e 6c          c->sub.l
1010: 69 74 20 3d 20 74 2d 3e 62 61 73 65 3b 0a 20 20  it = t->base;.  
1020: 20 20 20 20 20 20 54 72 61 63 65 76 76 28 28 73        Tracevv((s
1030: 74 64 65 72 72 2c 20 74 2d 3e 62 61 73 65 20 3e  tderr, t->base >
1040: 3d 20 30 78 32 30 20 26 26 20 74 2d 3e 62 61 73  = 0x20 && t->bas
1050: 65 20 3c 20 30 78 37 66 20 3f 0a 20 20 20 20 20  e < 0x7f ?.     
1060: 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 66              "inf
1070: 6c 61 74 65 3a 20 20 20 20 20 20 20 20 20 6c 69  late:         li
1080: 74 65 72 61 6c 20 27 25 63 27 5c 6e 22 20 3a 0a  teral '%c'\n" :.
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20   "inflate:      
10b0: 20 20 20 6c 69 74 65 72 61 6c 20 30 78 25 30 32     literal 0x%02
10c0: 78 5c 6e 22 2c 20 74 2d 3e 62 61 73 65 29 29 3b  x\n", t->base));
10d0: 0a 20 20 20 20 20 20 20 20 63 2d 3e 6d 6f 64 65  .        c->mode
10e0: 20 3d 20 4c 49 54 3b 0a 20 20 20 20 20 20 20 20   = LIT;.        
10f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1100: 20 20 20 20 20 69 66 20 28 65 20 26 20 31 36 29       if (e & 16)
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1120: 2a 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 20 20  * length */.    
1130: 20 20 7b 0a 20 20 20 20 20 20 20 20 63 2d 3e 73    {.        c->s
1140: 75 62 2e 63 6f 70 79 2e 67 65 74 20 3d 20 65 20  ub.copy.get = e 
1150: 26 20 31 35 3b 0a 20 20 20 20 20 20 20 20 63 2d  & 15;.        c-
1160: 3e 6c 65 6e 20 3d 20 74 2d 3e 62 61 73 65 3b 0a  >len = t->base;.
1170: 20 20 20 20 20 20 20 20 63 2d 3e 6d 6f 64 65 20          c->mode 
1180: 3d 20 4c 45 4e 45 58 54 3b 0a 20 20 20 20 20 20  = LENEXT;.      
1190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11a0: 0a 20 20 20 20 20 20 69 66 20 28 28 65 20 26 20  .      if ((e & 
11b0: 36 34 29 20 3d 3d 20 30 29 20 20 20 20 20 20 20  64) == 0)       
11c0: 20 2f 2a 20 6e 65 78 74 20 74 61 62 6c 65 20 2a   /* next table *
11d0: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
11e0: 20 20 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 6e 65    c->sub.code.ne
11f0: 65 64 20 3d 20 65 3b 0a 20 20 20 20 20 20 20 20  ed = e;.        
1200: 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 74 72 65 65  c->sub.code.tree
1210: 20 3d 20 74 20 2b 20 74 2d 3e 62 61 73 65 3b 0a   = t + t->base;.
1220: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1230: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
1240: 28 65 20 26 20 33 32 29 20 20 20 20 20 20 20 20  (e & 32)        
1250: 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 20 6f 66         /* end of
1260: 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20   block */.      
1270: 7b 0a 20 20 20 20 20 20 20 20 54 72 61 63 65 76  {.        Tracev
1280: 76 28 28 73 74 64 65 72 72 2c 20 22 69 6e 66 6c  v((stderr, "infl
1290: 61 74 65 3a 20 20 20 20 20 20 20 20 20 65 6e 64  ate:         end
12a0: 20 6f 66 20 62 6c 6f 63 6b 5c 6e 22 29 29 3b 0a   of block\n"));.
12b0: 20 20 20 20 20 20 20 20 63 2d 3e 6d 6f 64 65 20          c->mode 
12c0: 3d 20 57 41 53 48 3b 0a 20 20 20 20 20 20 20 20  = WASH;.        
12d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12e0: 20 20 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 42       c->mode = B
12f0: 41 44 43 4f 44 45 3b 20 20 20 20 20 20 20 20 2f  ADCODE;        /
1300: 2a 20 69 6e 76 61 6c 69 64 20 63 6f 64 65 20 2a  * invalid code *
1310: 2f 0a 20 20 20 20 20 20 7a 2d 3e 6d 73 67 20 3d  /.      z->msg =
1320: 20 28 63 68 61 72 2a 29 22 69 6e 76 61 6c 69 64   (char*)"invalid
1330: 20 6c 69 74 65 72 61 6c 2f 6c 65 6e 67 74 68 20   literal/length 
1340: 63 6f 64 65 22 3b 0a 20 20 20 20 20 20 72 20 3d  code";.      r =
1350: 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 20   Z_DATA_ERROR;. 
1360: 20 20 20 20 20 4c 45 41 56 45 0a 20 20 20 20 63       LEAVE.    c
1370: 61 73 65 20 4c 45 4e 45 58 54 3a 20 20 20 20 20  ase LENEXT:     
1380: 20 20 20 2f 2a 20 69 3a 20 67 65 74 74 69 6e 67     /* i: getting
1390: 20 6c 65 6e 67 74 68 20 65 78 74 72 61 20 28 68   length extra (h
13a0: 61 76 65 20 62 61 73 65 29 20 2a 2f 0a 20 20 20  ave base) */.   
13b0: 20 20 20 6a 20 3d 20 63 2d 3e 73 75 62 2e 63 6f     j = c->sub.co
13c0: 70 79 2e 67 65 74 3b 0a 20 20 20 20 20 20 4e 45  py.get;.      NE
13d0: 45 44 42 49 54 53 28 6a 29 0a 20 20 20 20 20 20  EDBITS(j).      
13e0: 63 2d 3e 6c 65 6e 20 2b 3d 20 28 75 49 6e 74 29  c->len += (uInt)
13f0: 62 20 26 20 69 6e 66 6c 61 74 65 5f 6d 61 73 6b  b & inflate_mask
1400: 5b 6a 5d 3b 0a 20 20 20 20 20 20 44 55 4d 50 42  [j];.      DUMPB
1410: 49 54 53 28 6a 29 0a 20 20 20 20 20 20 63 2d 3e  ITS(j).      c->
1420: 73 75 62 2e 63 6f 64 65 2e 6e 65 65 64 20 3d 20  sub.code.need = 
1430: 63 2d 3e 64 62 69 74 73 3b 0a 20 20 20 20 20 20  c->dbits;.      
1440: 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 74 72 65 65  c->sub.code.tree
1450: 20 3d 20 63 2d 3e 64 74 72 65 65 3b 0a 20 20 20   = c->dtree;.   
1460: 20 20 20 54 72 61 63 65 76 76 28 28 73 74 64 65     Tracevv((stde
1470: 72 72 2c 20 22 69 6e 66 6c 61 74 65 3a 20 20 20  rr, "inflate:   
1480: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 25 75 5c        length %u\
1490: 6e 22 2c 20 63 2d 3e 6c 65 6e 29 29 3b 0a 20 20  n", c->len));.  
14a0: 20 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 44 49      c->mode = DI
14b0: 53 54 3b 0a 20 20 20 20 63 61 73 65 20 44 49 53  ST;.    case DIS
14c0: 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  T:          /* i
14d0: 3a 20 67 65 74 20 64 69 73 74 61 6e 63 65 20 6e  : get distance n
14e0: 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d  ext */.      j =
14f0: 20 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 6e 65 65   c->sub.code.nee
1500: 64 3b 0a 20 20 20 20 20 20 4e 45 45 44 42 49 54  d;.      NEEDBIT
1510: 53 28 6a 29 0a 20 20 20 20 20 20 74 20 3d 20 63  S(j).      t = c
1520: 2d 3e 73 75 62 2e 63 6f 64 65 2e 74 72 65 65 20  ->sub.code.tree 
1530: 2b 20 28 28 75 49 6e 74 29 62 20 26 20 69 6e 66  + ((uInt)b & inf
1540: 6c 61 74 65 5f 6d 61 73 6b 5b 6a 5d 29 3b 0a 20  late_mask[j]);. 
1550: 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 74 2d       DUMPBITS(t-
1560: 3e 62 69 74 73 29 0a 20 20 20 20 20 20 65 20 3d  >bits).      e =
1570: 20 28 75 49 6e 74 29 28 74 2d 3e 65 78 6f 70 29   (uInt)(t->exop)
1580: 3b 0a 20 20 20 20 20 20 69 66 20 28 65 20 26 20  ;.      if (e & 
1590: 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
15a0: 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20 2a 2f    /* distance */
15b0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
15c0: 20 63 2d 3e 73 75 62 2e 63 6f 70 79 2e 67 65 74   c->sub.copy.get
15d0: 20 3d 20 65 20 26 20 31 35 3b 0a 20 20 20 20 20   = e & 15;.     
15e0: 20 20 20 63 2d 3e 73 75 62 2e 63 6f 70 79 2e 64     c->sub.copy.d
15f0: 69 73 74 20 3d 20 74 2d 3e 62 61 73 65 3b 0a 20  ist = t->base;. 
1600: 20 20 20 20 20 20 20 63 2d 3e 6d 6f 64 65 20 3d         c->mode =
1610: 20 44 49 53 54 45 58 54 3b 0a 20 20 20 20 20 20   DISTEXT;.      
1620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1630: 0a 20 20 20 20 20 20 69 66 20 28 28 65 20 26 20  .      if ((e & 
1640: 36 34 29 20 3d 3d 20 30 29 20 20 20 20 20 20 20  64) == 0)       
1650: 20 2f 2a 20 6e 65 78 74 20 74 61 62 6c 65 20 2a   /* next table *
1660: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
1670: 20 20 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 6e 65    c->sub.code.ne
1680: 65 64 20 3d 20 65 3b 0a 20 20 20 20 20 20 20 20  ed = e;.        
1690: 63 2d 3e 73 75 62 2e 63 6f 64 65 2e 74 72 65 65  c->sub.code.tree
16a0: 20 3d 20 74 20 2b 20 74 2d 3e 62 61 73 65 3b 0a   = t + t->base;.
16b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 2d 3e       }.      c->
16d0: 6d 6f 64 65 20 3d 20 42 41 44 43 4f 44 45 3b 20  mode = BADCODE; 
16e0: 20 20 20 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69         /* invali
16f0: 64 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  d code */.      
1700: 7a 2d 3e 6d 73 67 20 3d 20 28 63 68 61 72 2a 29  z->msg = (char*)
1710: 22 69 6e 76 61 6c 69 64 20 64 69 73 74 61 6e 63  "invalid distanc
1720: 65 20 63 6f 64 65 22 3b 0a 20 20 20 20 20 20 72  e code";.      r
1730: 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b   = Z_DATA_ERROR;
1740: 0a 20 20 20 20 20 20 4c 45 41 56 45 0a 20 20 20  .      LEAVE.   
1750: 20 63 61 73 65 20 44 49 53 54 45 58 54 3a 20 20   case DISTEXT:  
1760: 20 20 20 20 20 2f 2a 20 69 3a 20 67 65 74 74 69       /* i: getti
1770: 6e 67 20 64 69 73 74 61 6e 63 65 20 65 78 74 72  ng distance extr
1780: 61 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 63  a */.      j = c
1790: 2d 3e 73 75 62 2e 63 6f 70 79 2e 67 65 74 3b 0a  ->sub.copy.get;.
17a0: 20 20 20 20 20 20 4e 45 45 44 42 49 54 53 28 6a        NEEDBITS(j
17b0: 29 0a 20 20 20 20 20 20 63 2d 3e 73 75 62 2e 63  ).      c->sub.c
17c0: 6f 70 79 2e 64 69 73 74 20 2b 3d 20 28 75 49 6e  opy.dist += (uIn
17d0: 74 29 62 20 26 20 69 6e 66 6c 61 74 65 5f 6d 61  t)b & inflate_ma
17e0: 73 6b 5b 6a 5d 3b 0a 20 20 20 20 20 20 44 55 4d  sk[j];.      DUM
17f0: 50 42 49 54 53 28 6a 29 0a 20 20 20 20 20 20 54  PBITS(j).      T
1800: 72 61 63 65 76 76 28 28 73 74 64 65 72 72 2c 20  racevv((stderr, 
1810: 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20  "inflate:       
1820: 20 20 64 69 73 74 61 6e 63 65 20 25 75 5c 6e 22    distance %u\n"
1830: 2c 20 63 2d 3e 73 75 62 2e 63 6f 70 79 2e 64 69  , c->sub.copy.di
1840: 73 74 29 29 3b 0a 20 20 20 20 20 20 63 2d 3e 6d  st));.      c->m
1850: 6f 64 65 20 3d 20 43 4f 50 59 3b 0a 20 20 20 20  ode = COPY;.    
1860: 63 61 73 65 20 43 4f 50 59 3a 20 20 20 20 20 20  case COPY:      
1870: 20 20 20 20 2f 2a 20 6f 3a 20 63 6f 70 79 69 6e      /* o: copyin
1880: 67 20 62 79 74 65 73 20 69 6e 20 77 69 6e 64 6f  g bytes in windo
1890: 77 2c 20 77 61 69 74 69 6e 67 20 66 6f 72 20 73  w, waiting for s
18a0: 70 61 63 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  pace */.#ifndef 
18b0: 5f 5f 54 55 52 42 4f 43 5f 5f 20 2f 2a 20 54 75  __TURBOC__ /* Tu
18c0: 72 62 6f 20 43 20 62 75 67 20 66 6f 72 20 66 6f  rbo C bug for fo
18d0: 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
18e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 66 20 3d 20  on */.      f = 
18f0: 28 75 49 6e 74 29 28 71 20 2d 20 73 2d 3e 77 69  (uInt)(q - s->wi
1900: 6e 64 6f 77 29 20 3c 20 63 2d 3e 73 75 62 2e 63  ndow) < c->sub.c
1910: 6f 70 79 2e 64 69 73 74 20 3f 0a 20 20 20 20 20  opy.dist ?.     
1920: 20 20 20 20 20 73 2d 3e 65 6e 64 20 2d 20 28 63       s->end - (c
1930: 2d 3e 73 75 62 2e 63 6f 70 79 2e 64 69 73 74 20  ->sub.copy.dist 
1940: 2d 20 28 71 20 2d 20 73 2d 3e 77 69 6e 64 6f 77  - (q - s->window
1950: 29 29 20 3a 0a 20 20 20 20 20 20 20 20 20 20 71  )) :.          q
1960: 20 2d 20 63 2d 3e 73 75 62 2e 63 6f 70 79 2e 64   - c->sub.copy.d
1970: 69 73 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ist;.#else.     
1980: 20 66 20 3d 20 71 20 2d 20 63 2d 3e 73 75 62 2e   f = q - c->sub.
1990: 63 6f 70 79 2e 64 69 73 74 3b 0a 20 20 20 20 20  copy.dist;.     
19a0: 20 69 66 20 28 28 75 49 6e 74 29 28 71 20 2d 20   if ((uInt)(q - 
19b0: 73 2d 3e 77 69 6e 64 6f 77 29 20 3c 20 63 2d 3e  s->window) < c->
19c0: 73 75 62 2e 63 6f 70 79 2e 64 69 73 74 29 0a 20  sub.copy.dist). 
19d0: 20 20 20 20 20 20 20 66 20 3d 20 73 2d 3e 65 6e         f = s->en
19e0: 64 20 2d 20 28 63 2d 3e 73 75 62 2e 63 6f 70 79  d - (c->sub.copy
19f0: 2e 64 69 73 74 20 2d 20 28 75 49 6e 74 29 28 71  .dist - (uInt)(q
1a00: 20 2d 20 73 2d 3e 77 69 6e 64 6f 77 29 29 3b 0a   - s->window));.
1a10: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 69  #endif.      whi
1a20: 6c 65 20 28 63 2d 3e 6c 65 6e 29 0a 20 20 20 20  le (c->len).    
1a30: 20 20 7b 0a 20 20 20 20 20 20 20 20 4e 45 45 44    {.        NEED
1a40: 4f 55 54 0a 20 20 20 20 20 20 20 20 4f 55 54 42  OUT.        OUTB
1a50: 59 54 45 28 2a 66 2b 2b 29 0a 20 20 20 20 20 20  YTE(*f++).      
1a60: 20 20 69 66 20 28 66 20 3d 3d 20 73 2d 3e 65 6e    if (f == s->en
1a70: 64 29 0a 20 20 20 20 20 20 20 20 20 20 66 20 3d  d).          f =
1a80: 20 73 2d 3e 77 69 6e 64 6f 77 3b 0a 20 20 20 20   s->window;.    
1a90: 20 20 20 20 63 2d 3e 6c 65 6e 2d 2d 3b 0a 20 20      c->len--;.  
1aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 2d 3e 6d      }.      c->m
1ab0: 6f 64 65 20 3d 20 53 54 41 52 54 3b 0a 20 20 20  ode = START;.   
1ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1ad0: 73 65 20 4c 49 54 3a 20 20 20 20 20 20 20 20 20  se LIT:         
1ae0: 20 20 2f 2a 20 6f 3a 20 67 6f 74 20 6c 69 74 65    /* o: got lite
1af0: 72 61 6c 2c 20 77 61 69 74 69 6e 67 20 66 6f 72  ral, waiting for
1b00: 20 6f 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f   output space */
1b10: 0a 20 20 20 20 20 20 4e 45 45 44 4f 55 54 0a 20  .      NEEDOUT. 
1b20: 20 20 20 20 20 4f 55 54 42 59 54 45 28 63 2d 3e       OUTBYTE(c->
1b30: 73 75 62 2e 6c 69 74 29 0a 20 20 20 20 20 20 63  sub.lit).      c
1b40: 2d 3e 6d 6f 64 65 20 3d 20 53 54 41 52 54 3b 0a  ->mode = START;.
1b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b60: 20 63 61 73 65 20 57 41 53 48 3a 20 20 20 20 20   case WASH:     
1b70: 20 20 20 20 20 2f 2a 20 6f 3a 20 67 6f 74 20 65       /* o: got e
1b80: 6f 62 2c 20 70 6f 73 73 69 62 6c 79 20 6d 6f 72  ob, possibly mor
1b90: 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
1ba0: 20 20 69 66 20 28 6b 20 3e 20 37 29 20 20 20 20    if (k > 7)    
1bb0: 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 75 6e      /* return un
1bc0: 75 73 65 64 20 62 79 74 65 2c 20 69 66 20 61 6e  used byte, if an
1bd0: 79 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  y */.      {.   
1be0: 20 20 20 20 20 41 73 73 65 72 74 28 6b 20 3c 20       Assert(k < 
1bf0: 31 36 2c 20 22 69 6e 66 6c 61 74 65 5f 63 6f 64  16, "inflate_cod
1c00: 65 73 20 67 72 61 62 62 65 64 20 74 6f 6f 20 6d  es grabbed too m
1c10: 61 6e 79 20 62 79 74 65 73 22 29 0a 20 20 20 20  any bytes").    
1c20: 20 20 20 20 6b 20 2d 3d 20 38 3b 0a 20 20 20 20      k -= 8;.    
1c30: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20      n++;.       
1c40: 20 70 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20   p--;           
1c50: 20 2f 2a 20 63 61 6e 20 61 6c 77 61 79 73 20 72   /* can always r
1c60: 65 74 75 72 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20  eturn one */.   
1c70: 20 20 20 7d 0a 20 20 20 20 20 20 46 4c 55 53 48     }.      FLUSH
1c80: 0a 20 20 20 20 20 20 69 66 20 28 73 2d 3e 72 65  .      if (s->re
1c90: 61 64 20 21 3d 20 73 2d 3e 77 72 69 74 65 29 0a  ad != s->write).
1ca0: 20 20 20 20 20 20 20 20 4c 45 41 56 45 0a 20 20          LEAVE.  
1cb0: 20 20 20 20 63 2d 3e 6d 6f 64 65 20 3d 20 45 4e      c->mode = EN
1cc0: 44 3b 0a 20 20 20 20 63 61 73 65 20 45 4e 44 3a  D;.    case END:
1cd0: 0a 20 20 20 20 20 20 72 20 3d 20 5a 5f 53 54 52  .      r = Z_STR
1ce0: 45 41 4d 5f 45 4e 44 3b 0a 20 20 20 20 20 20 4c  EAM_END;.      L
1cf0: 45 41 56 45 0a 20 20 20 20 63 61 73 65 20 42 41  EAVE.    case BA
1d00: 44 43 4f 44 45 3a 20 20 20 20 20 20 20 2f 2a 20  DCODE:       /* 
1d10: 78 3a 20 67 6f 74 20 65 72 72 6f 72 20 2a 2f 0a  x: got error */.
1d20: 20 20 20 20 20 20 72 20 3d 20 5a 5f 44 41 54 41        r = Z_DATA
1d30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 4c 45  _ERROR;.      LE
1d40: 41 56 45 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  AVE.    default:
1d50: 0a 20 20 20 20 20 20 72 20 3d 20 5a 5f 53 54 52  .      r = Z_STR
1d60: 45 41 4d 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  EAM_ERROR;.     
1d70: 20 4c 45 41 56 45 0a 20 20 7d 0a 23 69 66 64 65   LEAVE.  }.#ifde
1d80: 66 20 4e 45 45 44 5f 44 55 4d 4d 59 5f 52 45 54  f NEED_DUMMY_RET
1d90: 55 52 4e 0a 20 20 72 65 74 75 72 6e 20 5a 5f 53  URN.  return Z_S
1da0: 54 52 45 41 4d 5f 45 52 52 4f 52 3b 20 20 2f 2a  TREAM_ERROR;  /*
1db0: 20 53 6f 6d 65 20 64 75 6d 62 20 63 6f 6d 70 69   Some dumb compi
1dc0: 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 77 69  lers complain wi
1dd0: 74 68 6f 75 74 20 74 68 69 73 20 2a 2f 0a 23 65  thout this */.#e
1de0: 6e 64 69 66 0a 7d 0a 0a 0a 76 6f 69 64 20 69 6e  ndif.}...void in
1df0: 66 6c 61 74 65 5f 63 6f 64 65 73 5f 66 72 65 65  flate_codes_free
1e00: 28 63 2c 20 7a 29 0a 69 6e 66 6c 61 74 65 5f 63  (c, z).inflate_c
1e10: 6f 64 65 73 5f 73 74 61 74 65 66 20 2a 63 3b 0a  odes_statef *c;.
1e20: 7a 5f 73 74 72 65 61 6d 70 20 7a 3b 0a 7b 0a 20  z_streamp z;.{. 
1e30: 20 5a 46 52 45 45 28 7a 2c 20 63 29 3b 0a 20 20   ZFREE(z, c);.  
1e40: 54 72 61 63 65 76 28 28 73 74 64 65 72 72 2c 20  Tracev((stderr, 
1e50: 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20  "inflate:       
1e60: 63 6f 64 65 73 20 66 72 65 65 5c 6e 22 29 29 3b  codes free\n"));
1e70: 0a 7d 0a                                         .}.