19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* inflate.h -- internal inflate state definition
2381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * Copyright (C) 1995-2009 Mark Adler
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/* define NO_GZIP when compiling if you want to disable gzip header and
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   trailer decoding by inflate().  NO_GZIP would be used to avoid linking in
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   the crc code when it is not needed.  For shared libraries, gzip decoding
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   should be left enabled. */
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_GZIP
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#  define GUNZIP
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Possible inflate modes between inflate() calls */
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef enum {
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    HEAD,       /* i: waiting for magic header */
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    FLAGS,      /* i: waiting for method and flags (gzip) */
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    TIME,       /* i: waiting for modification time (gzip) */
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    OS,         /* i: waiting for extra flags and operating system (gzip) */
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXLEN,      /* i: waiting for extra length (gzip) */
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    EXTRA,      /* i: waiting for extra bytes (gzip) */
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    NAME,       /* i: waiting for end of file name (gzip) */
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    COMMENT,    /* i: waiting for end of comment (gzip) */
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    HCRC,       /* i: waiting for header crc (gzip) */
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DICTID,     /* i: waiting for dictionary check value */
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DICT,       /* waiting for inflateSetDictionary() call */
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TYPE,       /* i: waiting for type bits, including last-flag bit */
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TYPEDO,     /* i: same, but skip check to exit inflate on new block */
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        STORED,     /* i: waiting for stored size (length and complement) */
35381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        COPY_,      /* i/o: same as COPY below, but only first time in */
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        COPY,       /* i/o: waiting for input or output to copy stored block */
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        TABLE,      /* i: waiting for dynamic block table lengths */
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        LENLENS,    /* i: waiting for code length code lengths */
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CODELENS,   /* i: waiting for length/lit and distance code lengths */
40381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            LEN_,       /* i: same as LEN below, but only first time in */
41381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            LEN,        /* i: waiting for length/lit/eob code */
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            LENEXT,     /* i: waiting for length extra bits */
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            DIST,       /* i: waiting for distance code */
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            DISTEXT,    /* i: waiting for distance extra bits */
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            MATCH,      /* o: waiting for output space to copy string */
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            LIT,        /* o: waiting for output space to write literal */
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    CHECK,      /* i: waiting for 32-bit check value */
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    LENGTH,     /* i: waiting for 32-bit length (gzip) */
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    DONE,       /* finished check, done -- remain here until reset */
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    BAD,        /* got a data error -- remain here until reset */
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    MEM,        /* got an inflate() memory error -- remain here until reset */
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    SYNC        /* looking for synchronization bytes to restart inflate() */
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} inflate_mode;
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    State transitions between above modes -
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
58381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    (most modes can go to BAD or MEM on error -- not shown for clarity)
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Process header:
61381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        HEAD -> (gzip) or (zlib) or (raw)
62381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
63381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes                  HCRC -> TYPE
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        (zlib) -> DICTID or TYPE
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        DICTID -> DICT -> TYPE
66381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        (raw) -> TYPEDO
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Read deflate blocks:
68381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
69381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            STORED -> COPY_ -> COPY -> TYPE
70381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            TABLE -> LENLENS -> CODELENS -> LEN_
71381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes            LEN_ -> LEN
72381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    Read deflate codes in fixed or dynamic block:
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                LEN -> LENEXT or LIT or TYPE
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                LIT -> LEN
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Process trailer:
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        CHECK -> LENGTH -> DONE
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
80381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/* state maintained between inflate() calls.  Approximately 10K bytes. */
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct inflate_state {
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    inflate_mode mode;          /* current inflate mode */
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int last;                   /* true if processing last block */
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int havedict;               /* true if dictionary provided */
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int flags;                  /* gzip header method and flags (0 if zlib) */
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned long check;        /* protected copy of check value */
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned long total;        /* protected copy of output count */
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    gz_headerp head;            /* where to save gzip header information */
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* sliding window */
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned wbits;             /* log base 2 of requested window size */
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned wsize;             /* window size or zero if not using window */
949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned whave;             /* valid bytes in the window */
95381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unsigned wnext;             /* window write index */
969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned char FAR *window;  /* allocated sliding window, if needed */
979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* bit accumulator */
989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned long hold;         /* input bit accumulator */
999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned bits;              /* number of bits in "in" */
1009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* for string and stored block copying */
1019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned length;            /* literal or length of data to copy */
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned offset;            /* distance back to copy string from */
1039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* for table and code decoding */
1049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned extra;             /* extra bits needed */
1059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* fixed and dynamic code tables */
1069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    code const FAR *lencode;    /* starting table for length/literal codes */
1079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    code const FAR *distcode;   /* starting table for distance codes */
1089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned lenbits;           /* index bits for lencode */
1099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned distbits;          /* index bits for distcode */
1109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        /* dynamic table building */
1119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned ncode;             /* number of code length code lengths */
1129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned nlen;              /* number of length code lengths */
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned ndist;             /* number of distance code lengths */
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned have;              /* number of code lengths in lens[] */
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    code FAR *next;             /* next available space in codes[] */
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned short lens[320];   /* temporary storage for code lengths */
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    unsigned short work[288];   /* work area for code table building */
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    code codes[ENOUGH];         /* space for code tables */
119381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int sane;                   /* if false, allow invalid distance too far */
120381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    int back;                   /* bits back of last unprocessed length/lit */
121381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    unsigned was;               /* initial length of match */
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project};
123