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