- Notifications
You must be signed in to change notification settings - Fork 5.8k
/
Copy pathinflate.h
150 lines (142 loc) · 7.63 KB
/
inflate.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* inflate.h -- internal inflate state definition
* Copyright (C) 1995-2019 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
/* define NO_GZIP when compiling if you want to disable gzip header and
trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
the crc code when it is not needed. For shared libraries, gzip decoding
should be left enabled. */
#ifndefNO_GZIP
# defineGUNZIP
#endif
/* Possible inflate modes between inflate() calls */
typedefenum {
HEAD=16180, /* i: waiting for magic header */
FLAGS, /* i: waiting for method and flags (gzip) */
TIME, /* i: waiting for modification time (gzip) */
OS, /* i: waiting for extra flags and operating system (gzip) */
EXLEN, /* i: waiting for extra length (gzip) */
EXTRA, /* i: waiting for extra bytes (gzip) */
NAME, /* i: waiting for end of file name (gzip) */
COMMENT, /* i: waiting for end of comment (gzip) */
HCRC, /* i: waiting for header crc (gzip) */
DICTID, /* i: waiting for dictionary check value */
DICT, /* waiting for inflateSetDictionary() call */
TYPE, /* i: waiting for type bits, including last-flag bit */
TYPEDO, /* i: same, but skip check to exit inflate on new block */
STORED, /* i: waiting for stored size (length and complement) */
COPY_, /* i/o: same as COPY below, but only first time in */
COPY, /* i/o: waiting for input or output to copy stored block */
TABLE, /* i: waiting for dynamic block table lengths */
LENLENS, /* i: waiting for code length code lengths */
CODELENS, /* i: waiting for length/lit and distance code lengths */
LEN_, /* i: same as LEN below, but only first time in */
LEN, /* i: waiting for length/lit/eob code */
LENEXT, /* i: waiting for length extra bits */
DIST, /* i: waiting for distance code */
DISTEXT, /* i: waiting for distance extra bits */
MATCH, /* o: waiting for output space to copy string */
LIT, /* o: waiting for output space to write literal */
CHECK, /* i: waiting for 32-bit check value */
LENGTH, /* i: waiting for 32-bit length (gzip) */
DONE, /* finished check, done -- remain here until reset */
BAD, /* got a data error -- remain here until reset */
MEM, /* got an inflate() memory error -- remain here until reset */
SYNC/* looking for synchronization bytes to restart inflate() */
} inflate_mode;
/*
State transitions between above modes -
(most modes can go to BAD or MEM on error -- not shown for clarity)
Process header:
HEAD -> (gzip) or (zlib) or (raw)
(gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
HCRC -> TYPE
(zlib) -> DICTID or TYPE
DICTID -> DICT -> TYPE
(raw) -> TYPEDO
Read deflate blocks:
TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
STORED -> COPY_ -> COPY -> TYPE
TABLE -> LENLENS -> CODELENS -> LEN_
LEN_ -> LEN
Read deflate codes in fixed or dynamic block:
LEN -> LENEXT or LIT or TYPE
LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
LIT -> LEN
Process trailer:
CHECK -> LENGTH -> DONE
*/
/* State maintained between inflate() calls -- approximately 7K bytes, not
including the allocated sliding window, which is up to 32K bytes. */
structinflate_state {
z_streampstrm; /* pointer back to this zlib stream */
inflate_modemode; /* current inflate mode */
intlast; /* true if processing last block */
intwrap; /* bit 0 true for zlib, bit 1 true for gzip,
bit 2 true to validate check value */
inthavedict; /* true if dictionary provided */
intflags; /* gzip header method and flags, 0 if zlib, or
-1 if raw or no header yet */
unsigneddmax; /* zlib header max distance (INFLATE_STRICT) */
unsigned longcheck; /* protected copy of check value */
unsigned longtotal; /* protected copy of output count */
gz_headerphead; /* where to save gzip header information */
/* sliding window */
unsignedwbits; /* log base 2 of requested window size */
unsignedwsize; /* window size or zero if not using window */
unsignedwhave; /* valid bytes in the window */
unsignedwnext; /* window write index */
unsigned charFAR*window; /* allocated sliding window, if needed */
/* bit accumulator */
unsigned longhold; /* input bit accumulator */
unsignedbits; /* number of bits in "in" */
/* for string and stored block copying */
unsignedlength; /* literal or length of data to copy */
unsignedoffset; /* distance back to copy string from */
/* for table and code decoding */
unsignedextra; /* extra bits needed */
/* fixed and dynamic code tables */
codeconstFAR*lencode; /* starting table for length/literal codes */
codeconstFAR*distcode; /* starting table for distance codes */
unsignedlenbits; /* index bits for lencode */
unsigneddistbits; /* index bits for distcode */
/* dynamic table building */
unsignedncode; /* number of code length code lengths */
unsignednlen; /* number of length code lengths */
unsignedndist; /* number of distance code lengths */
unsignedhave; /* number of code lengths in lens[] */
codeFAR*next; /* next available space in codes[] */
unsigned shortlens[320]; /* temporary storage for code lengths */
unsigned shortwork[288]; /* work area for code table building */
codecodes[ENOUGH]; /* space for code tables */
intsane; /* if false, allow invalid distance too far */
intback; /* bits back of last unprocessed length/lit */
unsignedwas; /* initial length of match */
};