1 | 'use strict';
|
---|
2 |
|
---|
3 | // (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
---|
4 | // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
---|
5 | //
|
---|
6 | // This software is provided 'as-is', without any express or implied
|
---|
7 | // warranty. In no event will the authors be held liable for any damages
|
---|
8 | // arising from the use of this software.
|
---|
9 | //
|
---|
10 | // Permission is granted to anyone to use this software for any purpose,
|
---|
11 | // including commercial applications, and to alter it and redistribute it
|
---|
12 | // freely, subject to the following restrictions:
|
---|
13 | //
|
---|
14 | // 1. The origin of this software must not be misrepresented; you must not
|
---|
15 | // claim that you wrote the original software. If you use this software
|
---|
16 | // in a product, an acknowledgment in the product documentation would be
|
---|
17 | // appreciated but is not required.
|
---|
18 | // 2. Altered source versions must be plainly marked as such, and must not be
|
---|
19 | // misrepresented as being the original software.
|
---|
20 | // 3. This notice may not be removed or altered from any source distribution.
|
---|
21 |
|
---|
22 | var utils = require('../utils/common');
|
---|
23 | var adler32 = require('./adler32');
|
---|
24 | var crc32 = require('./crc32');
|
---|
25 | var inflate_fast = require('./inffast');
|
---|
26 | var inflate_table = require('./inftrees');
|
---|
27 |
|
---|
28 | var CODES = 0;
|
---|
29 | var LENS = 1;
|
---|
30 | var DISTS = 2;
|
---|
31 |
|
---|
32 | /* Public constants ==========================================================*/
|
---|
33 | /* ===========================================================================*/
|
---|
34 |
|
---|
35 |
|
---|
36 | /* Allowed flush values; see deflate() and inflate() below for details */
|
---|
37 | //var Z_NO_FLUSH = 0;
|
---|
38 | //var Z_PARTIAL_FLUSH = 1;
|
---|
39 | //var Z_SYNC_FLUSH = 2;
|
---|
40 | //var Z_FULL_FLUSH = 3;
|
---|
41 | var Z_FINISH = 4;
|
---|
42 | var Z_BLOCK = 5;
|
---|
43 | var Z_TREES = 6;
|
---|
44 |
|
---|
45 |
|
---|
46 | /* Return codes for the compression/decompression functions. Negative values
|
---|
47 | * are errors, positive values are used for special but normal events.
|
---|
48 | */
|
---|
49 | var Z_OK = 0;
|
---|
50 | var Z_STREAM_END = 1;
|
---|
51 | var Z_NEED_DICT = 2;
|
---|
52 | //var Z_ERRNO = -1;
|
---|
53 | var Z_STREAM_ERROR = -2;
|
---|
54 | var Z_DATA_ERROR = -3;
|
---|
55 | var Z_MEM_ERROR = -4;
|
---|
56 | var Z_BUF_ERROR = -5;
|
---|
57 | //var Z_VERSION_ERROR = -6;
|
---|
58 |
|
---|
59 | /* The deflate compression method */
|
---|
60 | var Z_DEFLATED = 8;
|
---|
61 |
|
---|
62 |
|
---|
63 | /* STATES ====================================================================*/
|
---|
64 | /* ===========================================================================*/
|
---|
65 |
|
---|
66 |
|
---|
67 | var HEAD = 1; /* i: waiting for magic header */
|
---|
68 | var FLAGS = 2; /* i: waiting for method and flags (gzip) */
|
---|
69 | var TIME = 3; /* i: waiting for modification time (gzip) */
|
---|
70 | var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
|
---|
71 | var EXLEN = 5; /* i: waiting for extra length (gzip) */
|
---|
72 | var EXTRA = 6; /* i: waiting for extra bytes (gzip) */
|
---|
73 | var NAME = 7; /* i: waiting for end of file name (gzip) */
|
---|
74 | var COMMENT = 8; /* i: waiting for end of comment (gzip) */
|
---|
75 | var HCRC = 9; /* i: waiting for header crc (gzip) */
|
---|
76 | var DICTID = 10; /* i: waiting for dictionary check value */
|
---|
77 | var DICT = 11; /* waiting for inflateSetDictionary() call */
|
---|
78 | var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
|
---|
79 | var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
|
---|
80 | var STORED = 14; /* i: waiting for stored size (length and complement) */
|
---|
81 | var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
|
---|
82 | var COPY = 16; /* i/o: waiting for input or output to copy stored block */
|
---|
83 | var TABLE = 17; /* i: waiting for dynamic block table lengths */
|
---|
84 | var LENLENS = 18; /* i: waiting for code length code lengths */
|
---|
85 | var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
|
---|
86 | var LEN_ = 20; /* i: same as LEN below, but only first time in */
|
---|
87 | var LEN = 21; /* i: waiting for length/lit/eob code */
|
---|
88 | var LENEXT = 22; /* i: waiting for length extra bits */
|
---|
89 | var DIST = 23; /* i: waiting for distance code */
|
---|
90 | var DISTEXT = 24; /* i: waiting for distance extra bits */
|
---|
91 | var MATCH = 25; /* o: waiting for output space to copy string */
|
---|
92 | var LIT = 26; /* o: waiting for output space to write literal */
|
---|
93 | var CHECK = 27; /* i: waiting for 32-bit check value */
|
---|
94 | var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
|
---|
95 | var DONE = 29; /* finished check, done -- remain here until reset */
|
---|
96 | var BAD = 30; /* got a data error -- remain here until reset */
|
---|
97 | var MEM = 31; /* got an inflate() memory error -- remain here until reset */
|
---|
98 | var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
|
---|
99 |
|
---|
100 | /* ===========================================================================*/
|
---|
101 |
|
---|
102 |
|
---|
103 |
|
---|
104 | var ENOUGH_LENS = 852;
|
---|
105 | var ENOUGH_DISTS = 592;
|
---|
106 | //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
|
---|
107 |
|
---|
108 | var MAX_WBITS = 15;
|
---|
109 | /* 32K LZ77 window */
|
---|
110 | var DEF_WBITS = MAX_WBITS;
|
---|
111 |
|
---|
112 |
|
---|
113 | function zswap32(q) {
|
---|
114 | return (((q >>> 24) & 0xff) +
|
---|
115 | ((q >>> 8) & 0xff00) +
|
---|
116 | ((q & 0xff00) << 8) +
|
---|
117 | ((q & 0xff) << 24));
|
---|
118 | }
|
---|
119 |
|
---|
120 |
|
---|
121 | function InflateState() {
|
---|
122 | this.mode = 0; /* current inflate mode */
|
---|
123 | this.last = false; /* true if processing last block */
|
---|
124 | this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
|
---|
125 | this.havedict = false; /* true if dictionary provided */
|
---|
126 | this.flags = 0; /* gzip header method and flags (0 if zlib) */
|
---|
127 | this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
|
---|
128 | this.check = 0; /* protected copy of check value */
|
---|
129 | this.total = 0; /* protected copy of output count */
|
---|
130 | // TODO: may be {}
|
---|
131 | this.head = null; /* where to save gzip header information */
|
---|
132 |
|
---|
133 | /* sliding window */
|
---|
134 | this.wbits = 0; /* log base 2 of requested window size */
|
---|
135 | this.wsize = 0; /* window size or zero if not using window */
|
---|
136 | this.whave = 0; /* valid bytes in the window */
|
---|
137 | this.wnext = 0; /* window write index */
|
---|
138 | this.window = null; /* allocated sliding window, if needed */
|
---|
139 |
|
---|
140 | /* bit accumulator */
|
---|
141 | this.hold = 0; /* input bit accumulator */
|
---|
142 | this.bits = 0; /* number of bits in "in" */
|
---|
143 |
|
---|
144 | /* for string and stored block copying */
|
---|
145 | this.length = 0; /* literal or length of data to copy */
|
---|
146 | this.offset = 0; /* distance back to copy string from */
|
---|
147 |
|
---|
148 | /* for table and code decoding */
|
---|
149 | this.extra = 0; /* extra bits needed */
|
---|
150 |
|
---|
151 | /* fixed and dynamic code tables */
|
---|
152 | this.lencode = null; /* starting table for length/literal codes */
|
---|
153 | this.distcode = null; /* starting table for distance codes */
|
---|
154 | this.lenbits = 0; /* index bits for lencode */
|
---|
155 | this.distbits = 0; /* index bits for distcode */
|
---|
156 |
|
---|
157 | /* dynamic table building */
|
---|
158 | this.ncode = 0; /* number of code length code lengths */
|
---|
159 | this.nlen = 0; /* number of length code lengths */
|
---|
160 | this.ndist = 0; /* number of distance code lengths */
|
---|
161 | this.have = 0; /* number of code lengths in lens[] */
|
---|
162 | this.next = null; /* next available space in codes[] */
|
---|
163 |
|
---|
164 | this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
|
---|
165 | this.work = new utils.Buf16(288); /* work area for code table building */
|
---|
166 |
|
---|
167 | /*
|
---|
168 | because we don't have pointers in js, we use lencode and distcode directly
|
---|
169 | as buffers so we don't need codes
|
---|
170 | */
|
---|
171 | //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
|
---|
172 | this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
|
---|
173 | this.distdyn = null; /* dynamic table for distance codes (JS specific) */
|
---|
174 | this.sane = 0; /* if false, allow invalid distance too far */
|
---|
175 | this.back = 0; /* bits back of last unprocessed length/lit */
|
---|
176 | this.was = 0; /* initial length of match */
|
---|
177 | }
|
---|
178 |
|
---|
179 | function inflateResetKeep(strm) {
|
---|
180 | var state;
|
---|
181 |
|
---|
182 | if (!strm || !strm.state) { return Z_STREAM_ERROR; }
|
---|
183 | state = strm.state;
|
---|
184 | strm.total_in = strm.total_out = state.total = 0;
|
---|
185 | strm.msg = ''; /*Z_NULL*/
|
---|
186 | if (state.wrap) { /* to support ill-conceived Java test suite */
|
---|
187 | strm.adler = state.wrap & 1;
|
---|
188 | }
|
---|
189 | state.mode = HEAD;
|
---|
190 | state.last = 0;
|
---|
191 | state.havedict = 0;
|
---|
192 | state.dmax = 32768;
|
---|
193 | state.head = null/*Z_NULL*/;
|
---|
194 | state.hold = 0;
|
---|
195 | state.bits = 0;
|
---|
196 | //state.lencode = state.distcode = state.next = state.codes;
|
---|
197 | state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
|
---|
198 | state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
|
---|
199 |
|
---|
200 | state.sane = 1;
|
---|
201 | state.back = -1;
|
---|
202 | //Tracev((stderr, "inflate: reset\n"));
|
---|
203 | return Z_OK;
|
---|
204 | }
|
---|
205 |
|
---|
206 | function inflateReset(strm) {
|
---|
207 | var state;
|
---|
208 |
|
---|
209 | if (!strm || !strm.state) { return Z_STREAM_ERROR; }
|
---|
210 | state = strm.state;
|
---|
211 | state.wsize = 0;
|
---|
212 | state.whave = 0;
|
---|
213 | state.wnext = 0;
|
---|
214 | return inflateResetKeep(strm);
|
---|
215 |
|
---|
216 | }
|
---|
217 |
|
---|
218 | function inflateReset2(strm, windowBits) {
|
---|
219 | var wrap;
|
---|
220 | var state;
|
---|
221 |
|
---|
222 | /* get the state */
|
---|
223 | if (!strm || !strm.state) { return Z_STREAM_ERROR; }
|
---|
224 | state = strm.state;
|
---|
225 |
|
---|
226 | /* extract wrap request from windowBits parameter */
|
---|
227 | if (windowBits < 0) {
|
---|
228 | wrap = 0;
|
---|
229 | windowBits = -windowBits;
|
---|
230 | }
|
---|
231 | else {
|
---|
232 | wrap = (windowBits >> 4) + 1;
|
---|
233 | if (windowBits < 48) {
|
---|
234 | windowBits &= 15;
|
---|
235 | }
|
---|
236 | }
|
---|
237 |
|
---|
238 | /* set number of window bits, free window if different */
|
---|
239 | if (windowBits && (windowBits < 8 || windowBits > 15)) {
|
---|
240 | return Z_STREAM_ERROR;
|
---|
241 | }
|
---|
242 | if (state.window !== null && state.wbits !== windowBits) {
|
---|
243 | state.window = null;
|
---|
244 | }
|
---|
245 |
|
---|
246 | /* update state and reset the rest of it */
|
---|
247 | state.wrap = wrap;
|
---|
248 | state.wbits = windowBits;
|
---|
249 | return inflateReset(strm);
|
---|
250 | }
|
---|
251 |
|
---|
252 | function inflateInit2(strm, windowBits) {
|
---|
253 | var ret;
|
---|
254 | var state;
|
---|
255 |
|
---|
256 | if (!strm) { return Z_STREAM_ERROR; }
|
---|
257 | //strm.msg = Z_NULL; /* in case we return an error */
|
---|
258 |
|
---|
259 | state = new InflateState();
|
---|
260 |
|
---|
261 | //if (state === Z_NULL) return Z_MEM_ERROR;
|
---|
262 | //Tracev((stderr, "inflate: allocated\n"));
|
---|
263 | strm.state = state;
|
---|
264 | state.window = null/*Z_NULL*/;
|
---|
265 | ret = inflateReset2(strm, windowBits);
|
---|
266 | if (ret !== Z_OK) {
|
---|
267 | strm.state = null/*Z_NULL*/;
|
---|
268 | }
|
---|
269 | return ret;
|
---|
270 | }
|
---|
271 |
|
---|
272 | function inflateInit(strm) {
|
---|
273 | return inflateInit2(strm, DEF_WBITS);
|
---|
274 | }
|
---|
275 |
|
---|
276 |
|
---|
277 | /*
|
---|
278 | Return state with length and distance decoding tables and index sizes set to
|
---|
279 | fixed code decoding. Normally this returns fixed tables from inffixed.h.
|
---|
280 | If BUILDFIXED is defined, then instead this routine builds the tables the
|
---|
281 | first time it's called, and returns those tables the first time and
|
---|
282 | thereafter. This reduces the size of the code by about 2K bytes, in
|
---|
283 | exchange for a little execution time. However, BUILDFIXED should not be
|
---|
284 | used for threaded applications, since the rewriting of the tables and virgin
|
---|
285 | may not be thread-safe.
|
---|
286 | */
|
---|
287 | var virgin = true;
|
---|
288 |
|
---|
289 | var lenfix, distfix; // We have no pointers in JS, so keep tables separate
|
---|
290 |
|
---|
291 | function fixedtables(state) {
|
---|
292 | /* build fixed huffman tables if first call (may not be thread safe) */
|
---|
293 | if (virgin) {
|
---|
294 | var sym;
|
---|
295 |
|
---|
296 | lenfix = new utils.Buf32(512);
|
---|
297 | distfix = new utils.Buf32(32);
|
---|
298 |
|
---|
299 | /* literal/length table */
|
---|
300 | sym = 0;
|
---|
301 | while (sym < 144) { state.lens[sym++] = 8; }
|
---|
302 | while (sym < 256) { state.lens[sym++] = 9; }
|
---|
303 | while (sym < 280) { state.lens[sym++] = 7; }
|
---|
304 | while (sym < 288) { state.lens[sym++] = 8; }
|
---|
305 |
|
---|
306 | inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });
|
---|
307 |
|
---|
308 | /* distance table */
|
---|
309 | sym = 0;
|
---|
310 | while (sym < 32) { state.lens[sym++] = 5; }
|
---|
311 |
|
---|
312 | inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });
|
---|
313 |
|
---|
314 | /* do this just once */
|
---|
315 | virgin = false;
|
---|
316 | }
|
---|
317 |
|
---|
318 | state.lencode = lenfix;
|
---|
319 | state.lenbits = 9;
|
---|
320 | state.distcode = distfix;
|
---|
321 | state.distbits = 5;
|
---|
322 | }
|
---|
323 |
|
---|
324 |
|
---|
325 | /*
|
---|
326 | Update the window with the last wsize (normally 32K) bytes written before
|
---|
327 | returning. If window does not exist yet, create it. This is only called
|
---|
328 | when a window is already in use, or when output has been written during this
|
---|
329 | inflate call, but the end of the deflate stream has not been reached yet.
|
---|
330 | It is also called to create a window for dictionary data when a dictionary
|
---|
331 | is loaded.
|
---|
332 |
|
---|
333 | Providing output buffers larger than 32K to inflate() should provide a speed
|
---|
334 | advantage, since only the last 32K of output is copied to the sliding window
|
---|
335 | upon return from inflate(), and since all distances after the first 32K of
|
---|
336 | output will fall in the output data, making match copies simpler and faster.
|
---|
337 | The advantage may be dependent on the size of the processor's data caches.
|
---|
338 | */
|
---|
339 | function updatewindow(strm, src, end, copy) {
|
---|
340 | var dist;
|
---|
341 | var state = strm.state;
|
---|
342 |
|
---|
343 | /* if it hasn't been done already, allocate space for the window */
|
---|
344 | if (state.window === null) {
|
---|
345 | state.wsize = 1 << state.wbits;
|
---|
346 | state.wnext = 0;
|
---|
347 | state.whave = 0;
|
---|
348 |
|
---|
349 | state.window = new utils.Buf8(state.wsize);
|
---|
350 | }
|
---|
351 |
|
---|
352 | /* copy state->wsize or less output bytes into the circular window */
|
---|
353 | if (copy >= state.wsize) {
|
---|
354 | utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
|
---|
355 | state.wnext = 0;
|
---|
356 | state.whave = state.wsize;
|
---|
357 | }
|
---|
358 | else {
|
---|
359 | dist = state.wsize - state.wnext;
|
---|
360 | if (dist > copy) {
|
---|
361 | dist = copy;
|
---|
362 | }
|
---|
363 | //zmemcpy(state->window + state->wnext, end - copy, dist);
|
---|
364 | utils.arraySet(state.window, src, end - copy, dist, state.wnext);
|
---|
365 | copy -= dist;
|
---|
366 | if (copy) {
|
---|
367 | //zmemcpy(state->window, end - copy, copy);
|
---|
368 | utils.arraySet(state.window, src, end - copy, copy, 0);
|
---|
369 | state.wnext = copy;
|
---|
370 | state.whave = state.wsize;
|
---|
371 | }
|
---|
372 | else {
|
---|
373 | state.wnext += dist;
|
---|
374 | if (state.wnext === state.wsize) { state.wnext = 0; }
|
---|
375 | if (state.whave < state.wsize) { state.whave += dist; }
|
---|
376 | }
|
---|
377 | }
|
---|
378 | return 0;
|
---|
379 | }
|
---|
380 |
|
---|
381 | function inflate(strm, flush) {
|
---|
382 | var state;
|
---|
383 | var input, output; // input/output buffers
|
---|
384 | var next; /* next input INDEX */
|
---|
385 | var put; /* next output INDEX */
|
---|
386 | var have, left; /* available input and output */
|
---|
387 | var hold; /* bit buffer */
|
---|
388 | var bits; /* bits in bit buffer */
|
---|
389 | var _in, _out; /* save starting available input and output */
|
---|
390 | var copy; /* number of stored or match bytes to copy */
|
---|
391 | var from; /* where to copy match bytes from */
|
---|
392 | var from_source;
|
---|
393 | var here = 0; /* current decoding table entry */
|
---|
394 | var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
|
---|
395 | //var last; /* parent table entry */
|
---|
396 | var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
|
---|
397 | var len; /* length to copy for repeats, bits to drop */
|
---|
398 | var ret; /* return code */
|
---|
399 | var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */
|
---|
400 | var opts;
|
---|
401 |
|
---|
402 | var n; // temporary var for NEED_BITS
|
---|
403 |
|
---|
404 | var order = /* permutation of code lengths */
|
---|
405 | [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
|
---|
406 |
|
---|
407 |
|
---|
408 | if (!strm || !strm.state || !strm.output ||
|
---|
409 | (!strm.input && strm.avail_in !== 0)) {
|
---|
410 | return Z_STREAM_ERROR;
|
---|
411 | }
|
---|
412 |
|
---|
413 | state = strm.state;
|
---|
414 | if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */
|
---|
415 |
|
---|
416 |
|
---|
417 | //--- LOAD() ---
|
---|
418 | put = strm.next_out;
|
---|
419 | output = strm.output;
|
---|
420 | left = strm.avail_out;
|
---|
421 | next = strm.next_in;
|
---|
422 | input = strm.input;
|
---|
423 | have = strm.avail_in;
|
---|
424 | hold = state.hold;
|
---|
425 | bits = state.bits;
|
---|
426 | //---
|
---|
427 |
|
---|
428 | _in = have;
|
---|
429 | _out = left;
|
---|
430 | ret = Z_OK;
|
---|
431 |
|
---|
432 | inf_leave: // goto emulation
|
---|
433 | for (;;) {
|
---|
434 | switch (state.mode) {
|
---|
435 | case HEAD:
|
---|
436 | if (state.wrap === 0) {
|
---|
437 | state.mode = TYPEDO;
|
---|
438 | break;
|
---|
439 | }
|
---|
440 | //=== NEEDBITS(16);
|
---|
441 | while (bits < 16) {
|
---|
442 | if (have === 0) { break inf_leave; }
|
---|
443 | have--;
|
---|
444 | hold += input[next++] << bits;
|
---|
445 | bits += 8;
|
---|
446 | }
|
---|
447 | //===//
|
---|
448 | if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
|
---|
449 | state.check = 0/*crc32(0L, Z_NULL, 0)*/;
|
---|
450 | //=== CRC2(state.check, hold);
|
---|
451 | hbuf[0] = hold & 0xff;
|
---|
452 | hbuf[1] = (hold >>> 8) & 0xff;
|
---|
453 | state.check = crc32(state.check, hbuf, 2, 0);
|
---|
454 | //===//
|
---|
455 |
|
---|
456 | //=== INITBITS();
|
---|
457 | hold = 0;
|
---|
458 | bits = 0;
|
---|
459 | //===//
|
---|
460 | state.mode = FLAGS;
|
---|
461 | break;
|
---|
462 | }
|
---|
463 | state.flags = 0; /* expect zlib header */
|
---|
464 | if (state.head) {
|
---|
465 | state.head.done = false;
|
---|
466 | }
|
---|
467 | if (!(state.wrap & 1) || /* check if zlib header allowed */
|
---|
468 | (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
|
---|
469 | strm.msg = 'incorrect header check';
|
---|
470 | state.mode = BAD;
|
---|
471 | break;
|
---|
472 | }
|
---|
473 | if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
|
---|
474 | strm.msg = 'unknown compression method';
|
---|
475 | state.mode = BAD;
|
---|
476 | break;
|
---|
477 | }
|
---|
478 | //--- DROPBITS(4) ---//
|
---|
479 | hold >>>= 4;
|
---|
480 | bits -= 4;
|
---|
481 | //---//
|
---|
482 | len = (hold & 0x0f)/*BITS(4)*/ + 8;
|
---|
483 | if (state.wbits === 0) {
|
---|
484 | state.wbits = len;
|
---|
485 | }
|
---|
486 | else if (len > state.wbits) {
|
---|
487 | strm.msg = 'invalid window size';
|
---|
488 | state.mode = BAD;
|
---|
489 | break;
|
---|
490 | }
|
---|
491 | state.dmax = 1 << len;
|
---|
492 | //Tracev((stderr, "inflate: zlib header ok\n"));
|
---|
493 | strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
|
---|
494 | state.mode = hold & 0x200 ? DICTID : TYPE;
|
---|
495 | //=== INITBITS();
|
---|
496 | hold = 0;
|
---|
497 | bits = 0;
|
---|
498 | //===//
|
---|
499 | break;
|
---|
500 | case FLAGS:
|
---|
501 | //=== NEEDBITS(16); */
|
---|
502 | while (bits < 16) {
|
---|
503 | if (have === 0) { break inf_leave; }
|
---|
504 | have--;
|
---|
505 | hold += input[next++] << bits;
|
---|
506 | bits += 8;
|
---|
507 | }
|
---|
508 | //===//
|
---|
509 | state.flags = hold;
|
---|
510 | if ((state.flags & 0xff) !== Z_DEFLATED) {
|
---|
511 | strm.msg = 'unknown compression method';
|
---|
512 | state.mode = BAD;
|
---|
513 | break;
|
---|
514 | }
|
---|
515 | if (state.flags & 0xe000) {
|
---|
516 | strm.msg = 'unknown header flags set';
|
---|
517 | state.mode = BAD;
|
---|
518 | break;
|
---|
519 | }
|
---|
520 | if (state.head) {
|
---|
521 | state.head.text = ((hold >> 8) & 1);
|
---|
522 | }
|
---|
523 | if (state.flags & 0x0200) {
|
---|
524 | //=== CRC2(state.check, hold);
|
---|
525 | hbuf[0] = hold & 0xff;
|
---|
526 | hbuf[1] = (hold >>> 8) & 0xff;
|
---|
527 | state.check = crc32(state.check, hbuf, 2, 0);
|
---|
528 | //===//
|
---|
529 | }
|
---|
530 | //=== INITBITS();
|
---|
531 | hold = 0;
|
---|
532 | bits = 0;
|
---|
533 | //===//
|
---|
534 | state.mode = TIME;
|
---|
535 | /* falls through */
|
---|
536 | case TIME:
|
---|
537 | //=== NEEDBITS(32); */
|
---|
538 | while (bits < 32) {
|
---|
539 | if (have === 0) { break inf_leave; }
|
---|
540 | have--;
|
---|
541 | hold += input[next++] << bits;
|
---|
542 | bits += 8;
|
---|
543 | }
|
---|
544 | //===//
|
---|
545 | if (state.head) {
|
---|
546 | state.head.time = hold;
|
---|
547 | }
|
---|
548 | if (state.flags & 0x0200) {
|
---|
549 | //=== CRC4(state.check, hold)
|
---|
550 | hbuf[0] = hold & 0xff;
|
---|
551 | hbuf[1] = (hold >>> 8) & 0xff;
|
---|
552 | hbuf[2] = (hold >>> 16) & 0xff;
|
---|
553 | hbuf[3] = (hold >>> 24) & 0xff;
|
---|
554 | state.check = crc32(state.check, hbuf, 4, 0);
|
---|
555 | //===
|
---|
556 | }
|
---|
557 | //=== INITBITS();
|
---|
558 | hold = 0;
|
---|
559 | bits = 0;
|
---|
560 | //===//
|
---|
561 | state.mode = OS;
|
---|
562 | /* falls through */
|
---|
563 | case OS:
|
---|
564 | //=== NEEDBITS(16); */
|
---|
565 | while (bits < 16) {
|
---|
566 | if (have === 0) { break inf_leave; }
|
---|
567 | have--;
|
---|
568 | hold += input[next++] << bits;
|
---|
569 | bits += 8;
|
---|
570 | }
|
---|
571 | //===//
|
---|
572 | if (state.head) {
|
---|
573 | state.head.xflags = (hold & 0xff);
|
---|
574 | state.head.os = (hold >> 8);
|
---|
575 | }
|
---|
576 | if (state.flags & 0x0200) {
|
---|
577 | //=== CRC2(state.check, hold);
|
---|
578 | hbuf[0] = hold & 0xff;
|
---|
579 | hbuf[1] = (hold >>> 8) & 0xff;
|
---|
580 | state.check = crc32(state.check, hbuf, 2, 0);
|
---|
581 | //===//
|
---|
582 | }
|
---|
583 | //=== INITBITS();
|
---|
584 | hold = 0;
|
---|
585 | bits = 0;
|
---|
586 | //===//
|
---|
587 | state.mode = EXLEN;
|
---|
588 | /* falls through */
|
---|
589 | case EXLEN:
|
---|
590 | if (state.flags & 0x0400) {
|
---|
591 | //=== NEEDBITS(16); */
|
---|
592 | while (bits < 16) {
|
---|
593 | if (have === 0) { break inf_leave; }
|
---|
594 | have--;
|
---|
595 | hold += input[next++] << bits;
|
---|
596 | bits += 8;
|
---|
597 | }
|
---|
598 | //===//
|
---|
599 | state.length = hold;
|
---|
600 | if (state.head) {
|
---|
601 | state.head.extra_len = hold;
|
---|
602 | }
|
---|
603 | if (state.flags & 0x0200) {
|
---|
604 | //=== CRC2(state.check, hold);
|
---|
605 | hbuf[0] = hold & 0xff;
|
---|
606 | hbuf[1] = (hold >>> 8) & 0xff;
|
---|
607 | state.check = crc32(state.check, hbuf, 2, 0);
|
---|
608 | //===//
|
---|
609 | }
|
---|
610 | //=== INITBITS();
|
---|
611 | hold = 0;
|
---|
612 | bits = 0;
|
---|
613 | //===//
|
---|
614 | }
|
---|
615 | else if (state.head) {
|
---|
616 | state.head.extra = null/*Z_NULL*/;
|
---|
617 | }
|
---|
618 | state.mode = EXTRA;
|
---|
619 | /* falls through */
|
---|
620 | case EXTRA:
|
---|
621 | if (state.flags & 0x0400) {
|
---|
622 | copy = state.length;
|
---|
623 | if (copy > have) { copy = have; }
|
---|
624 | if (copy) {
|
---|
625 | if (state.head) {
|
---|
626 | len = state.head.extra_len - state.length;
|
---|
627 | if (!state.head.extra) {
|
---|
628 | // Use untyped array for more convenient processing later
|
---|
629 | state.head.extra = new Array(state.head.extra_len);
|
---|
630 | }
|
---|
631 | utils.arraySet(
|
---|
632 | state.head.extra,
|
---|
633 | input,
|
---|
634 | next,
|
---|
635 | // extra field is limited to 65536 bytes
|
---|
636 | // - no need for additional size check
|
---|
637 | copy,
|
---|
638 | /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
|
---|
639 | len
|
---|
640 | );
|
---|
641 | //zmemcpy(state.head.extra + len, next,
|
---|
642 | // len + copy > state.head.extra_max ?
|
---|
643 | // state.head.extra_max - len : copy);
|
---|
644 | }
|
---|
645 | if (state.flags & 0x0200) {
|
---|
646 | state.check = crc32(state.check, input, copy, next);
|
---|
647 | }
|
---|
648 | have -= copy;
|
---|
649 | next += copy;
|
---|
650 | state.length -= copy;
|
---|
651 | }
|
---|
652 | if (state.length) { break inf_leave; }
|
---|
653 | }
|
---|
654 | state.length = 0;
|
---|
655 | state.mode = NAME;
|
---|
656 | /* falls through */
|
---|
657 | case NAME:
|
---|
658 | if (state.flags & 0x0800) {
|
---|
659 | if (have === 0) { break inf_leave; }
|
---|
660 | copy = 0;
|
---|
661 | do {
|
---|
662 | // TODO: 2 or 1 bytes?
|
---|
663 | len = input[next + copy++];
|
---|
664 | /* use constant limit because in js we should not preallocate memory */
|
---|
665 | if (state.head && len &&
|
---|
666 | (state.length < 65536 /*state.head.name_max*/)) {
|
---|
667 | state.head.name += String.fromCharCode(len);
|
---|
668 | }
|
---|
669 | } while (len && copy < have);
|
---|
670 |
|
---|
671 | if (state.flags & 0x0200) {
|
---|
672 | state.check = crc32(state.check, input, copy, next);
|
---|
673 | }
|
---|
674 | have -= copy;
|
---|
675 | next += copy;
|
---|
676 | if (len) { break inf_leave; }
|
---|
677 | }
|
---|
678 | else if (state.head) {
|
---|
679 | state.head.name = null;
|
---|
680 | }
|
---|
681 | state.length = 0;
|
---|
682 | state.mode = COMMENT;
|
---|
683 | /* falls through */
|
---|
684 | case COMMENT:
|
---|
685 | if (state.flags & 0x1000) {
|
---|
686 | if (have === 0) { break inf_leave; }
|
---|
687 | copy = 0;
|
---|
688 | do {
|
---|
689 | len = input[next + copy++];
|
---|
690 | /* use constant limit because in js we should not preallocate memory */
|
---|
691 | if (state.head && len &&
|
---|
692 | (state.length < 65536 /*state.head.comm_max*/)) {
|
---|
693 | state.head.comment += String.fromCharCode(len);
|
---|
694 | }
|
---|
695 | } while (len && copy < have);
|
---|
696 | if (state.flags & 0x0200) {
|
---|
697 | state.check = crc32(state.check, input, copy, next);
|
---|
698 | }
|
---|
699 | have -= copy;
|
---|
700 | next += copy;
|
---|
701 | if (len) { break inf_leave; }
|
---|
702 | }
|
---|
703 | else if (state.head) {
|
---|
704 | state.head.comment = null;
|
---|
705 | }
|
---|
706 | state.mode = HCRC;
|
---|
707 | /* falls through */
|
---|
708 | case HCRC:
|
---|
709 | if (state.flags & 0x0200) {
|
---|
710 | //=== NEEDBITS(16); */
|
---|
711 | while (bits < 16) {
|
---|
712 | if (have === 0) { break inf_leave; }
|
---|
713 | have--;
|
---|
714 | hold += input[next++] << bits;
|
---|
715 | bits += 8;
|
---|
716 | }
|
---|
717 | //===//
|
---|
718 | if (hold !== (state.check & 0xffff)) {
|
---|
719 | strm.msg = 'header crc mismatch';
|
---|
720 | state.mode = BAD;
|
---|
721 | break;
|
---|
722 | }
|
---|
723 | //=== INITBITS();
|
---|
724 | hold = 0;
|
---|
725 | bits = 0;
|
---|
726 | //===//
|
---|
727 | }
|
---|
728 | if (state.head) {
|
---|
729 | state.head.hcrc = ((state.flags >> 9) & 1);
|
---|
730 | state.head.done = true;
|
---|
731 | }
|
---|
732 | strm.adler = state.check = 0;
|
---|
733 | state.mode = TYPE;
|
---|
734 | break;
|
---|
735 | case DICTID:
|
---|
736 | //=== NEEDBITS(32); */
|
---|
737 | while (bits < 32) {
|
---|
738 | if (have === 0) { break inf_leave; }
|
---|
739 | have--;
|
---|
740 | hold += input[next++] << bits;
|
---|
741 | bits += 8;
|
---|
742 | }
|
---|
743 | //===//
|
---|
744 | strm.adler = state.check = zswap32(hold);
|
---|
745 | //=== INITBITS();
|
---|
746 | hold = 0;
|
---|
747 | bits = 0;
|
---|
748 | //===//
|
---|
749 | state.mode = DICT;
|
---|
750 | /* falls through */
|
---|
751 | case DICT:
|
---|
752 | if (state.havedict === 0) {
|
---|
753 | //--- RESTORE() ---
|
---|
754 | strm.next_out = put;
|
---|
755 | strm.avail_out = left;
|
---|
756 | strm.next_in = next;
|
---|
757 | strm.avail_in = have;
|
---|
758 | state.hold = hold;
|
---|
759 | state.bits = bits;
|
---|
760 | //---
|
---|
761 | return Z_NEED_DICT;
|
---|
762 | }
|
---|
763 | strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
|
---|
764 | state.mode = TYPE;
|
---|
765 | /* falls through */
|
---|
766 | case TYPE:
|
---|
767 | if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
|
---|
768 | /* falls through */
|
---|
769 | case TYPEDO:
|
---|
770 | if (state.last) {
|
---|
771 | //--- BYTEBITS() ---//
|
---|
772 | hold >>>= bits & 7;
|
---|
773 | bits -= bits & 7;
|
---|
774 | //---//
|
---|
775 | state.mode = CHECK;
|
---|
776 | break;
|
---|
777 | }
|
---|
778 | //=== NEEDBITS(3); */
|
---|
779 | while (bits < 3) {
|
---|
780 | if (have === 0) { break inf_leave; }
|
---|
781 | have--;
|
---|
782 | hold += input[next++] << bits;
|
---|
783 | bits += 8;
|
---|
784 | }
|
---|
785 | //===//
|
---|
786 | state.last = (hold & 0x01)/*BITS(1)*/;
|
---|
787 | //--- DROPBITS(1) ---//
|
---|
788 | hold >>>= 1;
|
---|
789 | bits -= 1;
|
---|
790 | //---//
|
---|
791 |
|
---|
792 | switch ((hold & 0x03)/*BITS(2)*/) {
|
---|
793 | case 0: /* stored block */
|
---|
794 | //Tracev((stderr, "inflate: stored block%s\n",
|
---|
795 | // state.last ? " (last)" : ""));
|
---|
796 | state.mode = STORED;
|
---|
797 | break;
|
---|
798 | case 1: /* fixed block */
|
---|
799 | fixedtables(state);
|
---|
800 | //Tracev((stderr, "inflate: fixed codes block%s\n",
|
---|
801 | // state.last ? " (last)" : ""));
|
---|
802 | state.mode = LEN_; /* decode codes */
|
---|
803 | if (flush === Z_TREES) {
|
---|
804 | //--- DROPBITS(2) ---//
|
---|
805 | hold >>>= 2;
|
---|
806 | bits -= 2;
|
---|
807 | //---//
|
---|
808 | break inf_leave;
|
---|
809 | }
|
---|
810 | break;
|
---|
811 | case 2: /* dynamic block */
|
---|
812 | //Tracev((stderr, "inflate: dynamic codes block%s\n",
|
---|
813 | // state.last ? " (last)" : ""));
|
---|
814 | state.mode = TABLE;
|
---|
815 | break;
|
---|
816 | case 3:
|
---|
817 | strm.msg = 'invalid block type';
|
---|
818 | state.mode = BAD;
|
---|
819 | }
|
---|
820 | //--- DROPBITS(2) ---//
|
---|
821 | hold >>>= 2;
|
---|
822 | bits -= 2;
|
---|
823 | //---//
|
---|
824 | break;
|
---|
825 | case STORED:
|
---|
826 | //--- BYTEBITS() ---// /* go to byte boundary */
|
---|
827 | hold >>>= bits & 7;
|
---|
828 | bits -= bits & 7;
|
---|
829 | //---//
|
---|
830 | //=== NEEDBITS(32); */
|
---|
831 | while (bits < 32) {
|
---|
832 | if (have === 0) { break inf_leave; }
|
---|
833 | have--;
|
---|
834 | hold += input[next++] << bits;
|
---|
835 | bits += 8;
|
---|
836 | }
|
---|
837 | //===//
|
---|
838 | if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
|
---|
839 | strm.msg = 'invalid stored block lengths';
|
---|
840 | state.mode = BAD;
|
---|
841 | break;
|
---|
842 | }
|
---|
843 | state.length = hold & 0xffff;
|
---|
844 | //Tracev((stderr, "inflate: stored length %u\n",
|
---|
845 | // state.length));
|
---|
846 | //=== INITBITS();
|
---|
847 | hold = 0;
|
---|
848 | bits = 0;
|
---|
849 | //===//
|
---|
850 | state.mode = COPY_;
|
---|
851 | if (flush === Z_TREES) { break inf_leave; }
|
---|
852 | /* falls through */
|
---|
853 | case COPY_:
|
---|
854 | state.mode = COPY;
|
---|
855 | /* falls through */
|
---|
856 | case COPY:
|
---|
857 | copy = state.length;
|
---|
858 | if (copy) {
|
---|
859 | if (copy > have) { copy = have; }
|
---|
860 | if (copy > left) { copy = left; }
|
---|
861 | if (copy === 0) { break inf_leave; }
|
---|
862 | //--- zmemcpy(put, next, copy); ---
|
---|
863 | utils.arraySet(output, input, next, copy, put);
|
---|
864 | //---//
|
---|
865 | have -= copy;
|
---|
866 | next += copy;
|
---|
867 | left -= copy;
|
---|
868 | put += copy;
|
---|
869 | state.length -= copy;
|
---|
870 | break;
|
---|
871 | }
|
---|
872 | //Tracev((stderr, "inflate: stored end\n"));
|
---|
873 | state.mode = TYPE;
|
---|
874 | break;
|
---|
875 | case TABLE:
|
---|
876 | //=== NEEDBITS(14); */
|
---|
877 | while (bits < 14) {
|
---|
878 | if (have === 0) { break inf_leave; }
|
---|
879 | have--;
|
---|
880 | hold += input[next++] << bits;
|
---|
881 | bits += 8;
|
---|
882 | }
|
---|
883 | //===//
|
---|
884 | state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
|
---|
885 | //--- DROPBITS(5) ---//
|
---|
886 | hold >>>= 5;
|
---|
887 | bits -= 5;
|
---|
888 | //---//
|
---|
889 | state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
|
---|
890 | //--- DROPBITS(5) ---//
|
---|
891 | hold >>>= 5;
|
---|
892 | bits -= 5;
|
---|
893 | //---//
|
---|
894 | state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
|
---|
895 | //--- DROPBITS(4) ---//
|
---|
896 | hold >>>= 4;
|
---|
897 | bits -= 4;
|
---|
898 | //---//
|
---|
899 | //#ifndef PKZIP_BUG_WORKAROUND
|
---|
900 | if (state.nlen > 286 || state.ndist > 30) {
|
---|
901 | strm.msg = 'too many length or distance symbols';
|
---|
902 | state.mode = BAD;
|
---|
903 | break;
|
---|
904 | }
|
---|
905 | //#endif
|
---|
906 | //Tracev((stderr, "inflate: table sizes ok\n"));
|
---|
907 | state.have = 0;
|
---|
908 | state.mode = LENLENS;
|
---|
909 | /* falls through */
|
---|
910 | case LENLENS:
|
---|
911 | while (state.have < state.ncode) {
|
---|
912 | //=== NEEDBITS(3);
|
---|
913 | while (bits < 3) {
|
---|
914 | if (have === 0) { break inf_leave; }
|
---|
915 | have--;
|
---|
916 | hold += input[next++] << bits;
|
---|
917 | bits += 8;
|
---|
918 | }
|
---|
919 | //===//
|
---|
920 | state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
|
---|
921 | //--- DROPBITS(3) ---//
|
---|
922 | hold >>>= 3;
|
---|
923 | bits -= 3;
|
---|
924 | //---//
|
---|
925 | }
|
---|
926 | while (state.have < 19) {
|
---|
927 | state.lens[order[state.have++]] = 0;
|
---|
928 | }
|
---|
929 | // We have separate tables & no pointers. 2 commented lines below not needed.
|
---|
930 | //state.next = state.codes;
|
---|
931 | //state.lencode = state.next;
|
---|
932 | // Switch to use dynamic table
|
---|
933 | state.lencode = state.lendyn;
|
---|
934 | state.lenbits = 7;
|
---|
935 |
|
---|
936 | opts = { bits: state.lenbits };
|
---|
937 | ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
|
---|
938 | state.lenbits = opts.bits;
|
---|
939 |
|
---|
940 | if (ret) {
|
---|
941 | strm.msg = 'invalid code lengths set';
|
---|
942 | state.mode = BAD;
|
---|
943 | break;
|
---|
944 | }
|
---|
945 | //Tracev((stderr, "inflate: code lengths ok\n"));
|
---|
946 | state.have = 0;
|
---|
947 | state.mode = CODELENS;
|
---|
948 | /* falls through */
|
---|
949 | case CODELENS:
|
---|
950 | while (state.have < state.nlen + state.ndist) {
|
---|
951 | for (;;) {
|
---|
952 | here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
|
---|
953 | here_bits = here >>> 24;
|
---|
954 | here_op = (here >>> 16) & 0xff;
|
---|
955 | here_val = here & 0xffff;
|
---|
956 |
|
---|
957 | if ((here_bits) <= bits) { break; }
|
---|
958 | //--- PULLBYTE() ---//
|
---|
959 | if (have === 0) { break inf_leave; }
|
---|
960 | have--;
|
---|
961 | hold += input[next++] << bits;
|
---|
962 | bits += 8;
|
---|
963 | //---//
|
---|
964 | }
|
---|
965 | if (here_val < 16) {
|
---|
966 | //--- DROPBITS(here.bits) ---//
|
---|
967 | hold >>>= here_bits;
|
---|
968 | bits -= here_bits;
|
---|
969 | //---//
|
---|
970 | state.lens[state.have++] = here_val;
|
---|
971 | }
|
---|
972 | else {
|
---|
973 | if (here_val === 16) {
|
---|
974 | //=== NEEDBITS(here.bits + 2);
|
---|
975 | n = here_bits + 2;
|
---|
976 | while (bits < n) {
|
---|
977 | if (have === 0) { break inf_leave; }
|
---|
978 | have--;
|
---|
979 | hold += input[next++] << bits;
|
---|
980 | bits += 8;
|
---|
981 | }
|
---|
982 | //===//
|
---|
983 | //--- DROPBITS(here.bits) ---//
|
---|
984 | hold >>>= here_bits;
|
---|
985 | bits -= here_bits;
|
---|
986 | //---//
|
---|
987 | if (state.have === 0) {
|
---|
988 | strm.msg = 'invalid bit length repeat';
|
---|
989 | state.mode = BAD;
|
---|
990 | break;
|
---|
991 | }
|
---|
992 | len = state.lens[state.have - 1];
|
---|
993 | copy = 3 + (hold & 0x03);//BITS(2);
|
---|
994 | //--- DROPBITS(2) ---//
|
---|
995 | hold >>>= 2;
|
---|
996 | bits -= 2;
|
---|
997 | //---//
|
---|
998 | }
|
---|
999 | else if (here_val === 17) {
|
---|
1000 | //=== NEEDBITS(here.bits + 3);
|
---|
1001 | n = here_bits + 3;
|
---|
1002 | while (bits < n) {
|
---|
1003 | if (have === 0) { break inf_leave; }
|
---|
1004 | have--;
|
---|
1005 | hold += input[next++] << bits;
|
---|
1006 | bits += 8;
|
---|
1007 | }
|
---|
1008 | //===//
|
---|
1009 | //--- DROPBITS(here.bits) ---//
|
---|
1010 | hold >>>= here_bits;
|
---|
1011 | bits -= here_bits;
|
---|
1012 | //---//
|
---|
1013 | len = 0;
|
---|
1014 | copy = 3 + (hold & 0x07);//BITS(3);
|
---|
1015 | //--- DROPBITS(3) ---//
|
---|
1016 | hold >>>= 3;
|
---|
1017 | bits -= 3;
|
---|
1018 | //---//
|
---|
1019 | }
|
---|
1020 | else {
|
---|
1021 | //=== NEEDBITS(here.bits + 7);
|
---|
1022 | n = here_bits + 7;
|
---|
1023 | while (bits < n) {
|
---|
1024 | if (have === 0) { break inf_leave; }
|
---|
1025 | have--;
|
---|
1026 | hold += input[next++] << bits;
|
---|
1027 | bits += 8;
|
---|
1028 | }
|
---|
1029 | //===//
|
---|
1030 | //--- DROPBITS(here.bits) ---//
|
---|
1031 | hold >>>= here_bits;
|
---|
1032 | bits -= here_bits;
|
---|
1033 | //---//
|
---|
1034 | len = 0;
|
---|
1035 | copy = 11 + (hold & 0x7f);//BITS(7);
|
---|
1036 | //--- DROPBITS(7) ---//
|
---|
1037 | hold >>>= 7;
|
---|
1038 | bits -= 7;
|
---|
1039 | //---//
|
---|
1040 | }
|
---|
1041 | if (state.have + copy > state.nlen + state.ndist) {
|
---|
1042 | strm.msg = 'invalid bit length repeat';
|
---|
1043 | state.mode = BAD;
|
---|
1044 | break;
|
---|
1045 | }
|
---|
1046 | while (copy--) {
|
---|
1047 | state.lens[state.have++] = len;
|
---|
1048 | }
|
---|
1049 | }
|
---|
1050 | }
|
---|
1051 |
|
---|
1052 | /* handle error breaks in while */
|
---|
1053 | if (state.mode === BAD) { break; }
|
---|
1054 |
|
---|
1055 | /* check for end-of-block code (better have one) */
|
---|
1056 | if (state.lens[256] === 0) {
|
---|
1057 | strm.msg = 'invalid code -- missing end-of-block';
|
---|
1058 | state.mode = BAD;
|
---|
1059 | break;
|
---|
1060 | }
|
---|
1061 |
|
---|
1062 | /* build code tables -- note: do not change the lenbits or distbits
|
---|
1063 | values here (9 and 6) without reading the comments in inftrees.h
|
---|
1064 | concerning the ENOUGH constants, which depend on those values */
|
---|
1065 | state.lenbits = 9;
|
---|
1066 |
|
---|
1067 | opts = { bits: state.lenbits };
|
---|
1068 | ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
|
---|
1069 | // We have separate tables & no pointers. 2 commented lines below not needed.
|
---|
1070 | // state.next_index = opts.table_index;
|
---|
1071 | state.lenbits = opts.bits;
|
---|
1072 | // state.lencode = state.next;
|
---|
1073 |
|
---|
1074 | if (ret) {
|
---|
1075 | strm.msg = 'invalid literal/lengths set';
|
---|
1076 | state.mode = BAD;
|
---|
1077 | break;
|
---|
1078 | }
|
---|
1079 |
|
---|
1080 | state.distbits = 6;
|
---|
1081 | //state.distcode.copy(state.codes);
|
---|
1082 | // Switch to use dynamic table
|
---|
1083 | state.distcode = state.distdyn;
|
---|
1084 | opts = { bits: state.distbits };
|
---|
1085 | ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
|
---|
1086 | // We have separate tables & no pointers. 2 commented lines below not needed.
|
---|
1087 | // state.next_index = opts.table_index;
|
---|
1088 | state.distbits = opts.bits;
|
---|
1089 | // state.distcode = state.next;
|
---|
1090 |
|
---|
1091 | if (ret) {
|
---|
1092 | strm.msg = 'invalid distances set';
|
---|
1093 | state.mode = BAD;
|
---|
1094 | break;
|
---|
1095 | }
|
---|
1096 | //Tracev((stderr, 'inflate: codes ok\n'));
|
---|
1097 | state.mode = LEN_;
|
---|
1098 | if (flush === Z_TREES) { break inf_leave; }
|
---|
1099 | /* falls through */
|
---|
1100 | case LEN_:
|
---|
1101 | state.mode = LEN;
|
---|
1102 | /* falls through */
|
---|
1103 | case LEN:
|
---|
1104 | if (have >= 6 && left >= 258) {
|
---|
1105 | //--- RESTORE() ---
|
---|
1106 | strm.next_out = put;
|
---|
1107 | strm.avail_out = left;
|
---|
1108 | strm.next_in = next;
|
---|
1109 | strm.avail_in = have;
|
---|
1110 | state.hold = hold;
|
---|
1111 | state.bits = bits;
|
---|
1112 | //---
|
---|
1113 | inflate_fast(strm, _out);
|
---|
1114 | //--- LOAD() ---
|
---|
1115 | put = strm.next_out;
|
---|
1116 | output = strm.output;
|
---|
1117 | left = strm.avail_out;
|
---|
1118 | next = strm.next_in;
|
---|
1119 | input = strm.input;
|
---|
1120 | have = strm.avail_in;
|
---|
1121 | hold = state.hold;
|
---|
1122 | bits = state.bits;
|
---|
1123 | //---
|
---|
1124 |
|
---|
1125 | if (state.mode === TYPE) {
|
---|
1126 | state.back = -1;
|
---|
1127 | }
|
---|
1128 | break;
|
---|
1129 | }
|
---|
1130 | state.back = 0;
|
---|
1131 | for (;;) {
|
---|
1132 | here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/
|
---|
1133 | here_bits = here >>> 24;
|
---|
1134 | here_op = (here >>> 16) & 0xff;
|
---|
1135 | here_val = here & 0xffff;
|
---|
1136 |
|
---|
1137 | if (here_bits <= bits) { break; }
|
---|
1138 | //--- PULLBYTE() ---//
|
---|
1139 | if (have === 0) { break inf_leave; }
|
---|
1140 | have--;
|
---|
1141 | hold += input[next++] << bits;
|
---|
1142 | bits += 8;
|
---|
1143 | //---//
|
---|
1144 | }
|
---|
1145 | if (here_op && (here_op & 0xf0) === 0) {
|
---|
1146 | last_bits = here_bits;
|
---|
1147 | last_op = here_op;
|
---|
1148 | last_val = here_val;
|
---|
1149 | for (;;) {
|
---|
1150 | here = state.lencode[last_val +
|
---|
1151 | ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
|
---|
1152 | here_bits = here >>> 24;
|
---|
1153 | here_op = (here >>> 16) & 0xff;
|
---|
1154 | here_val = here & 0xffff;
|
---|
1155 |
|
---|
1156 | if ((last_bits + here_bits) <= bits) { break; }
|
---|
1157 | //--- PULLBYTE() ---//
|
---|
1158 | if (have === 0) { break inf_leave; }
|
---|
1159 | have--;
|
---|
1160 | hold += input[next++] << bits;
|
---|
1161 | bits += 8;
|
---|
1162 | //---//
|
---|
1163 | }
|
---|
1164 | //--- DROPBITS(last.bits) ---//
|
---|
1165 | hold >>>= last_bits;
|
---|
1166 | bits -= last_bits;
|
---|
1167 | //---//
|
---|
1168 | state.back += last_bits;
|
---|
1169 | }
|
---|
1170 | //--- DROPBITS(here.bits) ---//
|
---|
1171 | hold >>>= here_bits;
|
---|
1172 | bits -= here_bits;
|
---|
1173 | //---//
|
---|
1174 | state.back += here_bits;
|
---|
1175 | state.length = here_val;
|
---|
1176 | if (here_op === 0) {
|
---|
1177 | //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
---|
1178 | // "inflate: literal '%c'\n" :
|
---|
1179 | // "inflate: literal 0x%02x\n", here.val));
|
---|
1180 | state.mode = LIT;
|
---|
1181 | break;
|
---|
1182 | }
|
---|
1183 | if (here_op & 32) {
|
---|
1184 | //Tracevv((stderr, "inflate: end of block\n"));
|
---|
1185 | state.back = -1;
|
---|
1186 | state.mode = TYPE;
|
---|
1187 | break;
|
---|
1188 | }
|
---|
1189 | if (here_op & 64) {
|
---|
1190 | strm.msg = 'invalid literal/length code';
|
---|
1191 | state.mode = BAD;
|
---|
1192 | break;
|
---|
1193 | }
|
---|
1194 | state.extra = here_op & 15;
|
---|
1195 | state.mode = LENEXT;
|
---|
1196 | /* falls through */
|
---|
1197 | case LENEXT:
|
---|
1198 | if (state.extra) {
|
---|
1199 | //=== NEEDBITS(state.extra);
|
---|
1200 | n = state.extra;
|
---|
1201 | while (bits < n) {
|
---|
1202 | if (have === 0) { break inf_leave; }
|
---|
1203 | have--;
|
---|
1204 | hold += input[next++] << bits;
|
---|
1205 | bits += 8;
|
---|
1206 | }
|
---|
1207 | //===//
|
---|
1208 | state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
|
---|
1209 | //--- DROPBITS(state.extra) ---//
|
---|
1210 | hold >>>= state.extra;
|
---|
1211 | bits -= state.extra;
|
---|
1212 | //---//
|
---|
1213 | state.back += state.extra;
|
---|
1214 | }
|
---|
1215 | //Tracevv((stderr, "inflate: length %u\n", state.length));
|
---|
1216 | state.was = state.length;
|
---|
1217 | state.mode = DIST;
|
---|
1218 | /* falls through */
|
---|
1219 | case DIST:
|
---|
1220 | for (;;) {
|
---|
1221 | here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
|
---|
1222 | here_bits = here >>> 24;
|
---|
1223 | here_op = (here >>> 16) & 0xff;
|
---|
1224 | here_val = here & 0xffff;
|
---|
1225 |
|
---|
1226 | if ((here_bits) <= bits) { break; }
|
---|
1227 | //--- PULLBYTE() ---//
|
---|
1228 | if (have === 0) { break inf_leave; }
|
---|
1229 | have--;
|
---|
1230 | hold += input[next++] << bits;
|
---|
1231 | bits += 8;
|
---|
1232 | //---//
|
---|
1233 | }
|
---|
1234 | if ((here_op & 0xf0) === 0) {
|
---|
1235 | last_bits = here_bits;
|
---|
1236 | last_op = here_op;
|
---|
1237 | last_val = here_val;
|
---|
1238 | for (;;) {
|
---|
1239 | here = state.distcode[last_val +
|
---|
1240 | ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
|
---|
1241 | here_bits = here >>> 24;
|
---|
1242 | here_op = (here >>> 16) & 0xff;
|
---|
1243 | here_val = here & 0xffff;
|
---|
1244 |
|
---|
1245 | if ((last_bits + here_bits) <= bits) { break; }
|
---|
1246 | //--- PULLBYTE() ---//
|
---|
1247 | if (have === 0) { break inf_leave; }
|
---|
1248 | have--;
|
---|
1249 | hold += input[next++] << bits;
|
---|
1250 | bits += 8;
|
---|
1251 | //---//
|
---|
1252 | }
|
---|
1253 | //--- DROPBITS(last.bits) ---//
|
---|
1254 | hold >>>= last_bits;
|
---|
1255 | bits -= last_bits;
|
---|
1256 | //---//
|
---|
1257 | state.back += last_bits;
|
---|
1258 | }
|
---|
1259 | //--- DROPBITS(here.bits) ---//
|
---|
1260 | hold >>>= here_bits;
|
---|
1261 | bits -= here_bits;
|
---|
1262 | //---//
|
---|
1263 | state.back += here_bits;
|
---|
1264 | if (here_op & 64) {
|
---|
1265 | strm.msg = 'invalid distance code';
|
---|
1266 | state.mode = BAD;
|
---|
1267 | break;
|
---|
1268 | }
|
---|
1269 | state.offset = here_val;
|
---|
1270 | state.extra = (here_op) & 15;
|
---|
1271 | state.mode = DISTEXT;
|
---|
1272 | /* falls through */
|
---|
1273 | case DISTEXT:
|
---|
1274 | if (state.extra) {
|
---|
1275 | //=== NEEDBITS(state.extra);
|
---|
1276 | n = state.extra;
|
---|
1277 | while (bits < n) {
|
---|
1278 | if (have === 0) { break inf_leave; }
|
---|
1279 | have--;
|
---|
1280 | hold += input[next++] << bits;
|
---|
1281 | bits += 8;
|
---|
1282 | }
|
---|
1283 | //===//
|
---|
1284 | state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
|
---|
1285 | //--- DROPBITS(state.extra) ---//
|
---|
1286 | hold >>>= state.extra;
|
---|
1287 | bits -= state.extra;
|
---|
1288 | //---//
|
---|
1289 | state.back += state.extra;
|
---|
1290 | }
|
---|
1291 | //#ifdef INFLATE_STRICT
|
---|
1292 | if (state.offset > state.dmax) {
|
---|
1293 | strm.msg = 'invalid distance too far back';
|
---|
1294 | state.mode = BAD;
|
---|
1295 | break;
|
---|
1296 | }
|
---|
1297 | //#endif
|
---|
1298 | //Tracevv((stderr, "inflate: distance %u\n", state.offset));
|
---|
1299 | state.mode = MATCH;
|
---|
1300 | /* falls through */
|
---|
1301 | case MATCH:
|
---|
1302 | if (left === 0) { break inf_leave; }
|
---|
1303 | copy = _out - left;
|
---|
1304 | if (state.offset > copy) { /* copy from window */
|
---|
1305 | copy = state.offset - copy;
|
---|
1306 | if (copy > state.whave) {
|
---|
1307 | if (state.sane) {
|
---|
1308 | strm.msg = 'invalid distance too far back';
|
---|
1309 | state.mode = BAD;
|
---|
1310 | break;
|
---|
1311 | }
|
---|
1312 | // (!) This block is disabled in zlib defaults,
|
---|
1313 | // don't enable it for binary compatibility
|
---|
1314 | //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
|
---|
1315 | // Trace((stderr, "inflate.c too far\n"));
|
---|
1316 | // copy -= state.whave;
|
---|
1317 | // if (copy > state.length) { copy = state.length; }
|
---|
1318 | // if (copy > left) { copy = left; }
|
---|
1319 | // left -= copy;
|
---|
1320 | // state.length -= copy;
|
---|
1321 | // do {
|
---|
1322 | // output[put++] = 0;
|
---|
1323 | // } while (--copy);
|
---|
1324 | // if (state.length === 0) { state.mode = LEN; }
|
---|
1325 | // break;
|
---|
1326 | //#endif
|
---|
1327 | }
|
---|
1328 | if (copy > state.wnext) {
|
---|
1329 | copy -= state.wnext;
|
---|
1330 | from = state.wsize - copy;
|
---|
1331 | }
|
---|
1332 | else {
|
---|
1333 | from = state.wnext - copy;
|
---|
1334 | }
|
---|
1335 | if (copy > state.length) { copy = state.length; }
|
---|
1336 | from_source = state.window;
|
---|
1337 | }
|
---|
1338 | else { /* copy from output */
|
---|
1339 | from_source = output;
|
---|
1340 | from = put - state.offset;
|
---|
1341 | copy = state.length;
|
---|
1342 | }
|
---|
1343 | if (copy > left) { copy = left; }
|
---|
1344 | left -= copy;
|
---|
1345 | state.length -= copy;
|
---|
1346 | do {
|
---|
1347 | output[put++] = from_source[from++];
|
---|
1348 | } while (--copy);
|
---|
1349 | if (state.length === 0) { state.mode = LEN; }
|
---|
1350 | break;
|
---|
1351 | case LIT:
|
---|
1352 | if (left === 0) { break inf_leave; }
|
---|
1353 | output[put++] = state.length;
|
---|
1354 | left--;
|
---|
1355 | state.mode = LEN;
|
---|
1356 | break;
|
---|
1357 | case CHECK:
|
---|
1358 | if (state.wrap) {
|
---|
1359 | //=== NEEDBITS(32);
|
---|
1360 | while (bits < 32) {
|
---|
1361 | if (have === 0) { break inf_leave; }
|
---|
1362 | have--;
|
---|
1363 | // Use '|' instead of '+' to make sure that result is signed
|
---|
1364 | hold |= input[next++] << bits;
|
---|
1365 | bits += 8;
|
---|
1366 | }
|
---|
1367 | //===//
|
---|
1368 | _out -= left;
|
---|
1369 | strm.total_out += _out;
|
---|
1370 | state.total += _out;
|
---|
1371 | if (_out) {
|
---|
1372 | strm.adler = state.check =
|
---|
1373 | /*UPDATE(state.check, put - _out, _out);*/
|
---|
1374 | (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
|
---|
1375 |
|
---|
1376 | }
|
---|
1377 | _out = left;
|
---|
1378 | // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
|
---|
1379 | if ((state.flags ? hold : zswap32(hold)) !== state.check) {
|
---|
1380 | strm.msg = 'incorrect data check';
|
---|
1381 | state.mode = BAD;
|
---|
1382 | break;
|
---|
1383 | }
|
---|
1384 | //=== INITBITS();
|
---|
1385 | hold = 0;
|
---|
1386 | bits = 0;
|
---|
1387 | //===//
|
---|
1388 | //Tracev((stderr, "inflate: check matches trailer\n"));
|
---|
1389 | }
|
---|
1390 | state.mode = LENGTH;
|
---|
1391 | /* falls through */
|
---|
1392 | case LENGTH:
|
---|
1393 | if (state.wrap && state.flags) {
|
---|
1394 | //=== NEEDBITS(32);
|
---|
1395 | while (bits < 32) {
|
---|
1396 | if (have === 0) { break inf_leave; }
|
---|
1397 | have--;
|
---|
1398 | hold += input[next++] << bits;
|
---|
1399 | bits += 8;
|
---|
1400 | }
|
---|
1401 | //===//
|
---|
1402 | if (hold !== (state.total & 0xffffffff)) {
|
---|
1403 | strm.msg = 'incorrect length check';
|
---|
1404 | state.mode = BAD;
|
---|
1405 | break;
|
---|
1406 | }
|
---|
1407 | //=== INITBITS();
|
---|
1408 | hold = 0;
|
---|
1409 | bits = 0;
|
---|
1410 | //===//
|
---|
1411 | //Tracev((stderr, "inflate: length matches trailer\n"));
|
---|
1412 | }
|
---|
1413 | state.mode = DONE;
|
---|
1414 | /* falls through */
|
---|
1415 | case DONE:
|
---|
1416 | ret = Z_STREAM_END;
|
---|
1417 | break inf_leave;
|
---|
1418 | case BAD:
|
---|
1419 | ret = Z_DATA_ERROR;
|
---|
1420 | break inf_leave;
|
---|
1421 | case MEM:
|
---|
1422 | return Z_MEM_ERROR;
|
---|
1423 | case SYNC:
|
---|
1424 | /* falls through */
|
---|
1425 | default:
|
---|
1426 | return Z_STREAM_ERROR;
|
---|
1427 | }
|
---|
1428 | }
|
---|
1429 |
|
---|
1430 | // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
|
---|
1431 |
|
---|
1432 | /*
|
---|
1433 | Return from inflate(), updating the total counts and the check value.
|
---|
1434 | If there was no progress during the inflate() call, return a buffer
|
---|
1435 | error. Call updatewindow() to create and/or update the window state.
|
---|
1436 | Note: a memory error from inflate() is non-recoverable.
|
---|
1437 | */
|
---|
1438 |
|
---|
1439 | //--- RESTORE() ---
|
---|
1440 | strm.next_out = put;
|
---|
1441 | strm.avail_out = left;
|
---|
1442 | strm.next_in = next;
|
---|
1443 | strm.avail_in = have;
|
---|
1444 | state.hold = hold;
|
---|
1445 | state.bits = bits;
|
---|
1446 | //---
|
---|
1447 |
|
---|
1448 | if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
|
---|
1449 | (state.mode < CHECK || flush !== Z_FINISH))) {
|
---|
1450 | if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
|
---|
1451 | state.mode = MEM;
|
---|
1452 | return Z_MEM_ERROR;
|
---|
1453 | }
|
---|
1454 | }
|
---|
1455 | _in -= strm.avail_in;
|
---|
1456 | _out -= strm.avail_out;
|
---|
1457 | strm.total_in += _in;
|
---|
1458 | strm.total_out += _out;
|
---|
1459 | state.total += _out;
|
---|
1460 | if (state.wrap && _out) {
|
---|
1461 | strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
|
---|
1462 | (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
|
---|
1463 | }
|
---|
1464 | strm.data_type = state.bits + (state.last ? 64 : 0) +
|
---|
1465 | (state.mode === TYPE ? 128 : 0) +
|
---|
1466 | (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
|
---|
1467 | if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
|
---|
1468 | ret = Z_BUF_ERROR;
|
---|
1469 | }
|
---|
1470 | return ret;
|
---|
1471 | }
|
---|
1472 |
|
---|
1473 | function inflateEnd(strm) {
|
---|
1474 |
|
---|
1475 | if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
|
---|
1476 | return Z_STREAM_ERROR;
|
---|
1477 | }
|
---|
1478 |
|
---|
1479 | var state = strm.state;
|
---|
1480 | if (state.window) {
|
---|
1481 | state.window = null;
|
---|
1482 | }
|
---|
1483 | strm.state = null;
|
---|
1484 | return Z_OK;
|
---|
1485 | }
|
---|
1486 |
|
---|
1487 | function inflateGetHeader(strm, head) {
|
---|
1488 | var state;
|
---|
1489 |
|
---|
1490 | /* check state */
|
---|
1491 | if (!strm || !strm.state) { return Z_STREAM_ERROR; }
|
---|
1492 | state = strm.state;
|
---|
1493 | if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
|
---|
1494 |
|
---|
1495 | /* save header structure */
|
---|
1496 | state.head = head;
|
---|
1497 | head.done = false;
|
---|
1498 | return Z_OK;
|
---|
1499 | }
|
---|
1500 |
|
---|
1501 | function inflateSetDictionary(strm, dictionary) {
|
---|
1502 | var dictLength = dictionary.length;
|
---|
1503 |
|
---|
1504 | var state;
|
---|
1505 | var dictid;
|
---|
1506 | var ret;
|
---|
1507 |
|
---|
1508 | /* check state */
|
---|
1509 | if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
|
---|
1510 | state = strm.state;
|
---|
1511 |
|
---|
1512 | if (state.wrap !== 0 && state.mode !== DICT) {
|
---|
1513 | return Z_STREAM_ERROR;
|
---|
1514 | }
|
---|
1515 |
|
---|
1516 | /* check for correct dictionary identifier */
|
---|
1517 | if (state.mode === DICT) {
|
---|
1518 | dictid = 1; /* adler32(0, null, 0)*/
|
---|
1519 | /* dictid = adler32(dictid, dictionary, dictLength); */
|
---|
1520 | dictid = adler32(dictid, dictionary, dictLength, 0);
|
---|
1521 | if (dictid !== state.check) {
|
---|
1522 | return Z_DATA_ERROR;
|
---|
1523 | }
|
---|
1524 | }
|
---|
1525 | /* copy dictionary to window using updatewindow(), which will amend the
|
---|
1526 | existing dictionary if appropriate */
|
---|
1527 | ret = updatewindow(strm, dictionary, dictLength, dictLength);
|
---|
1528 | if (ret) {
|
---|
1529 | state.mode = MEM;
|
---|
1530 | return Z_MEM_ERROR;
|
---|
1531 | }
|
---|
1532 | state.havedict = 1;
|
---|
1533 | // Tracev((stderr, "inflate: dictionary set\n"));
|
---|
1534 | return Z_OK;
|
---|
1535 | }
|
---|
1536 |
|
---|
1537 | exports.inflateReset = inflateReset;
|
---|
1538 | exports.inflateReset2 = inflateReset2;
|
---|
1539 | exports.inflateResetKeep = inflateResetKeep;
|
---|
1540 | exports.inflateInit = inflateInit;
|
---|
1541 | exports.inflateInit2 = inflateInit2;
|
---|
1542 | exports.inflate = inflate;
|
---|
1543 | exports.inflateEnd = inflateEnd;
|
---|
1544 | exports.inflateGetHeader = inflateGetHeader;
|
---|
1545 | exports.inflateSetDictionary = inflateSetDictionary;
|
---|
1546 | exports.inflateInfo = 'pako inflate (from Nodeca project)';
|
---|
1547 |
|
---|
1548 | /* Not implemented
|
---|
1549 | exports.inflateCopy = inflateCopy;
|
---|
1550 | exports.inflateGetDictionary = inflateGetDictionary;
|
---|
1551 | exports.inflateMark = inflateMark;
|
---|
1552 | exports.inflatePrime = inflatePrime;
|
---|
1553 | exports.inflateSync = inflateSync;
|
---|
1554 | exports.inflateSyncPoint = inflateSyncPoint;
|
---|
1555 | exports.inflateUndermine = inflateUndermine;
|
---|
1556 | */
|
---|