18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* inflate.h -- internal inflate state definition 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (C) 1995-2004 Mark Adler 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* WARNING: this file should *not* be used by applications. It is 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part of the implementation of the compression library and is 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project subject to change. Applications should only use zlib.h. 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* define NO_GZIP when compiling if you want to disable gzip header and 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project trailer decoding by inflate(). NO_GZIP would be used to avoid linking in 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project the crc code when it is not needed. For shared libraries, gzip decoding 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project should be left enabled. */ 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef NO_GZIP 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define GUNZIP 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Possible inflate modes between inflate() calls */ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef enum { 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HEAD, /* i: waiting for magic header */ 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FLAGS, /* i: waiting for method and flags (gzip) */ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TIME, /* i: waiting for modification time (gzip) */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project OS, /* i: waiting for extra flags and operating system (gzip) */ 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project EXLEN, /* i: waiting for extra length (gzip) */ 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project EXTRA, /* i: waiting for extra bytes (gzip) */ 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NAME, /* i: waiting for end of file name (gzip) */ 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project COMMENT, /* i: waiting for end of comment (gzip) */ 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HCRC, /* i: waiting for header crc (gzip) */ 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DICTID, /* i: waiting for dictionary check value */ 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DICT, /* waiting for inflateSetDictionary() call */ 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TYPE, /* i: waiting for type bits, including last-flag bit */ 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TYPEDO, /* i: same, but skip check to exit inflate on new block */ 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STORED, /* i: waiting for stored size (length and complement) */ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project COPY, /* i/o: waiting for input or output to copy stored block */ 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TABLE, /* i: waiting for dynamic block table lengths */ 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LENLENS, /* i: waiting for code length code lengths */ 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CODELENS, /* i: waiting for length/lit and distance code lengths */ 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LEN, /* i: waiting for length/lit code */ 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LENEXT, /* i: waiting for length extra bits */ 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DIST, /* i: waiting for distance code */ 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DISTEXT, /* i: waiting for distance extra bits */ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MATCH, /* o: waiting for output space to copy string */ 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LIT, /* o: waiting for output space to write literal */ 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECK, /* i: waiting for 32-bit check value */ 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LENGTH, /* i: waiting for 32-bit length (gzip) */ 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DONE, /* finished check, done -- remain here until reset */ 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BAD, /* got a data error -- remain here until reset */ 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MEM, /* got an inflate() memory error -- remain here until reset */ 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SYNC /* looking for synchronization bytes to restart inflate() */ 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} inflate_mode; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project State transitions between above modes - 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (most modes can go to the BAD or MEM mode -- not shown for clarity) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Process header: 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project HEAD -> (gzip) or (zlib) 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NAME -> COMMENT -> HCRC -> TYPE 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (zlib) -> DICTID or TYPE 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DICTID -> DICT -> TYPE 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Read deflate blocks: 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TYPE -> STORED or TABLE or LEN or CHECK 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project STORED -> COPY -> TYPE 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TABLE -> LENLENS -> CODELENS -> LEN 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Read deflate codes: 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LEN -> LENEXT or LIT or TYPE 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LENEXT -> DIST -> DISTEXT -> MATCH -> LEN 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LIT -> LEN 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Process trailer: 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CHECK -> LENGTH -> DONE 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* state maintained between inflate() calls. Approximately 7K bytes. */ 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct inflate_state { 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inflate_mode mode; /* current inflate mode */ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int last; /* true if processing last block */ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int havedict; /* true if dictionary provided */ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags; /* gzip header method and flags (0 if zlib) */ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long check; /* protected copy of check value */ 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long total; /* protected copy of output count */ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gz_headerp head; /* where to save gzip header information */ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* sliding window */ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned wbits; /* log base 2 of requested window size */ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned wsize; /* window size or zero if not using window */ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned whave; /* valid bytes in the window */ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned write; /* window write index */ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned char FAR *window; /* allocated sliding window, if needed */ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* bit accumulator */ 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned long hold; /* input bit accumulator */ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned bits; /* number of bits in "in" */ 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* for string and stored block copying */ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned length; /* literal or length of data to copy */ 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned offset; /* distance back to copy string from */ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* for table and code decoding */ 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned extra; /* extra bits needed */ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* fixed and dynamic code tables */ 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code const FAR *lencode; /* starting table for length/literal codes */ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code const FAR *distcode; /* starting table for distance codes */ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned lenbits; /* index bits for lencode */ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned distbits; /* index bits for distcode */ 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* dynamic table building */ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned ncode; /* number of code length code lengths */ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned nlen; /* number of length code lengths */ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned ndist; /* number of distance code lengths */ 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned have; /* number of code lengths in lens[] */ 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code FAR *next; /* next available space in codes[] */ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned short lens[320]; /* temporary storage for code lengths */ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned short work[288]; /* work area for code table building */ 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project code codes[ENOUGH]; /* space for code tables */ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 116