1ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* infcodes.c -- process literals and length/distance pairs 2ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Copyright (C) 1995-2002 Mark Adler 3ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For conditions of distribution and use, see copyright notice in zlib.h 4ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 5ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 6ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.h" 7ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "inftrees.h" 8ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infblock.h" 9ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infcodes.h" 10ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "infutil.h" 11ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 12ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* simplify the use of the inflate_huft type with some defines */ 13ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define exop word.what.Exop 14ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define bits word.what.Bits 15ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 16ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasetypedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ 17ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease START, /* x: set up for LEN */ 18ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEN, /* i: get length/literal/eob next */ 19ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LENEXT, /* i: getting length extra (have base) */ 20ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DIST, /* i: get distance next */ 21ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DISTEXT, /* i: getting distance extra */ 22ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease COPY, /* o: copying bytes in window, waiting for space */ 23ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LIT, /* o: got literal, waiting for output space */ 24ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease WASH, /* o: got eob, possibly still output waiting */ 25ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease END, /* x: got eob and all data flushed */ 26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease BADCODE} /* x: got error */ 27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_codes_mode; 28ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* inflate codes private state */ 30ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasestruct inflate_codes_state { 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode */ 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_codes_mode mode; /* current inflate_codes mode */ 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode dependent information */ 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt len; 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease union { 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease struct { 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *tree; /* pointer into tree */ 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt need; /* bits needed */ 41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } code; /* if LEN or DIST, where in tree */ 42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt lit; /* if LIT, literal */ 43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease struct { 44ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt get; /* bits to get for extra */ 45ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt dist; /* distance back to copy from */ 46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } copy; /* if EXT or COPY, where and how much */ 47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } sub; /* submode */ 48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* mode independent information */ 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Byte lbits; /* ltree bits decoded per branch */ 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Byte dbits; /* dtree bits decoder per branch */ 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *ltree; /* literal/length/eob tree */ 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *dtree; /* distance tree */ 54ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 55ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease}; 56ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 57ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 58ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */ 59ec0bab5697bb31ba980810145f62e3799946ec60Victoria LeaseuInt bl, uInt bd, 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft *tl, 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_huft *td, /* need separate declaration for Borland C++ */ 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z ) 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 64ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_codes_statef *c; 65ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 66ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((c = (inflate_codes_statef *) 67ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) 68ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 69ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = START; 70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->lbits = (Byte)bl; 71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->dbits = (Byte)bd; 72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->ltree = tl; 73ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->dtree = td; 74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: codes new\n")); 75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 76ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return c; 77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int inflate_codes( /* s, z, r) */ 81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_blocks_statef *s, 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z, 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseint r ) 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt j; /* temporary storage */ 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_huft *t; /* temporary pointer */ 87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt e; /* extra bits or operation */ 88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uLong b; /* bit buffer */ 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt k; /* bits in bit buffer */ 90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Bytef *p; /* input data pointer */ 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt n; /* bytes available there */ 92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Bytef *q; /* output window write pointer */ 93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt m; /* bytes to end of window or read pointer */ 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Bytef *f; /* pointer to copy strings from */ 95ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ 96ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 97ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* copy input/output information to locals (UPDATE macro restores) */ 98ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LOAD 99ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* process input and output based on current state */ 101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (1) switch (c->mode) 102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ 103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case START: /* x: set up for LEN */ 104ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef SLOW 105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (m >= 258 && n >= 10) 106ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease UPDATE 108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); 109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LOAD 110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (r != Z_OK) 111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = r == Z_STREAM_END ? WASH : BADCODE; 113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* !SLOW */ 117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.need = c->lbits; 118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.tree = c->ltree; 119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = LEN; 120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case LEN: /* i: get length/literal/eob next */ 121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease j = c->sub.code.need; 122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBITS(j) 123ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); 124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DUMPBITS(t->bits) 125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease e = (uInt)(t->exop); 126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (e == 0) /* literal */ 127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.lit = t->base; 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease "inflate: literal '%c'\n" : 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease "inflate: literal 0x%02x\n", t->base)); 132ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = LIT; 133ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 134ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (e & 16) /* length */ 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.copy.get = e & 15; 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->len = t->base; 139ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = LENEXT; 140ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 141ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 142ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((e & 64) == 0) /* next table */ 143ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.need = e; 145ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.tree = t + t->base; 146ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 147ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (e & 32) /* end of block */ 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracevv((stderr, "inflate: end of block\n")); 151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = WASH; 152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = BADCODE; /* invalid code */ 155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"invalid literal/length code"; 156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case LENEXT: /* i: getting length extra (have base) */ 159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease j = c->sub.copy.get; 160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBITS(j) 161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->len += (uInt)b & inflate_mask[j]; 162ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DUMPBITS(j) 163ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.need = c->dbits; 164ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.tree = c->dtree; 165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracevv((stderr, "inflate: length %u\n", c->len)); 166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = DIST; 167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DIST: /* i: get distance next */ 168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease j = c->sub.code.need; 169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBITS(j) 170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); 171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DUMPBITS(t->bits) 172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease e = (uInt)(t->exop); 173ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (e & 16) /* distance */ 174ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.copy.get = e & 15; 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.copy.dist = t->base; 177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = DISTEXT; 178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if ((e & 64) == 0) /* next table */ 181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 182ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.need = e; 183ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.code.tree = t + t->base; 184ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 185ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = BADCODE; /* invalid code */ 187ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease z->msg = (char*)"invalid distance code"; 188ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 189ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 190ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case DISTEXT: /* i: getting distance extra */ 191ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease j = c->sub.copy.get; 192ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDBITS(j) 193ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->sub.copy.dist += (uInt)b & inflate_mask[j]; 194ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease DUMPBITS(j) 195ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); 196ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = COPY; 197ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case COPY: /* o: copying bytes in window, waiting for space */ 198ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f = q - c->sub.copy.dist; 199ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (f < s->window) /* modulo window size-"while" instead */ 200ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f += s->end - s->window; /* of "if" handles invalid distances */ 201ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (c->len) 202ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 203ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDOUT 204ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease OUTBYTE(*f++) 205ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (f == s->end) 206ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease f = s->window; 207ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->len--; 208ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 209ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = START; 210ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 211ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case LIT: /* o: got literal, waiting for output space */ 212ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease NEEDOUT 213ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease OUTBYTE(c->sub.lit) 214ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = START; 215ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease break; 216ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case WASH: /* o: got eob, possibly more output */ 217ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (k > 7) /* return unused byte, if any */ 218ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease { 219ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Assert(k < 16, "inflate_codes grabbed too many bytes") 220ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease k -= 8; 221ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease n++; 222ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease p--; /* can always return one */ 223ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 224ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease FLUSH 225ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (s->read != s->write) 226ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 227ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease c->mode = END; 228ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case END: 229ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_STREAM_END; 230ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 231ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease case BADCODE: /* x: got error */ 232ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_DATA_ERROR; 233ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 234ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease default: 235ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease r = Z_STREAM_ERROR; 236ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease LEAVE 237ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 238ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifdef NEED_DUMMY_RETURN 239ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ 240ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 241ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 242ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 243ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 244ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal void inflate_codes_free( /* c, z) */ 245ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseinflate_codes_statef *c, 246ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasez_streamp z ) 247ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 248ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ZFREE(z, c); 249ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Tracev((stderr, "inflate: codes free\n")); 250ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 251