~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/3rdparty/zlib/inflate.c

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-08-24 04:09:09 UTC
  • Revision ID: james.westby@ubuntu.com-20050824040909-xmxe9jfr4a0w5671
Tags: upstream-4.0.0
ImportĀ upstreamĀ versionĀ 4.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* inflate.c -- zlib decompression
 
2
 * Copyright (C) 1995-2003 Mark Adler
 
3
 * For conditions of distribution and use, see copyright notice in zlib.h
 
4
 */
 
5
 
 
6
/*
 
7
 * Change history:
 
8
 *
 
9
 * 1.2.beta0    24 Nov 2002
 
10
 * - First version -- complete rewrite of inflate to simplify code, avoid
 
11
 *   creation of window when not needed, minimize use of window when it is
 
12
 *   needed, make inffast.c even faster, implement gzip decoding, and to
 
13
 *   improve code readability and style over the previous zlib inflate code
 
14
 *
 
15
 * 1.2.beta1    25 Nov 2002
 
16
 * - Use pointers for available input and output checking in inffast.c
 
17
 * - Remove input and output counters in inffast.c
 
18
 * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
 
19
 * - Remove unnecessary second byte pull from length extra in inffast.c
 
20
 * - Unroll direct copy to three copies per loop in inffast.c
 
21
 *
 
22
 * 1.2.beta2    4 Dec 2002
 
23
 * - Change external routine names to reduce potential conflicts
 
24
 * - Correct filename to inffixed.h for fixed tables in inflate.c
 
25
 * - Make hbuf[] unsigned char to match parameter type in inflate.c
 
26
 * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
 
27
 *   to avoid negation problem on Alphas (64 bit) in inflate.c
 
28
 *
 
29
 * 1.2.beta3    22 Dec 2002
 
30
 * - Add comments on state->bits assertion in inffast.c
 
31
 * - Add comments on op field in inftrees.h
 
32
 * - Fix bug in reuse of allocated window after inflateReset()
 
33
 * - Remove bit fields--back to byte structure for speed
 
34
 * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
 
35
 * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
 
36
 * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
 
37
 * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
 
38
 * - Use local copies of stream next and avail values, as well as local bit
 
39
 *   buffer and bit count in inflate()--for speed when inflate_fast() not used
 
40
 *
 
41
 * 1.2.beta4    1 Jan 2003
 
42
 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
 
43
 * - Move a comment on output buffer sizes from inffast.c to inflate.c
 
44
 * - Add comments in inffast.c to introduce the inflate_fast() routine
 
45
 * - Rearrange window copies in inflate_fast() for speed and simplification
 
46
 * - Unroll last copy for window match in inflate_fast()
 
47
 * - Use local copies of window variables in inflate_fast() for speed
 
48
 * - Pull out common write == 0 case for speed in inflate_fast()
 
49
 * - Make op and len in inflate_fast() unsigned for consistency
 
50
 * - Add FAR to lcode and dcode declarations in inflate_fast()
 
51
 * - Simplified bad distance check in inflate_fast()
 
52
 * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
 
53
 *   source file infback.c to provide a call-back interface to inflate for
 
54
 *   programs like gzip and unzip -- uses window as output buffer to avoid
 
55
 *   window copying
 
56
 *
 
57
 * 1.2.beta5    1 Jan 2003
 
58
 * - Improved inflateBack() interface to allow the caller to provide initial
 
59
 *   input in strm.
 
60
 * - Fixed stored blocks bug in inflateBack()
 
61
 *
 
62
 * 1.2.beta6    4 Jan 2003
 
63
 * - Added comments in inffast.c on effectiveness of POSTINC
 
64
 * - Typecasting all around to reduce compiler warnings
 
65
 * - Changed loops from while (1) or do {} while (1) to for (;;), again to
 
66
 *   make compilers happy
 
67
 * - Changed type of window in inflateBackInit() to unsigned char *
 
68
 *
 
69
 * 1.2.beta7    27 Jan 2003
 
70
 * - Changed many types to unsigned or unsigned short to avoid warnings
 
71
 * - Added inflateCopy() function
 
72
 *
 
73
 * 1.2.0        9 Mar 2003
 
74
 * - Changed inflateBack() interface to provide separate opaque descriptors
 
75
 *   for the in() and out() functions
 
76
 * - Changed inflateBack() argument and in_func typedef to swap the length
 
77
 *   and buffer address return values for the input function
 
78
 * - Check next_in and next_out for Z_NULL on entry to inflate()
 
79
 *
 
80
 * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
 
81
 */
 
82
 
 
83
#include "zutil.h"
 
84
#include "inftrees.h"
 
85
#include "inflate.h"
 
86
#include "inffast.h"
 
87
 
 
88
#ifdef MAKEFIXED
 
89
#  ifndef BUILDFIXED
 
90
#    define BUILDFIXED
 
91
#  endif
 
92
#endif
 
93
 
 
94
/* function prototypes */
 
95
local void fixedtables OF((struct inflate_state FAR *state));
 
96
local int updatewindow OF((z_streamp strm, unsigned out));
 
97
#ifdef BUILDFIXED
 
98
   void makefixed OF((void));
 
99
#endif
 
100
local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
 
101
                              unsigned len));
 
102
 
 
103
int ZEXPORT inflateReset(strm)
 
104
z_streamp strm;
 
105
{
 
106
    struct inflate_state FAR *state;
 
107
 
 
108
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
 
109
    state = (struct inflate_state FAR *)strm->state;
 
110
    strm->total_in = strm->total_out = state->total = 0;
 
111
    strm->msg = Z_NULL;
 
112
    strm->adler = 1;        /* to support ill-conceived Java test suite */
 
113
    state->mode = HEAD;
 
114
    state->last = 0;
 
115
    state->havedict = 0;
 
116
    state->wsize = 0;
 
117
    state->whave = 0;
 
118
    state->hold = 0;
 
119
    state->bits = 0;
 
120
    state->lencode = state->distcode = state->next = state->codes;
 
121
    Tracev((stderr, "inflate: reset\n"));
 
122
    return Z_OK;
 
123
}
 
124
 
 
125
int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
 
126
z_streamp strm;
 
127
int windowBits;
 
128
const char *version;
 
129
int stream_size;
 
130
{
 
131
    struct inflate_state FAR *state;
 
132
 
 
133
    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
 
134
        stream_size != (int)(sizeof(z_stream)))
 
135
        return Z_VERSION_ERROR;
 
136
    if (strm == Z_NULL) return Z_STREAM_ERROR;
 
137
    strm->msg = Z_NULL;                 /* in case we return an error */
 
