17#if DETWS_ENABLE_WS_DEFLATE
23constexpr int MAXBITS = 15;
24constexpr int MAXLCODES = 288;
25constexpr int MAXDCODES = 32;
38 short lcount[MAXBITS + 1];
39 short lsym[MAXLCODES];
40 short dcount[MAXBITS + 1];
41 short dsym[MAXDCODES];
42 short lengths[MAXLCODES + 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 <= MAXBITS; len++)
102 int count = h->count[len];
103 if (code - count < first)
104 return h->symbol[index + (code - first)];
115int construct(Huffman *h,
const short *lengths,
int n)
117 for (
int len = 0; len <= MAXBITS; len++)
119 for (
int sym = 0; sym < n; sym++)
120 h->count[lengths[sym]]++;
121 if (h->count[0] == n)
125 for (
int len = 1; len <= MAXBITS; len++)
128 left -= h->count[len];
133 short offs[MAXBITS + 1];
135 for (
int len = 1; len < MAXBITS; len++)
136 offs[len + 1] = offs[len] + h->count[len];
137 for (
int sym = 0; sym < n; sym++)
138 if (lengths[sym] != 0)
139 h->symbol[offs[lengths[sym]]++] = (short)sym;
146InflateResult codes(State *s,
const Huffman *lencode,
const Huffman *distcode)
151 symbol = decode(s, lencode);
153 return InflateResult::INFLATE_ERR_MALFORMED;
156 if (s->outcnt >= s->outcap)
157 return InflateResult::INFLATE_ERR_OVERFLOW;
158 s->out[s->outcnt++] = (uint8_t)symbol;
160 else if (symbol > 256)
164 return InflateResult::INFLATE_ERR_MALFORMED;
165 int len = LEN_BASE[symbol] + bits(s, LEN_EXTRA[symbol]);
167 return InflateResult::INFLATE_ERR_MALFORMED;
169 symbol = decode(s, distcode);
170 if (symbol < 0 || symbol >= 30)
171 return InflateResult::INFLATE_ERR_MALFORMED;
172 size_t dist = (size_t)(DIST_BASE[symbol] + bits(s, DIST_EXTRA[symbol]));
174 return InflateResult::INFLATE_ERR_MALFORMED;
175 if (dist > s->outcnt)
176 return InflateResult::INFLATE_ERR_MALFORMED;
177 if (len > (
int)(s->outcap - s->outcnt))
178 return InflateResult::INFLATE_ERR_OVERFLOW;
179 for (
int k = 0; k < len; k++)
181 s->out[s->outcnt] = s->out[s->outcnt - dist];
185 }
while (symbol != 256);
186 return InflateResult::INFLATE_OK;
190InflateResult stored(State *s)
194 if (s->incnt + 4 > s->inlen)
195 return InflateResult::INFLATE_ERR_MALFORMED;
196 int len = s->in[s->incnt] | (s->in[s->incnt + 1] << 8);
197 int nlen = s->in[s->incnt + 2] | (s->in[s->incnt + 3] << 8);
199 if ((len ^ nlen) != 0xFFFF)
200 return InflateResult::INFLATE_ERR_MALFORMED;
201 if (s->incnt + (
size_t)len > s->inlen)
202 return InflateResult::INFLATE_ERR_MALFORMED;
203 if ((
size_t)len > s->outcap - s->outcnt)
204 return InflateResult::INFLATE_ERR_OVERFLOW;
205 memcpy(s->out + s->outcnt, s->in + s->incnt, (
size_t)len);
206 s->incnt += (size_t)len;
207 s->outcnt += (size_t)len;
208 return InflateResult::INFLATE_OK;
212InflateResult fixed(State *s, Huffman *lencode, Huffman *distcode,
short *lengths)
215 for (; sym < 144; sym++)
217 for (; sym < 256; sym++)
219 for (; sym < 280; sym++)
221 for (; sym < 288; sym++)
223 construct(lencode, lengths, 288);
224 for (sym = 0; sym < 30; sym++)
226 construct(distcode, lengths, 30);
227 return codes(s, lencode, distcode);
231InflateResult dynamic(State *s, Huffman *lencode, Huffman *distcode,
short *lengths)
233 static const short ORDER[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
235 int nlen = bits(s, 5) + 257;
236 int ndist = bits(s, 5) + 1;
237 int ncode = bits(s, 4) + 4;
239 return InflateResult::INFLATE_ERR_MALFORMED;
242 if (nlen > MAXLCODES || ndist > MAXDCODES)
243 return InflateResult::INFLATE_ERR_MALFORMED;
248 for (index = 0; index < ncode; index++)
249 lengths[ORDER[index]] = (
short)bits(s, 3);
251 return InflateResult::INFLATE_ERR_MALFORMED;
252 for (; index < 19; index++)
253 lengths[ORDER[index]] = 0;
256 if (construct(lencode, lengths, 19) != 0)
257 return InflateResult::INFLATE_ERR_MALFORMED;
261 while (index < nlen + ndist)
263 int symbol = decode(s, lencode);
265 return InflateResult::INFLATE_ERR_MALFORMED;
268 lengths[index++] = (short)symbol;
276 return InflateResult::INFLATE_ERR_MALFORMED;
277 repeat_len = lengths[index - 1];
278 repeat = 3 + bits(s, 2);
280 else if (symbol == 17)
282 repeat = 3 + bits(s, 3);
286 repeat = 11 + bits(s, 7);
289 return InflateResult::INFLATE_ERR_MALFORMED;
290 if (index + repeat > nlen + ndist)
291 return InflateResult::INFLATE_ERR_MALFORMED;
293 lengths[index++] = (short)repeat_len;
296 if (lengths[256] == 0)
297 return InflateResult::INFLATE_ERR_MALFORMED;
300 int err = construct(lencode, lengths, nlen);
301 if (err && (err < 0 || nlen != lencode->count[0] + lencode->count[1]))
302 return InflateResult::INFLATE_ERR_MALFORMED;
303 err = construct(distcode, lengths + nlen, ndist);
304 if (err && (err < 0 || ndist != distcode->count[0] + distcode->count[1]))
305 return InflateResult::INFLATE_ERR_MALFORMED;
307 return codes(s, lencode, distcode);
311InflateResult inflate_raw(
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_cap,
size_t *out_len,
312 void *scratch,
size_t scratch_len)
314 if (scratch_len < INFLATE_SCRATCH_SIZE)
315 return InflateResult::INFLATE_ERR_SCRATCH;
317 Tables *t = (Tables *)scratch;
318 Huffman lencode = {t->lcount, t->lsym};
319 Huffman distcode = {t->dcount, t->dsym};
337 if (s.incnt >= s.inlen && s.bitcnt == 0)
341 int type = bits(&s, 2);
343 return InflateResult::INFLATE_ERR_MALFORMED;
349 rc = fixed(&s, &lencode, &distcode, t->lengths);
351 rc = dynamic(&s, &lencode, &distcode, t->lengths);
353 return InflateResult::INFLATE_ERR_MALFORMED;
355 if (rc != InflateResult::INFLATE_OK)
360 return InflateResult::INFLATE_OK;
Bounded RFC 1951 DEFLATE decompressor (INFLATE) - no heap.