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