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