138
    if (strm->zalloc == (alloc_func)0) {
 
139
        strm->zalloc = zcalloc;
 
140
        strm->opaque = (voidpf)0;
 
141
    }
 
142
    if (strm->zfree == (free_func)0) strm->zfree = zcfree;
 
143
    state = (struct inflate_state FAR *)
 
144
            ZALLOC(strm, 1, sizeof(struct inflate_state));
 
145
    if (state == Z_NULL) return Z_MEM_ERROR;
 
146
    Tracev((stderr, "inflate: allocated\n"));
 
147
    strm->state = (voidpf)state;
 
148
    if (windowBits < 0) {
 
149
        state->wrap = 0;
 
150
        windowBits = -windowBits;
 
151
    }
 
152
    else {
 
153
        state->wrap = (windowBits >> 4) + 1;
 
154
#ifdef GUNZIP
 
155
        if (windowBits < 48) windowBits &= 15;
 
156
#endif
 
157
    }
 
158
    if (windowBits < 8 || windowBits > 15) {
 
159
        ZFREE(strm, state);
 
160
        strm->state = Z_NULL;
 
161
        return Z_STREAM_ERROR;
 
162
    }
 
163
    state->wbits = (unsigned)windowBits;
 
164
    state->window = Z_NULL;
 
165
    return inflateReset(strm);
 
166
}
 
167
 
 
168
int ZEXPORT inflateInit_(strm, version, stream_size)
 
169
z_streamp strm;
 
170
const char *version;
 
171
int stream_size;
 
172
{
 
173
    return inflateInit2_(strm, DEF_WBITS, version, stream_size);
 
174
}
 
175
 
 
176
/*
 
177
   Return state with length and distance decoding tables and index sizes set to
 
178
   fixed code decoding.  Normally this returns fixed tables from inffixed.h.
 
179
   If BUILDFIXED is defined, then instead this routine builds the tables the
 
180
   first time it's called, and returns those tables the first time and
 
181
   thereafter.  This reduces the size of the code by about 2K bytes, in
 
182
   exchange for a little execution time.  However, BUILDFIXED should not be
 
183
   used for threaded applications, since the rewriting of the tables and virgin
 
184
   may not be thread-safe.
 
185
 */
 
186
local void fixedtables(state)
 
187
struct inflate_state FAR *state;
 
188
{
 
189
#ifdef BUILDFIXED
 
190
    static int virgin = 1;
 
191
    static code *lenfix, *distfix;
 
192
    static code fixed[544];
 
193
 
 
194
    /* build fixed huffman tables if first call (may not be thread safe) */
 
195
    if (virgin) {
 
196
        unsigned sym, bits;
 
197
        static code *next;
 
198
 
 
199
        /* literal/length table */
 
200
        sym = 0;
 
201
        while (sym < 144) state->lens[sym++] = 8;
 
202
        while (sym < 256) state->lens[sym++] = 9;
 
203
        while (sym < 280) state->lens[sym++] = 7;
 
204
        while (sym < 288) state->lens[sym++] = 8;
 
205
        next = fixed;
 
206
        lenfix = next;
 
207
        bits = 9;
 
208
        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
 
209
 
 
210
        /* distance table */
 
211
        sym = 0;
 
212
        while (sym < 32) state->lens[sym++] = 5;
 
213
        distfix = next;
 
214
        bits = 5;
 
215
        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
 
216
 
 
217
        /* do this just once */
 
218
        virgin = 0;
 
219
    }
 
220
#else /* !BUILDFIXED */
 
221
#   include "inffixed.h"
 
222
#endif /* BUILDFIXED */
 
223
    state->lencode = lenfix;
 
224
    state->lenbits = 9;
 
225
    state->distcode = distfix;
 
226
    state->distbits = 5;
 
227
}
 
228
 
 
229
#ifdef MAKEFIXED
 
230
#include <stdio.h>
 
231
 
 
232
/*
 
233
   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also
 
234
   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes
 
235
   those tables to stdout, which would be piped to inffixed.h.  A small program
 
236
   can simply call makefixed to do this:
 
237
 
 
238
    void makefixed(void);
 
239
 
 
240
    int main(void)
 
241
    {
 
242
        makefixed();
 
243
        return 0;
 
244
    }
 
245
 
 
246
   Then that can be linked with zlib built with MAKEFIXED defined and run:
 
247
 
 
248
    a.out > inffixed.h
 
249
 */
 
250
void makefixed()
 
251
{
 
252
    unsigned low, size;
 
253
    struct inflate_state state;
 
254
 
 
255
    fixedtables(&state);
 
256
    puts("    /* inffixed.h -- table for decoding fixed codes");
 
257
    puts("     * Generated automatically by makefixed().");
 
258
    puts("     */");
 
259
    puts("");
 
260
    puts("    /* WARNING: this file should *not* be used by applications.");
 
261
    puts("       It is part of the implementation of this library and is");
 
262
    puts("       subject to change. Applications should only use zlib.h.");
 
263
    puts("     */");
 
264
    puts("");
 
265
    size = 1U << 9;
 
266
    printf("    static const code lenfix[%u] = {", size);
 
267
    low = 0;
 
268
    for (;;) {
 
269
        if ((low % 7) == 0) printf("\n        ");
 
270
        printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
 
271
               state.lencode[low].val);
 
272
        if (++low == size) break;
 
273
        putchar(',');
 
274
    }
 
275
    puts("\n    };");
 
276
    size = 1U << 5;
 
277
    printf("\n    static const code distfix[%u] = {", size);
 
278
    low = 0;
 
279
    for (;;) {
 
280
        if ((low % 6) == 0) printf("\n        ");
 
281
        printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
 
282
               state.distcode[low].val);
 
283
        if (++low == size) break;
 
284
        putchar(',');
 
285
    }
 
286
    puts("\n    };");
 
287
}
 
288
#endif /* MAKEFIXED */
 
289
 
 
290
/*
 
291
   Update the window with the last wsize (normally 32K) bytes written before
 
292
   returning.  If window does not exist yet, create it.  This is only called
 
293
   when a window is already in use, or when output has been written during this
 
294
   inflate call, but the end of the deflate stream has not been reached yet.
 
295
   It is also called to create a window for dictionary data when a dictionary
 
296
   is loaded.
 
297
 
 
298
   Providing output buffers larger than 32K to inflate() should provide a speed
 
299
   advantage, since only the last 32K of output is copied to the sliding window
 
300
   upon return from inflate(), and since all distances after the first 32K of
 
301
   output will fall in the output data, making match copies simpler and faster.
 
302
   The advantage may be dependent on the size of the processor's data caches.
 
303
 */
 
