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