Hex Artifact Content

Not logged in

Artifact be35e084d446d347d7b2bfbdfacd5efebd4966b4:


0000: 2f 2a 20 69 6e 66 66 61 73 74 2e 63 20 2d 2d 20  /* inffast.c -- 
0010: 70 72 6f 63 65 73 73 20 6c 69 74 65 72 61 6c 73  process literals
0020: 20 61 6e 64 20 6c 65 6e 67 74 68 2f 64 69 73 74   and length/dist
0030: 61 6e 63 65 20 70 61 69 72 73 20 66 61 73 74 0a  ance pairs fast.
0040: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29   * Copyright (C)
0050: 20 31 39 39 35 2d 31 39 39 38 20 4d 61 72 6b 20   1995-1998 Mark 
0060: 41 64 6c 65 72 0a 20 2a 20 46 6f 72 20 63 6f 6e  Adler. * For con
0070: 64 69 74 69 6f 6e 73 20 6f 66 20 64 69 73 74 72  ditions of distr
0080: 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 2c  ibution and use,
0090: 20 73 65 65 20 63 6f 70 79 72 69 67 68 74 20 6e   see copyright n
00a0: 6f 74 69 63 65 20 69 6e 20 7a 6c 69 62 2e 68 20  otice in zlib.h 
00b0: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  . */..#include "
00c0: 7a 75 74 69 6c 2e 68 22 0a 23 69 6e 63 6c 75 64  zutil.h".#includ
00d0: 65 20 22 69 6e 66 74 72 65 65 73 2e 68 22 0a 23  e "inftrees.h".#
00e0: 69 6e 63 6c 75 64 65 20 22 69 6e 66 62 6c 6f 63  include "infbloc
00f0: 6b 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 69  k.h".#include "i
0100: 6e 66 63 6f 64 65 73 2e 68 22 0a 23 69 6e 63 6c  nfcodes.h".#incl
0110: 75 64 65 20 22 69 6e 66 75 74 69 6c 2e 68 22 0a  ude "infutil.h".
0120: 23 69 6e 63 6c 75 64 65 20 22 69 6e 66 66 61 73  #include "inffas
0130: 74 2e 68 22 0a 0a 73 74 72 75 63 74 20 69 6e 66  t.h"..struct inf
0140: 6c 61 74 65 5f 63 6f 64 65 73 5f 73 74 61 74 65  late_codes_state
0150: 20 7b 69 6e 74 20 64 75 6d 6d 79 3b 7d 3b 20 2f   {int dummy;}; /
0160: 2a 20 66 6f 72 20 62 75 67 67 79 20 63 6f 6d 70  * for buggy comp
0170: 69 6c 65 72 73 20 2a 2f 0a 0a 2f 2a 20 73 69 6d  ilers */../* sim
0180: 70 6c 69 66 79 20 74 68 65 20 75 73 65 20 6f 66  plify the use of
0190: 20 74 68 65 20 69 6e 66 6c 61 74 65 5f 68 75 66   the inflate_huf
01a0: 74 20 74 79 70 65 20 77 69 74 68 20 73 6f 6d 65  t type with some
01b0: 20 64 65 66 69 6e 65 73 20 2a 2f 0a 23 64 65 66   defines */.#def
01c0: 69 6e 65 20 65 78 6f 70 20 77 6f 72 64 2e 77 68  ine exop word.wh
01d0: 61 74 2e 45 78 6f 70 0a 23 64 65 66 69 6e 65 20  at.Exop.#define 
01e0: 62 69 74 73 20 77 6f 72 64 2e 77 68 61 74 2e 42  bits word.what.B
01f0: 69 74 73 0a 0a 2f 2a 20 6d 61 63 72 6f 73 20 66  its../* macros f
0200: 6f 72 20 62 69 74 20 69 6e 70 75 74 20 77 69 74  or bit input wit
0210: 68 20 6e 6f 20 63 68 65 63 6b 69 6e 67 20 61 6e  h no checking an
0220: 64 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  d for returning 
0230: 75 6e 75 73 65 64 20 62 79 74 65 73 20 2a 2f 0a  unused bytes */.
0240: 23 64 65 66 69 6e 65 20 47 52 41 42 42 49 54 53  #define GRABBITS
0250: 28 6a 29 20 7b 77 68 69 6c 65 28 6b 3c 28 6a 29  (j) {while(k<(j)
0260: 29 7b 62 7c 3d 28 28 75 4c 6f 6e 67 29 4e 45 58  ){b|=((uLong)NEX
0270: 54 42 59 54 45 29 3c 3c 6b 3b 6b 2b 3d 38 3b 7d  TBYTE)<<k;k+=8;}
0280: 7d 0a 23 64 65 66 69 6e 65 20 55 4e 47 52 41 42  }.#define UNGRAB
0290: 20 7b 63 3d 7a 2d 3e 61 76 61 69 6c 5f 69 6e 2d   {c=z->avail_in-
02a0: 6e 3b 63 3d 28 6b 3e 3e 33 29 3c 63 3f 6b 3e 3e  n;c=(k>>3)<c?k>>
02b0: 33 3a 63 3b 6e 2b 3d 63 3b 70 2d 3d 63 3b 6b 2d  3:c;n+=c;p-=c;k-
02c0: 3d 63 3c 3c 33 3b 7d 0a 0a 2f 2a 20 43 61 6c 6c  =c<<3;}../* Call
02d0: 65 64 20 77 69 74 68 20 6e 75 6d 62 65 72 20 6f  ed with number o
02e0: 66 20 62 79 74 65 73 20 6c 65 66 74 20 74 6f 20  f bytes left to 
02f0: 77 72 69 74 65 20 69 6e 20 77 69 6e 64 6f 77 20  write in window 
0300: 61 74 20 6c 65 61 73 74 20 32 35 38 0a 20 20 20  at least 258.   
0310: 28 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 74 72  (the maximum str
0320: 69 6e 67 20 6c 65 6e 67 74 68 29 20 61 6e 64 20  ing length) and 
0330: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
0340: 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65 0a  bytes available.
0350: 20 20 20 61 74 20 6c 65 61 73 74 20 74 65 6e 2e     at least ten.
0360: 20 20 54 68 65 20 74 65 6e 20 62 79 74 65 73 20    The ten bytes 
0370: 61 72 65 20 73 69 78 20 62 79 74 65 73 20 66 6f  are six bytes fo
0380: 72 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 6c 65  r the longest le
0390: 6e 67 74 68 2f 0a 20 20 20 64 69 73 74 61 6e 63  ngth/.   distanc
03a0: 65 20 70 61 69 72 20 70 6c 75 73 20 66 6f 75 72  e pair plus four
03b0: 20 62 79 74 65 73 20 66 6f 72 20 6f 76 65 72 6c   bytes for overl
03c0: 6f 61 64 69 6e 67 20 74 68 65 20 62 69 74 20 62  oading the bit b
03d0: 75 66 66 65 72 2e 20 2a 2f 0a 0a 69 6e 74 20 69  uffer. */..int i
03e0: 6e 66 6c 61 74 65 5f 66 61 73 74 28 62 6c 2c 20  nflate_fast(bl, 
03f0: 62 64 2c 20 74 6c 2c 20 74 64 2c 20 73 2c 20 7a  bd, tl, td, s, z
0400: 29 0a 75 49 6e 74 20 62 6c 2c 20 62 64 3b 0a 69  ).uInt bl, bd;.i
0410: 6e 66 6c 61 74 65 5f 68 75 66 74 20 2a 74 6c 3b  nflate_huft *tl;
0420: 0a 69 6e 66 6c 61 74 65 5f 68 75 66 74 20 2a 74  .inflate_huft *t
0430: 64 3b 20 2f 2a 20 6e 65 65 64 20 73 65 70 61 72  d; /* need separ
0440: 61 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ate declaration 
0450: 66 6f 72 20 42 6f 72 6c 61 6e 64 20 43 2b 2b 20  for Borland C++ 
0460: 2a 2f 0a 69 6e 66 6c 61 74 65 5f 62 6c 6f 63 6b  */.inflate_block
0470: 73 5f 73 74 61 74 65 66 20 2a 73 3b 0a 7a 5f 73  s_statef *s;.z_s
0480: 74 72 65 61 6d 70 20 7a 3b 0a 7b 0a 20 20 69 6e  treamp z;.{.  in
0490: 66 6c 61 74 65 5f 68 75 66 74 20 2a 74 3b 20 20  flate_huft *t;  
04a0: 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61 72 79      /* temporary
04b0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 49   pointer */.  uI
04c0: 6e 74 20 65 3b 20 20 20 20 20 20 20 20 20 20 20  nt e;           
04d0: 20 20 20 20 2f 2a 20 65 78 74 72 61 20 62 69 74      /* extra bit
04e0: 73 20 6f 72 20 6f 70 65 72 61 74 69 6f 6e 20 2a  s or operation *
04f0: 2f 0a 20 20 75 4c 6f 6e 67 20 62 3b 20 20 20 20  /.  uLong b;    
0500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 69 74            /* bit
0510: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 49 6e   buffer */.  uIn
0520: 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
0530: 20 20 20 2f 2a 20 62 69 74 73 20 69 6e 20 62 69     /* bits in bi
0540: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 42 79  t buffer */.  By
0550: 74 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20  tef *p;         
0560: 20 20 20 20 2f 2a 20 69 6e 70 75 74 20 64 61 74      /* input dat
0570: 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  a pointer */.  u
0580: 49 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  Int n;          
0590: 20 20 20 20 20 2f 2a 20 62 79 74 65 73 20 61 76       /* bytes av
05a0: 61 69 6c 61 62 6c 65 20 74 68 65 72 65 20 2a 2f  ailable there */
05b0: 0a 20 20 42 79 74 65 66 20 2a 71 3b 20 20 20 20  .  Bytef *q;    
05c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 70           /* outp
05d0: 75 74 20 77 69 6e 64 6f 77 20 77 72 69 74 65 20  ut window write 
05e0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 49 6e  pointer */.  uIn
05f0: 74 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  t m;            
0600: 20 20 20 2f 2a 20 62 79 74 65 73 20 74 6f 20 65     /* bytes to e
0610: 6e 64 20 6f 66 20 77 69 6e 64 6f 77 20 6f 72 20  nd of window or 
0620: 72 65 61 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  read pointer */.
0630: 20 20 75 49 6e 74 20 6d 6c 3b 20 20 20 20 20 20    uInt ml;      
0640: 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 73 6b 20          /* mask 
0650: 66 6f 72 20 6c 69 74 65 72 61 6c 2f 6c 65 6e 67  for literal/leng
0660: 74 68 20 74 72 65 65 20 2a 2f 0a 20 20 75 49 6e  th tree */.  uIn
0670: 74 20 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20  t md;           
0680: 20 20 20 2f 2a 20 6d 61 73 6b 20 66 6f 72 20 64     /* mask for d
0690: 69 73 74 61 6e 63 65 20 74 72 65 65 20 2a 2f 0a  istance tree */.
06a0: 20 20 75 49 6e 74 20 63 3b 20 20 20 20 20 20 20    uInt c;       
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 62 79 74 65 73          /* bytes
06c0: 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 75 49   to copy */.  uI
06d0: 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
06e0: 20 20 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20      /* distance 
06f0: 62 61 63 6b 20 74 6f 20 63 6f 70 79 20 66 72 6f  back to copy fro
0700: 6d 20 2a 2f 0a 20 20 42 79 74 65 66 20 2a 72 3b  m */.  Bytef *r;
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0720: 63 6f 70 79 20 73 6f 75 72 63 65 20 70 6f 69 6e  copy source poin
0730: 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 6c 6f 61  ter */..  /* loa
0740: 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75 74 2c  d input, output,
0750: 20 62 69 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20   bit values */. 
0760: 20 4c 4f 41 44 0a 0a 20 20 2f 2a 20 69 6e 69 74   LOAD..  /* init
0770: 69 61 6c 69 7a 65 20 6d 61 73 6b 73 20 2a 2f 0a  ialize masks */.
0780: 20 20 6d 6c 20 3d 20 69 6e 66 6c 61 74 65 5f 6d    ml = inflate_m
0790: 61 73 6b 5b 62 6c 5d 3b 0a 20 20 6d 64 20 3d 20  ask[bl];.  md = 
07a0: 69 6e 66 6c 61 74 65 5f 6d 61 73 6b 5b 62 64 5d  inflate_mask[bd]
07b0: 3b 0a 0a 20 20 2f 2a 20 64 6f 20 75 6e 74 69 6c  ;..  /* do until
07c0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 69 6e 70 75   not enough inpu
07d0: 74 20 6f 72 20 6f 75 74 70 75 74 20 73 70 61 63  t or output spac
07e0: 65 20 66 6f 72 20 66 61 73 74 20 6c 6f 6f 70 20  e for fast loop 
07f0: 2a 2f 0a 20 20 64 6f 20 7b 20 20 20 20 20 20 20  */.  do {       
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 2f 2a 20 61 73 73 75 6d 65 20 63 61 6c     /* assume cal
0820: 6c 65 64 20 77 69 74 68 20 6d 20 3e 3d 20 32 35  led with m >= 25
0830: 38 20 26 26 20 6e 20 3e 3d 20 31 30 20 2a 2f 0a  8 && n >= 10 */.
0840: 20 20 20 20 2f 2a 20 67 65 74 20 6c 69 74 65 72      /* get liter
0850: 61 6c 2f 6c 65 6e 67 74 68 20 63 6f 64 65 20 2a  al/length code *
0860: 2f 0a 20 20 20 20 47 52 41 42 42 49 54 53 28 32  /.    GRABBITS(2
0870: 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
0880: 20 20 2f 2a 20 6d 61 78 20 62 69 74 73 20 66 6f    /* max bits fo
0890: 72 20 6c 69 74 65 72 61 6c 2f 6c 65 6e 67 74 68  r literal/length
08a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 66 20   code */.    if 
08b0: 28 28 65 20 3d 20 28 74 20 3d 20 74 6c 20 2b 20  ((e = (t = tl + 
08c0: 28 28 75 49 6e 74 29 62 20 26 20 6d 6c 29 29 2d  ((uInt)b & ml))-
08d0: 3e 65 78 6f 70 29 20 3d 3d 20 30 29 0a 20 20 20  >exop) == 0).   
08e0: 20 7b 0a 20 20 20 20 20 20 44 55 4d 50 42 49 54   {.      DUMPBIT
08f0: 53 28 74 2d 3e 62 69 74 73 29 0a 20 20 20 20 20  S(t->bits).     
0900: 20 54 72 61 63 65 76 76 28 28 73 74 64 65 72 72   Tracevv((stderr
0910: 2c 20 74 2d 3e 62 61 73 65 20 3e 3d 20 30 78 32  , t->base >= 0x2
0920: 30 20 26 26 20 74 2d 3e 62 61 73 65 20 3c 20 30  0 && t->base < 0
0930: 78 37 66 20 3f 0a 20 20 20 20 20 20 20 20 20 20  x7f ?.          
0940: 20 20 20 20 20 20 22 69 6e 66 6c 61 74 65 3a 20        "inflate: 
0950: 20 20 20 20 20 20 20 20 2a 20 6c 69 74 65 72 61          * litera
0960: 6c 20 27 25 63 27 5c 6e 22 20 3a 0a 20 20 20 20  l '%c'\n" :.    
0970: 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 66              "inf
0980: 6c 61 74 65 3a 20 20 20 20 20 20 20 20 20 2a 20  late:         * 
0990: 6c 69 74 65 72 61 6c 20 30 78 25 30 32 78 5c 6e  literal 0x%02x\n
09a0: 22 2c 20 74 2d 3e 62 61 73 65 29 29 3b 0a 20 20  ", t->base));.  
09b0: 20 20 20 20 2a 71 2b 2b 20 3d 20 28 42 79 74 65      *q++ = (Byte
09c0: 29 74 2d 3e 62 61 73 65 3b 0a 20 20 20 20 20 20  )t->base;.      
09d0: 6d 2d 2d 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  m--;.      conti
09e0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  nue;.    }.    d
09f0: 6f 20 7b 0a 20 20 20 20 20 20 44 55 4d 50 42 49  o {.      DUMPBI
0a00: 54 53 28 74 2d 3e 62 69 74 73 29 0a 20 20 20 20  TS(t->bits).    
0a10: 20 20 69 66 20 28 65 20 26 20 31 36 29 0a 20 20    if (e & 16).  
0a20: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
0a30: 20 67 65 74 20 65 78 74 72 61 20 62 69 74 73 20   get extra bits 
0a40: 66 6f 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20  for length */.  
0a50: 20 20 20 20 20 20 65 20 26 3d 20 31 35 3b 0a 20        e &= 15;. 
0a60: 20 20 20 20 20 20 20 63 20 3d 20 74 2d 3e 62 61         c = t->ba
0a70: 73 65 20 2b 20 28 28 75 49 6e 74 29 62 20 26 20  se + ((uInt)b & 
0a80: 69 6e 66 6c 61 74 65 5f 6d 61 73 6b 5b 65 5d 29  inflate_mask[e])
0a90: 3b 0a 20 20 20 20 20 20 20 20 44 55 4d 50 42 49  ;.        DUMPBI
0aa0: 54 53 28 65 29 0a 20 20 20 20 20 20 20 20 54 72  TS(e).        Tr
0ab0: 61 63 65 76 76 28 28 73 74 64 65 72 72 2c 20 22  acevv((stderr, "
0ac0: 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20 20  inflate:        
0ad0: 20 2a 20 6c 65 6e 67 74 68 20 25 75 5c 6e 22 2c   * length %u\n",
0ae0: 20 63 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f   c));..        /
0af0: 2a 20 64 65 63 6f 64 65 20 64 69 73 74 61 6e 63  * decode distanc
0b00: 65 20 62 61 73 65 20 6f 66 20 62 6c 6f 63 6b 20  e base of block 
0b10: 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  to copy */.     
0b20: 20 20 20 47 52 41 42 42 49 54 53 28 31 35 29 3b     GRABBITS(15);
0b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 61             /* ma
0b40: 78 20 62 69 74 73 20 66 6f 72 20 64 69 73 74 61  x bits for dista
0b50: 6e 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  nce code */.    
0b60: 20 20 20 20 65 20 3d 20 28 74 20 3d 20 74 64 20      e = (t = td 
0b70: 2b 20 28 28 75 49 6e 74 29 62 20 26 20 6d 64 29  + ((uInt)b & md)
0b80: 29 2d 3e 65 78 6f 70 3b 0a 20 20 20 20 20 20 20  )->exop;.       
0b90: 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20   do {.          
0ba0: 44 55 4d 50 42 49 54 53 28 74 2d 3e 62 69 74 73  DUMPBITS(t->bits
0bb0: 29 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ).          if (
0bc0: 65 20 26 20 31 36 29 0a 20 20 20 20 20 20 20 20  e & 16).        
0bd0: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20    {.            
0be0: 2f 2a 20 67 65 74 20 65 78 74 72 61 20 62 69 74  /* get extra bit
0bf0: 73 20 74 6f 20 61 64 64 20 74 6f 20 64 69 73 74  s to add to dist
0c00: 61 6e 63 65 20 62 61 73 65 20 2a 2f 0a 20 20 20  ance base */.   
0c10: 20 20 20 20 20 20 20 20 20 65 20 26 3d 20 31 35           e &= 15
0c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 52  ;.            GR
0c30: 41 42 42 49 54 53 28 65 29 20 20 20 20 20 20 20  ABBITS(e)       
0c40: 20 20 2f 2a 20 67 65 74 20 65 78 74 72 61 20 62    /* get extra b
0c50: 69 74 73 20 28 75 70 20 74 6f 20 31 33 29 20 2a  its (up to 13) *
0c60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 20  /.            d 
0c70: 3d 20 74 2d 3e 62 61 73 65 20 2b 20 28 28 75 49  = t->base + ((uI
0c80: 6e 74 29 62 20 26 20 69 6e 66 6c 61 74 65 5f 6d  nt)b & inflate_m
0c90: 61 73 6b 5b 65 5d 29 3b 0a 20 20 20 20 20 20 20  ask[e]);.       
0ca0: 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 65 29       DUMPBITS(e)
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61  .            Tra
0cc0: 63 65 76 76 28 28 73 74 64 65 72 72 2c 20 22 69  cevv((stderr, "i
0cd0: 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20 20 20  nflate:         
0ce0: 2a 20 64 69 73 74 61 6e 63 65 20 25 75 5c 6e 22  * distance %u\n"
0cf0: 2c 20 64 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  , d));..        
0d00: 20 20 20 20 2f 2a 20 64 6f 20 74 68 65 20 63 6f      /* do the co
0d10: 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  py */.          
0d20: 20 20 6d 20 2d 3d 20 63 3b 0a 20 20 20 20 20 20    m -= c;.      
0d30: 20 20 20 20 20 20 69 66 20 28 28 75 49 6e 74 29        if ((uInt)
0d40: 28 71 20 2d 20 73 2d 3e 77 69 6e 64 6f 77 29 20  (q - s->window) 
0d50: 3e 3d 20 64 29 20 20 20 20 20 2f 2a 20 6f 66 66  >= d)     /* off
0d60: 73 65 74 20 62 65 66 6f 72 65 20 64 65 73 74 20  set before dest 
0d70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  */.            {
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 2f 2a 20 20 6a 75 73 74 20 63 6f 70 79     /*  just copy
0db0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
0dc0: 20 20 72 20 3d 20 71 20 2d 20 64 3b 0a 20 20 20    r = q - d;.   
0dd0: 20 20 20 20 20 20 20 20 20 20 20 2a 71 2b 2b 20             *q++ 
0de0: 3d 20 2a 72 2b 2b 3b 20 20 63 2d 2d 3b 20 20 20  = *r++;  c--;   
0df0: 20 20 20 20 20 2f 2a 20 6d 69 6e 69 6d 75 6d 20       /* minimum 
0e00: 63 6f 75 6e 74 20 69 73 20 74 68 72 65 65 2c 20  count is three, 
0e10: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
0e20: 20 2a 71 2b 2b 20 3d 20 2a 72 2b 2b 3b 20 20 63   *q++ = *r++;  c
0e30: 2d 2d 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 73  --;        /*  s
0e40: 6f 20 75 6e 72 6f 6c 6c 20 6c 6f 6f 70 20 61 20  o unroll loop a 
0e50: 6c 69 74 74 6c 65 20 2a 2f 0a 20 20 20 20 20 20  little */.      
0e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0e70: 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 2f 2a 20 65 6c 73 65 20 6f 66 66 73 65 74 20 61  /* else offset a
0ea0: 66 74 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e  fter destination
0eb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
0ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0ed0: 65 20 3d 20 64 20 2d 20 28 75 49 6e 74 29 28 71  e = d - (uInt)(q
0ee0: 20 2d 20 73 2d 3e 77 69 6e 64 6f 77 29 3b 20 2f   - s->window); /
0ef0: 2a 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 66  * bytes from off
0f00: 73 65 74 20 74 6f 20 65 6e 64 20 2a 2f 0a 20 20  set to end */.  
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
0f20: 73 2d 3e 65 6e 64 20 2d 20 65 3b 20 20 20 20 20  s->end - e;     
0f30: 20 20 20 20 20 20 2f 2a 20 70 6f 69 6e 74 65 72        /* pointer
0f40: 20 74 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20   to offset */.  
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0f60: 63 20 3e 20 65 29 20 20 20 20 20 20 20 20 20 20  c > e)          
0f70: 20 20 20 20 20 20 2f 2a 20 69 66 20 73 6f 75 72        /* if sour
0f80: 63 65 20 63 72 6f 73 73 65 73 2c 20 2a 2f 0a 20  ce crosses, */. 
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20               {. 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
0fb0: 20 2d 3d 20 65 3b 20 20 20 20 20 20 20 20 20 20   -= e;          
0fc0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 70 79 20 74         /* copy t
0fd0: 6f 20 65 6e 64 20 6f 66 20 77 69 6e 64 6f 77 20  o end of window 
0fe0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
0ff0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1000: 20 20 20 20 20 20 20 20 20 20 2a 71 2b 2b 20 3d            *q++ =
1010: 20 2a 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   *r++;.         
1020: 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28         } while (
1030: 2d 2d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  --e);.          
1040: 20 20 20 20 20 20 72 20 3d 20 73 2d 3e 77 69 6e        r = s->win
1050: 64 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dow;          /*
1060: 20 63 6f 70 79 20 72 65 73 74 20 66 72 6f 6d 20   copy rest from 
1070: 73 74 61 72 74 20 6f 66 20 77 69 6e 64 6f 77 20  start of window 
1080: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1090: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
10a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 20  .            do 
10b0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
10c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 70 79           /* copy
10d0: 20 61 6c 6c 20 6f 72 20 77 68 61 74 27 73 20 6c   all or what's l
10e0: 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eft */.         
10f0: 20 20 20 20 20 2a 71 2b 2b 20 3d 20 2a 72 2b 2b       *q++ = *r++
1100: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
1110: 77 68 69 6c 65 20 28 2d 2d 63 29 3b 0a 20 20 20  while (--c);.   
1120: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1130: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1140: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 28        else if ((
1150: 65 20 26 20 36 34 29 20 3d 3d 20 30 29 0a 20 20  e & 64) == 0).  
1160: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
1170: 20 20 20 20 20 20 74 20 2b 3d 20 74 2d 3e 62 61        t += t->ba
1180: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
1190: 65 20 3d 20 28 74 20 2b 3d 20 28 28 75 49 6e 74  e = (t += ((uInt
11a0: 29 62 20 26 20 69 6e 66 6c 61 74 65 5f 6d 61 73  )b & inflate_mas
11b0: 6b 5b 65 5d 29 29 2d 3e 65 78 6f 70 3b 0a 20 20  k[e]))->exop;.  
11c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20      else.       
11e0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20     {.           
11f0: 20 7a 2d 3e 6d 73 67 20 3d 20 28 63 68 61 72 2a   z->msg = (char*
1200: 29 22 69 6e 76 61 6c 69 64 20 64 69 73 74 61 6e  )"invalid distan
1210: 63 65 20 63 6f 64 65 22 3b 0a 20 20 20 20 20 20  ce code";.      
1220: 20 20 20 20 20 20 55 4e 47 52 41 42 0a 20 20 20        UNGRAB.   
1230: 20 20 20 20 20 20 20 20 20 55 50 44 41 54 45 0a           UPDATE.
1240: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1250: 72 6e 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b  rn Z_DATA_ERROR;
1260: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1270: 20 20 20 20 20 7d 20 77 68 69 6c 65 20 28 31 29       } while (1)
1280: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12a0: 66 20 28 28 65 20 26 20 36 34 29 20 3d 3d 20 30  f ((e & 64) == 0
12b0: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
12c0: 20 20 74 20 2b 3d 20 74 2d 3e 62 61 73 65 3b 0a    t += t->base;.
12d0: 20 20 20 20 20 20 20 20 69 66 20 28 28 65 20 3d          if ((e =
12e0: 20 28 74 20 2b 3d 20 28 28 75 49 6e 74 29 62 20   (t += ((uInt)b 
12f0: 26 20 69 6e 66 6c 61 74 65 5f 6d 61 73 6b 5b 65  & inflate_mask[e
1300: 5d 29 29 2d 3e 65 78 6f 70 29 20 3d 3d 20 30 29  ]))->exop) == 0)
1310: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
1320: 20 20 20 20 20 44 55 4d 50 42 49 54 53 28 74 2d       DUMPBITS(t-
1330: 3e 62 69 74 73 29 0a 20 20 20 20 20 20 20 20 20  >bits).         
1340: 20 54 72 61 63 65 76 76 28 28 73 74 64 65 72 72   Tracevv((stderr
1350: 2c 20 74 2d 3e 62 61 73 65 20 3e 3d 20 30 78 32  , t->base >= 0x2
1360: 30 20 26 26 20 74 2d 3e 62 61 73 65 20 3c 20 30  0 && t->base < 0
1370: 78 37 66 20 3f 0a 20 20 20 20 20 20 20 20 20 20  x7f ?.          
1380: 20 20 20 20 20 20 20 20 20 20 22 69 6e 66 6c 61            "infla
1390: 74 65 3a 20 20 20 20 20 20 20 20 20 2a 20 6c 69  te:         * li
13a0: 74 65 72 61 6c 20 27 25 63 27 5c 6e 22 20 3a 0a  teral '%c'\n" :.
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 22 69 6e 66 6c 61 74 65 3a 20 20 20      "inflate:   
13d0: 20 20 20 20 20 20 2a 20 6c 69 74 65 72 61 6c 20        * literal 
13e0: 30 78 25 30 32 78 5c 6e 22 2c 20 74 2d 3e 62 61  0x%02x\n", t->ba
13f0: 73 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se));.          
1400: 2a 71 2b 2b 20 3d 20 28 42 79 74 65 29 74 2d 3e  *q++ = (Byte)t->
1410: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  base;.          
1420: 6d 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  m--;.          b
1430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
1450: 73 65 20 69 66 20 28 65 20 26 20 33 32 29 0a 20  se if (e & 32). 
1460: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 54       {.        T
1470: 72 61 63 65 76 76 28 28 73 74 64 65 72 72 2c 20  racevv((stderr, 
1480: 22 69 6e 66 6c 61 74 65 3a 20 20 20 20 20 20 20  "inflate:       
1490: 20 20 2a 20 65 6e 64 20 6f 66 20 62 6c 6f 63 6b    * end of block
14a0: 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55  \n"));.        U
14b0: 4e 47 52 41 42 0a 20 20 20 20 20 20 20 20 55 50  NGRAB.        UP
14c0: 44 41 54 45 0a 20 20 20 20 20 20 20 20 72 65 74  DATE.        ret
14d0: 75 72 6e 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44  urn Z_STREAM_END
14e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14f0: 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20  else.      {.   
1500: 20 20 20 20 20 7a 2d 3e 6d 73 67 20 3d 20 28 63       z->msg = (c
1510: 68 61 72 2a 29 22 69 6e 76 61 6c 69 64 20 6c 69  har*)"invalid li
1520: 74 65 72 61 6c 2f 6c 65 6e 67 74 68 20 63 6f 64  teral/length cod
1530: 65 22 3b 0a 20 20 20 20 20 20 20 20 55 4e 47 52  e";.        UNGR
1540: 41 42 0a 20 20 20 20 20 20 20 20 55 50 44 41 54  AB.        UPDAT
1550: 45 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  E.        return
1560: 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 20   Z_DATA_ERROR;. 
1570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
1580: 6c 65 20 28 31 29 3b 0a 20 20 7d 20 77 68 69 6c  le (1);.  } whil
1590: 65 20 28 6d 20 3e 3d 20 32 35 38 20 26 26 20 6e  e (m >= 258 && n
15a0: 20 3e 3d 20 31 30 29 3b 0a 0a 20 20 2f 2a 20 6e   >= 10);..  /* n
15b0: 6f 74 20 65 6e 6f 75 67 68 20 69 6e 70 75 74 20  ot enough input 
15c0: 6f 72 20 6f 75 74 70 75 74 2d 2d 72 65 73 74 6f  or output--resto
15d0: 72 65 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  re pointers and 
15e0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 55 4e 47 52  return */.  UNGR
15f0: 41 42 0a 20 20 55 50 44 41 54 45 0a 20 20 72 65  AB.  UPDATE.  re
1600: 74 75 72 6e 20 5a 5f 4f 4b 3b 0a 7d 0a           turn Z_OK;.}.