304
local int updatewindow(strm, out)
 
305
z_streamp strm;
 
306
unsigned out;
 
307
{
 
308
    struct inflate_state FAR *state;
 
309
    unsigned copy, dist;
 
310
 
 
311
    state = (struct inflate_state FAR *)strm->state;
 
312
 
 
313
    /* if it hasn't been done already, allocate space for the window */
 
314
    if (state->window == Z_NULL) {
 
315
        state->window = (unsigned char FAR *)
 
316
                        ZALLOC(strm, 1U << state->wbits,
 
317
                               sizeof(unsigned char));
 
318
        if (state->window == Z_NULL) return 1;
 
319
    }
 
320
 
 
321
    /* if window not in use yet, initialize */
 
322
    if (state->wsize == 0) {
 
323
        state->wsize = 1U << state->wbits;
 
324
        state->write = 0;
 
325
        state->whave = 0;
 
326
    }
 
327
 
 
328
    /* copy state->wsize or less output bytes into the circular window */
 
329
    copy = out - strm->avail_out;
 
330
    if (copy >= state->wsize) {
 
331
        zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
 
332
        state->write = 0;
 
333
        state->whave = state->wsize;
 
334
    }
 
335
    else {
 
336
        dist = state->wsize - state->write;
 
337
        if (dist > copy) dist = copy;
 
338
        zmemcpy(state->window + state->write, strm->next_out - copy, dist);
 
339
        copy -= dist;
 
340
        if (copy) {
 
341
            zmemcpy(state->window, strm->next_out - copy, copy);
 
342
            state->write = copy;
 
343
            state->whave = state->wsize;
 
344
        }
 
345
        else {
 
346
            state->write += dist;
 
347
            if (state->write == state->wsize) state->write = 0;
 
348
            if (state->whave < state->wsize) state->whave += dist;
 
349
        }
 
350
    }
 
351
    return 0;
 
352
}
 
353
 
 
354
/* Macros for inflate(): */
 
355
 
 
356
/* check function to use adler32() for zlib or crc32() for gzip */
 
357
#ifdef GUNZIP
 
358
#  define UPDATE(check, buf, len) \
 
359
    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
 
360
#else
 
361
#  define UPDATE(check, buf, len) adler32(check, buf, len)
 
362
#endif
 
363
 
 
364
/* check macros for header crc */
 
365
#ifdef GUNZIP
 
366
#  define CRC2(check, word) \
 
367
    do { \
 
368
        hbuf[0] = (unsigned char)(word); \
 
369
        hbuf[1] = (unsigned char)((word) >> 8); \
 
370
        check = crc32(check, hbuf, 2); \
 
371
    } while (0)
 
372
 
 
373
#  define CRC4(check, word) \
 
374
    do { \
 
375
        hbuf[0] = (unsigned char)(word); \
 
376
        hbuf[1] = (unsigned char)((word) >> 8); \
 
377
        hbuf[2] = (unsigned char)((word) >> 16); \
 
378
        hbuf[3] = (unsigned char)((word) >> 24); \
 
379
        check = crc32(check, hbuf, 4); \
 
380
    } while (0)
 
381
#endif
 
382
 
 
383
/* Load registers with state in inflate() for speed */
 
384
#define LOAD() \
 
385
    do { \
 
386
        put = strm->next_out; \
 
387
        left = strm->avail_out; \
 
388
        next = strm->next_in; \
 
389
        have = strm->avail_in; \
 
390
        hold = state->hold; \
 
391
        bits = state->bits; \
 
392
    } while (0)
 
393
 
 
394
/* Restore state from registers in inflate() */
 
395
#define RESTORE() \
 
396
    do { \
 
397
        strm->next_out = put; \
 
398
        strm->avail_out = left; \
 
399
        strm->next_in = next; \
 
400
        strm->avail_in = have; \
 
401
        state->hold = hold; \
 
402
        state->bits = bits; \
 
403
    } while (0)
 
404
 
 
405
/* Clear the input bit accumulator */
 
406
#define INITBITS() \
 
407
    do { \
 
408
        hold = 0; \
 
409
        bits = 0; \
 
410
    } while (0)
 
411
 
 
412
/* Get a byte of input into the bit accumulator, or return from inflate()
 
413
   if there is no input available. */
 
414
#define PULLBYTE() \
 
415
    do { \
 
416
        if (have == 0) goto inf_leave; \
 
417
        have--; \
 
418
        hold += (unsigned long)(*next++) << bits; \
 
419
        bits += 8; \
 
420
    } while (0)
 
421
 
 
422
/* Assure that there are at least n bits in the bit accumulator.  If there is
 
423
   not enough available input to do that, then return from inflate(). */
 
424
#define NEEDBITS(n) \
 
425
    do { \
 
426
        while (bits < (unsigned)(n)) \
 
427
            PULLBYTE(); \
 
428
    } while (0)
 
429
 
 
430
/* Return the low n bits of the bit accumulator (n < 16) */
 
431
#define BITS(n) \
 
432
    ((unsigned)hold & ((1U << (n)) - 1))
 
433
 
 
434
/* Remove n bits from the bit accumulator */
 
435
#define DROPBITS(n) \
 
436
    do { \
 
437
        hold >>= (n); \
 
438
        bits -= (unsigned)(n); \
 
439
    } while (0)
 
440
 
 
441
/* Remove zero to seven bits as needed to go to a byte boundary */
 
442
#define BYTEBITS() \
 
443
    do { \
 
444
        hold >>= bits & 7; \
 
445
        bits -= bits & 7; \
 
446
    } while (0)
 
447
 
 
448
/* Reverse the bytes in a 32-bit value */
 
449
#define REVERSE(q) \
 
450
    ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
 
