Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/codexlib/zip/deflate.c
1810 views
1
#pragma prototyped
2
3
/*
4
* zip deflate decoder
5
*/
6
7
/* inflate.c -- Not copyrighted 1992 by Mark Adler
8
version c10p1, 10 January 1993 */
9
10
/* You can do whatever you like with this source file, though I would
11
prefer that if you modify it and redistribute it that you include
12
comments to that effect with your name and the date. Thank you.
13
[The history has been moved to the file ChangeLog.]
14
*/
15
16
/*
17
Inflate deflated (PKZIP's method 8 compressed) data. The compression
18
method searches for as much of the current string of bytes (up to a
19
length of 258) in the previous 32K bytes. If it doesn't find any
20
matches (of at least length 3), it codes the next byte. Otherwise, it
21
codes the length of the matched string and its distance backwards from
22
the current position. There is a single Huffman code that codes both
23
single bytes (called "literals") and match lengths. A second Huffman
24
code codes the distance information, which follows a length code. Each
25
length or distance code actually represents a base value and a number
26
of "extra" (sometimes zero) bits to get to add to the base value. At
27
the end of each deflated block is a special end-of-block (EOB) literal/
28
length code. The decoding process is basically: get a literal/length
29
code; if EOB then done; if a literal, emit the decoded byte; if a
30
length then get the distance and emit the referred-to bytes from the
31
sliding window of previously emitted data.
32
33
There are (currently) three kinds of inflate blocks: stored, fixed, and
34
dynamic. The compressor outputs a chunk of data at a time and decides
35
which method to use on a chunk-by-chunk basis. A chunk might typically
36
be 32K to 64K, uncompressed. If the chunk is uncompressible, then the
37
"stored" method is used. In this case, the bytes are simply stored as
38
is, eight bits per byte, with none of the above coding. The bytes are
39
preceded by a count, since there is no longer an EOB code.
40
41
If the data are compressible, then either the fixed or dynamic methods
42
are used. In the dynamic method, the compressed data are preceded by
43
an encoding of the literal/length and distance Huffman codes that are
44
to be used to decode this block. The representation is itself Huffman
45
coded, and so is preceded by a description of that code. These code
46
descriptions take up a little space, and so for small blocks, there is
47
a predefined set of codes, called the fixed codes. The fixed method is
48
used if the block ends up smaller that way (usually for quite small
49
chunks); otherwise the dynamic method is used. In the latter case, the
50
codes are customized to the probabilities in the current block and so
51
can code it much better than the pre-determined fixed codes can.
52
53
The Huffman codes themselves are decoded using a multi-level table
54
lookup, in order to maximize the speed of decoding plus the speed of
55
building the decoding tables. See the comments below that precede the
56
lbits and dbits tuning parameters.
57
*/
58
59
60
/*
61
Notes beyond the 1.93a appnote.txt:
62
63
1. Distance pointers never point before the beginning of the output
64
stream.
65
2. Distance pointers can point back across blocks, up to 32k away.
66
3. There is an implied maximum of 7 bits for the bit length table and
67
15 bits for the actual data.
68
4. If only one code exists, then it is encoded using one bit. (Zero
69
would be more efficient, but perhaps a little confusing.) If two
70
codes exist, they are coded using one bit each (0 and 1).
71
5. There is no way of sending zero distance codes--a dummy must be
72
sent if there are none. (History: a pre 2.0 version of PKZIP would
73
store blocks with no distance codes, but this was discovered to be
74
too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
75
zero distance codes, which is sent as one code of zero bits in
76
length.
77
6. There are up to 286 literal/length codes. Code 256 represents the
78
end-of-block. Note however that the static length tree defines
79
288 codes just to fill out the Huffman codes. Codes 286 and 287
80
cannot be used though, since there is no length base or extra bits
81
defined for them. Similarily, there are up to 30 distance codes.
82
However, static trees define 32 codes (all 5 bits) to fill out the
83
Huffman codes, but the last two had better not show up in the data.
84
7. Unzip can check dynamic Huffman blocks for complete code sets.
85
The exception is that a single code would not be complete (see #4).
86
8. The five bits following the block type is really the number of
87
literal codes sent minus 257.
88
9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
89
(1+6+6). Therefore, to output three times the length, you output
90
three codes (1+1+1), whereas to output four times the same length,
91
you only need two codes (1+3). Hmm.
92
10. In the tree reconstruction algorithm, Code = Code + Increment
93
only if BitLength(i) is not zero. (Pretty obvious.)
94
11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
95
12. Note: length code 284 can represent 227-258, but length code 285
96
really is 258. The last length deserves its own, short code
97
since it gets used a lot in very redundant files. The length
98
258 is special since 258 - 3 (the min match length) is 255.
99
13. The literal/length and distance code bit lengths are read as a
100
single stream of lengths. It is possible (and advantageous) for
101
a repeat code (16, 17, or 18) to go across the boundary between
102
the two sets of lengths.
103
*/
104
105
#include "zip.h"
106
#include "huff.h"
107
108
#define WINDOW 32768
109
110
#define STORED_BLOCK 0
111
#define STATIC_TREES 1
112
#define DYNAMIC_TREES 2
113
114
/* Save to local */
115
#define BITS_LOCAL \
116
ulg bit_buf = state->bit_buf; \
117
ulg bit_len = state->bit_len;
118
119
/* Restore to state */
120
#define BITS_GLOBAL \
121
state->bit_buf = bit_buf; \
122
state->bit_len = bit_len;
123
124
#define MASK_BITS(n) ((((ulg)1)<<(n))-1)
125
#define NEXTBYTE(p) (((p)->ip < (p)->ie) ? (int)*(p)->ip++ : fill(p))
126
#define NEEDBITS(p,n) {while (bit_len<(n)){bit_buf|=((ulg)NEXTBYTE(p))<<bit_len;bit_len+=8;}}
127
#define GETBITS(n) (bit_buf & MASK_BITS(n))
128
#define DUMPBITS(n) {bit_buf>>=(n);bit_len-=(n);}
129
130
struct State_s; typedef struct State_s State_t;
131
132
struct State_s
133
{
134
Codex_t* codex;
135
136
Vmalloc_t* vm; /* memory region for tl, td */
137
138
uch buf[SF_BUFSIZE];
139
uch slide[WINDOW];
140
141
int method;
142
143
int eof; /* init to 0 from this member on */
144
int last;
145
146
uch* ip;
147
uch* ie;
148
149
ulg wp; /* current position in slide */
150
Huff_t* fixed_tl; /* inflate static */
151
Huff_t* fixed_td; /* inflate static */
152
int fixed_bl; /* inflate static */
153
int fixed_bd; /* inflate static */
154
ulg bit_buf; /* bit buffer */
155
ulg bit_len; /* bits in bit buffer */
156
ulg copy_len;
157
ulg copy_pos;
158
Huff_t* tl; /* literal length state table */
159
Huff_t* td; /* literal distance state table */
160
int bl; /* number of bits decoded by tl[] */
161
int bd; /* number of bits decoded by td[] */
162
};
163
164
static int
165
fill(State_t* state)
166
{
167
ssize_t r;
168
169
if (state->eof)
170
return 0;
171
if ((r = sfrd(state->codex->sp, state->buf, sizeof(state->buf), &state->codex->sfdisc)) <= 0)
172
{
173
state->eof = 1;
174
return 0;
175
}
176
state->ie = (state->ip = state->buf) + r;
177
return *state->ip++;
178
}
179
180
/* The inflate algorithm uses a sliding 32K byte window on the uncompressed
181
stream to find repeated byte strings. This is implemented here as a
182
circular buffer. The index is updated simply by incrementing and then
183
and'ing with 0x7fff (32K-1). */
184
/* It is left to other modules to supply the 32K area. It is assumed
185
to be usable as if it were declared "uch slide[32768];" or as just
186
"uch *slide;" and then malloc'ed in the latter case. The definition
187
must be in unzip.h, included above. */
188
189
#define lbits 9 /* bits in base literal/length lookup table */
190
#define dbits 6 /* bits in base distance lookup table */
191
192
/* Tables for deflate from PKZIP's appnote.txt. */
193
static ush cplens[] = { /* Copy lengths for literal codes 257..285 */
194
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
195
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
196
/* note: see note #13 above about the 258 in this list. */
197
static ush cplext[] = { /* Extra bits for literal codes 257..285 */
198
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
199
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
200
static ush cpdist[] = { /* Copy offsets for distance codes 0..29 */
201
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
202
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
203
8193, 12289, 16385, 24577};
204
static ush cpdext[] = { /* Extra bits for distance codes */
205
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
206
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
207
12, 12, 13, 13};
208
209
/* inflate (decompress) the codes in a deflated (compressed) block.
210
Return an error code or zero if it all goes ok. */
211
212
static uch*
213
inflate_codes(State_t* state, register uch* p, register uch* e)
214
{
215
register ulg x; /* table entry flag/number of extra bits */
216
Huff_t* t; /* pointer to table entry */
217
Huff_t* tl; /* literal length state table */
218
Huff_t* td; /* literal distance state table */
219
int bl; /* number of bits decoded by tl[] */
220
int bd; /* number of bits decoded by td[] */
221
ulg l;
222
ulg w;
223
ulg d;
224
uch* slide;
225
BITS_LOCAL;
226
227
if (p == e)
228
return p;
229
slide = state->slide;
230
tl = state->tl;
231
td = state->td;
232
bl = state->bl;
233
bd = state->bd;
234
w = state->wp;
235
236
/* inflate the coded data until end of block */
237
238
for (;;)
239
{
240
NEEDBITS(state, (ulg)bl);
241
t = tl + GETBITS(bl);
242
x = t->e;
243
while (x > 16)
244
{
245
if (x == 99)
246
return 0;
247
DUMPBITS(t->b);
248
x -= 16;
249
NEEDBITS(state, x);
250
t = t->v.t + GETBITS(x);
251
x = t->e;
252
}
253
DUMPBITS(t->b);
254
if (x == 16)
255
{
256
/* literal */
257
w &= WINDOW - 1;
258
*p++ = slide[w++] = (uch)t->v.n;
259
if (p >= e)
260
{
261
state->wp = w;
262
BITS_GLOBAL;
263
return p;
264
}
265
}
266
else if (x == 15)
267
break;
268
else
269
{
270
/* get length of block to copy */
271
272
NEEDBITS(state, x);
273
l = t->v.n + GETBITS(x);
274
DUMPBITS(x);
275
276
/* decode distance of block to copy */
277
278
NEEDBITS(state, (ulg)bd);
279
t = td + GETBITS(bd);
280
x = t->e;
281
while (x > 16)
282
{
283
if (x == 99)
284
return 0;
285
DUMPBITS(t->b);
286
x -= 16;
287
NEEDBITS(state, x);
288
t = t->v.t + GETBITS(x);
289
x = t->e;
290
}
291
DUMPBITS(t->b);
292
NEEDBITS(state, x);
293
d = w - t->v.n - GETBITS(x);
294
DUMPBITS(x);
295
296
/* do the copy */
297
298
while (l--)
299
{
300
d &= WINDOW - 1;
301
w &= WINDOW - 1;
302
*p++ = slide[w++] = slide[d++];
303
if (p >= e)
304
{
305
state->copy_len = l;
306
state->wp = w;
307
state->copy_pos = d;
308
BITS_GLOBAL;
309
return p;
310
}
311
}
312
}
313
}
314
state->wp = w;
315
state->method = -1;
316
BITS_GLOBAL;
317
return p;
318
}
319
320
/* "decompress" an inflated type 0 (stored) block. */
321
322
static uch*
323
inflate_stored(State_t* state, register uch* p, register uch* e)
324
{
325
ulg l;
326
ulg w;
327
BITS_LOCAL;
328
329
/* go to byte boundary */
330
331
l = bit_len & 7;
332
DUMPBITS(l);
333
334
/* get the length and its complement */
335
336
NEEDBITS(state, 16);
337
l = GETBITS(16);
338
DUMPBITS(16);
339
NEEDBITS(state, 16);
340
if (l != (ulg)((~bit_buf) & 0xffff))
341
{
342
BITS_GLOBAL;
343
return 0;
344
}
345
DUMPBITS(16);
346
347
/* read and output the compressed data */
348
349
w = state->wp;
350
for (;;)
351
{
352
if (!l--)
353
{
354
state->method = -1;
355
break;
356
}
357
w &= WINDOW - 1;
358
NEEDBITS(state, 8);
359
*p++ = state->slide[w++] = (uch)GETBITS(8);
360
DUMPBITS(8);
361
if (p >= e)
362
{
363
state->copy_len = l;
364
break;
365
}
366
}
367
state->wp = w;
368
BITS_GLOBAL;
369
return p;
370
}
371
372
/* decompress an inflated type 1 (fixed Huffman codes) block. We should
373
either replace this with a custom state, or at least precompute the
374
Huffman tables. */
375
376
static int
377
inflate_fixed(State_t* state)
378
{
379
/* if first time, set up tables for fixed blocks */
380
381
if (!state->fixed_tl)
382
{
383
Huff_t* tl; /* literal/length code table */
384
int i; /* temporary variable */
385
ulg l[288]; /* length list for huff() */
386
387
/* literal table */
388
389
for (i = 0; i < 144; i++)
390
l[i] = 8;
391
for (; i < 256; i++)
392
l[i] = 9;
393
for (; i < 280; i++)
394
l[i] = 7;
395
396
/* make a complete, but wrong code set */
397
398
for (; i < 288; i++)
399
l[i] = 8;
400
state->fixed_bl = 7;
401
if (huff(l, 288, 257, cplens, cplext, &tl, &state->fixed_bl, state->vm))
402
return -1;
403
404
/* distance table -- make an incomplete code set */
405
406
for (i = 0; i < 30; i++)
407
l[i] = 5;
408
state->fixed_bd = 5;
409
if (huff(l, 30, 0, cpdist, cpdext, &state->fixed_td, &state->fixed_bd, state->vm) > 1)
410
return -1;
411
state->fixed_tl = tl;
412
}
413
state->tl = state->fixed_tl;
414
state->td = state->fixed_td;
415
state->bl = state->fixed_bl;
416
state->bd = state->fixed_bd;
417
return 0;
418
}
419
420
/* decompress an inflated type 2 (dynamic Huffman codes) block. */
421
422
static int
423
inflate_dynamic(State_t* state)
424
{
425
int i; /* temporary variables */
426
ulg j;
427
ulg l; /* last length */
428
ulg n; /* number of lengths to get */
429
Huff_t* tl; /* literal/length code table */
430
Huff_t* td; /* distance code table */
431
int bl; /* lookup bits for tl */
432
int bd; /* lookup bits for td */
433
ulg nb; /* number of bit length codes */
434
ulg nl; /* number of literal/length codes */
435
ulg nd; /* number of distance codes */
436
#ifdef PKZIP_BUG_WORKAROUND
437
ulg ll[288+32]; /* literal/length and distance code lengths */
438
#else
439
ulg ll[286+30]; /* literal/length and distance code lengths */
440
#endif
441
442
static ulg border[] = { /* Order of the bit length code lengths */
443
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
444
445
BITS_LOCAL;
446
447
state->fixed_tl = 0;
448
vmclear(state->vm);
449
450
/* read in table lengths */
451
452
NEEDBITS(state, 5);
453
nl = 257 + GETBITS(5); /* number of literal/length codes */
454
DUMPBITS(5);
455
NEEDBITS(state, 5);
456
nd = 1 + GETBITS(5); /* number of distance codes */
457
DUMPBITS(5);
458
NEEDBITS(state, 4);
459
nb = 4 + GETBITS(4); /* number of bit length codes */
460
DUMPBITS(4);
461
#ifdef PKZIP_BUG_WORKAROUND
462
if (nl > 288 || nd > 32)
463
#else
464
if (nl > 286 || nd > 30)
465
#endif
466
{
467
/* bad lengths */
468
469
BITS_GLOBAL;
470
return -1;
471
}
472
473
/* read in bit-length-code lengths */
474
475
for (j = 0; j < nb; j++)
476
{
477
NEEDBITS(state, 3);
478
ll[border[j]] = GETBITS(3);
479
DUMPBITS(3);
480
}
481
for (; j < 19; j++)
482
ll[border[j]] = 0;
483
484
/* build decoding table for trees--single level, 7 bit lookup */
485
486
bl = 7;
487
if (i = huff(ll, 19, 19, NULL, NULL, &tl, &bl, state->vm))
488
{
489
/* incomplete code set */
490
491
BITS_GLOBAL;
492
return -1;
493
}
494
495
/* read in literal and distance code lengths */
496
497
n = nl + nd;
498
i = l = 0;
499
while ((ulg)i < n)
500
{
501
NEEDBITS(state, (ulg)bl);
502
j = (td = tl + (GETBITS(bl)))->b;
503
DUMPBITS(j);
504
j = td->v.n;
505
if (j < 16) /* length of code in bits (0..15) */
506
ll[i++] = l = j;/* save last length in l */
507
else if (j == 16) /* repeat last length 3 to 6 times */
508
{
509
NEEDBITS(state, 2);
510
j = 3 + GETBITS(2);
511
DUMPBITS(2);
512
if ((ulg)i + j > n)
513
{
514
BITS_GLOBAL;
515
return -1;
516
}
517
while (j--)
518
ll[i++] = l;
519
}
520
else if (j == 17) /* 3 to 10 zero length codes */
521
{
522
NEEDBITS(state, 3);
523
j = 3 + GETBITS(3);
524
DUMPBITS(3);
525
if ((ulg)i + j > n)
526
{
527
BITS_GLOBAL;
528
return -1;
529
}
530
while (j--)
531
ll[i++] = 0;
532
l = 0;
533
}
534
else /* j == 18: 11 to 138 0 length codes */
535
{
536
NEEDBITS(state, 7);
537
j = 11 + GETBITS(7);
538
DUMPBITS(7);
539
if ((ulg)i + j > n)
540
{
541
BITS_GLOBAL;
542
return -1;
543
}
544
while (j--)
545
ll[i++] = 0;
546
l = 0;
547
}
548
}
549
BITS_GLOBAL;
550
551
/* free decoding table for trees */
552
553
vmclear(state->vm);
554
555
/* build the decoding tables for literal/length and distance codes */
556
557
bl = lbits;
558
i = huff(ll, nl, 257, cplens, cplext, &tl, &bl, state->vm);
559
if (bl == 0) /* no literals or lengths */
560
i = 1;
561
if (i)
562
{
563
/* incomplete code set */
564
565
if (i == 1 && state->codex->disc->errorf)
566
(*state->codex->disc->errorf)(NiL, state->codex->disc, 2, "%s: incomplete literal tree", state->codex->meth->name);
567
return -1;
568
}
569
bd = dbits;
570
i = huff(ll + nl, nd, 0, cpdist, cpdext, &td, &bd, state->vm);
571
if (bd == 0 && nl > 257)
572
{
573
/* lengths but no distances */
574
575
if (state->codex->disc->errorf)
576
(*state->codex->disc->errorf)(NiL, state->codex->disc, 2, "%s: incomplete distance tree", state->codex->meth->name);
577
return -1;
578
}
579
if (i == 1)
580
{
581
#ifdef PKZIP_BUG_WORKAROUND
582
i = 0;
583
#else
584
if (state->codex->disc->errorf)
585
(*state->codex->disc->errorf)(NiL, state->codex->disc, 2, "%s: incomplete distance tree", state->codex->meth->name);
586
#endif
587
}
588
if (i)
589
return -1;
590
state->tl = tl;
591
state->td = td;
592
state->bl = bl;
593
state->bd = bd;
594
return 0;
595
}
596
597
static int
598
deflate_open(Codex_t* p, char* const args[], Codexnum_t flags)
599
{
600
State_t* state;
601
Vmalloc_t* vm;
602
603
if (!(vm = vmopen(Vmdcheap, Vmbest, 0)))
604
return -1;
605
if (!(state = newof(0, State_t, 1, 0)))
606
{
607
vmclose(vm);
608
return -1;
609
}
610
state->vm = vm;
611
state->codex = p;
612
p->data = state;
613
return 0;
614
}
615
616
static int
617
deflate_close(Codex_t* p)
618
{
619
State_t* state = (State_t*)p->data;
620
621
if (!state)
622
return -1;
623
if (state->vm)
624
vmclose(state->vm);
625
free(state);
626
return 0;
627
}
628
629
static int
630
deflate_init(Codex_t* p)
631
{
632
register State_t* state = (State_t*)p->data;
633
634
vmclear(state->vm);
635
state->tl = state->fixed_tl = 0;
636
state->method = -1;
637
memset((char*)state + offsetof(State_t, eof), 0, sizeof(*state) - offsetof(State_t, eof));
638
return 0;
639
}
640
641
static ssize_t
642
deflate_read(Sfio_t* sp, void* buf, size_t size, Sfdisc_t* disc)
643
{
644
register State_t* state = (State_t*)CODEX(disc)->data;
645
register uch* p = (uch*)buf;
646
register uch* e = p + size;
647
register uch* q;
648
ulg l;
649
ulg w;
650
ulg d;
651
652
653
if (state->copy_len > 0)
654
{
655
l = state->copy_len;
656
w = state->wp;
657
if (state->method != STORED_BLOCK)
658
{
659
d = state->copy_pos;
660
while (l && p < e)
661
{
662
l--;
663
d &= WINDOW - 1;
664
w &= WINDOW - 1;
665
*p++ = state->slide[w++] = state->slide[d++];
666
}
667
state->copy_pos = d;
668
}
669
else
670
{
671
BITS_LOCAL;
672
while (l && p < e)
673
{
674
l--;
675
w &= WINDOW - 1;
676
NEEDBITS(state, 8);
677
*p++ = state->slide[w++] = (uch)GETBITS(8);
678
DUMPBITS(8);
679
}
680
BITS_GLOBAL;
681
if (!l)
682
state->method = -1;
683
}
684
state->copy_len = l;
685
state->wp = w;
686
}
687
while (p < e)
688
{
689
if (state->method == -1)
690
{
691
BITS_LOCAL;
692
if (state->eof)
693
{
694
BITS_GLOBAL;
695
break;
696
}
697
if (state->last)
698
{
699
state->last = state->wp = 0;
700
l = bit_len & 7;
701
DUMPBITS(l);
702
}
703
704
/* read in last block bit */
705
706
NEEDBITS(state, 1);
707
if (GETBITS(1))
708
state->last = 1;
709
DUMPBITS(1);
710
711
/* read in block type */
712
713
NEEDBITS(state, 2);
714
state->method = (int)GETBITS(2);
715
DUMPBITS(2);
716
state->tl = 0;
717
state->copy_len = 0;
718
BITS_GLOBAL;
719
}
720
switch(state->method)
721
{
722
case STORED_BLOCK:
723
q = inflate_stored(state, p, e);
724
break;
725
case STATIC_TREES:
726
q = (state->tl || !inflate_fixed(state)) ? inflate_codes(state, p, e) : (uch*)0;
727
break;
728
case DYNAMIC_TREES:
729
q = (state->tl || !inflate_dynamic(state)) ? inflate_codes(state, p, e) : (uch*)0;
730
break;
731
default:
732
q = 0;
733
break;
734
}
735
if (!q)
736
{
737
if (p < e || state->eof)
738
break;
739
return -1;
740
}
741
p = q;
742
}
743
return p - (uch*)buf;
744
}
745
746
Codexmeth_t codex_zip_deflate =
747
{
748
"deflate",
749
"zip deflate compression (PKZIP method 8). Option is level"
750
" { 6:faster ... 9:better }.",
751
0,
752
CODEX_DECODE|CODEX_COMPRESS,
753
0,
754
0,
755
deflate_open,
756
deflate_close,
757
deflate_init,
758
0,
759
deflate_read,
760
0,
761
0,
762
0,
763
0,
764
0,
765
0,
766
0
767
};
768
769