1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* inflate.h -- internal inflate state definition 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1995-2009 Mark Adler 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see copyright notice in zlib.h 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* WARNING: this file should *not* be used by applications. It is 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov part of the implementation of the compression library and is 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov subject to change. Applications should only use zlib.h. 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* define NO_GZIP when compiling if you want to disable gzip header and 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov trailer decoding by inflate(). NO_GZIP would be used to avoid linking in 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov the crc code when it is not needed. For shared libraries, gzip decoding 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov should be left enabled. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef NO_GZIP 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov# define GUNZIP 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Possible inflate modes between inflate() calls */ 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef enum { 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HEAD, /* i: waiting for magic header */ 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FLAGS, /* i: waiting for method and flags (gzip) */ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TIME, /* i: waiting for modification time (gzip) */ 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov OS, /* i: waiting for extra flags and operating system (gzip) */ 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EXLEN, /* i: waiting for extra length (gzip) */ 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov EXTRA, /* i: waiting for extra bytes (gzip) */ 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NAME, /* i: waiting for end of file name (gzip) */ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov COMMENT, /* i: waiting for end of comment (gzip) */ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HCRC, /* i: waiting for header crc (gzip) */ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DICTID, /* i: waiting for dictionary check value */ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DICT, /* waiting for inflateSetDictionary() call */ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TYPE, /* i: waiting for type bits, including last-flag bit */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TYPEDO, /* i: same, but skip check to exit inflate on new block */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov STORED, /* i: waiting for stored size (length and complement) */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov COPY_, /* i/o: same as COPY below, but only first time in */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov COPY, /* i/o: waiting for input or output to copy stored block */ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TABLE, /* i: waiting for dynamic block table lengths */ 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LENLENS, /* i: waiting for code length code lengths */ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CODELENS, /* i: waiting for length/lit and distance code lengths */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LEN_, /* i: same as LEN below, but only first time in */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LEN, /* i: waiting for length/lit/eob code */ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LENEXT, /* i: waiting for length extra bits */ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DIST, /* i: waiting for distance code */ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DISTEXT, /* i: waiting for distance extra bits */ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MATCH, /* o: waiting for output space to copy string */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LIT, /* o: waiting for output space to write literal */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CHECK, /* i: waiting for 32-bit check value */ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LENGTH, /* i: waiting for 32-bit length (gzip) */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DONE, /* finished check, done -- remain here until reset */ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov BAD, /* got a data error -- remain here until reset */ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MEM, /* got an inflate() memory error -- remain here until reset */ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SYNC /* looking for synchronization bytes to restart inflate() */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} inflate_mode; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov State transitions between above modes - 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (most modes can go to BAD or MEM on error -- not shown for clarity) 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Process header: 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HEAD -> (gzip) or (zlib) or (raw) 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov HCRC -> TYPE 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (zlib) -> DICTID or TYPE 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DICTID -> DICT -> TYPE 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (raw) -> TYPEDO 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Read deflate blocks: 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov STORED -> COPY_ -> COPY -> TYPE 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TABLE -> LENLENS -> CODELENS -> LEN_ 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LEN_ -> LEN 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Read deflate codes in fixed or dynamic block: 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LEN -> LENEXT or LIT or TYPE 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LENEXT -> DIST -> DISTEXT -> MATCH -> LEN 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LIT -> LEN 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Process trailer: 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CHECK -> LENGTH -> DONE 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* state maintained between inflate() calls. Approximately 10K bytes. */ 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct inflate_state { 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inflate_mode mode; /* current inflate mode */ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int last; /* true if processing last block */ 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int havedict; /* true if dictionary provided */ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int flags; /* gzip header method and flags (0 if zlib) */ 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long check; /* protected copy of check value */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long total; /* protected copy of output count */ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov gz_headerp head; /* where to save gzip header information */ 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* sliding window */ 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned wbits; /* log base 2 of requested window size */ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned wsize; /* window size or zero if not using window */ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned whave; /* valid bytes in the window */ 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned wnext; /* window write index */ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned char FAR *window; /* allocated sliding window, if needed */ 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* bit accumulator */ 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned long hold; /* input bit accumulator */ 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned bits; /* number of bits in "in" */ 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* for string and stored block copying */ 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned length; /* literal or length of data to copy */ 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned offset; /* distance back to copy string from */ 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* for table and code decoding */ 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned extra; /* extra bits needed */ 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* fixed and dynamic code tables */ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code const FAR *lencode; /* starting table for length/literal codes */ 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code const FAR *distcode; /* starting table for distance codes */ 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned lenbits; /* index bits for lencode */ 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned distbits; /* index bits for distcode */ 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* dynamic table building */ 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned ncode; /* number of code length code lengths */ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned nlen; /* number of length code lengths */ 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned ndist; /* number of distance code lengths */ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned have; /* number of code lengths in lens[] */ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code FAR *next; /* next available space in codes[] */ 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned short lens[320]; /* temporary storage for code lengths */ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned short work[288]; /* work area for code table building */ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov code codes[ENOUGH]; /* space for code tables */ 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int sane; /* if false, allow invalid distance too far */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int back; /* bits back of last unprocessed length/lit */ 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov unsigned was; /* initial length of match */ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 123