451
     (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
 
452
 
 
453
/*
 
454
   inflate() uses a state machine to process as much input data and generate as
 
455
   much output data as possible before returning.  The state machine is
 
456
   structured roughly as follows:
 
457
 
 
458
    for (;;) switch (state) {
 
459
    ...
 
460
    case STATEn:
 
461
        if (not enough input data or output space to make progress)
 
462
            return;
 
463
        ... make progress ...
 
464
        state = STATEm;
 
465
        break;
 
466
    ...
 
467
    }
 
468
 
 
469
   so when inflate() is called again, the same case is attempted again, and
 
470
   if the appropriate resources are provided, the machine proceeds to the
 
471
   next state.  The NEEDBITS() macro is usually the way the state evaluates
 
472
   whether it can proceed or should return.  NEEDBITS() does the return if
 
473
   the requested bits are not available.  The typical use of the BITS macros
 
474
   is:
 
475
 
 
476
        NEEDBITS(n);
 
477
        ... do something with BITS(n) ...
 
478
        DROPBITS(n);
 
479
 
 
480
   where NEEDBITS(n) either returns from inflate() if there isn't enough
 
481
   input left to load n bits into the accumulator, or it continues.  BITS(n)
 
482
   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops
 
483
   the low n bits off the accumulator.  INITBITS() clears the accumulator
 
484
   and sets the number of available bits to zero.  BYTEBITS() discards just
 
485
   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()
 
486
   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
 
487
 
 
488
   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
 
489
   if there is no input available.  The decoding of variable length codes uses
 
490
   PULLBYTE() directly in order to pull just enough bytes to decode the next
 
491
   code, and no more.
 
492
 
 
493
   Some states loop until they get enough input, making sure that enough
 
494
   state information is maintained to continue the loop where it left off
 
495
   if NEEDBITS() returns in the loop.  For example, want, need, and keep
 
496
   would all have to actually be part of the saved state in case NEEDBITS()
 
497
   returns:
 
498
 
 
499
    case STATEw:
 
500
        while (want < need) {
 
501
            NEEDBITS(n);
 
502
            keep[want++] = BITS(n);
 
503
            DROPBITS(n);
 
504
        }
 
505
        state = STATEx;
 
506
    case STATEx:
 
507
 
 
508
   As shown above, if the next state is also the next case, then the break
 
509
   is omitted.
 
510
 
 
511
   A state may also return if there is not enough output space available to
 
512
   complete that state.  Those states are copying stored data, writing a
 
513
   literal byte, and copying a matching string.
 
514
 
 
515
   When returning, a "goto inf_leave" is used to update the total counters,
 
516
   update the check value, and determine whether any progress has been made
 
517
   during that inflate() call in order to return the proper return code.
 
518
   Progress is defined as a change in either strm->avail_in or strm->avail_out.
 
519
   When there is a window, goto inf_leave will update the window with the last
 
520
   output written.  If a goto inf_leave occurs in the middle of decompression
 
521
   and there is no window currently, goto inf_leave will create one and copy
 
522
   output to the window for the next call of inflate().
 
523
 
 
524
   In this implementation, the flush parameter of inflate() only affects the
 
525
   return code (per zlib.h).  inflate() always writes as much as possible to
 
526
   strm->next_out, given the space available and the provided input--the effect
 
527
   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers
 
528
   the allocation of and copying into a sliding window until necessary, which
 
529
   provides the effect documented in zlib.h for Z_FINISH when the entire input
 
530
   stream available.  So the only thing the flush parameter actually does is:
 
531
   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it
 
532
   will return Z_BUF_ERROR if it has not reached the end of the stream.
 
533
 */
 
534
 
 
535
int ZEXPORT inflate(strm, flush)
 
536
z_streamp strm;
 
537
int flush;
 
538
{
 
539
    struct inflate_state FAR *state;
 
540
    unsigned char FAR *next;    /* next input */
 
541
    unsigned char FAR *put;     /* next output */
 
542
    unsigned have, left;        /* available input and output */
 
543
    unsigned long hold;         /* bit buffer */
 
544
    unsigned bits;              /* bits in bit buffer */
 
545
    unsigned in, out;           /* save starting available input and output */
 
546
    unsigned copy;              /* number of stored or match bytes to copy */
 
547
    unsigned char FAR *from;    /* where to copy match bytes from */
 
548
    code this;                  /* current decoding table entry */
 
549
    code last;                  /* parent table entry */
 
550
    unsigned len;               /* length to copy for repeats, bits to drop */
 
551
    int ret;                    /* return code */
 
552
#ifdef GUNZIP
 
553
    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */
 
554
#endif
 
555
    static const unsigned short order[19] = /* permutation of code lengths */
 
556
        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
 
557
 
 
558
    if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
 
559
        (strm->next_in == Z_NULL && strm->avail_in != 0))
 
560
        return Z_STREAM_ERROR;
 
561
 
 
562
    state = (struct inflate_state FAR *)strm->state;
 
563
    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
 
564
    LOAD();
 
565
    in = have;
 
566
    out = left;
 
567
    ret = Z_OK;
 
568
    for (;;)
 
569
        switch (state->mode) {
 
570
        case HEAD:
 
571
            if (state->wrap == 0) {
 
572
                state->mode = TYPEDO;
 
573
                break;
 
574
            }
 
575
            NEEDBITS(16);
 
576
#ifdef GUNZIP
 
577
            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */
 
578
                state->check = crc32(0L, Z_NULL, 0);
 
579
                CRC2(state->check, hold);
 
580
                INITBITS();
 
581
                state->mode = FLAGS;
 
582
                break;
 
583
            }
 
584
            state->flags = 0;           /* expect zlib header */
 
585
            if (!(state->wrap & 1) ||   /* check if zlib header allowed */
 
586
#else
 
587
            if (
 
588
#endif
 
589
                ((BITS(8) << 8) + (hold >> 8)) % 31) {
 
590
                strm->msg = (char *)"incorrect header check";
 
591
                state->mode = BAD;
 
592
                break;
 
593
            }
 
594
            if (BITS(4) != Z_DEFLATED) {
 
595
                strm->msg = (char *)"unknown compression method";
 
596
                state->mode = BAD;
 
597
                break;
 
598
            }
 
599
            DROPBITS(4);
 
600
            if (BITS(4) + 8 > state->wbits) {
 
601
                strm->msg = (char *)"invalid window size";
 
602
                state->mode = BAD;
 
603
                break;
 
604
            }
 
605
            Tracev((stderr, "inflate:   zlib header ok\n"));
 
606
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
 
607
            state->mode = hold & 0x200 ? DICTID : TYPE;
 
608
            INITBITS();
 
609
            break;
 
610
#ifdef GUNZIP
 
611
        case FLAGS:
 
612
            NEEDBITS(16);
 
613
            state->flags = (int)(hold);
 
614
            if ((state->flags & 0xff) != Z_DEFLATED) {
 
615
                strm->msg = (char *)"unknown compression method";
 
616
                state->mode = BAD;
 
617
                break;
 
618
            }
 
619
            if (state->flags & 0xe000) {
 
620
                strm->msg = (char *)"unknown header flags set";
 
621
                state->mode = BAD;
 
622
                break;
 
623
            }
 
624
            if (state->flags & 0x0200) CRC2(state->check, hold);
 
625
            INITBITS();
 
626
            state->mode = TIME;
 
627
        case TIME:
 
628
            NEEDBITS(32);
 
629
            if (state->flags & 0x0200) CRC4(state->check, hold);
 
630
            INITBITS();
 
631
            state->mode = OS;
 
632
        case OS:
 
633
            NEEDBITS(16);
 
634
            if (state->flags & 0x0200) CRC2(state->check, hold);
 
635
            INITBITS();
 
636
            state->mode = EXLEN;
 
637
        case EXLEN:
 
638
            if (state->flags & 0x0400) {
 
639
                NEEDBITS(16);
 
640
                state->length = (unsigned)(hold);
 
641
                if (state->flags & 0x0200) CRC2(state->check, hold);
 
642
                INITBITS();
 
643
            }
 
644
            state->mode = EXTRA;
 
645
        case EXTRA:
 
646
            if (state->flags & 0x0400) {
 
647
                copy = state->length;
 
648
                if (copy > have) copy = have;
 
649
                if (copy) {
 
650
                    if (state->flags & 0x0200)
 
651
                        state->check = crc32(state->check, next, copy);
 
652
                    have -= copy;
 
653
                    next += copy;
 
654
                    state->length -= copy;
 
655
                }
 
656
                if (state->length) goto inf_leave;
 
657
            }
 
658
            state->mode = NAME;
 
659
        case NAME:
 
660
            if (state->flags & 0x0800) {
 
661
                if (have == 0) goto inf_leave;
 
662
                copy = 0;
 
663
                do {
 
664
                    len = (unsigned)(next[copy++]);
 
665
                } while (len && copy < have);
 
666
                if (state->flags & 0x02000)
 
667
                    state->check = crc32(state->check, next, copy);
 
668
                have -= copy;
 
669
                next += copy;
 
670
                if (len) goto inf_leave;
 
671
            }
 
672
            state->mode = COMMENT;
 
673
        case COMMENT:
 
674
            if (state->flags & 0x1000) {
 
675
                if (have == 0) goto inf_leave;
 
676
                copy = 0;
 
677
                do {
 
678
                    len = (unsigned)(next[copy++]);
 
679
                } while (len && copy < have);
 
680
                if (state->flags & 0x02000)
 
681
                    state->check = crc32(state->check, next, copy);
 
682
                have -= copy;
 
683
                next += copy;
 
684
                if (len) goto inf_leave;
 
685
            }
 
686
            state->mode = HCRC;
 
687
        case HCRC:
 
688
            if (state->flags & 0x0200) {
 
689
                NEEDBITS(16);
 
690
                if (hold != (state->check & 0xffff)) {
 
691
                    strm->msg = (char *)"header crc mismatch";
 
692
                    state->mode = BAD;
 
693
                    break;
 
694
                }
 
695
                INITBITS();
 
696
            }
 
697
            strm->adler = state->check = crc32(0L, Z_NULL, 0);
 
698
            state->mode = TYPE;
 
699
            break;
 
700
#endif
 
701
        case DICTID:
 
702
            NEEDBITS(32);
 
703
            strm->adler = state->check = REVERSE(hold);
 
704
            INITBITS();
 
705
            state->mode = DICT;
 
706
        case DICT:
 
707
            if (state->havedict == 0) {
 
708
                RESTORE();
 
709
                return Z_NEED_DICT;
 
710
            }
 
711
            strm->adler = state->check = adler32(0L, Z_NULL, 0);
 
712
            state->mode = TYPE;
 
713
        case TYPE:
 
714
            if (flush == Z_BLOCK) goto inf_leave;
 
715
        case TYPEDO:
 
716
            if (state->last) {
 
717
                BYTEBITS();
 
718
                state->mode = CHECK;
 
719
                break;
 
720
            }
 
721
            NEEDBITS(3);
 
722
            state->last = BITS(1);
 
723
            DROPBITS(1);
 
724
            switch (BITS(2)) {
 
725
            case 0:                             /* stored block */
 
726
                Tracev((stderr, "inflate:     stored block%s\n",
 
727
                        state->last ? " (last)" : ""));
 
728
                state->mode = STORED;
 
729
                break;
 
730
            case 1:                             /* fixed block */
 
731
                fixedtables(state);
 
732
                Tracev((stderr, "inflate:     fixed codes block%s\n",
 
733
                        state->last ? " (last)" : ""));
 
734
                state->mode = LEN;              /* decode codes */
 
735
                break;
 
736
            case 2:                             /* dynamic block */
 
737
                Tracev((stderr, "inflate:     dynamic codes block%s\n",
 
738
                        state->last ? " (last)" : ""));
 
739
                state->mode = TABLE;
 
740
                break;
 
741
            case 3:
 
742
                strm->msg = (char *)"invalid block type";
 
743
                state->mode = BAD;
 
744
            }
 
745
            DROPBITS(2);
 
746
            break;
 
747
        case STORED:
 
748
            BYTEBITS();                         /* go to byte boundary */
 
749
            NEEDBITS(32);
 
750
            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
 
751
                strm->msg = (char *)"invalid stored block lengths";
 
752
                state->mode = BAD;
 
753
                break;
 
754
            }
 
755
            state->length = (unsigned)hold & 0xffff;
 
756
            Tracev((stderr, "inflate:       stored length %u\n",
 
757
                    state->length));
 
758
            INITBITS();
 
759
            state->mode = COPY;
 
760
        case COPY:
 
761
            copy = state->length;
 
762
            if (copy) {
 
763
                if (copy > have) copy = have;
 
764
                if (copy > left) copy = left;
 
765
                if (copy == 0) goto inf_leave;
 
766
                zmemcpy(put, next, copy);
 
767
                have -= copy;
 
768
                next += copy;
 
769
                left -= copy;
 
770
                put += copy;
 
771
                state->length -= copy;
 
772
                break;
 
773
            }
 
774
            Tracev((stderr, "inflate:       stored end\n"));
 
775
            state->mode = TYPE;
 
776
            break;
 
777
        case TABLE:
 
778
            NEEDBITS(14);
 
779
            state->nlen = BITS(5) + 257;
 
780
            DROPBITS(5);
 
781
            state->ndist = BITS(5) + 1;
 
782
            DROPBITS(5);
 
783
            state->ncode = BITS(4) + 4;
 
784
            DROPBITS(4);
 
785
#ifndef PKZIP_BUG_WORKAROUND
 
786
            if (state->nlen > 286 || state->ndist > 30) {
 
787
                strm->msg = (char *)"too many length or distance symbols";
 
788
                state->mode = BAD;
 
789
                break;
 
790
            }
 
791
#endif
 
792
            Tracev((stderr, "inflate:       table sizes ok\n"));
 
793
            state->have = 0;
 
794
            state->mode = LENLENS;
 
795
        case LENLENS:
 
796
            while (state->have < state->ncode) {
 
797
                NEEDBITS(3);
 
798
                state->lens[order[state->have++]] = (unsigned short)BITS(3);
 
799
                DROPBITS(3);
 
800
            }
 
801
            while (state->have < 19)
 
802
                state->lens[order[state->have++]] = 0;
 
803
            state->next = state->codes;
 
804
            state->lencode = (code const FAR *)(state->next);
 
805
            state->lenbits = 7;
 
806
            ret = inflate_table(CODES, state->lens, 19, &(state->next),
 
807
                                &(state->lenbits), state->work);
 
808
            if (ret) {
 
809
                strm->msg = (char *)"invalid code lengths set";
 
810
                state->mode = BAD;
 
811
                break;
 
812
            }
 
813
            Tracev((stderr, "inflate:       code lengths ok\n"));
 
814
            state->have = 0;
 
815
            state->mode = CODELENS;
 
816
        case CODELENS:
 
817
            while (state->have < state->nlen + state->ndist) {
 
818
                for (;;) {
 
819
                    this = state->lencode[BITS(state->lenbits)];
 
820
                    if ((unsigned)(this.bits) <= bits) break;
 
821
                    PULLBYTE();
 
822
                }
 
823
                if (this.val < 16) {
 
824
                    NEEDBITS(this.bits);
 
825
                    DROPBITS(this.bits);
 
826
                    state->lens[state->have++] = this.val;
 
827
                }
 
828
                else {
 
829
                    if (this.val == 16) {
 
830
                        NEEDBITS(this.bits + 2);
 
831
                        DROPBITS(this.bits);
 
832
                        if (state->have == 0) {
 
833
                            strm->msg = (char *)"invalid bit length repeat";
 
834
                            state->mode = BAD;
 
835
                            break;
 
836
                        }
 
837
                        len = state->lens[state->have - 1];
 
838
                        copy = 3 + BITS(2);
 
839
                        DROPBITS(2);
 
840
                    }
 
841
                    else if (this.val == 17) {
 
842
                        NEEDBITS(this.bits + 3);
 
843
                        DROPBITS(this.bits);
 
844
                        len = 0;
 
845
                        copy = 3 + BITS(3);
 
846
                        DROPBITS(3);
 
847
                    }
 
848
                    else {
 
849
                        NEEDBITS(this.bits + 7);
 
850
                        DROPBITS(this.bits);
 
851
                        len = 0;
 
852
                        copy = 11 + BITS(7);
 
853
                        DROPBITS(7);
 
854
                    }
 
855
                    if (state->have + copy > state->nlen + state->ndist) {
 
856
                        strm->msg = (char *)"invalid bit length repeat";
 
857
                        state->mode = BAD;
 
858
                        break;
 
859
                    }
 
860
                    while (copy--)
 
861
                        state->lens[state->have++] = (unsigned short)len;
 
862
                }
 
863
            }
 
864
 
 
865
            /* handle error breaks in while */
 
866
            if (state->mode == BAD) break;
 
867
 
 
868
            /* build code tables */
 
869
            state->next = state->codes;
 
870
            state->lencode = (code const FAR *)(state->next);
 
871
            state->lenbits = 9;
 
872
            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
 
873
                                &(state->lenbits), state->work);
 
