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