46#define TINF_OK OTA_INFLATE_OK
47#define TINF_DONE OTA_INFLATE_DONE
48#define TINF_DATA_ERROR OTA_INFLATE_DATA_ERROR
49#define TINF_DICT_ERROR OTA_INFLATE_DICT_ERROR
50#define TINF_DATA struct OtaInflateState
51#define TINF_TREE struct OtaInflateTree
52#define TINF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*(arr)))
55#define TINF_PUT(d, c) \
58 d->dict_ring[d->dict_idx++] = c; \
59 if (d->dict_idx == d->dict_size) \
67static const unsigned char LENGTH_BITS[30] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2,
68 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
69static const unsigned short LENGTH_BASE[30] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
70 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
72static const unsigned char DIST_BITS[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
73 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
74static const unsigned short DIST_BASE[30] = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25,
75 33, 49, 65, 97, 129, 193, 257, 385, 513, 769,
76 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
79static const unsigned char CLCIDX[] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
86static void tinf_build_tree(TINF_TREE *t,
const unsigned char *lengths,
unsigned int num) {
87 unsigned short offs[16];
91 for (i = 0; i < 16; ++i)
95 for (i = 0; i < num; ++i)
96 t->table[lengths[i]]++;
104 for (sum = 0, i = 0; i < 16; ++i) {
110 for (i = 0; i < num; ++i) {
112 t->trans[offs[lengths[i]]++] = i;
120static unsigned char uzlib_get_byte(TINF_DATA *d) {
123 if (d->source < d->source_limit) {
131 int val = d->source_read_cb(d);
133 return (
unsigned char)
val;
146static int tinf_getbit(TINF_DATA *d) {
150 if (!d->bitcount--) {
152 d->tag = uzlib_get_byte(d);
164static unsigned int tinf_read_bits(TINF_DATA *d,
int num,
int base) {
165 unsigned int val = 0;
169 unsigned int limit = 1 << (num);
172 for (mask = 1; mask < limit; mask *= 2)
181static int tinf_decode_symbol(TINF_DATA *d, TINF_TREE *t) {
182 int sum = 0, cur = 0,
len = 0;
186 cur = 2 * cur + tinf_getbit(d);
188 if (++
len == TINF_ARRAY_SIZE(
t->table)) {
189 return TINF_DATA_ERROR;
192 sum +=
t->table[
len];
193 cur -=
t->table[
len];
198 if (sum < 0 || sum >=
t->size) {
199 return TINF_DATA_ERROR;
202 return t->trans[sum];
206static int tinf_decode_trees(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) {
208 unsigned char lengths[288 + 32];
209 unsigned int hlit, hdist, hclen, hlimit;
210 unsigned int i, num,
length;
213 hlit = tinf_read_bits(d, 5, 257);
216 hdist = tinf_read_bits(d, 5, 1);
219 hclen = tinf_read_bits(d, 4, 4);
221 for (i = 0; i < 19; ++i)
225 for (i = 0; i < hclen; ++i) {
227 unsigned int clen = tinf_read_bits(d, 3, 0);
229 lengths[CLCIDX[i]] = clen;
233 tinf_build_tree(lt, lengths, 19);
236 hlimit = hlit + hdist;
237 for (num = 0; num < hlimit;) {
238 int sym = tinf_decode_symbol(d, lt);
239 unsigned char fill_value = 0;
240 int lbits, lbase = 3;
250 return TINF_DATA_ERROR;
251 fill_value = lengths[num - 1];
265 lengths[num++] = sym;
271 length = tinf_read_bits(d, lbits, lbase);
272 if (num +
length > hlimit)
273 return TINF_DATA_ERROR;
275 lengths[num++] = fill_value;
280 if (lengths[256] == 0) {
281 return TINF_DATA_ERROR;
285 tinf_build_tree(lt, lengths, hlit);
286 tinf_build_tree(dt, lengths + hlit, hdist);
293static void tinf_build_fixed_trees(TINF_TREE *lt, TINF_TREE *dt) {
294 unsigned char lengths[288];
297 for (i = 0; i < 144; ++i)
305 tinf_build_tree(lt, lengths, 288);
307 for (i = 0; i < 32; ++i)
309 tinf_build_tree(dt, lengths, 32);
317static int tinf_inflate_block_data(TINF_DATA *d, TINF_TREE *lt, TINF_TREE *dt) {
318 if (d->curlen == 0) {
321 int sym = tinf_decode_symbol(d, lt);
324 return TINF_DATA_ERROR;
345 return TINF_DATA_ERROR;
349 d->curlen = tinf_read_bits(d, LENGTH_BITS[sym], LENGTH_BASE[sym]);
351 dist = tinf_decode_symbol(d, dt);
352 if (dist < 0 || dist >= 30) {
353 return TINF_DATA_ERROR;
357 offs = tinf_read_bits(d, DIST_BITS[dist], DIST_BASE[dist]);
360 if (offs > d->dict_size) {
361 return TINF_DICT_ERROR;
371 d->lz_off = d->dict_idx - offs;
373 d->lz_off += d->dict_size;
378 TINF_PUT(d, d->dict_ring[d->lz_off]);
379 if ((
unsigned) ++d->lz_off == d->dict_size) {
387static int tinf_inflate_uncompressed_block(TINF_DATA *d) {
388 if (d->curlen == 0) {
389 unsigned int length, invlength;
392 length = uzlib_get_byte(d);
393 length += 256 * uzlib_get_byte(d);
395 invlength = uzlib_get_byte(d);
396 invlength += 256 * uzlib_get_byte(d);
398 if (
length != (~invlength & 0x0000ffff))
399 return TINF_DATA_ERROR;
409 if (--d->curlen == 0) {
413 unsigned char c = uzlib_get_byte(d);
425 d->source_limit = NULL;
432 d->dict_size = dict_len;
436 d->ltree.trans = d->ltrans;
437 d->ltree.size = TINF_ARRAY_SIZE(d->ltrans);
438 d->dtree.trans = d->dtrans;
439 d->dtree.size = TINF_ARRAY_SIZE(d->dtrans);
448 if (d->btype == -1) {
451 old_btype = d->btype;
453 d->bfinal = tinf_getbit(d);
455 d->btype = tinf_read_bits(d, 2, 0);
457 if (d->btype == 1 && old_btype != 1) {
459 tinf_build_fixed_trees(&d->ltree, &d->dtree);
460 }
else if (d->btype == 2) {
462 res = tinf_decode_trees(d, &d->ltree, &d->dtree);
463 if (res != TINF_OK) {
473 res = tinf_inflate_uncompressed_block(d);
479 res = tinf_inflate_block_data(d, &d->ltree, &d->dtree);
482 return TINF_DATA_ERROR;
485 if (res == TINF_DONE && !d->bfinal) {
491 if (res != TINF_OK) {
495 }
while (d->dest < d->dest_limit);
static float float float t
void ota_inflate_init(TINF_DATA *d, unsigned char *dict, unsigned int dict_len)
int ota_inflate(TINF_DATA *d)