1.1 --- a/core/zlib/infback.c Fri Mar 28 06:21:34 2008 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,623 +0,0 @@
1.4 -/* infback.c -- inflate using a call-back interface
1.5 - * Copyright (C) 1995-2005 Mark Adler
1.6 - * For conditions of distribution and use, see copyright notice in zlib.h
1.7 - */
1.8 -
1.9 -/*
1.10 - This code is largely copied from inflate.c. Normally either infback.o or
1.11 - inflate.o would be linked into an application--not both. The interface
1.12 - with inffast.c is retained so that optimized assembler-coded versions of
1.13 - inflate_fast() can be used with either inflate.c or infback.c.
1.14 - */
1.15 -
1.16 -#include "zutil.h"
1.17 -#include "inftrees.h"
1.18 -#include "inflate.h"
1.19 -#include "inffast.h"
1.20 -
1.21 -/* function prototypes */
1.22 -local void fixedtables OF((struct inflate_state FAR *state));
1.23 -
1.24 -/*
1.25 - strm provides memory allocation functions in zalloc and zfree, or
1.26 - Z_NULL to use the library memory allocation functions.
1.27 -
1.28 - windowBits is in the range 8..15, and window is a user-supplied
1.29 - window and output buffer that is 2**windowBits bytes.
1.30 - */
1.31 -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
1.32 -z_streamp strm;
1.33 -int windowBits;
1.34 -unsigned char FAR *window;
1.35 -const char *version;
1.36 -int stream_size;
1.37 -{
1.38 - struct inflate_state FAR *state;
1.39 -
1.40 - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
1.41 - stream_size != (int)(sizeof(z_stream)))
1.42 - return Z_VERSION_ERROR;
1.43 - if (strm == Z_NULL || window == Z_NULL ||
1.44 - windowBits < 8 || windowBits > 15)
1.45 - return Z_STREAM_ERROR;
1.46 - strm->msg = Z_NULL; /* in case we return an error */
1.47 - if (strm->zalloc == (alloc_func)0) {
1.48 - strm->zalloc = zcalloc;
1.49 - strm->opaque = (voidpf)0;
1.50 - }
1.51 - if (strm->zfree == (free_func)0) strm->zfree = zcfree;
1.52 - state = (struct inflate_state FAR *)ZALLOC(strm, 1,
1.53 - sizeof(struct inflate_state));
1.54 - if (state == Z_NULL) return Z_MEM_ERROR;
1.55 - Tracev((stderr, "inflate: allocated\n"));
1.56 - strm->state = (struct internal_state FAR *)state;
1.57 - state->dmax = 32768U;
1.58 - state->wbits = windowBits;
1.59 - state->wsize = 1U << windowBits;
1.60 - state->window = window;
1.61 - state->write = 0;
1.62 - state->whave = 0;
1.63 - return Z_OK;
1.64 -}
1.65 -
1.66 -/*
1.67 - Return state with length and distance decoding tables and index sizes set to
1.68 - fixed code decoding. Normally this returns fixed tables from inffixed.h.
1.69 - If BUILDFIXED is defined, then instead this routine builds the tables the
1.70 - first time it's called, and returns those tables the first time and
1.71 - thereafter. This reduces the size of the code by about 2K bytes, in
1.72 - exchange for a little execution time. However, BUILDFIXED should not be
1.73 - used for threaded applications, since the rewriting of the tables and virgin
1.74 - may not be thread-safe.
1.75 - */
1.76 -local void fixedtables(state)
1.77 -struct inflate_state FAR *state;
1.78 -{
1.79 -#ifdef BUILDFIXED
1.80 - static int virgin = 1;
1.81 - static code *lenfix, *distfix;
1.82 - static code fixed[544];
1.83 -
1.84 - /* build fixed huffman tables if first call (may not be thread safe) */
1.85 - if (virgin) {
1.86 - unsigned sym, bits;
1.87 - static code *next;
1.88 -
1.89 - /* literal/length table */
1.90 - sym = 0;
1.91 - while (sym < 144) state->lens[sym++] = 8;
1.92 - while (sym < 256) state->lens[sym++] = 9;
1.93 - while (sym < 280) state->lens[sym++] = 7;
1.94 - while (sym < 288) state->lens[sym++] = 8;
1.95 - next = fixed;
1.96 - lenfix = next;
1.97 - bits = 9;
1.98 - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
1.99 -
1.100 - /* distance table */
1.101 - sym = 0;
1.102 - while (sym < 32) state->lens[sym++] = 5;
1.103 - distfix = next;
1.104 - bits = 5;
1.105 - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
1.106 -
1.107 - /* do this just once */
1.108 - virgin = 0;
1.109 - }
1.110 -#else /* !BUILDFIXED */
1.111 -# include "inffixed.h"
1.112 -#endif /* BUILDFIXED */
1.113 - state->lencode = lenfix;
1.114 - state->lenbits = 9;
1.115 - state->distcode = distfix;
1.116 - state->distbits = 5;
1.117 -}
1.118 -
1.119 -/* Macros for inflateBack(): */
1.120 -
1.121 -/* Load returned state from inflate_fast() */
1.122 -#define LOAD() \
1.123 - do { \
1.124 - put = strm->next_out; \
1.125 - left = strm->avail_out; \
1.126 - next = strm->next_in; \
1.127 - have = strm->avail_in; \
1.128 - hold = state->hold; \
1.129 - bits = state->bits; \
1.130 - } while (0)
1.131 -
1.132 -/* Set state from registers for inflate_fast() */
1.133 -#define RESTORE() \
1.134 - do { \
1.135 - strm->next_out = put; \
1.136 - strm->avail_out = left; \
1.137 - strm->next_in = next; \
1.138 - strm->avail_in = have; \
1.139 - state->hold = hold; \
1.140 - state->bits = bits; \
1.141 - } while (0)
1.142 -
1.143 -/* Clear the input bit accumulator */
1.144 -#define INITBITS() \
1.145 - do { \
1.146 - hold = 0; \
1.147 - bits = 0; \
1.148 - } while (0)
1.149 -
1.150 -/* Assure that some input is available. If input is requested, but denied,
1.151 - then return a Z_BUF_ERROR from inflateBack(). */
1.152 -#define PULL() \
1.153 - do { \
1.154 - if (have == 0) { \
1.155 - have = in(in_desc, &next); \
1.156 - if (have == 0) { \
1.157 - next = Z_NULL; \
1.158 - ret = Z_BUF_ERROR; \
1.159 - goto inf_leave; \
1.160 - } \
1.161 - } \
1.162 - } while (0)
1.163 -
1.164 -/* Get a byte of input into the bit accumulator, or return from inflateBack()
1.165 - with an error if there is no input available. */
1.166 -#define PULLBYTE() \
1.167 - do { \
1.168 - PULL(); \
1.169 - have--; \
1.170 - hold += (unsigned long)(*next++) << bits; \
1.171 - bits += 8; \
1.172 - } while (0)
1.173 -
1.174 -/* Assure that there are at least n bits in the bit accumulator. If there is
1.175 - not enough available input to do that, then return from inflateBack() with
1.176 - an error. */
1.177 -#define NEEDBITS(n) \
1.178 - do { \
1.179 - while (bits < (unsigned)(n)) \
1.180 - PULLBYTE(); \
1.181 - } while (0)
1.182 -
1.183 -/* Return the low n bits of the bit accumulator (n < 16) */
1.184 -#define BITS(n) \
1.185 - ((unsigned)hold & ((1U << (n)) - 1))
1.186 -
1.187 -/* Remove n bits from the bit accumulator */
1.188 -#define DROPBITS(n) \
1.189 - do { \
1.190 - hold >>= (n); \
1.191 - bits -= (unsigned)(n); \
1.192 - } while (0)
1.193 -
1.194 -/* Remove zero to seven bits as needed to go to a byte boundary */
1.195 -#define BYTEBITS() \
1.196 - do { \
1.197 - hold >>= bits & 7; \
1.198 - bits -= bits & 7; \
1.199 - } while (0)
1.200 -
1.201 -/* Assure that some output space is available, by writing out the window
1.202 - if it's full. If the write fails, return from inflateBack() with a
1.203 - Z_BUF_ERROR. */
1.204 -#define ROOM() \
1.205 - do { \
1.206 - if (left == 0) { \
1.207 - put = state->window; \
1.208 - left = state->wsize; \
1.209 - state->whave = left; \
1.210 - if (out(out_desc, put, left)) { \
1.211 - ret = Z_BUF_ERROR; \
1.212 - goto inf_leave; \
1.213 - } \
1.214 - } \
1.215 - } while (0)
1.216 -
1.217 -/*
1.218 - strm provides the memory allocation functions and window buffer on input,
1.219 - and provides information on the unused input on return. For Z_DATA_ERROR
1.220 - returns, strm will also provide an error message.
1.221 -
1.222 - in() and out() are the call-back input and output functions. When
1.223 - inflateBack() needs more input, it calls in(). When inflateBack() has
1.224 - filled the window with output, or when it completes with data in the
1.225 - window, it calls out() to write out the data. The application must not
1.226 - change the provided input until in() is called again or inflateBack()
1.227 - returns. The application must not change the window/output buffer until
1.228 - inflateBack() returns.
1.229 -
1.230 - in() and out() are called with a descriptor parameter provided in the
1.231 - inflateBack() call. This parameter can be a structure that provides the
1.232 - information required to do the read or write, as well as accumulated
1.233 - information on the input and output such as totals and check values.
1.234 -
1.235 - in() should return zero on failure. out() should return non-zero on
1.236 - failure. If either in() or out() fails, than inflateBack() returns a
1.237 - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
1.238 - was in() or out() that caused in the error. Otherwise, inflateBack()
1.239 - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
1.240 - error, or Z_MEM_ERROR if it could not allocate memory for the state.
1.241 - inflateBack() can also return Z_STREAM_ERROR if the input parameters
1.242 - are not correct, i.e. strm is Z_NULL or the state was not initialized.
1.243 - */
1.244 -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
1.245 -z_streamp strm;
1.246 -in_func in;
1.247 -void FAR *in_desc;
1.248 -out_func out;
1.249 -void FAR *out_desc;
1.250 -{
1.251 - struct inflate_state FAR *state;
1.252 - unsigned char FAR *next; /* next input */
1.253 - unsigned char FAR *put; /* next output */
1.254 - unsigned have, left; /* available input and output */
1.255 - unsigned long hold; /* bit buffer */
1.256 - unsigned bits; /* bits in bit buffer */
1.257 - unsigned copy; /* number of stored or match bytes to copy */
1.258 - unsigned char FAR *from; /* where to copy match bytes from */
1.259 - code this; /* current decoding table entry */
1.260 - code last; /* parent table entry */
1.261 - unsigned len; /* length to copy for repeats, bits to drop */
1.262 - int ret; /* return code */
1.263 - static const unsigned short order[19] = /* permutation of code lengths */
1.264 - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
1.265 -
1.266 - /* Check that the strm exists and that the state was initialized */
1.267 - if (strm == Z_NULL || strm->state == Z_NULL)
1.268 - return Z_STREAM_ERROR;
1.269 - state = (struct inflate_state FAR *)strm->state;
1.270 -
1.271 - /* Reset the state */
1.272 - strm->msg = Z_NULL;
1.273 - state->mode = TYPE;
1.274 - state->last = 0;
1.275 - state->whave = 0;
1.276 - next = strm->next_in;
1.277 - have = next != Z_NULL ? strm->avail_in : 0;
1.278 - hold = 0;
1.279 - bits = 0;
1.280 - put = state->window;
1.281 - left = state->wsize;
1.282 -
1.283 - /* Inflate until end of block marked as last */
1.284 - for (;;)
1.285 - switch (state->mode) {
1.286 - case TYPE:
1.287 - /* determine and dispatch block type */
1.288 - if (state->last) {
1.289 - BYTEBITS();
1.290 - state->mode = DONE;
1.291 - break;
1.292 - }
1.293 - NEEDBITS(3);
1.294 - state->last = BITS(1);
1.295 - DROPBITS(1);
1.296 - switch (BITS(2)) {
1.297 - case 0: /* stored block */
1.298 - Tracev((stderr, "inflate: stored block%s\n",
1.299 - state->last ? " (last)" : ""));
1.300 - state->mode = STORED;
1.301 - break;
1.302 - case 1: /* fixed block */
1.303 - fixedtables(state);
1.304 - Tracev((stderr, "inflate: fixed codes block%s\n",
1.305 - state->last ? " (last)" : ""));
1.306 - state->mode = LEN; /* decode codes */
1.307 - break;
1.308 - case 2: /* dynamic block */
1.309 - Tracev((stderr, "inflate: dynamic codes block%s\n",
1.310 - state->last ? " (last)" : ""));
1.311 - state->mode = TABLE;
1.312 - break;
1.313 - case 3:
1.314 - strm->msg = (char *)"invalid block type";
1.315 - state->mode = BAD;
1.316 - }
1.317 - DROPBITS(2);
1.318 - break;
1.319 -
1.320 - case STORED:
1.321 - /* get and verify stored block length */
1.322 - BYTEBITS(); /* go to byte boundary */
1.323 - NEEDBITS(32);
1.324 - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
1.325 - strm->msg = (char *)"invalid stored block lengths";
1.326 - state->mode = BAD;
1.327 - break;
1.328 - }
1.329 - state->length = (unsigned)hold & 0xffff;
1.330 - Tracev((stderr, "inflate: stored length %u\n",
1.331 - state->length));
1.332 - INITBITS();
1.333 -
1.334 - /* copy stored block from input to output */
1.335 - while (state->length != 0) {
1.336 - copy = state->length;
1.337 - PULL();
1.338 - ROOM();
1.339 - if (copy > have) copy = have;
1.340 - if (copy > left) copy = left;
1.341 - zmemcpy(put, next, copy);
1.342 - have -= copy;
1.343 - next += copy;
1.344 - left -= copy;
1.345 - put += copy;
1.346 - state->length -= copy;
1.347 - }
1.348 - Tracev((stderr, "inflate: stored end\n"));
1.349 - state->mode = TYPE;
1.350 - break;
1.351 -
1.352 - case TABLE:
1.353 - /* get dynamic table entries descriptor */
1.354 - NEEDBITS(14);
1.355 - state->nlen = BITS(5) + 257;
1.356 - DROPBITS(5);
1.357 - state->ndist = BITS(5) + 1;
1.358 - DROPBITS(5);
1.359 - state->ncode = BITS(4) + 4;
1.360 - DROPBITS(4);
1.361 -#ifndef PKZIP_BUG_WORKAROUND
1.362 - if (state->nlen > 286 || state->ndist > 30) {
1.363 - strm->msg = (char *)"too many length or distance symbols";
1.364 - state->mode = BAD;
1.365 - break;
1.366 - }
1.367 -#endif
1.368 - Tracev((stderr, "inflate: table sizes ok\n"));
1.369 -
1.370 - /* get code length code lengths (not a typo) */
1.371 - state->have = 0;
1.372 - while (state->have < state->ncode) {
1.373 - NEEDBITS(3);
1.374 - state->lens[order[state->have++]] = (unsigned short)BITS(3);
1.375 - DROPBITS(3);
1.376 - }
1.377 - while (state->have < 19)
1.378 - state->lens[order[state->have++]] = 0;
1.379 - state->next = state->codes;
1.380 - state->lencode = (code const FAR *)(state->next);
1.381 - state->lenbits = 7;
1.382 - ret = inflate_table(CODES, state->lens, 19, &(state->next),
1.383 - &(state->lenbits), state->work);
1.384 - if (ret) {
1.385 - strm->msg = (char *)"invalid code lengths set";
1.386 - state->mode = BAD;
1.387 - break;
1.388 - }
1.389 - Tracev((stderr, "inflate: code lengths ok\n"));
1.390 -
1.391 - /* get length and distance code code lengths */
1.392 - state->have = 0;
1.393 - while (state->have < state->nlen + state->ndist) {
1.394 - for (;;) {
1.395 - this = state->lencode[BITS(state->lenbits)];
1.396 - if ((unsigned)(this.bits) <= bits) break;
1.397 - PULLBYTE();
1.398 - }
1.399 - if (this.val < 16) {
1.400 - NEEDBITS(this.bits);
1.401 - DROPBITS(this.bits);
1.402 - state->lens[state->have++] = this.val;
1.403 - }
1.404 - else {
1.405 - if (this.val == 16) {
1.406 - NEEDBITS(this.bits + 2);
1.407 - DROPBITS(this.bits);
1.408 - if (state->have == 0) {
1.409 - strm->msg = (char *)"invalid bit length repeat";
1.410 - state->mode = BAD;
1.411 - break;
1.412 - }
1.413 - len = (unsigned)(state->lens[state->have - 1]);
1.414 - copy = 3 + BITS(2);
1.415 - DROPBITS(2);
1.416 - }
1.417 - else if (this.val == 17) {
1.418 - NEEDBITS(this.bits + 3);
1.419 - DROPBITS(this.bits);
1.420 - len = 0;
1.421 - copy = 3 + BITS(3);
1.422 - DROPBITS(3);
1.423 - }
1.424 - else {
1.425 - NEEDBITS(this.bits + 7);
1.426 - DROPBITS(this.bits);
1.427 - len = 0;
1.428 - copy = 11 + BITS(7);
1.429 - DROPBITS(7);
1.430 - }
1.431 - if (state->have + copy > state->nlen + state->ndist) {
1.432 - strm->msg = (char *)"invalid bit length repeat";
1.433 - state->mode = BAD;
1.434 - break;
1.435 - }
1.436 - while (copy--)
1.437 - state->lens[state->have++] = (unsigned short)len;
1.438 - }
1.439 - }
1.440 -
1.441 - /* handle error breaks in while */
1.442 - if (state->mode == BAD) break;
1.443 -
1.444 - /* build code tables */
1.445 - state->next = state->codes;
1.446 - state->lencode = (code const FAR *)(state->next);
1.447 - state->lenbits = 9;
1.448 - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1.449 - &(state->lenbits), state->work);
1.450 - if (ret) {
1.451 - strm->msg = (char *)"invalid literal/lengths set";
1.452 - state->mode = BAD;
1.453 - break;
1.454 - }
1.455 - state->distcode = (code const FAR *)(state->next);
1.456 - state->distbits = 6;
1.457 - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1.458 - &(state->next), &(state->distbits), state->work);
1.459 - if (ret) {
1.460 - strm->msg = (char *)"invalid distances set";
1.461 - state->mode = BAD;
1.462 - break;
1.463 - }
1.464 - Tracev((stderr, "inflate: codes ok\n"));
1.465 - state->mode = LEN;
1.466 -
1.467 - case LEN:
1.468 - /* use inflate_fast() if we have enough input and output */
1.469 - if (have >= 6 && left >= 258) {
1.470 - RESTORE();
1.471 - if (state->whave < state->wsize)
1.472 - state->whave = state->wsize - left;
1.473 - inflate_fast(strm, state->wsize);
1.474 - LOAD();
1.475 - break;
1.476 - }
1.477 -
1.478 - /* get a literal, length, or end-of-block code */
1.479 - for (;;) {
1.480 - this = state->lencode[BITS(state->lenbits)];
1.481 - if ((unsigned)(this.bits) <= bits) break;
1.482 - PULLBYTE();
1.483 - }
1.484 - if (this.op && (this.op & 0xf0) == 0) {
1.485 - last = this;
1.486 - for (;;) {
1.487 - this = state->lencode[last.val +
1.488 - (BITS(last.bits + last.op) >> last.bits)];
1.489 - if ((unsigned)(last.bits + this.bits) <= bits) break;
1.490 - PULLBYTE();
1.491 - }
1.492 - DROPBITS(last.bits);
1.493 - }
1.494 - DROPBITS(this.bits);
1.495 - state->length = (unsigned)this.val;
1.496 -
1.497 - /* process literal */
1.498 - if (this.op == 0) {
1.499 - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
1.500 - "inflate: literal '%c'\n" :
1.501 - "inflate: literal 0x%02x\n", this.val));
1.502 - ROOM();
1.503 - *put++ = (unsigned char)(state->length);
1.504 - left--;
1.505 - state->mode = LEN;
1.506 - break;
1.507 - }
1.508 -
1.509 - /* process end of block */
1.510 - if (this.op & 32) {
1.511 - Tracevv((stderr, "inflate: end of block\n"));
1.512 - state->mode = TYPE;
1.513 - break;
1.514 - }
1.515 -
1.516 - /* invalid code */
1.517 - if (this.op & 64) {
1.518 - strm->msg = (char *)"invalid literal/length code";
1.519 - state->mode = BAD;
1.520 - break;
1.521 - }
1.522 -
1.523 - /* length code -- get extra bits, if any */
1.524 - state->extra = (unsigned)(this.op) & 15;
1.525 - if (state->extra != 0) {
1.526 - NEEDBITS(state->extra);
1.527 - state->length += BITS(state->extra);
1.528 - DROPBITS(state->extra);
1.529 - }
1.530 - Tracevv((stderr, "inflate: length %u\n", state->length));
1.531 -
1.532 - /* get distance code */
1.533 - for (;;) {
1.534 - this = state->distcode[BITS(state->distbits)];
1.535 - if ((unsigned)(this.bits) <= bits) break;
1.536 - PULLBYTE();
1.537 - }
1.538 - if ((this.op & 0xf0) == 0) {
1.539 - last = this;
1.540 - for (;;) {
1.541 - this = state->distcode[last.val +
1.542 - (BITS(last.bits + last.op) >> last.bits)];
1.543 - if ((unsigned)(last.bits + this.bits) <= bits) break;
1.544 - PULLBYTE();
1.545 - }
1.546 - DROPBITS(last.bits);
1.547 - }
1.548 - DROPBITS(this.bits);
1.549 - if (this.op & 64) {
1.550 - strm->msg = (char *)"invalid distance code";
1.551 - state->mode = BAD;
1.552 - break;
1.553 - }
1.554 - state->offset = (unsigned)this.val;
1.555 -
1.556 - /* get distance extra bits, if any */
1.557 - state->extra = (unsigned)(this.op) & 15;
1.558 - if (state->extra != 0) {
1.559 - NEEDBITS(state->extra);
1.560 - state->offset += BITS(state->extra);
1.561 - DROPBITS(state->extra);
1.562 - }
1.563 - if (state->offset > state->wsize - (state->whave < state->wsize ?
1.564 - left : 0)) {
1.565 - strm->msg = (char *)"invalid distance too far back";
1.566 - state->mode = BAD;
1.567 - break;
1.568 - }
1.569 - Tracevv((stderr, "inflate: distance %u\n", state->offset));
1.570 -
1.571 - /* copy match from window to output */
1.572 - do {
1.573 - ROOM();
1.574 - copy = state->wsize - state->offset;
1.575 - if (copy < left) {
1.576 - from = put + copy;
1.577 - copy = left - copy;
1.578 - }
1.579 - else {
1.580 - from = put - state->offset;
1.581 - copy = left;
1.582 - }
1.583 - if (copy > state->length) copy = state->length;
1.584 - state->length -= copy;
1.585 - left -= copy;
1.586 - do {
1.587 - *put++ = *from++;
1.588 - } while (--copy);
1.589 - } while (state->length != 0);
1.590 - break;
1.591 -
1.592 - case DONE:
1.593 - /* inflate stream terminated properly -- write leftover output */
1.594 - ret = Z_STREAM_END;
1.595 - if (left < state->wsize) {
1.596 - if (out(out_desc, state->window, state->wsize - left))
1.597 - ret = Z_BUF_ERROR;
1.598 - }
1.599 - goto inf_leave;
1.600 -
1.601 - case BAD:
1.602 - ret = Z_DATA_ERROR;
1.603 - goto inf_leave;
1.604 -
1.605 - default: /* can't happen, but makes compilers happy */
1.606 - ret = Z_STREAM_ERROR;
1.607 - goto inf_leave;
1.608 - }
1.609 -
1.610 - /* Return unused input */
1.611 - inf_leave:
1.612 - strm->next_in = next;
1.613 - strm->avail_in = have;
1.614 - return ret;
1.615 -}
1.616 -
1.617 -int ZEXPORT inflateBackEnd(strm)
1.618 -z_streamp strm;
1.619 -{
1.620 - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1.621 - return Z_STREAM_ERROR;
1.622 - ZFREE(strm, strm->state);
1.623 - strm->state = Z_NULL;
1.624 - Tracev((stderr, "inflate: end\n"));
1.625 - return Z_OK;
1.626 -}