874
            if (ret) {
 
875
                strm->msg = (char *)"invalid literal/lengths set";
 
876
                state->mode = BAD;
 
877
                break;
 
878
            }
 
879
            state->distcode = (code const FAR *)(state->next);
 
880
            state->distbits = 6;
 
881
            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
 
882
                            &(state->next), &(state->distbits), state->work);
 
883
            if (ret) {
 
884
                strm->msg = (char *)"invalid distances set";
 
885
                state->mode = BAD;
 
886
                break;
 
887
            }
 
888
            Tracev((stderr, "inflate:       codes ok\n"));
 
889
            state->mode = LEN;
 
890
        case LEN:
 
891
            if (have >= 6 && left >= 258) {
 
892
                RESTORE();
 
893
                inflate_fast(strm, out);
 
894
                LOAD();
 
895
                break;
 
896
            }
 
897
            for (;;) {
 
898
                this = state->lencode[BITS(state->lenbits)];
 
899
                if ((unsigned)(this.bits) <= bits) break;
 
900
                PULLBYTE();
 
901
            }
 
902
            if (this.op && (this.op & 0xf0) == 0) {
 
903
                last = this;
 
904
                for (;;) {
 
905
                    this = state->lencode[last.val +
 
906
                            (BITS(last.bits + last.op) >> last.bits)];
 
907
                    if ((unsigned)(last.bits + this.bits) <= bits) break;
 
908
                    PULLBYTE();
 
909
                }
 
910
                DROPBITS(last.bits);
 
911
            }
 
