Sync with FreeBSD. This adds read-only support for zip and ISO9660.
[dragonfly.git] / contrib / zlib-1.2.2 / infback.c
1 /* infback.c -- inflate using a call-back interface
2  * Copyright (C) 1995-2003 Mark Adler
3  * For conditions of distribution and use, see copyright notice in zlib.h
4  */
5
6 /*
7    This code is largely copied from inflate.c.  Normally either infback.o or
8    inflate.o would be linked into an application--not both.  The interface
9    with inffast.c is retained so that optimized assembler-coded versions of
10    inflate_fast() can be used with either inflate.c or infback.c.
11  */
12
13 #include "zutil.h"
14 #include "inftrees.h"
15 #include "inflate.h"
16 #include "inffast.h"
17
18 /* function prototypes */
19 local void fixedtables OF((struct inflate_state FAR *state));
20
21 /*
22    strm provides memory allocation functions in zalloc and zfree, or
23    Z_NULL to use the library memory allocation functions.
24
25    windowBits is in the range 8..15, and window is a user-supplied
26    window and output buffer that is 2**windowBits bytes.
27  */
28 int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
29 z_stream FAR *strm;
30 int windowBits;
31 unsigned char FAR *window;
32 const char *version;
33 int stream_size;
34 {
35     struct inflate_state FAR *state;
36
37     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
38         stream_size != (int)(sizeof(z_stream)))
39         return Z_VERSION_ERROR;
40     if (strm == Z_NULL || window == Z_NULL ||
41         windowBits < 8 || windowBits > 15)
42         return Z_STREAM_ERROR;
43     strm->msg = Z_NULL;                 /* in case we return an error */
44     if (strm->zalloc == (alloc_func)0) {
45         strm->zalloc = zcalloc;
46         strm->opaque = (voidpf)0;
47     }
48     if (strm->zfree == (free_func)0) strm->zfree = zcfree;
49     state = (struct inflate_state FAR *)ZALLOC(strm, 1,
50                                                sizeof(struct inflate_state));
51     if (state == Z_NULL) return Z_MEM_ERROR;
52     Tracev((stderr, "inflate: allocated\n"));
53     strm->state = (voidpf)state;
54     state->wbits = windowBits;
55     state->wsize = 1U << windowBits;
56     state->window = window;
57     state->write = 0;
58     state->whave = 0;
59     return Z_OK;
60 }
61
62 /*
63    Return state with length and distance decoding tables and index sizes set to
64    fixed code decoding.  Normally this returns fixed tables from inffixed.h.
65    If BUILDFIXED is defined, then instead this routine builds the tables the
66    first time it's called, and returns those tables the first time and
67    thereafter.  This reduces the size of the code by about 2K bytes, in
68    exchange for a little execution time.  However, BUILDFIXED should not be
69    used for threaded applications, since the rewriting of the tables and virgin
70    may not be thread-safe.
71  */
72 local void fixedtables(state)
73 struct inflate_state FAR *state;
74 {
75 #ifdef BUILDFIXED
76     static int virgin = 1;
77     static code *lenfix, *distfix;
78     static code fixed[544];
79
80     /* build fixed huffman tables if first call (may not be thread safe) */
81     if (virgin) {
82         unsigned sym, bits;
83         static code *next;
84
85         /* literal/length table */
86         sym = 0;
87         while (sym < 144) state->lens[sym++] = 8;
88         while (sym < 256) state->lens[sym++] = 9;
89         while (sym < 280) state->lens[sym++] = 7;
90         while (sym < 288) state->lens[sym++] = 8;
91         next = fixed;
92         lenfix = next;
93         bits = 9;
94         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
95
96         /* distance table */
97         sym = 0;
98         while (sym < 32) state->lens[sym++] = 5;
99         distfix = next;
100         bits = 5;
101         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
102
103         /* do this just once */
104         virgin = 0;
105     }
106 #else /* !BUILDFIXED */
107 #   include "inffixed.h"
108 #endif /* BUILDFIXED */
109     state->lencode = lenfix;
110     state->lenbits = 9;
111     state->distcode = distfix;
112     state->distbits = 5;
113 }
114
115 /* Macros for inflateBack(): */
116
117 /* Load returned state from inflate_fast() */
118 #define LOAD() \
119     do { \
120         put = strm->next_out; \
121         left = strm->avail_out; \
122         next = strm->next_in; \
123         have = strm->avail_in; \
124         hold = state->hold; \
125         bits = state->bits; \
126     } while (0)
127
128 /* Set state from registers for inflate_fast() */
129 #define RESTORE() \
130     do { \
131         strm->next_out = put; \
132         strm->avail_out = left; \
133         strm->next_in = next; \
134         strm->avail_in = have; \
135         state->hold = hold; \
136         state->bits = bits; \
137     } while (0)
138
139 /* Clear the input bit accumulator */
140 #define INITBITS() \
141     do { \
142         hold = 0; \
143         bits = 0; \
144     } while (0)
145
146 /* Assure that some input is available.  If input is requested, but denied,
147    then return a Z_BUF_ERROR from inflateBack(). */
148 #define PULL() \
149     do { \
150         if (have == 0) { \
151             have = in(in_desc, &next); \
152             if (have == 0) { \
153                 next = Z_NULL; \
154                 ret = Z_BUF_ERROR; \
155                 goto inf_leave; \
156             } \
157         } \
158     } while (0)
159
160 /* Get a byte of input into the bit accumulator, or return from inflateBack()
161    with an error if there is no input available. */
162 #define PULLBYTE() \
163     do { \
164         PULL(); \
165         have--; \
166         hold += (unsigned long)(*next++) << bits; \
167         bits += 8; \
168     } while (0)
169
170 /* Assure that there are at least n bits in the bit accumulator.  If there is
171    not enough available input to do that, then return from inflateBack() with
172    an error. */
173 #define NEEDBITS(n) \
174     do { \
175         while (bits < (unsigned)(n)) \
176             PULLBYTE(); \
177     } while (0)
178
179 /* Return the low n bits of the bit accumulator (n < 16) */
180 #define BITS(n) \
181     ((unsigned)hold & ((1U << (n)) - 1))
182
183 /* Remove n bits from the bit accumulator */
184 #define DROPBITS(n) \
185     do { \
186         hold >>= (n); \
187         bits -= (unsigned)(n); \
188     } while (0)
189
190 /* Remove zero to seven bits as needed to go to a byte boundary */
191 #define BYTEBITS() \
192     do { \
193         hold >>= bits & 7; \
194         bits -= bits & 7; \
195     } while (0)
196
197 /* Assure that some output space is available, by writing out the window
198    if it's full.  If the write fails, return from inflateBack() with a
199    Z_BUF_ERROR. */
200 #define ROOM() \
201     do { \
202         if (left == 0) { \
203             put = state->window; \
204             left = state->wsize; \
205             state->whave = left; \
206             if (out(out_desc, put, left)) { \
207                 ret = Z_BUF_ERROR; \
208                 goto inf_leave; \
209             } \
210         } \
211     } while (0)
212
213 /*
214    strm provides the memory allocation functions and window buffer on input,
215    and provides information on the unused input on return.  For Z_DATA_ERROR
216    returns, strm will also provide an error message.
217
218    in() and out() are the call-back input and output functions.  When
219    inflateBack() needs more input, it calls in().  When inflateBack() has
220    filled the window with output, or when it completes with data in the
221    window, it calls out() to write out the data.  The application must not
222    change the provided input until in() is called again or inflateBack()
223    returns.  The application must not change the window/output buffer until
224    inflateBack() returns.
225
226    in() and out() are called with a descriptor parameter provided in the
227    inflateBack() call.  This parameter can be a structure that provides the
228    information required to do the read or write, as well as accumulated
229    information on the input and output such as totals and check values.
230
231    in() should return zero on failure.  out() should return non-zero on
232    failure.  If either in() or out() fails, than inflateBack() returns a
233    Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it
234    was in() or out() that caused in the error.  Otherwise,  inflateBack()
235    returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
236    error, or Z_MEM_ERROR if it could not allocate memory for the state.
237    inflateBack() can also return Z_STREAM_ERROR if the input parameters
238    are not correct, i.e. strm is Z_NULL or the state was not initialized.
239  */
240 int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
241 z_stream FAR *strm;
242 in_func in;
243 void FAR *in_desc;
244 out_func out;
245 void FAR *out_desc;
246 {
247     struct inflate_state FAR *state;
248     unsigned char FAR *next;    /* next input */
249     unsigned char FAR *put;     /* next output */
250     unsigned have, left;        /* available input and output */
251     unsigned long hold;         /* bit buffer */
252     unsigned bits;              /* bits in bit buffer */
253     unsigned copy;              /* number of stored or match bytes to copy */
254     unsigned char FAR *from;    /* where to copy match bytes from */
255     code this;                  /* current decoding table entry */
256     code last;                  /* parent table entry */
257     unsigned len;               /* length to copy for repeats, bits to drop */
258     int ret;                    /* return code */
259     static const unsigned short order[19] = /* permutation of code lengths */
260         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
261
262     /* Check that the strm exists and that the state was initialized */
263     if (strm == Z_NULL || strm->state == Z_NULL)
264         return Z_STREAM_ERROR;
265     state = (struct inflate_state FAR *)strm->state;
266
267     /* Reset the state */
268     strm->msg = Z_NULL;
269     state->mode = TYPE;
270     state->last = 0;
271     state->whave = 0;
272     next = strm->next_in;
273     have = next != Z_NULL ? strm->avail_in : 0;
274     hold = 0;
275     bits = 0;
276     put = state->window;
277     left = state->wsize;
278
279     /* Inflate until end of block marked as last */
280     for (;;)
281         switch (state->mode) {
282         case TYPE:
283             /* determine and dispatch block type */
284             if (state->last) {
285                 BYTEBITS();
286                 state->mode = DONE;
287                 break;
288             }
289             NEEDBITS(3);
290             state->last = BITS(1);
291             DROPBITS(1);
292             switch (BITS(2)) {
293             case 0:                             /* stored block */
294                 Tracev((stderr, "inflate:     stored block%s\n",
295                         state->last ? " (last)" : ""));
296                 state->mode = STORED;
297                 break;
298             case 1:                             /* fixed block */
299                 fixedtables(state);
300                 Tracev((stderr, "inflate:     fixed codes block%s\n",
301                         state->last ? " (last)" : ""));
302                 state->mode = LEN;              /* decode codes */
303                 break;
304             case 2:                             /* dynamic block */
305                 Tracev((stderr, "inflate:     dynamic codes block%s\n",
306                         state->last ? " (last)" : ""));
307                 state->mode = TABLE;
308                 break;
309             case 3:
310                 strm->msg = (char *)"invalid block type";
311                 state->mode = BAD;
312             }
313             DROPBITS(2);
314             break;
315
316         case STORED:
317             /* get and verify stored block length */
318             BYTEBITS();                         /* go to byte boundary */
319             NEEDBITS(32);
320             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
321                 strm->msg = (char *)"invalid stored block lengths";
322                 state->mode = BAD;
323                 break;
324             }
325             state->length = (unsigned)hold & 0xffff;
326             Tracev((stderr, "inflate:       stored length %u\n",
327                     state->length));
328             INITBITS();
329
330             /* copy stored block from input to output */
331             while (state->length != 0) {
332                 copy = state->length;
333                 PULL();
334                 ROOM();
335                 if (copy > have) copy = have;
336                 if (copy > left) copy = left;
337                 zmemcpy(put, next, copy);
338                 have -= copy;
339                 next += copy;
340                 left -= copy;
341                 put += copy;
342                 state->length -= copy;
343             }
344             Tracev((stderr, "inflate:       stored end\n"));
345             state->mode = TYPE;
346             break;
347
348         case TABLE:
349             /* get dynamic table entries descriptor */
350             NEEDBITS(14);
351             state->nlen = BITS(5) + 257;
352             DROPBITS(5);
353             state->ndist = BITS(5) + 1;
354             DROPBITS(5);
355             state->ncode = BITS(4) + 4;
356             DROPBITS(4);
357 #ifndef PKZIP_BUG_WORKAROUND
358             if (state->nlen > 286 || state->ndist > 30) {
359                 strm->msg = (char *)"too many length or distance symbols";
360                 state->mode = BAD;
361                 break;
362             }
363 #endif
364             Tracev((stderr, "inflate:       table sizes ok\n"));
365
366             /* get code length code lengths (not a typo) */
367             state->have = 0;
368             while (state->have < state->ncode) {
369                 NEEDBITS(3);
370                 state->lens[order[state->have++]] = (unsigned short)BITS(3);
371                 DROPBITS(3);
372             }
373             while (state->have < 19)
374                 state->lens[order[state->have++]] = 0;
375             state->next = state->codes;
376             state->lencode = (code const FAR *)(state->next);
377             state->lenbits = 7;
378             ret = inflate_table(CODES, state->lens, 19, &(state->next),
379                                 &(state->lenbits), state->work);
380             if (ret) {
381                 strm->msg = (char *)"invalid code lengths set";
382                 state->mode = BAD;
383                 break;
384             }
385             Tracev((stderr, "inflate:       code lengths ok\n"));
386
387             /* get length and distance code code lengths */
388             state->have = 0;
389             while (state->have < state->nlen + state->ndist) {
390                 for (;;) {
391                     this = state->lencode[BITS(state->lenbits)];
392                     if ((unsigned)(this.bits) <= bits) break;
393                     PULLBYTE();
394                 }
395                 if (this.val < 16) {
396                     NEEDBITS(this.bits);
397                     DROPBITS(this.bits);
398                     state->lens[state->have++] = this.val;
399                 }
400                 else {
401                     if (this.val == 16) {
402                         NEEDBITS(this.bits + 2);
403                         DROPBITS(this.bits);
404                         if (state->have == 0) {
405                             strm->msg = (char *)"invalid bit length repeat";
406                             state->mode = BAD;
407                             break;
408                         }
409                         len = (unsigned)(state->lens[state->have - 1]);
410                         copy = 3 + BITS(2);
411                         DROPBITS(2);
412                     }
413                     else if (this.val == 17) {
414                         NEEDBITS(this.bits + 3);
415                         DROPBITS(this.bits);
416                         len = 0;
417                         copy = 3 + BITS(3);
418                         DROPBITS(3);
419                     }
420                     else {
421                         NEEDBITS(this.bits + 7);
422                         DROPBITS(this.bits);
423                         len = 0;
424                         copy = 11 + BITS(7);
425                         DROPBITS(7);
426                     }
427                     if (state->have + copy > state->nlen + state->ndist) {
428                         strm->msg = (char *)"invalid bit length repeat";
429                         state->mode = BAD;
430                         break;
431                     }
432                     while (copy--)
433                         state->lens[state->have++] = (unsigned short)len;
434                 }
435             }
436
437             /* handle error breaks in while */
438             if (state->mode == BAD) break;
439
440             /* build code tables */
441             state->next = state->codes;
442             state->lencode = (code const FAR *)(state->next);
443             state->lenbits = 9;
444             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
445                                 &(state->lenbits), state->work);
446             if (ret) {
447                 strm->msg = (char *)"invalid literal/lengths set";
448                 state->mode = BAD;
449                 break;
450             }
451             state->distcode = (code const FAR *)(state->next);
452             state->distbits = 6;
453             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
454                             &(state->next), &(state->distbits), state->work);
455             if (ret) {
456                 strm->msg = (char *)"invalid distances set";
457                 state->mode = BAD;
458                 break;
459             }
460             Tracev((stderr, "inflate:       codes ok\n"));
461             state->mode = LEN;
462
463         case LEN:
464             /* use inflate_fast() if we have enough input and output */
465             if (have >= 6 && left >= 258) {
466                 RESTORE();
467                 if (state->whave < state->wsize)
468                     state->whave = state->wsize - left;
469                 inflate_fast(strm, state->wsize);
470                 LOAD();
471                 break;
472             }
473
474             /* get a literal, length, or end-of-block code */
475             for (;;) {
476                 this = state->lencode[BITS(state->lenbits)];
477                 if ((unsigned)(this.bits) <= bits) break;
478                 PULLBYTE();
479             }
480             if (this.op && (this.op & 0xf0) == 0) {
481                 last = this;
482                 for (;;) {
483                     this = state->lencode[last.val +
484                             (BITS(last.bits + last.op) >> last.bits)];
485                     if ((unsigned)(last.bits + this.bits) <= bits) break;
486                     PULLBYTE();
487                 }
488                 DROPBITS(last.bits);
489             }
490             DROPBITS(this.bits);
491             state->length = (unsigned)this.val;
492
493             /* process literal */
494             if (this.op == 0) {
495                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
496                         "inflate:         literal '%c'\n" :
497                         "inflate:         literal 0x%02x\n", this.val));
498                 ROOM();
499                 *put++ = (unsigned char)(state->length);
500                 left--;
501                 state->mode = LEN;
502                 break;
503             }
504
505             /* process end of block */
506             if (this.op & 32) {
507                 Tracevv((stderr, "inflate:         end of block\n"));
508                 state->mode = TYPE;
509                 break;
510             }
511
512             /* invalid code */
513             if (this.op & 64) {
514                 strm->msg = (char *)"invalid literal/length code";
515                 state->mode = BAD;
516                 break;
517             }
518
519             /* length code -- get extra bits, if any */
520             state->extra = (unsigned)(this.op) & 15;
521             if (state->extra != 0) {
522                 NEEDBITS(state->extra);
523                 state->length += BITS(state->extra);
524                 DROPBITS(state->extra);
525             }
526             Tracevv((stderr, "inflate:         length %u\n", state->length));
527
528             /* get distance code */
529             for (;;) {
530                 this = state->distcode[BITS(state->distbits)];
531                 if ((unsigned)(this.bits) <= bits) break;
532                 PULLBYTE();
533             }
534             if ((this.op & 0xf0) == 0) {
535                 last = this;
536                 for (;;) {
537                     this = state->distcode[last.val +
538                             (BITS(last.bits + last.op) >> last.bits)];
539                     if ((unsigned)(last.bits + this.bits) <= bits) break;
540                     PULLBYTE();
541                 }
542                 DROPBITS(last.bits);
543             }
544             DROPBITS(this.bits);
545             if (this.op & 64) {
546                 strm->msg = (char *)"invalid distance code";
547                 state->mode = BAD;
548                 break;
549             }
550             state->offset = (unsigned)this.val;
551
552             /* get distance extra bits, if any */
553             state->extra = (unsigned)(this.op) & 15;
554             if (state->extra != 0) {
555                 NEEDBITS(state->extra);
556                 state->offset += BITS(state->extra);
557                 DROPBITS(state->extra);
558             }
559             if (state->offset > state->wsize - (state->whave < state->wsize ?
560                                                 left : 0)) {
561                 strm->msg = (char *)"invalid distance too far back";
562                 state->mode = BAD;
563                 break;
564             }
565             Tracevv((stderr, "inflate:         distance %u\n", state->offset));
566
567             /* copy match from window to output */
568             do {
569                 ROOM();
570                 copy = state->wsize - state->offset;
571                 if (copy < left) {
572                     from = put + copy;
573                     copy = left - copy;
574                 }
575                 else {
576                     from = put - state->offset;
577                     copy = left;
578                 }
579                 if (copy > state->length) copy = state->length;
580                 state->length -= copy;
581                 left -= copy;
582                 do {
583                     *put++ = *from++;
584                 } while (--copy);
585             } while (state->length != 0);
586             break;
587
588         case DONE:
589             /* inflate stream terminated properly -- write leftover output */
590             ret = Z_STREAM_END;
591             if (left < state->wsize) {
592                 if (out(out_desc, state->window, state->wsize - left))
593                     ret = Z_BUF_ERROR;
594             }
595             goto inf_leave;
596
597         case BAD:
598             ret = Z_DATA_ERROR;
599             goto inf_leave;
600
601         default:                /* can't happen, but makes compilers happy */
602             ret = Z_STREAM_ERROR;
603             goto inf_leave;
604         }
605
606     /* Return unused input */
607   inf_leave:
608     strm->next_in = next;
609     strm->avail_in = have;
610     return ret;
611 }
612
613 int ZEXPORT inflateBackEnd(strm)
614 z_stream FAR *strm;
615 {
616     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
617         return Z_STREAM_ERROR;
618     ZFREE(strm, strm->state);
619     strm->state = Z_NULL;
620     Tracev((stderr, "inflate: end\n"));
621     return Z_OK;
622 }