5128eecc9f 2011-02-23 kinaba: /* infblock.c -- interpret and process block types to last block 5128eecc9f 2011-02-23 kinaba: * Copyright (C) 1995-1998 Mark Adler 5128eecc9f 2011-02-23 kinaba: * For conditions of distribution and use, see copyright notice in zlib.h 5128eecc9f 2011-02-23 kinaba: */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "zutil.h" 5128eecc9f 2011-02-23 kinaba: #include "infblock.h" 5128eecc9f 2011-02-23 kinaba: #include "inftrees.h" 5128eecc9f 2011-02-23 kinaba: #include "infcodes.h" 5128eecc9f 2011-02-23 kinaba: #include "infutil.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: struct inflate_codes_state {int dummy;}; /* for buggy compilers */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* simplify the use of the inflate_huft type with some defines */ 5128eecc9f 2011-02-23 kinaba: #define exop word.what.Exop 5128eecc9f 2011-02-23 kinaba: #define bits word.what.Bits 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* Table for deflate from PKZIP's appnote.txt. */ 5128eecc9f 2011-02-23 kinaba: local const uInt border[] = { /* Order of the bit length code lengths */ 5128eecc9f 2011-02-23 kinaba: 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* 5128eecc9f 2011-02-23 kinaba: Notes beyond the 1.93a appnote.txt: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 1. Distance pointers never point before the beginning of the output 5128eecc9f 2011-02-23 kinaba: stream. 5128eecc9f 2011-02-23 kinaba: 2. Distance pointers can point back across blocks, up to 32k away. 5128eecc9f 2011-02-23 kinaba: 3. There is an implied maximum of 7 bits for the bit length table and 5128eecc9f 2011-02-23 kinaba: 15 bits for the actual data. 5128eecc9f 2011-02-23 kinaba: 4. If only one code exists, then it is encoded using one bit. (Zero 5128eecc9f 2011-02-23 kinaba: would be more efficient, but perhaps a little confusing.) If two 5128eecc9f 2011-02-23 kinaba: codes exist, they are coded using one bit each (0 and 1). 5128eecc9f 2011-02-23 kinaba: 5. There is no way of sending zero distance codes--a dummy must be 5128eecc9f 2011-02-23 kinaba: sent if there are none. (History: a pre 2.0 version of PKZIP would 5128eecc9f 2011-02-23 kinaba: store blocks with no distance codes, but this was discovered to be 5128eecc9f 2011-02-23 kinaba: too harsh a criterion.) Valid only for 1.93a. 2.04c does allow 5128eecc9f 2011-02-23 kinaba: zero distance codes, which is sent as one code of zero bits in 5128eecc9f 2011-02-23 kinaba: length. 5128eecc9f 2011-02-23 kinaba: 6. There are up to 286 literal/length codes. Code 256 represents the 5128eecc9f 2011-02-23 kinaba: end-of-block. Note however that the static length tree defines 5128eecc9f 2011-02-23 kinaba: 288 codes just to fill out the Huffman codes. Codes 286 and 287 5128eecc9f 2011-02-23 kinaba: cannot be used though, since there is no length base or extra bits 5128eecc9f 2011-02-23 kinaba: defined for them. Similarily, there are up to 30 distance codes. 5128eecc9f 2011-02-23 kinaba: However, static trees define 32 codes (all 5 bits) to fill out the 5128eecc9f 2011-02-23 kinaba: Huffman codes, but the last two had better not show up in the data. 5128eecc9f 2011-02-23 kinaba: 7. Unzip can check dynamic Huffman blocks for complete code sets. 5128eecc9f 2011-02-23 kinaba: The exception is that a single code would not be complete (see #4). 5128eecc9f 2011-02-23 kinaba: 8. The five bits following the block type is really the number of 5128eecc9f 2011-02-23 kinaba: literal codes sent minus 257. 5128eecc9f 2011-02-23 kinaba: 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits 5128eecc9f 2011-02-23 kinaba: (1+6+6). Therefore, to output three times the length, you output 5128eecc9f 2011-02-23 kinaba: three codes (1+1+1), whereas to output four times the same length, 5128eecc9f 2011-02-23 kinaba: you only need two codes (1+3). Hmm. 5128eecc9f 2011-02-23 kinaba: 10. In the tree reconstruction algorithm, Code = Code + Increment 5128eecc9f 2011-02-23 kinaba: only if BitLength(i) is not zero. (Pretty obvious.) 5128eecc9f 2011-02-23 kinaba: 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) 5128eecc9f 2011-02-23 kinaba: 12. Note: length code 284 can represent 227-258, but length code 285 5128eecc9f 2011-02-23 kinaba: really is 258. The last length deserves its own, short code 5128eecc9f 2011-02-23 kinaba: since it gets used a lot in very redundant files. The length 5128eecc9f 2011-02-23 kinaba: 258 is special since 258 - 3 (the min match length) is 255. 5128eecc9f 2011-02-23 kinaba: 13. The literal/length and distance code bit lengths are read as a 5128eecc9f 2011-02-23 kinaba: single stream of lengths. It is possible (and advantageous) for 5128eecc9f 2011-02-23 kinaba: a repeat code (16, 17, or 18) to go across the boundary between 5128eecc9f 2011-02-23 kinaba: the two sets of lengths. 5128eecc9f 2011-02-23 kinaba: */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void inflate_blocks_reset(s, z, c) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: uLongf *c; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (c != Z_NULL) 5128eecc9f 2011-02-23 kinaba: *c = s->check; 5128eecc9f 2011-02-23 kinaba: if (s->mode == BTREE || s->mode == DTREE) 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->sub.trees.blens); 5128eecc9f 2011-02-23 kinaba: if (s->mode == CODES) 5128eecc9f 2011-02-23 kinaba: inflate_codes_free(s->sub.decode.codes, z); 5128eecc9f 2011-02-23 kinaba: s->mode = TYPE; 5128eecc9f 2011-02-23 kinaba: s->bitk = 0; 5128eecc9f 2011-02-23 kinaba: s->bitb = 0; 5128eecc9f 2011-02-23 kinaba: s->read = s->write = s->window; 5128eecc9f 2011-02-23 kinaba: if (s->checkfn != Z_NULL) 5128eecc9f 2011-02-23 kinaba: z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: blocks reset\n")); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *inflate_blocks_new(z, c, w) 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: check_func c; 5128eecc9f 2011-02-23 kinaba: uInt w; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if ((s = (inflate_blocks_statef *)ZALLOC 5128eecc9f 2011-02-23 kinaba: (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: return s; 5128eecc9f 2011-02-23 kinaba: if ((s->hufts = 5128eecc9f 2011-02-23 kinaba: (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s); 5128eecc9f 2011-02-23 kinaba: return Z_NULL; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->hufts); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s); 5128eecc9f 2011-02-23 kinaba: return Z_NULL; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->end = s->window + w; 5128eecc9f 2011-02-23 kinaba: s->checkfn = c; 5128eecc9f 2011-02-23 kinaba: s->mode = TYPE; 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: blocks allocated\n")); 5128eecc9f 2011-02-23 kinaba: inflate_blocks_reset(s, z, Z_NULL); 5128eecc9f 2011-02-23 kinaba: return s; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int inflate_blocks(s, z, r) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: int r; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: uInt t; /* temporary storage */ 5128eecc9f 2011-02-23 kinaba: uLong b; /* bit buffer */ 5128eecc9f 2011-02-23 kinaba: uInt k; /* bits in bit buffer */ 5128eecc9f 2011-02-23 kinaba: Bytef *p; /* input data pointer */ 5128eecc9f 2011-02-23 kinaba: uInt n; /* bytes available there */ 5128eecc9f 2011-02-23 kinaba: Bytef *q; /* output window write pointer */ 5128eecc9f 2011-02-23 kinaba: uInt m; /* bytes to end of window or read pointer */ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* copy input/output information to locals (UPDATE macro restores) */ 5128eecc9f 2011-02-23 kinaba: LOAD 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* process input based on current state */ 5128eecc9f 2011-02-23 kinaba: while (1) switch (s->mode) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: case TYPE: 5128eecc9f 2011-02-23 kinaba: NEEDBITS(3) 5128eecc9f 2011-02-23 kinaba: t = (uInt)b & 7; 5128eecc9f 2011-02-23 kinaba: s->last = t & 1; 5128eecc9f 2011-02-23 kinaba: switch (t >> 1) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: case 0: /* stored */ 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: stored block%s\n", 5128eecc9f 2011-02-23 kinaba: s->last ? " (last)" : "")); 5128eecc9f 2011-02-23 kinaba: DUMPBITS(3) 5128eecc9f 2011-02-23 kinaba: t = k & 7; /* go to byte boundary */ 5128eecc9f 2011-02-23 kinaba: DUMPBITS(t) 5128eecc9f 2011-02-23 kinaba: s->mode = LENS; /* get length of stored block */ 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case 1: /* fixed */ 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: fixed codes block%s\n", 5128eecc9f 2011-02-23 kinaba: s->last ? " (last)" : "")); 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: uInt bl, bd; 5128eecc9f 2011-02-23 kinaba: inflate_huft *tl, *td; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: inflate_trees_fixed(&bl, &bd, &tl, &td, z); 5128eecc9f 2011-02-23 kinaba: s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); 5128eecc9f 2011-02-23 kinaba: if (s->sub.decode.codes == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: r = Z_MEM_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: DUMPBITS(3) 5128eecc9f 2011-02-23 kinaba: s->mode = CODES; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case 2: /* dynamic */ 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: dynamic codes block%s\n", 5128eecc9f 2011-02-23 kinaba: s->last ? " (last)" : "")); 5128eecc9f 2011-02-23 kinaba: DUMPBITS(3) 5128eecc9f 2011-02-23 kinaba: s->mode = TABLE; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case 3: /* illegal */ 5128eecc9f 2011-02-23 kinaba: DUMPBITS(3) 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"invalid block type"; 5128eecc9f 2011-02-23 kinaba: r = Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case LENS: 5128eecc9f 2011-02-23 kinaba: NEEDBITS(32) 5128eecc9f 2011-02-23 kinaba: if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"invalid stored block lengths"; 5128eecc9f 2011-02-23 kinaba: r = Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->sub.left = (uInt)b & 0xffff; 5128eecc9f 2011-02-23 kinaba: b = k = 0; /* dump bits */ 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); 5128eecc9f 2011-02-23 kinaba: s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case STORED: 5128eecc9f 2011-02-23 kinaba: if (n == 0) 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: NEEDOUT 5128eecc9f 2011-02-23 kinaba: t = s->sub.left; 5128eecc9f 2011-02-23 kinaba: if (t > n) t = n; 5128eecc9f 2011-02-23 kinaba: if (t > m) t = m; 5128eecc9f 2011-02-23 kinaba: zmemcpy(q, p, t); 5128eecc9f 2011-02-23 kinaba: p += t; n -= t; 5128eecc9f 2011-02-23 kinaba: q += t; m -= t; 5128eecc9f 2011-02-23 kinaba: if ((s->sub.left -= t) != 0) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: stored end, %lu total out\n", 5128eecc9f 2011-02-23 kinaba: z->total_out + (q >= s->read ? q - s->read : 5128eecc9f 2011-02-23 kinaba: (s->end - s->read) + (q - s->window)))); 5128eecc9f 2011-02-23 kinaba: s->mode = s->last ? DRY : TYPE; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: case TABLE: 5128eecc9f 2011-02-23 kinaba: NEEDBITS(14) 5128eecc9f 2011-02-23 kinaba: s->sub.trees.table = t = (uInt)b & 0x3fff; 5128eecc9f 2011-02-23 kinaba: #ifndef PKZIP_BUG_WORKAROUND 5128eecc9f 2011-02-23 kinaba: if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"too many length or distance symbols"; 5128eecc9f 2011-02-23 kinaba: r = Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: #endif 5128eecc9f 2011-02-23 kinaba: t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); 5128eecc9f 2011-02-23 kinaba: if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: r = Z_MEM_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: DUMPBITS(14) 5128eecc9f 2011-02-23 kinaba: s->sub.trees.index = 0; 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: table sizes ok\n")); 5128eecc9f 2011-02-23 kinaba: s->mode = BTREE; 5128eecc9f 2011-02-23 kinaba: case BTREE: 5128eecc9f 2011-02-23 kinaba: while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: NEEDBITS(3) 5128eecc9f 2011-02-23 kinaba: s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; 5128eecc9f 2011-02-23 kinaba: DUMPBITS(3) 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: while (s->sub.trees.index < 19) 5128eecc9f 2011-02-23 kinaba: s->sub.trees.blens[border[s->sub.trees.index++]] = 0; 5128eecc9f 2011-02-23 kinaba: s->sub.trees.bb = 7; 5128eecc9f 2011-02-23 kinaba: t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, 5128eecc9f 2011-02-23 kinaba: &s->sub.trees.tb, s->hufts, z); 5128eecc9f 2011-02-23 kinaba: if (t != Z_OK) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->sub.trees.blens); 5128eecc9f 2011-02-23 kinaba: r = t; 5128eecc9f 2011-02-23 kinaba: if (r == Z_DATA_ERROR) 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->sub.trees.index = 0; 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: bits tree ok\n")); 5128eecc9f 2011-02-23 kinaba: s->mode = DTREE; 5128eecc9f 2011-02-23 kinaba: case DTREE: 5128eecc9f 2011-02-23 kinaba: while (t = s->sub.trees.table, 5128eecc9f 2011-02-23 kinaba: s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: inflate_huft *h; 5128eecc9f 2011-02-23 kinaba: uInt i, j, c; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: t = s->sub.trees.bb; 5128eecc9f 2011-02-23 kinaba: NEEDBITS(t) 5128eecc9f 2011-02-23 kinaba: h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); 5128eecc9f 2011-02-23 kinaba: t = h->bits; 5128eecc9f 2011-02-23 kinaba: c = h->base; 5128eecc9f 2011-02-23 kinaba: if (c < 16) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: DUMPBITS(t) 5128eecc9f 2011-02-23 kinaba: s->sub.trees.blens[s->sub.trees.index++] = c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else /* c == 16..18 */ 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: i = c == 18 ? 7 : c - 14; 5128eecc9f 2011-02-23 kinaba: j = c == 18 ? 11 : 3; 5128eecc9f 2011-02-23 kinaba: NEEDBITS(t + i) 5128eecc9f 2011-02-23 kinaba: DUMPBITS(t) 5128eecc9f 2011-02-23 kinaba: j += (uInt)b & inflate_mask[i]; 5128eecc9f 2011-02-23 kinaba: DUMPBITS(i) 5128eecc9f 2011-02-23 kinaba: i = s->sub.trees.index; 5128eecc9f 2011-02-23 kinaba: t = s->sub.trees.table; 5128eecc9f 2011-02-23 kinaba: if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || 5128eecc9f 2011-02-23 kinaba: (c == 16 && i < 1)) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->sub.trees.blens); 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: z->msg = (char*)"invalid bit length repeat"; 5128eecc9f 2011-02-23 kinaba: r = Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: c = c == 16 ? s->sub.trees.blens[i - 1] : 0; 5128eecc9f 2011-02-23 kinaba: do { 5128eecc9f 2011-02-23 kinaba: s->sub.trees.blens[i++] = c; 5128eecc9f 2011-02-23 kinaba: } while (--j); 5128eecc9f 2011-02-23 kinaba: s->sub.trees.index = i; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->sub.trees.tb = Z_NULL; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: uInt bl, bd; 5128eecc9f 2011-02-23 kinaba: inflate_huft *tl, *td; 5128eecc9f 2011-02-23 kinaba: inflate_codes_statef *c; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bl = 9; /* must be <= 9 for lookahead assumptions */ 5128eecc9f 2011-02-23 kinaba: bd = 6; /* must be <= 9 for lookahead assumptions */ 5128eecc9f 2011-02-23 kinaba: t = s->sub.trees.table; 5128eecc9f 2011-02-23 kinaba: t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), 5128eecc9f 2011-02-23 kinaba: s->sub.trees.blens, &bl, &bd, &tl, &td, 5128eecc9f 2011-02-23 kinaba: s->hufts, z); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->sub.trees.blens); 5128eecc9f 2011-02-23 kinaba: if (t != Z_OK) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if (t == (uInt)Z_DATA_ERROR) 5128eecc9f 2011-02-23 kinaba: s->mode = BAD; 5128eecc9f 2011-02-23 kinaba: r = t; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: trees ok\n")); 5128eecc9f 2011-02-23 kinaba: if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: r = Z_MEM_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->sub.decode.codes = c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->mode = CODES; 5128eecc9f 2011-02-23 kinaba: case CODES: 5128eecc9f 2011-02-23 kinaba: UPDATE 5128eecc9f 2011-02-23 kinaba: if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) 5128eecc9f 2011-02-23 kinaba: return inflate_flush(s, z, r); 5128eecc9f 2011-02-23 kinaba: r = Z_OK; 5128eecc9f 2011-02-23 kinaba: inflate_codes_free(s->sub.decode.codes, z); 5128eecc9f 2011-02-23 kinaba: LOAD 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: codes end, %lu total out\n", 5128eecc9f 2011-02-23 kinaba: z->total_out + (q >= s->read ? q - s->read : 5128eecc9f 2011-02-23 kinaba: (s->end - s->read) + (q - s->window)))); 5128eecc9f 2011-02-23 kinaba: if (!s->last) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: s->mode = TYPE; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: s->mode = DRY; 5128eecc9f 2011-02-23 kinaba: case DRY: 5128eecc9f 2011-02-23 kinaba: FLUSH 5128eecc9f 2011-02-23 kinaba: if (s->read != s->write) 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: s->mode = DONE; 5128eecc9f 2011-02-23 kinaba: case DONE: 5128eecc9f 2011-02-23 kinaba: r = Z_STREAM_END; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: case BAD: 5128eecc9f 2011-02-23 kinaba: r = Z_DATA_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: default: 5128eecc9f 2011-02-23 kinaba: r = Z_STREAM_ERROR; 5128eecc9f 2011-02-23 kinaba: LEAVE 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int inflate_blocks_free(s, z) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: z_streamp z; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: inflate_blocks_reset(s, z, Z_NULL); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->window); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s->hufts); 5128eecc9f 2011-02-23 kinaba: ZFREE(z, s); 5128eecc9f 2011-02-23 kinaba: Tracev((stderr, "inflate: blocks freed\n")); 5128eecc9f 2011-02-23 kinaba: return Z_OK; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void inflate_set_dictionary(s, d, n) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: const Bytef *d; 5128eecc9f 2011-02-23 kinaba: uInt n; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: zmemcpy(s->window, d, n); 5128eecc9f 2011-02-23 kinaba: s->read = s->write = s->window + n; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: /* Returns true if inflate is currently at the end of a block generated 5128eecc9f 2011-02-23 kinaba: * by Z_SYNC_FLUSH or Z_FULL_FLUSH. 5128eecc9f 2011-02-23 kinaba: * IN assertion: s != Z_NULL 5128eecc9f 2011-02-23 kinaba: */ 5128eecc9f 2011-02-23 kinaba: int inflate_blocks_sync_point(s) 5128eecc9f 2011-02-23 kinaba: inflate_blocks_statef *s; 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return s->mode == LENS; 5128eecc9f 2011-02-23 kinaba: }