912
            DROPBITS(this.bits);
 
913
            state->length = (unsigned)this.val;
 
914
            if ((int)(this.op) == 0) {
 
915
                Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
 
916
                        "inflate:         literal '%c'\n" :
 
917
                        "inflate:         literal 0x%02x\n", this.val));
 
918
                state->mode = LIT;
 
919
                break;
 
920
            }
 
921
            if (this.op & 32) {
 
922
                Tracevv((stderr, "inflate:         end of block\n"));
 
923
                state->mode = TYPE;
 
924
                break;
 
925
            }
 
926
            if (this.op & 64) {
 
927
                strm->msg = (char *)"invalid literal/length code";
 
928
                state->mode = BAD;
 
929
                break;
 
930
            }
 
931
            state->extra = (unsigned)(this.op) & 15;
 
932
            state->mode = LENEXT;
 
933
        case LENEXT:
 
934
            if (state->extra) {
 
935
                NEEDBITS(state->extra);
 
936
                state->length += BITS(state->extra);
 
937
                DROPBITS(state->extra);
 
938
            }
 
939
            Tracevv((stderr, "inflate:         length %u\n", state->length));
 
940
            state->mode = DIST;
 
941
        case DIST:
 
942
            for (;;) {
 
943
                this = state->distcode[BITS(state->distbits)];
 
944
                if ((unsigned)(this.bits) <= bits) break;
 
945
                PULLBYTE();
 
946
            }
 
947
            if ((this.op & 0xf0) == 0) {
 
948
                last = this;
 
949
                for (;;) {
 
950
                    this = state->distcode[last.val +
 
951
                            (BITS(last.bits + last.op) >> last.bits)];
 
952
                    if ((unsigned)(last.bits + this.bits) <= bits) break;
 
953
                    PULLBYTE();
 
954
                }
 
955
                DROPBITS(last.bits);
 
956
            }
 
