zlib.c revision 130799
128415Speter/*
234768Speter * This file is derived from various .h and .c files from the zlib-1.0.4
328415Speter * distribution by Jean-loup Gailly and Mark Adler, with some additions
428415Speter * by Paul Mackerras to aid in implementing Deflate compression and
528415Speter * decompression for PPP packets.  See zlib.h for conditions of
628415Speter * distribution and use.
728415Speter *
828415Speter * Changes that have been made include:
928415Speter * - added Z_PACKET_FLUSH (see zlib.h for details)
1034768Speter * - added inflateIncomp and deflateOutputPending
1134768Speter * - allow strm->next_out to be NULL, meaning discard the output
1228415Speter *
1350477Speter * $FreeBSD: head/sys/net/zlib.c 130799 2004-06-20 17:42:35Z markm $
1428415Speter */
1528415Speter
1628415Speter/*
1734768Speter *  ==FILEVERSION 971210==
1828415Speter *
1928415Speter * This marker is used by the Linux installation script to determine
2028415Speter * whether an up-to-date version of this file is already installed.
2128415Speter */
2228415Speter
2334768Speter#define NO_DUMMY_DECL
2434768Speter#define NO_ZCFUNCS
2534768Speter#define MY_ZCALLOC
2634768Speter
2755205Speter#if defined(__FreeBSD__) && defined(_KERNEL)
2834768Speter#define inflate	inflate_ppp	/* FreeBSD already has an inflate :-( */
2934768Speter#endif
3034768Speter
3134768Speter
3234768Speter/* +++ zutil.h */
3328415Speter/* zutil.h -- internal interface and configuration of the compression library
3434768Speter * Copyright (C) 1995-1996 Jean-loup Gailly.
3528415Speter * For conditions of distribution and use, see copyright notice in zlib.h
3628415Speter */
3728415Speter
3828415Speter/* WARNING: this file should *not* be used by applications. It is
3928415Speter   part of the implementation of the compression library and is
4028415Speter   subject to change. Applications should only use zlib.h.
4128415Speter */
4228415Speter
4334768Speter/* From: zutil.h,v 1.16 1996/07/24 13:41:13 me Exp $ */
4428415Speter
4534768Speter#ifndef _Z_UTIL_H
4628415Speter#define _Z_UTIL_H
4728415Speter
4855205Speter#ifdef _KERNEL
4928415Speter#include <net/zlib.h>
5028415Speter#else
5128415Speter#include "zlib.h"
5228415Speter#endif
5328415Speter
5455205Speter#ifdef _KERNEL
5534768Speter/* Assume this is a *BSD or SVR4 kernel */
5634768Speter#include <sys/types.h>
5734768Speter#include <sys/time.h>
5834768Speter#include <sys/systm.h>
59110235Salfred#include <sys/param.h>
60130799Smarkm#include <sys/kernel.h>
61130799Smarkm#include <sys/module.h>
6234768Speter#  define HAVE_MEMCPY
6334768Speter
6434768Speter#else
6534768Speter#if defined(__KERNEL__)
6634768Speter/* Assume this is a Linux kernel */
6734768Speter#include <linux/string.h>
6834768Speter#define HAVE_MEMCPY
6934768Speter
7034768Speter#else /* not kernel */
7134768Speter
7234768Speter#if defined(MSDOS)||defined(VMS)||defined(CRAY)||defined(WIN32)||defined(RISCOS)
7334768Speter#   include <stddef.h>
7434768Speter#   include <errno.h>
7534768Speter#else
7634768Speter    extern int errno;
7734768Speter#endif
7834768Speter#ifdef STDC
7934768Speter#  include <string.h>
8034768Speter#  include <stdlib.h>
8134768Speter#endif
8234768Speter#endif /* __KERNEL__ */
8355205Speter#endif /* _KERNEL */
8434768Speter
8528415Speter#ifndef local
8628415Speter#  define local static
8728415Speter#endif
8828415Speter/* compile with -Dlocal if your debugger can't find static symbols */
8928415Speter
9028415Spetertypedef unsigned char  uch;
9128415Spetertypedef uch FAR uchf;
9228415Spetertypedef unsigned short ush;
9328415Spetertypedef ush FAR ushf;
9428415Spetertypedef unsigned long  ulg;
9528415Speter
9634768Speterextern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
9734768Speter/* (size given to avoid silly warnings with Visual C++) */
9828415Speter
9934768Speter#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
10034768Speter
10134768Speter#define ERR_RETURN(strm,err) \
10243305Sdillon  return (strm->msg = (const char*)ERR_MSG(err), (err))
10328415Speter/* To be used only when the state is known to be valid */
10428415Speter
10528415Speter        /* common constants */
10628415Speter
10728415Speter#ifndef DEF_WBITS
10828415Speter#  define DEF_WBITS MAX_WBITS
10928415Speter#endif
11028415Speter/* default windowBits for decompression. MAX_WBITS is for compression only */
11128415Speter
11228415Speter#if MAX_MEM_LEVEL >= 8
11328415Speter#  define DEF_MEM_LEVEL 8
11428415Speter#else
11528415Speter#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
11628415Speter#endif
11728415Speter/* default memLevel */
11828415Speter
11928415Speter#define STORED_BLOCK 0
12028415Speter#define STATIC_TREES 1
12128415Speter#define DYN_TREES    2
12228415Speter/* The three kinds of block type */
12328415Speter
12428415Speter#define MIN_MATCH  3
12528415Speter#define MAX_MATCH  258
12628415Speter/* The minimum and maximum match lengths */
12728415Speter
12834768Speter#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
12934768Speter
13034768Speter        /* target dependencies */
13134768Speter
13234768Speter#ifdef MSDOS
13334768Speter#  define OS_CODE  0x00
13434768Speter#  ifdef __TURBOC__
13534768Speter#    include <alloc.h>
13634768Speter#  else /* MSC or DJGPP */
13734768Speter#    include <malloc.h>
13834768Speter#  endif
13934768Speter#endif
14034768Speter
14134768Speter#ifdef OS2
14234768Speter#  define OS_CODE  0x06
14334768Speter#endif
14434768Speter
14534768Speter#ifdef WIN32 /* Window 95 & Windows NT */
14634768Speter#  define OS_CODE  0x0b
14734768Speter#endif
14834768Speter
14934768Speter#if defined(VAXC) || defined(VMS)
15034768Speter#  define OS_CODE  0x02
15134768Speter#  define FOPEN(name, mode) \
15234768Speter     fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
15334768Speter#endif
15434768Speter
15534768Speter#ifdef AMIGA
15634768Speter#  define OS_CODE  0x01
15734768Speter#endif
15834768Speter
15934768Speter#if defined(ATARI) || defined(atarist)
16034768Speter#  define OS_CODE  0x05
16134768Speter#endif
16234768Speter
16334768Speter#ifdef MACOS
16434768Speter#  define OS_CODE  0x07
16534768Speter#endif
16634768Speter
16734768Speter#ifdef __50SERIES /* Prime/PRIMOS */
16834768Speter#  define OS_CODE  0x0F
16934768Speter#endif
17034768Speter
17134768Speter#ifdef TOPS20
17234768Speter#  define OS_CODE  0x0a
17334768Speter#endif
17434768Speter
17534768Speter#if defined(_BEOS_) || defined(RISCOS)
17634768Speter#  define fdopen(fd,mode) NULL /* No fdopen() */
17734768Speter#endif
17834768Speter
17934768Speter        /* Common defaults */
18034768Speter
18134768Speter#ifndef OS_CODE
18234768Speter#  define OS_CODE  0x03  /* assume Unix */
18334768Speter#endif
18434768Speter
18534768Speter#ifndef FOPEN
18634768Speter#  define FOPEN(name, mode) fopen((name), (mode))
18734768Speter#endif
18834768Speter
18928415Speter         /* functions */
19028415Speter
19134768Speter#ifdef HAVE_STRERROR
19234768Speter   extern char *strerror OF((int));
19334768Speter#  define zstrerror(errnum) strerror(errnum)
19428415Speter#else
19534768Speter#  define zstrerror(errnum) ""
19634768Speter#endif
19728415Speter
19834768Speter#if defined(pyr)
19934768Speter#  define NO_MEMCPY
20034768Speter#endif
20134768Speter#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(_MSC_VER)
20234768Speter /* Use our own functions for small and medium model with MSC <= 5.0.
20334768Speter  * You may have to use the same strategy for Borland C (untested).
20434768Speter  */
20534768Speter#  define NO_MEMCPY
20634768Speter#endif
20728415Speter#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
20828415Speter#  define HAVE_MEMCPY
20928415Speter#endif
21028415Speter#ifdef HAVE_MEMCPY
21134768Speter#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
21234768Speter#    define zmemcpy _fmemcpy
21334768Speter#    define zmemcmp _fmemcmp
21434768Speter#    define zmemzero(dest, len) _fmemset(dest, 0, len)
21534768Speter#  else
21628415Speter#    define zmemcpy memcpy
21734768Speter#    define zmemcmp memcmp
21828415Speter#    define zmemzero(dest, len) memset(dest, 0, len)
21934768Speter#  endif
22028415Speter#else
22128415Speter   extern void zmemcpy  OF((Bytef* dest, Bytef* source, uInt len));
22234768Speter   extern int  zmemcmp  OF((Bytef* s1,   Bytef* s2, uInt len));
22328415Speter   extern void zmemzero OF((Bytef* dest, uInt len));
22428415Speter#endif
22528415Speter
22628415Speter/* Diagnostic functions */
22728415Speter#ifdef DEBUG_ZLIB
22828415Speter#  include <stdio.h>
22928415Speter#  ifndef verbose
23028415Speter#    define verbose 0
23128415Speter#  endif
23234768Speter   extern void z_error    OF((char *m));
23328415Speter#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
23428415Speter#  define Trace(x) fprintf x
23528415Speter#  define Tracev(x) {if (verbose) fprintf x ;}
23628415Speter#  define Tracevv(x) {if (verbose>1) fprintf x ;}
23728415Speter#  define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
23828415Speter#  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
23928415Speter#else
24028415Speter#  define Assert(cond,msg)
24128415Speter#  define Trace(x)
24228415Speter#  define Tracev(x)
24328415Speter#  define Tracevv(x)
24428415Speter#  define Tracec(c,x)
24528415Speter#  define Tracecv(c,x)
24628415Speter#endif
24728415Speter
24828415Speter
24934768Spetertypedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len));
25028415Speter
25134768Spetervoidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
25234768Spetervoid   zcfree  OF((voidpf opaque, voidpf ptr));
25328415Speter
25428415Speter#define ZALLOC(strm, items, size) \
25528415Speter           (*((strm)->zalloc))((strm)->opaque, (items), (size))
25634768Speter#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
25734768Speter#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
25828415Speter
25934768Speter#endif /* _Z_UTIL_H */
26034768Speter/* --- zutil.h */
26134768Speter
26234768Speter/* +++ deflate.h */
26328415Speter/* deflate.h -- internal compression state
26434768Speter * Copyright (C) 1995-1996 Jean-loup Gailly
26528415Speter * For conditions of distribution and use, see copyright notice in zlib.h
26628415Speter */
26728415Speter
26828415Speter/* WARNING: this file should *not* be used by applications. It is
26928415Speter   part of the implementation of the compression library and is
27028415Speter   subject to change. Applications should only use zlib.h.
27128415Speter */
27228415Speter
27334768Speter/* From: deflate.h,v 1.10 1996/07/02 12:41:00 me Exp $ */
27428415Speter
27534768Speter#ifndef _DEFLATE_H
27634768Speter#define _DEFLATE_H
27728415Speter
27834768Speter/* #include "zutil.h" */
27934768Speter
28028415Speter/* ===========================================================================
28128415Speter * Internal compression state.
28228415Speter */
28328415Speter
28428415Speter#define LENGTH_CODES 29
28528415Speter/* number of length codes, not counting the special END_BLOCK code */
28628415Speter
28728415Speter#define LITERALS  256
28828415Speter/* number of literal bytes 0..255 */
28928415Speter
29028415Speter#define L_CODES (LITERALS+1+LENGTH_CODES)
29128415Speter/* number of Literal or Length codes, including the END_BLOCK code */
29228415Speter
29328415Speter#define D_CODES   30
29428415Speter/* number of distance codes */
29528415Speter
29628415Speter#define BL_CODES  19
29728415Speter/* number of codes used to transfer the bit lengths */
29828415Speter
29928415Speter#define HEAP_SIZE (2*L_CODES+1)
30028415Speter/* maximum heap size */
30128415Speter
30228415Speter#define MAX_BITS 15
30328415Speter/* All codes must not exceed MAX_BITS bits */
30428415Speter
30528415Speter#define INIT_STATE    42
30628415Speter#define BUSY_STATE   113
30728415Speter#define FINISH_STATE 666
30828415Speter/* Stream status */
30928415Speter
31028415Speter
31128415Speter/* Data structure describing a single value and its code string. */
31228415Spetertypedef struct ct_data_s {
31328415Speter    union {
31428415Speter        ush  freq;       /* frequency count */
31528415Speter        ush  code;       /* bit string */
31628415Speter    } fc;
31728415Speter    union {
31828415Speter        ush  dad;        /* father node in Huffman tree */
31928415Speter        ush  len;        /* length of bit string */
32028415Speter    } dl;
32128415Speter} FAR ct_data;
32228415Speter
32328415Speter#define Freq fc.freq
32428415Speter#define Code fc.code
32528415Speter#define Dad  dl.dad
32628415Speter#define Len  dl.len
32728415Speter
32828415Spetertypedef struct static_tree_desc_s  static_tree_desc;
32928415Speter
33028415Spetertypedef struct tree_desc_s {
33128415Speter    ct_data *dyn_tree;           /* the dynamic tree */
33228415Speter    int     max_code;            /* largest code with non zero frequency */
33328415Speter    static_tree_desc *stat_desc; /* the corresponding static tree */
33428415Speter} FAR tree_desc;
33528415Speter
33628415Spetertypedef ush Pos;
33728415Spetertypedef Pos FAR Posf;
33828415Spetertypedef unsigned IPos;
33928415Speter
34028415Speter/* A Pos is an index in the character window. We use short instead of int to
34128415Speter * save space in the various tables. IPos is used only for parameter passing.
34228415Speter */
34328415Speter
34428415Spetertypedef struct deflate_state {
34534768Speter    z_streamp strm;      /* pointer back to this zlib stream */
34628415Speter    int   status;        /* as the name implies */
34728415Speter    Bytef *pending_buf;  /* output still pending */
34834768Speter    ulg   pending_buf_size; /* size of pending_buf */
34928415Speter    Bytef *pending_out;  /* next pending byte to output to the stream */
35028415Speter    int   pending;       /* nb of bytes in the pending buffer */
35128415Speter    int   noheader;      /* suppress zlib header and adler32 */
35234768Speter    Byte  data_type;     /* UNKNOWN, BINARY or ASCII */
35328415Speter    Byte  method;        /* STORED (for zip only) or DEFLATED */
35434768Speter    int   last_flush;    /* value of flush param for previous deflate call */
35528415Speter
35628415Speter                /* used by deflate.c: */
35728415Speter
35828415Speter    uInt  w_size;        /* LZ77 window size (32K by default) */
35928415Speter    uInt  w_bits;        /* log2(w_size)  (8..16) */
36028415Speter    uInt  w_mask;        /* w_size - 1 */
36128415Speter
36228415Speter    Bytef *window;
36328415Speter    /* Sliding window. Input bytes are read into the second half of the window,
36428415Speter     * and move to the first half later to keep a dictionary of at least wSize
36528415Speter     * bytes. With this organization, matches are limited to a distance of
36628415Speter     * wSize-MAX_MATCH bytes, but this ensures that IO is always
36728415Speter     * performed with a length multiple of the block size. Also, it limits
36828415Speter     * the window size to 64K, which is quite useful on MSDOS.
36928415Speter     * To do: use the user input buffer as sliding window.
37028415Speter     */
37128415Speter
37228415Speter    ulg window_size;
37328415Speter    /* Actual size of window: 2*wSize, except when the user input buffer
37428415Speter     * is directly used as sliding window.
37528415Speter     */
37628415Speter
37728415Speter    Posf *prev;
37828415Speter    /* Link to older string with same hash index. To limit the size of this
37928415Speter     * array to 64K, this link is maintained only for the last 32K strings.
38028415Speter     * An index in this array is thus a window index modulo 32K.
38128415Speter     */
38228415Speter
38328415Speter    Posf *head; /* Heads of the hash chains or NIL. */
38428415Speter
38528415Speter    uInt  ins_h;          /* hash index of string to be inserted */
38628415Speter    uInt  hash_size;      /* number of elements in hash table */
38728415Speter    uInt  hash_bits;      /* log2(hash_size) */
38828415Speter    uInt  hash_mask;      /* hash_size-1 */
38928415Speter
39028415Speter    uInt  hash_shift;
39128415Speter    /* Number of bits by which ins_h must be shifted at each input
39228415Speter     * step. It must be such that after MIN_MATCH steps, the oldest
39328415Speter     * byte no longer takes part in the hash key, that is:
39428415Speter     *   hash_shift * MIN_MATCH >= hash_bits
39528415Speter     */
39628415Speter
39728415Speter    long block_start;
39828415Speter    /* Window position at the beginning of the current output block. Gets
39928415Speter     * negative when the window is moved backwards.
40028415Speter     */
40128415Speter
40228415Speter    uInt match_length;           /* length of best match */
40328415Speter    IPos prev_match;             /* previous match */
40428415Speter    int match_available;         /* set if previous match exists */
40528415Speter    uInt strstart;               /* start of string to insert */
40628415Speter    uInt match_start;            /* start of matching string */
40728415Speter    uInt lookahead;              /* number of valid bytes ahead in window */
40828415Speter
40928415Speter    uInt prev_length;
41028415Speter    /* Length of the best match at previous step. Matches not greater than this
41128415Speter     * are discarded. This is used in the lazy match evaluation.
41228415Speter     */
41328415Speter
41428415Speter    uInt max_chain_length;
41528415Speter    /* To speed up deflation, hash chains are never searched beyond this
41628415Speter     * length.  A higher limit improves compression ratio but degrades the
41728415Speter     * speed.
41828415Speter     */
41928415Speter
42028415Speter    uInt max_lazy_match;
42128415Speter    /* Attempt to find a better match only when the current match is strictly
42228415Speter     * smaller than this value. This mechanism is used only for compression
42328415Speter     * levels >= 4.
42428415Speter     */
42528415Speter#   define max_insert_length  max_lazy_match
42628415Speter    /* Insert new strings in the hash table only if the match length is not
42728415Speter     * greater than this length. This saves time but degrades compression.
42828415Speter     * max_insert_length is used only for compression levels <= 3.
42928415Speter     */
43028415Speter
43128415Speter    int level;    /* compression level (1..9) */
43228415Speter    int strategy; /* favor or force Huffman coding*/
43328415Speter
43428415Speter    uInt good_match;
43528415Speter    /* Use a faster search when the previous match is longer than this */
43628415Speter
43734768Speter    int nice_match; /* Stop searching when current match exceeds this */
43828415Speter
43928415Speter                /* used by trees.c: */
44028415Speter    /* Didn't use ct_data typedef below to supress compiler warning */
44128415Speter    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
44228415Speter    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
44328415Speter    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
44428415Speter
44528415Speter    struct tree_desc_s l_desc;               /* desc. for literal tree */
44628415Speter    struct tree_desc_s d_desc;               /* desc. for distance tree */
44728415Speter    struct tree_desc_s bl_desc;              /* desc. for bit length tree */
44828415Speter
44928415Speter    ush bl_count[MAX_BITS+1];
45028415Speter    /* number of codes at each bit length for an optimal tree */
45128415Speter
45228415Speter    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
45328415Speter    int heap_len;               /* number of elements in the heap */
45428415Speter    int heap_max;               /* element of largest frequency */
45528415Speter    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
45628415Speter     * The same heap array is used to build all trees.
45728415Speter     */
45828415Speter
45928415Speter    uch depth[2*L_CODES+1];
46028415Speter    /* Depth of each subtree used as tie breaker for trees of equal frequency
46128415Speter     */
46228415Speter
46328415Speter    uchf *l_buf;          /* buffer for literals or lengths */
46428415Speter
46528415Speter    uInt  lit_bufsize;
46628415Speter    /* Size of match buffer for literals/lengths.  There are 4 reasons for
46728415Speter     * limiting lit_bufsize to 64K:
46828415Speter     *   - frequencies can be kept in 16 bit counters
46928415Speter     *   - if compression is not successful for the first block, all input
47028415Speter     *     data is still in the window so we can still emit a stored block even
47128415Speter     *     when input comes from standard input.  (This can also be done for
47228415Speter     *     all blocks if lit_bufsize is not greater than 32K.)
47328415Speter     *   - if compression is not successful for a file smaller than 64K, we can
47428415Speter     *     even emit a stored file instead of a stored block (saving 5 bytes).
47528415Speter     *     This is applicable only for zip (not gzip or zlib).
47628415Speter     *   - creating new Huffman trees less frequently may not provide fast
47728415Speter     *     adaptation to changes in the input data statistics. (Take for
47828415Speter     *     example a binary file with poorly compressible code followed by
47928415Speter     *     a highly compressible string table.) Smaller buffer sizes give
48028415Speter     *     fast adaptation but have of course the overhead of transmitting
48128415Speter     *     trees more frequently.
48228415Speter     *   - I can't count above 4
48328415Speter     */
48428415Speter
48528415Speter    uInt last_lit;      /* running index in l_buf */
48628415Speter
48728415Speter    ushf *d_buf;
48828415Speter    /* Buffer for distances. To simplify the code, d_buf and l_buf have
48928415Speter     * the same number of elements. To use different lengths, an extra flag
49028415Speter     * array would be necessary.
49128415Speter     */
49228415Speter
49328415Speter    ulg opt_len;        /* bit length of current block with optimal trees */
49428415Speter    ulg static_len;     /* bit length of current block with static trees */
49528415Speter    ulg compressed_len; /* total bit length of compressed file */
49628415Speter    uInt matches;       /* number of string matches in current block */
49728415Speter    int last_eob_len;   /* bit length of EOB code for last block */
49828415Speter
49928415Speter#ifdef DEBUG_ZLIB
50028415Speter    ulg bits_sent;      /* bit length of the compressed data */
50128415Speter#endif
50228415Speter
50328415Speter    ush bi_buf;
50428415Speter    /* Output buffer. bits are inserted starting at the bottom (least
50528415Speter     * significant bits).
50628415Speter     */
50728415Speter    int bi_valid;
50828415Speter    /* Number of valid bits in bi_buf.  All bits above the last valid bit
50928415Speter     * are always zero.
51028415Speter     */
51128415Speter
51228415Speter} FAR deflate_state;
51328415Speter
51428415Speter/* Output a byte on the stream.
51528415Speter * IN assertion: there is enough room in pending_buf.
51628415Speter */
51728415Speter#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
51828415Speter
51928415Speter
52028415Speter#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
52128415Speter/* Minimum amount of lookahead, except at the end of the input file.
52228415Speter * See deflate.c for comments about the MIN_MATCH+1.
52328415Speter */
52428415Speter
52528415Speter#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)
52628415Speter/* In order to simplify the code, particularly on 16 bit machines, match
52728415Speter * distances are limited to MAX_DIST instead of WSIZE.
52828415Speter */
52928415Speter
53028415Speter        /* in trees.c */
53134768Spetervoid _tr_init         OF((deflate_state *s));
53234768Speterint  _tr_tally        OF((deflate_state *s, unsigned dist, unsigned lc));
53334768Speterulg  _tr_flush_block  OF((deflate_state *s, charf *buf, ulg stored_len,
53434768Speter			  int eof));
53534768Spetervoid _tr_align        OF((deflate_state *s));
53634768Spetervoid _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
53728415Speter                          int eof));
53834768Spetervoid _tr_stored_type_only OF((deflate_state *));
53928415Speter
54034768Speter#endif
54134768Speter/* --- deflate.h */
54228415Speter
54334768Speter/* +++ deflate.c */
54428415Speter/* deflate.c -- compress data using the deflation algorithm
54534768Speter * Copyright (C) 1995-1996 Jean-loup Gailly.
54628415Speter * For conditions of distribution and use, see copyright notice in zlib.h
54728415Speter */
54828415Speter
54928415Speter/*
55028415Speter *  ALGORITHM
55128415Speter *
55228415Speter *      The "deflation" process depends on being able to identify portions
55328415Speter *      of the input text which are identical to earlier input (within a
55428415Speter *      sliding window trailing behind the input currently being processed).
55528415Speter *
55628415Speter *      The most straightforward technique turns out to be the fastest for
55728415Speter *      most input files: try all possible matches and select the longest.
55828415Speter *      The key feature of this algorithm is that insertions into the string
55928415Speter *      dictionary are very simple and thus fast, and deletions are avoided
56028415Speter *      completely. Insertions are performed at each input character, whereas
56128415Speter *      string matches are performed only when the previous match ends. So it
56228415Speter *      is preferable to spend more time in matches to allow very fast string
56328415Speter *      insertions and avoid deletions. The matching algorithm for small
56428415Speter *      strings is inspired from that of Rabin & Karp. A brute force approach
56528415Speter *      is used to find longer strings when a small match has been found.
56628415Speter *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
56728415Speter *      (by Leonid Broukhis).
56828415Speter *         A previous version of this file used a more sophisticated algorithm
56928415Speter *      (by Fiala and Greene) which is guaranteed to run in linear amortized
57028415Speter *      time, but has a larger average cost, uses more memory and is patented.
57128415Speter *      However the F&G algorithm may be faster for some highly redundant
57228415Speter *      files if the parameter max_chain_length (described below) is too large.
57328415Speter *
57428415Speter *  ACKNOWLEDGEMENTS
57528415Speter *
57628415Speter *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
57728415Speter *      I found it in 'freeze' written by Leonid Broukhis.
57828415Speter *      Thanks to many people for bug reports and testing.
57928415Speter *
58028415Speter *  REFERENCES
58128415Speter *
58234768Speter *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
58334768Speter *      Available in ftp://ds.internic.net/rfc/rfc1951.txt
58428415Speter *
58528415Speter *      A description of the Rabin and Karp algorithm is given in the book
58628415Speter *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
58728415Speter *
58828415Speter *      Fiala,E.R., and Greene,D.H.
58928415Speter *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
59028415Speter *
59128415Speter */
59228415Speter
59334768Speter/* From: deflate.c,v 1.15 1996/07/24 13:40:58 me Exp $ */
59428415Speter
59534768Speter/* #include "deflate.h" */
59634768Speter
59734768Speterchar deflate_copyright[] = " deflate 1.0.4 Copyright 1995-1996 Jean-loup Gailly ";
59828415Speter/*
59928415Speter  If you use the zlib library in a product, an acknowledgment is welcome
60028415Speter  in the documentation of your product. If for some reason you cannot
60128415Speter  include such an acknowledgment, I would appreciate that you keep this
60228415Speter  copyright string in the executable of your product.
60328415Speter */
60428415Speter
60534768Speter/* ===========================================================================
60634768Speter *  Function prototypes.
60734768Speter */
60834768Spetertypedef enum {
60934768Speter    need_more,      /* block not completed, need more input or more output */
61034768Speter    block_done,     /* block flush performed */
61134768Speter    finish_started, /* finish started, need only more output at next deflate */
61234768Speter    finish_done     /* finish done, accept no more input or output */
61334768Speter} block_state;
61434768Speter
61534768Spetertypedef block_state (*compress_func) OF((deflate_state *s, int flush));
61634768Speter/* Compression function. Returns the block state after the call. */
61734768Speter
61834768Speterlocal void fill_window    OF((deflate_state *s));
61934768Speterlocal block_state deflate_stored OF((deflate_state *s, int flush));
62034768Speterlocal block_state deflate_fast   OF((deflate_state *s, int flush));
62134768Speterlocal block_state deflate_slow   OF((deflate_state *s, int flush));
62234768Speterlocal void lm_init        OF((deflate_state *s));
62334768Speterlocal void putShortMSB    OF((deflate_state *s, uInt b));
62434768Speterlocal void flush_pending  OF((z_streamp strm));
62534768Speterlocal int read_buf        OF((z_streamp strm, charf *buf, unsigned size));
62634768Speter#ifdef ASMV
62734768Speter      void match_init OF((void)); /* asm code initialization */
62834768Speter      uInt longest_match  OF((deflate_state *s, IPos cur_match));
62934768Speter#else
63034768Speterlocal uInt longest_match  OF((deflate_state *s, IPos cur_match));
63134768Speter#endif
63234768Speter
63334768Speter#ifdef DEBUG_ZLIB
63434768Speterlocal  void check_match OF((deflate_state *s, IPos start, IPos match,
63534768Speter                            int length));
63634768Speter#endif
63734768Speter
63834768Speter/* ===========================================================================
63934768Speter * Local data
64034768Speter */
64134768Speter
64228415Speter#define NIL 0
64328415Speter/* Tail of hash chains */
64428415Speter
64528415Speter#ifndef TOO_FAR
64628415Speter#  define TOO_FAR 4096
64728415Speter#endif
64828415Speter/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
64928415Speter
65028415Speter#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
65128415Speter/* Minimum amount of lookahead, except at the end of the input file.
65228415Speter * See deflate.c for comments about the MIN_MATCH+1.
65328415Speter */
65428415Speter
65528415Speter/* Values for max_lazy_match, good_match and max_chain_length, depending on
65628415Speter * the desired pack level (0..9). The values given below have been tuned to
65728415Speter * exclude worst case performance for pathological files. Better values may be
65828415Speter * found for specific files.
65928415Speter */
66028415Spetertypedef struct config_s {
66128415Speter   ush good_length; /* reduce lazy search above this match length */
66228415Speter   ush max_lazy;    /* do not perform lazy search above this match length */
66328415Speter   ush nice_length; /* quit search above this match length */
66428415Speter   ush max_chain;
66534768Speter   compress_func func;
66628415Speter} config;
66728415Speter
66828415Speterlocal config configuration_table[10] = {
66928415Speter/*      good lazy nice chain */
67034768Speter/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
67134768Speter/* 1 */ {4,    4,  8,    4, deflate_fast}, /* maximum speed, no lazy matches */
67234768Speter/* 2 */ {4,    5, 16,    8, deflate_fast},
67334768Speter/* 3 */ {4,    6, 32,   32, deflate_fast},
67428415Speter
67534768Speter/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
67634768Speter/* 5 */ {8,   16, 32,   32, deflate_slow},
67734768Speter/* 6 */ {8,   16, 128, 128, deflate_slow},
67834768Speter/* 7 */ {8,   32, 128, 256, deflate_slow},
67934768Speter/* 8 */ {32, 128, 258, 1024, deflate_slow},
68034768Speter/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */
68128415Speter
68228415Speter/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
68328415Speter * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
68428415Speter * meaning.
68528415Speter */
68628415Speter
68728415Speter#define EQUAL 0
68828415Speter/* result of memcmp for equal strings */
68928415Speter
69034768Speter#ifndef NO_DUMMY_DECL
69134768Speterstruct static_tree_desc_s {int dummy;}; /* for buggy compilers */
69228415Speter#endif
69328415Speter
69428415Speter/* ===========================================================================
69528415Speter * Update a hash value with the given input byte
69628415Speter * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
69728415Speter *    input characters, so that a running hash key can be computed from the
69828415Speter *    previous key instead of complete recalculation each time.
69928415Speter */
70028415Speter#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
70128415Speter
70228415Speter
70328415Speter/* ===========================================================================
70428415Speter * Insert string str in the dictionary and set match_head to the previous head
70528415Speter * of the hash chain (the most recent string with same hash key). Return
70628415Speter * the previous length of the hash chain.
70728415Speter * IN  assertion: all calls to to INSERT_STRING are made with consecutive
70828415Speter *    input characters and the first MIN_MATCH bytes of str are valid
70928415Speter *    (except for the last MIN_MATCH-1 bytes of the input file).
71028415Speter */
71128415Speter#define INSERT_STRING(s, str, match_head) \
71228415Speter   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
71328415Speter    s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
71434768Speter    s->head[s->ins_h] = (Pos)(str))
71528415Speter
71628415Speter/* ===========================================================================
71728415Speter * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
71828415Speter * prev[] will be initialized on the fly.
71928415Speter */
72028415Speter#define CLEAR_HASH(s) \
72128415Speter    s->head[s->hash_size-1] = NIL; \
72228415Speter    zmemzero((charf *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
72328415Speter
72428415Speter/* ========================================================================= */
72534768Speterint deflateInit_(strm, level, version, stream_size)
72634768Speter    z_streamp strm;
72728415Speter    int level;
72834768Speter    const char *version;
72934768Speter    int stream_size;
73028415Speter{
73134768Speter    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
73234768Speter			 Z_DEFAULT_STRATEGY, version, stream_size);
73328415Speter    /* To do: ignore strm->next_in if we use it as window */
73428415Speter}
73528415Speter
73628415Speter/* ========================================================================= */
73734768Speterint deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
73834768Speter		  version, stream_size)
73934768Speter    z_streamp strm;
74028415Speter    int  level;
74128415Speter    int  method;
74228415Speter    int  windowBits;
74328415Speter    int  memLevel;
74428415Speter    int  strategy;
74534768Speter    const char *version;
74634768Speter    int stream_size;
74728415Speter{
74828415Speter    deflate_state *s;
74928415Speter    int noheader = 0;
75034768Speter    static char* my_version = ZLIB_VERSION;
75128415Speter
75234768Speter    ushf *overlay;
75334768Speter    /* We overlay pending_buf and d_buf+l_buf. This works since the average
75434768Speter     * output size for (length,distance) codes is <= 24 bits.
75534768Speter     */
75634768Speter
75734768Speter    if (version == Z_NULL || version[0] != my_version[0] ||
75834768Speter        stream_size != sizeof(z_stream)) {
75934768Speter	return Z_VERSION_ERROR;
76034768Speter    }
76128415Speter    if (strm == Z_NULL) return Z_STREAM_ERROR;
76228415Speter
76328415Speter    strm->msg = Z_NULL;
76434768Speter#ifndef NO_ZCFUNCS
76534768Speter    if (strm->zalloc == Z_NULL) {
76634768Speter	strm->zalloc = zcalloc;
76734768Speter	strm->opaque = (voidpf)0;
76834768Speter    }
76934768Speter    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
77034768Speter#endif
77128415Speter
77228415Speter    if (level == Z_DEFAULT_COMPRESSION) level = 6;
77328415Speter
77428415Speter    if (windowBits < 0) { /* undocumented feature: suppress zlib header */
77528415Speter        noheader = 1;
77628415Speter        windowBits = -windowBits;
77728415Speter    }
77834768Speter    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
77993013Sjedgar        windowBits < 9 || windowBits > 15 || level < 0 || level > 9 ||
78034768Speter	strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
78128415Speter        return Z_STREAM_ERROR;
78228415Speter    }
78334768Speter    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
78428415Speter    if (s == Z_NULL) return Z_MEM_ERROR;
78528415Speter    strm->state = (struct internal_state FAR *)s;
78628415Speter    s->strm = strm;
78728415Speter
78828415Speter    s->noheader = noheader;
78928415Speter    s->w_bits = windowBits;
79028415Speter    s->w_size = 1 << s->w_bits;
79128415Speter    s->w_mask = s->w_size - 1;
79228415Speter
79328415Speter    s->hash_bits = memLevel + 7;
79428415Speter    s->hash_size = 1 << s->hash_bits;
79528415Speter    s->hash_mask = s->hash_size - 1;
79628415Speter    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
79728415Speter
79834768Speter    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
79934768Speter    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
80034768Speter    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
80128415Speter
80228415Speter    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
80328415Speter
80434768Speter    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
80534768Speter    s->pending_buf = (uchf *) overlay;
80634768Speter    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
80728415Speter
80828415Speter    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
80928415Speter        s->pending_buf == Z_NULL) {
81043305Sdillon        strm->msg = (const char*)ERR_MSG(Z_MEM_ERROR);
81128415Speter        deflateEnd (strm);
81228415Speter        return Z_MEM_ERROR;
81328415Speter    }
81434768Speter    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
81534768Speter    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
81628415Speter
81728415Speter    s->level = level;
81828415Speter    s->strategy = strategy;
81928415Speter    s->method = (Byte)method;
82028415Speter
82128415Speter    return deflateReset(strm);
82228415Speter}
82328415Speter
82428415Speter/* ========================================================================= */
82534768Speterint deflateSetDictionary (strm, dictionary, dictLength)
82634768Speter    z_streamp strm;
82734768Speter    const Bytef *dictionary;
82834768Speter    uInt  dictLength;
82934768Speter{
83034768Speter    deflate_state *s;
83134768Speter    uInt length = dictLength;
83234768Speter    uInt n;
83334768Speter    IPos hash_head = 0;
83434768Speter
83534768Speter    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
83634768Speter	return Z_STREAM_ERROR;
83734768Speter
83834768Speter    s = (deflate_state *) strm->state;
83934768Speter    if (s->status != INIT_STATE) return Z_STREAM_ERROR;
84034768Speter
84134768Speter    strm->adler = adler32(strm->adler, dictionary, dictLength);
84234768Speter
84334768Speter    if (length < MIN_MATCH) return Z_OK;
84434768Speter    if (length > MAX_DIST(s)) {
84534768Speter	length = MAX_DIST(s);
84634768Speter#ifndef USE_DICT_HEAD
84734768Speter	dictionary += dictLength - length; /* use the tail of the dictionary */
84834768Speter#endif
84934768Speter    }
85034768Speter    zmemcpy((charf *)s->window, dictionary, length);
85134768Speter    s->strstart = length;
85234768Speter    s->block_start = (long)length;
85334768Speter
85434768Speter    /* Insert all strings in the hash table (except for the last two bytes).
85534768Speter     * s->lookahead stays null, so s->ins_h will be recomputed at the next
85634768Speter     * call of fill_window.
85734768Speter     */
85834768Speter    s->ins_h = s->window[0];
85934768Speter    UPDATE_HASH(s, s->ins_h, s->window[1]);
86034768Speter    for (n = 0; n <= length - MIN_MATCH; n++) {
86134768Speter	INSERT_STRING(s, n, hash_head);
86234768Speter    }
86334768Speter    if (hash_head) hash_head = 0;  /* to make compiler happy */
86434768Speter    return Z_OK;
86534768Speter}
86634768Speter
86734768Speter/* ========================================================================= */
86828415Speterint deflateReset (strm)
86934768Speter    z_streamp strm;
87028415Speter{
87128415Speter    deflate_state *s;
87228415Speter
87328415Speter    if (strm == Z_NULL || strm->state == Z_NULL ||
87434768Speter        strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
87528415Speter
87628415Speter    strm->total_in = strm->total_out = 0;
87728415Speter    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
87828415Speter    strm->data_type = Z_UNKNOWN;
87928415Speter
88028415Speter    s = (deflate_state *)strm->state;
88128415Speter    s->pending = 0;
88228415Speter    s->pending_out = s->pending_buf;
88328415Speter
88428415Speter    if (s->noheader < 0) {
88528415Speter        s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */
88628415Speter    }
88728415Speter    s->status = s->noheader ? BUSY_STATE : INIT_STATE;
88834768Speter    strm->adler = 1;
88934768Speter    s->last_flush = Z_NO_FLUSH;
89028415Speter
89134768Speter    _tr_init(s);
89228415Speter    lm_init(s);
89328415Speter
89428415Speter    return Z_OK;
89528415Speter}
89628415Speter
89734768Speter/* ========================================================================= */
89834768Speterint deflateParams(strm, level, strategy)
89934768Speter    z_streamp strm;
90034768Speter    int level;
90134768Speter    int strategy;
90234768Speter{
90334768Speter    deflate_state *s;
90434768Speter    compress_func func;
90534768Speter    int err = Z_OK;
90634768Speter
90734768Speter    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
90834768Speter    s = (deflate_state *) strm->state;
90934768Speter
91034768Speter    if (level == Z_DEFAULT_COMPRESSION) {
91134768Speter	level = 6;
91234768Speter    }
91334768Speter    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
91434768Speter	return Z_STREAM_ERROR;
91534768Speter    }
91634768Speter    func = configuration_table[s->level].func;
91734768Speter
91834768Speter    if (func != configuration_table[level].func && strm->total_in != 0) {
91934768Speter	/* Flush the last buffer: */
92034768Speter	err = deflate(strm, Z_PARTIAL_FLUSH);
92134768Speter    }
92234768Speter    if (s->level != level) {
92334768Speter	s->level = level;
92434768Speter	s->max_lazy_match   = configuration_table[level].max_lazy;
92534768Speter	s->good_match       = configuration_table[level].good_length;
92634768Speter	s->nice_match       = configuration_table[level].nice_length;
92734768Speter	s->max_chain_length = configuration_table[level].max_chain;
92834768Speter    }
92934768Speter    s->strategy = strategy;
93034768Speter    return err;
93134768Speter}
93234768Speter
93328415Speter/* =========================================================================
93428415Speter * Put a short in the pending buffer. The 16-bit value is put in MSB order.
93528415Speter * IN assertion: the stream state is correct and there is enough room in
93628415Speter * pending_buf.
93728415Speter */
93828415Speterlocal void putShortMSB (s, b)
93928415Speter    deflate_state *s;
94028415Speter    uInt b;
94128415Speter{
94228415Speter    put_byte(s, (Byte)(b >> 8));
94328415Speter    put_byte(s, (Byte)(b & 0xff));
94428415Speter}
94528415Speter
94628415Speter/* =========================================================================
94734768Speter * Flush as much pending output as possible. All deflate() output goes
94834768Speter * through this function so some applications may wish to modify it
94934768Speter * to avoid allocating a large strm->next_out buffer and copying into it.
95034768Speter * (See also read_buf()).
95128415Speter */
95228415Speterlocal void flush_pending(strm)
95334768Speter    z_streamp strm;
95428415Speter{
95534768Speter    deflate_state *s = (deflate_state *) strm->state;
95634768Speter    unsigned len = s->pending;
95728415Speter
95828415Speter    if (len > strm->avail_out) len = strm->avail_out;
95928415Speter    if (len == 0) return;
96028415Speter
96134768Speter    if (strm->next_out != Z_NULL) {
96234768Speter	zmemcpy(strm->next_out, s->pending_out, len);
96328415Speter	strm->next_out += len;
96428415Speter    }
96534768Speter    s->pending_out += len;
96628415Speter    strm->total_out += len;
96734768Speter    strm->avail_out  -= len;
96834768Speter    s->pending -= len;
96934768Speter    if (s->pending == 0) {
97034768Speter        s->pending_out = s->pending_buf;
97128415Speter    }
97228415Speter}
97328415Speter
97428415Speter/* ========================================================================= */
97528415Speterint deflate (strm, flush)
97634768Speter    z_streamp strm;
97728415Speter    int flush;
97828415Speter{
97934768Speter    int old_flush; /* value of flush param for previous deflate call */
98034768Speter    deflate_state *s;
98128415Speter
98234768Speter    if (strm == Z_NULL || strm->state == Z_NULL ||
98334768Speter	flush > Z_FINISH || flush < 0) {
98434768Speter        return Z_STREAM_ERROR;
98534768Speter    }
98634768Speter    s = (deflate_state *) strm->state;
98734768Speter
98834768Speter    if ((strm->next_in == Z_NULL && strm->avail_in != 0) ||
98934768Speter	(s->status == FINISH_STATE && flush != Z_FINISH)) {
99028415Speter        ERR_RETURN(strm, Z_STREAM_ERROR);
99128415Speter    }
99228415Speter    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
99328415Speter
99434768Speter    s->strm = strm; /* just in case */
99534768Speter    old_flush = s->last_flush;
99634768Speter    s->last_flush = flush;
99728415Speter
99828415Speter    /* Write the zlib header */
99934768Speter    if (s->status == INIT_STATE) {
100028415Speter
100134768Speter        uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
100234768Speter        uInt level_flags = (s->level-1) >> 1;
100328415Speter
100428415Speter        if (level_flags > 3) level_flags = 3;
100528415Speter        header |= (level_flags << 6);
100634768Speter	if (s->strstart != 0) header |= PRESET_DICT;
100728415Speter        header += 31 - (header % 31);
100828415Speter
100934768Speter        s->status = BUSY_STATE;
101034768Speter        putShortMSB(s, header);
101134768Speter
101234768Speter	/* Save the adler32 of the preset dictionary: */
101334768Speter	if (s->strstart != 0) {
101434768Speter	    putShortMSB(s, (uInt)(strm->adler >> 16));
101534768Speter	    putShortMSB(s, (uInt)(strm->adler & 0xffff));
101634768Speter	}
101734768Speter	strm->adler = 1L;
101828415Speter    }
101928415Speter
102028415Speter    /* Flush as much pending output as possible */
102134768Speter    if (s->pending != 0) {
102228415Speter        flush_pending(strm);
102334768Speter        if (strm->avail_out == 0) {
102434768Speter	    /* Since avail_out is 0, deflate will be called again with
102534768Speter	     * more output space, but possibly with both pending and
102634768Speter	     * avail_in equal to zero. There won't be anything to do,
102734768Speter	     * but this is not an error situation so make sure we
102834768Speter	     * return OK instead of BUF_ERROR at next call of deflate:
102934768Speter             */
103034768Speter	    s->last_flush = -1;
103134768Speter	    return Z_OK;
103234768Speter	}
103328415Speter
103434768Speter    /* Make sure there is something to do and avoid duplicate consecutive
103534768Speter     * flushes. For repeated and useless calls with Z_FINISH, we keep
103634768Speter     * returning Z_STREAM_END instead of Z_BUFF_ERROR.
103728415Speter     */
103834768Speter    } else if (strm->avail_in == 0 && flush <= old_flush &&
103934768Speter	       flush != Z_FINISH) {
104034768Speter        ERR_RETURN(strm, Z_BUF_ERROR);
104128415Speter    }
104228415Speter
104328415Speter    /* User must not provide more input after the first FINISH: */
104434768Speter    if (s->status == FINISH_STATE && strm->avail_in != 0) {
104528415Speter        ERR_RETURN(strm, Z_BUF_ERROR);
104628415Speter    }
104728415Speter
104828415Speter    /* Start a new block or continue the current one.
104928415Speter     */
105034768Speter    if (strm->avail_in != 0 || s->lookahead != 0 ||
105134768Speter        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
105234768Speter        block_state bstate;
105328415Speter
105434768Speter	bstate = (*(configuration_table[s->level].func))(s, flush);
105534768Speter
105634768Speter        if (bstate == finish_started || bstate == finish_done) {
105734768Speter            s->status = FINISH_STATE;
105828415Speter        }
105934768Speter        if (bstate == need_more || bstate == finish_started) {
106034768Speter	    if (strm->avail_out == 0) {
106134768Speter	        s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
106234768Speter	    }
106328415Speter	    return Z_OK;
106434768Speter	    /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
106534768Speter	     * of deflate should use the same flush parameter to make sure
106634768Speter	     * that the flush is complete. So we don't have to output an
106734768Speter	     * empty block here, this will be done at next call. This also
106834768Speter	     * ensures that for a very small output buffer, we emit at most
106934768Speter	     * one empty block.
107028415Speter	     */
107134768Speter	}
107234768Speter        if (bstate == block_done) {
107334768Speter            if (flush == Z_PARTIAL_FLUSH) {
107434768Speter                _tr_align(s);
107534768Speter	    } else if (flush == Z_PACKET_FLUSH) {
107634768Speter		/* Output just the 3-bit `stored' block type value,
107734768Speter		   but not a zero length. */
107834768Speter		_tr_stored_type_only(s);
107934768Speter            } else { /* FULL_FLUSH or SYNC_FLUSH */
108034768Speter                _tr_stored_block(s, (char*)0, 0L, 0);
108134768Speter                /* For a full flush, this empty block will be recognized
108234768Speter                 * as a special marker by inflate_sync().
108334768Speter                 */
108434768Speter                if (flush == Z_FULL_FLUSH) {
108534768Speter                    CLEAR_HASH(s);             /* forget history */
108634768Speter                }
108734768Speter            }
108834768Speter            flush_pending(strm);
108934768Speter	    if (strm->avail_out == 0) {
109034768Speter	      s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
109134768Speter	      return Z_OK;
109228415Speter	    }
109334768Speter        }
109428415Speter    }
109528415Speter    Assert(strm->avail_out > 0, "bug2");
109628415Speter
109728415Speter    if (flush != Z_FINISH) return Z_OK;
109834768Speter    if (s->noheader) return Z_STREAM_END;
109928415Speter
110028415Speter    /* Write the zlib trailer (adler32) */
110134768Speter    putShortMSB(s, (uInt)(strm->adler >> 16));
110234768Speter    putShortMSB(s, (uInt)(strm->adler & 0xffff));
110328415Speter    flush_pending(strm);
110428415Speter    /* If avail_out is zero, the application will call deflate again
110528415Speter     * to flush the rest.
110628415Speter     */
110734768Speter    s->noheader = -1; /* write the trailer only once! */
110834768Speter    return s->pending != 0 ? Z_OK : Z_STREAM_END;
110928415Speter}
111028415Speter
111128415Speter/* ========================================================================= */
111228415Speterint deflateEnd (strm)
111334768Speter    z_streamp strm;
111428415Speter{
111534768Speter    int status;
111634768Speter    deflate_state *s;
111728415Speter
111834768Speter    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
111934768Speter    s = (deflate_state *) strm->state;
112028415Speter
112134768Speter    status = s->status;
112234768Speter    if (status != INIT_STATE && status != BUSY_STATE &&
112334768Speter	status != FINISH_STATE) {
112434768Speter      return Z_STREAM_ERROR;
112534768Speter    }
112628415Speter
112734768Speter    /* Deallocate in reverse order of allocations: */
112834768Speter    TRY_FREE(strm, s->pending_buf);
112934768Speter    TRY_FREE(strm, s->head);
113034768Speter    TRY_FREE(strm, s->prev);
113134768Speter    TRY_FREE(strm, s->window);
113234768Speter
113334768Speter    ZFREE(strm, s);
113428415Speter    strm->state = Z_NULL;
113528415Speter
113634768Speter    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
113734768Speter}
113834768Speter
113934768Speter/* =========================================================================
114034768Speter * Copy the source state to the destination state.
114134768Speter */
114234768Speterint deflateCopy (dest, source)
114334768Speter    z_streamp dest;
114434768Speter    z_streamp source;
114534768Speter{
114634768Speter    deflate_state *ds;
114734768Speter    deflate_state *ss;
114834768Speter    ushf *overlay;
114934768Speter
115034768Speter    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL)
115134768Speter        return Z_STREAM_ERROR;
115234768Speter    ss = (deflate_state *) source->state;
115334768Speter
115437065Speter    zmemcpy(dest, source, sizeof(*dest));
115534768Speter
115634768Speter    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
115734768Speter    if (ds == Z_NULL) return Z_MEM_ERROR;
115834768Speter    dest->state = (struct internal_state FAR *) ds;
115937065Speter    zmemcpy(ds, ss, sizeof(*ds));
116034768Speter    ds->strm = dest;
116134768Speter
116234768Speter    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
116334768Speter    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
116434768Speter    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
116534768Speter    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
116634768Speter    ds->pending_buf = (uchf *) overlay;
116734768Speter
116834768Speter    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
116934768Speter        ds->pending_buf == Z_NULL) {
117034768Speter        deflateEnd (dest);
117134768Speter        return Z_MEM_ERROR;
117234768Speter    }
117334768Speter    /* ??? following zmemcpy doesn't work for 16-bit MSDOS */
117434768Speter    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
117534768Speter    zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
117634768Speter    zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
117734768Speter    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
117834768Speter
117934768Speter    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
118034768Speter    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
118134768Speter    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
118234768Speter
118334768Speter    ds->l_desc.dyn_tree = ds->dyn_ltree;
118434768Speter    ds->d_desc.dyn_tree = ds->dyn_dtree;
118534768Speter    ds->bl_desc.dyn_tree = ds->bl_tree;
118634768Speter
118728415Speter    return Z_OK;
118828415Speter}
118928415Speter
119028415Speter/* ===========================================================================
119134768Speter * Return the number of bytes of output which are immediately available
119234768Speter * for output from the decompressor.
119334768Speter */
119434768Speterint deflateOutputPending (strm)
119534768Speter    z_streamp strm;
119634768Speter{
119734768Speter    if (strm == Z_NULL || strm->state == Z_NULL) return 0;
119834768Speter
119934768Speter    return ((deflate_state *)(strm->state))->pending;
120034768Speter}
120134768Speter
120234768Speter/* ===========================================================================
120328415Speter * Read a new buffer from the current input stream, update the adler32
120434768Speter * and total number of bytes read.  All deflate() input goes through
120534768Speter * this function so some applications may wish to modify it to avoid
120634768Speter * allocating a large strm->next_in buffer and copying from it.
120734768Speter * (See also flush_pending()).
120828415Speter */
120928415Speterlocal int read_buf(strm, buf, size)
121034768Speter    z_streamp strm;
121128415Speter    charf *buf;
121228415Speter    unsigned size;
121328415Speter{
121428415Speter    unsigned len = strm->avail_in;
121528415Speter
121628415Speter    if (len > size) len = size;
121728415Speter    if (len == 0) return 0;
121828415Speter
121928415Speter    strm->avail_in  -= len;
122028415Speter
122134768Speter    if (!((deflate_state *)(strm->state))->noheader) {
122234768Speter        strm->adler = adler32(strm->adler, strm->next_in, len);
122328415Speter    }
122428415Speter    zmemcpy(buf, strm->next_in, len);
122528415Speter    strm->next_in  += len;
122628415Speter    strm->total_in += len;
122728415Speter
122828415Speter    return (int)len;
122928415Speter}
123028415Speter
123128415Speter/* ===========================================================================
123228415Speter * Initialize the "longest match" routines for a new zlib stream
123328415Speter */
123428415Speterlocal void lm_init (s)
123528415Speter    deflate_state *s;
123628415Speter{
123728415Speter    s->window_size = (ulg)2L*s->w_size;
123828415Speter
123928415Speter    CLEAR_HASH(s);
124028415Speter
124128415Speter    /* Set the default configuration parameters:
124228415Speter     */
124328415Speter    s->max_lazy_match   = configuration_table[s->level].max_lazy;
124428415Speter    s->good_match       = configuration_table[s->level].good_length;
124528415Speter    s->nice_match       = configuration_table[s->level].nice_length;
124628415Speter    s->max_chain_length = configuration_table[s->level].max_chain;
124728415Speter
124828415Speter    s->strstart = 0;
124928415Speter    s->block_start = 0L;
125028415Speter    s->lookahead = 0;
125134768Speter    s->match_length = s->prev_length = MIN_MATCH-1;
125228415Speter    s->match_available = 0;
125328415Speter    s->ins_h = 0;
125428415Speter#ifdef ASMV
125528415Speter    match_init(); /* initialize the asm code */
125628415Speter#endif
125728415Speter}
125828415Speter
125928415Speter/* ===========================================================================
126028415Speter * Set match_start to the longest match starting at the given string and
126128415Speter * return its length. Matches shorter or equal to prev_length are discarded,
126228415Speter * in which case the result is equal to prev_length and match_start is
126328415Speter * garbage.
126428415Speter * IN assertions: cur_match is the head of the hash chain for the current
126528415Speter *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
126634768Speter * OUT assertion: the match length is not greater than s->lookahead.
126728415Speter */
126828415Speter#ifndef ASMV
126928415Speter/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
127028415Speter * match.S. The code will be functionally equivalent.
127128415Speter */
127234768Speterlocal uInt longest_match(s, cur_match)
127328415Speter    deflate_state *s;
127428415Speter    IPos cur_match;                             /* current match */
127528415Speter{
127628415Speter    unsigned chain_length = s->max_chain_length;/* max hash chain length */
127728415Speter    register Bytef *scan = s->window + s->strstart; /* current string */
127828415Speter    register Bytef *match;                       /* matched string */
127928415Speter    register int len;                           /* length of current match */
128028415Speter    int best_len = s->prev_length;              /* best match length so far */
128134768Speter    int nice_match = s->nice_match;             /* stop if match long enough */
128228415Speter    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
128328415Speter        s->strstart - (IPos)MAX_DIST(s) : NIL;
128428415Speter    /* Stop when cur_match becomes <= limit. To simplify the code,
128528415Speter     * we prevent matches with the string of window index 0.
128628415Speter     */
128728415Speter    Posf *prev = s->prev;
128828415Speter    uInt wmask = s->w_mask;
128928415Speter
129028415Speter#ifdef UNALIGNED_OK
129128415Speter    /* Compare two bytes at a time. Note: this is not always beneficial.
129228415Speter     * Try with and without -DUNALIGNED_OK to check.
129328415Speter     */
129428415Speter    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
129528415Speter    register ush scan_start = *(ushf*)scan;
129628415Speter    register ush scan_end   = *(ushf*)(scan+best_len-1);
129728415Speter#else
129828415Speter    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
129928415Speter    register Byte scan_end1  = scan[best_len-1];
130028415Speter    register Byte scan_end   = scan[best_len];
130128415Speter#endif
130228415Speter
130328415Speter    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
130428415Speter     * It is easy to get rid of this optimization if necessary.
130528415Speter     */
130628415Speter    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
130728415Speter
130828415Speter    /* Do not waste too much time if we already have a good match: */
130928415Speter    if (s->prev_length >= s->good_match) {
131028415Speter        chain_length >>= 2;
131128415Speter    }
131234768Speter    /* Do not look for matches beyond the end of the input. This is necessary
131334768Speter     * to make deflate deterministic.
131434768Speter     */
131534768Speter    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
131634768Speter
131728415Speter    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
131828415Speter
131928415Speter    do {
132028415Speter        Assert(cur_match < s->strstart, "no future");
132128415Speter        match = s->window + cur_match;
132228415Speter
132328415Speter        /* Skip to next match if the match length cannot increase
132428415Speter         * or if the match length is less than 2:
132528415Speter         */
132628415Speter#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
132728415Speter        /* This code assumes sizeof(unsigned short) == 2. Do not use
132828415Speter         * UNALIGNED_OK if your compiler uses a different size.
132928415Speter         */
133028415Speter        if (*(ushf*)(match+best_len-1) != scan_end ||
133128415Speter            *(ushf*)match != scan_start) continue;
133228415Speter
133328415Speter        /* It is not necessary to compare scan[2] and match[2] since they are
133428415Speter         * always equal when the other bytes match, given that the hash keys
133528415Speter         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
133628415Speter         * strstart+3, +5, ... up to strstart+257. We check for insufficient
133728415Speter         * lookahead only every 4th comparison; the 128th check will be made
133828415Speter         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
133928415Speter         * necessary to put more guard bytes at the end of the window, or
134028415Speter         * to check more often for insufficient lookahead.
134128415Speter         */
134228415Speter        Assert(scan[2] == match[2], "scan[2]?");
134328415Speter        scan++, match++;
134428415Speter        do {
134528415Speter        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
134628415Speter                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
134728415Speter                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
134828415Speter                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
134928415Speter                 scan < strend);
135028415Speter        /* The funny "do {}" generates better code on most compilers */
135128415Speter
135228415Speter        /* Here, scan <= window+strstart+257 */
135328415Speter        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
135428415Speter        if (*scan == *match) scan++;
135528415Speter
135628415Speter        len = (MAX_MATCH - 1) - (int)(strend-scan);
135728415Speter        scan = strend - (MAX_MATCH-1);
135828415Speter
135928415Speter#else /* UNALIGNED_OK */
136028415Speter
136128415Speter        if (match[best_len]   != scan_end  ||
136228415Speter            match[best_len-1] != scan_end1 ||
136328415Speter            *match            != *scan     ||
136428415Speter            *++match          != scan[1])      continue;
136528415Speter
136628415Speter        /* The check at best_len-1 can be removed because it will be made
136728415Speter         * again later. (This heuristic is not always a win.)
136828415Speter         * It is not necessary to compare scan[2] and match[2] since they
136928415Speter         * are always equal when the other bytes match, given that
137028415Speter         * the hash keys are equal and that HASH_BITS >= 8.
137128415Speter         */
137228415Speter        scan += 2, match++;
137328415Speter        Assert(*scan == *match, "match[2]?");
137428415Speter
137528415Speter        /* We check for insufficient lookahead only every 8th comparison;
137628415Speter         * the 256th check will be made at strstart+258.
137728415Speter         */
137828415Speter        do {
137928415Speter        } while (*++scan == *++match && *++scan == *++match &&
138028415Speter                 *++scan == *++match && *++scan == *++match &&
138128415Speter                 *++scan == *++match && *++scan == *++match &&
138228415Speter                 *++scan == *++match && *++scan == *++match &&
138328415Speter                 scan < strend);
138428415Speter
138528415Speter        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
138628415Speter
138728415Speter        len = MAX_MATCH - (int)(strend - scan);
138828415Speter        scan = strend - MAX_MATCH;
138928415Speter
139028415Speter#endif /* UNALIGNED_OK */
139128415Speter
139228415Speter        if (len > best_len) {
139328415Speter            s->match_start = cur_match;
139428415Speter            best_len = len;
139534768Speter            if (len >= nice_match) break;
139628415Speter#ifdef UNALIGNED_OK
139728415Speter            scan_end = *(ushf*)(scan+best_len-1);
139828415Speter#else
139928415Speter            scan_end1  = scan[best_len-1];
140028415Speter            scan_end   = scan[best_len];
140128415Speter#endif
140228415Speter        }
140328415Speter    } while ((cur_match = prev[cur_match & wmask]) > limit
140428415Speter             && --chain_length != 0);
140528415Speter
140634768Speter    if ((uInt)best_len <= s->lookahead) return best_len;
140734768Speter    return s->lookahead;
140828415Speter}
140928415Speter#endif /* ASMV */
141028415Speter
141128415Speter#ifdef DEBUG_ZLIB
141228415Speter/* ===========================================================================
141328415Speter * Check that the match at match_start is indeed a match.
141428415Speter */
141528415Speterlocal void check_match(s, start, match, length)
141628415Speter    deflate_state *s;
141728415Speter    IPos start, match;
141828415Speter    int length;
141928415Speter{
142028415Speter    /* check that the match is indeed a match */
142134768Speter    if (zmemcmp((charf *)s->window + match,
142228415Speter                (charf *)s->window + start, length) != EQUAL) {
142334768Speter        fprintf(stderr, " start %u, match %u, length %d\n",
142434768Speter		start, match, length);
142534768Speter        do {
142634768Speter	    fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
142734768Speter	} while (--length != 0);
142828415Speter        z_error("invalid match");
142928415Speter    }
143034768Speter    if (z_verbose > 1) {
143128415Speter        fprintf(stderr,"\\[%d,%d]", start-match, length);
143228415Speter        do { putc(s->window[start++], stderr); } while (--length != 0);
143328415Speter    }
143428415Speter}
143528415Speter#else
143628415Speter#  define check_match(s, start, match, length)
143728415Speter#endif
143828415Speter
143928415Speter/* ===========================================================================
144028415Speter * Fill the window when the lookahead becomes insufficient.
144128415Speter * Updates strstart and lookahead.
144228415Speter *
144328415Speter * IN assertion: lookahead < MIN_LOOKAHEAD
144428415Speter * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
144528415Speter *    At least one byte has been read, or avail_in == 0; reads are
144628415Speter *    performed for at least two bytes (required for the zip translate_eol
144728415Speter *    option -- not supported here).
144828415Speter */
144928415Speterlocal void fill_window(s)
145028415Speter    deflate_state *s;
145128415Speter{
145228415Speter    register unsigned n, m;
145328415Speter    register Posf *p;
145428415Speter    unsigned more;    /* Amount of free space at the end of the window. */
145528415Speter    uInt wsize = s->w_size;
145628415Speter
145728415Speter    do {
145828415Speter        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
145928415Speter
146028415Speter        /* Deal with !@#$% 64K limit: */
146128415Speter        if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
146228415Speter            more = wsize;
146334768Speter
146428415Speter        } else if (more == (unsigned)(-1)) {
146528415Speter            /* Very unlikely, but possible on 16 bit machine if strstart == 0
146628415Speter             * and lookahead == 1 (input done one byte at time)
146728415Speter             */
146828415Speter            more--;
146928415Speter
147028415Speter        /* If the window is almost full and there is insufficient lookahead,
147128415Speter         * move the upper half to the lower one to make room in the upper half.
147228415Speter         */
147328415Speter        } else if (s->strstart >= wsize+MAX_DIST(s)) {
147428415Speter
147528415Speter            zmemcpy((charf *)s->window, (charf *)s->window+wsize,
147628415Speter                   (unsigned)wsize);
147728415Speter            s->match_start -= wsize;
147828415Speter            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
147928415Speter            s->block_start -= (long) wsize;
148028415Speter
148128415Speter            /* Slide the hash table (could be avoided with 32 bit values
148234768Speter               at the expense of memory usage). We slide even when level == 0
148334768Speter               to keep the hash table consistent if we switch back to level > 0
148434768Speter               later. (Using level 0 permanently is not an optimal usage of
148534768Speter               zlib, so we don't care about this pathological case.)
148628415Speter             */
148728415Speter            n = s->hash_size;
148828415Speter            p = &s->head[n];
148928415Speter            do {
149028415Speter                m = *--p;
149128415Speter                *p = (Pos)(m >= wsize ? m-wsize : NIL);
149228415Speter            } while (--n);
149328415Speter
149428415Speter            n = wsize;
149528415Speter            p = &s->prev[n];
149628415Speter            do {
149728415Speter                m = *--p;
149828415Speter                *p = (Pos)(m >= wsize ? m-wsize : NIL);
149928415Speter                /* If n is not on any hash chain, prev[n] is garbage but
150028415Speter                 * its value will never be used.
150128415Speter                 */
150228415Speter            } while (--n);
150328415Speter            more += wsize;
150428415Speter        }
150528415Speter        if (s->strm->avail_in == 0) return;
150628415Speter
150728415Speter        /* If there was no sliding:
150828415Speter         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
150928415Speter         *    more == window_size - lookahead - strstart
151028415Speter         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
151128415Speter         * => more >= window_size - 2*WSIZE + 2
151228415Speter         * In the BIG_MEM or MMAP case (not yet supported),
151328415Speter         *   window_size == input_size + MIN_LOOKAHEAD  &&
151428415Speter         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
151528415Speter         * Otherwise, window_size == 2*WSIZE so more >= 2.
151628415Speter         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
151728415Speter         */
151828415Speter        Assert(more >= 2, "more < 2");
151928415Speter
152028415Speter        n = read_buf(s->strm, (charf *)s->window + s->strstart + s->lookahead,
152128415Speter                     more);
152228415Speter        s->lookahead += n;
152328415Speter
152428415Speter        /* Initialize the hash value now that we have some input: */
152528415Speter        if (s->lookahead >= MIN_MATCH) {
152628415Speter            s->ins_h = s->window[s->strstart];
152728415Speter            UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
152828415Speter#if MIN_MATCH != 3
152928415Speter            Call UPDATE_HASH() MIN_MATCH-3 more times
153028415Speter#endif
153128415Speter        }
153228415Speter        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
153328415Speter         * but this is not important since only literal bytes will be emitted.
153428415Speter         */
153528415Speter
153628415Speter    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
153728415Speter}
153828415Speter
153928415Speter/* ===========================================================================
154028415Speter * Flush the current block, with given end-of-file flag.
154128415Speter * IN assertion: strstart is set to the end of the current match.
154228415Speter */
154334768Speter#define FLUSH_BLOCK_ONLY(s, eof) { \
154434768Speter   _tr_flush_block(s, (s->block_start >= 0L ? \
154534768Speter                   (charf *)&s->window[(unsigned)s->block_start] : \
154634768Speter                   (charf *)Z_NULL), \
154734768Speter		(ulg)((long)s->strstart - s->block_start), \
154834768Speter		(eof)); \
154928415Speter   s->block_start = s->strstart; \
155028415Speter   flush_pending(s->strm); \
155128415Speter   Tracev((stderr,"[FLUSH]")); \
155228415Speter}
155328415Speter
155428415Speter/* Same but force premature exit if necessary. */
155534768Speter#define FLUSH_BLOCK(s, eof) { \
155634768Speter   FLUSH_BLOCK_ONLY(s, eof); \
155734768Speter   if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
155828415Speter}
155928415Speter
156028415Speter/* ===========================================================================
156134768Speter * Copy without compression as much as possible from the input stream, return
156234768Speter * the current block state.
156334768Speter * This function does not insert new strings in the dictionary since
156434768Speter * uncompressible data is probably not useful. This function is used
156534768Speter * only for the level=0 compression option.
156634768Speter * NOTE: this function should be optimized to avoid extra copying from
156734768Speter * window to pending_buf.
156834768Speter */
156934768Speterlocal block_state deflate_stored(s, flush)
157034768Speter    deflate_state *s;
157134768Speter    int flush;
157234768Speter{
157334768Speter    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
157434768Speter     * to pending_buf_size, and each stored block has a 5 byte header:
157534768Speter     */
157634768Speter    ulg max_block_size = 0xffff;
157734768Speter    ulg max_start;
157834768Speter
157934768Speter    if (max_block_size > s->pending_buf_size - 5) {
158034768Speter        max_block_size = s->pending_buf_size - 5;
158134768Speter    }
158234768Speter
158334768Speter    /* Copy as much as possible from input to output: */
158434768Speter    for (;;) {
158534768Speter        /* Fill the window as much as possible: */
158634768Speter        if (s->lookahead <= 1) {
158734768Speter
158834768Speter            Assert(s->strstart < s->w_size+MAX_DIST(s) ||
158934768Speter		   s->block_start >= (long)s->w_size, "slide too late");
159034768Speter
159134768Speter            fill_window(s);
159234768Speter            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
159334768Speter
159434768Speter            if (s->lookahead == 0) break; /* flush the current block */
159534768Speter        }
159634768Speter	Assert(s->block_start >= 0L, "block gone");
159734768Speter
159834768Speter	s->strstart += s->lookahead;
159934768Speter	s->lookahead = 0;
160034768Speter
160134768Speter	/* Emit a stored block if pending_buf will be full: */
160234768Speter 	max_start = s->block_start + max_block_size;
160334768Speter        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
160434768Speter	    /* strstart == 0 is possible when wraparound on 16-bit machine */
160534768Speter	    s->lookahead = (uInt)(s->strstart - max_start);
160634768Speter	    s->strstart = (uInt)max_start;
160734768Speter            FLUSH_BLOCK(s, 0);
160834768Speter	}
160934768Speter	/* Flush if we may have to slide, otherwise block_start may become
161034768Speter         * negative and the data will be gone:
161134768Speter         */
161234768Speter        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
161334768Speter            FLUSH_BLOCK(s, 0);
161434768Speter	}
161534768Speter    }
161634768Speter    FLUSH_BLOCK(s, flush == Z_FINISH);
161734768Speter    return flush == Z_FINISH ? finish_done : block_done;
161834768Speter}
161934768Speter
162034768Speter/* ===========================================================================
162134768Speter * Compress as much as possible from the input stream, return the current
162234768Speter * block state.
162334768Speter * This function does not perform lazy evaluation of matches and inserts
162428415Speter * new strings in the dictionary only for unmatched strings or for short
162528415Speter * matches. It is used only for the fast compression options.
162628415Speter */
162734768Speterlocal block_state deflate_fast(s, flush)
162828415Speter    deflate_state *s;
162928415Speter    int flush;
163028415Speter{
163128415Speter    IPos hash_head = NIL; /* head of the hash chain */
163234768Speter    int bflush;           /* set if current block must be flushed */
163328415Speter
163428415Speter    for (;;) {
163528415Speter        /* Make sure that we always have enough lookahead, except
163628415Speter         * at the end of the input file. We need MAX_MATCH bytes
163728415Speter         * for the next match, plus MIN_MATCH bytes to insert the
163828415Speter         * string following the next match.
163928415Speter         */
164028415Speter        if (s->lookahead < MIN_LOOKAHEAD) {
164128415Speter            fill_window(s);
164234768Speter            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
164334768Speter	        return need_more;
164434768Speter	    }
164528415Speter            if (s->lookahead == 0) break; /* flush the current block */
164628415Speter        }
164728415Speter
164828415Speter        /* Insert the string window[strstart .. strstart+2] in the
164928415Speter         * dictionary, and set hash_head to the head of the hash chain:
165028415Speter         */
165128415Speter        if (s->lookahead >= MIN_MATCH) {
165228415Speter            INSERT_STRING(s, s->strstart, hash_head);
165328415Speter        }
165428415Speter
165528415Speter        /* Find the longest match, discarding those <= prev_length.
165628415Speter         * At this point we have always match_length < MIN_MATCH
165728415Speter         */
165828415Speter        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
165928415Speter            /* To simplify the code, we prevent matches with the string
166028415Speter             * of window index 0 (in particular we have to avoid a match
166128415Speter             * of the string with itself at the start of the input file).
166228415Speter             */
166328415Speter            if (s->strategy != Z_HUFFMAN_ONLY) {
166428415Speter                s->match_length = longest_match (s, hash_head);
166528415Speter            }
166628415Speter            /* longest_match() sets match_start */
166728415Speter        }
166828415Speter        if (s->match_length >= MIN_MATCH) {
166928415Speter            check_match(s, s->strstart, s->match_start, s->match_length);
167028415Speter
167134768Speter            bflush = _tr_tally(s, s->strstart - s->match_start,
167234768Speter                               s->match_length - MIN_MATCH);
167328415Speter
167428415Speter            s->lookahead -= s->match_length;
167528415Speter
167628415Speter            /* Insert new strings in the hash table only if the match length
167728415Speter             * is not too large. This saves time but degrades compression.
167828415Speter             */
167928415Speter            if (s->match_length <= s->max_insert_length &&
168028415Speter                s->lookahead >= MIN_MATCH) {
168128415Speter                s->match_length--; /* string at strstart already in hash table */
168228415Speter                do {
168328415Speter                    s->strstart++;
168428415Speter                    INSERT_STRING(s, s->strstart, hash_head);
168528415Speter                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are
168628415Speter                     * always MIN_MATCH bytes ahead.
168728415Speter                     */
168828415Speter                } while (--s->match_length != 0);
168928415Speter                s->strstart++;
169028415Speter            } else {
169128415Speter                s->strstart += s->match_length;
169228415Speter                s->match_length = 0;
169328415Speter                s->ins_h = s->window[s->strstart];
169428415Speter                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
169528415Speter#if MIN_MATCH != 3
169628415Speter                Call UPDATE_HASH() MIN_MATCH-3 more times
169728415Speter#endif
169828415Speter                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
169928415Speter                 * matter since it will be recomputed at next deflate call.
170028415Speter                 */
170128415Speter            }
170228415Speter        } else {
170328415Speter            /* No match, output a literal byte */
170428415Speter            Tracevv((stderr,"%c", s->window[s->strstart]));
170534768Speter            bflush = _tr_tally (s, 0, s->window[s->strstart]);
170628415Speter            s->lookahead--;
170728415Speter            s->strstart++;
170828415Speter        }
170934768Speter        if (bflush) FLUSH_BLOCK(s, 0);
171028415Speter    }
171134768Speter    FLUSH_BLOCK(s, flush == Z_FINISH);
171234768Speter    return flush == Z_FINISH ? finish_done : block_done;
171328415Speter}
171428415Speter
171528415Speter/* ===========================================================================
171628415Speter * Same as above, but achieves better compression. We use a lazy
171728415Speter * evaluation for matches: a match is finally adopted only if there is
171828415Speter * no better match at the next window position.
171928415Speter */
172034768Speterlocal block_state deflate_slow(s, flush)
172128415Speter    deflate_state *s;
172228415Speter    int flush;
172328415Speter{
172428415Speter    IPos hash_head = NIL;    /* head of hash chain */
172528415Speter    int bflush;              /* set if current block must be flushed */
172628415Speter
172728415Speter    /* Process the input block. */
172828415Speter    for (;;) {
172928415Speter        /* Make sure that we always have enough lookahead, except
173028415Speter         * at the end of the input file. We need MAX_MATCH bytes
173128415Speter         * for the next match, plus MIN_MATCH bytes to insert the
173228415Speter         * string following the next match.
173328415Speter         */
173428415Speter        if (s->lookahead < MIN_LOOKAHEAD) {
173528415Speter            fill_window(s);
173634768Speter            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
173734768Speter	        return need_more;
173834768Speter	    }
173928415Speter            if (s->lookahead == 0) break; /* flush the current block */
174028415Speter        }
174128415Speter
174228415Speter        /* Insert the string window[strstart .. strstart+2] in the
174328415Speter         * dictionary, and set hash_head to the head of the hash chain:
174428415Speter         */
174528415Speter        if (s->lookahead >= MIN_MATCH) {
174628415Speter            INSERT_STRING(s, s->strstart, hash_head);
174728415Speter        }
174828415Speter
174928415Speter        /* Find the longest match, discarding those <= prev_length.
175028415Speter         */
175128415Speter        s->prev_length = s->match_length, s->prev_match = s->match_start;
175228415Speter        s->match_length = MIN_MATCH-1;
175328415Speter
175428415Speter        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
175528415Speter            s->strstart - hash_head <= MAX_DIST(s)) {
175628415Speter            /* To simplify the code, we prevent matches with the string
175728415Speter             * of window index 0 (in particular we have to avoid a match
175828415Speter             * of the string with itself at the start of the input file).
175928415Speter             */
176028415Speter            if (s->strategy != Z_HUFFMAN_ONLY) {
176128415Speter                s->match_length = longest_match (s, hash_head);
176228415Speter            }
176328415Speter            /* longest_match() sets match_start */
176428415Speter
176528415Speter            if (s->match_length <= 5 && (s->strategy == Z_FILTERED ||
176628415Speter                 (s->match_length == MIN_MATCH &&
176728415Speter                  s->strstart - s->match_start > TOO_FAR))) {
176828415Speter
176928415Speter                /* If prev_match is also MIN_MATCH, match_start is garbage
177028415Speter                 * but we will ignore the current match anyway.
177128415Speter                 */
177228415Speter                s->match_length = MIN_MATCH-1;
177328415Speter            }
177428415Speter        }
177528415Speter        /* If there was a match at the previous step and the current
177628415Speter         * match is not better, output the previous match:
177728415Speter         */
177828415Speter        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
177928415Speter            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
178028415Speter            /* Do not insert strings in hash table beyond this. */
178128415Speter
178228415Speter            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
178328415Speter
178434768Speter            bflush = _tr_tally(s, s->strstart -1 - s->prev_match,
178534768Speter                               s->prev_length - MIN_MATCH);
178628415Speter
178728415Speter            /* Insert in hash table all strings up to the end of the match.
178828415Speter             * strstart-1 and strstart are already inserted. If there is not
178928415Speter             * enough lookahead, the last two strings are not inserted in
179028415Speter             * the hash table.
179128415Speter             */
179228415Speter            s->lookahead -= s->prev_length-1;
179328415Speter            s->prev_length -= 2;
179428415Speter            do {
179528415Speter                if (++s->strstart <= max_insert) {
179628415Speter                    INSERT_STRING(s, s->strstart, hash_head);
179728415Speter                }
179828415Speter            } while (--s->prev_length != 0);
179928415Speter            s->match_available = 0;
180028415Speter            s->match_length = MIN_MATCH-1;
180128415Speter            s->strstart++;
180228415Speter
180334768Speter            if (bflush) FLUSH_BLOCK(s, 0);
180428415Speter
180528415Speter        } else if (s->match_available) {
180628415Speter            /* If there was no match at the previous position, output a
180728415Speter             * single literal. If there was a match but the current match
180828415Speter             * is longer, truncate the previous match to a single literal.
180928415Speter             */
181028415Speter            Tracevv((stderr,"%c", s->window[s->strstart-1]));
181134768Speter            if (_tr_tally (s, 0, s->window[s->strstart-1])) {
181234768Speter                FLUSH_BLOCK_ONLY(s, 0);
181328415Speter            }
181428415Speter            s->strstart++;
181528415Speter            s->lookahead--;
181634768Speter            if (s->strm->avail_out == 0) return need_more;
181728415Speter        } else {
181828415Speter            /* There is no previous match to compare with, wait for
181928415Speter             * the next step to decide.
182028415Speter             */
182128415Speter            s->match_available = 1;
182228415Speter            s->strstart++;
182328415Speter            s->lookahead--;
182428415Speter        }
182528415Speter    }
182628415Speter    Assert (flush != Z_NO_FLUSH, "no flush?");
182728415Speter    if (s->match_available) {
182828415Speter        Tracevv((stderr,"%c", s->window[s->strstart-1]));
182934768Speter        _tr_tally (s, 0, s->window[s->strstart-1]);
183028415Speter        s->match_available = 0;
183128415Speter    }
183234768Speter    FLUSH_BLOCK(s, flush == Z_FINISH);
183334768Speter    return flush == Z_FINISH ? finish_done : block_done;
183428415Speter}
183534768Speter/* --- deflate.c */
183628415Speter
183734768Speter/* +++ trees.c */
183828415Speter/* trees.c -- output deflated data using Huffman coding
183934768Speter * Copyright (C) 1995-1996 Jean-loup Gailly
184028415Speter * For conditions of distribution and use, see copyright notice in zlib.h
184128415Speter */
184228415Speter
184328415Speter/*
184428415Speter *  ALGORITHM
184528415Speter *
184628415Speter *      The "deflation" process uses several Huffman trees. The more
184728415Speter *      common source values are represented by shorter bit sequences.
184828415Speter *
184928415Speter *      Each code tree is stored in a compressed form which is itself
185028415Speter * a Huffman encoding of the lengths of all the code strings (in
185128415Speter * ascending order by source values).  The actual code strings are
185228415Speter * reconstructed from the lengths in the inflate process, as described
185328415Speter * in the deflate specification.
185428415Speter *
185528415Speter *  REFERENCES
185628415Speter *
185728415Speter *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
185828415Speter *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
185928415Speter *
186028415Speter *      Storer, James A.
186128415Speter *          Data Compression:  Methods and Theory, pp. 49-50.
186228415Speter *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.
186328415Speter *
186428415Speter *      Sedgewick, R.
186528415Speter *          Algorithms, p290.
186628415Speter *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
186728415Speter */
186828415Speter
186934768Speter/* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */
187028415Speter
187134768Speter/* #include "deflate.h" */
187234768Speter
187328415Speter#ifdef DEBUG_ZLIB
187428415Speter#  include <ctype.h>
187528415Speter#endif
187628415Speter
187728415Speter/* ===========================================================================
187828415Speter * Constants
187928415Speter */
188028415Speter
188128415Speter#define MAX_BL_BITS 7
188228415Speter/* Bit length codes must not exceed MAX_BL_BITS bits */
188328415Speter
188428415Speter#define END_BLOCK 256
188528415Speter/* end of block literal code */
188628415Speter
188728415Speter#define REP_3_6      16
188828415Speter/* repeat previous bit length 3-6 times (2 bits of repeat count) */
188928415Speter
189028415Speter#define REPZ_3_10    17
189128415Speter/* repeat a zero length 3-10 times  (3 bits of repeat count) */
189228415Speter
189328415Speter#define REPZ_11_138  18
189428415Speter/* repeat a zero length 11-138 times  (7 bits of repeat count) */
189528415Speter
189628415Speterlocal int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
189728415Speter   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
189828415Speter
189928415Speterlocal int extra_dbits[D_CODES] /* extra bits for each distance code */
190028415Speter   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
190128415Speter
190228415Speterlocal int extra_blbits[BL_CODES]/* extra bits for each bit length code */
190328415Speter   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
190428415Speter
190528415Speterlocal uch bl_order[BL_CODES]
190628415Speter   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
190728415Speter/* The lengths of the bit length codes are sent in order of decreasing
190828415Speter * probability, to avoid transmitting the lengths for unused bit length codes.
190928415Speter */
191028415Speter
191128415Speter#define Buf_size (8 * 2*sizeof(char))
191228415Speter/* Number of bits used within bi_buf. (bi_buf might be implemented on
191328415Speter * more than 16 bits on some systems.)
191428415Speter */
191528415Speter
191628415Speter/* ===========================================================================
191728415Speter * Local data. These are initialized only once.
191828415Speter */
191928415Speter
192028415Speterlocal ct_data static_ltree[L_CODES+2];
192128415Speter/* The static literal tree. Since the bit lengths are imposed, there is no
192228415Speter * need for the L_CODES extra codes used during heap construction. However
192334768Speter * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
192428415Speter * below).
192528415Speter */
192628415Speter
192728415Speterlocal ct_data static_dtree[D_CODES];
192828415Speter/* The static distance tree. (Actually a trivial tree since all codes use
192928415Speter * 5 bits.)
193028415Speter */
193128415Speter
193228415Speterlocal uch dist_code[512];
193328415Speter/* distance codes. The first 256 values correspond to the distances
193428415Speter * 3 .. 258, the last 256 values correspond to the top 8 bits of
193528415Speter * the 15 bit distances.
193628415Speter */
193728415Speter
193828415Speterlocal uch length_code[MAX_MATCH-MIN_MATCH+1];
193928415Speter/* length code for each normalized match length (0 == MIN_MATCH) */
194028415Speter
194128415Speterlocal int base_length[LENGTH_CODES];
194228415Speter/* First normalized length for each code (0 = MIN_MATCH) */
194328415Speter
194428415Speterlocal int base_dist[D_CODES];
194528415Speter/* First normalized distance for each code (0 = distance of 1) */
194628415Speter
194728415Speterstruct static_tree_desc_s {
194828415Speter    ct_data *static_tree;        /* static tree or NULL */
194928415Speter    intf    *extra_bits;         /* extra bits for each code or NULL */
195028415Speter    int     extra_base;          /* base index for extra_bits */
195128415Speter    int     elems;               /* max number of elements in the tree */
195228415Speter    int     max_length;          /* max bit length for the codes */
195328415Speter};
195428415Speter
195528415Speterlocal static_tree_desc  static_l_desc =
195628415Speter{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
195728415Speter
195828415Speterlocal static_tree_desc  static_d_desc =
195928415Speter{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
196028415Speter
196128415Speterlocal static_tree_desc  static_bl_desc =
196228415Speter{(ct_data *)0, extra_blbits, 0,      BL_CODES, MAX_BL_BITS};
196328415Speter
196428415Speter/* ===========================================================================
196528415Speter * Local (static) routines in this file.
196628415Speter */
196728415Speter
196834768Speterlocal void tr_static_init OF((void));
196928415Speterlocal void init_block     OF((deflate_state *s));
197028415Speterlocal void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));
197128415Speterlocal void gen_bitlen     OF((deflate_state *s, tree_desc *desc));
197228415Speterlocal void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));
197328415Speterlocal void build_tree     OF((deflate_state *s, tree_desc *desc));
197428415Speterlocal void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));
197528415Speterlocal void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));
197628415Speterlocal int  build_bl_tree  OF((deflate_state *s));
197728415Speterlocal void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
197828415Speter                              int blcodes));
197928415Speterlocal void compress_block OF((deflate_state *s, ct_data *ltree,
198028415Speter                              ct_data *dtree));
198128415Speterlocal void set_data_type  OF((deflate_state *s));
198228415Speterlocal unsigned bi_reverse OF((unsigned value, int length));
198328415Speterlocal void bi_windup      OF((deflate_state *s));
198428415Speterlocal void bi_flush       OF((deflate_state *s));
198528415Speterlocal void copy_block     OF((deflate_state *s, charf *buf, unsigned len,
198628415Speter                              int header));
198728415Speter
198828415Speter#ifndef DEBUG_ZLIB
1989106696Salfred#  define send_code(s, c, tree) send_bits(s, tree[(c)].Code, tree[(c)].Len)
199028415Speter   /* Send a code of the given tree. c and tree must not have side effects */
199128415Speter
199228415Speter#else /* DEBUG_ZLIB */
199328415Speter#  define send_code(s, c, tree) \
199434768Speter     { if (verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
199528415Speter       send_bits(s, tree[c].Code, tree[c].Len); }
199628415Speter#endif
199728415Speter
199828415Speter#define d_code(dist) \
199928415Speter   ((dist) < 256 ? dist_code[dist] : dist_code[256+((dist)>>7)])
200028415Speter/* Mapping from a distance to a distance code. dist is the distance - 1 and
200128415Speter * must not have side effects. dist_code[256] and dist_code[257] are never
200228415Speter * used.
200328415Speter */
200428415Speter
200528415Speter/* ===========================================================================
200628415Speter * Output a short LSB first on the stream.
200728415Speter * IN assertion: there is enough room in pendingBuf.
200828415Speter */
200928415Speter#define put_short(s, w) { \
201028415Speter    put_byte(s, (uch)((w) & 0xff)); \
201128415Speter    put_byte(s, (uch)((ush)(w) >> 8)); \
201228415Speter}
201328415Speter
201428415Speter/* ===========================================================================
201528415Speter * Send a value on a given number of bits.
201628415Speter * IN assertion: length <= 16 and value fits in length bits.
201728415Speter */
201828415Speter#ifdef DEBUG_ZLIB
201928415Speterlocal void send_bits      OF((deflate_state *s, int value, int length));
202028415Speter
202128415Speterlocal void send_bits(s, value, length)
202228415Speter    deflate_state *s;
202328415Speter    int value;  /* value to send */
202428415Speter    int length; /* number of bits */
202528415Speter{
202634768Speter    Tracevv((stderr," l %2d v %4x ", length, value));
202728415Speter    Assert(length > 0 && length <= 15, "invalid length");
202828415Speter    s->bits_sent += (ulg)length;
202928415Speter
203028415Speter    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
203128415Speter     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
203228415Speter     * unused bits in value.
203328415Speter     */
203428415Speter    if (s->bi_valid > (int)Buf_size - length) {
203528415Speter        s->bi_buf |= (value << s->bi_valid);
203628415Speter        put_short(s, s->bi_buf);
203728415Speter        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
203828415Speter        s->bi_valid += length - Buf_size;
203928415Speter    } else {
204028415Speter        s->bi_buf |= value << s->bi_valid;
204128415Speter        s->bi_valid += length;
204228415Speter    }
204328415Speter}
204428415Speter#else /* !DEBUG_ZLIB */
204528415Speter
204628415Speter#define send_bits(s, value, length) \
2047106696Salfred{ int len = (length);\
2048106696Salfred  if ((s)->bi_valid > (int)Buf_size - len) {\
2049106696Salfred    int val = (value);\
2050106696Salfred    (s)->bi_buf |= (val << (s)->bi_valid);\
2051106696Salfred    put_short((s), (s)->bi_buf);\
2052106696Salfred    (s)->bi_buf = (ush)val >> (Buf_size - (s)->bi_valid);\
2053106696Salfred    (s)->bi_valid += len - Buf_size;\
205428415Speter  } else {\
2055106696Salfred    (s)->bi_buf |= (value) << (s)->bi_valid;\
2056106696Salfred    (s)->bi_valid += len;\
205728415Speter  }\
205828415Speter}
205928415Speter#endif /* DEBUG_ZLIB */
206028415Speter
206128415Speter/* the arguments must not have side effects */
206228415Speter
206328415Speter/* ===========================================================================
206434768Speter * Initialize the various 'constant' tables. In a multi-threaded environment,
206534768Speter * this function may be called by two threads concurrently, but this is
206634768Speter * harmless since both invocations do exactly the same thing.
206728415Speter */
206834768Speterlocal void tr_static_init()
206928415Speter{
207034768Speter    static int static_init_done = 0;
207128415Speter    int n;        /* iterates over tree elements */
207228415Speter    int bits;     /* bit counter */
207328415Speter    int length;   /* length value */
207428415Speter    int code;     /* code value */
207528415Speter    int dist;     /* distance index */
207628415Speter    ush bl_count[MAX_BITS+1];
207728415Speter    /* number of codes at each bit length for an optimal tree */
207828415Speter
207934768Speter    if (static_init_done) return;
208034768Speter
208128415Speter    /* Initialize the mapping length (0..255) -> length code (0..28) */
208228415Speter    length = 0;
208328415Speter    for (code = 0; code < LENGTH_CODES-1; code++) {
208428415Speter        base_length[code] = length;
208528415Speter        for (n = 0; n < (1<<extra_lbits[code]); n++) {
208628415Speter            length_code[length++] = (uch)code;
208728415Speter        }
208828415Speter    }
208934768Speter    Assert (length == 256, "tr_static_init: length != 256");
209028415Speter    /* Note that the length 255 (match length 258) can be represented
209128415Speter     * in two different ways: code 284 + 5 bits or code 285, so we
209228415Speter     * overwrite length_code[255] to use the best encoding:
209328415Speter     */
209428415Speter    length_code[length-1] = (uch)code;
209528415Speter
209628415Speter    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
209728415Speter    dist = 0;
209828415Speter    for (code = 0 ; code < 16; code++) {
209928415Speter        base_dist[code] = dist;
210028415Speter        for (n = 0; n < (1<<extra_dbits[code]); n++) {
210128415Speter            dist_code[dist++] = (uch)code;
210228415Speter        }
210328415Speter    }
210434768Speter    Assert (dist == 256, "tr_static_init: dist != 256");
210528415Speter    dist >>= 7; /* from now on, all distances are divided by 128 */
210628415Speter    for ( ; code < D_CODES; code++) {
210728415Speter        base_dist[code] = dist << 7;
210828415Speter        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
210928415Speter            dist_code[256 + dist++] = (uch)code;
211028415Speter        }
211128415Speter    }
211234768Speter    Assert (dist == 256, "tr_static_init: 256+dist != 512");
211328415Speter
211428415Speter    /* Construct the codes of the static literal tree */
211528415Speter    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
211628415Speter    n = 0;
211728415Speter    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
211828415Speter    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
211928415Speter    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
212028415Speter    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
212128415Speter    /* Codes 286 and 287 do not exist, but we must include them in the
212228415Speter     * tree construction to get a canonical Huffman tree (longest code
212328415Speter     * all ones)
212428415Speter     */
212528415Speter    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
212628415Speter
212728415Speter    /* The static distance tree is trivial: */
212828415Speter    for (n = 0; n < D_CODES; n++) {
212928415Speter        static_dtree[n].Len = 5;
213034768Speter        static_dtree[n].Code = bi_reverse((unsigned)n, 5);
213128415Speter    }
213234768Speter    static_init_done = 1;
213328415Speter}
213428415Speter
213528415Speter/* ===========================================================================
213628415Speter * Initialize the tree data structures for a new zlib stream.
213728415Speter */
213834768Spetervoid _tr_init(s)
213928415Speter    deflate_state *s;
214028415Speter{
214134768Speter    tr_static_init();
214228415Speter
214328415Speter    s->compressed_len = 0L;
214428415Speter
214528415Speter    s->l_desc.dyn_tree = s->dyn_ltree;
214628415Speter    s->l_desc.stat_desc = &static_l_desc;
214728415Speter
214828415Speter    s->d_desc.dyn_tree = s->dyn_dtree;
214928415Speter    s->d_desc.stat_desc = &static_d_desc;
215028415Speter
215128415Speter    s->bl_desc.dyn_tree = s->bl_tree;
215228415Speter    s->bl_desc.stat_desc = &static_bl_desc;
215328415Speter
215428415Speter    s->bi_buf = 0;
215528415Speter    s->bi_valid = 0;
215628415Speter    s->last_eob_len = 8; /* enough lookahead for inflate */
215728415Speter#ifdef DEBUG_ZLIB
215828415Speter    s->bits_sent = 0L;
215928415Speter#endif
216028415Speter
216128415Speter    /* Initialize the first block of the first file: */
216228415Speter    init_block(s);
216328415Speter}
216428415Speter
216528415Speter/* ===========================================================================
216628415Speter * Initialize a new block.
216728415Speter */
216828415Speterlocal void init_block(s)
216928415Speter    deflate_state *s;
217028415Speter{
217128415Speter    int n; /* iterates over tree elements */
217228415Speter
217328415Speter    /* Initialize the trees. */
217428415Speter    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
217528415Speter    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
217628415Speter    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
217728415Speter
217828415Speter    s->dyn_ltree[END_BLOCK].Freq = 1;
217928415Speter    s->opt_len = s->static_len = 0L;
218028415Speter    s->last_lit = s->matches = 0;
218128415Speter}
218228415Speter
218328415Speter#define SMALLEST 1
218428415Speter/* Index within the heap array of least frequent node in the Huffman tree */
218528415Speter
218628415Speter
218728415Speter/* ===========================================================================
218828415Speter * Remove the smallest element from the heap and recreate the heap with
218928415Speter * one less element. Updates heap and heap_len.
219028415Speter */
219128415Speter#define pqremove(s, tree, top) \
219228415Speter{\
219328415Speter    top = s->heap[SMALLEST]; \
219428415Speter    s->heap[SMALLEST] = s->heap[s->heap_len--]; \
219528415Speter    pqdownheap(s, tree, SMALLEST); \
219628415Speter}
219728415Speter
219828415Speter/* ===========================================================================
219928415Speter * Compares to subtrees, using the tree depth as tie breaker when
220028415Speter * the subtrees have equal frequency. This minimizes the worst case length.
220128415Speter */
220228415Speter#define smaller(tree, n, m, depth) \
220328415Speter   (tree[n].Freq < tree[m].Freq || \
220428415Speter   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
220528415Speter
220628415Speter/* ===========================================================================
220728415Speter * Restore the heap property by moving down the tree starting at node k,
220828415Speter * exchanging a node with the smallest of its two sons if necessary, stopping
220928415Speter * when the heap property is re-established (each father smaller than its
221028415Speter * two sons).
221128415Speter */
221228415Speterlocal void pqdownheap(s, tree, k)
221328415Speter    deflate_state *s;
221428415Speter    ct_data *tree;  /* the tree to restore */
221528415Speter    int k;               /* node to move down */
221628415Speter{
221728415Speter    int v = s->heap[k];
221828415Speter    int j = k << 1;  /* left son of k */
221928415Speter    while (j <= s->heap_len) {
222028415Speter        /* Set j to the smallest of the two sons: */
222128415Speter        if (j < s->heap_len &&
222228415Speter            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
222328415Speter            j++;
222428415Speter        }
222528415Speter        /* Exit if v is smaller than both sons */
222628415Speter        if (smaller(tree, v, s->heap[j], s->depth)) break;
222728415Speter
222828415Speter        /* Exchange v with the smallest son */
222928415Speter        s->heap[k] = s->heap[j];  k = j;
223028415Speter
223128415Speter        /* And continue down the tree, setting j to the left son of k */
223228415Speter        j <<= 1;
223328415Speter    }
223428415Speter    s->heap[k] = v;
223528415Speter}
223628415Speter
223728415Speter/* ===========================================================================
223828415Speter * Compute the optimal bit lengths for a tree and update the total bit length
223928415Speter * for the current block.
224028415Speter * IN assertion: the fields freq and dad are set, heap[heap_max] and
224128415Speter *    above are the tree nodes sorted by increasing frequency.
224228415Speter * OUT assertions: the field len is set to the optimal bit length, the
224328415Speter *     array bl_count contains the frequencies for each bit length.
224428415Speter *     The length opt_len is updated; static_len is also updated if stree is
224528415Speter *     not null.
224628415Speter */
224728415Speterlocal void gen_bitlen(s, desc)
224828415Speter    deflate_state *s;
224928415Speter    tree_desc *desc;    /* the tree descriptor */
225028415Speter{
225128415Speter    ct_data *tree  = desc->dyn_tree;
225228415Speter    int max_code   = desc->max_code;
225328415Speter    ct_data *stree = desc->stat_desc->static_tree;
225428415Speter    intf *extra    = desc->stat_desc->extra_bits;
225528415Speter    int base       = desc->stat_desc->extra_base;
225628415Speter    int max_length = desc->stat_desc->max_length;
225728415Speter    int h;              /* heap index */
225828415Speter    int n, m;           /* iterate over the tree elements */
225928415Speter    int bits;           /* bit length */
226028415Speter    int xbits;          /* extra bits */
226128415Speter    ush f;              /* frequency */
226228415Speter    int overflow = 0;   /* number of elements with bit length too large */
226328415Speter
226428415Speter    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
226528415Speter
226628415Speter    /* In a first pass, compute the optimal bit lengths (which may
226728415Speter     * overflow in the case of the bit length tree).
226828415Speter     */
226928415Speter    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
227028415Speter
227128415Speter    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
227228415Speter        n = s->heap[h];
227328415Speter        bits = tree[tree[n].Dad].Len + 1;
227428415Speter        if (bits > max_length) bits = max_length, overflow++;
227528415Speter        tree[n].Len = (ush)bits;
227628415Speter        /* We overwrite tree[n].Dad which is no longer needed */
227728415Speter
227828415Speter        if (n > max_code) continue; /* not a leaf node */
227928415Speter
228028415Speter        s->bl_count[bits]++;
228128415Speter        xbits = 0;
228228415Speter        if (n >= base) xbits = extra[n-base];
228328415Speter        f = tree[n].Freq;
228428415Speter        s->opt_len += (ulg)f * (bits + xbits);
228528415Speter        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
228628415Speter    }
228728415Speter    if (overflow == 0) return;
228828415Speter
228928415Speter    Trace((stderr,"\nbit length overflow\n"));
229028415Speter    /* This happens for example on obj2 and pic of the Calgary corpus */
229128415Speter
229228415Speter    /* Find the first bit length which could increase: */
229328415Speter    do {
229428415Speter        bits = max_length-1;
229528415Speter        while (s->bl_count[bits] == 0) bits--;
229628415Speter        s->bl_count[bits]--;      /* move one leaf down the tree */
229728415Speter        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
229828415Speter        s->bl_count[max_length]--;
229928415Speter        /* The brother of the overflow item also moves one step up,
230028415Speter         * but this does not affect bl_count[max_length]
230128415Speter         */
230228415Speter        overflow -= 2;
230328415Speter    } while (overflow > 0);
230428415Speter
230528415Speter    /* Now recompute all bit lengths, scanning in increasing frequency.
230628415Speter     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
230728415Speter     * lengths instead of fixing only the wrong ones. This idea is taken
230828415Speter     * from 'ar' written by Haruhiko Okumura.)
230928415Speter     */
231028415Speter    for (bits = max_length; bits != 0; bits--) {
231128415Speter        n = s->bl_count[bits];
231228415Speter        while (n != 0) {
231328415Speter            m = s->heap[--h];
231428415Speter            if (m > max_code) continue;
231528415Speter            if (tree[m].Len != (unsigned) bits) {
231628415Speter                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
231728415Speter                s->opt_len += ((long)bits - (long)tree[m].Len)
231828415Speter                              *(long)tree[m].Freq;
231928415Speter                tree[m].Len = (ush)bits;
232028415Speter            }
232128415Speter            n--;
232228415Speter        }
232328415Speter    }
232428415Speter}
232528415Speter
232628415Speter/* ===========================================================================
232728415Speter * Generate the codes for a given tree and bit counts (which need not be
232828415Speter * optimal).
232928415Speter * IN assertion: the array bl_count contains the bit length statistics for
233028415Speter * the given tree and the field len is set for all tree elements.
233128415Speter * OUT assertion: the field code is set for all tree elements of non
233228415Speter *     zero code length.
233328415Speter */
233428415Speterlocal void gen_codes (tree, max_code, bl_count)
233528415Speter    ct_data *tree;             /* the tree to decorate */
233628415Speter    int max_code;              /* largest code with non zero frequency */
233728415Speter    ushf *bl_count;            /* number of codes at each bit length */
233828415Speter{
233928415Speter    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
234028415Speter    ush code = 0;              /* running code value */
234128415Speter    int bits;                  /* bit index */
234228415Speter    int n;                     /* code index */
234328415Speter
234428415Speter    /* The distribution counts are first used to generate the code values
234528415Speter     * without bit reversal.
234628415Speter     */
234728415Speter    for (bits = 1; bits <= MAX_BITS; bits++) {
234828415Speter        next_code[bits] = code = (code + bl_count[bits-1]) << 1;
234928415Speter    }
235028415Speter    /* Check that the bit counts in bl_count are consistent. The last code
235128415Speter     * must be all ones.
235228415Speter     */
235328415Speter    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
235428415Speter            "inconsistent bit counts");
235528415Speter    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
235628415Speter
235728415Speter    for (n = 0;  n <= max_code; n++) {
235828415Speter        int len = tree[n].Len;
235928415Speter        if (len == 0) continue;
236028415Speter        /* Now reverse the bits */
236128415Speter        tree[n].Code = bi_reverse(next_code[len]++, len);
236228415Speter
236334768Speter        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
236428415Speter             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
236528415Speter    }
236628415Speter}
236728415Speter
236828415Speter/* ===========================================================================
236928415Speter * Construct one Huffman tree and assigns the code bit strings and lengths.
237028415Speter * Update the total bit length for the current block.
237128415Speter * IN assertion: the field freq is set for all tree elements.
237228415Speter * OUT assertions: the fields len and code are set to the optimal bit length
237328415Speter *     and corresponding code. The length opt_len is updated; static_len is
237428415Speter *     also updated if stree is not null. The field max_code is set.
237528415Speter */
237628415Speterlocal void build_tree(s, desc)
237728415Speter    deflate_state *s;
237828415Speter    tree_desc *desc; /* the tree descriptor */
237928415Speter{
238028415Speter    ct_data *tree   = desc->dyn_tree;
238128415Speter    ct_data *stree  = desc->stat_desc->static_tree;
238228415Speter    int elems       = desc->stat_desc->elems;
238328415Speter    int n, m;          /* iterate over heap elements */
238428415Speter    int max_code = -1; /* largest code with non zero frequency */
238528415Speter    int node;          /* new node being created */
238628415Speter
238728415Speter    /* Construct the initial heap, with least frequent element in
238828415Speter     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
238928415Speter     * heap[0] is not used.
239028415Speter     */
239128415Speter    s->heap_len = 0, s->heap_max = HEAP_SIZE;
239228415Speter
239328415Speter    for (n = 0; n < elems; n++) {
239428415Speter        if (tree[n].Freq != 0) {
239528415Speter            s->heap[++(s->heap_len)] = max_code = n;
239628415Speter            s->depth[n] = 0;
239728415Speter        } else {
239828415Speter            tree[n].Len = 0;
239928415Speter        }
240028415Speter    }
240128415Speter
240228415Speter    /* The pkzip format requires that at least one distance code exists,
240328415Speter     * and that at least one bit should be sent even if there is only one
240428415Speter     * possible code. So to avoid special checks later on we force at least
240528415Speter     * two codes of non zero frequency.
240628415Speter     */
240728415Speter    while (s->heap_len < 2) {
240828415Speter        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
240928415Speter        tree[node].Freq = 1;
241028415Speter        s->depth[node] = 0;
241128415Speter        s->opt_len--; if (stree) s->static_len -= stree[node].Len;
241228415Speter        /* node is 0 or 1 so it does not have extra bits */
241328415Speter    }
241428415Speter    desc->max_code = max_code;
241528415Speter
241628415Speter    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
241728415Speter     * establish sub-heaps of increasing lengths:
241828415Speter     */
241928415Speter    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
242028415Speter
242128415Speter    /* Construct the Huffman tree by repeatedly combining the least two
242228415Speter     * frequent nodes.
242328415Speter     */
242428415Speter    node = elems;              /* next internal node of the tree */
242528415Speter    do {
242628415Speter        pqremove(s, tree, n);  /* n = node of least frequency */
242728415Speter        m = s->heap[SMALLEST]; /* m = node of next least frequency */
242828415Speter
242928415Speter        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
243028415Speter        s->heap[--(s->heap_max)] = m;
243128415Speter
243228415Speter        /* Create a new node father of n and m */
243328415Speter        tree[node].Freq = tree[n].Freq + tree[m].Freq;
243428415Speter        s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1);
243528415Speter        tree[n].Dad = tree[m].Dad = (ush)node;
243628415Speter#ifdef DUMP_BL_TREE
243728415Speter        if (tree == s->bl_tree) {
243828415Speter            fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
243928415Speter                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
244028415Speter        }
244128415Speter#endif
244228415Speter        /* and insert the new node in the heap */
244328415Speter        s->heap[SMALLEST] = node++;
244428415Speter        pqdownheap(s, tree, SMALLEST);
244528415Speter
244628415Speter    } while (s->heap_len >= 2);
244728415Speter
244828415Speter    s->heap[--(s->heap_max)] = s->heap[SMALLEST];
244928415Speter
245028415Speter    /* At this point, the fields freq and dad are set. We can now
245128415Speter     * generate the bit lengths.
245228415Speter     */
245328415Speter    gen_bitlen(s, (tree_desc *)desc);
245428415Speter
245528415Speter    /* The field len is now set, we can generate the bit codes */
245628415Speter    gen_codes ((ct_data *)tree, max_code, s->bl_count);
245728415Speter}
245828415Speter
245928415Speter/* ===========================================================================
246028415Speter * Scan a literal or distance tree to determine the frequencies of the codes
246128415Speter * in the bit length tree.
246228415Speter */
246328415Speterlocal void scan_tree (s, tree, max_code)
246428415Speter    deflate_state *s;
246528415Speter    ct_data *tree;   /* the tree to be scanned */
246628415Speter    int max_code;    /* and its largest code of non zero frequency */
246728415Speter{
246828415Speter    int n;                     /* iterates over all tree elements */
246928415Speter    int prevlen = -1;          /* last emitted length */
247028415Speter    int curlen;                /* length of current code */
247128415Speter    int nextlen = tree[0].Len; /* length of next code */
247228415Speter    int count = 0;             /* repeat count of the current code */
247328415Speter    int max_count = 7;         /* max repeat count */
247428415Speter    int min_count = 4;         /* min repeat count */
247528415Speter
247628415Speter    if (nextlen == 0) max_count = 138, min_count = 3;
247728415Speter    tree[max_code+1].Len = (ush)0xffff; /* guard */
247828415Speter
247928415Speter    for (n = 0; n <= max_code; n++) {
248028415Speter        curlen = nextlen; nextlen = tree[n+1].Len;
248128415Speter        if (++count < max_count && curlen == nextlen) {
248228415Speter            continue;
248328415Speter        } else if (count < min_count) {
248428415Speter            s->bl_tree[curlen].Freq += count;
248528415Speter        } else if (curlen != 0) {
248628415Speter            if (curlen != prevlen) s->bl_tree[curlen].Freq++;
248728415Speter            s->bl_tree[REP_3_6].Freq++;
248828415Speter        } else if (count <= 10) {
248928415Speter            s->bl_tree[REPZ_3_10].Freq++;
249028415Speter        } else {
249128415Speter            s->bl_tree[REPZ_11_138].Freq++;
249228415Speter        }
249328415Speter        count = 0; prevlen = curlen;
249428415Speter        if (nextlen == 0) {
249528415Speter            max_count = 138, min_count = 3;
249628415Speter        } else if (curlen == nextlen) {
249728415Speter            max_count = 6, min_count = 3;
249828415Speter        } else {
249928415Speter            max_count = 7, min_count = 4;
250028415Speter        }
250128415Speter    }
250228415Speter}
250328415Speter
250428415Speter/* ===========================================================================
250528415Speter * Send a literal or distance tree in compressed form, using the codes in
250628415Speter * bl_tree.
250728415Speter */
250828415Speterlocal void send_tree (s, tree, max_code)
250928415Speter    deflate_state *s;
251028415Speter    ct_data *tree; /* the tree to be scanned */
251128415Speter    int max_code;       /* and its largest code of non zero frequency */
251228415Speter{
251328415Speter    int n;                     /* iterates over all tree elements */
251428415Speter    int prevlen = -1;          /* last emitted length */
251528415Speter    int curlen;                /* length of current code */
251628415Speter    int nextlen = tree[0].Len; /* length of next code */
251728415Speter    int count = 0;             /* repeat count of the current code */
251828415Speter    int max_count = 7;         /* max repeat count */
251928415Speter    int min_count = 4;         /* min repeat count */
252028415Speter
252128415Speter    /* tree[max_code+1].Len = -1; */  /* guard already set */
252228415Speter    if (nextlen == 0) max_count = 138, min_count = 3;
252328415Speter
252428415Speter    for (n = 0; n <= max_code; n++) {
252528415Speter        curlen = nextlen; nextlen = tree[n+1].Len;
252628415Speter        if (++count < max_count && curlen == nextlen) {
252728415Speter            continue;
252828415Speter        } else if (count < min_count) {
252928415Speter            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
253028415Speter
253128415Speter        } else if (curlen != 0) {
253228415Speter            if (curlen != prevlen) {
253328415Speter                send_code(s, curlen, s->bl_tree); count--;
253428415Speter            }
253528415Speter            Assert(count >= 3 && count <= 6, " 3_6?");
253628415Speter            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
253728415Speter
253828415Speter        } else if (count <= 10) {
253928415Speter            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
254028415Speter
254128415Speter        } else {
254228415Speter            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
254328415Speter        }
254428415Speter        count = 0; prevlen = curlen;
254528415Speter        if (nextlen == 0) {
254628415Speter            max_count = 138, min_count = 3;
254728415Speter        } else if (curlen == nextlen) {
254828415Speter            max_count = 6, min_count = 3;
254928415Speter        } else {
255028415Speter            max_count = 7, min_count = 4;
255128415Speter        }
255228415Speter    }
255328415Speter}
255428415Speter
255528415Speter/* ===========================================================================
255628415Speter * Construct the Huffman tree for the bit lengths and return the index in
255728415Speter * bl_order of the last bit length code to send.
255828415Speter */
255928415Speterlocal int build_bl_tree(s)
256028415Speter    deflate_state *s;
256128415Speter{
256228415Speter    int max_blindex;  /* index of last bit length code of non zero freq */
256328415Speter
256428415Speter    /* Determine the bit length frequencies for literal and distance trees */
256528415Speter    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
256628415Speter    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
256728415Speter
256828415Speter    /* Build the bit length tree: */
256928415Speter    build_tree(s, (tree_desc *)(&(s->bl_desc)));
257028415Speter    /* opt_len now includes the length of the tree representations, except
257128415Speter     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
257228415Speter     */
257328415Speter
257428415Speter    /* Determine the number of bit length codes to send. The pkzip format
257528415Speter     * requires that at least 4 bit length codes be sent. (appnote.txt says
257628415Speter     * 3 but the actual value used is 4.)
257728415Speter     */
257828415Speter    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
257928415Speter        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
258028415Speter    }
258128415Speter    /* Update opt_len to include the bit length tree and counts */
258228415Speter    s->opt_len += 3*(max_blindex+1) + 5+5+4;
258328415Speter    Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
258428415Speter            s->opt_len, s->static_len));
258528415Speter
258628415Speter    return max_blindex;
258728415Speter}
258828415Speter
258928415Speter/* ===========================================================================
259028415Speter * Send the header for a block using dynamic Huffman trees: the counts, the
259128415Speter * lengths of the bit length codes, the literal tree and the distance tree.
259228415Speter * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
259328415Speter */
259428415Speterlocal void send_all_trees(s, lcodes, dcodes, blcodes)
259528415Speter    deflate_state *s;
259628415Speter    int lcodes, dcodes, blcodes; /* number of codes for each tree */
259728415Speter{
259828415Speter    int rank;                    /* index in bl_order */
259928415Speter
260028415Speter    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
260128415Speter    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
260228415Speter            "too many codes");
260328415Speter    Tracev((stderr, "\nbl counts: "));
260428415Speter    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
260528415Speter    send_bits(s, dcodes-1,   5);
260628415Speter    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
260728415Speter    for (rank = 0; rank < blcodes; rank++) {
260828415Speter        Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
260928415Speter        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
261028415Speter    }
261128415Speter    Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
261228415Speter
261328415Speter    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
261428415Speter    Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
261528415Speter
261628415Speter    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
261728415Speter    Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
261828415Speter}
261928415Speter
262028415Speter/* ===========================================================================
262128415Speter * Send a stored block
262228415Speter */
262334768Spetervoid _tr_stored_block(s, buf, stored_len, eof)
262428415Speter    deflate_state *s;
262528415Speter    charf *buf;       /* input block */
262628415Speter    ulg stored_len;   /* length of input block */
262728415Speter    int eof;          /* true if this is the last block for a file */
262828415Speter{
262928415Speter    send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */
263034768Speter    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
263128415Speter    s->compressed_len += (stored_len + 4) << 3;
263228415Speter
263328415Speter    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
263428415Speter}
263528415Speter
263628415Speter/* Send just the `stored block' type code without any length bytes or data.
263728415Speter */
263834768Spetervoid _tr_stored_type_only(s)
263928415Speter    deflate_state *s;
264028415Speter{
264128415Speter    send_bits(s, (STORED_BLOCK << 1), 3);
264228415Speter    bi_windup(s);
264328415Speter    s->compressed_len = (s->compressed_len + 3) & ~7L;
264428415Speter}
264528415Speter
264628415Speter
264728415Speter/* ===========================================================================
264828415Speter * Send one empty static block to give enough lookahead for inflate.
264928415Speter * This takes 10 bits, of which 7 may remain in the bit buffer.
265034768Speter * The current inflate code requires 9 bits of lookahead. If the
265134768Speter * last two codes for the previous block (real code plus EOB) were coded
265234768Speter * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
265334768Speter * the last real code. In this case we send two empty static blocks instead
265434768Speter * of one. (There are no problems if the previous block is stored or fixed.)
265534768Speter * To simplify the code, we assume the worst case of last real code encoded
265634768Speter * on one bit only.
265728415Speter */
265834768Spetervoid _tr_align(s)
265928415Speter    deflate_state *s;
266028415Speter{
266128415Speter    send_bits(s, STATIC_TREES<<1, 3);
266228415Speter    send_code(s, END_BLOCK, static_ltree);
266328415Speter    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
266428415Speter    bi_flush(s);
266528415Speter    /* Of the 10 bits for the empty block, we have already sent
266634768Speter     * (10 - bi_valid) bits. The lookahead for the last real code (before
266734768Speter     * the EOB of the previous block) was thus at least one plus the length
266834768Speter     * of the EOB plus what we have just sent of the empty static block.
266928415Speter     */
267034768Speter    if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
267128415Speter        send_bits(s, STATIC_TREES<<1, 3);
267228415Speter        send_code(s, END_BLOCK, static_ltree);
267328415Speter        s->compressed_len += 10L;
267428415Speter        bi_flush(s);
267528415Speter    }
267628415Speter    s->last_eob_len = 7;
267728415Speter}
267828415Speter
267928415Speter/* ===========================================================================
268028415Speter * Determine the best encoding for the current block: dynamic trees, static
268128415Speter * trees or store, and output the encoded block to the zip file. This function
268228415Speter * returns the total compressed length for the file so far.
268328415Speter */
268434768Speterulg _tr_flush_block(s, buf, stored_len, eof)
268528415Speter    deflate_state *s;
268628415Speter    charf *buf;       /* input block, or NULL if too old */
268728415Speter    ulg stored_len;   /* length of input block */
268834768Speter    int eof;          /* true if this is the last block for a file */
268928415Speter{
269028415Speter    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
269134768Speter    int max_blindex = 0;  /* index of last bit length code of non zero freq */
269228415Speter
269334768Speter    /* Build the Huffman trees unless a stored block is forced */
269434768Speter    if (s->level > 0) {
269528415Speter
269634768Speter	 /* Check if the file is ascii or binary */
269734768Speter	if (s->data_type == Z_UNKNOWN) set_data_type(s);
269828415Speter
269934768Speter	/* Construct the literal and distance trees */
270034768Speter	build_tree(s, (tree_desc *)(&(s->l_desc)));
270134768Speter	Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
270234768Speter		s->static_len));
270328415Speter
270434768Speter	build_tree(s, (tree_desc *)(&(s->d_desc)));
270534768Speter	Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
270634768Speter		s->static_len));
270734768Speter	/* At this point, opt_len and static_len are the total bit lengths of
270834768Speter	 * the compressed block data, excluding the tree representations.
270934768Speter	 */
271028415Speter
271134768Speter	/* Build the bit length tree for the above two trees, and get the index
271234768Speter	 * in bl_order of the last bit length code to send.
271334768Speter	 */
271434768Speter	max_blindex = build_bl_tree(s);
271528415Speter
271634768Speter	/* Determine the best encoding. Compute first the block length in bytes*/
271734768Speter	opt_lenb = (s->opt_len+3+7)>>3;
271834768Speter	static_lenb = (s->static_len+3+7)>>3;
271928415Speter
272034768Speter	Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
272134768Speter		opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
272234768Speter		s->last_lit));
272328415Speter
272434768Speter	if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
272528415Speter
272634768Speter    } else {
272734768Speter        Assert(buf != (char*)0, "lost buf");
272834768Speter	opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
272934768Speter    }
273034768Speter
273128415Speter    /* If compression failed and this is the first and last block,
273228415Speter     * and if the .zip file can be seeked (to rewrite the local header),
273328415Speter     * the whole file is transformed into a stored file:
273428415Speter     */
273528415Speter#ifdef STORED_FILE_OK
273628415Speter#  ifdef FORCE_STORED_FILE
273734768Speter    if (eof && s->compressed_len == 0L) { /* force stored file */
273828415Speter#  else
273934768Speter    if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) {
274028415Speter#  endif
274128415Speter        /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
274228415Speter        if (buf == (charf*)0) error ("block vanished");
274328415Speter
274434768Speter        copy_block(s, buf, (unsigned)stored_len, 0); /* without header */
274528415Speter        s->compressed_len = stored_len << 3;
274628415Speter        s->method = STORED;
274728415Speter    } else
274828415Speter#endif /* STORED_FILE_OK */
274928415Speter
275028415Speter#ifdef FORCE_STORED
275134768Speter    if (buf != (char*)0) { /* force stored block */
275228415Speter#else
275334768Speter    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
275428415Speter                       /* 4: two words for the lengths */
275528415Speter#endif
275628415Speter        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
275728415Speter         * Otherwise we can't have processed more than WSIZE input bytes since
275828415Speter         * the last block flush, because compression would have been
275928415Speter         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
276028415Speter         * transform a block into a stored block.
276128415Speter         */
276234768Speter        _tr_stored_block(s, buf, stored_len, eof);
276328415Speter
276428415Speter#ifdef FORCE_STATIC
276534768Speter    } else if (static_lenb >= 0) { /* force static trees */
276628415Speter#else
276734768Speter    } else if (static_lenb == opt_lenb) {
276828415Speter#endif
276928415Speter        send_bits(s, (STATIC_TREES<<1)+eof, 3);
277028415Speter        compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
277128415Speter        s->compressed_len += 3 + s->static_len;
277228415Speter    } else {
277328415Speter        send_bits(s, (DYN_TREES<<1)+eof, 3);
277428415Speter        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
277528415Speter                       max_blindex+1);
277628415Speter        compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
277728415Speter        s->compressed_len += 3 + s->opt_len;
277828415Speter    }
277928415Speter    Assert (s->compressed_len == s->bits_sent, "bad compressed size");
278028415Speter    init_block(s);
278128415Speter
278228415Speter    if (eof) {
278328415Speter        bi_windup(s);
278428415Speter        s->compressed_len += 7;  /* align on byte boundary */
278528415Speter    }
278628415Speter    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
278728415Speter           s->compressed_len-7*eof));
278828415Speter
278928415Speter    return s->compressed_len >> 3;
279028415Speter}
279128415Speter
279228415Speter/* ===========================================================================
279328415Speter * Save the match info and tally the frequency counts. Return true if
279428415Speter * the current block must be flushed.
279528415Speter */
279634768Speterint _tr_tally (s, dist, lc)
279728415Speter    deflate_state *s;
279834768Speter    unsigned dist;  /* distance of matched string */
279934768Speter    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
280028415Speter{
280128415Speter    s->d_buf[s->last_lit] = (ush)dist;
280228415Speter    s->l_buf[s->last_lit++] = (uch)lc;
280328415Speter    if (dist == 0) {
280428415Speter        /* lc is the unmatched char */
280528415Speter        s->dyn_ltree[lc].Freq++;
280628415Speter    } else {
280728415Speter        s->matches++;
280828415Speter        /* Here, lc is the match length - MIN_MATCH */
280928415Speter        dist--;             /* dist = match distance - 1 */
281028415Speter        Assert((ush)dist < (ush)MAX_DIST(s) &&
281128415Speter               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
281234768Speter               (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
281328415Speter
281428415Speter        s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++;
281528415Speter        s->dyn_dtree[d_code(dist)].Freq++;
281628415Speter    }
281728415Speter
281828415Speter    /* Try to guess if it is profitable to stop the current block here */
281928415Speter    if (s->level > 2 && (s->last_lit & 0xfff) == 0) {
282028415Speter        /* Compute an upper bound for the compressed length */
282128415Speter        ulg out_length = (ulg)s->last_lit*8L;
282234768Speter        ulg in_length = (ulg)((long)s->strstart - s->block_start);
282328415Speter        int dcode;
282428415Speter        for (dcode = 0; dcode < D_CODES; dcode++) {
282528415Speter            out_length += (ulg)s->dyn_dtree[dcode].Freq *
282628415Speter                (5L+extra_dbits[dcode]);
282728415Speter        }
282828415Speter        out_length >>= 3;
282928415Speter        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
283028415Speter               s->last_lit, in_length, out_length,
283128415Speter               100L - out_length*100L/in_length));
283228415Speter        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
283328415Speter    }
283428415Speter    return (s->last_lit == s->lit_bufsize-1);
283528415Speter    /* We avoid equality with lit_bufsize because of wraparound at 64K
283628415Speter     * on 16 bit machines and because stored blocks are restricted to
283728415Speter     * 64K-1 bytes.
283828415Speter     */
283928415Speter}
284028415Speter
284128415Speter/* ===========================================================================
284228415Speter * Send the block data compressed using the given Huffman trees
284328415Speter */
284428415Speterlocal void compress_block(s, ltree, dtree)
284528415Speter    deflate_state *s;
284628415Speter    ct_data *ltree; /* literal tree */
284728415Speter    ct_data *dtree; /* distance tree */
284828415Speter{
284928415Speter    unsigned dist;      /* distance of matched string */
285028415Speter    int lc;             /* match length or unmatched char (if dist == 0) */
285128415Speter    unsigned lx = 0;    /* running index in l_buf */
285228415Speter    unsigned code;      /* the code to send */
285328415Speter    int extra;          /* number of extra bits to send */
285428415Speter
285528415Speter    if (s->last_lit != 0) do {
285628415Speter        dist = s->d_buf[lx];
285728415Speter        lc = s->l_buf[lx++];
285828415Speter        if (dist == 0) {
285928415Speter            send_code(s, lc, ltree); /* send a literal byte */
286028415Speter            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
286128415Speter        } else {
286228415Speter            /* Here, lc is the match length - MIN_MATCH */
286328415Speter            code = length_code[lc];
286428415Speter            send_code(s, code+LITERALS+1, ltree); /* send the length code */
286528415Speter            extra = extra_lbits[code];
286628415Speter            if (extra != 0) {
286728415Speter                lc -= base_length[code];
286828415Speter                send_bits(s, lc, extra);       /* send the extra length bits */
286928415Speter            }
287028415Speter            dist--; /* dist is now the match distance - 1 */
287128415Speter            code = d_code(dist);
287228415Speter            Assert (code < D_CODES, "bad d_code");
287328415Speter
287428415Speter            send_code(s, code, dtree);       /* send the distance code */
287528415Speter            extra = extra_dbits[code];
287628415Speter            if (extra != 0) {
287728415Speter                dist -= base_dist[code];
287828415Speter                send_bits(s, dist, extra);   /* send the extra distance bits */
287928415Speter            }
288028415Speter        } /* literal or match pair ? */
288128415Speter
288228415Speter        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
288328415Speter        Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
288428415Speter
288528415Speter    } while (lx < s->last_lit);
288628415Speter
288728415Speter    send_code(s, END_BLOCK, ltree);
288828415Speter    s->last_eob_len = ltree[END_BLOCK].Len;
288928415Speter}
289028415Speter
289128415Speter/* ===========================================================================
289234768Speter * Set the data type to ASCII or BINARY, using a crude approximation:
289328415Speter * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
289428415Speter * IN assertion: the fields freq of dyn_ltree are set and the total of all
289528415Speter * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
289628415Speter */
289728415Speterlocal void set_data_type(s)
289828415Speter    deflate_state *s;
289928415Speter{
290028415Speter    int n = 0;
290128415Speter    unsigned ascii_freq = 0;
290228415Speter    unsigned bin_freq = 0;
290328415Speter    while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq;
290428415Speter    while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq;
290528415Speter    while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
290634768Speter    s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
290728415Speter}
290828415Speter
290928415Speter/* ===========================================================================
291028415Speter * Reverse the first len bits of a code, using straightforward code (a faster
291128415Speter * method would use a table)
291228415Speter * IN assertion: 1 <= len <= 15
291328415Speter */
291428415Speterlocal unsigned bi_reverse(code, len)
291528415Speter    unsigned code; /* the value to invert */
291628415Speter    int len;       /* its bit length */
291728415Speter{
291828415Speter    register unsigned res = 0;
291928415Speter    do {
292028415Speter        res |= code & 1;
292128415Speter        code >>= 1, res <<= 1;
292228415Speter    } while (--len > 0);
292328415Speter    return res >> 1;
292428415Speter}
292528415Speter
292628415Speter/* ===========================================================================
292728415Speter * Flush the bit buffer, keeping at most 7 bits in it.
292828415Speter */
292928415Speterlocal void bi_flush(s)
293028415Speter    deflate_state *s;
293128415Speter{
293228415Speter    if (s->bi_valid == 16) {
293328415Speter        put_short(s, s->bi_buf);
293428415Speter        s->bi_buf = 0;
293528415Speter        s->bi_valid = 0;
293628415Speter    } else if (s->bi_valid >= 8) {
293728415Speter        put_byte(s, (Byte)s->bi_buf);
293828415Speter        s->bi_buf >>= 8;
293928415Speter        s->bi_valid -= 8;
294028415Speter    }
294128415Speter}
294228415Speter
294328415Speter/* ===========================================================================
294428415Speter * Flush the bit buffer and align the output on a byte boundary
294528415Speter */
294628415Speterlocal void bi_windup(s)
294728415Speter    deflate_state *s;
294828415Speter{
294928415Speter    if (s->bi_valid > 8) {
295028415Speter        put_short(s, s->bi_buf);
295128415Speter    } else if (s->bi_valid > 0) {
295228415Speter        put_byte(s, (Byte)s->bi_buf);
295328415Speter    }
295428415Speter    s->bi_buf = 0;
295528415Speter    s->bi_valid = 0;
295628415Speter#ifdef DEBUG_ZLIB
295728415Speter    s->bits_sent = (s->bits_sent+7) & ~7;
295828415Speter#endif
295928415Speter}
296028415Speter
296128415Speter/* ===========================================================================
296228415Speter * Copy a stored block, storing first the length and its
296328415Speter * one's complement if requested.
296428415Speter */
296528415Speterlocal void copy_block(s, buf, len, header)
296628415Speter    deflate_state *s;
296728415Speter    charf    *buf;    /* the input data */
296828415Speter    unsigned len;     /* its length */
296928415Speter    int      header;  /* true if block header must be written */
297028415Speter{
297128415Speter    bi_windup(s);        /* align on byte boundary */
297228415Speter    s->last_eob_len = 8; /* enough lookahead for inflate */
297328415Speter
297428415Speter    if (header) {
297528415Speter        put_short(s, (ush)len);
297628415Speter        put_short(s, (ush)~len);
297728415Speter#ifdef DEBUG_ZLIB
297828415Speter        s->bits_sent += 2*16;
297928415Speter#endif
298028415Speter    }
298128415Speter#ifdef DEBUG_ZLIB
298228415Speter    s->bits_sent += (ulg)len<<3;
298328415Speter#endif
298434768Speter    /* bundle up the put_byte(s, *buf++) calls */
298534768Speter    zmemcpy(&s->pending_buf[s->pending], buf, len);
298634768Speter    s->pending += len;
298728415Speter}
298834768Speter/* --- trees.c */
298928415Speter
299034768Speter/* +++ inflate.c */
299134768Speter/* inflate.c -- zlib interface to inflate modules
299234768Speter * Copyright (C) 1995-1996 Mark Adler
299334768Speter * For conditions of distribution and use, see copyright notice in zlib.h
299434768Speter */
299528415Speter
299634768Speter/* #include "zutil.h" */
299734768Speter
299834768Speter/* +++ infblock.h */
299928415Speter/* infblock.h -- header to use infblock.c
300034768Speter * Copyright (C) 1995-1996 Mark Adler
300128415Speter * For conditions of distribution and use, see copyright notice in zlib.h
300228415Speter */
300328415Speter
300428415Speter/* WARNING: this file should *not* be used by applications. It is
300528415Speter   part of the implementation of the compression library and is
300628415Speter   subject to change. Applications should only use zlib.h.
300728415Speter */
300828415Speter
300928415Speterstruct inflate_blocks_state;
301028415Spetertypedef struct inflate_blocks_state FAR inflate_blocks_statef;
301128415Speter
301234768Speterextern inflate_blocks_statef * inflate_blocks_new OF((
301334768Speter    z_streamp z,
301428415Speter    check_func c,               /* check function */
301528415Speter    uInt w));                   /* window size */
301628415Speter
301734768Speterextern int inflate_blocks OF((
301828415Speter    inflate_blocks_statef *,
301934768Speter    z_streamp ,
302028415Speter    int));                      /* initial return code */
302128415Speter
302234768Speterextern void inflate_blocks_reset OF((
302328415Speter    inflate_blocks_statef *,
302434768Speter    z_streamp ,
302528415Speter    uLongf *));                  /* check value on output */
302628415Speter
302734768Speterextern int inflate_blocks_free OF((
302828415Speter    inflate_blocks_statef *,
302934768Speter    z_streamp ,
303028415Speter    uLongf *));                  /* check value on output */
303128415Speter
303234768Speterextern void inflate_set_dictionary OF((
303334768Speter    inflate_blocks_statef *s,
303434768Speter    const Bytef *d,  /* dictionary */
303534768Speter    uInt  n));       /* dictionary length */
303634768Speter
303734768Speterextern int inflate_addhistory OF((
303828415Speter    inflate_blocks_statef *,
303934768Speter    z_streamp));
304028415Speter
304134768Speterextern int inflate_packet_flush OF((
304228415Speter    inflate_blocks_statef *));
304334768Speter/* --- infblock.h */
304428415Speter
304534768Speter#ifndef NO_DUMMY_DECL
304634768Speterstruct inflate_blocks_state {int dummy;}; /* for buggy compilers */
304728415Speter#endif
304828415Speter
304928415Speter/* inflate private state */
305028415Speterstruct internal_state {
305128415Speter
305228415Speter  /* mode */
305328415Speter  enum {
305428415Speter      METHOD,   /* waiting for method byte */
305528415Speter      FLAG,     /* waiting for flag byte */
305634768Speter      DICT4,    /* four dictionary check bytes to go */
305734768Speter      DICT3,    /* three dictionary check bytes to go */
305834768Speter      DICT2,    /* two dictionary check bytes to go */
305934768Speter      DICT1,    /* one dictionary check byte to go */
306034768Speter      DICT0,    /* waiting for inflateSetDictionary */
306128415Speter      BLOCKS,   /* decompressing blocks */
306228415Speter      CHECK4,   /* four check bytes to go */
306328415Speter      CHECK3,   /* three check bytes to go */
306428415Speter      CHECK2,   /* two check bytes to go */
306528415Speter      CHECK1,   /* one check byte to go */
306628415Speter      DONE,     /* finished check, done */
306728415Speter      BAD}      /* got an error--stay here */
306828415Speter    mode;               /* current inflate mode */
306928415Speter
307028415Speter  /* mode dependent information */
307128415Speter  union {
307228415Speter    uInt method;        /* if FLAGS, method byte */
307328415Speter    struct {
307428415Speter      uLong was;                /* computed check value */
307528415Speter      uLong need;               /* stream check value */
307628415Speter    } check;            /* if CHECK, check values to compare */
307728415Speter    uInt marker;        /* if BAD, inflateSync's marker bytes count */
307828415Speter  } sub;        /* submode */
307928415Speter
308028415Speter  /* mode independent information */
308128415Speter  int  nowrap;          /* flag for no wrapper */
308228415Speter  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */
308328415Speter  inflate_blocks_statef
308428415Speter    *blocks;            /* current inflate_blocks state */
308528415Speter
308628415Speter};
308728415Speter
308828415Speter
308928415Speterint inflateReset(z)
309034768Speterz_streamp z;
309128415Speter{
309228415Speter  uLong c;
309328415Speter
309428415Speter  if (z == Z_NULL || z->state == Z_NULL)
309528415Speter    return Z_STREAM_ERROR;
309628415Speter  z->total_in = z->total_out = 0;
309728415Speter  z->msg = Z_NULL;
309828415Speter  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
309928415Speter  inflate_blocks_reset(z->state->blocks, z, &c);
310028415Speter  Trace((stderr, "inflate: reset\n"));
310128415Speter  return Z_OK;
310228415Speter}
310328415Speter
310428415Speter
310528415Speterint inflateEnd(z)
310634768Speterz_streamp z;
310728415Speter{
310828415Speter  uLong c;
310928415Speter
311028415Speter  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
311128415Speter    return Z_STREAM_ERROR;
311228415Speter  if (z->state->blocks != Z_NULL)
311328415Speter    inflate_blocks_free(z->state->blocks, z, &c);
311434768Speter  ZFREE(z, z->state);
311528415Speter  z->state = Z_NULL;
311628415Speter  Trace((stderr, "inflate: end\n"));
311728415Speter  return Z_OK;
311828415Speter}
311928415Speter
312028415Speter
312134768Speterint inflateInit2_(z, w, version, stream_size)
312234768Speterz_streamp z;
312328415Speterint w;
312434768Speterconst char *version;
312534768Speterint stream_size;
312628415Speter{
312734768Speter  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
312834768Speter      stream_size != sizeof(z_stream))
312934768Speter      return Z_VERSION_ERROR;
313034768Speter
313128415Speter  /* initialize state */
313228415Speter  if (z == Z_NULL)
313328415Speter    return Z_STREAM_ERROR;
313434768Speter  z->msg = Z_NULL;
313534768Speter#ifndef NO_ZCFUNCS
313634768Speter  if (z->zalloc == Z_NULL)
313734768Speter  {
313834768Speter    z->zalloc = zcalloc;
313934768Speter    z->opaque = (voidpf)0;
314034768Speter  }
314134768Speter  if (z->zfree == Z_NULL) z->zfree = zcfree;
314234768Speter#endif
314328415Speter  if ((z->state = (struct internal_state FAR *)
314434768Speter       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
314528415Speter    return Z_MEM_ERROR;
314628415Speter  z->state->blocks = Z_NULL;
314728415Speter
314828415Speter  /* handle undocumented nowrap option (no zlib header or check) */
314928415Speter  z->state->nowrap = 0;
315028415Speter  if (w < 0)
315128415Speter  {
315228415Speter    w = - w;
315328415Speter    z->state->nowrap = 1;
315428415Speter  }
315528415Speter
315628415Speter  /* set window size */
315728415Speter  if (w < 8 || w > 15)
315828415Speter  {
315928415Speter    inflateEnd(z);
316028415Speter    return Z_STREAM_ERROR;
316128415Speter  }
316228415Speter  z->state->wbits = (uInt)w;
316328415Speter
316428415Speter  /* create inflate_blocks state */
316528415Speter  if ((z->state->blocks =
316634768Speter      inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
316728415Speter      == Z_NULL)
316828415Speter  {
316928415Speter    inflateEnd(z);
317028415Speter    return Z_MEM_ERROR;
317128415Speter  }
317228415Speter  Trace((stderr, "inflate: allocated\n"));
317328415Speter
317428415Speter  /* reset state */
317528415Speter  inflateReset(z);
317628415Speter  return Z_OK;
317728415Speter}
317828415Speter
317928415Speter
318034768Speterint inflateInit_(z, version, stream_size)
318134768Speterz_streamp z;
318234768Speterconst char *version;
318334768Speterint stream_size;
318428415Speter{
318534768Speter  return inflateInit2_(z, DEF_WBITS, version, stream_size);
318628415Speter}
318728415Speter
318828415Speter
318928415Speter#define NEEDBYTE {if(z->avail_in==0)goto empty;r=Z_OK;}
319028415Speter#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
319128415Speter
319228415Speterint inflate(z, f)
319334768Speterz_streamp z;
319428415Speterint f;
319528415Speter{
319628415Speter  int r;
319728415Speter  uInt b;
319828415Speter
319934768Speter  if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL || f < 0)
320028415Speter    return Z_STREAM_ERROR;
320128415Speter  r = Z_BUF_ERROR;
320228415Speter  while (1) switch (z->state->mode)
320328415Speter  {
320428415Speter    case METHOD:
320528415Speter      NEEDBYTE
320634768Speter      if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
320728415Speter      {
320828415Speter        z->state->mode = BAD;
320934768Speter        z->msg = (char*)"unknown compression method";
321028415Speter        z->state->sub.marker = 5;       /* can't try inflateSync */
321128415Speter        break;
321228415Speter      }
321328415Speter      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
321428415Speter      {
321528415Speter        z->state->mode = BAD;
321634768Speter        z->msg = (char*)"invalid window size";
321728415Speter        z->state->sub.marker = 5;       /* can't try inflateSync */
321828415Speter        break;
321928415Speter      }
322028415Speter      z->state->mode = FLAG;
322128415Speter    case FLAG:
322228415Speter      NEEDBYTE
322334768Speter      b = NEXTBYTE;
322434768Speter      if (((z->state->sub.method << 8) + b) % 31)
322528415Speter      {
322628415Speter        z->state->mode = BAD;
322734768Speter        z->msg = (char*)"incorrect header check";
322828415Speter        z->state->sub.marker = 5;       /* can't try inflateSync */
322928415Speter        break;
323028415Speter      }
323134768Speter      Trace((stderr, "inflate: zlib header ok\n"));
323234768Speter      if (!(b & PRESET_DICT))
323328415Speter      {
323434768Speter        z->state->mode = BLOCKS;
323534768Speter	break;
323628415Speter      }
323734768Speter      z->state->mode = DICT4;
323834768Speter    case DICT4:
323934768Speter      NEEDBYTE
324034768Speter      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
324134768Speter      z->state->mode = DICT3;
324234768Speter    case DICT3:
324334768Speter      NEEDBYTE
324434768Speter      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
324534768Speter      z->state->mode = DICT2;
324634768Speter    case DICT2:
324734768Speter      NEEDBYTE
324834768Speter      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
324934768Speter      z->state->mode = DICT1;
325034768Speter    case DICT1:
325134768Speter      NEEDBYTE
325234768Speter      z->state->sub.check.need += (uLong)NEXTBYTE;
325334768Speter      z->adler = z->state->sub.check.need;
325434768Speter      z->state->mode = DICT0;
325534768Speter      return Z_NEED_DICT;
325634768Speter    case DICT0:
325734768Speter      z->state->mode = BAD;
325834768Speter      z->msg = (char*)"need dictionary";
325934768Speter      z->state->sub.marker = 0;       /* can try inflateSync */
326034768Speter      return Z_STREAM_ERROR;
326128415Speter    case BLOCKS:
326228415Speter      r = inflate_blocks(z->state->blocks, z, r);
326328415Speter      if (f == Z_PACKET_FLUSH && z->avail_in == 0 && z->avail_out != 0)
326428415Speter	  r = inflate_packet_flush(z->state->blocks);
326528415Speter      if (r == Z_DATA_ERROR)
326628415Speter      {
326728415Speter        z->state->mode = BAD;
326828415Speter        z->state->sub.marker = 0;       /* can try inflateSync */
326928415Speter        break;
327028415Speter      }
327128415Speter      if (r != Z_STREAM_END)
327228415Speter        return r;
327328415Speter      r = Z_OK;
327428415Speter      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
327528415Speter      if (z->state->nowrap)
327628415Speter      {
327728415Speter        z->state->mode = DONE;
327828415Speter        break;
327928415Speter      }
328028415Speter      z->state->mode = CHECK4;
328128415Speter    case CHECK4:
328228415Speter      NEEDBYTE
328328415Speter      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
328428415Speter      z->state->mode = CHECK3;
328528415Speter    case CHECK3:
328628415Speter      NEEDBYTE
328728415Speter      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
328828415Speter      z->state->mode = CHECK2;
328928415Speter    case CHECK2:
329028415Speter      NEEDBYTE
329128415Speter      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
329228415Speter      z->state->mode = CHECK1;
329328415Speter    case CHECK1:
329428415Speter      NEEDBYTE
329528415Speter      z->state->sub.check.need += (uLong)NEXTBYTE;
329628415Speter
329728415Speter      if (z->state->sub.check.was != z->state->sub.check.need)
329828415Speter      {
329928415Speter        z->state->mode = BAD;
330034768Speter        z->msg = (char*)"incorrect data check";
330128415Speter        z->state->sub.marker = 5;       /* can't try inflateSync */
330228415Speter        break;
330328415Speter      }
330428415Speter      Trace((stderr, "inflate: zlib check ok\n"));
330528415Speter      z->state->mode = DONE;
330628415Speter    case DONE:
330728415Speter      return Z_STREAM_END;
330828415Speter    case BAD:
330928415Speter      return Z_DATA_ERROR;
331028415Speter    default:
331128415Speter      return Z_STREAM_ERROR;
331228415Speter  }
331328415Speter
331428415Speter empty:
331528415Speter  if (f != Z_PACKET_FLUSH)
331628415Speter    return r;
331728415Speter  z->state->mode = BAD;
331834768Speter  z->msg = (char *)"need more for packet flush";
331928415Speter  z->state->sub.marker = 0;       /* can try inflateSync */
332028415Speter  return Z_DATA_ERROR;
332128415Speter}
332228415Speter
332334768Speter
332434768Speterint inflateSetDictionary(z, dictionary, dictLength)
332534768Speterz_streamp z;
332634768Speterconst Bytef *dictionary;
332734768SpeteruInt  dictLength;
332834768Speter{
332934768Speter  uInt length = dictLength;
333034768Speter
333134768Speter  if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
333234768Speter    return Z_STREAM_ERROR;
333334768Speter
333434768Speter  if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
333534768Speter  z->adler = 1L;
333634768Speter
333734768Speter  if (length >= ((uInt)1<<z->state->wbits))
333834768Speter  {
333934768Speter    length = (1<<z->state->wbits)-1;
334034768Speter    dictionary += dictLength - length;
334134768Speter  }
334234768Speter  inflate_set_dictionary(z->state->blocks, dictionary, length);
334334768Speter  z->state->mode = BLOCKS;
334434768Speter  return Z_OK;
334534768Speter}
334634768Speter
334728415Speter/*
334828415Speter * This subroutine adds the data at next_in/avail_in to the output history
334928415Speter * without performing any output.  The output buffer must be "caught up";
335028415Speter * i.e. no pending output (hence s->read equals s->write), and the state must
335128415Speter * be BLOCKS (i.e. we should be willing to see the start of a series of
335228415Speter * BLOCKS).  On exit, the output will also be caught up, and the checksum
335328415Speter * will have been updated if need be.
335428415Speter */
335528415Speter
335628415Speterint inflateIncomp(z)
335728415Speterz_stream *z;
335828415Speter{
335928415Speter    if (z->state->mode != BLOCKS)
336028415Speter	return Z_DATA_ERROR;
336128415Speter    return inflate_addhistory(z->state->blocks, z);
336228415Speter}
336328415Speter
336428415Speter
336528415Speterint inflateSync(z)
336634768Speterz_streamp z;
336728415Speter{
336828415Speter  uInt n;       /* number of bytes to look at */
336928415Speter  Bytef *p;     /* pointer to bytes */
337028415Speter  uInt m;       /* number of marker bytes found in a row */
337128415Speter  uLong r, w;   /* temporaries to save total_in and total_out */
337228415Speter
337328415Speter  /* set up */
337428415Speter  if (z == Z_NULL || z->state == Z_NULL)
337528415Speter    return Z_STREAM_ERROR;
337628415Speter  if (z->state->mode != BAD)
337728415Speter  {
337828415Speter    z->state->mode = BAD;
337928415Speter    z->state->sub.marker = 0;
338028415Speter  }
338128415Speter  if ((n = z->avail_in) == 0)
338228415Speter    return Z_BUF_ERROR;
338328415Speter  p = z->next_in;
338428415Speter  m = z->state->sub.marker;
338528415Speter
338628415Speter  /* search */
338728415Speter  while (n && m < 4)
338828415Speter  {
338928415Speter    if (*p == (Byte)(m < 2 ? 0 : 0xff))
339028415Speter      m++;
339128415Speter    else if (*p)
339228415Speter      m = 0;
339328415Speter    else
339428415Speter      m = 4 - m;
339528415Speter    p++, n--;
339628415Speter  }
339728415Speter
339828415Speter  /* restore */
339928415Speter  z->total_in += p - z->next_in;
340028415Speter  z->next_in = p;
340128415Speter  z->avail_in = n;
340228415Speter  z->state->sub.marker = m;
340328415Speter
340428415Speter  /* return no joy or set up to restart on a new block */
340528415Speter  if (m != 4)
340628415Speter    return Z_DATA_ERROR;
340728415Speter  r = z->total_in;  w = z->total_out;
340828415Speter  inflateReset(z);
340928415Speter  z->total_in = r;  z->total_out = w;
341028415Speter  z->state->mode = BLOCKS;
341128415Speter  return Z_OK;
341228415Speter}
341328415Speter
341428415Speter#undef NEEDBYTE
341528415Speter#undef NEXTBYTE
341634768Speter/* --- inflate.c */
341728415Speter
341834768Speter/* +++ infblock.c */
341934768Speter/* infblock.c -- interpret and process block types to last block
342034768Speter * Copyright (C) 1995-1996 Mark Adler
342134768Speter * For conditions of distribution and use, see copyright notice in zlib.h
342234768Speter */
342334768Speter
342434768Speter/* #include "zutil.h" */
342534768Speter/* #include "infblock.h" */
342634768Speter
342734768Speter/* +++ inftrees.h */
342834768Speter/* inftrees.h -- header to use inftrees.c
342934768Speter * Copyright (C) 1995-1996 Mark Adler
343034768Speter * For conditions of distribution and use, see copyright notice in zlib.h
343134768Speter */
343234768Speter
343334768Speter/* WARNING: this file should *not* be used by applications. It is
343434768Speter   part of the implementation of the compression library and is
343534768Speter   subject to change. Applications should only use zlib.h.
343634768Speter */
343734768Speter
343834768Speter/* Huffman code lookup table entry--this entry is four bytes for machines
343934768Speter   that have 16-bit pointers (e.g. PC's in the small or medium model). */
344034768Speter
344134768Spetertypedef struct inflate_huft_s FAR inflate_huft;
344234768Speter
344334768Speterstruct inflate_huft_s {
344434768Speter  union {
344534768Speter    struct {
344634768Speter      Byte Exop;        /* number of extra bits or operation */
344734768Speter      Byte Bits;        /* number of bits in this code or subcode */
344834768Speter    } what;
344934768Speter    Bytef *pad;         /* pad structure to a power of 2 (4 bytes for */
345034768Speter  } word;               /*  16-bit, 8 bytes for 32-bit machines) */
345134768Speter  union {
345234768Speter    uInt Base;          /* literal, length base, or distance base */
345334768Speter    inflate_huft *Next; /* pointer to next level of table */
345434768Speter  } more;
345534768Speter};
345634768Speter
345734768Speter#ifdef DEBUG_ZLIB
345834768Speter  extern uInt inflate_hufts;
345934768Speter#endif
346034768Speter
346134768Speterextern int inflate_trees_bits OF((
346234768Speter    uIntf *,                    /* 19 code lengths */
346334768Speter    uIntf *,                    /* bits tree desired/actual depth */
346434768Speter    inflate_huft * FAR *,       /* bits tree result */
346534768Speter    z_streamp ));               /* for zalloc, zfree functions */
346634768Speter
346734768Speterextern int inflate_trees_dynamic OF((
346834768Speter    uInt,                       /* number of literal/length codes */
346934768Speter    uInt,                       /* number of distance codes */
347034768Speter    uIntf *,                    /* that many (total) code lengths */
347134768Speter    uIntf *,                    /* literal desired/actual bit depth */
347234768Speter    uIntf *,                    /* distance desired/actual bit depth */
347334768Speter    inflate_huft * FAR *,       /* literal/length tree result */
347434768Speter    inflate_huft * FAR *,       /* distance tree result */
347534768Speter    z_streamp ));               /* for zalloc, zfree functions */
347634768Speter
347734768Speterextern int inflate_trees_fixed OF((
347834768Speter    uIntf *,                    /* literal desired/actual bit depth */
347934768Speter    uIntf *,                    /* distance desired/actual bit depth */
348034768Speter    inflate_huft * FAR *,       /* literal/length tree result */
348134768Speter    inflate_huft * FAR *));     /* distance tree result */
348234768Speter
348334768Speterextern int inflate_trees_free OF((
348434768Speter    inflate_huft *,             /* tables to free */
348534768Speter    z_streamp ));               /* for zfree function */
348634768Speter
348734768Speter/* --- inftrees.h */
348834768Speter
348934768Speter/* +++ infcodes.h */
349034768Speter/* infcodes.h -- header to use infcodes.c
349134768Speter * Copyright (C) 1995-1996 Mark Adler
349234768Speter * For conditions of distribution and use, see copyright notice in zlib.h
349334768Speter */
349434768Speter
349534768Speter/* WARNING: this file should *not* be used by applications. It is
349634768Speter   part of the implementation of the compression library and is
349734768Speter   subject to change. Applications should only use zlib.h.
349834768Speter */
349934768Speter
350034768Speterstruct inflate_codes_state;
350134768Spetertypedef struct inflate_codes_state FAR inflate_codes_statef;
350234768Speter
350334768Speterextern inflate_codes_statef *inflate_codes_new OF((
350434768Speter    uInt, uInt,
350534768Speter    inflate_huft *, inflate_huft *,
350634768Speter    z_streamp ));
350734768Speter
350834768Speterextern int inflate_codes OF((
350934768Speter    inflate_blocks_statef *,
351034768Speter    z_streamp ,
351134768Speter    int));
351234768Speter
351334768Speterextern void inflate_codes_free OF((
351434768Speter    inflate_codes_statef *,
351534768Speter    z_streamp ));
351634768Speter
351734768Speter/* --- infcodes.h */
351834768Speter
351934768Speter/* +++ infutil.h */
352028415Speter/* infutil.h -- types and macros common to blocks and codes
352134768Speter * Copyright (C) 1995-1996 Mark Adler
352228415Speter * For conditions of distribution and use, see copyright notice in zlib.h
352328415Speter */
352428415Speter
352528415Speter/* WARNING: this file should *not* be used by applications. It is
352628415Speter   part of the implementation of the compression library and is
352728415Speter   subject to change. Applications should only use zlib.h.
352828415Speter */
352928415Speter
353034768Speter#ifndef _INFUTIL_H
353134768Speter#define _INFUTIL_H
353228415Speter
353334768Spetertypedef enum {
353428415Speter      TYPE,     /* get type bits (3, including end bit) */
353528415Speter      LENS,     /* get lengths for stored */
353628415Speter      STORED,   /* processing stored block */
353728415Speter      TABLE,    /* get table lengths */
353828415Speter      BTREE,    /* get bit lengths tree for a dynamic block */
353928415Speter      DTREE,    /* get length, distance trees for a dynamic block */
354028415Speter      CODES,    /* processing fixed or dynamic block */
354128415Speter      DRY,      /* output remaining window bytes */
354234768Speter      DONEB,    /* finished last block, done */
354334768Speter      BADB}     /* got a data error--stuck here */
354434768Speterinflate_block_mode;
354528415Speter
354634768Speter/* inflate blocks semi-private state */
354734768Speterstruct inflate_blocks_state {
354834768Speter
354934768Speter  /* mode */
355034768Speter  inflate_block_mode  mode;     /* current inflate_block mode */
355134768Speter
355228415Speter  /* mode dependent information */
355328415Speter  union {
355428415Speter    uInt left;          /* if STORED, bytes left to copy */
355528415Speter    struct {
355628415Speter      uInt table;               /* table lengths (14 bits) */
355728415Speter      uInt index;               /* index into blens (or border) */
355828415Speter      uIntf *blens;             /* bit lengths of codes */
355928415Speter      uInt bb;                  /* bit length tree depth */
356028415Speter      inflate_huft *tb;         /* bit length decoding tree */
356128415Speter    } trees;            /* if DTREE, decoding info for trees */
356228415Speter    struct {
356334768Speter      inflate_huft *tl;
356434768Speter      inflate_huft *td;         /* trees to free */
356528415Speter      inflate_codes_statef
356628415Speter         *codes;
356728415Speter    } decode;           /* if CODES, current state */
356828415Speter  } sub;                /* submode */
356928415Speter  uInt last;            /* true if this block is the last block */
357028415Speter
357128415Speter  /* mode independent information */
357228415Speter  uInt bitk;            /* bits in bit buffer */
357328415Speter  uLong bitb;           /* bit buffer */
357428415Speter  Bytef *window;        /* sliding window */
357528415Speter  Bytef *end;           /* one byte after sliding window */
357628415Speter  Bytef *read;          /* window read pointer */
357728415Speter  Bytef *write;         /* window write pointer */
357828415Speter  check_func checkfn;   /* check function */
357928415Speter  uLong check;          /* check on output */
358028415Speter
358128415Speter};
358228415Speter
358328415Speter
358428415Speter/* defines for inflate input/output */
358528415Speter/*   update pointers and return */
358628415Speter#define UPDBITS {s->bitb=b;s->bitk=k;}
358728415Speter#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
358828415Speter#define UPDOUT {s->write=q;}
358928415Speter#define UPDATE {UPDBITS UPDIN UPDOUT}
359028415Speter#define LEAVE {UPDATE return inflate_flush(s,z,r);}
359128415Speter/*   get bytes and bits */
359228415Speter#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
359328415Speter#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
359428415Speter#define NEXTBYTE (n--,*p++)
359528415Speter#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
359628415Speter#define DUMPBITS(j) {b>>=(j);k-=(j);}
359728415Speter/*   output bytes */
359834768Speter#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
359934768Speter#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
360034768Speter#define WWRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
360128415Speter#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
360234768Speter#define NEEDOUT {if(m==0){WWRAP if(m==0){FLUSH WWRAP if(m==0) LEAVE}}r=Z_OK;}
360328415Speter#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
360428415Speter/*   load local pointers */
360528415Speter#define LOAD {LOADIN LOADOUT}
360628415Speter
360734768Speter/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
360834768Speterextern uInt inflate_mask[17];
360928415Speter
361028415Speter/* copy as much as possible from the sliding window to the output area */
361134768Speterextern int inflate_flush OF((
361228415Speter    inflate_blocks_statef *,
361334768Speter    z_streamp ,
361428415Speter    int));
361528415Speter
361634768Speter#ifndef NO_DUMMY_DECL
361734768Speterstruct internal_state      {int dummy;}; /* for buggy compilers */
361834768Speter#endif
361928415Speter
362034768Speter#endif
362134768Speter/* --- infutil.h */
362228415Speter
362334768Speter#ifndef NO_DUMMY_DECL
362434768Speterstruct inflate_codes_state {int dummy;}; /* for buggy compilers */
362534768Speter#endif
362628415Speter
362728415Speter/* Table for deflate from PKZIP's appnote.txt. */
362834768Speterlocal const uInt border[] = { /* Order of the bit length code lengths */
362928415Speter        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
363028415Speter
363128415Speter/*
363228415Speter   Notes beyond the 1.93a appnote.txt:
363328415Speter
363428415Speter   1. Distance pointers never point before the beginning of the output
363528415Speter      stream.
363628415Speter   2. Distance pointers can point back across blocks, up to 32k away.
363728415Speter   3. There is an implied maximum of 7 bits for the bit length table and
363828415Speter      15 bits for the actual data.
363928415Speter   4. If only one code exists, then it is encoded using one bit.  (Zero
364028415Speter      would be more efficient, but perhaps a little confusing.)  If two
364128415Speter      codes exist, they are coded using one bit each (0 and 1).
364228415Speter   5. There is no way of sending zero distance codes--a dummy must be
364328415Speter      sent if there are none.  (History: a pre 2.0 version of PKZIP would
364428415Speter      store blocks with no distance codes, but this was discovered to be
364528415Speter      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
364628415Speter      zero distance codes, which is sent as one code of zero bits in
364728415Speter      length.
364828415Speter   6. There are up to 286 literal/length codes.  Code 256 represents the
364928415Speter      end-of-block.  Note however that the static length tree defines
365028415Speter      288 codes just to fill out the Huffman codes.  Codes 286 and 287
365128415Speter      cannot be used though, since there is no length base or extra bits
365228415Speter      defined for them.  Similarily, there are up to 30 distance codes.
365328415Speter      However, static trees define 32 codes (all 5 bits) to fill out the
365428415Speter      Huffman codes, but the last two had better not show up in the data.
365528415Speter   7. Unzip can check dynamic Huffman blocks for complete code sets.
365628415Speter      The exception is that a single code would not be complete (see #4).
365728415Speter   8. The five bits following the block type is really the number of
365828415Speter      literal codes sent minus 257.
365928415Speter   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
366028415Speter      (1+6+6).  Therefore, to output three times the length, you output
366128415Speter      three codes (1+1+1), whereas to output four times the same length,
366228415Speter      you only need two codes (1+3).  Hmm.
366328415Speter  10. In the tree reconstruction algorithm, Code = Code + Increment
366428415Speter      only if BitLength(i) is not zero.  (Pretty obvious.)
366528415Speter  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
366628415Speter  12. Note: length code 284 can represent 227-258, but length code 285
366728415Speter      really is 258.  The last length deserves its own, short code
366828415Speter      since it gets used a lot in very redundant files.  The length
366928415Speter      258 is special since 258 - 3 (the min match length) is 255.
367028415Speter  13. The literal/length and distance code bit lengths are read as a
367128415Speter      single stream of lengths.  It is possible (and advantageous) for
367228415Speter      a repeat code (16, 17, or 18) to go across the boundary between
367328415Speter      the two sets of lengths.
367428415Speter */
367528415Speter
367628415Speter
367734768Spetervoid inflate_blocks_reset(s, z, c)
367828415Speterinflate_blocks_statef *s;
367934768Speterz_streamp z;
368028415SpeteruLongf *c;
368128415Speter{
368228415Speter  if (s->checkfn != Z_NULL)
368328415Speter    *c = s->check;
368428415Speter  if (s->mode == BTREE || s->mode == DTREE)
368534768Speter    ZFREE(z, s->sub.trees.blens);
368628415Speter  if (s->mode == CODES)
368728415Speter  {
368828415Speter    inflate_codes_free(s->sub.decode.codes, z);
368928415Speter    inflate_trees_free(s->sub.decode.td, z);
369028415Speter    inflate_trees_free(s->sub.decode.tl, z);
369128415Speter  }
369228415Speter  s->mode = TYPE;
369328415Speter  s->bitk = 0;
369428415Speter  s->bitb = 0;
369528415Speter  s->read = s->write = s->window;
369628415Speter  if (s->checkfn != Z_NULL)
369734768Speter    z->adler = s->check = (*s->checkfn)(0L, Z_NULL, 0);
369828415Speter  Trace((stderr, "inflate:   blocks reset\n"));
369928415Speter}
370028415Speter
370128415Speter
370234768Speterinflate_blocks_statef *inflate_blocks_new(z, c, w)
370334768Speterz_streamp z;
370428415Spetercheck_func c;
370528415SpeteruInt w;
370628415Speter{
370728415Speter  inflate_blocks_statef *s;
370828415Speter
370934768Speter  if ((s = (inflate_blocks_statef *)ZALLOC
371028415Speter       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
371128415Speter    return s;
371234768Speter  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
371328415Speter  {
371434768Speter    ZFREE(z, s);
371528415Speter    return Z_NULL;
371628415Speter  }
371728415Speter  s->end = s->window + w;
371828415Speter  s->checkfn = c;
371928415Speter  s->mode = TYPE;
372028415Speter  Trace((stderr, "inflate:   blocks allocated\n"));
372128415Speter  inflate_blocks_reset(s, z, &s->check);
372228415Speter  return s;
372328415Speter}
372428415Speter
372528415Speter
372634768Speter#ifdef DEBUG_ZLIB
372734768Speter  extern uInt inflate_hufts;
372834768Speter#endif
372934768Speterint inflate_blocks(s, z, r)
373028415Speterinflate_blocks_statef *s;
373134768Speterz_streamp z;
373228415Speterint r;
373328415Speter{
373428415Speter  uInt t;               /* temporary storage */
373528415Speter  uLong b;              /* bit buffer */
373628415Speter  uInt k;               /* bits in bit buffer */
373728415Speter  Bytef *p;             /* input data pointer */
373828415Speter  uInt n;               /* bytes available there */
373928415Speter  Bytef *q;             /* output window write pointer */
374028415Speter  uInt m;               /* bytes to end of window or read pointer */
374128415Speter
374228415Speter  /* copy input/output information to locals (UPDATE macro restores) */
374328415Speter  LOAD
374428415Speter
374528415Speter  /* process input based on current state */
374628415Speter  while (1) switch (s->mode)
374728415Speter  {
374828415Speter    case TYPE:
374928415Speter      NEEDBITS(3)
375028415Speter      t = (uInt)b & 7;
375128415Speter      s->last = t & 1;
375228415Speter      switch (t >> 1)
375328415Speter      {
375428415Speter        case 0:                         /* stored */
375528415Speter          Trace((stderr, "inflate:     stored block%s\n",
375628415Speter                 s->last ? " (last)" : ""));
375728415Speter          DUMPBITS(3)
375828415Speter          t = k & 7;                    /* go to byte boundary */
375928415Speter          DUMPBITS(t)
376028415Speter          s->mode = LENS;               /* get length of stored block */
376128415Speter          break;
376228415Speter        case 1:                         /* fixed */
376328415Speter          Trace((stderr, "inflate:     fixed codes block%s\n",
376428415Speter                 s->last ? " (last)" : ""));
376528415Speter          {
376628415Speter            uInt bl, bd;
376728415Speter            inflate_huft *tl, *td;
376828415Speter
376928415Speter            inflate_trees_fixed(&bl, &bd, &tl, &td);
377028415Speter            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
377128415Speter            if (s->sub.decode.codes == Z_NULL)
377228415Speter            {
377328415Speter              r = Z_MEM_ERROR;
377428415Speter              LEAVE
377528415Speter            }
377628415Speter            s->sub.decode.tl = Z_NULL;  /* don't try to free these */
377728415Speter            s->sub.decode.td = Z_NULL;
377828415Speter          }
377928415Speter          DUMPBITS(3)
378028415Speter          s->mode = CODES;
378128415Speter          break;
378228415Speter        case 2:                         /* dynamic */
378328415Speter          Trace((stderr, "inflate:     dynamic codes block%s\n",
378428415Speter                 s->last ? " (last)" : ""));
378528415Speter          DUMPBITS(3)
378628415Speter          s->mode = TABLE;
378728415Speter          break;
378828415Speter        case 3:                         /* illegal */
378928415Speter          DUMPBITS(3)
379028415Speter          s->mode = BADB;
379134768Speter          z->msg = (char*)"invalid block type";
379228415Speter          r = Z_DATA_ERROR;
379328415Speter          LEAVE
379428415Speter      }
379528415Speter      break;
379628415Speter    case LENS:
379728415Speter      NEEDBITS(32)
379834768Speter      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
379928415Speter      {
380028415Speter        s->mode = BADB;
380134768Speter        z->msg = (char*)"invalid stored block lengths";
380228415Speter        r = Z_DATA_ERROR;
380328415Speter        LEAVE
380428415Speter      }
380528415Speter      s->sub.left = (uInt)b & 0xffff;
380628415Speter      b = k = 0;                      /* dump bits */
380728415Speter      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
380834768Speter      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
380928415Speter      break;
381028415Speter    case STORED:
381128415Speter      if (n == 0)
381228415Speter        LEAVE
381328415Speter      NEEDOUT
381428415Speter      t = s->sub.left;
381528415Speter      if (t > n) t = n;
381628415Speter      if (t > m) t = m;
381728415Speter      zmemcpy(q, p, t);
381828415Speter      p += t;  n -= t;
381928415Speter      q += t;  m -= t;
382028415Speter      if ((s->sub.left -= t) != 0)
382128415Speter        break;
382228415Speter      Tracev((stderr, "inflate:       stored end, %lu total out\n",
382328415Speter              z->total_out + (q >= s->read ? q - s->read :
382428415Speter              (s->end - s->read) + (q - s->window))));
382528415Speter      s->mode = s->last ? DRY : TYPE;
382628415Speter      break;
382728415Speter    case TABLE:
382828415Speter      NEEDBITS(14)
382928415Speter      s->sub.trees.table = t = (uInt)b & 0x3fff;
383028415Speter#ifndef PKZIP_BUG_WORKAROUND
383128415Speter      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
383228415Speter      {
383328415Speter        s->mode = BADB;
383434768Speter        z->msg = (char*)"too many length or distance symbols";
383528415Speter        r = Z_DATA_ERROR;
383628415Speter        LEAVE
383728415Speter      }
383828415Speter#endif
383928415Speter      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
384028415Speter      if (t < 19)
384128415Speter        t = 19;
384228415Speter      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
384328415Speter      {
384428415Speter        r = Z_MEM_ERROR;
384528415Speter        LEAVE
384628415Speter      }
384728415Speter      DUMPBITS(14)
384828415Speter      s->sub.trees.index = 0;
384928415Speter      Tracev((stderr, "inflate:       table sizes ok\n"));
385028415Speter      s->mode = BTREE;
385128415Speter    case BTREE:
385228415Speter      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
385328415Speter      {
385428415Speter        NEEDBITS(3)
385528415Speter        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
385628415Speter        DUMPBITS(3)
385728415Speter      }
385828415Speter      while (s->sub.trees.index < 19)
385928415Speter        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
386028415Speter      s->sub.trees.bb = 7;
386128415Speter      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
386228415Speter                             &s->sub.trees.tb, z);
386328415Speter      if (t != Z_OK)
386428415Speter      {
386528415Speter        r = t;
386690775Sjedgar        if (r == Z_DATA_ERROR) {
386790775Sjedgar          ZFREE(z, s->sub.trees.blens);
386828415Speter          s->mode = BADB;
386990775Sjedgar        }
387028415Speter        LEAVE
387128415Speter      }
387228415Speter      s->sub.trees.index = 0;
387328415Speter      Tracev((stderr, "inflate:       bits tree ok\n"));
387428415Speter      s->mode = DTREE;
387528415Speter    case DTREE:
387628415Speter      while (t = s->sub.trees.table,
387728415Speter             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
387828415Speter      {
387928415Speter        inflate_huft *h;
388028415Speter        uInt i, j, c;
388128415Speter
388228415Speter        t = s->sub.trees.bb;
388328415Speter        NEEDBITS(t)
388428415Speter        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
388528415Speter        t = h->word.what.Bits;
388628415Speter        c = h->more.Base;
388728415Speter        if (c < 16)
388828415Speter        {
388928415Speter          DUMPBITS(t)
389028415Speter          s->sub.trees.blens[s->sub.trees.index++] = c;
389128415Speter        }
389228415Speter        else /* c == 16..18 */
389328415Speter        {
389428415Speter          i = c == 18 ? 7 : c - 14;
389528415Speter          j = c == 18 ? 11 : 3;
389628415Speter          NEEDBITS(t + i)
389728415Speter          DUMPBITS(t)
389828415Speter          j += (uInt)b & inflate_mask[i];
389928415Speter          DUMPBITS(i)
390028415Speter          i = s->sub.trees.index;
390128415Speter          t = s->sub.trees.table;
390228415Speter          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
390328415Speter              (c == 16 && i < 1))
390428415Speter          {
390534768Speter            inflate_trees_free(s->sub.trees.tb, z);
390634768Speter            ZFREE(z, s->sub.trees.blens);
390728415Speter            s->mode = BADB;
390834768Speter            z->msg = (char*)"invalid bit length repeat";
390928415Speter            r = Z_DATA_ERROR;
391028415Speter            LEAVE
391128415Speter          }
391228415Speter          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
391328415Speter          do {
391428415Speter            s->sub.trees.blens[i++] = c;
391528415Speter          } while (--j);
391628415Speter          s->sub.trees.index = i;
391728415Speter        }
391828415Speter      }
391928415Speter      inflate_trees_free(s->sub.trees.tb, z);
392028415Speter      s->sub.trees.tb = Z_NULL;
392128415Speter      {
392228415Speter        uInt bl, bd;
392328415Speter        inflate_huft *tl, *td;
392428415Speter        inflate_codes_statef *c;
392528415Speter
392628415Speter        bl = 9;         /* must be <= 9 for lookahead assumptions */
392728415Speter        bd = 6;         /* must be <= 9 for lookahead assumptions */
392828415Speter        t = s->sub.trees.table;
392934768Speter#ifdef DEBUG_ZLIB
393034768Speter      inflate_hufts = 0;
393134768Speter#endif
393228415Speter        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
393328415Speter                                  s->sub.trees.blens, &bl, &bd, &tl, &td, z);
393428415Speter        if (t != Z_OK)
393528415Speter        {
393690775Sjedgar          if (t == (uInt)Z_DATA_ERROR) {
393790775Sjedgar            ZFREE(z, s->sub.trees.blens);
393828415Speter            s->mode = BADB;
393990775Sjedgar          }
394028415Speter          r = t;
394128415Speter          LEAVE
394228415Speter        }
394334768Speter        Tracev((stderr, "inflate:       trees ok, %d * %d bytes used\n",
394434768Speter              inflate_hufts, sizeof(inflate_huft)));
394528415Speter        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
394628415Speter        {
394728415Speter          inflate_trees_free(td, z);
394828415Speter          inflate_trees_free(tl, z);
394928415Speter          r = Z_MEM_ERROR;
395028415Speter          LEAVE
395128415Speter        }
395292749Sdillon	/*
395392749Sdillon	 * this ZFREE must occur *BEFORE* we mess with sub.decode, because
395492749Sdillon	 * sub.trees is union'd with sub.decode.
395592749Sdillon	 */
395692749Sdillon        ZFREE(z, s->sub.trees.blens);
395728415Speter        s->sub.decode.codes = c;
395828415Speter        s->sub.decode.tl = tl;
395928415Speter        s->sub.decode.td = td;
396028415Speter      }
396128415Speter      s->mode = CODES;
396228415Speter    case CODES:
396328415Speter      UPDATE
396428415Speter      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
396528415Speter        return inflate_flush(s, z, r);
396628415Speter      r = Z_OK;
396728415Speter      inflate_codes_free(s->sub.decode.codes, z);
396828415Speter      inflate_trees_free(s->sub.decode.td, z);
396928415Speter      inflate_trees_free(s->sub.decode.tl, z);
397028415Speter      LOAD
397128415Speter      Tracev((stderr, "inflate:       codes end, %lu total out\n",
397228415Speter              z->total_out + (q >= s->read ? q - s->read :
397328415Speter              (s->end - s->read) + (q - s->window))));
397428415Speter      if (!s->last)
397528415Speter      {
397628415Speter        s->mode = TYPE;
397728415Speter        break;
397828415Speter      }
397928415Speter      if (k > 7)              /* return unused byte, if any */
398028415Speter      {
398128415Speter        Assert(k < 16, "inflate_codes grabbed too many bytes")
398228415Speter        k -= 8;
398328415Speter        n++;
398428415Speter        p--;                    /* can always return one */
398528415Speter      }
398628415Speter      s->mode = DRY;
398728415Speter    case DRY:
398828415Speter      FLUSH
398928415Speter      if (s->read != s->write)
399028415Speter        LEAVE
399128415Speter      s->mode = DONEB;
399228415Speter    case DONEB:
399328415Speter      r = Z_STREAM_END;
399428415Speter      LEAVE
399528415Speter    case BADB:
399628415Speter      r = Z_DATA_ERROR;
399728415Speter      LEAVE
399828415Speter    default:
399928415Speter      r = Z_STREAM_ERROR;
400028415Speter      LEAVE
400128415Speter  }
400228415Speter}
400328415Speter
400428415Speter
400534768Speterint inflate_blocks_free(s, z, c)
400628415Speterinflate_blocks_statef *s;
400734768Speterz_streamp z;
400828415SpeteruLongf *c;
400928415Speter{
401028415Speter  inflate_blocks_reset(s, z, c);
401134768Speter  ZFREE(z, s->window);
401234768Speter  ZFREE(z, s);
401328415Speter  Trace((stderr, "inflate:   blocks freed\n"));
401428415Speter  return Z_OK;
401528415Speter}
401628415Speter
401734768Speter
401834768Spetervoid inflate_set_dictionary(s, d, n)
401934768Speterinflate_blocks_statef *s;
402034768Speterconst Bytef *d;
402134768SpeteruInt  n;
402234768Speter{
402334768Speter  zmemcpy((charf *)s->window, d, n);
402434768Speter  s->read = s->write = s->window + n;
402534768Speter}
402634768Speter
402728415Speter/*
402828415Speter * This subroutine adds the data at next_in/avail_in to the output history
402928415Speter * without performing any output.  The output buffer must be "caught up";
403028415Speter * i.e. no pending output (hence s->read equals s->write), and the state must
403128415Speter * be BLOCKS (i.e. we should be willing to see the start of a series of
403228415Speter * BLOCKS).  On exit, the output will also be caught up, and the checksum
403328415Speter * will have been updated if need be.
403428415Speter */
403534768Speterint inflate_addhistory(s, z)
403628415Speterinflate_blocks_statef *s;
403728415Speterz_stream *z;
403828415Speter{
403928415Speter    uLong b;              /* bit buffer */  /* NOT USED HERE */
404028415Speter    uInt k;               /* bits in bit buffer */ /* NOT USED HERE */
404128415Speter    uInt t;               /* temporary storage */
404228415Speter    Bytef *p;             /* input data pointer */
404328415Speter    uInt n;               /* bytes available there */
404428415Speter    Bytef *q;             /* output window write pointer */
404528415Speter    uInt m;               /* bytes to end of window or read pointer */
404628415Speter
404728415Speter    if (s->read != s->write)
404828415Speter	return Z_STREAM_ERROR;
404928415Speter    if (s->mode != TYPE)
405028415Speter	return Z_DATA_ERROR;
405128415Speter
405228415Speter    /* we're ready to rock */
405328415Speter    LOAD
405428415Speter    /* while there is input ready, copy to output buffer, moving
405528415Speter     * pointers as needed.
405628415Speter     */
405728415Speter    while (n) {
405828415Speter	t = n;  /* how many to do */
405928415Speter	/* is there room until end of buffer? */
406028415Speter	if (t > m) t = m;
406128415Speter	/* update check information */
406228415Speter	if (s->checkfn != Z_NULL)
406328415Speter	    s->check = (*s->checkfn)(s->check, q, t);
406428415Speter	zmemcpy(q, p, t);
406528415Speter	q += t;
406628415Speter	p += t;
406728415Speter	n -= t;
406828415Speter	z->total_out += t;
406928415Speter	s->read = q;    /* drag read pointer forward */
407034768Speter/*      WWRAP  */ 	/* expand WWRAP macro by hand to handle s->read */
407128415Speter	if (q == s->end) {
407228415Speter	    s->read = q = s->window;
407328415Speter	    m = WAVAIL;
407428415Speter	}
407528415Speter    }
407628415Speter    UPDATE
407728415Speter    return Z_OK;
407828415Speter}
407928415Speter
408028415Speter
408128415Speter/*
408228415Speter * At the end of a Deflate-compressed PPP packet, we expect to have seen
408328415Speter * a `stored' block type value but not the (zero) length bytes.
408428415Speter */
408534768Speterint inflate_packet_flush(s)
408628415Speter    inflate_blocks_statef *s;
408728415Speter{
408828415Speter    if (s->mode != LENS)
408928415Speter	return Z_DATA_ERROR;
409028415Speter    s->mode = TYPE;
409128415Speter    return Z_OK;
409228415Speter}
409334768Speter/* --- infblock.c */
409428415Speter
409534768Speter/* +++ inftrees.c */
409628415Speter/* inftrees.c -- generate Huffman trees for efficient decoding
409734768Speter * Copyright (C) 1995-1996 Mark Adler
409828415Speter * For conditions of distribution and use, see copyright notice in zlib.h
409928415Speter */
410028415Speter
410134768Speter/* #include "zutil.h" */
410234768Speter/* #include "inftrees.h" */
410334768Speter
410434768Speterchar inflate_copyright[] = " inflate 1.0.4 Copyright 1995-1996 Mark Adler ";
410534768Speter/*
410634768Speter  If you use the zlib library in a product, an acknowledgment is welcome
410734768Speter  in the documentation of your product. If for some reason you cannot
410834768Speter  include such an acknowledgment, I would appreciate that you keep this
410934768Speter  copyright string in the executable of your product.
411034768Speter */
411134768Speter
411234768Speter#ifndef NO_DUMMY_DECL
411334768Speterstruct internal_state  {int dummy;}; /* for buggy compilers */
411434768Speter#endif
411534768Speter
411628415Speter/* simplify the use of the inflate_huft type with some defines */
411728415Speter#define base more.Base
411828415Speter#define next more.Next
411928415Speter#define exop word.what.Exop
412028415Speter#define bits word.what.Bits
412128415Speter
412228415Speter
412328415Speterlocal int huft_build OF((
412428415Speter    uIntf *,            /* code lengths in bits */
412528415Speter    uInt,               /* number of codes */
412628415Speter    uInt,               /* number of "simple" codes */
412734768Speter    const uIntf *,      /* list of base values for non-simple codes */
412834768Speter    const uIntf *,      /* list of extra bits for non-simple codes */
412928415Speter    inflate_huft * FAR*,/* result: starting table */
413028415Speter    uIntf *,            /* maximum lookup bits (returns actual) */
413134768Speter    z_streamp ));       /* for zalloc function */
413228415Speter
413328415Speterlocal voidpf falloc OF((
413428415Speter    voidpf,             /* opaque pointer (not used) */
413528415Speter    uInt,               /* number of items */
413628415Speter    uInt));             /* size of item */
413728415Speter
413828415Speter/* Tables for deflate from PKZIP's appnote.txt. */
413934768Speterlocal const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
414028415Speter        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
414128415Speter        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
414234768Speter        /* see note #13 above about 258 */
414334768Speterlocal const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
414428415Speter        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
414534768Speter        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
414634768Speterlocal const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
414728415Speter        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
414828415Speter        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
414928415Speter        8193, 12289, 16385, 24577};
415034768Speterlocal const uInt cpdext[30] = { /* Extra bits for distance codes */
415128415Speter        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
415228415Speter        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
415328415Speter        12, 12, 13, 13};
415428415Speter
415528415Speter/*
415628415Speter   Huffman code decoding is performed using a multi-level table lookup.
415728415Speter   The fastest way to decode is to simply build a lookup table whose
415828415Speter   size is determined by the longest code.  However, the time it takes
415928415Speter   to build this table can also be a factor if the data being decoded
416028415Speter   is not very long.  The most common codes are necessarily the
416128415Speter   shortest codes, so those codes dominate the decoding time, and hence
416228415Speter   the speed.  The idea is you can have a shorter table that decodes the
416328415Speter   shorter, more probable codes, and then point to subsidiary tables for
416428415Speter   the longer codes.  The time it costs to decode the longer codes is
416528415Speter   then traded against the time it takes to make longer tables.
416628415Speter
416728415Speter   This results of this trade are in the variables lbits and dbits
416828415Speter   below.  lbits is the number of bits the first level table for literal/
416928415Speter   length codes can decode in one step, and dbits is the same thing for
417028415Speter   the distance codes.  Subsequent tables are also less than or equal to
417128415Speter   those sizes.  These values may be adjusted either when all of the
417228415Speter   codes are shorter than that, in which case the longest code length in
417328415Speter   bits is used, or when the shortest code is *longer* than the requested
417428415Speter   table size, in which case the length of the shortest code in bits is
417528415Speter   used.
417628415Speter
417728415Speter   There are two different values for the two tables, since they code a
417828415Speter   different number of possibilities each.  The literal/length table
417928415Speter   codes 286 possible values, or in a flat code, a little over eight
418028415Speter   bits.  The distance table codes 30 possible values, or a little less
418128415Speter   than five bits, flat.  The optimum values for speed end up being
418228415Speter   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
418328415Speter   The optimum values may differ though from machine to machine, and
418428415Speter   possibly even between compilers.  Your mileage may vary.
418528415Speter */
418628415Speter
418728415Speter
418828415Speter/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
418928415Speter#define BMAX 15         /* maximum bit length of any code */
419028415Speter#define N_MAX 288       /* maximum number of codes in any set */
419128415Speter
419228415Speter#ifdef DEBUG_ZLIB
419328415Speter  uInt inflate_hufts;
419428415Speter#endif
419528415Speter
419628415Speterlocal int huft_build(b, n, s, d, e, t, m, zs)
419728415SpeteruIntf *b;               /* code lengths in bits (all assumed <= BMAX) */
419828415SpeteruInt n;                 /* number of codes (assumed <= N_MAX) */
419928415SpeteruInt s;                 /* number of simple-valued codes (0..s-1) */
420034768Speterconst uIntf *d;         /* list of base values for non-simple codes */
420134768Speterconst uIntf *e;         /* list of extra bits for non-simple codes */
420228415Speterinflate_huft * FAR *t;  /* result: starting table */
420328415SpeteruIntf *m;               /* maximum lookup bits, returns actual */
420434768Speterz_streamp zs;           /* for zalloc function */
420528415Speter/* Given a list of code lengths and a maximum table size, make a set of
420628415Speter   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
420728415Speter   if the given code set is incomplete (the tables are still built in this
420834768Speter   case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
420934768Speter   lengths), or Z_MEM_ERROR if not enough memory. */
421028415Speter{
421128415Speter
421228415Speter  uInt a;                       /* counter for codes of length k */
421328415Speter  uInt c[BMAX+1];               /* bit length count table */
421428415Speter  uInt f;                       /* i repeats in table every f entries */
421528415Speter  int g;                        /* maximum code length */
421628415Speter  int h;                        /* table level */
421728415Speter  register uInt i;              /* counter, current code */
421828415Speter  register uInt j;              /* counter */
421928415Speter  register int k;               /* number of bits in current code */
422028415Speter  int l;                        /* bits per table (returned in m) */
422128415Speter  register uIntf *p;            /* pointer into c[], b[], or v[] */
422228415Speter  inflate_huft *q;              /* points to current table */
422328415Speter  struct inflate_huft_s r;      /* table entry for structure assignment */
422428415Speter  inflate_huft *u[BMAX];        /* table stack */
422528415Speter  uInt v[N_MAX];                /* values in order of bit length */
422628415Speter  register int w;               /* bits before this table == (l * h) */
422728415Speter  uInt x[BMAX+1];               /* bit offsets, then code stack */
422828415Speter  uIntf *xp;                    /* pointer into x */
422928415Speter  int y;                        /* number of dummy codes added */
423028415Speter  uInt z;                       /* number of entries in current table */
423128415Speter
423228415Speter
423328415Speter  /* Generate counts for each bit length */
423428415Speter  p = c;
423528415Speter#define C0 *p++ = 0;
423628415Speter#define C2 C0 C0 C0 C0
423728415Speter#define C4 C2 C2 C2 C2
423828415Speter  C4                            /* clear c[]--assume BMAX+1 is 16 */
423928415Speter  p = b;  i = n;
424028415Speter  do {
424128415Speter    c[*p++]++;                  /* assume all entries <= BMAX */
424228415Speter  } while (--i);
424328415Speter  if (c[0] == n)                /* null input--all zero length codes */
424428415Speter  {
424528415Speter    *t = (inflate_huft *)Z_NULL;
424628415Speter    *m = 0;
424728415Speter    return Z_OK;
424828415Speter  }
424928415Speter
425028415Speter
425128415Speter  /* Find minimum and maximum length, bound *m by those */
425228415Speter  l = *m;
425328415Speter  for (j = 1; j <= BMAX; j++)
425428415Speter    if (c[j])
425528415Speter      break;
425628415Speter  k = j;                        /* minimum code length */
425728415Speter  if ((uInt)l < j)
425828415Speter    l = j;
425928415Speter  for (i = BMAX; i; i--)
426028415Speter    if (c[i])
426128415Speter      break;
426228415Speter  g = i;                        /* maximum code length */
426328415Speter  if ((uInt)l > i)
426428415Speter    l = i;
426528415Speter  *m = l;
426628415Speter
426728415Speter
426828415Speter  /* Adjust last length count to fill out codes, if needed */
426928415Speter  for (y = 1 << j; j < i; j++, y <<= 1)
427028415Speter    if ((y -= c[j]) < 0)
427128415Speter      return Z_DATA_ERROR;
427228415Speter  if ((y -= c[i]) < 0)
427328415Speter    return Z_DATA_ERROR;
427428415Speter  c[i] += y;
427528415Speter
427628415Speter
427728415Speter  /* Generate starting offsets into the value table for each length */
427828415Speter  x[1] = j = 0;
427928415Speter  p = c + 1;  xp = x + 2;
428028415Speter  while (--i) {                 /* note that i == g from above */
428128415Speter    *xp++ = (j += *p++);
428228415Speter  }
428328415Speter
428428415Speter
428528415Speter  /* Make a table of values in order of bit lengths */
428628415Speter  p = b;  i = 0;
428728415Speter  do {
428828415Speter    if ((j = *p++) != 0)
428928415Speter      v[x[j]++] = i;
429028415Speter  } while (++i < n);
429134768Speter  n = x[g];                   /* set n to length of v */
429228415Speter
429328415Speter
429428415Speter  /* Generate the Huffman codes and for each, make the table entries */
429528415Speter  x[0] = i = 0;                 /* first Huffman code is zero */
429628415Speter  p = v;                        /* grab values in bit order */
429728415Speter  h = -1;                       /* no tables yet--level -1 */
429828415Speter  w = -l;                       /* bits decoded == (l * h) */
429928415Speter  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */
430028415Speter  q = (inflate_huft *)Z_NULL;   /* ditto */
430128415Speter  z = 0;                        /* ditto */
430228415Speter
430328415Speter  /* go through the bit lengths (k already is bits in shortest code) */
430428415Speter  for (; k <= g; k++)
430528415Speter  {
430628415Speter    a = c[k];
430728415Speter    while (a--)
430828415Speter    {
430928415Speter      /* here i is the Huffman code of length k bits for value *p */
431028415Speter      /* make tables up to required level */
431128415Speter      while (k > w + l)
431228415Speter      {
431328415Speter        h++;
431428415Speter        w += l;                 /* previous table always l bits */
431528415Speter
431628415Speter        /* compute minimum size table less than or equal to l bits */
431734768Speter        z = g - w;
431834768Speter        z = z > (uInt)l ? l : z;        /* table size upper limit */
431928415Speter        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
432028415Speter        {                       /* too few codes for k-w bit table */
432128415Speter          f -= a + 1;           /* deduct codes from patterns left */
432228415Speter          xp = c + k;
432328415Speter          if (j < z)
432428415Speter            while (++j < z)     /* try smaller tables up to z bits */
432528415Speter            {
432628415Speter              if ((f <<= 1) <= *++xp)
432728415Speter                break;          /* enough codes to use up j bits */
432828415Speter              f -= *xp;         /* else deduct codes from patterns */
432928415Speter            }
433028415Speter        }
433128415Speter        z = 1 << j;             /* table entries for j-bit table */
433228415Speter
433328415Speter        /* allocate and link in new table */
433428415Speter        if ((q = (inflate_huft *)ZALLOC
433528415Speter             (zs,z + 1,sizeof(inflate_huft))) == Z_NULL)
433628415Speter        {
433728415Speter          if (h)
433828415Speter            inflate_trees_free(u[0], zs);
433928415Speter          return Z_MEM_ERROR;   /* not enough memory */
434028415Speter        }
434128415Speter#ifdef DEBUG_ZLIB
434228415Speter        inflate_hufts += z + 1;
434328415Speter#endif
434428415Speter        *t = q + 1;             /* link to list for huft_free() */
434528415Speter        *(t = &(q->next)) = Z_NULL;
434628415Speter        u[h] = ++q;             /* table starts after link */
434728415Speter
434828415Speter        /* connect to last table, if there is one */
434928415Speter        if (h)
435028415Speter        {
435128415Speter          x[h] = i;             /* save pattern for backing up */
435228415Speter          r.bits = (Byte)l;     /* bits to dump before this table */
435328415Speter          r.exop = (Byte)j;     /* bits in this table */
435428415Speter          r.next = q;           /* pointer to this table */
435528415Speter          j = i >> (w - l);     /* (get around Turbo C bug) */
435628415Speter          u[h-1][j] = r;        /* connect to last table */
435728415Speter        }
435828415Speter      }
435928415Speter
436028415Speter      /* set up table entry in r */
436128415Speter      r.bits = (Byte)(k - w);
436228415Speter      if (p >= v + n)
436328415Speter        r.exop = 128 + 64;      /* out of values--invalid code */
436428415Speter      else if (*p < s)
436528415Speter      {
436628415Speter        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */
436728415Speter        r.base = *p++;          /* simple code is just the value */
436828415Speter      }
436928415Speter      else
437028415Speter      {
437134768Speter        r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
437228415Speter        r.base = d[*p++ - s];
437328415Speter      }
437428415Speter
437528415Speter      /* fill code-like entries with r */
437628415Speter      f = 1 << (k - w);
437728415Speter      for (j = i >> w; j < z; j += f)
437828415Speter        q[j] = r;
437928415Speter
438028415Speter      /* backwards increment the k-bit code i */
438128415Speter      for (j = 1 << (k - 1); i & j; j >>= 1)
438228415Speter        i ^= j;
438328415Speter      i ^= j;
438428415Speter
438528415Speter      /* backup over finished tables */
438628415Speter      while ((i & ((1 << w) - 1)) != x[h])
438728415Speter      {
438828415Speter        h--;                    /* don't need to update q */
438928415Speter        w -= l;
439028415Speter      }
439128415Speter    }
439228415Speter  }
439328415Speter
439428415Speter
439528415Speter  /* Return Z_BUF_ERROR if we were given an incomplete table */
439628415Speter  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
439728415Speter}
439828415Speter
439928415Speter
440034768Speterint inflate_trees_bits(c, bb, tb, z)
440128415SpeteruIntf *c;               /* 19 code lengths */
440228415SpeteruIntf *bb;              /* bits tree desired/actual depth */
440328415Speterinflate_huft * FAR *tb; /* bits tree result */
440434768Speterz_streamp z;            /* for zfree function */
440528415Speter{
440628415Speter  int r;
440728415Speter
440828415Speter  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);
440928415Speter  if (r == Z_DATA_ERROR)
441034768Speter    z->msg = (char*)"oversubscribed dynamic bit lengths tree";
441134768Speter  else if (r == Z_BUF_ERROR || *bb == 0)
441228415Speter  {
441328415Speter    inflate_trees_free(*tb, z);
441434768Speter    z->msg = (char*)"incomplete dynamic bit lengths tree";
441528415Speter    r = Z_DATA_ERROR;
441628415Speter  }
441728415Speter  return r;
441828415Speter}
441928415Speter
442028415Speter
442134768Speterint inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z)
442228415SpeteruInt nl;                /* number of literal/length codes */
442328415SpeteruInt nd;                /* number of distance codes */
442428415SpeteruIntf *c;               /* that many (total) code lengths */
442528415SpeteruIntf *bl;              /* literal desired/actual bit depth */
442628415SpeteruIntf *bd;              /* distance desired/actual bit depth */
442728415Speterinflate_huft * FAR *tl; /* literal/length tree result */
442828415Speterinflate_huft * FAR *td; /* distance tree result */
442934768Speterz_streamp z;            /* for zfree function */
443028415Speter{
443128415Speter  int r;
443228415Speter
443328415Speter  /* build literal/length tree */
443434768Speter  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z);
443534768Speter  if (r != Z_OK || *bl == 0)
443628415Speter  {
443728415Speter    if (r == Z_DATA_ERROR)
443834768Speter      z->msg = (char*)"oversubscribed literal/length tree";
443934768Speter    else if (r != Z_MEM_ERROR)
444028415Speter    {
444128415Speter      inflate_trees_free(*tl, z);
444234768Speter      z->msg = (char*)"incomplete literal/length tree";
444328415Speter      r = Z_DATA_ERROR;
444428415Speter    }
444528415Speter    return r;
444628415Speter  }
444728415Speter
444828415Speter  /* build distance tree */
444934768Speter  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z);
445034768Speter  if (r != Z_OK || (*bd == 0 && nl > 257))
445128415Speter  {
445228415Speter    if (r == Z_DATA_ERROR)
445334768Speter      z->msg = (char*)"oversubscribed distance tree";
445428415Speter    else if (r == Z_BUF_ERROR) {
445528415Speter#ifdef PKZIP_BUG_WORKAROUND
445628415Speter      r = Z_OK;
445728415Speter    }
445828415Speter#else
445928415Speter      inflate_trees_free(*td, z);
446034768Speter      z->msg = (char*)"incomplete distance tree";
446128415Speter      r = Z_DATA_ERROR;
446228415Speter    }
446334768Speter    else if (r != Z_MEM_ERROR)
446434768Speter    {
446534768Speter      z->msg = (char*)"empty distance tree with lengths";
446634768Speter      r = Z_DATA_ERROR;
446734768Speter    }
446828415Speter    inflate_trees_free(*tl, z);
446928415Speter    return r;
447028415Speter#endif
447128415Speter  }
447228415Speter
447328415Speter  /* done */
447428415Speter  return Z_OK;
447528415Speter}
447628415Speter
447728415Speter
447828415Speter/* build fixed tables only once--keep them here */
447928415Speterlocal int fixed_built = 0;
448028415Speter#define FIXEDH 530      /* number of hufts used by fixed tables */
448128415Speterlocal inflate_huft fixed_mem[FIXEDH];
448228415Speterlocal uInt fixed_bl;
448328415Speterlocal uInt fixed_bd;
448428415Speterlocal inflate_huft *fixed_tl;
448528415Speterlocal inflate_huft *fixed_td;
448628415Speter
448728415Speter
448828415Speterlocal voidpf falloc(q, n, s)
448934768Spetervoidpf q;       /* opaque pointer */
449028415SpeteruInt n;         /* number of items */
449128415SpeteruInt s;         /* size of item */
449228415Speter{
449334768Speter  Assert(s == sizeof(inflate_huft) && n <= *(intf *)q,
449428415Speter         "inflate_trees falloc overflow");
449534768Speter  *(intf *)q -= n+s-s; /* s-s to avoid warning */
449634768Speter  return (voidpf)(fixed_mem + *(intf *)q);
449728415Speter}
449828415Speter
449928415Speter
450034768Speterint inflate_trees_fixed(bl, bd, tl, td)
450128415SpeteruIntf *bl;               /* literal desired/actual bit depth */
450228415SpeteruIntf *bd;               /* distance desired/actual bit depth */
450328415Speterinflate_huft * FAR *tl;  /* literal/length tree result */
450428415Speterinflate_huft * FAR *td;  /* distance tree result */
450528415Speter{
450634768Speter  /* build fixed tables if not already (multiple overlapped executions ok) */
450728415Speter  if (!fixed_built)
450828415Speter  {
450928415Speter    int k;              /* temporary variable */
451028415Speter    unsigned c[288];    /* length list for huft_build */
451128415Speter    z_stream z;         /* for falloc function */
451234768Speter    int f = FIXEDH;     /* number of hufts left in fixed_mem */
451328415Speter
451428415Speter    /* set up fake z_stream for memory routines */
451528415Speter    z.zalloc = falloc;
451634768Speter    z.zfree = Z_NULL;
451734768Speter    z.opaque = (voidpf)&f;
451828415Speter
451928415Speter    /* literal table */
452028415Speter    for (k = 0; k < 144; k++)
452128415Speter      c[k] = 8;
452228415Speter    for (; k < 256; k++)
452328415Speter      c[k] = 9;
452428415Speter    for (; k < 280; k++)
452528415Speter      c[k] = 7;
452628415Speter    for (; k < 288; k++)
452728415Speter      c[k] = 8;
452828415Speter    fixed_bl = 7;
452928415Speter    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, &z);
453028415Speter
453128415Speter    /* distance table */
453228415Speter    for (k = 0; k < 30; k++)
453328415Speter      c[k] = 5;
453428415Speter    fixed_bd = 5;
453528415Speter    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z);
453628415Speter
453728415Speter    /* done */
453834768Speter    Assert(f == 0, "invalid build of fixed tables");
453928415Speter    fixed_built = 1;
454028415Speter  }
454128415Speter  *bl = fixed_bl;
454228415Speter  *bd = fixed_bd;
454328415Speter  *tl = fixed_tl;
454428415Speter  *td = fixed_td;
454528415Speter  return Z_OK;
454628415Speter}
454728415Speter
454828415Speter
454934768Speterint inflate_trees_free(t, z)
455028415Speterinflate_huft *t;        /* table to free */
455134768Speterz_streamp z;            /* for zfree function */
455228415Speter/* Free the malloc'ed tables built by huft_build(), which makes a linked
455328415Speter   list of the tables it made, with the links in a dummy first entry of
455428415Speter   each table. */
455528415Speter{
455634768Speter  register inflate_huft *p, *q, *r;
455728415Speter
455834768Speter  /* Reverse linked list */
455934768Speter  p = Z_NULL;
456034768Speter  q = t;
456134768Speter  while (q != Z_NULL)
456234768Speter  {
456334768Speter    r = (q - 1)->next;
456434768Speter    (q - 1)->next = p;
456534768Speter    p = q;
456634768Speter    q = r;
456734768Speter  }
456828415Speter  /* Go through linked list, freeing from the malloced (t[-1]) address. */
456928415Speter  while (p != Z_NULL)
457028415Speter  {
457128415Speter    q = (--p)->next;
457234768Speter    ZFREE(z,p);
457328415Speter    p = q;
457428415Speter  }
457528415Speter  return Z_OK;
457628415Speter}
457734768Speter/* --- inftrees.c */
457828415Speter
457934768Speter/* +++ infcodes.c */
458028415Speter/* infcodes.c -- process literals and length/distance pairs
458134768Speter * Copyright (C) 1995-1996 Mark Adler
458228415Speter * For conditions of distribution and use, see copyright notice in zlib.h
458328415Speter */
458428415Speter
458534768Speter/* #include "zutil.h" */
458634768Speter/* #include "inftrees.h" */
458734768Speter/* #include "infblock.h" */
458834768Speter/* #include "infcodes.h" */
458934768Speter/* #include "infutil.h" */
459034768Speter
459134768Speter/* +++ inffast.h */
459234768Speter/* inffast.h -- header to use inffast.c
459334768Speter * Copyright (C) 1995-1996 Mark Adler
459434768Speter * For conditions of distribution and use, see copyright notice in zlib.h
459534768Speter */
459634768Speter
459734768Speter/* WARNING: this file should *not* be used by applications. It is
459834768Speter   part of the implementation of the compression library and is
459934768Speter   subject to change. Applications should only use zlib.h.
460034768Speter */
460134768Speter
460234768Speterextern int inflate_fast OF((
460334768Speter    uInt,
460434768Speter    uInt,
460534768Speter    inflate_huft *,
460634768Speter    inflate_huft *,
460734768Speter    inflate_blocks_statef *,
460834768Speter    z_streamp ));
460934768Speter/* --- inffast.h */
461034768Speter
461128415Speter/* simplify the use of the inflate_huft type with some defines */
461228415Speter#define base more.Base
461328415Speter#define next more.Next
461428415Speter#define exop word.what.Exop
461528415Speter#define bits word.what.Bits
461628415Speter
461728415Speter/* inflate codes private state */
461828415Speterstruct inflate_codes_state {
461928415Speter
462028415Speter  /* mode */
462128415Speter  enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
462228415Speter      START,    /* x: set up for LEN */
462328415Speter      LEN,      /* i: get length/literal/eob next */
462428415Speter      LENEXT,   /* i: getting length extra (have base) */
462528415Speter      DIST,     /* i: get distance next */
462628415Speter      DISTEXT,  /* i: getting distance extra */
462728415Speter      COPY,     /* o: copying bytes in window, waiting for space */
462828415Speter      LIT,      /* o: got literal, waiting for output space */
462928415Speter      WASH,     /* o: got eob, possibly still output waiting */
463028415Speter      END,      /* x: got eob and all data flushed */
463128415Speter      BADCODE}  /* x: got error */
463228415Speter    mode;               /* current inflate_codes mode */
463328415Speter
463428415Speter  /* mode dependent information */
463528415Speter  uInt len;
463628415Speter  union {
463728415Speter    struct {
463828415Speter      inflate_huft *tree;       /* pointer into tree */
463928415Speter      uInt need;                /* bits needed */
464028415Speter    } code;             /* if LEN or DIST, where in tree */
464128415Speter    uInt lit;           /* if LIT, literal */
464228415Speter    struct {
464328415Speter      uInt get;                 /* bits to get for extra */
464428415Speter      uInt dist;                /* distance back to copy from */
464528415Speter    } copy;             /* if EXT or COPY, where and how much */
464628415Speter  } sub;                /* submode */
464728415Speter
464828415Speter  /* mode independent information */
464928415Speter  Byte lbits;           /* ltree bits decoded per branch */
465028415Speter  Byte dbits;           /* dtree bits decoder per branch */
465128415Speter  inflate_huft *ltree;          /* literal/length/eob tree */
465228415Speter  inflate_huft *dtree;          /* distance tree */
465328415Speter
465428415Speter};
465528415Speter
465628415Speter
465734768Speterinflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
465828415SpeteruInt bl, bd;
465934768Speterinflate_huft *tl;
466034768Speterinflate_huft *td; /* need separate declaration for Borland C++ */
466134768Speterz_streamp z;
466228415Speter{
466328415Speter  inflate_codes_statef *c;
466428415Speter
466528415Speter  if ((c = (inflate_codes_statef *)
466628415Speter       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
466728415Speter  {
466828415Speter    c->mode = START;
466928415Speter    c->lbits = (Byte)bl;
467028415Speter    c->dbits = (Byte)bd;
467128415Speter    c->ltree = tl;
467228415Speter    c->dtree = td;
467328415Speter    Tracev((stderr, "inflate:       codes new\n"));
467428415Speter  }
467528415Speter  return c;
467628415Speter}
467728415Speter
467828415Speter
467934768Speterint inflate_codes(s, z, r)
468028415Speterinflate_blocks_statef *s;
468134768Speterz_streamp z;
468228415Speterint r;
468328415Speter{
468428415Speter  uInt j;               /* temporary storage */
468528415Speter  inflate_huft *t;      /* temporary pointer */
468628415Speter  uInt e;               /* extra bits or operation */
468728415Speter  uLong b;              /* bit buffer */
468828415Speter  uInt k;               /* bits in bit buffer */
468928415Speter  Bytef *p;             /* input data pointer */
469028415Speter  uInt n;               /* bytes available there */
469128415Speter  Bytef *q;             /* output window write pointer */
469228415Speter  uInt m;               /* bytes to end of window or read pointer */
469328415Speter  Bytef *f;             /* pointer to copy strings from */
469428415Speter  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */
469528415Speter
469628415Speter  /* copy input/output information to locals (UPDATE macro restores) */
469728415Speter  LOAD
469828415Speter
469928415Speter  /* process input and output based on current state */
470028415Speter  while (1) switch (c->mode)
470128415Speter  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
470228415Speter    case START:         /* x: set up for LEN */
470328415Speter#ifndef SLOW
470428415Speter      if (m >= 258 && n >= 10)
470528415Speter      {
470628415Speter        UPDATE
470728415Speter        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
470828415Speter        LOAD
470928415Speter        if (r != Z_OK)
471028415Speter        {
471128415Speter          c->mode = r == Z_STREAM_END ? WASH : BADCODE;
471228415Speter          break;
471328415Speter        }
471428415Speter      }
471528415Speter#endif /* !SLOW */
471628415Speter      c->sub.code.need = c->lbits;
471728415Speter      c->sub.code.tree = c->ltree;
471828415Speter      c->mode = LEN;
471928415Speter    case LEN:           /* i: get length/literal/eob next */
472028415Speter      j = c->sub.code.need;
472128415Speter      NEEDBITS(j)
472228415Speter      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
472328415Speter      DUMPBITS(t->bits)
472428415Speter      e = (uInt)(t->exop);
472528415Speter      if (e == 0)               /* literal */
472628415Speter      {
472728415Speter        c->sub.lit = t->base;
472828415Speter        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
472928415Speter                 "inflate:         literal '%c'\n" :
473028415Speter                 "inflate:         literal 0x%02x\n", t->base));
473128415Speter        c->mode = LIT;
473228415Speter        break;
473328415Speter      }
473428415Speter      if (e & 16)               /* length */
473528415Speter      {
473628415Speter        c->sub.copy.get = e & 15;
473728415Speter        c->len = t->base;
473828415Speter        c->mode = LENEXT;
473928415Speter        break;
474028415Speter      }
474128415Speter      if ((e & 64) == 0)        /* next table */
474228415Speter      {
474328415Speter        c->sub.code.need = e;
474428415Speter        c->sub.code.tree = t->next;
474528415Speter        break;
474628415Speter      }
474728415Speter      if (e & 32)               /* end of block */
474828415Speter      {
474928415Speter        Tracevv((stderr, "inflate:         end of block\n"));
475028415Speter        c->mode = WASH;
475128415Speter        break;
475228415Speter      }
475328415Speter      c->mode = BADCODE;        /* invalid code */
475434768Speter      z->msg = (char*)"invalid literal/length code";
475528415Speter      r = Z_DATA_ERROR;
475628415Speter      LEAVE
475728415Speter    case LENEXT:        /* i: getting length extra (have base) */
475828415Speter      j = c->sub.copy.get;
475928415Speter      NEEDBITS(j)
476028415Speter      c->len += (uInt)b & inflate_mask[j];
476128415Speter      DUMPBITS(j)
476228415Speter      c->sub.code.need = c->dbits;
476328415Speter      c->sub.code.tree = c->dtree;
476428415Speter      Tracevv((stderr, "inflate:         length %u\n", c->len));
476528415Speter      c->mode = DIST;
476628415Speter    case DIST:          /* i: get distance next */
476728415Speter      j = c->sub.code.need;
476828415Speter      NEEDBITS(j)
476928415Speter      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
477028415Speter      DUMPBITS(t->bits)
477128415Speter      e = (uInt)(t->exop);
477228415Speter      if (e & 16)               /* distance */
477328415Speter      {
477428415Speter        c->sub.copy.get = e & 15;
477528415Speter        c->sub.copy.dist = t->base;
477628415Speter        c->mode = DISTEXT;
477728415Speter        break;
477828415Speter      }
477928415Speter      if ((e & 64) == 0)        /* next table */
478028415Speter      {
478128415Speter        c->sub.code.need = e;
478228415Speter        c->sub.code.tree = t->next;
478328415Speter        break;
478428415Speter      }
478528415Speter      c->mode = BADCODE;        /* invalid code */
478634768Speter      z->msg = (char*)"invalid distance code";
478728415Speter      r = Z_DATA_ERROR;
478828415Speter      LEAVE
478928415Speter    case DISTEXT:       /* i: getting distance extra */
479028415Speter      j = c->sub.copy.get;
479128415Speter      NEEDBITS(j)
479228415Speter      c->sub.copy.dist += (uInt)b & inflate_mask[j];
479328415Speter      DUMPBITS(j)
479428415Speter      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist));
479528415Speter      c->mode = COPY;
479628415Speter    case COPY:          /* o: copying bytes in window, waiting for space */
479728415Speter#ifndef __TURBOC__ /* Turbo C bug for following expression */
479828415Speter      f = (uInt)(q - s->window) < c->sub.copy.dist ?
479928415Speter          s->end - (c->sub.copy.dist - (q - s->window)) :
480028415Speter          q - c->sub.copy.dist;
480128415Speter#else
480228415Speter      f = q - c->sub.copy.dist;
480328415Speter      if ((uInt)(q - s->window) < c->sub.copy.dist)
480434768Speter        f = s->end - (c->sub.copy.dist - (uInt)(q - s->window));
480528415Speter#endif
480628415Speter      while (c->len)
480728415Speter      {
480828415Speter        NEEDOUT
480928415Speter        OUTBYTE(*f++)
481028415Speter        if (f == s->end)
481128415Speter          f = s->window;
481228415Speter        c->len--;
481328415Speter      }
481428415Speter      c->mode = START;
481528415Speter      break;
481628415Speter    case LIT:           /* o: got literal, waiting for output space */
481728415Speter      NEEDOUT
481828415Speter      OUTBYTE(c->sub.lit)
481928415Speter      c->mode = START;
482028415Speter      break;
482128415Speter    case WASH:          /* o: got eob, possibly more output */
482228415Speter      FLUSH
482328415Speter      if (s->read != s->write)
482428415Speter        LEAVE
482528415Speter      c->mode = END;
482628415Speter    case END:
482728415Speter      r = Z_STREAM_END;
482828415Speter      LEAVE
482928415Speter    case BADCODE:       /* x: got error */
483028415Speter      r = Z_DATA_ERROR;
483128415Speter      LEAVE
483228415Speter    default:
483328415Speter      r = Z_STREAM_ERROR;
483428415Speter      LEAVE
483528415Speter  }
483628415Speter}
483728415Speter
483828415Speter
483934768Spetervoid inflate_codes_free(c, z)
484028415Speterinflate_codes_statef *c;
484134768Speterz_streamp z;
484228415Speter{
484334768Speter  ZFREE(z, c);
484428415Speter  Tracev((stderr, "inflate:       codes free\n"));
484528415Speter}
484634768Speter/* --- infcodes.c */
484728415Speter
484834768Speter/* +++ infutil.c */
484928415Speter/* inflate_util.c -- data and routines common to blocks and codes
485034768Speter * Copyright (C) 1995-1996 Mark Adler
485128415Speter * For conditions of distribution and use, see copyright notice in zlib.h
485228415Speter */
485328415Speter
485434768Speter/* #include "zutil.h" */
485534768Speter/* #include "infblock.h" */
485634768Speter/* #include "inftrees.h" */
485734768Speter/* #include "infcodes.h" */
485834768Speter/* #include "infutil.h" */
485934768Speter
486034768Speter#ifndef NO_DUMMY_DECL
486134768Speterstruct inflate_codes_state {int dummy;}; /* for buggy compilers */
486234768Speter#endif
486334768Speter
486434768Speter/* And'ing with mask[n] masks the lower n bits */
486534768SpeteruInt inflate_mask[17] = {
486634768Speter    0x0000,
486734768Speter    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
486834768Speter    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
486934768Speter};
487034768Speter
487134768Speter
487228415Speter/* copy as much as possible from the sliding window to the output area */
487334768Speterint inflate_flush(s, z, r)
487428415Speterinflate_blocks_statef *s;
487534768Speterz_streamp z;
487628415Speterint r;
487728415Speter{
487828415Speter  uInt n;
487934768Speter  Bytef *p;
488034768Speter  Bytef *q;
488128415Speter
488228415Speter  /* local copies of source and destination pointers */
488328415Speter  p = z->next_out;
488428415Speter  q = s->read;
488528415Speter
488628415Speter  /* compute number of bytes to copy as far as end of window */
488728415Speter  n = (uInt)((q <= s->write ? s->write : s->end) - q);
488828415Speter  if (n > z->avail_out) n = z->avail_out;
488928415Speter  if (n && r == Z_BUF_ERROR) r = Z_OK;
489028415Speter
489128415Speter  /* update counters */
489228415Speter  z->avail_out -= n;
489328415Speter  z->total_out += n;
489428415Speter
489528415Speter  /* update check information */
489628415Speter  if (s->checkfn != Z_NULL)
489734768Speter    z->adler = s->check = (*s->checkfn)(s->check, q, n);
489828415Speter
489928415Speter  /* copy as far as end of window */
490034768Speter  if (p != Z_NULL) {
490128415Speter    zmemcpy(p, q, n);
490228415Speter    p += n;
490328415Speter  }
490428415Speter  q += n;
490528415Speter
490628415Speter  /* see if more to copy at beginning of window */
490728415Speter  if (q == s->end)
490828415Speter  {
490928415Speter    /* wrap pointers */
491028415Speter    q = s->window;
491128415Speter    if (s->write == s->end)
491228415Speter      s->write = s->window;
491328415Speter
491428415Speter    /* compute bytes to copy */
491528415Speter    n = (uInt)(s->write - q);
491628415Speter    if (n > z->avail_out) n = z->avail_out;
491728415Speter    if (n && r == Z_BUF_ERROR) r = Z_OK;
491828415Speter
491928415Speter    /* update counters */
492028415Speter    z->avail_out -= n;
492128415Speter    z->total_out += n;
492228415Speter
492328415Speter    /* update check information */
492428415Speter    if (s->checkfn != Z_NULL)
492534768Speter      z->adler = s->check = (*s->checkfn)(s->check, q, n);
492628415Speter
492728415Speter    /* copy */
492834768Speter    if (p != Z_NULL) {
492928415Speter      zmemcpy(p, q, n);
493028415Speter      p += n;
493128415Speter    }
493228415Speter    q += n;
493328415Speter  }
493428415Speter
493528415Speter  /* update pointers */
493628415Speter  z->next_out = p;
493728415Speter  s->read = q;
493828415Speter
493928415Speter  /* done */
494028415Speter  return r;
494128415Speter}
494234768Speter/* --- infutil.c */
494328415Speter
494434768Speter/* +++ inffast.c */
494528415Speter/* inffast.c -- process literals and length/distance pairs fast
494634768Speter * Copyright (C) 1995-1996 Mark Adler
494728415Speter * For conditions of distribution and use, see copyright notice in zlib.h
494828415Speter */
494928415Speter
495034768Speter/* #include "zutil.h" */
495134768Speter/* #include "inftrees.h" */
495234768Speter/* #include "infblock.h" */
495334768Speter/* #include "infcodes.h" */
495434768Speter/* #include "infutil.h" */
495534768Speter/* #include "inffast.h" */
495634768Speter
495734768Speter#ifndef NO_DUMMY_DECL
495834768Speterstruct inflate_codes_state {int dummy;}; /* for buggy compilers */
495934768Speter#endif
496034768Speter
496128415Speter/* simplify the use of the inflate_huft type with some defines */
496228415Speter#define base more.Base
496328415Speter#define next more.Next
496428415Speter#define exop word.what.Exop
496528415Speter#define bits word.what.Bits
496628415Speter
496728415Speter/* macros for bit input with no checking and for returning unused bytes */
496828415Speter#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
496928415Speter#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;}
497028415Speter
497128415Speter/* Called with number of bytes left to write in window at least 258
497228415Speter   (the maximum string length) and number of input bytes available
497328415Speter   at least ten.  The ten bytes are six bytes for the longest length/
497428415Speter   distance pair plus four bytes for overloading the bit buffer. */
497528415Speter
497634768Speterint inflate_fast(bl, bd, tl, td, s, z)
497728415SpeteruInt bl, bd;
497834768Speterinflate_huft *tl;
497934768Speterinflate_huft *td; /* need separate declaration for Borland C++ */
498028415Speterinflate_blocks_statef *s;
498134768Speterz_streamp z;
498228415Speter{
498328415Speter  inflate_huft *t;      /* temporary pointer */
498428415Speter  uInt e;               /* extra bits or operation */
498528415Speter  uLong b;              /* bit buffer */
498628415Speter  uInt k;               /* bits in bit buffer */
498728415Speter  Bytef *p;             /* input data pointer */
498828415Speter  uInt n;               /* bytes available there */
498928415Speter  Bytef *q;             /* output window write pointer */
499028415Speter  uInt m;               /* bytes to end of window or read pointer */
499128415Speter  uInt ml;              /* mask for literal/length tree */
499228415Speter  uInt md;              /* mask for distance tree */
499328415Speter  uInt c;               /* bytes to copy */
499428415Speter  uInt d;               /* distance back to copy from */
499528415Speter  Bytef *r;             /* copy source pointer */
499628415Speter
499728415Speter  /* load input, output, bit values */
499828415Speter  LOAD
499928415Speter
500028415Speter  /* initialize masks */
500128415Speter  ml = inflate_mask[bl];
500228415Speter  md = inflate_mask[bd];
500328415Speter
500428415Speter  /* do until not enough input or output space for fast loop */
500528415Speter  do {                          /* assume called with m >= 258 && n >= 10 */
500628415Speter    /* get literal/length code */
500728415Speter    GRABBITS(20)                /* max bits for literal/length code */
500828415Speter    if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
500928415Speter    {
501028415Speter      DUMPBITS(t->bits)
501128415Speter      Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
501228415Speter                "inflate:         * literal '%c'\n" :
501328415Speter                "inflate:         * literal 0x%02x\n", t->base));
501428415Speter      *q++ = (Byte)t->base;
501528415Speter      m--;
501628415Speter      continue;
501728415Speter    }
501828415Speter    do {
501928415Speter      DUMPBITS(t->bits)
502028415Speter      if (e & 16)
502128415Speter      {
502228415Speter        /* get extra bits for length */
502328415Speter        e &= 15;
502428415Speter        c = t->base + ((uInt)b & inflate_mask[e]);
502528415Speter        DUMPBITS(e)
502628415Speter        Tracevv((stderr, "inflate:         * length %u\n", c));
502728415Speter
502828415Speter        /* decode distance base of block to copy */
502928415Speter        GRABBITS(15);           /* max bits for distance code */
503028415Speter        e = (t = td + ((uInt)b & md))->exop;
503128415Speter        do {
503228415Speter          DUMPBITS(t->bits)
503328415Speter          if (e & 16)
503428415Speter          {
503528415Speter            /* get extra bits to add to distance base */
503628415Speter            e &= 15;
503728415Speter            GRABBITS(e)         /* get extra bits (up to 13) */
503828415Speter            d = t->base + ((uInt)b & inflate_mask[e]);
503928415Speter            DUMPBITS(e)
504028415Speter            Tracevv((stderr, "inflate:         * distance %u\n", d));
504128415Speter
504228415Speter            /* do the copy */
504328415Speter            m -= c;
504428415Speter            if ((uInt)(q - s->window) >= d)     /* offset before dest */
504528415Speter            {                                   /*  just copy */
504628415Speter              r = q - d;
504728415Speter              *q++ = *r++;  c--;        /* minimum count is three, */
504828415Speter              *q++ = *r++;  c--;        /*  so unroll loop a little */
504928415Speter            }
505028415Speter            else                        /* else offset after destination */
505128415Speter            {
505234768Speter              e = d - (uInt)(q - s->window); /* bytes from offset to end */
505328415Speter              r = s->end - e;           /* pointer to offset */
505428415Speter              if (c > e)                /* if source crosses, */
505528415Speter              {
505628415Speter                c -= e;                 /* copy to end of window */
505728415Speter                do {
505828415Speter                  *q++ = *r++;
505928415Speter                } while (--e);
506028415Speter                r = s->window;          /* copy rest from start of window */
506128415Speter              }
506228415Speter            }
506328415Speter            do {                        /* copy all or what's left */
506428415Speter              *q++ = *r++;
506528415Speter            } while (--c);
506628415Speter            break;
506728415Speter          }
506828415Speter          else if ((e & 64) == 0)
506928415Speter            e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop;
507028415Speter          else
507128415Speter          {
507234768Speter            z->msg = (char*)"invalid distance code";
507328415Speter            UNGRAB
507428415Speter            UPDATE
507528415Speter            return Z_DATA_ERROR;
507628415Speter          }
507728415Speter        } while (1);
507828415Speter        break;
507928415Speter      }
508028415Speter      if ((e & 64) == 0)
508128415Speter      {
508228415Speter        if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0)
508328415Speter        {
508428415Speter          DUMPBITS(t->bits)
508528415Speter          Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
508628415Speter                    "inflate:         * literal '%c'\n" :
508728415Speter                    "inflate:         * literal 0x%02x\n", t->base));
508828415Speter          *q++ = (Byte)t->base;
508928415Speter          m--;
509028415Speter          break;
509128415Speter        }
509228415Speter      }
509328415Speter      else if (e & 32)
509428415Speter      {
509528415Speter        Tracevv((stderr, "inflate:         * end of block\n"));
509628415Speter        UNGRAB
509728415Speter        UPDATE
509828415Speter        return Z_STREAM_END;
509928415Speter      }
510028415Speter      else
510128415Speter      {
510234768Speter        z->msg = (char*)"invalid literal/length code";
510328415Speter        UNGRAB
510428415Speter        UPDATE
510528415Speter        return Z_DATA_ERROR;
510628415Speter      }
510728415Speter    } while (1);
510828415Speter  } while (m >= 258 && n >= 10);
510928415Speter
511028415Speter  /* not enough input or output--restore pointers and return */
511128415Speter  UNGRAB
511228415Speter  UPDATE
511328415Speter  return Z_OK;
511428415Speter}
511534768Speter/* --- inffast.c */
511628415Speter
511734768Speter/* +++ zutil.c */
511828415Speter/* zutil.c -- target dependent utility functions for the compression library
511934768Speter * Copyright (C) 1995-1996 Jean-loup Gailly.
512028415Speter * For conditions of distribution and use, see copyright notice in zlib.h
512128415Speter */
512228415Speter
512334768Speter/* From: zutil.c,v 1.17 1996/07/24 13:41:12 me Exp $ */
512428415Speter
512534768Speter#ifdef DEBUG_ZLIB
512634768Speter#include <stdio.h>
512734768Speter#endif
512828415Speter
512934768Speter/* #include "zutil.h" */
513034768Speter
513134768Speter#ifndef NO_DUMMY_DECL
513234768Speterstruct internal_state      {int dummy;}; /* for buggy compilers */
513334768Speter#endif
513434768Speter
513534768Speter#ifndef STDC
513634768Speterextern void exit OF((int));
513734768Speter#endif
513834768Speter
513934768Speterstatic const char *z_errmsg[10] = {
514034768Speter"need dictionary",     /* Z_NEED_DICT       2  */
514134768Speter"stream end",          /* Z_STREAM_END      1  */
514234768Speter"",                    /* Z_OK              0  */
514334768Speter"file error",          /* Z_ERRNO         (-1) */
514434768Speter"stream error",        /* Z_STREAM_ERROR  (-2) */
514534768Speter"data error",          /* Z_DATA_ERROR    (-3) */
514634768Speter"insufficient memory", /* Z_MEM_ERROR     (-4) */
514734768Speter"buffer error",        /* Z_BUF_ERROR     (-5) */
514834768Speter"incompatible version",/* Z_VERSION_ERROR (-6) */
514928415Speter""};
515028415Speter
515128415Speter
515234768Speterconst char *zlibVersion()
515334768Speter{
515434768Speter    return ZLIB_VERSION;
515534768Speter}
515634768Speter
515734768Speter#ifdef DEBUG_ZLIB
515834768Spetervoid z_error (m)
515934768Speter    char *m;
516034768Speter{
516134768Speter    fprintf(stderr, "%s\n", m);
516234768Speter    exit(1);
516334768Speter}
516434768Speter#endif
516534768Speter
516634768Speter#ifndef HAVE_MEMCPY
516734768Speter
516834768Spetervoid zmemcpy(dest, source, len)
516934768Speter    Bytef* dest;
517034768Speter    Bytef* source;
517134768Speter    uInt  len;
517234768Speter{
517334768Speter    if (len == 0) return;
517434768Speter    do {
517534768Speter        *dest++ = *source++; /* ??? to be unrolled */
517634768Speter    } while (--len != 0);
517734768Speter}
517834768Speter
517934768Speterint zmemcmp(s1, s2, len)
518034768Speter    Bytef* s1;
518134768Speter    Bytef* s2;
518234768Speter    uInt  len;
518334768Speter{
518434768Speter    uInt j;
518534768Speter
518634768Speter    for (j = 0; j < len; j++) {
518734768Speter        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
518834768Speter    }
518934768Speter    return 0;
519034768Speter}
519134768Speter
519234768Spetervoid zmemzero(dest, len)
519334768Speter    Bytef* dest;
519434768Speter    uInt  len;
519534768Speter{
519634768Speter    if (len == 0) return;
519734768Speter    do {
519834768Speter        *dest++ = 0;  /* ??? to be unrolled */
519934768Speter    } while (--len != 0);
520034768Speter}
520134768Speter#endif
520234768Speter
520334768Speter#ifdef __TURBOC__
520434768Speter#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
520534768Speter/* Small and medium model in Turbo C are for now limited to near allocation
520634768Speter * with reduced MAX_WBITS and MAX_MEM_LEVEL
520734768Speter */
520834768Speter#  define MY_ZCALLOC
520934768Speter
521034768Speter/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
521134768Speter * and farmalloc(64K) returns a pointer with an offset of 8, so we
521234768Speter * must fix the pointer. Warning: the pointer must be put back to its
521334768Speter * original form in order to free it, use zcfree().
521434768Speter */
521534768Speter
521634768Speter#define MAX_PTR 10
521734768Speter/* 10*64K = 640K */
521834768Speter
521934768Speterlocal int next_ptr = 0;
522034768Speter
522134768Spetertypedef struct ptr_table_s {
522234768Speter    voidpf org_ptr;
522334768Speter    voidpf new_ptr;
522434768Speter} ptr_table;
522534768Speter
522634768Speterlocal ptr_table table[MAX_PTR];
522734768Speter/* This table is used to remember the original form of pointers
522834768Speter * to large buffers (64K). Such pointers are normalized with a zero offset.
522934768Speter * Since MSDOS is not a preemptive multitasking OS, this table is not
523034768Speter * protected from concurrent access. This hack doesn't work anyway on
523134768Speter * a protected system like OS/2. Use Microsoft C instead.
523234768Speter */
523334768Speter
523434768Spetervoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
523534768Speter{
523634768Speter    voidpf buf = opaque; /* just to make some compilers happy */
523734768Speter    ulg bsize = (ulg)items*size;
523834768Speter
523934768Speter    /* If we allocate less than 65520 bytes, we assume that farmalloc
524034768Speter     * will return a usable pointer which doesn't have to be normalized.
524134768Speter     */
524234768Speter    if (bsize < 65520L) {
524334768Speter        buf = farmalloc(bsize);
524434768Speter        if (*(ush*)&buf != 0) return buf;
524534768Speter    } else {
524634768Speter        buf = farmalloc(bsize + 16L);
524734768Speter    }
524834768Speter    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
524934768Speter    table[next_ptr].org_ptr = buf;
525034768Speter
525134768Speter    /* Normalize the pointer to seg:0 */
525234768Speter    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
525334768Speter    *(ush*)&buf = 0;
525434768Speter    table[next_ptr++].new_ptr = buf;
525534768Speter    return buf;
525634768Speter}
525734768Speter
525834768Spetervoid  zcfree (voidpf opaque, voidpf ptr)
525934768Speter{
526034768Speter    int n;
526134768Speter    if (*(ush*)&ptr != 0) { /* object < 64K */
526234768Speter        farfree(ptr);
526334768Speter        return;
526434768Speter    }
526534768Speter    /* Find the original pointer */
526634768Speter    for (n = 0; n < next_ptr; n++) {
526734768Speter        if (ptr != table[n].new_ptr) continue;
526834768Speter
526934768Speter        farfree(table[n].org_ptr);
527034768Speter        while (++n < next_ptr) {
527134768Speter            table[n-1] = table[n];
527234768Speter        }
527334768Speter        next_ptr--;
527434768Speter        return;
527534768Speter    }
527634768Speter    ptr = opaque; /* just to make some compilers happy */
527734768Speter    Assert(0, "zcfree: ptr not found");
527834768Speter}
527934768Speter#endif
528034768Speter#endif /* __TURBOC__ */
528134768Speter
528234768Speter
528334768Speter#if defined(M_I86) && !defined(__32BIT__)
528434768Speter/* Microsoft C in 16-bit mode */
528534768Speter
528634768Speter#  define MY_ZCALLOC
528734768Speter
528834768Speter#if (!defined(_MSC_VER) || (_MSC_VER < 600))
528934768Speter#  define _halloc  halloc
529034768Speter#  define _hfree   hfree
529134768Speter#endif
529234768Speter
529334768Spetervoidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
529434768Speter{
529534768Speter    if (opaque) opaque = 0; /* to make compiler happy */
529634768Speter    return _halloc((long)items, size);
529734768Speter}
529834768Speter
529934768Spetervoid  zcfree (voidpf opaque, voidpf ptr)
530034768Speter{
530134768Speter    if (opaque) opaque = 0; /* to make compiler happy */
530234768Speter    _hfree(ptr);
530334768Speter}
530434768Speter
530534768Speter#endif /* MSC */
530634768Speter
530734768Speter
530834768Speter#ifndef MY_ZCALLOC /* Any system without a special alloc function */
530934768Speter
531034768Speter#ifndef STDC
531134768Speterextern voidp  calloc OF((uInt items, uInt size));
531234768Speterextern void   free   OF((voidpf ptr));
531334768Speter#endif
531434768Speter
531534768Spetervoidpf zcalloc (opaque, items, size)
531634768Speter    voidpf opaque;
531734768Speter    unsigned items;
531834768Speter    unsigned size;
531934768Speter{
532034768Speter    if (opaque) items += size - size; /* make compiler happy */
532134768Speter    return (voidpf)calloc(items, size);
532234768Speter}
532334768Speter
532434768Spetervoid  zcfree (opaque, ptr)
532534768Speter    voidpf opaque;
532634768Speter    voidpf ptr;
532734768Speter{
532834768Speter    free(ptr);
532934768Speter    if (opaque) return; /* make compiler happy */
533034768Speter}
533134768Speter
533234768Speter#endif /* MY_ZCALLOC */
533334768Speter/* --- zutil.c */
533434768Speter
533534768Speter/* +++ adler32.c */
533628415Speter/* adler32.c -- compute the Adler-32 checksum of a data stream
533734768Speter * Copyright (C) 1995-1996 Mark Adler
533828415Speter * For conditions of distribution and use, see copyright notice in zlib.h
533928415Speter */
534028415Speter
534134768Speter/* From: adler32.c,v 1.10 1996/05/22 11:52:18 me Exp $ */
534228415Speter
534334768Speter/* #include "zlib.h" */
534434768Speter
534528415Speter#define BASE 65521L /* largest prime smaller than 65536 */
534628415Speter#define NMAX 5552
534728415Speter/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
534828415Speter
5349106696Salfred#define DO1(buf,i)  {s1 += buf[(i)]; s2 += s1;}
5350106696Salfred#define DO2(buf,i)  DO1(buf,i); DO1(buf,(i)+1);
5351106696Salfred#define DO4(buf,i)  DO2(buf,i); DO2(buf,(i)+2);
5352106696Salfred#define DO8(buf,i)  DO4(buf,i); DO4(buf,(i)+4);
535334768Speter#define DO16(buf)   DO8(buf,0); DO8(buf,8);
535428415Speter
535528415Speter/* ========================================================================= */
535628415SpeteruLong adler32(adler, buf, len)
535728415Speter    uLong adler;
535834768Speter    const Bytef *buf;
535928415Speter    uInt len;
536028415Speter{
536128415Speter    unsigned long s1 = adler & 0xffff;
536228415Speter    unsigned long s2 = (adler >> 16) & 0xffff;
536328415Speter    int k;
536428415Speter
536528415Speter    if (buf == Z_NULL) return 1L;
536628415Speter
536728415Speter    while (len > 0) {
536828415Speter        k = len < NMAX ? len : NMAX;
536928415Speter        len -= k;
537028415Speter        while (k >= 16) {
537128415Speter            DO16(buf);
537234768Speter	    buf += 16;
537328415Speter            k -= 16;
537428415Speter        }
537528415Speter        if (k != 0) do {
537634768Speter            s1 += *buf++;
537734768Speter	    s2 += s1;
537828415Speter        } while (--k);
537928415Speter        s1 %= BASE;
538028415Speter        s2 %= BASE;
538128415Speter    }
538228415Speter    return (s2 << 16) | s1;
538328415Speter}
538434768Speter/* --- adler32.c */
5385130799Smarkm
5386130799Smarkm#ifdef _KERNEL
5387130799Smarkmstatic int
5388130799Smarkmzlib_modevent(module_t mod, int type, void *unused)
5389130799Smarkm{
5390130799Smarkm	switch (type) {
5391130799Smarkm	case MOD_LOAD:
5392130799Smarkm		return 0;
5393130799Smarkm	case MOD_UNLOAD:
5394130799Smarkm		return 0;
5395130799Smarkm	}
5396130799Smarkm	return EINVAL;
5397130799Smarkm}
5398130799Smarkm
5399130799Smarkmstatic moduledata_t zlib_mod = {
5400130799Smarkm	"zlib",
5401130799Smarkm	zlib_modevent,
5402130799Smarkm	0
5403130799Smarkm};
5404130799SmarkmDECLARE_MODULE(zlib, zlib_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
5405130799SmarkmMODULE_VERSION(zlib, 1);
5406130799Smarkm#endif /* _KERNEL */
5407