19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* deflate.h -- internal compression state
2ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes * Copyright (C) 1995-2012 Jean-loup Gailly
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* WARNING: this file should *not* be used by applications. It is
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   part of the implementation of the compression library and is
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   subject to change. Applications should only use zlib.h.
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* @(#) $Id$ */
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef DEFLATE_H
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define DEFLATE_H
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zutil.h"
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* define NO_GZIP when compiling if you want to disable gzip header and
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   trailer creation by deflate().  NO_GZIP would be used to avoid linking in
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   the crc code when it is not needed.  For shared libraries, gzip encoding
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   should be left enabled. */
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_GZIP
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  define GZIP
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Internal compression state.
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define LENGTH_CODES 29
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* number of length codes, not counting the special END_BLOCK code */
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define LITERALS  256
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* number of literal bytes 0..255 */
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define L_CODES (LITERALS+1+LENGTH_CODES)
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* number of Literal or Length codes, including the END_BLOCK code */
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define D_CODES   30
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* number of distance codes */
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define BL_CODES  19
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* number of codes used to transfer the bit lengths */
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define HEAP_SIZE (2*L_CODES+1)
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* maximum heap size */
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MAX_BITS 15
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* All codes must not exceed MAX_BITS bits */
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
51ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#define Buf_size 16
52ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes/* size of bit buffer in bi_buf */
53ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define INIT_STATE    42
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define EXTRA_STATE   69
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define NAME_STATE    73
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define COMMENT_STATE 91
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define HCRC_STATE   103
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define BUSY_STATE   113
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define FINISH_STATE 666
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Stream status */
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Data structure describing a single value and its code string. */
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct ct_data_s {
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    union {
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ush  freq;       /* frequency count */
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ush  code;       /* bit string */
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } fc;
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    union {
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ush  dad;        /* father node in Huffman tree */
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ush  len;        /* length of bit string */
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    } dl;
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} FAR ct_data;
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Freq fc.freq
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Code fc.code
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Dad  dl.dad
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define Len  dl.len
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct static_tree_desc_s  static_tree_desc;
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct tree_desc_s {
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ct_data *dyn_tree;           /* the dynamic tree */
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int     max_code;            /* largest code with non zero frequency */
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    static_tree_desc *stat_desc; /* the corresponding static tree */
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} FAR tree_desc;
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef ush Pos;
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef Pos FAR Posf;
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef unsigned IPos;
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* A Pos is an index in the character window. We use short instead of int to
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * save space in the various tables. IPos is used only for parameter passing.
959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct internal_state {
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_streamp strm;      /* pointer back to this zlib stream */
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int   status;        /* as the name implies */
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Bytef *pending_buf;  /* output still pending */
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg   pending_buf_size; /* size of pending_buf */
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Bytef *pending_out;  /* next pending byte to output to the stream */
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt   pending;      /* nb of bytes in the pending buffer */
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gz_headerp  gzhead;  /* gzip header information to write */
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt   gzindex;      /* where in extra, name, or comment */
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Byte  method;        /* STORED (for zip only) or DEFLATED */
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int   last_flush;    /* value of flush param for previous deflate call */
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                /* used by deflate.c: */
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  w_size;        /* LZ77 window size (32K by default) */
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  w_bits;        /* log2(w_size)  (8..16) */
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  w_mask;        /* w_size - 1 */
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Bytef *window;
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Sliding window. Input bytes are read into the second half of the window,
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * and move to the first half later to keep a dictionary of at least wSize
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * bytes. With this organization, matches are limited to a distance of
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * wSize-MAX_MATCH bytes, but this ensures that IO is always
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * performed with a length multiple of the block size. Also, it limits
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * the window size to 64K, which is quite useful on MSDOS.
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * To do: use the user input buffer as sliding window.
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg window_size;
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Actual size of window: 2*wSize, except when the user input buffer
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * is directly used as sliding window.
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Posf *prev;
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Link to older string with same hash index. To limit the size of this
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * array to 64K, this link is maintained only for the last 32K strings.
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * An index in this array is thus a window index modulo 32K.
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Posf *head; /* Heads of the hash chains or NIL. */
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  ins_h;          /* hash index of string to be inserted */
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  hash_size;      /* number of elements in hash table */
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  hash_bits;      /* log2(hash_size) */
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  hash_mask;      /* hash_size-1 */
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  hash_shift;
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Number of bits by which ins_h must be shifted at each input
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * step. It must be such that after MIN_MATCH steps, the oldest
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * byte no longer takes part in the hash key, that is:
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   hash_shift * MIN_MATCH >= hash_bits
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    long block_start;
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Window position at the beginning of the current output block. Gets
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * negative when the window is moved backwards.
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt match_length;           /* length of best match */
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    IPos prev_match;             /* previous match */
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int match_available;         /* set if previous match exists */
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt strstart;               /* start of string to insert */
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt match_start;            /* start of matching string */
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt lookahead;              /* number of valid bytes ahead in window */
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt prev_length;
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Length of the best match at previous step. Matches not greater than this
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * are discarded. This is used in the lazy match evaluation.
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt max_chain_length;
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* To speed up deflation, hash chains are never searched beyond this
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * length.  A higher limit improves compression ratio but degrades the
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * speed.
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt max_lazy_match;
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Attempt to find a better match only when the current match is strictly
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * smaller than this value. This mechanism is used only for compression
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * levels >= 4.
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#   define max_insert_length  max_lazy_match
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Insert new strings in the hash table only if the match length is not
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * greater than this length. This saves time but degrades compression.
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * max_insert_length is used only for compression levels <= 3.
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int level;    /* compression level (1..9) */
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int strategy; /* favor or force Huffman coding*/
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt good_match;
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Use a faster search when the previous match is longer than this */
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int nice_match; /* Stop searching when current match exceeds this */
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                /* used by trees.c: */
194ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    /* Didn't use ct_data typedef below to suppress compiler warning */
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct tree_desc_s l_desc;               /* desc. for literal tree */
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct tree_desc_s d_desc;               /* desc. for distance tree */
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    struct tree_desc_s bl_desc;              /* desc. for bit length tree */
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ush bl_count[MAX_BITS+1];
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* number of codes at each bit length for an optimal tree */
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int heap_len;               /* number of elements in the heap */
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int heap_max;               /* element of largest frequency */
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * The same heap array is used to build all trees.
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uch depth[2*L_CODES+1];
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Depth of each subtree used as tie breaker for trees of equal frequency
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uchf *l_buf;          /* buffer for literals or lengths */
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt  lit_bufsize;
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Size of match buffer for literals/lengths.  There are 4 reasons for
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * limiting lit_bufsize to 64K:
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   - frequencies can be kept in 16 bit counters
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   - if compression is not successful for the first block, all input
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     data is still in the window so we can still emit a stored block even
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     when input comes from standard input.  (This can also be done for
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     all blocks if lit_bufsize is not greater than 32K.)
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   - if compression is not successful for a file smaller than 64K, we can
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     even emit a stored file instead of a stored block (saving 5 bytes).
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     This is applicable only for zip (not gzip or zlib).
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   - creating new Huffman trees less frequently may not provide fast
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     adaptation to changes in the input data statistics. (Take for
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     example a binary file with poorly compressible code followed by
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     a highly compressible string table.) Smaller buffer sizes give
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     fast adaptation but have of course the overhead of transmitting
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *     trees more frequently.
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *   - I can't count above 4
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt last_lit;      /* running index in l_buf */
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ushf *d_buf;
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Buffer for distances. To simplify the code, d_buf and l_buf have
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * the same number of elements. To use different lengths, an extra flag
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * array would be necessary.
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg opt_len;        /* bit length of current block with optimal trees */
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg static_len;     /* bit length of current block with static trees */
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uInt matches;       /* number of string matches in current block */
250ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    uInt insert;        /* bytes at end of window left to insert */
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef DEBUG
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg compressed_len; /* total bit length of compressed file mod 2^32 */
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ush bi_buf;
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Output buffer. bits are inserted starting at the bottom (least
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * significant bits).
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int bi_valid;
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Number of valid bits in bi_buf.  All bits above the last valid bit
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     * are always zero.
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
266381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    ulg high_water;
267381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    /* High water mark offset in window for initialized bytes -- bytes above
268381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes     * this are set to zero in order to avoid memory check warnings when
269381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes     * longest match routines access bytes past the input.  This is then
270381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes     * updated to the new high water mark.
271381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes     */
272381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} FAR deflate_state;
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Output a byte on the stream.
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * IN assertion: there is enough room in pending_buf.
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Minimum amount of lookahead, except at the end of the input file.
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * See deflate.c for comments about the MIN_MATCH+1.
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* In order to simplify the code, particularly on 16 bit machines, match
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * distances are limited to MAX_DIST instead of WSIZE.
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
291381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes#define WIN_INIT MAX_MATCH
292381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* Number of bytes after end of data in window to initialize in order to avoid
293381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes   memory checker errors from longest match routines */
294381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* in trees.c */
296381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL _tr_init OF((deflate_state *s));
297381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesint ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
298381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
299381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                        ulg stored_len, int last));
300ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughesvoid ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
301381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL _tr_align OF((deflate_state *s));
302381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
303381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                        ulg stored_len, int last));
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define d_code(dist) \
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Mapping from a distance to a distance code. dist is the distance - 1 and
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * must not have side effects. _dist_code[256] and _dist_code[257] are never
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * used.
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef DEBUG
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Inline versions of _tr_tally for speed: */
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined(GEN_TREES_H) || !defined(STDC)
316381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  extern uch ZLIB_INTERNAL _length_code[];
317381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  extern uch ZLIB_INTERNAL _dist_code[];
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
319381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  extern const uch ZLIB_INTERNAL _length_code[];
320381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes  extern const uch ZLIB_INTERNAL _dist_code[];
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _tr_tally_lit(s, c, flush) \
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  { uch cc = (c); \
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->d_buf[s->last_lit] = 0; \
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->l_buf[s->last_lit++] = cc; \
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->dyn_ltree[cc].Freq++; \
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    flush = (s->last_lit == s->lit_bufsize-1); \
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   }
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _tr_tally_dist(s, distance, length, flush) \
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  { uch len = (length); \
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    ush dist = (distance); \
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->d_buf[s->last_lit] = dist; \
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->l_buf[s->last_lit++] = len; \
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    dist--; \
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    s->dyn_dtree[d_code(dist)].Freq++; \
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    flush = (s->last_lit == s->lit_bufsize-1); \
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  }
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _tr_tally_dist(s, distance, length, flush) \
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project              flush = _tr_tally(s, distance, length)
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* DEFLATE_H */
347