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