957
            DROPBITS(this.bits);
 
958
            if (this.op & 64) {
 
959
                strm->msg = (char *)"invalid distance code";
 
960
                state->mode = BAD;
 
961
                break;
 
962
            }
 
963
            state->offset = (unsigned)this.val;
 
964
            state->extra = (unsigned)(this.op) & 15;
 
965
            state->mode = DISTEXT;
 
966
        case DISTEXT:
 
967
            if (state->extra) {
 
968
                NEEDBITS(state->extra);
 
969
                state->offset += BITS(state->extra);
 
970
                DROPBITS(state->extra);
 
971
            }
 
972
            if (state->offset > state->whave + out - left) {
 
973
                strm->msg = (char *)"invalid distance too far back";
 
974
                state->mode = BAD;
 
975
                break;
 
976
            }
 
977
            Tracevv((stderr, "inflate:         distance %u\n", state->offset));
 
978
            state->mode = MATCH;
 
979
        case MATCH:
 
980
            if (left == 0) goto inf_leave;
 
981
            copy = out - left;
 
982
            if (state->offset > copy) {         /* copy from window */
 
983
                copy = state->offset - copy;
 
984
                if (copy > state->write) {
 
985
                    copy -= state->write;
 
986
                    from = state->window + (state->wsize - copy);
 
987
                }
 
988
                else
 
989
                    from = state->window + (state->write - copy);
 
990
                if (copy > state->length) copy = state->length;
 
991
            }
 
992
            else {                              /* copy from output */
 
993
                from = put - state->offset;
 
994
                copy = state->length;
 
995
            }
 
996
            if (copy > left) copy = left;
 
997
            left -= copy;
 
998
            state->length -= copy;
 
999
            do {
 
1000
                *put++ = *from++;
 
1001
            } while (--copy);
 
1002
            if (state->length == 0) state->mode = LEN;
 
1003
            break;
 
1004
        case LIT:
 
1005
            if (left == 0) goto inf_leave;
 
1006
            *put++ = (unsigned char)(state->length);
 
1007
            left--;
 
1008
            state->mode = LEN;
 
1009
            break;
 
1010
        case CHECK:
 
1011
            if (state->wrap) {
 
1012
                NEEDBITS(32);
 
1013
                out -= left;
 
1014
                strm->total_out += out;
 
1015
                state->total += out;
 
1016
                if (out)
 
1017
                    strm->adler = state->check =
 
1018
                        UPDATE(state->check, put - out, out);
 
1019
                out = left;
 
1020
                if ((
 
1021
#ifdef GUNZIP
 
1022
                     state->flags ? hold :
 
1023
#endif
 
1024
                     REVERSE(hold)) != state->check) {
 
1025
                    strm->msg = (char *)"incorrect data check";
 
1026
                    state->mode = BAD;
 
1027
                    break;
 
1028
                }
 
1029
                INITBITS();
 
1030
                Tracev((stderr, "inflate:   check matches trailer\n"));
 
1031
            }
 
1032
#ifdef GUNZIP
 
1033
            state->mode = LENGTH;
 
1034
        case LENGTH:
 
1035
            if (state->wrap && state->flags) {
 
1036
                NEEDBITS(32);
 
1037
                if (hold != (state->total & 0xffffffffUL)) {
 
1038
                    strm->msg = (char *)"incorrect length check";
 
1039
                    state->mode = BAD;
 
1040
                    break;
 
1041
                }
 
1042
                INITBITS();
 
1043
                Tracev((stderr, "inflate:   length matches trailer\n"));
 
1044
            }
 
1045
#endif
 
1046
            state->mode = DONE;
 
1047
        case DONE:
 
1048
            ret = Z_STREAM_END;
 
1049
            goto inf_leave;
 
1050
        case BAD:
 
1051
            ret = Z_DATA_ERROR;
 
1052
            goto inf_leave;
 
1053
        case MEM:
 
1054
            return Z_MEM_ERROR;
 
1055
        case SYNC:
 
1056
        default:
 
1057
            return Z_STREAM_ERROR;
 
1058
        }
 
1059
 
 
1060
    /*
 
1061
       Return from inflate(), updating the total counts and the check value.
 
1062
       If there was no progress during the inflate() call, return a buffer
 
1063
       error.  Call updatewindow() to create and/or update the window state.
 
1064
       Note: a memory error from inflate() is non-recoverable.
 
1065
     */
 
1066
  inf_leave:
 
1067
    RESTORE();
 
1068
    if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
 
1069
        if (updatewindow(strm, out)) {
 
1070
            state->mode = MEM;
 
1071
            return Z_MEM_ERROR;
 
1072
        }
 
1073
    in -= strm->avail_in;
 
1074
    out -= strm->avail_out;
 
1075
    strm->total_in += in;
 
1076
    strm->total_out += out;
 
1077
    state->total += out;
 
1078
    if (state->wrap && out)
 
1079
        strm->adler = state->check =
 
1080
            UPDATE(state->check, strm->next_out - out, out);
 
1081
    strm->data_type = state->bits + (state->last ? 64 : 0) +
 
1082
                      (state->mode == TYPE ? 128 : 0);
 
1083
    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
 
1084
        ret = Z_BUF_ERROR;
 
1085
    return ret;
 
1086
}
 
1087
 
 
1088
int ZEXPORT inflateEnd(strm)
 
1089
z_streamp strm;
 
1090
{
 
1091
    struct inflate_state FAR *state;
 
1092
    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
 
1093
        return Z_STREAM_ERROR;
 
1094
    state = (struct inflate_state FAR *)strm->state;
 
1095
    if (state->window != Z_NULL) ZFREE(strm, state->window);
 
1096
    ZFREE(strm, strm->state);
 
1097
    strm->state = Z_NULL;
 
1098
    Tracev((stderr, "inflate: end\n"));
 
1099
    return Z_OK;
 
1100
}
 
1101
 
 
1102
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
 
1103
z_streamp strm;
 
1104
const Bytef *dictionary;
 
1105
uInt dictLength;
 
