diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /lib/zlib_inflate |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'lib/zlib_inflate')
-rw-r--r-- | lib/zlib_inflate/Makefile | 19 | ||||
-rw-r--r-- | lib/zlib_inflate/infblock.c | 361 | ||||
-rw-r--r-- | lib/zlib_inflate/infblock.h | 44 | ||||
-rw-r--r-- | lib/zlib_inflate/infcodes.c | 202 | ||||
-rw-r--r-- | lib/zlib_inflate/infcodes.h | 33 | ||||
-rw-r--r-- | lib/zlib_inflate/inffast.c | 176 | ||||
-rw-r--r-- | lib/zlib_inflate/inffast.h | 17 | ||||
-rw-r--r-- | lib/zlib_inflate/inflate.c | 248 | ||||
-rw-r--r-- | lib/zlib_inflate/inflate_syms.c | 22 | ||||
-rw-r--r-- | lib/zlib_inflate/inflate_sync.c | 148 | ||||
-rw-r--r-- | lib/zlib_inflate/inftrees.c | 412 | ||||
-rw-r--r-- | lib/zlib_inflate/inftrees.h | 64 | ||||
-rw-r--r-- | lib/zlib_inflate/infutil.c | 88 | ||||
-rw-r--r-- | lib/zlib_inflate/infutil.h | 197 |
14 files changed, 2031 insertions, 0 deletions
diff --git a/lib/zlib_inflate/Makefile b/lib/zlib_inflate/Makefile new file mode 100644 index 000000000000..221c139e0df1 --- /dev/null +++ b/lib/zlib_inflate/Makefile | |||
@@ -0,0 +1,19 @@ | |||
1 | # | ||
2 | # This is a modified version of zlib, which does all memory | ||
3 | # allocation ahead of time. | ||
4 | # | ||
5 | # This is only the decompression, see zlib_deflate for the | ||
6 | # the compression | ||
7 | # | ||
8 | # Decompression needs to be serialized for each memory | ||
9 | # allocation. | ||
10 | # | ||
11 | # (The upsides of the simplification is that you can't get in | ||
12 | # any nasty situations wrt memory management, and that the | ||
13 | # uncompression can be done without blocking on allocation). | ||
14 | # | ||
15 | |||
16 | obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate.o | ||
17 | |||
18 | zlib_inflate-objs := infblock.o infcodes.o inffast.o inflate.o \ | ||
19 | inflate_sync.o inftrees.o infutil.o inflate_syms.o | ||
diff --git a/lib/zlib_inflate/infblock.c b/lib/zlib_inflate/infblock.c new file mode 100644 index 000000000000..50f21ca4ef7f --- /dev/null +++ b/lib/zlib_inflate/infblock.c | |||
@@ -0,0 +1,361 @@ | |||
1 | /* infblock.c -- interpret and process block types to last block | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "inftrees.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | |||
12 | struct inflate_codes_state; | ||
13 | |||
14 | /* simplify the use of the inflate_huft type with some defines */ | ||
15 | #define exop word.what.Exop | ||
16 | #define bits word.what.Bits | ||
17 | |||
18 | /* Table for deflate from PKZIP's appnote.txt. */ | ||
19 | static const uInt border[] = { /* Order of the bit length code lengths */ | ||
20 | 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | ||
21 | |||
22 | /* | ||
23 | Notes beyond the 1.93a appnote.txt: | ||
24 | |||
25 | 1. Distance pointers never point before the beginning of the output | ||
26 | stream. | ||
27 | 2. Distance pointers can point back across blocks, up to 32k away. | ||
28 | 3. There is an implied maximum of 7 bits for the bit length table and | ||
29 | 15 bits for the actual data. | ||
30 | 4. If only one code exists, then it is encoded using one bit. (Zero | ||
31 | would be more efficient, but perhaps a little confusing.) If two | ||
32 | codes exist, they are coded using one bit each (0 and 1). | ||
33 | 5. There is no way of sending zero distance codes--a dummy must be | ||
34 | sent if there are none. (History: a pre 2.0 version of PKZIP would | ||
35 | store blocks with no distance codes, but this was discovered to be | ||
36 | too harsh a criterion.) Valid only for 1.93a. 2.04c does allow | ||
37 | zero distance codes, which is sent as one code of zero bits in | ||
38 | length. | ||
39 | 6. There are up to 286 literal/length codes. Code 256 represents the | ||
40 | end-of-block. Note however that the static length tree defines | ||
41 | 288 codes just to fill out the Huffman codes. Codes 286 and 287 | ||
42 | cannot be used though, since there is no length base or extra bits | ||
43 | defined for them. Similarily, there are up to 30 distance codes. | ||
44 | However, static trees define 32 codes (all 5 bits) to fill out the | ||
45 | Huffman codes, but the last two had better not show up in the data. | ||
46 | 7. Unzip can check dynamic Huffman blocks for complete code sets. | ||
47 | The exception is that a single code would not be complete (see #4). | ||
48 | 8. The five bits following the block type is really the number of | ||
49 | literal codes sent minus 257. | ||
50 | 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits | ||
51 | (1+6+6). Therefore, to output three times the length, you output | ||
52 | three codes (1+1+1), whereas to output four times the same length, | ||
53 | you only need two codes (1+3). Hmm. | ||
54 | 10. In the tree reconstruction algorithm, Code = Code + Increment | ||
55 | only if BitLength(i) is not zero. (Pretty obvious.) | ||
56 | 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) | ||
57 | 12. Note: length code 284 can represent 227-258, but length code 285 | ||
58 | really is 258. The last length deserves its own, short code | ||
59 | since it gets used a lot in very redundant files. The length | ||
60 | 258 is special since 258 - 3 (the min match length) is 255. | ||
61 | 13. The literal/length and distance code bit lengths are read as a | ||
62 | single stream of lengths. It is possible (and advantageous) for | ||
63 | a repeat code (16, 17, or 18) to go across the boundary between | ||
64 | the two sets of lengths. | ||
65 | */ | ||
66 | |||
67 | |||
68 | void zlib_inflate_blocks_reset( | ||
69 | inflate_blocks_statef *s, | ||
70 | z_streamp z, | ||
71 | uLong *c | ||
72 | ) | ||
73 | { | ||
74 | if (c != NULL) | ||
75 | *c = s->check; | ||
76 | if (s->mode == CODES) | ||
77 | zlib_inflate_codes_free(s->sub.decode.codes, z); | ||
78 | s->mode = TYPE; | ||
79 | s->bitk = 0; | ||
80 | s->bitb = 0; | ||
81 | s->read = s->write = s->window; | ||
82 | if (s->checkfn != NULL) | ||
83 | z->adler = s->check = (*s->checkfn)(0L, NULL, 0); | ||
84 | } | ||
85 | |||
86 | inflate_blocks_statef *zlib_inflate_blocks_new( | ||
87 | z_streamp z, | ||
88 | check_func c, | ||
89 | uInt w | ||
90 | ) | ||
91 | { | ||
92 | inflate_blocks_statef *s; | ||
93 | |||
94 | s = &WS(z)->working_blocks_state; | ||
95 | s->hufts = WS(z)->working_hufts; | ||
96 | s->window = WS(z)->working_window; | ||
97 | s->end = s->window + w; | ||
98 | s->checkfn = c; | ||
99 | s->mode = TYPE; | ||
100 | zlib_inflate_blocks_reset(s, z, NULL); | ||
101 | return s; | ||
102 | } | ||
103 | |||
104 | |||
105 | int zlib_inflate_blocks( | ||
106 | inflate_blocks_statef *s, | ||
107 | z_streamp z, | ||
108 | int r | ||
109 | ) | ||
110 | { | ||
111 | uInt t; /* temporary storage */ | ||
112 | uLong b; /* bit buffer */ | ||
113 | uInt k; /* bits in bit buffer */ | ||
114 | Byte *p; /* input data pointer */ | ||
115 | uInt n; /* bytes available there */ | ||
116 | Byte *q; /* output window write pointer */ | ||
117 | uInt m; /* bytes to end of window or read pointer */ | ||
118 | |||
119 | /* copy input/output information to locals (UPDATE macro restores) */ | ||
120 | LOAD | ||
121 | |||
122 | /* process input based on current state */ | ||
123 | while (1) switch (s->mode) | ||
124 | { | ||
125 | case TYPE: | ||
126 | NEEDBITS(3) | ||
127 | t = (uInt)b & 7; | ||
128 | s->last = t & 1; | ||
129 | switch (t >> 1) | ||
130 | { | ||
131 | case 0: /* stored */ | ||
132 | DUMPBITS(3) | ||
133 | t = k & 7; /* go to byte boundary */ | ||
134 | DUMPBITS(t) | ||
135 | s->mode = LENS; /* get length of stored block */ | ||
136 | break; | ||
137 | case 1: /* fixed */ | ||
138 | { | ||
139 | uInt bl, bd; | ||
140 | inflate_huft *tl, *td; | ||
141 | |||
142 | zlib_inflate_trees_fixed(&bl, &bd, &tl, &td, s->hufts, z); | ||
143 | s->sub.decode.codes = zlib_inflate_codes_new(bl, bd, tl, td, z); | ||
144 | if (s->sub.decode.codes == NULL) | ||
145 | { | ||
146 | r = Z_MEM_ERROR; | ||
147 | LEAVE | ||
148 | } | ||
149 | } | ||
150 | DUMPBITS(3) | ||
151 | s->mode = CODES; | ||
152 | break; | ||
153 | case 2: /* dynamic */ | ||
154 | DUMPBITS(3) | ||
155 | s->mode = TABLE; | ||
156 | break; | ||
157 | case 3: /* illegal */ | ||
158 | DUMPBITS(3) | ||
159 | s->mode = B_BAD; | ||
160 | z->msg = (char*)"invalid block type"; | ||
161 | r = Z_DATA_ERROR; | ||
162 | LEAVE | ||
163 | } | ||
164 | break; | ||
165 | case LENS: | ||
166 | NEEDBITS(32) | ||
167 | if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) | ||
168 | { | ||
169 | s->mode = B_BAD; | ||
170 | z->msg = (char*)"invalid stored block lengths"; | ||
171 | r = Z_DATA_ERROR; | ||
172 | LEAVE | ||
173 | } | ||
174 | s->sub.left = (uInt)b & 0xffff; | ||
175 | b = k = 0; /* dump bits */ | ||
176 | s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); | ||
177 | break; | ||
178 | case STORED: | ||
179 | if (n == 0) | ||
180 | LEAVE | ||
181 | NEEDOUT | ||
182 | t = s->sub.left; | ||
183 | if (t > n) t = n; | ||
184 | if (t > m) t = m; | ||
185 | memcpy(q, p, t); | ||
186 | p += t; n -= t; | ||
187 | q += t; m -= t; | ||
188 | if ((s->sub.left -= t) != 0) | ||
189 | break; | ||
190 | s->mode = s->last ? DRY : TYPE; | ||
191 | break; | ||
192 | case TABLE: | ||
193 | NEEDBITS(14) | ||
194 | s->sub.trees.table = t = (uInt)b & 0x3fff; | ||
195 | #ifndef PKZIP_BUG_WORKAROUND | ||
196 | if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) | ||
197 | { | ||
198 | s->mode = B_BAD; | ||
199 | z->msg = (char*)"too many length or distance symbols"; | ||
200 | r = Z_DATA_ERROR; | ||
201 | LEAVE | ||
202 | } | ||
203 | #endif | ||
204 | { | ||
205 | s->sub.trees.blens = WS(z)->working_blens; | ||
206 | } | ||
207 | DUMPBITS(14) | ||
208 | s->sub.trees.index = 0; | ||
209 | s->mode = BTREE; | ||
210 | case BTREE: | ||
211 | while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) | ||
212 | { | ||
213 | NEEDBITS(3) | ||
214 | s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; | ||
215 | DUMPBITS(3) | ||
216 | } | ||
217 | while (s->sub.trees.index < 19) | ||
218 | s->sub.trees.blens[border[s->sub.trees.index++]] = 0; | ||
219 | s->sub.trees.bb = 7; | ||
220 | t = zlib_inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, | ||
221 | &s->sub.trees.tb, s->hufts, z); | ||
222 | if (t != Z_OK) | ||
223 | { | ||
224 | r = t; | ||
225 | if (r == Z_DATA_ERROR) | ||
226 | s->mode = B_BAD; | ||
227 | LEAVE | ||
228 | } | ||
229 | s->sub.trees.index = 0; | ||
230 | s->mode = DTREE; | ||
231 | case DTREE: | ||
232 | while (t = s->sub.trees.table, | ||
233 | s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) | ||
234 | { | ||
235 | inflate_huft *h; | ||
236 | uInt i, j, c; | ||
237 | |||
238 | t = s->sub.trees.bb; | ||
239 | NEEDBITS(t) | ||
240 | h = s->sub.trees.tb + ((uInt)b & zlib_inflate_mask[t]); | ||
241 | t = h->bits; | ||
242 | c = h->base; | ||
243 | if (c < 16) | ||
244 | { | ||
245 | DUMPBITS(t) | ||
246 | s->sub.trees.blens[s->sub.trees.index++] = c; | ||
247 | } | ||
248 | else /* c == 16..18 */ | ||
249 | { | ||
250 | i = c == 18 ? 7 : c - 14; | ||
251 | j = c == 18 ? 11 : 3; | ||
252 | NEEDBITS(t + i) | ||
253 | DUMPBITS(t) | ||
254 | j += (uInt)b & zlib_inflate_mask[i]; | ||
255 | DUMPBITS(i) | ||
256 | i = s->sub.trees.index; | ||
257 | t = s->sub.trees.table; | ||
258 | if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || | ||
259 | (c == 16 && i < 1)) | ||
260 | { | ||
261 | s->mode = B_BAD; | ||
262 | z->msg = (char*)"invalid bit length repeat"; | ||
263 | r = Z_DATA_ERROR; | ||
264 | LEAVE | ||
265 | } | ||
266 | c = c == 16 ? s->sub.trees.blens[i - 1] : 0; | ||
267 | do { | ||
268 | s->sub.trees.blens[i++] = c; | ||
269 | } while (--j); | ||
270 | s->sub.trees.index = i; | ||
271 | } | ||
272 | } | ||
273 | s->sub.trees.tb = NULL; | ||
274 | { | ||
275 | uInt bl, bd; | ||
276 | inflate_huft *tl, *td; | ||
277 | inflate_codes_statef *c; | ||
278 | |||
279 | bl = 9; /* must be <= 9 for lookahead assumptions */ | ||
280 | bd = 6; /* must be <= 9 for lookahead assumptions */ | ||
281 | t = s->sub.trees.table; | ||
282 | t = zlib_inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), | ||
283 | s->sub.trees.blens, &bl, &bd, &tl, &td, | ||
284 | s->hufts, z); | ||
285 | if (t != Z_OK) | ||
286 | { | ||
287 | if (t == (uInt)Z_DATA_ERROR) | ||
288 | s->mode = B_BAD; | ||
289 | r = t; | ||
290 | LEAVE | ||
291 | } | ||
292 | if ((c = zlib_inflate_codes_new(bl, bd, tl, td, z)) == NULL) | ||
293 | { | ||
294 | r = Z_MEM_ERROR; | ||
295 | LEAVE | ||
296 | } | ||
297 | s->sub.decode.codes = c; | ||
298 | } | ||
299 | s->mode = CODES; | ||
300 | case CODES: | ||
301 | UPDATE | ||
302 | if ((r = zlib_inflate_codes(s, z, r)) != Z_STREAM_END) | ||
303 | return zlib_inflate_flush(s, z, r); | ||
304 | r = Z_OK; | ||
305 | zlib_inflate_codes_free(s->sub.decode.codes, z); | ||
306 | LOAD | ||
307 | if (!s->last) | ||
308 | { | ||
309 | s->mode = TYPE; | ||
310 | break; | ||
311 | } | ||
312 | s->mode = DRY; | ||
313 | case DRY: | ||
314 | FLUSH | ||
315 | if (s->read != s->write) | ||
316 | LEAVE | ||
317 | s->mode = B_DONE; | ||
318 | case B_DONE: | ||
319 | r = Z_STREAM_END; | ||
320 | LEAVE | ||
321 | case B_BAD: | ||
322 | r = Z_DATA_ERROR; | ||
323 | LEAVE | ||
324 | default: | ||
325 | r = Z_STREAM_ERROR; | ||
326 | LEAVE | ||
327 | } | ||
328 | } | ||
329 | |||
330 | |||
331 | int zlib_inflate_blocks_free( | ||
332 | inflate_blocks_statef *s, | ||
333 | z_streamp z | ||
334 | ) | ||
335 | { | ||
336 | zlib_inflate_blocks_reset(s, z, NULL); | ||
337 | return Z_OK; | ||
338 | } | ||
339 | |||
340 | |||
341 | void zlib_inflate_set_dictionary( | ||
342 | inflate_blocks_statef *s, | ||
343 | const Byte *d, | ||
344 | uInt n | ||
345 | ) | ||
346 | { | ||
347 | memcpy(s->window, d, n); | ||
348 | s->read = s->write = s->window + n; | ||
349 | } | ||
350 | |||
351 | |||
352 | /* Returns true if inflate is currently at the end of a block generated | ||
353 | * by Z_SYNC_FLUSH or Z_FULL_FLUSH. | ||
354 | * IN assertion: s != NULL | ||
355 | */ | ||
356 | int zlib_inflate_blocks_sync_point( | ||
357 | inflate_blocks_statef *s | ||
358 | ) | ||
359 | { | ||
360 | return s->mode == LENS; | ||
361 | } | ||
diff --git a/lib/zlib_inflate/infblock.h b/lib/zlib_inflate/infblock.h new file mode 100644 index 000000000000..f5221ddf6054 --- /dev/null +++ b/lib/zlib_inflate/infblock.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* infblock.h -- header to use infblock.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFBLOCK_H | ||
12 | #define _INFBLOCK_H | ||
13 | |||
14 | struct inflate_blocks_state; | ||
15 | typedef struct inflate_blocks_state inflate_blocks_statef; | ||
16 | |||
17 | extern inflate_blocks_statef * zlib_inflate_blocks_new ( | ||
18 | z_streamp z, | ||
19 | check_func c, /* check function */ | ||
20 | uInt w); /* window size */ | ||
21 | |||
22 | extern int zlib_inflate_blocks ( | ||
23 | inflate_blocks_statef *, | ||
24 | z_streamp , | ||
25 | int); /* initial return code */ | ||
26 | |||
27 | extern void zlib_inflate_blocks_reset ( | ||
28 | inflate_blocks_statef *, | ||
29 | z_streamp , | ||
30 | uLong *); /* check value on output */ | ||
31 | |||
32 | extern int zlib_inflate_blocks_free ( | ||
33 | inflate_blocks_statef *, | ||
34 | z_streamp); | ||
35 | |||
36 | extern void zlib_inflate_set_dictionary ( | ||
37 | inflate_blocks_statef *s, | ||
38 | const Byte *d, /* dictionary */ | ||
39 | uInt n); /* dictionary length */ | ||
40 | |||
41 | extern int zlib_inflate_blocks_sync_point ( | ||
42 | inflate_blocks_statef *s); | ||
43 | |||
44 | #endif /* _INFBLOCK_H */ | ||
diff --git a/lib/zlib_inflate/infcodes.c b/lib/zlib_inflate/infcodes.c new file mode 100644 index 000000000000..07cd7591cbb7 --- /dev/null +++ b/lib/zlib_inflate/infcodes.c | |||
@@ -0,0 +1,202 @@ | |||
1 | /* infcodes.c -- process literals and length/distance pairs | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infblock.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | #include "inffast.h" | ||
12 | |||
13 | /* simplify the use of the inflate_huft type with some defines */ | ||
14 | #define exop word.what.Exop | ||
15 | #define bits word.what.Bits | ||
16 | |||
17 | inflate_codes_statef *zlib_inflate_codes_new( | ||
18 | uInt bl, | ||
19 | uInt bd, | ||
20 | inflate_huft *tl, | ||
21 | inflate_huft *td, /* need separate declaration for Borland C++ */ | ||
22 | z_streamp z | ||
23 | ) | ||
24 | { | ||
25 | inflate_codes_statef *c; | ||
26 | |||
27 | c = &WS(z)->working_state; | ||
28 | { | ||
29 | c->mode = START; | ||
30 | c->lbits = (Byte)bl; | ||
31 | c->dbits = (Byte)bd; | ||
32 | c->ltree = tl; | ||
33 | c->dtree = td; | ||
34 | } | ||
35 | return c; | ||
36 | } | ||
37 | |||
38 | |||
39 | int zlib_inflate_codes( | ||
40 | inflate_blocks_statef *s, | ||
41 | z_streamp z, | ||
42 | int r | ||
43 | ) | ||
44 | { | ||
45 | uInt j; /* temporary storage */ | ||
46 | inflate_huft *t; /* temporary pointer */ | ||
47 | uInt e; /* extra bits or operation */ | ||
48 | uLong b; /* bit buffer */ | ||
49 | uInt k; /* bits in bit buffer */ | ||
50 | Byte *p; /* input data pointer */ | ||
51 | uInt n; /* bytes available there */ | ||
52 | Byte *q; /* output window write pointer */ | ||
53 | uInt m; /* bytes to end of window or read pointer */ | ||
54 | Byte *f; /* pointer to copy strings from */ | ||
55 | inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ | ||
56 | |||
57 | /* copy input/output information to locals (UPDATE macro restores) */ | ||
58 | LOAD | ||
59 | |||
60 | /* process input and output based on current state */ | ||
61 | while (1) switch (c->mode) | ||
62 | { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||
63 | case START: /* x: set up for LEN */ | ||
64 | #ifndef SLOW | ||
65 | if (m >= 258 && n >= 10) | ||
66 | { | ||
67 | UPDATE | ||
68 | r = zlib_inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); | ||
69 | LOAD | ||
70 | if (r != Z_OK) | ||
71 | { | ||
72 | c->mode = r == Z_STREAM_END ? WASH : BADCODE; | ||
73 | break; | ||
74 | } | ||
75 | } | ||
76 | #endif /* !SLOW */ | ||
77 | c->sub.code.need = c->lbits; | ||
78 | c->sub.code.tree = c->ltree; | ||
79 | c->mode = LEN; | ||
80 | case LEN: /* i: get length/literal/eob next */ | ||
81 | j = c->sub.code.need; | ||
82 | NEEDBITS(j) | ||
83 | t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); | ||
84 | DUMPBITS(t->bits) | ||
85 | e = (uInt)(t->exop); | ||
86 | if (e == 0) /* literal */ | ||
87 | { | ||
88 | c->sub.lit = t->base; | ||
89 | c->mode = LIT; | ||
90 | break; | ||
91 | } | ||
92 | if (e & 16) /* length */ | ||
93 | { | ||
94 | c->sub.copy.get = e & 15; | ||
95 | c->len = t->base; | ||
96 | c->mode = LENEXT; | ||
97 | break; | ||
98 | } | ||
99 | if ((e & 64) == 0) /* next table */ | ||
100 | { | ||
101 | c->sub.code.need = e; | ||
102 | c->sub.code.tree = t + t->base; | ||
103 | break; | ||
104 | } | ||
105 | if (e & 32) /* end of block */ | ||
106 | { | ||
107 | c->mode = WASH; | ||
108 | break; | ||
109 | } | ||
110 | c->mode = BADCODE; /* invalid code */ | ||
111 | z->msg = (char*)"invalid literal/length code"; | ||
112 | r = Z_DATA_ERROR; | ||
113 | LEAVE | ||
114 | case LENEXT: /* i: getting length extra (have base) */ | ||
115 | j = c->sub.copy.get; | ||
116 | NEEDBITS(j) | ||
117 | c->len += (uInt)b & zlib_inflate_mask[j]; | ||
118 | DUMPBITS(j) | ||
119 | c->sub.code.need = c->dbits; | ||
120 | c->sub.code.tree = c->dtree; | ||
121 | c->mode = DIST; | ||
122 | case DIST: /* i: get distance next */ | ||
123 | j = c->sub.code.need; | ||
124 | NEEDBITS(j) | ||
125 | t = c->sub.code.tree + ((uInt)b & zlib_inflate_mask[j]); | ||
126 | DUMPBITS(t->bits) | ||
127 | e = (uInt)(t->exop); | ||
128 | if (e & 16) /* distance */ | ||
129 | { | ||
130 | c->sub.copy.get = e & 15; | ||
131 | c->sub.copy.dist = t->base; | ||
132 | c->mode = DISTEXT; | ||
133 | break; | ||
134 | } | ||
135 | if ((e & 64) == 0) /* next table */ | ||
136 | { | ||
137 | c->sub.code.need = e; | ||
138 | c->sub.code.tree = t + t->base; | ||
139 | break; | ||
140 | } | ||
141 | c->mode = BADCODE; /* invalid code */ | ||
142 | z->msg = (char*)"invalid distance code"; | ||
143 | r = Z_DATA_ERROR; | ||
144 | LEAVE | ||
145 | case DISTEXT: /* i: getting distance extra */ | ||
146 | j = c->sub.copy.get; | ||
147 | NEEDBITS(j) | ||
148 | c->sub.copy.dist += (uInt)b & zlib_inflate_mask[j]; | ||
149 | DUMPBITS(j) | ||
150 | c->mode = COPY; | ||
151 | case COPY: /* o: copying bytes in window, waiting for space */ | ||
152 | f = q - c->sub.copy.dist; | ||
153 | while (f < s->window) /* modulo window size-"while" instead */ | ||
154 | f += s->end - s->window; /* of "if" handles invalid distances */ | ||
155 | while (c->len) | ||
156 | { | ||
157 | NEEDOUT | ||
158 | OUTBYTE(*f++) | ||
159 | if (f == s->end) | ||
160 | f = s->window; | ||
161 | c->len--; | ||
162 | } | ||
163 | c->mode = START; | ||
164 | break; | ||
165 | case LIT: /* o: got literal, waiting for output space */ | ||
166 | NEEDOUT | ||
167 | OUTBYTE(c->sub.lit) | ||
168 | c->mode = START; | ||
169 | break; | ||
170 | case WASH: /* o: got eob, possibly more output */ | ||
171 | if (k > 7) /* return unused byte, if any */ | ||
172 | { | ||
173 | k -= 8; | ||
174 | n++; | ||
175 | p--; /* can always return one */ | ||
176 | } | ||
177 | FLUSH | ||
178 | if (s->read != s->write) | ||
179 | LEAVE | ||
180 | c->mode = END; | ||
181 | case END: | ||
182 | r = Z_STREAM_END; | ||
183 | LEAVE | ||
184 | case BADCODE: /* x: got error */ | ||
185 | r = Z_DATA_ERROR; | ||
186 | LEAVE | ||
187 | default: | ||
188 | r = Z_STREAM_ERROR; | ||
189 | LEAVE | ||
190 | } | ||
191 | #ifdef NEED_DUMMY_RETURN | ||
192 | return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ | ||
193 | #endif | ||
194 | } | ||
195 | |||
196 | |||
197 | void zlib_inflate_codes_free( | ||
198 | inflate_codes_statef *c, | ||
199 | z_streamp z | ||
200 | ) | ||
201 | { | ||
202 | } | ||
diff --git a/lib/zlib_inflate/infcodes.h b/lib/zlib_inflate/infcodes.h new file mode 100644 index 000000000000..5cff417523b0 --- /dev/null +++ b/lib/zlib_inflate/infcodes.h | |||
@@ -0,0 +1,33 @@ | |||
1 | /* infcodes.h -- header to use infcodes.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFCODES_H | ||
12 | #define _INFCODES_H | ||
13 | |||
14 | #include "infblock.h" | ||
15 | |||
16 | struct inflate_codes_state; | ||
17 | typedef struct inflate_codes_state inflate_codes_statef; | ||
18 | |||
19 | extern inflate_codes_statef *zlib_inflate_codes_new ( | ||
20 | uInt, uInt, | ||
21 | inflate_huft *, inflate_huft *, | ||
22 | z_streamp ); | ||
23 | |||
24 | extern int zlib_inflate_codes ( | ||
25 | inflate_blocks_statef *, | ||
26 | z_streamp , | ||
27 | int); | ||
28 | |||
29 | extern void zlib_inflate_codes_free ( | ||
30 | inflate_codes_statef *, | ||
31 | z_streamp ); | ||
32 | |||
33 | #endif /* _INFCODES_H */ | ||
diff --git a/lib/zlib_inflate/inffast.c b/lib/zlib_inflate/inffast.c new file mode 100644 index 000000000000..0bd7623fc85a --- /dev/null +++ b/lib/zlib_inflate/inffast.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* inffast.c -- process literals and length/distance pairs fast | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infblock.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | #include "inffast.h" | ||
12 | |||
13 | struct inflate_codes_state; | ||
14 | |||
15 | /* simplify the use of the inflate_huft type with some defines */ | ||
16 | #define exop word.what.Exop | ||
17 | #define bits word.what.Bits | ||
18 | |||
19 | /* macros for bit input with no checking and for returning unused bytes */ | ||
20 | #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||
21 | #define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;} | ||
22 | |||
23 | /* Called with number of bytes left to write in window at least 258 | ||
24 | (the maximum string length) and number of input bytes available | ||
25 | at least ten. The ten bytes are six bytes for the longest length/ | ||
26 | distance pair plus four bytes for overloading the bit buffer. */ | ||
27 | |||
28 | int zlib_inflate_fast( | ||
29 | uInt bl, | ||
30 | uInt bd, | ||
31 | inflate_huft *tl, | ||
32 | inflate_huft *td, /* need separate declaration for Borland C++ */ | ||
33 | inflate_blocks_statef *s, | ||
34 | z_streamp z | ||
35 | ) | ||
36 | { | ||
37 | inflate_huft *t; /* temporary pointer */ | ||
38 | uInt e; /* extra bits or operation */ | ||
39 | uLong b; /* bit buffer */ | ||
40 | uInt k; /* bits in bit buffer */ | ||
41 | Byte *p; /* input data pointer */ | ||
42 | uInt n; /* bytes available there */ | ||
43 | Byte *q; /* output window write pointer */ | ||
44 | uInt m; /* bytes to end of window or read pointer */ | ||
45 | uInt ml; /* mask for literal/length tree */ | ||
46 | uInt md; /* mask for distance tree */ | ||
47 | uInt c; /* bytes to copy */ | ||
48 | uInt d; /* distance back to copy from */ | ||
49 | Byte *r; /* copy source pointer */ | ||
50 | |||
51 | /* load input, output, bit values */ | ||
52 | LOAD | ||
53 | |||
54 | /* initialize masks */ | ||
55 | ml = zlib_inflate_mask[bl]; | ||
56 | md = zlib_inflate_mask[bd]; | ||
57 | |||
58 | /* do until not enough input or output space for fast loop */ | ||
59 | do { /* assume called with m >= 258 && n >= 10 */ | ||
60 | /* get literal/length code */ | ||
61 | GRABBITS(20) /* max bits for literal/length code */ | ||
62 | if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) | ||
63 | { | ||
64 | DUMPBITS(t->bits) | ||
65 | *q++ = (Byte)t->base; | ||
66 | m--; | ||
67 | continue; | ||
68 | } | ||
69 | do { | ||
70 | DUMPBITS(t->bits) | ||
71 | if (e & 16) | ||
72 | { | ||
73 | /* get extra bits for length */ | ||
74 | e &= 15; | ||
75 | c = t->base + ((uInt)b & zlib_inflate_mask[e]); | ||
76 | DUMPBITS(e) | ||
77 | |||
78 | /* decode distance base of block to copy */ | ||
79 | GRABBITS(15); /* max bits for distance code */ | ||
80 | e = (t = td + ((uInt)b & md))->exop; | ||
81 | do { | ||
82 | DUMPBITS(t->bits) | ||
83 | if (e & 16) | ||
84 | { | ||
85 | /* get extra bits to add to distance base */ | ||
86 | e &= 15; | ||
87 | GRABBITS(e) /* get extra bits (up to 13) */ | ||
88 | d = t->base + ((uInt)b & zlib_inflate_mask[e]); | ||
89 | DUMPBITS(e) | ||
90 | |||
91 | /* do the copy */ | ||
92 | m -= c; | ||
93 | r = q - d; | ||
94 | if (r < s->window) /* wrap if needed */ | ||
95 | { | ||
96 | do { | ||
97 | r += s->end - s->window; /* force pointer in window */ | ||
98 | } while (r < s->window); /* covers invalid distances */ | ||
99 | e = s->end - r; | ||
100 | if (c > e) | ||
101 | { | ||
102 | c -= e; /* wrapped copy */ | ||
103 | do { | ||
104 | *q++ = *r++; | ||
105 | } while (--e); | ||
106 | r = s->window; | ||
107 | do { | ||
108 | *q++ = *r++; | ||
109 | } while (--c); | ||
110 | } | ||
111 | else /* normal copy */ | ||
112 | { | ||
113 | *q++ = *r++; c--; | ||
114 | *q++ = *r++; c--; | ||
115 | do { | ||
116 | *q++ = *r++; | ||
117 | } while (--c); | ||
118 | } | ||
119 | } | ||
120 | else /* normal copy */ | ||
121 | { | ||
122 | *q++ = *r++; c--; | ||
123 | *q++ = *r++; c--; | ||
124 | do { | ||
125 | *q++ = *r++; | ||
126 | } while (--c); | ||
127 | } | ||
128 | break; | ||
129 | } | ||
130 | else if ((e & 64) == 0) | ||
131 | { | ||
132 | t += t->base; | ||
133 | e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop; | ||
134 | } | ||
135 | else | ||
136 | { | ||
137 | z->msg = (char*)"invalid distance code"; | ||
138 | UNGRAB | ||
139 | UPDATE | ||
140 | return Z_DATA_ERROR; | ||
141 | } | ||
142 | } while (1); | ||
143 | break; | ||
144 | } | ||
145 | if ((e & 64) == 0) | ||
146 | { | ||
147 | t += t->base; | ||
148 | if ((e = (t += ((uInt)b & zlib_inflate_mask[e]))->exop) == 0) | ||
149 | { | ||
150 | DUMPBITS(t->bits) | ||
151 | *q++ = (Byte)t->base; | ||
152 | m--; | ||
153 | break; | ||
154 | } | ||
155 | } | ||
156 | else if (e & 32) | ||
157 | { | ||
158 | UNGRAB | ||
159 | UPDATE | ||
160 | return Z_STREAM_END; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | z->msg = (char*)"invalid literal/length code"; | ||
165 | UNGRAB | ||
166 | UPDATE | ||
167 | return Z_DATA_ERROR; | ||
168 | } | ||
169 | } while (1); | ||
170 | } while (m >= 258 && n >= 10); | ||
171 | |||
172 | /* not enough input or output--restore pointers and return */ | ||
173 | UNGRAB | ||
174 | UPDATE | ||
175 | return Z_OK; | ||
176 | } | ||
diff --git a/lib/zlib_inflate/inffast.h b/lib/zlib_inflate/inffast.h new file mode 100644 index 000000000000..fc720f0fa7f5 --- /dev/null +++ b/lib/zlib_inflate/inffast.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* inffast.h -- header to use inffast.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | extern int zlib_inflate_fast ( | ||
12 | uInt, | ||
13 | uInt, | ||
14 | inflate_huft *, | ||
15 | inflate_huft *, | ||
16 | inflate_blocks_statef *, | ||
17 | z_streamp ); | ||
diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c new file mode 100644 index 000000000000..3d94cb90c1d3 --- /dev/null +++ b/lib/zlib_inflate/inflate.c | |||
@@ -0,0 +1,248 @@ | |||
1 | /* inflate.c -- zlib interface to inflate modules | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/module.h> | ||
7 | #include <linux/zutil.h> | ||
8 | #include "infblock.h" | ||
9 | #include "infutil.h" | ||
10 | |||
11 | int zlib_inflate_workspacesize(void) | ||
12 | { | ||
13 | return sizeof(struct inflate_workspace); | ||
14 | } | ||
15 | |||
16 | |||
17 | int zlib_inflateReset( | ||
18 | z_streamp z | ||
19 | ) | ||
20 | { | ||
21 | if (z == NULL || z->state == NULL || z->workspace == NULL) | ||
22 | return Z_STREAM_ERROR; | ||
23 | z->total_in = z->total_out = 0; | ||
24 | z->msg = NULL; | ||
25 | z->state->mode = z->state->nowrap ? BLOCKS : METHOD; | ||
26 | zlib_inflate_blocks_reset(z->state->blocks, z, NULL); | ||
27 | return Z_OK; | ||
28 | } | ||
29 | |||
30 | |||
31 | int zlib_inflateEnd( | ||
32 | z_streamp z | ||
33 | ) | ||
34 | { | ||
35 | if (z == NULL || z->state == NULL || z->workspace == NULL) | ||
36 | return Z_STREAM_ERROR; | ||
37 | if (z->state->blocks != NULL) | ||
38 | zlib_inflate_blocks_free(z->state->blocks, z); | ||
39 | z->state = NULL; | ||
40 | return Z_OK; | ||
41 | } | ||
42 | |||
43 | |||
44 | int zlib_inflateInit2_( | ||
45 | z_streamp z, | ||
46 | int w, | ||
47 | const char *version, | ||
48 | int stream_size | ||
49 | ) | ||
50 | { | ||
51 | if (version == NULL || version[0] != ZLIB_VERSION[0] || | ||
52 | stream_size != sizeof(z_stream) || z->workspace == NULL) | ||
53 | return Z_VERSION_ERROR; | ||
54 | |||
55 | /* initialize state */ | ||
56 | z->msg = NULL; | ||
57 | z->state = &WS(z)->internal_state; | ||
58 | z->state->blocks = NULL; | ||
59 | |||
60 | /* handle undocumented nowrap option (no zlib header or check) */ | ||
61 | z->state->nowrap = 0; | ||
62 | if (w < 0) | ||
63 | { | ||
64 | w = - w; | ||
65 | z->state->nowrap = 1; | ||
66 | } | ||
67 | |||
68 | /* set window size */ | ||
69 | if (w < 8 || w > 15) | ||
70 | { | ||
71 | zlib_inflateEnd(z); | ||
72 | return Z_STREAM_ERROR; | ||
73 | } | ||
74 | z->state->wbits = (uInt)w; | ||
75 | |||
76 | /* create inflate_blocks state */ | ||
77 | if ((z->state->blocks = | ||
78 | zlib_inflate_blocks_new(z, z->state->nowrap ? NULL : zlib_adler32, (uInt)1 << w)) | ||
79 | == NULL) | ||
80 | { | ||
81 | zlib_inflateEnd(z); | ||
82 | return Z_MEM_ERROR; | ||
83 | } | ||
84 | |||
85 | /* reset state */ | ||
86 | zlib_inflateReset(z); | ||
87 | return Z_OK; | ||
88 | } | ||
89 | |||
90 | |||
91 | /* | ||
92 | * At the end of a Deflate-compressed PPP packet, we expect to have seen | ||
93 | * a `stored' block type value but not the (zero) length bytes. | ||
94 | */ | ||
95 | static int zlib_inflate_packet_flush(inflate_blocks_statef *s) | ||
96 | { | ||
97 | if (s->mode != LENS) | ||
98 | return Z_DATA_ERROR; | ||
99 | s->mode = TYPE; | ||
100 | return Z_OK; | ||
101 | } | ||
102 | |||
103 | |||
104 | int zlib_inflateInit_( | ||
105 | z_streamp z, | ||
106 | const char *version, | ||
107 | int stream_size | ||
108 | ) | ||
109 | { | ||
110 | return zlib_inflateInit2_(z, DEF_WBITS, version, stream_size); | ||
111 | } | ||
112 | |||
113 | #undef NEEDBYTE | ||
114 | #undef NEXTBYTE | ||
115 | #define NEEDBYTE {if(z->avail_in==0)goto empty;r=trv;} | ||
116 | #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) | ||
117 | |||
118 | int zlib_inflate( | ||
119 | z_streamp z, | ||
120 | int f | ||
121 | ) | ||
122 | { | ||
123 | int r, trv; | ||
124 | uInt b; | ||
125 | |||
126 | if (z == NULL || z->state == NULL || z->next_in == NULL) | ||
127 | return Z_STREAM_ERROR; | ||
128 | trv = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; | ||
129 | r = Z_BUF_ERROR; | ||
130 | while (1) switch (z->state->mode) | ||
131 | { | ||
132 | case METHOD: | ||
133 | NEEDBYTE | ||
134 | if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) | ||
135 | { | ||
136 | z->state->mode = I_BAD; | ||
137 | z->msg = (char*)"unknown compression method"; | ||
138 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
139 | break; | ||
140 | } | ||
141 | if ((z->state->sub.method >> 4) + 8 > z->state->wbits) | ||
142 | { | ||
143 | z->state->mode = I_BAD; | ||
144 | z->msg = (char*)"invalid window size"; | ||
145 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
146 | break; | ||
147 | } | ||
148 | z->state->mode = FLAG; | ||
149 | case FLAG: | ||
150 | NEEDBYTE | ||
151 | b = NEXTBYTE; | ||
152 | if (((z->state->sub.method << 8) + b) % 31) | ||
153 | { | ||
154 | z->state->mode = I_BAD; | ||
155 | z->msg = (char*)"incorrect header check"; | ||
156 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
157 | break; | ||
158 | } | ||
159 | if (!(b & PRESET_DICT)) | ||
160 | { | ||
161 | z->state->mode = BLOCKS; | ||
162 | break; | ||
163 | } | ||
164 | z->state->mode = DICT4; | ||
165 | case DICT4: | ||
166 | NEEDBYTE | ||
167 | z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||
168 | z->state->mode = DICT3; | ||
169 | case DICT3: | ||
170 | NEEDBYTE | ||
171 | z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||
172 | z->state->mode = DICT2; | ||
173 | case DICT2: | ||
174 | NEEDBYTE | ||
175 | z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||
176 | z->state->mode = DICT1; | ||
177 | case DICT1: | ||
178 | NEEDBYTE | ||
179 | z->state->sub.check.need += (uLong)NEXTBYTE; | ||
180 | z->adler = z->state->sub.check.need; | ||
181 | z->state->mode = DICT0; | ||
182 | return Z_NEED_DICT; | ||
183 | case DICT0: | ||
184 | z->state->mode = I_BAD; | ||
185 | z->msg = (char*)"need dictionary"; | ||
186 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
187 | return Z_STREAM_ERROR; | ||
188 | case BLOCKS: | ||
189 | r = zlib_inflate_blocks(z->state->blocks, z, r); | ||
190 | if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0) | ||
191 | r = zlib_inflate_packet_flush(z->state->blocks); | ||
192 | if (r == Z_DATA_ERROR) | ||
193 | { | ||
194 | z->state->mode = I_BAD; | ||
195 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
196 | break; | ||
197 | } | ||
198 | if (r == Z_OK) | ||
199 | r = trv; | ||
200 | if (r != Z_STREAM_END) | ||
201 | return r; | ||
202 | r = trv; | ||
203 | zlib_inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); | ||
204 | if (z->state->nowrap) | ||
205 | { | ||
206 | z->state->mode = I_DONE; | ||
207 | break; | ||
208 | } | ||
209 | z->state->mode = CHECK4; | ||
210 | case CHECK4: | ||
211 | NEEDBYTE | ||
212 | z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||
213 | z->state->mode = CHECK3; | ||
214 | case CHECK3: | ||
215 | NEEDBYTE | ||
216 | z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||
217 | z->state->mode = CHECK2; | ||
218 | case CHECK2: | ||
219 | NEEDBYTE | ||
220 | z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||
221 | z->state->mode = CHECK1; | ||
222 | case CHECK1: | ||
223 | NEEDBYTE | ||
224 | z->state->sub.check.need += (uLong)NEXTBYTE; | ||
225 | |||
226 | if (z->state->sub.check.was != z->state->sub.check.need) | ||
227 | { | ||
228 | z->state->mode = I_BAD; | ||
229 | z->msg = (char*)"incorrect data check"; | ||
230 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
231 | break; | ||
232 | } | ||
233 | z->state->mode = I_DONE; | ||
234 | case I_DONE: | ||
235 | return Z_STREAM_END; | ||
236 | case I_BAD: | ||
237 | return Z_DATA_ERROR; | ||
238 | default: | ||
239 | return Z_STREAM_ERROR; | ||
240 | } | ||
241 | empty: | ||
242 | if (f != Z_PACKET_FLUSH) | ||
243 | return r; | ||
244 | z->state->mode = I_BAD; | ||
245 | z->msg = (char *)"need more for packet flush"; | ||
246 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
247 | return Z_DATA_ERROR; | ||
248 | } | ||
diff --git a/lib/zlib_inflate/inflate_syms.c b/lib/zlib_inflate/inflate_syms.c new file mode 100644 index 000000000000..aa1b08189121 --- /dev/null +++ b/lib/zlib_inflate/inflate_syms.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /* | ||
2 | * linux/lib/zlib_inflate/inflate_syms.c | ||
3 | * | ||
4 | * Exported symbols for the inflate functionality. | ||
5 | * | ||
6 | */ | ||
7 | |||
8 | #include <linux/module.h> | ||
9 | #include <linux/init.h> | ||
10 | |||
11 | #include <linux/zlib.h> | ||
12 | |||
13 | EXPORT_SYMBOL(zlib_inflate_workspacesize); | ||
14 | EXPORT_SYMBOL(zlib_inflate); | ||
15 | EXPORT_SYMBOL(zlib_inflateInit_); | ||
16 | EXPORT_SYMBOL(zlib_inflateInit2_); | ||
17 | EXPORT_SYMBOL(zlib_inflateEnd); | ||
18 | EXPORT_SYMBOL(zlib_inflateSync); | ||
19 | EXPORT_SYMBOL(zlib_inflateReset); | ||
20 | EXPORT_SYMBOL(zlib_inflateSyncPoint); | ||
21 | EXPORT_SYMBOL(zlib_inflateIncomp); | ||
22 | MODULE_LICENSE("GPL"); | ||
diff --git a/lib/zlib_inflate/inflate_sync.c b/lib/zlib_inflate/inflate_sync.c new file mode 100644 index 000000000000..e07bdb21f55c --- /dev/null +++ b/lib/zlib_inflate/inflate_sync.c | |||
@@ -0,0 +1,148 @@ | |||
1 | /* inflate.c -- zlib interface to inflate modules | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "infutil.h" | ||
9 | |||
10 | int zlib_inflateSync( | ||
11 | z_streamp z | ||
12 | ) | ||
13 | { | ||
14 | uInt n; /* number of bytes to look at */ | ||
15 | Byte *p; /* pointer to bytes */ | ||
16 | uInt m; /* number of marker bytes found in a row */ | ||
17 | uLong r, w; /* temporaries to save total_in and total_out */ | ||
18 | |||
19 | /* set up */ | ||
20 | if (z == NULL || z->state == NULL) | ||
21 | return Z_STREAM_ERROR; | ||
22 | if (z->state->mode != I_BAD) | ||
23 | { | ||
24 | z->state->mode = I_BAD; | ||
25 | z->state->sub.marker = 0; | ||
26 | } | ||
27 | if ((n = z->avail_in) == 0) | ||
28 | return Z_BUF_ERROR; | ||
29 | p = z->next_in; | ||
30 | m = z->state->sub.marker; | ||
31 | |||
32 | /* search */ | ||
33 | while (n && m < 4) | ||
34 | { | ||
35 | static const Byte mark[4] = {0, 0, 0xff, 0xff}; | ||
36 | if (*p == mark[m]) | ||
37 | m++; | ||
38 | else if (*p) | ||
39 | m = 0; | ||
40 | else | ||
41 | m = 4 - m; | ||
42 | p++, n--; | ||
43 | } | ||
44 | |||
45 | /* restore */ | ||
46 | z->total_in += p - z->next_in; | ||
47 | z->next_in = p; | ||
48 | z->avail_in = n; | ||
49 | z->state->sub.marker = m; | ||
50 | |||
51 | /* return no joy or set up to restart on a new block */ | ||
52 | if (m != 4) | ||
53 | return Z_DATA_ERROR; | ||
54 | r = z->total_in; w = z->total_out; | ||
55 | zlib_inflateReset(z); | ||
56 | z->total_in = r; z->total_out = w; | ||
57 | z->state->mode = BLOCKS; | ||
58 | return Z_OK; | ||
59 | } | ||
60 | |||
61 | |||
62 | /* Returns true if inflate is currently at the end of a block generated | ||
63 | * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP | ||
64 | * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH | ||
65 | * but removes the length bytes of the resulting empty stored block. When | ||
66 | * decompressing, PPP checks that at the end of input packet, inflate is | ||
67 | * waiting for these length bytes. | ||
68 | */ | ||
69 | int zlib_inflateSyncPoint( | ||
70 | z_streamp z | ||
71 | ) | ||
72 | { | ||
73 | if (z == NULL || z->state == NULL || z->state->blocks == NULL) | ||
74 | return Z_STREAM_ERROR; | ||
75 | return zlib_inflate_blocks_sync_point(z->state->blocks); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * This subroutine adds the data at next_in/avail_in to the output history | ||
80 | * without performing any output. The output buffer must be "caught up"; | ||
81 | * i.e. no pending output (hence s->read equals s->write), and the state must | ||
82 | * be BLOCKS (i.e. we should be willing to see the start of a series of | ||
83 | * BLOCKS). On exit, the output will also be caught up, and the checksum | ||
84 | * will have been updated if need be. | ||
85 | */ | ||
86 | static int zlib_inflate_addhistory(inflate_blocks_statef *s, | ||
87 | z_stream *z) | ||
88 | { | ||
89 | uLong b; /* bit buffer */ /* NOT USED HERE */ | ||
90 | uInt k; /* bits in bit buffer */ /* NOT USED HERE */ | ||
91 | uInt t; /* temporary storage */ | ||
92 | Byte *p; /* input data pointer */ | ||
93 | uInt n; /* bytes available there */ | ||
94 | Byte *q; /* output window write pointer */ | ||
95 | uInt m; /* bytes to end of window or read pointer */ | ||
96 | |||
97 | if (s->read != s->write) | ||
98 | return Z_STREAM_ERROR; | ||
99 | if (s->mode != TYPE) | ||
100 | return Z_DATA_ERROR; | ||
101 | |||
102 | /* we're ready to rock */ | ||
103 | LOAD | ||
104 | /* while there is input ready, copy to output buffer, moving | ||
105 | * pointers as needed. | ||
106 | */ | ||
107 | while (n) { | ||
108 | t = n; /* how many to do */ | ||
109 | /* is there room until end of buffer? */ | ||
110 | if (t > m) t = m; | ||
111 | /* update check information */ | ||
112 | if (s->checkfn != NULL) | ||
113 | s->check = (*s->checkfn)(s->check, q, t); | ||
114 | memcpy(q, p, t); | ||
115 | q += t; | ||
116 | p += t; | ||
117 | n -= t; | ||
118 | z->total_out += t; | ||
119 | s->read = q; /* drag read pointer forward */ | ||
120 | /* WWRAP */ /* expand WWRAP macro by hand to handle s->read */ | ||
121 | if (q == s->end) { | ||
122 | s->read = q = s->window; | ||
123 | m = WAVAIL; | ||
124 | } | ||
125 | } | ||
126 | UPDATE | ||
127 | return Z_OK; | ||
128 | } | ||
129 | |||
130 | |||
131 | /* | ||
132 | * This subroutine adds the data at next_in/avail_in to the output history | ||
133 | * without performing any output. The output buffer must be "caught up"; | ||
134 | * i.e. no pending output (hence s->read equals s->write), and the state must | ||
135 | * be BLOCKS (i.e. we should be willing to see the start of a series of | ||
136 | * BLOCKS). On exit, the output will also be caught up, and the checksum | ||
137 | * will have been updated if need be. | ||
138 | */ | ||
139 | |||
140 | int zlib_inflateIncomp( | ||
141 | z_stream *z | ||
142 | |||
143 | ) | ||
144 | { | ||
145 | if (z->state->mode != BLOCKS) | ||
146 | return Z_DATA_ERROR; | ||
147 | return zlib_inflate_addhistory(z->state->blocks, z); | ||
148 | } | ||
diff --git a/lib/zlib_inflate/inftrees.c b/lib/zlib_inflate/inftrees.c new file mode 100644 index 000000000000..874950ec4858 --- /dev/null +++ b/lib/zlib_inflate/inftrees.c | |||
@@ -0,0 +1,412 @@ | |||
1 | /* inftrees.c -- generate Huffman trees for efficient decoding | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "inftrees.h" | ||
8 | #include "infutil.h" | ||
9 | |||
10 | static const char inflate_copyright[] __attribute_used__ = | ||
11 | " inflate 1.1.3 Copyright 1995-1998 Mark Adler "; | ||
12 | /* | ||
13 | If you use the zlib library in a product, an acknowledgment is welcome | ||
14 | in the documentation of your product. If for some reason you cannot | ||
15 | include such an acknowledgment, I would appreciate that you keep this | ||
16 | copyright string in the executable of your product. | ||
17 | */ | ||
18 | struct internal_state; | ||
19 | |||
20 | /* simplify the use of the inflate_huft type with some defines */ | ||
21 | #define exop word.what.Exop | ||
22 | #define bits word.what.Bits | ||
23 | |||
24 | |||
25 | static int huft_build ( | ||
26 | uInt *, /* code lengths in bits */ | ||
27 | uInt, /* number of codes */ | ||
28 | uInt, /* number of "simple" codes */ | ||
29 | const uInt *, /* list of base values for non-simple codes */ | ||
30 | const uInt *, /* list of extra bits for non-simple codes */ | ||
31 | inflate_huft **, /* result: starting table */ | ||
32 | uInt *, /* maximum lookup bits (returns actual) */ | ||
33 | inflate_huft *, /* space for trees */ | ||
34 | uInt *, /* hufts used in space */ | ||
35 | uInt * ); /* space for values */ | ||
36 | |||
37 | /* Tables for deflate from PKZIP's appnote.txt. */ | ||
38 | static const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ | ||
39 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | ||
40 | 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | ||
41 | /* see note #13 above about 258 */ | ||
42 | static const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ | ||
43 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | ||
44 | 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ | ||
45 | static const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ | ||
46 | 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | ||
47 | 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | ||
48 | 8193, 12289, 16385, 24577}; | ||
49 | static const uInt cpdext[30] = { /* Extra bits for distance codes */ | ||
50 | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | ||
51 | 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | ||
52 | 12, 12, 13, 13}; | ||
53 | |||
54 | /* | ||
55 | Huffman code decoding is performed using a multi-level table lookup. | ||
56 | The fastest way to decode is to simply build a lookup table whose | ||
57 | size is determined by the longest code. However, the time it takes | ||
58 | to build this table can also be a factor if the data being decoded | ||
59 | is not very long. The most common codes are necessarily the | ||
60 | shortest codes, so those codes dominate the decoding time, and hence | ||
61 | the speed. The idea is you can have a shorter table that decodes the | ||
62 | shorter, more probable codes, and then point to subsidiary tables for | ||
63 | the longer codes. The time it costs to decode the longer codes is | ||
64 | then traded against the time it takes to make longer tables. | ||
65 | |||
66 | This results of this trade are in the variables lbits and dbits | ||
67 | below. lbits is the number of bits the first level table for literal/ | ||
68 | length codes can decode in one step, and dbits is the same thing for | ||
69 | the distance codes. Subsequent tables are also less than or equal to | ||
70 | those sizes. These values may be adjusted either when all of the | ||
71 | codes are shorter than that, in which case the longest code length in | ||
72 | bits is used, or when the shortest code is *longer* than the requested | ||
73 | table size, in which case the length of the shortest code in bits is | ||
74 | used. | ||
75 | |||
76 | There are two different values for the two tables, since they code a | ||
77 | different number of possibilities each. The literal/length table | ||
78 | codes 286 possible values, or in a flat code, a little over eight | ||
79 | bits. The distance table codes 30 possible values, or a little less | ||
80 | than five bits, flat. The optimum values for speed end up being | ||
81 | about one bit more than those, so lbits is 8+1 and dbits is 5+1. | ||
82 | The optimum values may differ though from machine to machine, and | ||
83 | possibly even between compilers. Your mileage may vary. | ||
84 | */ | ||
85 | |||
86 | |||
87 | /* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ | ||
88 | #define BMAX 15 /* maximum bit length of any code */ | ||
89 | |||
90 | static int huft_build( | ||
91 | uInt *b, /* code lengths in bits (all assumed <= BMAX) */ | ||
92 | uInt n, /* number of codes (assumed <= 288) */ | ||
93 | uInt s, /* number of simple-valued codes (0..s-1) */ | ||
94 | const uInt *d, /* list of base values for non-simple codes */ | ||
95 | const uInt *e, /* list of extra bits for non-simple codes */ | ||
96 | inflate_huft **t, /* result: starting table */ | ||
97 | uInt *m, /* maximum lookup bits, returns actual */ | ||
98 | inflate_huft *hp, /* space for trees */ | ||
99 | uInt *hn, /* hufts used in space */ | ||
100 | uInt *v /* working area: values in order of bit length */ | ||
101 | ) | ||
102 | /* Given a list of code lengths and a maximum table size, make a set of | ||
103 | tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR | ||
104 | if the given code set is incomplete (the tables are still built in this | ||
105 | case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of | ||
106 | lengths), or Z_MEM_ERROR if not enough memory. */ | ||
107 | { | ||
108 | |||
109 | uInt a; /* counter for codes of length k */ | ||
110 | uInt c[BMAX+1]; /* bit length count table */ | ||
111 | uInt f; /* i repeats in table every f entries */ | ||
112 | int g; /* maximum code length */ | ||
113 | int h; /* table level */ | ||
114 | register uInt i; /* counter, current code */ | ||
115 | register uInt j; /* counter */ | ||
116 | register int k; /* number of bits in current code */ | ||
117 | int l; /* bits per table (returned in m) */ | ||
118 | uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ | ||
119 | register uInt *p; /* pointer into c[], b[], or v[] */ | ||
120 | inflate_huft *q; /* points to current table */ | ||
121 | struct inflate_huft_s r; /* table entry for structure assignment */ | ||
122 | inflate_huft *u[BMAX]; /* table stack */ | ||
123 | register int w; /* bits before this table == (l * h) */ | ||
124 | uInt x[BMAX+1]; /* bit offsets, then code stack */ | ||
125 | uInt *xp; /* pointer into x */ | ||
126 | int y; /* number of dummy codes added */ | ||
127 | uInt z; /* number of entries in current table */ | ||
128 | |||
129 | |||
130 | /* Generate counts for each bit length */ | ||
131 | p = c; | ||
132 | #define C0 *p++ = 0; | ||
133 | #define C2 C0 C0 C0 C0 | ||
134 | #define C4 C2 C2 C2 C2 | ||
135 | C4 /* clear c[]--assume BMAX+1 is 16 */ | ||
136 | p = b; i = n; | ||
137 | do { | ||
138 | c[*p++]++; /* assume all entries <= BMAX */ | ||
139 | } while (--i); | ||
140 | if (c[0] == n) /* null input--all zero length codes */ | ||
141 | { | ||
142 | *t = NULL; | ||
143 | *m = 0; | ||
144 | return Z_OK; | ||
145 | } | ||
146 | |||
147 | |||
148 | /* Find minimum and maximum length, bound *m by those */ | ||
149 | l = *m; | ||
150 | for (j = 1; j <= BMAX; j++) | ||
151 | if (c[j]) | ||
152 | break; | ||
153 | k = j; /* minimum code length */ | ||
154 | if ((uInt)l < j) | ||
155 | l = j; | ||
156 | for (i = BMAX; i; i--) | ||
157 | if (c[i]) | ||
158 | break; | ||
159 | g = i; /* maximum code length */ | ||
160 | if ((uInt)l > i) | ||
161 | l = i; | ||
162 | *m = l; | ||
163 | |||
164 | |||
165 | /* Adjust last length count to fill out codes, if needed */ | ||
166 | for (y = 1 << j; j < i; j++, y <<= 1) | ||
167 | if ((y -= c[j]) < 0) | ||
168 | return Z_DATA_ERROR; | ||
169 | if ((y -= c[i]) < 0) | ||
170 | return Z_DATA_ERROR; | ||
171 | c[i] += y; | ||
172 | |||
173 | |||
174 | /* Generate starting offsets into the value table for each length */ | ||
175 | x[1] = j = 0; | ||
176 | p = c + 1; xp = x + 2; | ||
177 | while (--i) { /* note that i == g from above */ | ||
178 | *xp++ = (j += *p++); | ||
179 | } | ||
180 | |||
181 | |||
182 | /* Make a table of values in order of bit lengths */ | ||
183 | p = b; i = 0; | ||
184 | do { | ||
185 | if ((j = *p++) != 0) | ||
186 | v[x[j]++] = i; | ||
187 | } while (++i < n); | ||
188 | n = x[g]; /* set n to length of v */ | ||
189 | |||
190 | |||
191 | /* Generate the Huffman codes and for each, make the table entries */ | ||
192 | x[0] = i = 0; /* first Huffman code is zero */ | ||
193 | p = v; /* grab values in bit order */ | ||
194 | h = -1; /* no tables yet--level -1 */ | ||
195 | w = -l; /* bits decoded == (l * h) */ | ||
196 | u[0] = NULL; /* just to keep compilers happy */ | ||
197 | q = NULL; /* ditto */ | ||
198 | z = 0; /* ditto */ | ||
199 | |||
200 | /* go through the bit lengths (k already is bits in shortest code) */ | ||
201 | for (; k <= g; k++) | ||
202 | { | ||
203 | a = c[k]; | ||
204 | while (a--) | ||
205 | { | ||
206 | /* here i is the Huffman code of length k bits for value *p */ | ||
207 | /* make tables up to required level */ | ||
208 | while (k > w + l) | ||
209 | { | ||
210 | h++; | ||
211 | w += l; /* previous table always l bits */ | ||
212 | |||
213 | /* compute minimum size table less than or equal to l bits */ | ||
214 | z = g - w; | ||
215 | z = z > (uInt)l ? l : z; /* table size upper limit */ | ||
216 | if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ | ||
217 | { /* too few codes for k-w bit table */ | ||
218 | f -= a + 1; /* deduct codes from patterns left */ | ||
219 | xp = c + k; | ||
220 | if (j < z) | ||
221 | while (++j < z) /* try smaller tables up to z bits */ | ||
222 | { | ||
223 | if ((f <<= 1) <= *++xp) | ||
224 | break; /* enough codes to use up j bits */ | ||
225 | f -= *xp; /* else deduct codes from patterns */ | ||
226 | } | ||
227 | } | ||
228 | z = 1 << j; /* table entries for j-bit table */ | ||
229 | |||
230 | /* allocate new table */ | ||
231 | if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ | ||
232 | return Z_DATA_ERROR; /* overflow of MANY */ | ||
233 | u[h] = q = hp + *hn; | ||
234 | *hn += z; | ||
235 | |||
236 | /* connect to last table, if there is one */ | ||
237 | if (h) | ||
238 | { | ||
239 | x[h] = i; /* save pattern for backing up */ | ||
240 | r.bits = (Byte)l; /* bits to dump before this table */ | ||
241 | r.exop = (Byte)j; /* bits in this table */ | ||
242 | j = i >> (w - l); | ||
243 | r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ | ||
244 | u[h-1][j] = r; /* connect to last table */ | ||
245 | } | ||
246 | else | ||
247 | *t = q; /* first table is returned result */ | ||
248 | } | ||
249 | |||
250 | /* set up table entry in r */ | ||
251 | r.bits = (Byte)(k - w); | ||
252 | if (p >= v + n) | ||
253 | r.exop = 128 + 64; /* out of values--invalid code */ | ||
254 | else if (*p < s) | ||
255 | { | ||
256 | r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ | ||
257 | r.base = *p++; /* simple code is just the value */ | ||
258 | } | ||
259 | else | ||
260 | { | ||
261 | r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ | ||
262 | r.base = d[*p++ - s]; | ||
263 | } | ||
264 | |||
265 | /* fill code-like entries with r */ | ||
266 | f = 1 << (k - w); | ||
267 | for (j = i >> w; j < z; j += f) | ||
268 | q[j] = r; | ||
269 | |||
270 | /* backwards increment the k-bit code i */ | ||
271 | for (j = 1 << (k - 1); i & j; j >>= 1) | ||
272 | i ^= j; | ||
273 | i ^= j; | ||
274 | |||
275 | /* backup over finished tables */ | ||
276 | mask = (1 << w) - 1; /* needed on HP, cc -O bug */ | ||
277 | while ((i & mask) != x[h]) | ||
278 | { | ||
279 | h--; /* don't need to update q */ | ||
280 | w -= l; | ||
281 | mask = (1 << w) - 1; | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | |||
286 | |||
287 | /* Return Z_BUF_ERROR if we were given an incomplete table */ | ||
288 | return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; | ||
289 | } | ||
290 | |||
291 | |||
292 | int zlib_inflate_trees_bits( | ||
293 | uInt *c, /* 19 code lengths */ | ||
294 | uInt *bb, /* bits tree desired/actual depth */ | ||
295 | inflate_huft **tb, /* bits tree result */ | ||
296 | inflate_huft *hp, /* space for trees */ | ||
297 | z_streamp z /* for messages */ | ||
298 | ) | ||
299 | { | ||
300 | int r; | ||
301 | uInt hn = 0; /* hufts used in space */ | ||
302 | uInt *v; /* work area for huft_build */ | ||
303 | |||
304 | v = WS(z)->tree_work_area_1; | ||
305 | r = huft_build(c, 19, 19, NULL, NULL, tb, bb, hp, &hn, v); | ||
306 | if (r == Z_DATA_ERROR) | ||
307 | z->msg = (char*)"oversubscribed dynamic bit lengths tree"; | ||
308 | else if (r == Z_BUF_ERROR || *bb == 0) | ||
309 | { | ||
310 | z->msg = (char*)"incomplete dynamic bit lengths tree"; | ||
311 | r = Z_DATA_ERROR; | ||
312 | } | ||
313 | return r; | ||
314 | } | ||
315 | |||
316 | int zlib_inflate_trees_dynamic( | ||
317 | uInt nl, /* number of literal/length codes */ | ||
318 | uInt nd, /* number of distance codes */ | ||
319 | uInt *c, /* that many (total) code lengths */ | ||
320 | uInt *bl, /* literal desired/actual bit depth */ | ||
321 | uInt *bd, /* distance desired/actual bit depth */ | ||
322 | inflate_huft **tl, /* literal/length tree result */ | ||
323 | inflate_huft **td, /* distance tree result */ | ||
324 | inflate_huft *hp, /* space for trees */ | ||
325 | z_streamp z /* for messages */ | ||
326 | ) | ||
327 | { | ||
328 | int r; | ||
329 | uInt hn = 0; /* hufts used in space */ | ||
330 | uInt *v; /* work area for huft_build */ | ||
331 | |||
332 | /* allocate work area */ | ||
333 | v = WS(z)->tree_work_area_2; | ||
334 | |||
335 | /* build literal/length tree */ | ||
336 | r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); | ||
337 | if (r != Z_OK || *bl == 0) | ||
338 | { | ||
339 | if (r == Z_DATA_ERROR) | ||
340 | z->msg = (char*)"oversubscribed literal/length tree"; | ||
341 | else if (r != Z_MEM_ERROR) | ||
342 | { | ||
343 | z->msg = (char*)"incomplete literal/length tree"; | ||
344 | r = Z_DATA_ERROR; | ||
345 | } | ||
346 | return r; | ||
347 | } | ||
348 | |||
349 | /* build distance tree */ | ||
350 | r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); | ||
351 | if (r != Z_OK || (*bd == 0 && nl > 257)) | ||
352 | { | ||
353 | if (r == Z_DATA_ERROR) | ||
354 | z->msg = (char*)"oversubscribed distance tree"; | ||
355 | else if (r == Z_BUF_ERROR) { | ||
356 | #ifdef PKZIP_BUG_WORKAROUND | ||
357 | r = Z_OK; | ||
358 | } | ||
359 | #else | ||
360 | z->msg = (char*)"incomplete distance tree"; | ||
361 | r = Z_DATA_ERROR; | ||
362 | } | ||
363 | else if (r != Z_MEM_ERROR) | ||
364 | { | ||
365 | z->msg = (char*)"empty distance tree with lengths"; | ||
366 | r = Z_DATA_ERROR; | ||
367 | } | ||
368 | return r; | ||
369 | #endif | ||
370 | } | ||
371 | |||
372 | /* done */ | ||
373 | return Z_OK; | ||
374 | } | ||
375 | |||
376 | |||
377 | int zlib_inflate_trees_fixed( | ||
378 | uInt *bl, /* literal desired/actual bit depth */ | ||
379 | uInt *bd, /* distance desired/actual bit depth */ | ||
380 | inflate_huft **tl, /* literal/length tree result */ | ||
381 | inflate_huft **td, /* distance tree result */ | ||
382 | inflate_huft *hp, /* space for trees */ | ||
383 | z_streamp z /* for memory allocation */ | ||
384 | ) | ||
385 | { | ||
386 | int i; /* temporary variable */ | ||
387 | unsigned l[288]; /* length list for huft_build */ | ||
388 | uInt *v; /* work area for huft_build */ | ||
389 | |||
390 | /* set up literal table */ | ||
391 | for (i = 0; i < 144; i++) | ||
392 | l[i] = 8; | ||
393 | for (; i < 256; i++) | ||
394 | l[i] = 9; | ||
395 | for (; i < 280; i++) | ||
396 | l[i] = 7; | ||
397 | for (; i < 288; i++) /* make a complete, but wrong code set */ | ||
398 | l[i] = 8; | ||
399 | *bl = 9; | ||
400 | v = WS(z)->tree_work_area_1; | ||
401 | if ((i = huft_build(l, 288, 257, cplens, cplext, tl, bl, hp, &i, v)) != 0) | ||
402 | return i; | ||
403 | |||
404 | /* set up distance table */ | ||
405 | for (i = 0; i < 30; i++) /* make an incomplete code set */ | ||
406 | l[i] = 5; | ||
407 | *bd = 5; | ||
408 | if ((i = huft_build(l, 30, 0, cpdist, cpdext, td, bd, hp, &i, v)) > 1) | ||
409 | return i; | ||
410 | |||
411 | return Z_OK; | ||
412 | } | ||
diff --git a/lib/zlib_inflate/inftrees.h b/lib/zlib_inflate/inftrees.h new file mode 100644 index 000000000000..e37705adc008 --- /dev/null +++ b/lib/zlib_inflate/inftrees.h | |||
@@ -0,0 +1,64 @@ | |||
1 | /* inftrees.h -- header to use inftrees.c | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | /* Huffman code lookup table entry--this entry is four bytes for machines | ||
12 | that have 16-bit pointers (e.g. PC's in the small or medium model). */ | ||
13 | |||
14 | #ifndef _INFTREES_H | ||
15 | #define _INFTREES_H | ||
16 | |||
17 | typedef struct inflate_huft_s inflate_huft; | ||
18 | |||
19 | struct inflate_huft_s { | ||
20 | union { | ||
21 | struct { | ||
22 | Byte Exop; /* number of extra bits or operation */ | ||
23 | Byte Bits; /* number of bits in this code or subcode */ | ||
24 | } what; | ||
25 | uInt pad; /* pad structure to a power of 2 (4 bytes for */ | ||
26 | } word; /* 16-bit, 8 bytes for 32-bit int's) */ | ||
27 | uInt base; /* literal, length base, distance base, | ||
28 | or table offset */ | ||
29 | }; | ||
30 | |||
31 | /* Maximum size of dynamic tree. The maximum found in a long but non- | ||
32 | exhaustive search was 1004 huft structures (850 for length/literals | ||
33 | and 154 for distances, the latter actually the result of an | ||
34 | exhaustive search). The actual maximum is not known, but the | ||
35 | value below is more than safe. */ | ||
36 | #define MANY 1440 | ||
37 | |||
38 | extern int zlib_inflate_trees_bits ( | ||
39 | uInt *, /* 19 code lengths */ | ||
40 | uInt *, /* bits tree desired/actual depth */ | ||
41 | inflate_huft **, /* bits tree result */ | ||
42 | inflate_huft *, /* space for trees */ | ||
43 | z_streamp); /* for messages */ | ||
44 | |||
45 | extern int zlib_inflate_trees_dynamic ( | ||
46 | uInt, /* number of literal/length codes */ | ||
47 | uInt, /* number of distance codes */ | ||
48 | uInt *, /* that many (total) code lengths */ | ||
49 | uInt *, /* literal desired/actual bit depth */ | ||
50 | uInt *, /* distance desired/actual bit depth */ | ||
51 | inflate_huft **, /* literal/length tree result */ | ||
52 | inflate_huft **, /* distance tree result */ | ||
53 | inflate_huft *, /* space for trees */ | ||
54 | z_streamp); /* for messages */ | ||
55 | |||
56 | extern int zlib_inflate_trees_fixed ( | ||
57 | uInt *, /* literal desired/actual bit depth */ | ||
58 | uInt *, /* distance desired/actual bit depth */ | ||
59 | inflate_huft **, /* literal/length tree result */ | ||
60 | inflate_huft **, /* distance tree result */ | ||
61 | inflate_huft *, /* space for trees */ | ||
62 | z_streamp); /* for memory allocation */ | ||
63 | |||
64 | #endif /* _INFTREES_H */ | ||
diff --git a/lib/zlib_inflate/infutil.c b/lib/zlib_inflate/infutil.c new file mode 100644 index 000000000000..00202b3438e1 --- /dev/null +++ b/lib/zlib_inflate/infutil.c | |||
@@ -0,0 +1,88 @@ | |||
1 | /* inflate_util.c -- data and routines common to blocks and codes | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | #include <linux/zutil.h> | ||
7 | #include "infblock.h" | ||
8 | #include "inftrees.h" | ||
9 | #include "infcodes.h" | ||
10 | #include "infutil.h" | ||
11 | |||
12 | struct inflate_codes_state; | ||
13 | |||
14 | /* And'ing with mask[n] masks the lower n bits */ | ||
15 | uInt zlib_inflate_mask[17] = { | ||
16 | 0x0000, | ||
17 | 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | ||
18 | 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff | ||
19 | }; | ||
20 | |||
21 | |||
22 | /* copy as much as possible from the sliding window to the output area */ | ||
23 | int zlib_inflate_flush( | ||
24 | inflate_blocks_statef *s, | ||
25 | z_streamp z, | ||
26 | int r | ||
27 | ) | ||
28 | { | ||
29 | uInt n; | ||
30 | Byte *p; | ||
31 | Byte *q; | ||
32 | |||
33 | /* local copies of source and destination pointers */ | ||
34 | p = z->next_out; | ||
35 | q = s->read; | ||
36 | |||
37 | /* compute number of bytes to copy as far as end of window */ | ||
38 | n = (uInt)((q <= s->write ? s->write : s->end) - q); | ||
39 | if (n > z->avail_out) n = z->avail_out; | ||
40 | if (n && r == Z_BUF_ERROR) r = Z_OK; | ||
41 | |||
42 | /* update counters */ | ||
43 | z->avail_out -= n; | ||
44 | z->total_out += n; | ||
45 | |||
46 | /* update check information */ | ||
47 | if (s->checkfn != NULL) | ||
48 | z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||
49 | |||
50 | /* copy as far as end of window */ | ||
51 | memcpy(p, q, n); | ||
52 | p += n; | ||
53 | q += n; | ||
54 | |||
55 | /* see if more to copy at beginning of window */ | ||
56 | if (q == s->end) | ||
57 | { | ||
58 | /* wrap pointers */ | ||
59 | q = s->window; | ||
60 | if (s->write == s->end) | ||
61 | s->write = s->window; | ||
62 | |||
63 | /* compute bytes to copy */ | ||
64 | n = (uInt)(s->write - q); | ||
65 | if (n > z->avail_out) n = z->avail_out; | ||
66 | if (n && r == Z_BUF_ERROR) r = Z_OK; | ||
67 | |||
68 | /* update counters */ | ||
69 | z->avail_out -= n; | ||
70 | z->total_out += n; | ||
71 | |||
72 | /* update check information */ | ||
73 | if (s->checkfn != NULL) | ||
74 | z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||
75 | |||
76 | /* copy */ | ||
77 | memcpy(p, q, n); | ||
78 | p += n; | ||
79 | q += n; | ||
80 | } | ||
81 | |||
82 | /* update pointers */ | ||
83 | z->next_out = p; | ||
84 | s->read = q; | ||
85 | |||
86 | /* done */ | ||
87 | return r; | ||
88 | } | ||
diff --git a/lib/zlib_inflate/infutil.h b/lib/zlib_inflate/infutil.h new file mode 100644 index 000000000000..a15875fc5f72 --- /dev/null +++ b/lib/zlib_inflate/infutil.h | |||
@@ -0,0 +1,197 @@ | |||
1 | /* infutil.h -- types and macros common to blocks and codes | ||
2 | * Copyright (C) 1995-1998 Mark Adler | ||
3 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | */ | ||
5 | |||
6 | /* WARNING: this file should *not* be used by applications. It is | ||
7 | part of the implementation of the compression library and is | ||
8 | subject to change. Applications should only use zlib.h. | ||
9 | */ | ||
10 | |||
11 | #ifndef _INFUTIL_H | ||
12 | #define _INFUTIL_H | ||
13 | |||
14 | #include <linux/zconf.h> | ||
15 | #include "inftrees.h" | ||
16 | #include "infcodes.h" | ||
17 | |||
18 | typedef enum { | ||
19 | TYPE, /* get type bits (3, including end bit) */ | ||
20 | LENS, /* get lengths for stored */ | ||
21 | STORED, /* processing stored block */ | ||
22 | TABLE, /* get table lengths */ | ||
23 | BTREE, /* get bit lengths tree for a dynamic block */ | ||
24 | DTREE, /* get length, distance trees for a dynamic block */ | ||
25 | CODES, /* processing fixed or dynamic block */ | ||
26 | DRY, /* output remaining window bytes */ | ||
27 | B_DONE, /* finished last block, done */ | ||
28 | B_BAD} /* got a data error--stuck here */ | ||
29 | inflate_block_mode; | ||
30 | |||
31 | /* inflate blocks semi-private state */ | ||
32 | struct inflate_blocks_state { | ||
33 | |||
34 | /* mode */ | ||
35 | inflate_block_mode mode; /* current inflate_block mode */ | ||
36 | |||
37 | /* mode dependent information */ | ||
38 | union { | ||
39 | uInt left; /* if STORED, bytes left to copy */ | ||
40 | struct { | ||
41 | uInt table; /* table lengths (14 bits) */ | ||
42 | uInt index; /* index into blens (or border) */ | ||
43 | uInt *blens; /* bit lengths of codes */ | ||
44 | uInt bb; /* bit length tree depth */ | ||
45 | inflate_huft *tb; /* bit length decoding tree */ | ||
46 | } trees; /* if DTREE, decoding info for trees */ | ||
47 | struct { | ||
48 | inflate_codes_statef | ||
49 | *codes; | ||
50 | } decode; /* if CODES, current state */ | ||
51 | } sub; /* submode */ | ||
52 | uInt last; /* true if this block is the last block */ | ||
53 | |||
54 | /* mode independent information */ | ||
55 | uInt bitk; /* bits in bit buffer */ | ||
56 | uLong bitb; /* bit buffer */ | ||
57 | inflate_huft *hufts; /* single malloc for tree space */ | ||
58 | Byte *window; /* sliding window */ | ||
59 | Byte *end; /* one byte after sliding window */ | ||
60 | Byte *read; /* window read pointer */ | ||
61 | Byte *write; /* window write pointer */ | ||
62 | check_func checkfn; /* check function */ | ||
63 | uLong check; /* check on output */ | ||
64 | |||
65 | }; | ||
66 | |||
67 | |||
68 | /* defines for inflate input/output */ | ||
69 | /* update pointers and return */ | ||
70 | #define UPDBITS {s->bitb=b;s->bitk=k;} | ||
71 | #define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} | ||
72 | #define UPDOUT {s->write=q;} | ||
73 | #define UPDATE {UPDBITS UPDIN UPDOUT} | ||
74 | #define LEAVE {UPDATE return zlib_inflate_flush(s,z,r);} | ||
75 | /* get bytes and bits */ | ||
76 | #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} | ||
77 | #define NEEDBYTE {if(n)r=Z_OK;else LEAVE} | ||
78 | #define NEXTBYTE (n--,*p++) | ||
79 | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||
80 | #define DUMPBITS(j) {b>>=(j);k-=(j);} | ||
81 | /* output bytes */ | ||
82 | #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) | ||
83 | #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} | ||
84 | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} | ||
85 | #define FLUSH {UPDOUT r=zlib_inflate_flush(s,z,r); LOADOUT} | ||
86 | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | ||
87 | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | ||
88 | /* load local pointers */ | ||
89 | #define LOAD {LOADIN LOADOUT} | ||
90 | |||
91 | /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ | ||
92 | extern uInt zlib_inflate_mask[17]; | ||
93 | |||
94 | /* copy as much as possible from the sliding window to the output area */ | ||
95 | extern int zlib_inflate_flush ( | ||
96 | inflate_blocks_statef *, | ||
97 | z_streamp , | ||
98 | int); | ||
99 | |||
100 | /* inflate private state */ | ||
101 | typedef enum { | ||
102 | METHOD, /* waiting for method byte */ | ||
103 | FLAG, /* waiting for flag byte */ | ||
104 | DICT4, /* four dictionary check bytes to go */ | ||
105 | DICT3, /* three dictionary check bytes to go */ | ||
106 | DICT2, /* two dictionary check bytes to go */ | ||
107 | DICT1, /* one dictionary check byte to go */ | ||
108 | DICT0, /* waiting for inflateSetDictionary */ | ||
109 | BLOCKS, /* decompressing blocks */ | ||
110 | CHECK4, /* four check bytes to go */ | ||
111 | CHECK3, /* three check bytes to go */ | ||
112 | CHECK2, /* two check bytes to go */ | ||
113 | CHECK1, /* one check byte to go */ | ||
114 | I_DONE, /* finished check, done */ | ||
115 | I_BAD} /* got an error--stay here */ | ||
116 | inflate_mode; | ||
117 | |||
118 | struct internal_state { | ||
119 | |||
120 | /* mode */ | ||
121 | inflate_mode mode; /* current inflate mode */ | ||
122 | |||
123 | /* mode dependent information */ | ||
124 | union { | ||
125 | uInt method; /* if FLAGS, method byte */ | ||
126 | struct { | ||
127 | uLong was; /* computed check value */ | ||
128 | uLong need; /* stream check value */ | ||
129 | } check; /* if CHECK, check values to compare */ | ||
130 | uInt marker; /* if BAD, inflateSync's marker bytes count */ | ||
131 | } sub; /* submode */ | ||
132 | |||
133 | /* mode independent information */ | ||
134 | int nowrap; /* flag for no wrapper */ | ||
135 | uInt wbits; /* log2(window size) (8..15, defaults to 15) */ | ||
136 | inflate_blocks_statef | ||
137 | *blocks; /* current inflate_blocks state */ | ||
138 | |||
139 | }; | ||
140 | |||
141 | /* inflate codes private state */ | ||
142 | typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||
143 | START, /* x: set up for LEN */ | ||
144 | LEN, /* i: get length/literal/eob next */ | ||
145 | LENEXT, /* i: getting length extra (have base) */ | ||
146 | DIST, /* i: get distance next */ | ||
147 | DISTEXT, /* i: getting distance extra */ | ||
148 | COPY, /* o: copying bytes in window, waiting for space */ | ||
149 | LIT, /* o: got literal, waiting for output space */ | ||
150 | WASH, /* o: got eob, possibly still output waiting */ | ||
151 | END, /* x: got eob and all data flushed */ | ||
152 | BADCODE} /* x: got error */ | ||
153 | inflate_codes_mode; | ||
154 | |||
155 | struct inflate_codes_state { | ||
156 | |||
157 | /* mode */ | ||
158 | inflate_codes_mode mode; /* current inflate_codes mode */ | ||
159 | |||
160 | /* mode dependent information */ | ||
161 | uInt len; | ||
162 | union { | ||
163 | struct { | ||
164 | inflate_huft *tree; /* pointer into tree */ | ||
165 | uInt need; /* bits needed */ | ||
166 | } code; /* if LEN or DIST, where in tree */ | ||
167 | uInt lit; /* if LIT, literal */ | ||
168 | struct { | ||
169 | uInt get; /* bits to get for extra */ | ||
170 | uInt dist; /* distance back to copy from */ | ||
171 | } copy; /* if EXT or COPY, where and how much */ | ||
172 | } sub; /* submode */ | ||
173 | |||
174 | /* mode independent information */ | ||
175 | Byte lbits; /* ltree bits decoded per branch */ | ||
176 | Byte dbits; /* dtree bits decoder per branch */ | ||
177 | inflate_huft *ltree; /* literal/length/eob tree */ | ||
178 | inflate_huft *dtree; /* distance tree */ | ||
179 | |||
180 | }; | ||
181 | |||
182 | /* memory allocation for inflation */ | ||
183 | |||
184 | struct inflate_workspace { | ||
185 | inflate_codes_statef working_state; | ||
186 | struct inflate_blocks_state working_blocks_state; | ||
187 | struct internal_state internal_state; | ||
188 | unsigned int tree_work_area_1[19]; | ||
189 | unsigned int tree_work_area_2[288]; | ||
190 | unsigned working_blens[258 + 0x1f + 0x1f]; | ||
191 | inflate_huft working_hufts[MANY]; | ||
192 | unsigned char working_window[1 << MAX_WBITS]; | ||
193 | }; | ||
194 | |||
195 | #define WS(z) ((struct inflate_workspace *)(z->workspace)) | ||
196 | |||
197 | #endif | ||