2009-01-05 00:46:16 +03:00
# ifndef INFLATE_H
# define INFLATE_H
2006-06-23 01:47:34 +04:00
/* inflate.h -- internal inflate state definition
* Copyright ( C ) 1995 - 2004 Mark Adler
* For conditions of distribution and use , see copyright notice in zlib . h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change . Applications should only use zlib . h .
*/
/* Possible inflate modes between inflate() calls */
typedef enum {
HEAD , /* i: waiting for magic header */
FLAGS , /* i: waiting for method and flags (gzip) */
TIME , /* i: waiting for modification time (gzip) */
OS , /* i: waiting for extra flags and operating system (gzip) */
EXLEN , /* i: waiting for extra length (gzip) */
EXTRA , /* i: waiting for extra bytes (gzip) */
NAME , /* i: waiting for end of file name (gzip) */
COMMENT , /* i: waiting for end of comment (gzip) */
HCRC , /* i: waiting for header crc (gzip) */
DICTID , /* i: waiting for dictionary check value */
DICT , /* waiting for inflateSetDictionary() call */
TYPE , /* i: waiting for type bits, including last-flag bit */
TYPEDO , /* i: same, but skip check to exit inflate on new block */
STORED , /* i: waiting for stored size (length and complement) */
COPY , /* i/o: waiting for input or output to copy stored block */
TABLE , /* i: waiting for dynamic block table lengths */
LENLENS , /* i: waiting for code length code lengths */
CODELENS , /* i: waiting for length/lit and distance code lengths */
LEN , /* i: waiting for length/lit code */
LENEXT , /* i: waiting for length extra bits */
DIST , /* i: waiting for distance code */
DISTEXT , /* i: waiting for distance extra bits */
MATCH , /* o: waiting for output space to copy string */
LIT , /* o: waiting for output space to write literal */
CHECK , /* i: waiting for 32-bit check value */
LENGTH , /* i: waiting for 32-bit length (gzip) */
DONE , /* finished check, done -- remain here until reset */
BAD , /* got a data error -- remain here until reset */
MEM , /* got an inflate() memory error -- remain here until reset */
SYNC /* looking for synchronization bytes to restart inflate() */
} inflate_mode ;
/*
State transitions between above modes -
( most modes can go to the BAD or MEM mode - - not shown for clarity )
Process header :
HEAD - > ( gzip ) or ( zlib )
( gzip ) - > FLAGS - > TIME - > OS - > EXLEN - > EXTRA - > NAME
NAME - > COMMENT - > HCRC - > TYPE
( zlib ) - > DICTID or TYPE
DICTID - > DICT - > TYPE
Read deflate blocks :
TYPE - > STORED or TABLE or LEN or CHECK
STORED - > COPY - > TYPE
TABLE - > LENLENS - > CODELENS - > LEN
Read deflate codes :
LEN - > LENEXT or LIT or TYPE
LENEXT - > DIST - > DISTEXT - > MATCH - > LEN
LIT - > LEN
Process trailer :
CHECK - > LENGTH - > DONE
*/
/* state maintained between inflate() calls. Approximately 7K bytes. */
struct inflate_state {
inflate_mode mode ; /* current inflate mode */
int last ; /* true if processing last block */
int wrap ; /* bit 0 true for zlib, bit 1 true for gzip */
int havedict ; /* true if dictionary provided */
int flags ; /* gzip header method and flags (0 if zlib) */
unsigned dmax ; /* zlib header max distance (INFLATE_STRICT) */
unsigned long check ; /* protected copy of check value */
unsigned long total ; /* protected copy of output count */
/* gz_headerp head; */ /* where to save gzip header information */
/* sliding window */
unsigned wbits ; /* log base 2 of requested window size */
unsigned wsize ; /* window size or zero if not using window */
unsigned whave ; /* valid bytes in the window */
unsigned write ; /* window write index */
unsigned char * window ; /* allocated sliding window, if needed */
/* bit accumulator */
unsigned long hold ; /* input bit accumulator */
unsigned bits ; /* number of bits in "in" */
/* for string and stored block copying */
unsigned length ; /* literal or length of data to copy */
unsigned offset ; /* distance back to copy string from */
/* for table and code decoding */
unsigned extra ; /* extra bits needed */
/* fixed and dynamic code tables */
code const * lencode ; /* starting table for length/literal codes */
code const * distcode ; /* starting table for distance codes */
unsigned lenbits ; /* index bits for lencode */
unsigned distbits ; /* index bits for distcode */
/* dynamic table building */
unsigned ncode ; /* number of code length code lengths */
unsigned nlen ; /* number of length code lengths */
unsigned ndist ; /* number of distance code lengths */
unsigned have ; /* number of code lengths in lens[] */
code * next ; /* next available space in codes[] */
unsigned short lens [ 320 ] ; /* temporary storage for code lengths */
unsigned short work [ 288 ] ; /* work area for code table building */
code codes [ ENOUGH ] ; /* space for code tables */
} ;
2009-01-05 00:46:16 +03:00
# endif