/* inflate a block of data compressed with dynamic huffman trees */ static int tinf_inflate_dynamic_block(TINF_DATA *d) { /* decode trees from stream */ tinf_decode_trees(d, &d->ltree, &d->dtree); /* decode block using decoded trees */ return tinf_inflate_block_data(d, &d->ltree, &d->dtree); }
/* inflate next byte of compressed stream */ int uzlib_uncompress(TINF_DATA *d) { do { int res; /* start a new block */ if (d->btype == -1) { next_blk: /* read final block flag */ d->bfinal = tinf_getbit(d); /* read block type (2 bits) */ d->btype = tinf_read_bits(d, 2, 0); //printf("Started new block: type=%d final=%d\n", d->btype, d->bfinal); if (d->btype == 1) { /* build fixed huffman trees */ tinf_build_fixed_trees(&d->ltree, &d->dtree); } else if (d->btype == 2) { /* decode trees from stream */ res = tinf_decode_trees(d, &d->ltree, &d->dtree); if (res != TINF_OK) { return res; } } } /* process current block */ switch (d->btype) { case 0: /* decompress uncompressed block */ res = tinf_inflate_uncompressed_block(d); break; case 1: case 2: /* decompress block with fixed/dynamic huffman trees */ /* trees were decoded previously, so it's the same routine for both */ res = tinf_inflate_block_data(d, &d->ltree, &d->dtree); break; default: return TINF_DATA_ERROR; } if (res == TINF_DONE && !d->bfinal) { /* the block has ended (without producing more data), but we can't return without data, so start procesing next block */ goto next_blk; } if (res != TINF_OK) { return res; } } while (--d->destSize); return TINF_OK; }
/* inflate a block of data compressed with fixed huffman trees */ static int tinf_inflate_fixed_block(TINF_DATA *d) { /* decode block using fixed trees */ return tinf_inflate_block_data(d, &sltree, &sdtree); }
/* inflate a block of data compressed with fixed huffman trees */ static int tinf_inflate_fixed_block(TINF_DATA *d, TINF_TABLES *tbl) { /* decode block using fixed trees */ return tinf_inflate_block_data(d, &tbl->sltree, &tbl->sdtree, tbl); }