File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / zlib / infback.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:23:02 2012 UTC (12 years, 4 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_3p2, HEAD
sudo

    1: /* infback.c -- inflate using a call-back interface
    2:  * Copyright (C) 1995-2009 Mark Adler
    3:  * For conditions of distribution and use, see copyright notice in zlib.h
    4:  */
    5: 
    6: /*
    7:    This code is largely copied from inflate.c.  Normally either infback.o or
    8:    inflate.o would be linked into an application--not both.  The interface
    9:    with inffast.c is retained so that optimized assembler-coded versions of
   10:    inflate_fast() can be used with either inflate.c or infback.c.
   11:  */
   12: 
   13: #include "zutil.h"
   14: #include "inftrees.h"
   15: #include "inflate.h"
   16: #include "inffast.h"
   17: 
   18: /* function prototypes */
   19: local void fixedtables OF((struct inflate_state FAR *state));
   20: 
   21: /*
   22:    strm provides memory allocation functions in zalloc and zfree, or
   23:    Z_NULL to use the library memory allocation functions.
   24: 
   25:    windowBits is in the range 8..15, and window is a user-supplied
   26:    window and output buffer that is 2**windowBits bytes.
   27:  */
   28: int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
   29: z_streamp strm;
   30: int windowBits;
   31: unsigned char FAR *window;
   32: const char *version;
   33: int stream_size;
   34: {
   35:     struct inflate_state FAR *state;
   36: 
   37:     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
   38:         stream_size != (int)(sizeof(z_stream)))
   39:         return Z_VERSION_ERROR;
   40:     if (strm == Z_NULL || window == Z_NULL ||
   41:         windowBits < 8 || windowBits > 15)
   42:         return Z_STREAM_ERROR;
   43:     strm->msg = Z_NULL;                 /* in case we return an error */
   44:     if (strm->zalloc == (alloc_func)0) {
   45:         strm->zalloc = zcalloc;
   46:         strm->opaque = (voidpf)0;
   47:     }
   48:     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
   49:     state = (struct inflate_state FAR *)ZALLOC(strm, 1,
   50:                                                sizeof(struct inflate_state));
   51:     if (state == Z_NULL) return Z_MEM_ERROR;
   52:     Tracev((stderr, "inflate: allocated\n"));
   53:     strm->state = (struct internal_state FAR *)state;
   54:     state->dmax = 32768U;
   55:     state->wbits = windowBits;
   56:     state->wsize = 1U << windowBits;
   57:     state->window = window;
   58:     state->wnext = 0;
   59:     state->whave = 0;
   60:     return Z_OK;
   61: }
   62: 
   63: /*
   64:    Return state with length and distance decoding tables and index sizes set to
   65:    fixed code decoding.  Normally this returns fixed tables from inffixed.h.
   66:    If BUILDFIXED is defined, then instead this routine builds the tables the
   67:    first time it's called, and returns those tables the first time and
   68:    thereafter.  This reduces the size of the code by about 2K bytes, in
   69:    exchange for a little execution time.  However, BUILDFIXED should not be
   70:    used for threaded applications, since the rewriting of the tables and virgin
   71:    may not be thread-safe.
   72:  */
   73: local void fixedtables(state)
   74: struct inflate_state FAR *state;
   75: {
   76: #ifdef BUILDFIXED
   77:     static int virgin = 1;
   78:     static code *lenfix, *distfix;
   79:     static code fixed[544];
   80: 
   81:     /* build fixed huffman tables if first call (may not be thread safe) */
   82:     if (virgin) {
   83:         unsigned sym, bits;
   84:         static code *next;
   85: 
   86:         /* literal/length table */
   87:         sym = 0;
   88:         while (sym < 144) state->lens[sym++] = 8;
   89:         while (sym < 256) state->lens[sym++] = 9;
   90:         while (sym < 280) state->lens[sym++] = 7;
   91:         while (sym < 288) state->lens[sym++] = 8;
   92:         next = fixed;
   93:         lenfix = next;
   94:         bits = 9;
   95:         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
   96: 
   97:         /* distance table */
   98:         sym = 0;
   99:         while (sym < 32) state->lens[sym++] = 5;
  100:         distfix = next;
  101:         bits = 5;
  102:         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
  103: 
  104:         /* do this just once */
  105:         virgin = 0;
  106:     }
  107: #else /* !BUILDFIXED */
  108: #   include "inffixed.h"
  109: #endif /* BUILDFIXED */
  110:     state->lencode = lenfix;
  111:     state->lenbits = 9;
  112:     state->distcode = distfix;
  113:     state->distbits = 5;
  114: }
  115: 
  116: /* Macros for inflateBack(): */
  117: 
  118: /* Load returned state from inflate_fast() */
  119: #define LOAD() \
  120:     do { \
  121:         put = strm->next_out; \
  122:         left = strm->avail_out; \
  123:         next = strm->next_in; \
  124:         have = strm->avail_in; \
  125:         hold = state->hold; \
  126:         bits = state->bits; \
  127:     } while (0)
  128: 
  129: /* Set state from registers for inflate_fast() */
  130: #define RESTORE() \
  131:     do { \
  132:         strm->next_out = put; \
  133:         strm->avail_out = left; \
  134:         strm->next_in = next; \
  135:         strm->avail_in = have; \
  136:         state->hold = hold; \
  137:         state->bits = bits; \
  138:     } while (0)
  139: 
  140: /* Clear the input bit accumulator */
  141: #define INITBITS() \
  142:     do { \
  143:         hold = 0; \
  144:         bits = 0; \
  145:     } while (0)
  146: 
  147: /* Assure that some input is available.  If input is requested, but denied,
  148:    then return a Z_BUF_ERROR from inflateBack(). */
  149: #define PULL() \
  150:     do { \
  151:         if (have == 0) { \
  152:             have = in(in_desc, &next); \
  153:             if (have == 0) { \
  154:                 next = Z_NULL; \
  155:                 ret = Z_BUF_ERROR; \
  156:                 goto inf_leave; \
  157:             } \
  158:         } \
  159:     } while (0)
  160: 
  161: /* Get a byte of input into the bit accumulator, or return from inflateBack()
  162:    with an error if there is no input available. */
  163: #define PULLBYTE() \
  164:     do { \
  165:         PULL(); \
  166:         have--; \
  167:         hold += (unsigned long)(*next++) << bits; \
  168:         bits += 8; \
  169:     } while (0)
  170: 
  171: /* Assure that there are at least n bits in the bit accumulator.  If there is
  172:    not enough available input to do that, then return from inflateBack() with
  173:    an error. */
  174: #define NEEDBITS(n) \
  175:     do { \
  176:         while (bits < (unsigned)(n)) \
  177:             PULLBYTE(); \
  178:     } while (0)
  179: 
  180: /* Return the low n bits of the bit accumulator (n < 16) */
  181: #define BITS(n) \
  182:     ((unsigned)hold & ((1U << (n)) - 1))
  183: 
  184: /* Remove n bits from the bit accumulator */
  185: #define DROPBITS(n) \
  186:     do { \
  187:         hold >>= (n); \
  188:         bits -= (unsigned)(n); \
  189:     } while (0)
  190: 
  191: /* Remove zero to seven bits as needed to go to a byte boundary */
  192: #define BYTEBITS() \
  193:     do { \
  194:         hold >>= bits & 7; \
  195:         bits -= bits & 7; \
  196:     } while (0)
  197: 
  198: /* Assure that some output space is available, by writing out the window
  199:    if it's full.  If the write fails, return from inflateBack() with a
  200:    Z_BUF_ERROR. */
  201: #define ROOM() \
  202:     do { \
  203:         if (left == 0) { \
  204:             put = state->window; \
  205:             left = state->wsize; \
  206:             state->whave = left; \
  207:             if (out(out_desc, put, left)) { \
  208:                 ret = Z_BUF_ERROR; \
  209:                 goto inf_leave; \
  210:             } \
  211:         } \
  212:     } while (0)
  213: 
  214: /*
  215:    strm provides the memory allocation functions and window buffer on input,
  216:    and provides information on the unused input on return.  For Z_DATA_ERROR
  217:    returns, strm will also provide an error message.
  218: 
  219:    in() and out() are the call-back input and output functions.  When
  220:    inflateBack() needs more input, it calls in().  When inflateBack() has
  221:    filled the window with output, or when it completes with data in the
  222:    window, it calls out() to write out the data.  The application must not
  223:    change the provided input until in() is called again or inflateBack()
  224:    returns.  The application must not change the window/output buffer until
  225:    inflateBack() returns.
  226: 
  227:    in() and out() are called with a descriptor parameter provided in the
  228:    inflateBack() call.  This parameter can be a structure that provides the
  229:    information required to do the read or write, as well as accumulated
  230:    information on the input and output such as totals and check values.
  231: 
  232:    in() should return zero on failure.  out() should return non-zero on
  233:    failure.  If either in() or out() fails, than inflateBack() returns a
  234:    Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
  235:    was in() or out() that caused in the error.  Otherwise,  inflateBack()
  236:    returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
  237:    error, or Z_MEM_ERROR if it could not allocate memory for the state.
  238:    inflateBack() can also return Z_STREAM_ERROR if the input parameters
  239:    are not correct, i.e. strm is Z_NULL or the state was not initialized.
  240:  */
  241: int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
  242: z_streamp strm;
  243: in_func in;
  244: void FAR *in_desc;
  245: out_func out;
  246: void FAR *out_desc;
  247: {
  248:     struct inflate_state FAR *state;
  249:     unsigned char FAR *next;    /* next input */
  250:     unsigned char FAR *put;     /* next output */
  251:     unsigned have, left;        /* available input and output */
  252:     unsigned long hold;         /* bit buffer */
  253:     unsigned bits;              /* bits in bit buffer */
  254:     unsigned copy;              /* number of stored or match bytes to copy */
  255:     unsigned char FAR *from;    /* where to copy match bytes from */
  256:     code here;                  /* current decoding table entry */
  257:     code last;                  /* parent table entry */
  258:     unsigned len;               /* length to copy for repeats, bits to drop */
  259:     int ret;                    /* return code */
  260:     static const unsigned short order[19] = /* permutation of code lengths */
  261:         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
  262: 
  263:     /* Check that the strm exists and that the state was initialized */
  264:     if (strm == Z_NULL || strm->state == Z_NULL)
  265:         return Z_STREAM_ERROR;
  266:     state = (struct inflate_state FAR *)strm->state;
  267: 
  268:     /* Reset the state */
  269:     strm->msg = Z_NULL;
  270:     state->mode = TYPE;
  271:     state->last = 0;
  272:     state->whave = 0;
  273:     next = strm->next_in;
  274:     have = next != Z_NULL ? strm->avail_in : 0;
  275:     hold = 0;
  276:     bits = 0;
  277:     put = state->window;
  278:     left = state->wsize;
  279: 
  280:     /* Inflate until end of block marked as last */
  281:     for (;;)
  282:         switch (state->mode) {
  283:         case TYPE:
  284:             /* determine and dispatch block type */
  285:             if (state->last) {
  286:                 BYTEBITS();
  287:                 state->mode = DONE;
  288:                 break;
  289:             }
  290:             NEEDBITS(3);
  291:             state->last = BITS(1);
  292:             DROPBITS(1);
  293:             switch (BITS(2)) {
  294:             case 0:                             /* stored block */
  295:                 Tracev((stderr, "inflate:     stored block%s\n",
  296:                         state->last ? " (last)" : ""));
  297:                 state->mode = STORED;
  298:                 break;
  299:             case 1:                             /* fixed block */
  300:                 fixedtables(state);
  301:                 Tracev((stderr, "inflate:     fixed codes block%s\n",
  302:                         state->last ? " (last)" : ""));
  303:                 state->mode = LEN;              /* decode codes */
  304:                 break;
  305:             case 2:                             /* dynamic block */
  306:                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
  307:                         state->last ? " (last)" : ""));
  308:                 state->mode = TABLE;
  309:                 break;
  310:             case 3:
  311:                 strm->msg = (char *)"invalid block type";
  312:                 state->mode = BAD;
  313:             }
  314:             DROPBITS(2);
  315:             break;
  316: 
  317:         case STORED:
  318:             /* get and verify stored block length */
  319:             BYTEBITS();                         /* go to byte boundary */
  320:             NEEDBITS(32);
  321:             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
  322:                 strm->msg = (char *)"invalid stored block lengths";
  323:                 state->mode = BAD;
  324:                 break;
  325:             }
  326:             state->length = (unsigned)hold & 0xffff;
  327:             Tracev((stderr, "inflate:       stored length %u\n",
  328:                     state->length));
  329:             INITBITS();
  330: 
  331:             /* copy stored block from input to output */
  332:             while (state->length != 0) {
  333:                 copy = state->length;
  334:                 PULL();
  335:                 ROOM();
  336:                 if (copy > have) copy = have;
  337:                 if (copy > left) copy = left;
  338:                 zmemcpy(put, next, copy);
  339:                 have -= copy;
  340:                 next += copy;
  341:                 left -= copy;
  342:                 put += copy;
  343:                 state->length -= copy;
  344:             }
  345:             Tracev((stderr, "inflate:       stored end\n"));
  346:             state->mode = TYPE;
  347:             break;
  348: 
  349:         case TABLE:
  350:             /* get dynamic table entries descriptor */
  351:             NEEDBITS(14);
  352:             state->nlen = BITS(5) + 257;
  353:             DROPBITS(5);
  354:             state->ndist = BITS(5) + 1;
  355:             DROPBITS(5);
  356:             state->ncode = BITS(4) + 4;
  357:             DROPBITS(4);
  358: #ifndef PKZIP_BUG_WORKAROUND
  359:             if (state->nlen > 286 || state->ndist > 30) {
  360:                 strm->msg = (char *)"too many length or distance symbols";
  361:                 state->mode = BAD;
  362:                 break;
  363:             }
  364: #endif
  365:             Tracev((stderr, "inflate:       table sizes ok\n"));
  366: 
  367:             /* get code length code lengths (not a typo) */
  368:             state->have = 0;
  369:             while (state->have < state->ncode) {
  370:                 NEEDBITS(3);
  371:                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
  372:                 DROPBITS(3);
  373:             }
  374:             while (state->have < 19)
  375:                 state->lens[order[state->have++]] = 0;
  376:             state->next = state->codes;
  377:             state->lencode = (code const FAR *)(state->next);
  378:             state->lenbits = 7;
  379:             ret = inflate_table(CODES, state->lens, 19, &(state->next),
  380:                                 &(state->lenbits), state->work);
  381:             if (ret) {
  382:                 strm->msg = (char *)"invalid code lengths set";
  383:                 state->mode = BAD;
  384:                 break;
  385:             }
  386:             Tracev((stderr, "inflate:       code lengths ok\n"));
  387: 
  388:             /* get length and distance code code lengths */
  389:             state->have = 0;
  390:             while (state->have < state->nlen + state->ndist) {
  391:                 for (;;) {
  392:                     here = state->lencode[BITS(state->lenbits)];
  393:                     if ((unsigned)(here.bits) <= bits) break;
  394:                     PULLBYTE();
  395:                 }
  396:                 if (here.val < 16) {
  397:                     NEEDBITS(here.bits);
  398:                     DROPBITS(here.bits);
  399:                     state->lens[state->have++] = here.val;
  400:                 }
  401:                 else {
  402:                     if (here.val == 16) {
  403:                         NEEDBITS(here.bits + 2);
  404:                         DROPBITS(here.bits);
  405:                         if (state->have == 0) {
  406:                             strm->msg = (char *)"invalid bit length repeat";
  407:                             state->mode = BAD;
  408:                             break;
  409:                         }
  410:                         len = (unsigned)(state->lens[state->have - 1]);
  411:                         copy = 3 + BITS(2);
  412:                         DROPBITS(2);
  413:                     }
  414:                     else if (here.val == 17) {
  415:                         NEEDBITS(here.bits + 3);
  416:                         DROPBITS(here.bits);
  417:                         len = 0;
  418:                         copy = 3 + BITS(3);
  419:                         DROPBITS(3);
  420:                     }
  421:                     else {
  422:                         NEEDBITS(here.bits + 7);
  423:                         DROPBITS(here.bits);
  424:                         len = 0;
  425:                         copy = 11 + BITS(7);
  426:                         DROPBITS(7);
  427:                     }
  428:                     if (state->have + copy > state->nlen + state->ndist) {
  429:                         strm->msg = (char *)"invalid bit length repeat";
  430:                         state->mode = BAD;
  431:                         break;
  432:                     }
  433:                     while (copy--)
  434:                         state->lens[state->have++] = (unsigned short)len;
  435:                 }
  436:             }
  437: 
  438:             /* handle error breaks in while */
  439:             if (state->mode == BAD) break;
  440: 
  441:             /* check for end-of-block code (better have one) */
  442:             if (state->lens[256] == 0) {
  443:                 strm->msg = (char *)"invalid code -- missing end-of-block";
  444:                 state->mode = BAD;
  445:                 break;
  446:             }
  447: 
  448:             /* build code tables -- note: do not change the lenbits or distbits
  449:                values here (9 and 6) without reading the comments in inftrees.h
  450:                concerning the ENOUGH constants, which depend on those values */
  451:             state->next = state->codes;
  452:             state->lencode = (code const FAR *)(state->next);
  453:             state->lenbits = 9;
  454:             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
  455:                                 &(state->lenbits), state->work);
  456:             if (ret) {
  457:                 strm->msg = (char *)"invalid literal/lengths set";
  458:                 state->mode = BAD;
  459:                 break;
  460:             }
  461:             state->distcode = (code const FAR *)(state->next);
  462:             state->distbits = 6;
  463:             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
  464:                             &(state->next), &(state->distbits), state->work);
  465:             if (ret) {
  466:                 strm->msg = (char *)"invalid distances set";
  467:                 state->mode = BAD;
  468:                 break;
  469:             }
  470:             Tracev((stderr, "inflate:       codes ok\n"));
  471:             state->mode = LEN;
  472: 
  473:         case LEN:
  474:             /* use inflate_fast() if we have enough input and output */
  475:             if (have >= 6 && left >= 258) {
  476:                 RESTORE();
  477:                 if (state->whave < state->wsize)
  478:                     state->whave = state->wsize - left;
  479:                 inflate_fast(strm, state->wsize);
  480:                 LOAD();
  481:                 break;
  482:             }
  483: 
  484:             /* get a literal, length, or end-of-block code */
  485:             for (;;) {
  486:                 here = state->lencode[BITS(state->lenbits)];
  487:                 if ((unsigned)(here.bits) <= bits) break;
  488:                 PULLBYTE();
  489:             }
  490:             if (here.op && (here.op & 0xf0) == 0) {
  491:                 last = here;
  492:                 for (;;) {
  493:                     here = state->lencode[last.val +
  494:                             (BITS(last.bits + last.op) >> last.bits)];
  495:                     if ((unsigned)(last.bits + here.bits) <= bits) break;
  496:                     PULLBYTE();
  497:                 }
  498:                 DROPBITS(last.bits);
  499:             }
  500:             DROPBITS(here.bits);
  501:             state->length = (unsigned)here.val;
  502: 
  503:             /* process literal */
  504:             if (here.op == 0) {
  505:                 Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  506:                         "inflate:         literal '%c'\n" :
  507:                         "inflate:         literal 0x%02x\n", here.val));
  508:                 ROOM();
  509:                 *put++ = (unsigned char)(state->length);
  510:                 left--;
  511:                 state->mode = LEN;
  512:                 break;
  513:             }
  514: 
  515:             /* process end of block */
  516:             if (here.op & 32) {
  517:                 Tracevv((stderr, "inflate:         end of block\n"));
  518:                 state->mode = TYPE;
  519:                 break;
  520:             }
  521: 
  522:             /* invalid code */
  523:             if (here.op & 64) {
  524:                 strm->msg = (char *)"invalid literal/length code";
  525:                 state->mode = BAD;
  526:                 break;
  527:             }
  528: 
  529:             /* length code -- get extra bits, if any */
  530:             state->extra = (unsigned)(here.op) & 15;
  531:             if (state->extra != 0) {
  532:                 NEEDBITS(state->extra);
  533:                 state->length += BITS(state->extra);
  534:                 DROPBITS(state->extra);
  535:             }
  536:             Tracevv((stderr, "inflate:         length %u\n", state->length));
  537: 
  538:             /* get distance code */
  539:             for (;;) {
  540:                 here = state->distcode[BITS(state->distbits)];
  541:                 if ((unsigned)(here.bits) <= bits) break;
  542:                 PULLBYTE();
  543:             }
  544:             if ((here.op & 0xf0) == 0) {
  545:                 last = here;
  546:                 for (;;) {
  547:                     here = state->distcode[last.val +
  548:                             (BITS(last.bits + last.op) >> last.bits)];
  549:                     if ((unsigned)(last.bits + here.bits) <= bits) break;
  550:                     PULLBYTE();
  551:                 }
  552:                 DROPBITS(last.bits);
  553:             }
  554:             DROPBITS(here.bits);
  555:             if (here.op & 64) {
  556:                 strm->msg = (char *)"invalid distance code";
  557:                 state->mode = BAD;
  558:                 break;
  559:             }
  560:             state->offset = (unsigned)here.val;
  561: 
  562:             /* get distance extra bits, if any */
  563:             state->extra = (unsigned)(here.op) & 15;
  564:             if (state->extra != 0) {
  565:                 NEEDBITS(state->extra);
  566:                 state->offset += BITS(state->extra);
  567:                 DROPBITS(state->extra);
  568:             }
  569:             if (state->offset > state->wsize - (state->whave < state->wsize ?
  570:                                                 left : 0)) {
  571:                 strm->msg = (char *)"invalid distance too far back";
  572:                 state->mode = BAD;
  573:                 break;
  574:             }
  575:             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
  576: 
  577:             /* copy match from window to output */
  578:             do {
  579:                 ROOM();
  580:                 copy = state->wsize - state->offset;
  581:                 if (copy < left) {
  582:                     from = put + copy;
  583:                     copy = left - copy;
  584:                 }
  585:                 else {
  586:                     from = put - state->offset;
  587:                     copy = left;
  588:                 }
  589:                 if (copy > state->length) copy = state->length;
  590:                 state->length -= copy;
  591:                 left -= copy;
  592:                 do {
  593:                     *put++ = *from++;
  594:                 } while (--copy);
  595:             } while (state->length != 0);
  596:             break;
  597: 
  598:         case DONE:
  599:             /* inflate stream terminated properly -- write leftover output */
  600:             ret = Z_STREAM_END;
  601:             if (left < state->wsize) {
  602:                 if (out(out_desc, state->window, state->wsize - left))
  603:                     ret = Z_BUF_ERROR;
  604:             }
  605:             goto inf_leave;
  606: 
  607:         case BAD:
  608:             ret = Z_DATA_ERROR;
  609:             goto inf_leave;
  610: 
  611:         default:                /* can't happen, but makes compilers happy */
  612:             ret = Z_STREAM_ERROR;
  613:             goto inf_leave;
  614:         }
  615: 
  616:     /* Return unused input */
  617:   inf_leave:
  618:     strm->next_in = next;
  619:     strm->avail_in = have;
  620:     return ret;
  621: }
  622: 
  623: int ZEXPORT inflateBackEnd(strm)
  624: z_streamp strm;
  625: {
  626:     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
  627:         return Z_STREAM_ERROR;
  628:     ZFREE(strm, strm->state);
  629:     strm->state = Z_NULL;
  630:     Tracev((stderr, "inflate: end\n"));
  631:     return Z_OK;
  632: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>