17#if PC_ENABLE_WS_DEFLATE
24#define PC_MAXLCODES 288
25#define PC_MAXDCODES 32
38 short lcount[PC_MAXBITS + 1];
39 short lsym[PC_MAXLCODES];
40 short dcount[PC_MAXBITS + 1];
41 short dsym[PC_MAXDCODES];
42 short lengths[PC_MAXLCODES + PC_MAXDCODES];
44static_assert(
sizeof(Tables) <= INFLATE_SCRATCH_SIZE,
"bump INFLATE_SCRATCH_SIZE");
61const short LEN_BASE[29] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
62 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
63const short LEN_EXTRA[29] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};
66const short DIST_BASE[30] = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129,
67 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
68const short DIST_EXTRA[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
69 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
72int bits(State *s,
int need)
75 while (s->bitcnt < need)
77 if (s->incnt >= s->inlen)
82 val |= (long)(s->in[s->incnt++]) << s->bitcnt;
85 s->bitbuf = (int)(val >> need);
87 return (
int)(val & ((1L << need) - 1));
92int decode(State *s,
const Huffman *h)
97 for (
int len = 1; len <= PC_MAXBITS; len++)
104 int count = h->count[len];
105 if (code - count < first)
107 return h->symbol[index + (code - first)];
119int construct(Huffman *h,
const short *lengths,
int n)
121 for (
int len = 0; len <= PC_MAXBITS; len++)
125 for (
int sym = 0; sym < n; sym++)
127 h->count[lengths[sym]]++;
129 if (h->count[0] == n)
135 for (
int len = 1; len <= PC_MAXBITS; len++)
138 left -= h->count[len];
145 short offs[PC_MAXBITS + 1];
147 for (
int len = 1; len < PC_MAXBITS; len++)
149 offs[len + 1] = offs[len] + h->count[len];
151 for (
int sym = 0; sym < n; sym++)
153 if (lengths[sym] != 0)
155 h->symbol[offs[lengths[sym]]++] = (short)sym;
164InflateResult codes(State *s,
const Huffman *lencode,
const Huffman *distcode)
169 symbol = decode(s, lencode);
172 return InflateResult::INFLATE_ERR_MALFORMED;
176 if (s->outcnt >= s->outcap)
178 return InflateResult::INFLATE_ERR_OVERFLOW;
180 s->out[s->outcnt++] = (uint8_t)symbol;
182 else if (symbol > 256)
187 return InflateResult::INFLATE_ERR_MALFORMED;
189 int len = LEN_BASE[symbol] + bits(s, LEN_EXTRA[symbol]);
192 return InflateResult::INFLATE_ERR_MALFORMED;
195 symbol = decode(s, distcode);
196 if (symbol < 0 || symbol >= 30)
198 return InflateResult::INFLATE_ERR_MALFORMED;
200 size_t dist = (size_t)(DIST_BASE[symbol] + bits(s, DIST_EXTRA[symbol]));
203 return InflateResult::INFLATE_ERR_MALFORMED;
205 if (dist > s->outcnt)
207 return InflateResult::INFLATE_ERR_MALFORMED;
209 if (len > (
int)(s->outcap - s->outcnt))
211 return InflateResult::INFLATE_ERR_OVERFLOW;
213 for (
int k = 0; k < len; k++)
215 s->out[s->outcnt] = s->out[s->outcnt - dist];
219 }
while (symbol != 256);
220 return InflateResult::INFLATE_OK;
224InflateResult stored(State *s)
228 if (s->incnt + 4 > s->inlen)
230 return InflateResult::INFLATE_ERR_MALFORMED;
232 int len = s->in[s->incnt] | (s->in[s->incnt + 1] << 8);
233 int nlen = s->in[s->incnt + 2] | (s->in[s->incnt + 3] << 8);
235 if ((len ^ nlen) != 0xFFFF)
237 return InflateResult::INFLATE_ERR_MALFORMED;
239 if (s->incnt + (
size_t)len > s->inlen)
241 return InflateResult::INFLATE_ERR_MALFORMED;
243 if ((
size_t)len > s->outcap - s->outcnt)
245 return InflateResult::INFLATE_ERR_OVERFLOW;
247 memcpy(s->out + s->outcnt, s->in + s->incnt, (
size_t)len);
248 s->incnt += (size_t)len;
249 s->outcnt += (size_t)len;
250 return InflateResult::INFLATE_OK;
254InflateResult fixed(State *s, Huffman *lencode, Huffman *distcode,
short *lengths)
257 for (; sym < 144; sym++)
261 for (; sym < 256; sym++)
265 for (; sym < 280; sym++)
269 for (; sym < 288; sym++)
273 construct(lencode, lengths, 288);
274 for (sym = 0; sym < 30; sym++)
278 construct(distcode, lengths, 30);
279 return codes(s, lencode, distcode);
283InflateResult dynamic(State *s, Huffman *lencode, Huffman *distcode,
short *lengths)
285 static const short ORDER[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
287 int nlen = bits(s, 5) + 257;
288 int ndist = bits(s, 5) + 1;
289 int ncode = bits(s, 4) + 4;
292 return InflateResult::INFLATE_ERR_MALFORMED;
297 if (nlen > PC_MAXLCODES || ndist > PC_MAXDCODES)
299 return InflateResult::INFLATE_ERR_MALFORMED;
305 for (index = 0; index < ncode; index++)
307 lengths[ORDER[index]] = (short)bits(s, 3);
311 return InflateResult::INFLATE_ERR_MALFORMED;
313 for (; index < 19; index++)
315 lengths[ORDER[index]] = 0;
319 if (construct(lencode, lengths, 19) != 0)
321 return InflateResult::INFLATE_ERR_MALFORMED;
326 while (index < nlen + ndist)
328 int symbol = decode(s, lencode);
331 return InflateResult::INFLATE_ERR_MALFORMED;
335 lengths[index++] = (short)symbol;
344 return InflateResult::INFLATE_ERR_MALFORMED;
346 repeat_len = lengths[index - 1];
347 repeat = 3 + bits(s, 2);
349 else if (symbol == 17)
351 repeat = 3 + bits(s, 3);
355 repeat = 11 + bits(s, 7);
359 return InflateResult::INFLATE_ERR_MALFORMED;
361 if (index + repeat > nlen + ndist)
363 return InflateResult::INFLATE_ERR_MALFORMED;
367 lengths[index++] = (short)repeat_len;
371 if (lengths[256] == 0)
373 return InflateResult::INFLATE_ERR_MALFORMED;
377 int err = construct(lencode, lengths, nlen);
378 if (err && (err < 0 || nlen != lencode->count[0] + lencode->count[1]))
380 return InflateResult::INFLATE_ERR_MALFORMED;
382 err = construct(distcode, lengths + nlen, ndist);
383 if (err && (err < 0 || ndist != distcode->count[0] + distcode->count[1]))
385 return InflateResult::INFLATE_ERR_MALFORMED;
388 return codes(s, lencode, distcode);
392InflateResult inflate_raw(
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_cap,
size_t *out_len,
393 void *scratch,
size_t scratch_len)
395 if (scratch_len < INFLATE_SCRATCH_SIZE)
397 return InflateResult::INFLATE_ERR_SCRATCH;
400 Tables *t = (Tables *)scratch;
401 Huffman lencode = {t->lcount, t->lsym};
402 Huffman distcode = {t->dcount, t->dsym};
420 if (s.incnt >= s.inlen && s.bitcnt == 0)
426 int type = bits(&s, 2);
429 return InflateResult::INFLATE_ERR_MALFORMED;
439 rc = fixed(&s, &lencode, &distcode, t->lengths);
443 rc = dynamic(&s, &lencode, &distcode, t->lengths);
447 return InflateResult::INFLATE_ERR_MALFORMED;
450 if (rc != InflateResult::INFLATE_OK)
457 return InflateResult::INFLATE_OK;
Bounded RFC 1951 DEFLATE decompressor (INFLATE) - no heap.