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