/* create the fixed tables in C initialization syntax */ void main(void) { int r; uInt bl, bd; const inflate_huft *tl, *td; z_stream z; z.zalloc = zcalloc; z.opaque = (voidpf)0; z.zfree = zcfree; r = inflate_trees_fixed(&bl, &bd, &tl, &td, &z); if (r) { fprintf(stderr, "inflate_trees_fixed error %d\n", r); return; } puts("/* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by the maketree.c program"); puts(" */"); puts(""); puts("/* WARNING: this file should *not* be used by applications. It is"); puts(" part of the implementation of the compression library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); printf("local uInt fixed_bl = %d;\n", bl); printf("local uInt fixed_bd = %d;\n", bd); printf("local const inflate_huft fixed_tl[] = {"); maketree(bl, tl); puts(" };"); printf("local const inflate_huft fixed_td[] = {"); maketree(bd, td); puts(" };"); }
int inflate_blocks( inflate_blocks_statef *s, z_streamp z, int r) { uInt t; /* temporary storage */ uLong b; /* bit buffer */ uInt k; /* bits in bit buffer */ Bytef *p; /* input data pointer */ uInt n; /* bytes available there */ Bytef *q; /* output window write pointer */ uInt m; /* bytes to end of window or read pointer */ /* copy input/output information to locals (UPDATE macro restores) */ LOAD /* process input based on current state */ while (1) switch (s->mode) { case TYPE: NEEDBITS(3) t = (uInt)b & 7; s->last = t & 1; switch (t >> 1) { case 0: /* stored */ Tracev((stderr, "inflate: stored block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) t = k & 7; /* go to byte boundary */ DUMPBITS(t) s->mode = LENS; /* get length of stored block */ break; case 1: /* fixed */ Tracev((stderr, "inflate: fixed codes block%s\n", s->last ? " (last)" : "")); { #ifndef DEFL64 uInt bl, bd; inflate_huft *tl, *td; inflate_trees_fixed(&bl, &bd, &tl, &td, z); s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); if (s->sub.decode.codes == Z_NULL) { r = Z_MEM_ERROR; LEAVE } #else if (s->treetype != (uInt)z->state->method) { s->treetype = z->state->method; inflate_trees_fixed(z->state->method, &s->bl, &s->bd, &s->tl, &s->td, s->hufts, z); } s->sub.decode.codes = inflate_codes_new(s->bl, s->bd, s->tl, s->td, z); if (s->sub.decode.codes == Z_NULL) { r = Z_MEM_ERROR; LEAVE } #endif } DUMPBITS(3) s->mode = CODES; break; case 2: /* dynamic */ Tracev((stderr, "inflate: dynamic codes block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) s->mode = TABLE; break; case 3: /* illegal */ DUMPBITS(3) s->mode = BAD2; z->msg = (char*)"invalid block type"; r = Z_DATA_ERROR; LEAVE }