1106
{
 
1107
    struct inflate_state FAR *state;
 
1108
    unsigned long id;
 
1109
 
 
1110
    /* check state */
 
1111
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
 
1112
    state = (struct inflate_state FAR *)strm->state;
 
1113
    if (state->mode != DICT) return Z_STREAM_ERROR;
 
1114
 
 
1115
    /* check for correct dictionary id */
 
1116
    id = adler32(0L, Z_NULL, 0);
 
1117
    id = adler32(id, dictionary, dictLength);
 
1118
    if (id != state->check) return Z_DATA_ERROR;
 
1119
 
 
1120
    /* copy dictionary to window */
 
1121
    if (updatewindow(strm, strm->avail_out)) {
 
1122
        state->mode = MEM;
 
1123
        return Z_MEM_ERROR;
 
1124
    }
 
1125
    if (dictLength > state->wsize) {
 
1126
        zmemcpy(state->window, dictionary + dictLength - state->wsize,
 
1127
                state->wsize);
 
1128
        state->whave = state->wsize;
 
1129
    }
 
1130
    else {
 
1131
        zmemcpy(state->window + state->wsize - dictLength, dictionary,
 
1132
                dictLength);
 
1133
        state->whave = dictLength;
 
1134
    }
 
1135
    state->havedict = 1;
 
1136
    Tracev((stderr, "inflate:   dictionary set\n"));
 
1137
    return Z_OK;
 
1138
}
 
1139
 
 
1140
/*
 
1141
   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found
 
1142
   or when out of input.  When called, *have is the number of pattern bytes
 
1143
   found in order so far, in 0..3.  On return *have is updated to the new
 
1144
   state.  If on return *have equals four, then the pattern was found and the
 
1145
   return value is how many bytes were read including the last byte of the
 
1146
   pattern.  If *have is less than four, then the pattern has not been found
 
1147
   yet and the return value is len.  In the latter case, syncsearch() can be
 
1148
   called again with more data and the *have state.  *have is initialized to
 
1149
   zero for the first call.
 
1150
 */
 
1151
local unsigned syncsearch(have, buf, len)
 
1152
unsigned FAR *have;
 
1153
unsigned char FAR *buf;
 
1154
unsigned len;
 
1155
{
 
1156
    unsigned got;
 
1157
    unsigned next;
 
1158
 
 
1159
    got = *have;
 
1160
    next = 0;
 
1161
    while (next < len && got < 4) {
 
1162
        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
 
1163
            got++;
 
1164
        else if (buf[next])
 
1165
            got = 0;
 
1166
        else
 
1167
            got = 4 - got;
 
1168
        next++;
 
1169
    }
 
1170
    *have = got;
 
1171
    return next;
 
1172
}
 
1173
 
 
1174
int ZEXPORT inflateSync(strm)
 
1175
z_streamp strm;
 
1176
{
 
1177
    unsigned len;               /* number of bytes to look at or looked at */
 
1178
    unsigned long in, out;      /* temporary to save total_in and total_out */
 
1179
    unsigned char buf[4];       /* to restore bit buffer to byte string */
 
1180
    struct inflate_state FAR *state;
 
1181
 
 
1182
    /* check parameters */
 
1183
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
 
1184
    state = (struct inflate_state FAR *)strm->state;
 
1185
    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
 
1186
 
 
1187
    /* if first time, start search in bit buffer */
 
1188
    if (state->mode != SYNC) {
 
1189
        state->mode = SYNC;
 
1190
        state->hold <<= state->bits & 7;
 
1191
        state->bits -= state->bits & 7;
 
1192
        len = 0;
 
1193
        while (state->bits >= 8) {
 
1194
            buf[len++] = (unsigned char)(state->hold);
 
1195
            state->hold >>= 8;
 
1196
            state->bits -= 8;
 
1197
        }
 
1198
        state->have = 0;
 
1199
        syncsearch(&(state->have), buf, len);
 
1200
    }
 
1201
 
 
1202
    /* search available input */
 
1203
    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
 
1204
    strm->avail_in -= len;
 
1205
    strm->next_in += len;
 
1206
    strm->total_in += len;
 
1207
 
 
1208
    /* return no joy or set up to restart inflate() on a new block */
 
1209
    if (state->have != 4) return Z_DATA_ERROR;
 
1210
    in = strm->total_in;  out = strm->total_out;
 
1211
    inflateReset(strm);
 
1212
    strm->total_in = in;  strm->total_out = out;
 
1213
    state->mode = TYPE;
 
1214
    return Z_OK;
 
1215
}
 
1216
 
 
1217
/*
 
1218
   Returns true if inflate is currently at the end of a block generated by
 
1219
   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
 
1220
   implementation to provide an additional safety check. PPP uses
 
1221
   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
 
1222
   block. When decompressing, PPP checks that at the end of input packet,
 
1223
   inflate is waiting for these length bytes.
 
1224
 */
 
1225
int ZEXPORT inflateSyncPoint(strm)
 
1226
z_streamp strm;
 
1227
{
 
1228
    struct inflate_state FAR *state;
 
1229
 
 
1230
    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
 
1231
    state = (struct inflate_state FAR *)strm->state;
 
1232
    return state->mode == STORED && state->bits == 0;
 
1233
}
 
1234
 
 
1235
int ZEXPORT inflateCopy(dest, source)
 
1236
z_streamp dest;
 
1237
z_streamp source;
 
1238
{
 
1239
    struct inflate_state FAR *state;
 
1240
    struct inflate_state FAR *copy;
 
1241
    unsigned char FAR *window;
 
1242
 
 
1243
    /* check input */
 
1244
    if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
 
1245
        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
 
1246
        return Z_STREAM_ERROR;
 
1247
    state = (struct inflate_state FAR *)source->state;
 
1248
 
 
1249
    /* allocate space */
 
1250
    copy = (struct inflate_state FAR *)
 
1251
           ZALLOC(source, 1, sizeof(struct inflate_state));
 
1252
    if (copy == Z_NULL) return Z_MEM_ERROR;
 
1253
    window = Z_NULL;
 
1254
    if (state->window != Z_NULL) {
 
1255
        window = (unsigned char FAR *)
 
1256
                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
 
1257
        if (window == Z_NULL) {
 
1258
            ZFREE(source, copy);
 
1259
            return Z_MEM_ERROR;
 
1260
        }
 
1261
    }
 
1262
 
 
1263
    /* copy state */
 
1264
    *dest = *source;
 
1265
    *copy = *state;
 
1266
    copy->lencode = copy->codes + (state->lencode - state->codes);
 
1267
    copy->distcode = copy->codes + (state->distcode - state->codes);
 
1268
    copy->next = copy->codes + (state->next - state->codes);
 
1269
    if (window != Z_NULL)
 
1270
        zmemcpy(window, state->window, 1U << state->wbits);
 
1271
    copy->window = window;
 
1272
    dest->state = (voidpf)copy;
 
1273
    return Z_OK;
 
1274
}