| /* | 
 |  * This file is derived from various .h and .c files from the zlib-1.2.3 | 
 |  * distribution by Jean-loup Gailly and Mark Adler, with some additions | 
 |  * by Paul Mackerras to aid in implementing Deflate compression and | 
 |  * decompression for PPP packets.  See zlib.h for conditions of | 
 |  * distribution and use. | 
 |  * | 
 |  * Changes that have been made include: | 
 |  * - changed functions not used outside this file to "local" | 
 |  * - added minCompression parameter to deflateInit2 | 
 |  * - added Z_PACKET_FLUSH (see zlib.h for details) | 
 |  * - added inflateIncomp | 
 |  */ | 
 |  | 
 | /*+++++*/ | 
 | /* zutil.h -- internal interface and configuration of the compression library | 
 |  * Copyright (C) 1995-2005 Jean-loup Gailly. | 
 |  * 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. | 
 |  */ | 
 |  | 
 | #define ZUTIL_H | 
 | #define ZLIB_INTERNAL | 
 |  | 
 | #include <common.h> | 
 | #include <compiler.h> | 
 | #include <asm/unaligned.h> | 
 | #include <watchdog.h> | 
 | #include "u-boot/zlib.h" | 
 | #undef	OFF				/* avoid conflicts */ | 
 |  | 
 | /* To avoid a build time warning */ | 
 | #ifdef STDC | 
 | #include <malloc.h> | 
 | #endif | 
 |  | 
 | #ifndef local | 
 | #define local static | 
 | #endif | 
 | /* compile with -Dlocal if your debugger can't find static symbols */ | 
 |  | 
 | typedef unsigned char uch; | 
 | typedef uch FAR uchf; | 
 | typedef unsigned short ush; | 
 | typedef ush FAR ushf; | 
 | typedef unsigned long ulg; | 
 |  | 
 | #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] | 
 | #define ERR_RETURN(strm,err) return (strm->msg = (char*)ERR_MSG(err), (err)) | 
 | /* To be used only when the state is known to be valid */ | 
 |  | 
 | #ifndef NULL | 
 | #define NULL	((void *) 0) | 
 | #endif | 
 |  | 
 | 	/* common constants */ | 
 |  | 
 | #ifndef DEF_WBITS | 
 | #define DEF_WBITS MAX_WBITS | 
 | #endif | 
 | /* default windowBits for decompression. MAX_WBITS is for compression only */ | 
 |  | 
 | #if MAX_MEM_LEVEL >= 8 | 
 | #define DEF_MEM_LEVEL 8 | 
 | #else | 
 | #define DEF_MEM_LEVEL  MAX_MEM_LEVEL | 
 | #endif | 
 | /* default memLevel */ | 
 |  | 
 | #define STORED_BLOCK 0 | 
 | #define STATIC_TREES 1 | 
 | #define DYN_TREES    2 | 
 | /* The three kinds of block type */ | 
 |  | 
 | #define MIN_MATCH 3 | 
 | #define MAX_MATCH 258 | 
 | /* The minimum and maximum match lengths */ | 
 |  | 
 | 	 /* functions */ | 
 |  | 
 | #include <linux/string.h> | 
 | #define zmemcpy memcpy | 
 | #define zmemcmp memcmp | 
 | #define zmemzero(dest, len) memset(dest, 0, len) | 
 |  | 
 | /* Diagnostic functions */ | 
 | #ifdef DEBUG | 
 | 	extern int z_verbose; | 
 | 	extern void z_error    OF((char *m)); | 
 | #define Assert(cond,msg) {if(!(cond)) z_error(msg);} | 
 | #define fprintf(fp,...)	printf(__VA_ARGS__) | 
 | #define Trace(x) {if (z_verbose>=0) fprintf x ;} | 
 | #define Tracev(x) {if (z_verbose>0) fprintf x ;} | 
 | #define Tracevv(x) {if (z_verbose>1) fprintf x ;} | 
 | #define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} | 
 | #define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} | 
 | #else | 
 | #define Assert(cond,msg) | 
 | #define Trace(x) | 
 | #define Tracev(x) | 
 | #define Tracevv(x) | 
 | #define Tracec(c,x) | 
 | #define Tracecv(c,x) | 
 | #endif | 
 |  | 
 | voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); | 
 | void zcfree  OF((voidpf opaque, voidpf ptr, unsigned size)); | 
 |  | 
 | #define ZALLOC(strm, items, size) \ | 
 | 	(*((strm)->zalloc))((strm)->opaque, (items), (size)) | 
 | #define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr), 0) | 
 |  | 
 | /*+++++*/ | 
 | /* inftrees.h -- header to use inftrees.c | 
 |  * Copyright (C) 1995-2005 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. | 
 |  */ | 
 |  | 
 | /* Structure for decoding tables.  Each entry provides either the | 
 |    information needed to do the operation requested by the code that | 
 |    indexed that table entry, or it provides a pointer to another | 
 |    table that indexes more bits of the code.  op indicates whether | 
 |    the entry is a pointer to another table, a literal, a length or | 
 |    distance, an end-of-block, or an invalid code.  For a table | 
 |    pointer, the low four bits of op is the number of index bits of | 
 |    that table.  For a length or distance, the low four bits of op | 
 |    is the number of extra bits to get after the code.  bits is | 
 |    the number of bits in this code or part of the code to drop off | 
 |    of the bit buffer.  val is the actual byte to output in the case | 
 |    of a literal, the base length or distance, or the offset from | 
 |    the current table to the next table.  Each entry is four bytes. */ | 
 |  | 
 | typedef struct { | 
 | 	unsigned char op;           /* operation, extra bits, table bits */ | 
 | 	unsigned char bits;         /* bits in this part of the code */ | 
 | 	unsigned short val;         /* offset in table or code value */ | 
 | } code; | 
 |  | 
 | /* Maximum size of dynamic tree.  The maximum found in a long but non- | 
 |    exhaustive search was 1444 code structures (852 for length/literals | 
 |    and 592 for distances, the latter actually the result of an | 
 |    exhaustive search).  The true maximum is not known, but the value | 
 |    below is more than safe. */ | 
 | #define ENOUGH 2048 | 
 | #define MAXD 592 | 
 |  | 
 | /* Type of code to build for inftable() */ | 
 | typedef enum { | 
 | 	CODES, | 
 | 	LENS, | 
 | 	DISTS | 
 | } codetype; | 
 |  | 
 | extern int inflate_table OF((codetype type, unsigned short FAR *lens, | 
 | 				unsigned codes, code FAR * FAR *table, | 
 | 				unsigned FAR *bits, unsigned short FAR *work)); | 
 | /*+++++*/ | 
 | /* 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. | 
 |  */ | 
 |  | 
 | #define GUNZIP | 
 |  | 
 | /* 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() */ | 
 | 	START, | 
 | 	WASH, | 
 | 	END, | 
 | 	BADCODE | 
 | } 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 FAR *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 FAR *lencode; /* starting table for length/literal codes */ | 
 | 	code const FAR *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 FAR *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 */ | 
 | }; | 
 |  | 
 | /*+++++*/ | 
 | /* inffast.h -- header to use inffast.c | 
 |  * Copyright (C) 1995-2003 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. | 
 |  */ | 
 |  | 
 | void inflate_fast OF((z_streamp strm, unsigned start)); | 
 | /*+++++*/ | 
 |     /* inffixed.h -- table for decoding fixed codes | 
 |      * Generated automatically by makefixed(). | 
 |      */ | 
 |  | 
 |     /* 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. | 
 |      */ | 
 |  | 
 | 	static const code lenfix[512] = { | 
 | 	{96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, | 
 | 	{0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, | 
 | 	{0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, | 
 | 	{0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, | 
 | 	{0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, | 
 | 	{21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, | 
 | 	{0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, | 
 | 	{0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, | 
 | 	{18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, | 
 | 	{0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, | 
 | 	{0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, | 
 | 	{0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, | 
 | 	{20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, | 
 | 	{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, | 
 | 	{0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, | 
 | 	{0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, | 
 | 	{16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, | 
 | 	{0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, | 
 | 	{0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, | 
 | 	{0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, | 
 | 	{0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, | 
 | 	{0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, | 
 | 	{0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, | 
 | 	{0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, | 
 | 	{17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, | 
 | 	{0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, | 
 | 	{0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, | 
 | 	{0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, | 
 | 	{19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, | 
 | 	{0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, | 
 | 	{0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, | 
 | 	{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, | 
 | 	{16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, | 
 | 	{0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, | 
 | 	{0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, | 
 | 	{0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, | 
 | 	{0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, | 
 | 	{20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, | 
 | 	{0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, | 
 | 	{0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, | 
 | 	{17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, | 
 | 	{0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, | 
 | 	{0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, | 
 | 	{0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, | 
 | 	{20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, | 
 | 	{0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, | 
 | 	{0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, | 
 | 	{0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, | 
 | 	{16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, | 
 | 	{0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, | 
 | 	{0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, | 
 | 	{0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, | 
 | 	{0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, | 
 | 	{0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, | 
 | 	{0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, | 
 | 	{0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, | 
 | 	{16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, | 
 | 	{0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, | 
 | 	{0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, | 
 | 	{0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, | 
 | 	{19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, | 
 | 	{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, | 
 | 	{0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, | 
 | 	{0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, | 
 | 	{16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, | 
 | 	{0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, | 
 | 	{0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, | 
 | 	{0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, | 
 | 	{0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, | 
 | 	{64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, | 
 | 	{0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, | 
 | 	{0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, | 
 | 	{18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, | 
 | 	{0,9,255} | 
 | 	}; | 
 |  | 
 | 	static const code distfix[32] = { | 
 | 	{16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, | 
 | 	{21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, | 
 | 	{18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, | 
 | 	{19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, | 
 | 	{16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, | 
 | 	{22,5,193},{64,5,0} | 
 | 	}; | 
 |  | 
 | /*+++++*/ | 
 | /* inffast.c -- fast decoding | 
 |  * Copyright (C) 1995-2004 Mark Adler | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h | 
 |  */ | 
 |  | 
 | /* Allow machine dependent optimization for post-increment or pre-increment. | 
 |    Based on testing to date, | 
 |    Pre-increment preferred for: | 
 |    - PowerPC G3 (Adler) | 
 |    - MIPS R5000 (Randers-Pehrson) | 
 |    Post-increment preferred for: | 
 |    - none | 
 |    No measurable difference: | 
 |    - Pentium III (Anderson) | 
 |    - M68060 (Nikl) | 
 |  */ | 
 | #define OFF 1 | 
 | #define PUP(a) *++(a) | 
 | #define UP_UNALIGNED(a) get_unaligned(++(a)) | 
 |  | 
 | /* | 
 |    Decode literal, length, and distance codes and write out the resulting | 
 |    literal and match bytes until either not enough input or output is | 
 |    available, an end-of-block is encountered, or a data error is encountered. | 
 |    When large enough input and output buffers are supplied to inflate(), for | 
 |    example, a 16K input buffer and a 64K output buffer, more than 95% of the | 
 |    inflate execution time is spent in this routine. | 
 |  | 
 |    Entry assumptions: | 
 |  | 
 |         state->mode == LEN | 
 |         strm->avail_in >= 6 | 
 |         strm->avail_out >= 258 | 
 |         start >= strm->avail_out | 
 |         state->bits < 8 | 
 |  | 
 |    On return, state->mode is one of: | 
 |  | 
 |         LEN -- ran out of enough output space or enough available input | 
 |         TYPE -- reached end of block code, inflate() to interpret next block | 
 |         BAD -- error in block data | 
 |  | 
 |    Notes: | 
 |  | 
 |     - The maximum input bits used by a length/distance pair is 15 bits for the | 
 |       length code, 5 bits for the length extra, 15 bits for the distance code, | 
 |       and 13 bits for the distance extra.  This totals 48 bits, or six bytes. | 
 |       Therefore if strm->avail_in >= 6, then there is enough input to avoid | 
 |       checking for available input while decoding. | 
 |  | 
 |     - The maximum bytes that a single length/distance pair can output is 258 | 
 |       bytes, which is the maximum length that can be coded.  inflate_fast() | 
 |       requires strm->avail_out >= 258 for each loop to avoid checking for | 
 |       output space. | 
 |  */ | 
 | void inflate_fast(strm, start) | 
 | z_streamp strm; | 
 | unsigned start;         /* inflate()'s starting value for strm->avail_out */ | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |     unsigned char FAR *in;      /* local strm->next_in */ | 
 |     unsigned char FAR *last;    /* while in < last, enough input available */ | 
 |     unsigned char FAR *out;     /* local strm->next_out */ | 
 |     unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */ | 
 |     unsigned char FAR *end;     /* while out < end, enough space available */ | 
 | #ifdef INFLATE_STRICT | 
 |     unsigned dmax;              /* maximum distance from zlib header */ | 
 | #endif | 
 |     unsigned wsize;             /* window size or zero if not using window */ | 
 |     unsigned whave;             /* valid bytes in the window */ | 
 |     unsigned write;             /* window write index */ | 
 |     unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */ | 
 |     unsigned long hold;         /* local strm->hold */ | 
 |     unsigned bits;              /* local strm->bits */ | 
 |     code const FAR *lcode;      /* local strm->lencode */ | 
 |     code const FAR *dcode;      /* local strm->distcode */ | 
 |     unsigned lmask;             /* mask for first level of length codes */ | 
 |     unsigned dmask;             /* mask for first level of distance codes */ | 
 |     code this;                  /* retrieved table entry */ | 
 |     unsigned op;                /* code bits, operation, extra bits, or */ | 
 |                                 /*  window position, window bytes to copy */ | 
 |     unsigned len;               /* match length, unused bytes */ | 
 |     unsigned dist;              /* match distance */ | 
 |     unsigned char FAR *from;    /* where to copy match from */ | 
 |  | 
 |     /* copy state to local variables */ | 
 |     state = (struct inflate_state FAR *)strm->state; | 
 |     in = strm->next_in - OFF; | 
 |     last = in + (strm->avail_in - 5); | 
 |     out = strm->next_out - OFF; | 
 |     beg = out - (start - strm->avail_out); | 
 |     end = out + (strm->avail_out - 257); | 
 | #ifdef INFLATE_STRICT | 
 |     dmax = state->dmax; | 
 | #endif | 
 |     wsize = state->wsize; | 
 |     whave = state->whave; | 
 |     write = state->write; | 
 |     window = state->window; | 
 |     hold = state->hold; | 
 |     bits = state->bits; | 
 |     lcode = state->lencode; | 
 |     dcode = state->distcode; | 
 |     lmask = (1U << state->lenbits) - 1; | 
 |     dmask = (1U << state->distbits) - 1; | 
 |  | 
 |     /* decode literals and length/distances until end-of-block or not enough | 
 |        input data or output space */ | 
 |     do { | 
 |         if (bits < 15) { | 
 |             hold += (unsigned long)(PUP(in)) << bits; | 
 |             bits += 8; | 
 |             hold += (unsigned long)(PUP(in)) << bits; | 
 |             bits += 8; | 
 |         } | 
 |         this = lcode[hold & lmask]; | 
 |       dolen: | 
 |         op = (unsigned)(this.bits); | 
 |         hold >>= op; | 
 |         bits -= op; | 
 |         op = (unsigned)(this.op); | 
 |         if (op == 0) {                          /* literal */ | 
 |             Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? | 
 |                     "inflate:         literal '%c'\n" : | 
 |                     "inflate:         literal 0x%02x\n", this.val)); | 
 |             PUP(out) = (unsigned char)(this.val); | 
 |         } | 
 |         else if (op & 16) {                     /* length base */ | 
 |             len = (unsigned)(this.val); | 
 |             op &= 15;                           /* number of extra bits */ | 
 |             if (op) { | 
 |                 if (bits < op) { | 
 |                     hold += (unsigned long)(PUP(in)) << bits; | 
 |                     bits += 8; | 
 |                 } | 
 |                 len += (unsigned)hold & ((1U << op) - 1); | 
 |                 hold >>= op; | 
 |                 bits -= op; | 
 |             } | 
 |             Tracevv((stderr, "inflate:         length %u\n", len)); | 
 |             if (bits < 15) { | 
 |                 hold += (unsigned long)(PUP(in)) << bits; | 
 |                 bits += 8; | 
 |                 hold += (unsigned long)(PUP(in)) << bits; | 
 |                 bits += 8; | 
 |             } | 
 |             this = dcode[hold & dmask]; | 
 |           dodist: | 
 |             op = (unsigned)(this.bits); | 
 |             hold >>= op; | 
 |             bits -= op; | 
 |             op = (unsigned)(this.op); | 
 |             if (op & 16) {                      /* distance base */ | 
 |                 dist = (unsigned)(this.val); | 
 |                 op &= 15;                       /* number of extra bits */ | 
 |                 if (bits < op) { | 
 |                     hold += (unsigned long)(PUP(in)) << bits; | 
 |                     bits += 8; | 
 |                     if (bits < op) { | 
 |                         hold += (unsigned long)(PUP(in)) << bits; | 
 |                         bits += 8; | 
 |                     } | 
 |                 } | 
 |                 dist += (unsigned)hold & ((1U << op) - 1); | 
 | #ifdef INFLATE_STRICT | 
 |                 if (dist > dmax) { | 
 |                     strm->msg = (char *)"invalid distance too far back"; | 
 |                     state->mode = BAD; | 
 |                     break; | 
 |                 } | 
 | #endif | 
 |                 hold >>= op; | 
 |                 bits -= op; | 
 |                 Tracevv((stderr, "inflate:         distance %u\n", dist)); | 
 |                 op = (unsigned)(out - beg);     /* max distance in output */ | 
 |                 if (dist > op) {                /* see if copy from window */ | 
 |                     op = dist - op;             /* distance back in window */ | 
 |                     if (op > whave) { | 
 |                         strm->msg = (char *)"invalid distance too far back"; | 
 |                         state->mode = BAD; | 
 |                         break; | 
 |                     } | 
 |                     from = window - OFF; | 
 |                     if (write == 0) {           /* very common case */ | 
 |                         from += wsize - op; | 
 |                         if (op < len) {         /* some from window */ | 
 |                             len -= op; | 
 |                             do { | 
 |                                 PUP(out) = PUP(from); | 
 |                             } while (--op); | 
 |                             from = out - dist;  /* rest from output */ | 
 |                         } | 
 |                     } | 
 |                     else if (write < op) {      /* wrap around window */ | 
 |                         from += wsize + write - op; | 
 |                         op -= write; | 
 |                         if (op < len) {         /* some from end of window */ | 
 |                             len -= op; | 
 |                             do { | 
 |                                 PUP(out) = PUP(from); | 
 |                             } while (--op); | 
 |                             from = window - OFF; | 
 |                             if (write < len) {  /* some from start of window */ | 
 |                                 op = write; | 
 |                                 len -= op; | 
 |                                 do { | 
 |                                     PUP(out) = PUP(from); | 
 |                                 } while (--op); | 
 |                                 from = out - dist;      /* rest from output */ | 
 |                             } | 
 |                         } | 
 |                     } | 
 |                     else {                      /* contiguous in window */ | 
 |                         from += write - op; | 
 |                         if (op < len) {         /* some from window */ | 
 |                             len -= op; | 
 |                             do { | 
 |                                 PUP(out) = PUP(from); | 
 |                             } while (--op); | 
 |                             from = out - dist;  /* rest from output */ | 
 |                         } | 
 |                     } | 
 |                     while (len > 2) { | 
 |                         PUP(out) = PUP(from); | 
 |                         PUP(out) = PUP(from); | 
 |                         PUP(out) = PUP(from); | 
 |                         len -= 3; | 
 |                     } | 
 |                     if (len) { | 
 |                         PUP(out) = PUP(from); | 
 |                         if (len > 1) | 
 |                             PUP(out) = PUP(from); | 
 |                     } | 
 |                 } | 
 |                 else { | 
 | 		    unsigned short *sout; | 
 | 		    unsigned long loops; | 
 |  | 
 |                     from = out - dist;          /* copy direct from output */ | 
 |                     /* minimum length is three */ | 
 | 		    /* Align out addr */ | 
 | 		    if (!((long)(out - 1 + OFF) & 1)) { | 
 | 			PUP(out) = PUP(from); | 
 | 			len--; | 
 | 		    } | 
 | 		    sout = (unsigned short *)(out - OFF); | 
 | 		    if (dist > 2 ) { | 
 | 			unsigned short *sfrom; | 
 |  | 
 | 			sfrom = (unsigned short *)(from - OFF); | 
 | 			loops = len >> 1; | 
 | 			do | 
 | 			    PUP(sout) = UP_UNALIGNED(sfrom); | 
 | 			while (--loops); | 
 | 			out = (unsigned char *)sout + OFF; | 
 | 			from = (unsigned char *)sfrom + OFF; | 
 | 		    } else { /* dist == 1 or dist == 2 */ | 
 | 			unsigned short pat16; | 
 |  | 
 | 			pat16 = *(sout-2+2*OFF); | 
 | 			if (dist == 1) | 
 | #if defined(__BIG_ENDIAN) | 
 | 			    pat16 = (pat16 & 0xff) | ((pat16 & 0xff ) << 8); | 
 | #elif defined(__LITTLE_ENDIAN) | 
 | 			    pat16 = (pat16 & 0xff00) | ((pat16 & 0xff00 ) >> 8); | 
 | #else | 
 | #error __BIG_ENDIAN nor __LITTLE_ENDIAN is defined | 
 | #endif | 
 | 			loops = len >> 1; | 
 | 			do | 
 | 			    PUP(sout) = pat16; | 
 | 			while (--loops); | 
 | 			out = (unsigned char *)sout + OFF; | 
 | 		    } | 
 | 		    if (len & 1) | 
 | 			PUP(out) = PUP(from); | 
 |                 } | 
 |             } | 
 |             else if ((op & 64) == 0) {          /* 2nd level distance code */ | 
 |                 this = dcode[this.val + (hold & ((1U << op) - 1))]; | 
 |                 goto dodist; | 
 |             } | 
 |             else { | 
 |                 strm->msg = (char *)"invalid distance code"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |         } | 
 |         else if ((op & 64) == 0) {              /* 2nd level length code */ | 
 |             this = lcode[this.val + (hold & ((1U << op) - 1))]; | 
 |             goto dolen; | 
 |         } | 
 |         else if (op & 32) {                     /* end-of-block */ | 
 |             Tracevv((stderr, "inflate:         end of block\n")); | 
 |             state->mode = TYPE; | 
 |             break; | 
 |         } | 
 |         else { | 
 |             strm->msg = (char *)"invalid literal/length code"; | 
 |             state->mode = BAD; | 
 |             break; | 
 |         } | 
 |     } while (in < last && out < end); | 
 |  | 
 |     /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ | 
 |     len = bits >> 3; | 
 |     in -= len; | 
 |     bits -= len << 3; | 
 |     hold &= (1U << bits) - 1; | 
 |  | 
 |     /* update state and return */ | 
 |     strm->next_in = in + OFF; | 
 |     strm->next_out = out + OFF; | 
 |     strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); | 
 |     strm->avail_out = (unsigned)(out < end ? | 
 |                                  257 + (end - out) : 257 - (out - end)); | 
 |     state->hold = hold; | 
 |     state->bits = bits; | 
 |     return; | 
 | } | 
 |  | 
 | /* | 
 |    inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): | 
 |    - Using bit fields for code structure | 
 |    - Different op definition to avoid & for extra bits (do & for table bits) | 
 |    - Three separate decoding do-loops for direct, window, and write == 0 | 
 |    - Special case for distance > 1 copies to do overlapped load and store copy | 
 |    - Explicit branch predictions (based on measured branch probabilities) | 
 |    - Deferring match copy and interspersed it with decoding subsequent codes | 
 |    - Swapping literal/length else | 
 |    - Swapping window/direct else | 
 |    - Larger unrolled copy loops (three is about right) | 
 |    - Moving len -= 3 statement into middle of loop | 
 |  */ | 
 |  | 
 | /*+++++*/ | 
 | /* inftrees.c -- generate Huffman trees for efficient decoding | 
 |  * Copyright (C) 1995-2005 Mark Adler | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h | 
 |  */ | 
 |  | 
 | #define MAXBITS 15 | 
 | /* | 
 |   If you use the zlib library in a product, an acknowledgment is welcome | 
 |   in the documentation of your product. If for some reason you cannot | 
 |   include such an acknowledgment, I would appreciate that you keep this | 
 |   copyright string in the executable of your product. | 
 |  */ | 
 |  | 
 | /* | 
 |    Build a set of tables to decode the provided canonical Huffman code. | 
 |    The code lengths are lens[0..codes-1].  The result starts at *table, | 
 |    whose indices are 0..2^bits-1.  work is a writable array of at least | 
 |    lens shorts, which is used as a work area.  type is the type of code | 
 |    to be generated, CODES, LENS, or DISTS.  On return, zero is success, | 
 |    -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table | 
 |    on return points to the next available entry's address.  bits is the | 
 |    requested root table index bits, and on return it is the actual root | 
 |    table index bits.  It will differ if the request is greater than the | 
 |    longest code or if it is less than the shortest code. | 
 |  */ | 
 | int inflate_table(type, lens, codes, table, bits, work) | 
 | codetype type; | 
 | unsigned short FAR *lens; | 
 | unsigned codes; | 
 | code FAR * FAR *table; | 
 | unsigned FAR *bits; | 
 | unsigned short FAR *work; | 
 | { | 
 |     unsigned len;               /* a code's length in bits */ | 
 |     unsigned sym;               /* index of code symbols */ | 
 |     unsigned min, max;          /* minimum and maximum code lengths */ | 
 |     unsigned root;              /* number of index bits for root table */ | 
 |     unsigned curr;              /* number of index bits for current table */ | 
 |     unsigned drop;              /* code bits to drop for sub-table */ | 
 |     int left;                   /* number of prefix codes available */ | 
 |     unsigned used;              /* code entries in table used */ | 
 |     unsigned huff;              /* Huffman code */ | 
 |     unsigned incr;              /* for incrementing code, index */ | 
 |     unsigned fill;              /* index for replicating entries */ | 
 |     unsigned low;               /* low bits for current root entry */ | 
 |     unsigned mask;              /* mask for low root bits */ | 
 |     code this;                  /* table entry for duplication */ | 
 |     code FAR *next;             /* next available space in table */ | 
 |     const unsigned short FAR *base;     /* base value table to use */ | 
 |     const unsigned short FAR *extra;    /* extra bits table to use */ | 
 |     int end;                    /* use base and extra for symbol > end */ | 
 |     unsigned short count[MAXBITS+1];    /* number of codes of each length */ | 
 |     unsigned short offs[MAXBITS+1];     /* offsets in table for each length */ | 
 |     static const unsigned short lbase[31] = { /* Length codes 257..285 base */ | 
 |         3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | 
 |         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | 
 |     static const unsigned short lext[31] = { /* Length codes 257..285 extra */ | 
 |         16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, | 
 |         19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; | 
 |     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ | 
 |         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | 
 |         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | 
 |         8193, 12289, 16385, 24577, 0, 0}; | 
 |     static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ | 
 |         16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, | 
 |         23, 23, 24, 24, 25, 25, 26, 26, 27, 27, | 
 |         28, 28, 29, 29, 64, 64}; | 
 |  | 
 |     /* | 
 |        Process a set of code lengths to create a canonical Huffman code.  The | 
 |        code lengths are lens[0..codes-1].  Each length corresponds to the | 
 |        symbols 0..codes-1.  The Huffman code is generated by first sorting the | 
 |        symbols by length from short to long, and retaining the symbol order | 
 |        for codes with equal lengths.  Then the code starts with all zero bits | 
 |        for the first code of the shortest length, and the codes are integer | 
 |        increments for the same length, and zeros are appended as the length | 
 |        increases.  For the deflate format, these bits are stored backwards | 
 |        from their more natural integer increment ordering, and so when the | 
 |        decoding tables are built in the large loop below, the integer codes | 
 |        are incremented backwards. | 
 |  | 
 |        This routine assumes, but does not check, that all of the entries in | 
 |        lens[] are in the range 0..MAXBITS.  The caller must assure this. | 
 |        1..MAXBITS is interpreted as that code length.  zero means that that | 
 |        symbol does not occur in this code. | 
 |  | 
 |        The codes are sorted by computing a count of codes for each length, | 
 |        creating from that a table of starting indices for each length in the | 
 |        sorted table, and then entering the symbols in order in the sorted | 
 |        table.  The sorted table is work[], with that space being provided by | 
 |        the caller. | 
 |  | 
 |        The length counts are used for other purposes as well, i.e. finding | 
 |        the minimum and maximum length codes, determining if there are any | 
 |        codes at all, checking for a valid set of lengths, and looking ahead | 
 |        at length counts to determine sub-table sizes when building the | 
 |        decoding tables. | 
 |      */ | 
 |  | 
 |     /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ | 
 |     for (len = 0; len <= MAXBITS; len++) | 
 |         count[len] = 0; | 
 |     for (sym = 0; sym < codes; sym++) | 
 |         count[lens[sym]]++; | 
 |  | 
 |     /* bound code lengths, force root to be within code lengths */ | 
 |     root = *bits; | 
 |     for (max = MAXBITS; max >= 1; max--) | 
 |         if (count[max] != 0) break; | 
 |     if (root > max) root = max; | 
 |     if (max == 0) {                     /* no symbols to code at all */ | 
 |         this.op = (unsigned char)64;    /* invalid code marker */ | 
 |         this.bits = (unsigned char)1; | 
 |         this.val = (unsigned short)0; | 
 |         *(*table)++ = this;             /* make a table to force an error */ | 
 |         *(*table)++ = this; | 
 |         *bits = 1; | 
 |         return 0;     /* no symbols, but wait for decoding to report error */ | 
 |     } | 
 |     for (min = 1; min <= MAXBITS; min++) | 
 |         if (count[min] != 0) break; | 
 |     if (root < min) root = min; | 
 |  | 
 |     /* check for an over-subscribed or incomplete set of lengths */ | 
 |     left = 1; | 
 |     for (len = 1; len <= MAXBITS; len++) { | 
 |         left <<= 1; | 
 |         left -= count[len]; | 
 |         if (left < 0) return -1;        /* over-subscribed */ | 
 |     } | 
 |     if (left > 0 && (type == CODES || max != 1)) | 
 |         return -1;                      /* incomplete set */ | 
 |  | 
 |     /* generate offsets into symbol table for each length for sorting */ | 
 |     offs[1] = 0; | 
 |     for (len = 1; len < MAXBITS; len++) | 
 |         offs[len + 1] = offs[len] + count[len]; | 
 |  | 
 |     /* sort symbols by length, by symbol order within each length */ | 
 |     for (sym = 0; sym < codes; sym++) | 
 |         if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; | 
 |  | 
 |     /* | 
 |        Create and fill in decoding tables.  In this loop, the table being | 
 |        filled is at next and has curr index bits.  The code being used is huff | 
 |        with length len.  That code is converted to an index by dropping drop | 
 |        bits off of the bottom.  For codes where len is less than drop + curr, | 
 |        those top drop + curr - len bits are incremented through all values to | 
 |        fill the table with replicated entries. | 
 |  | 
 |        root is the number of index bits for the root table.  When len exceeds | 
 |        root, sub-tables are created pointed to by the root entry with an index | 
 |        of the low root bits of huff.  This is saved in low to check for when a | 
 |        new sub-table should be started.  drop is zero when the root table is | 
 |        being filled, and drop is root when sub-tables are being filled. | 
 |  | 
 |        When a new sub-table is needed, it is necessary to look ahead in the | 
 |        code lengths to determine what size sub-table is needed.  The length | 
 |        counts are used for this, and so count[] is decremented as codes are | 
 |        entered in the tables. | 
 |  | 
 |        used keeps track of how many table entries have been allocated from the | 
 |        provided *table space.  It is checked when a LENS table is being made | 
 |        against the space in *table, ENOUGH, minus the maximum space needed by | 
 |        the worst case distance code, MAXD.  This should never happen, but the | 
 |        sufficiency of ENOUGH has not been proven exhaustively, hence the check. | 
 |        This assumes that when type == LENS, bits == 9. | 
 |  | 
 |        sym increments through all symbols, and the loop terminates when | 
 |        all codes of length max, i.e. all codes, have been processed.  This | 
 |        routine permits incomplete codes, so another loop after this one fills | 
 |        in the rest of the decoding tables with invalid code markers. | 
 |      */ | 
 |  | 
 |     /* set up for code type */ | 
 |     switch (type) { | 
 |     case CODES: | 
 |         base = extra = work;    /* dummy value--not used */ | 
 |         end = 19; | 
 |         break; | 
 |     case LENS: | 
 |         base = lbase; | 
 |         base -= 257; | 
 |         extra = lext; | 
 |         extra -= 257; | 
 |         end = 256; | 
 |         break; | 
 |     default:            /* DISTS */ | 
 |         base = dbase; | 
 |         extra = dext; | 
 |         end = -1; | 
 |     } | 
 |  | 
 |     /* initialize state for loop */ | 
 |     huff = 0;                   /* starting code */ | 
 |     sym = 0;                    /* starting code symbol */ | 
 |     len = min;                  /* starting code length */ | 
 |     next = *table;              /* current table to fill in */ | 
 |     curr = root;                /* current table index bits */ | 
 |     drop = 0;                   /* current bits to drop from code for index */ | 
 |     low = (unsigned)(-1);       /* trigger new sub-table when len > root */ | 
 |     used = 1U << root;          /* use root table entries */ | 
 |     mask = used - 1;            /* mask for comparing low */ | 
 |  | 
 |     /* check available table space */ | 
 |     if (type == LENS && used >= ENOUGH - MAXD) | 
 |         return 1; | 
 |  | 
 |     /* process all codes and make table entries */ | 
 |     for (;;) { | 
 |         /* create table entry */ | 
 |         this.bits = (unsigned char)(len - drop); | 
 |         if ((int)(work[sym]) < end) { | 
 |             this.op = (unsigned char)0; | 
 |             this.val = work[sym]; | 
 |         } | 
 |         else if ((int)(work[sym]) > end) { | 
 |             this.op = (unsigned char)(extra[work[sym]]); | 
 |             this.val = base[work[sym]]; | 
 |         } | 
 |         else { | 
 |             this.op = (unsigned char)(32 + 64);         /* end of block */ | 
 |             this.val = 0; | 
 |         } | 
 |  | 
 |         /* replicate for those indices with low len bits equal to huff */ | 
 |         incr = 1U << (len - drop); | 
 |         fill = 1U << curr; | 
 |         min = fill;                 /* save offset to next table */ | 
 |         do { | 
 |             fill -= incr; | 
 |             next[(huff >> drop) + fill] = this; | 
 |         } while (fill != 0); | 
 |  | 
 |         /* backwards increment the len-bit code huff */ | 
 |         incr = 1U << (len - 1); | 
 |         while (huff & incr) | 
 |             incr >>= 1; | 
 |         if (incr != 0) { | 
 |             huff &= incr - 1; | 
 |             huff += incr; | 
 |         } | 
 |         else | 
 |             huff = 0; | 
 |  | 
 |         /* go to next symbol, update count, len */ | 
 |         sym++; | 
 |         if (--(count[len]) == 0) { | 
 |             if (len == max) break; | 
 |             len = lens[work[sym]]; | 
 |         } | 
 |  | 
 |         /* create new sub-table if needed */ | 
 |         if (len > root && (huff & mask) != low) { | 
 |             /* if first time, transition to sub-tables */ | 
 |             if (drop == 0) | 
 |                 drop = root; | 
 |  | 
 |             /* increment past last table */ | 
 |             next += min;            /* here min is 1 << curr */ | 
 |  | 
 |             /* determine length of next table */ | 
 |             curr = len - drop; | 
 |             left = (int)(1 << curr); | 
 |             while (curr + drop < max) { | 
 |                 left -= count[curr + drop]; | 
 |                 if (left <= 0) break; | 
 |                 curr++; | 
 |                 left <<= 1; | 
 |             } | 
 |  | 
 |             /* check for enough space */ | 
 |             used += 1U << curr; | 
 |             if (type == LENS && used >= ENOUGH - MAXD) | 
 |                 return 1; | 
 |  | 
 |             /* point entry in root table to sub-table */ | 
 |             low = huff & mask; | 
 |             (*table)[low].op = (unsigned char)curr; | 
 |             (*table)[low].bits = (unsigned char)root; | 
 |             (*table)[low].val = (unsigned short)(next - *table); | 
 |         } | 
 |     } | 
 |  | 
 |     /* | 
 |        Fill in rest of table for incomplete codes.  This loop is similar to the | 
 |        loop above in incrementing huff for table indices.  It is assumed that | 
 |        len is equal to curr + drop, so there is no loop needed to increment | 
 |        through high index bits.  When the current sub-table is filled, the loop | 
 |        drops back to the root table to fill in any remaining entries there. | 
 |      */ | 
 |     this.op = (unsigned char)64;                /* invalid code marker */ | 
 |     this.bits = (unsigned char)(len - drop); | 
 |     this.val = (unsigned short)0; | 
 |     while (huff != 0) { | 
 |         /* when done with sub-table, drop back to root table */ | 
 |         if (drop != 0 && (huff & mask) != low) { | 
 |             drop = 0; | 
 |             len = root; | 
 |             next = *table; | 
 |             this.bits = (unsigned char)len; | 
 |         } | 
 |  | 
 |         /* put invalid code marker in table */ | 
 |         next[huff >> drop] = this; | 
 |  | 
 |         /* backwards increment the len-bit code huff */ | 
 |         incr = 1U << (len - 1); | 
 |         while (huff & incr) | 
 |             incr >>= 1; | 
 |         if (incr != 0) { | 
 |             huff &= incr - 1; | 
 |             huff += incr; | 
 |         } | 
 |         else | 
 |             huff = 0; | 
 |     } | 
 |  | 
 |     /* set return parameters */ | 
 |     *table += used; | 
 |     *bits = root; | 
 |     return 0; | 
 | } | 
 |  | 
 | /*+++++*/ | 
 | /* inflate.c -- zlib decompression | 
 |  * Copyright (C) 1995-2005 Mark Adler | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h | 
 |  */ | 
 | local void fixedtables OF((struct inflate_state FAR *state)); | 
 | local int updatewindow OF((z_streamp strm, unsigned out)); | 
 |  | 
 | int ZEXPORT inflateReset(strm) | 
 | z_streamp strm; | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |  | 
 |     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | 
 |     state = (struct inflate_state FAR *)strm->state; | 
 |     strm->total_in = strm->total_out = state->total = 0; | 
 |     strm->msg = Z_NULL; | 
 |     strm->adler = 1;        /* to support ill-conceived Java test suite */ | 
 |     state->mode = HEAD; | 
 |     state->last = 0; | 
 |     state->havedict = 0; | 
 |     state->dmax = 32768U; | 
 |     state->head = Z_NULL; | 
 |     state->wsize = 0; | 
 |     state->whave = 0; | 
 |     state->write = 0; | 
 |     state->hold = 0; | 
 |     state->bits = 0; | 
 |     state->lencode = state->distcode = state->next = state->codes; | 
 |     WATCHDOG_RESET(); | 
 |     Tracev((stderr, "inflate: reset\n")); | 
 |     return Z_OK; | 
 | } | 
 |  | 
 | int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) | 
 | z_streamp strm; | 
 | int windowBits; | 
 | const char *version; | 
 | int stream_size; | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |  | 
 |     if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || | 
 |         stream_size != (int)(sizeof(z_stream))) | 
 |         return Z_VERSION_ERROR; | 
 |     if (strm == Z_NULL) return Z_STREAM_ERROR; | 
 |     strm->msg = Z_NULL;                 /* in case we return an error */ | 
 |     if (strm->zalloc == (alloc_func)0) { | 
 |         strm->zalloc = zcalloc; | 
 |         strm->opaque = (voidpf)0; | 
 |     } | 
 |     if (strm->zfree == (free_func)0) strm->zfree = zcfree; | 
 |     state = (struct inflate_state FAR *) | 
 |             ZALLOC(strm, 1, sizeof(struct inflate_state)); | 
 |     if (state == Z_NULL) return Z_MEM_ERROR; | 
 |     Tracev((stderr, "inflate: allocated\n")); | 
 |     strm->state = (struct internal_state FAR *)state; | 
 |     if (windowBits < 0) { | 
 |         state->wrap = 0; | 
 |         windowBits = -windowBits; | 
 |     } | 
 |     else { | 
 |         state->wrap = (windowBits >> 4) + 1; | 
 | #ifdef GUNZIP | 
 |         if (windowBits < 48) windowBits &= 15; | 
 | #endif | 
 |     } | 
 |     if (windowBits < 8 || windowBits > 15) { | 
 |         ZFREE(strm, state); | 
 |         strm->state = Z_NULL; | 
 |         return Z_STREAM_ERROR; | 
 |     } | 
 |     state->wbits = (unsigned)windowBits; | 
 |     state->window = Z_NULL; | 
 |     return inflateReset(strm); | 
 | } | 
 |  | 
 | int ZEXPORT inflateInit_(strm, version, stream_size) | 
 | z_streamp strm; | 
 | const char *version; | 
 | int stream_size; | 
 | { | 
 |     return inflateInit2_(strm, DEF_WBITS, version, stream_size); | 
 | } | 
 |  | 
 | local void fixedtables(state) | 
 | struct inflate_state FAR *state; | 
 | { | 
 |     state->lencode = lenfix; | 
 |     state->lenbits = 9; | 
 |     state->distcode = distfix; | 
 |     state->distbits = 5; | 
 | } | 
 |  | 
 | /* | 
 |    Update the window with the last wsize (normally 32K) bytes written before | 
 |    returning.  If window does not exist yet, create it.  This is only called | 
 |    when a window is already in use, or when output has been written during this | 
 |    inflate call, but the end of the deflate stream has not been reached yet. | 
 |    It is also called to create a window for dictionary data when a dictionary | 
 |    is loaded. | 
 |  | 
 |    Providing output buffers larger than 32K to inflate() should provide a speed | 
 |    advantage, since only the last 32K of output is copied to the sliding window | 
 |    upon return from inflate(), and since all distances after the first 32K of | 
 |    output will fall in the output data, making match copies simpler and faster. | 
 |    The advantage may be dependent on the size of the processor's data caches. | 
 |  */ | 
 | local int updatewindow(strm, out) | 
 | z_streamp strm; | 
 | unsigned out; | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |     unsigned copy, dist; | 
 |  | 
 |     state = (struct inflate_state FAR *)strm->state; | 
 |  | 
 |     /* if it hasn't been done already, allocate space for the window */ | 
 |     if (state->window == Z_NULL) { | 
 |         state->window = (unsigned char FAR *) | 
 |                         ZALLOC(strm, 1U << state->wbits, | 
 |                                sizeof(unsigned char)); | 
 |         if (state->window == Z_NULL) return 1; | 
 |     } | 
 |  | 
 |     /* if window not in use yet, initialize */ | 
 |     if (state->wsize == 0) { | 
 |         state->wsize = 1U << state->wbits; | 
 |         state->write = 0; | 
 |         state->whave = 0; | 
 |     } | 
 |  | 
 |     /* copy state->wsize or less output bytes into the circular window */ | 
 |     copy = out - strm->avail_out; | 
 |     if (copy >= state->wsize) { | 
 |         zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); | 
 |         state->write = 0; | 
 |         state->whave = state->wsize; | 
 |     } | 
 |     else { | 
 |         dist = state->wsize - state->write; | 
 |         if (dist > copy) dist = copy; | 
 |         zmemcpy(state->window + state->write, strm->next_out - copy, dist); | 
 |         copy -= dist; | 
 |         if (copy) { | 
 |             zmemcpy(state->window, strm->next_out - copy, copy); | 
 |             state->write = copy; | 
 |             state->whave = state->wsize; | 
 |         } | 
 |         else { | 
 |             state->write += dist; | 
 |             if (state->write == state->wsize) state->write = 0; | 
 |             if (state->whave < state->wsize) state->whave += dist; | 
 |         } | 
 |     } | 
 |     return 0; | 
 | } | 
 |  | 
 | /* Macros for inflate(): */ | 
 |  | 
 | /* check function to use adler32() for zlib or crc32() for gzip */ | 
 | #define UPDATE(check, buf, len) \ | 
 | 	(state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) | 
 |  | 
 | /* check macros for header crc */ | 
 | #define CRC2(check, word) \ | 
 | 	do { \ | 
 | 		hbuf[0] = (unsigned char)(word); \ | 
 | 		hbuf[1] = (unsigned char)((word) >> 8); \ | 
 | 		check = crc32(check, hbuf, 2); \ | 
 | 	} while (0) | 
 |  | 
 | #define CRC4(check, word) \ | 
 | 	do { \ | 
 | 		hbuf[0] = (unsigned char)(word); \ | 
 | 		hbuf[1] = (unsigned char)((word) >> 8); \ | 
 | 		hbuf[2] = (unsigned char)((word) >> 16); \ | 
 | 		hbuf[3] = (unsigned char)((word) >> 24); \ | 
 | 		check = crc32(check, hbuf, 4); \ | 
 | 	} while (0) | 
 |  | 
 | /* Load registers with state in inflate() for speed */ | 
 | #define LOAD() \ | 
 | 	do { \ | 
 | 		put = strm->next_out; \ | 
 | 		left = strm->avail_out; \ | 
 | 		next = strm->next_in; \ | 
 | 		have = strm->avail_in; \ | 
 | 		hold = state->hold; \ | 
 | 		bits = state->bits; \ | 
 | 	} while (0) | 
 |  | 
 | /* Restore state from registers in inflate() */ | 
 | #define RESTORE() \ | 
 | 	do { \ | 
 | 		strm->next_out = put; \ | 
 | 		strm->avail_out = left; \ | 
 | 		strm->next_in = next; \ | 
 | 		strm->avail_in = have; \ | 
 | 		state->hold = hold; \ | 
 | 		state->bits = bits; \ | 
 | 	} while (0) | 
 |  | 
 | /* Clear the input bit accumulator */ | 
 | #define INITBITS() \ | 
 | 	do { \ | 
 | 		hold = 0; \ | 
 | 		bits = 0; \ | 
 | 	} while (0) | 
 |  | 
 | /* Get a byte of input into the bit accumulator, or return from inflate() | 
 |    if there is no input available. */ | 
 | #define PULLBYTE() \ | 
 | 	do { \ | 
 | 		if (have == 0) goto inf_leave; \ | 
 | 		have--; \ | 
 | 		hold += (unsigned long)(*next++) << bits; \ | 
 | 		bits += 8; \ | 
 | 	} while (0) | 
 |  | 
 | /* Assure that there are at least n bits in the bit accumulator.  If there is | 
 |    not enough available input to do that, then return from inflate(). */ | 
 | #define NEEDBITS(n) \ | 
 | 	do { \ | 
 | 		while (bits < (unsigned)(n)) \ | 
 | 			PULLBYTE(); \ | 
 | 	} while (0) | 
 |  | 
 | /* Return the low n bits of the bit accumulator (n < 16) */ | 
 | #define BITS(n) \ | 
 | 	((unsigned)hold & ((1U << (n)) - 1)) | 
 |  | 
 | /* Remove n bits from the bit accumulator */ | 
 | #define DROPBITS(n) \ | 
 | 	do { \ | 
 | 		hold >>= (n); \ | 
 | 		bits -= (unsigned)(n); \ | 
 | 	} while (0) | 
 |  | 
 | /* Remove zero to seven bits as needed to go to a byte boundary */ | 
 | #define BYTEBITS() \ | 
 | 	do { \ | 
 | 		hold >>= bits & 7; \ | 
 | 		bits -= bits & 7; \ | 
 | 	} while (0) | 
 |  | 
 | /* Reverse the bytes in a 32-bit value */ | 
 | #define REVERSE(q) \ | 
 | 	((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ | 
 | 		(((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) | 
 |  | 
 | /* | 
 |    inflate() uses a state machine to process as much input data and generate as | 
 |    much output data as possible before returning.  The state machine is | 
 |    structured roughly as follows: | 
 |  | 
 |     for (;;) switch (state) { | 
 |     ... | 
 |     case STATEn: | 
 |         if (not enough input data or output space to make progress) | 
 |             return; | 
 |         ... make progress ... | 
 |         state = STATEm; | 
 |         break; | 
 |     ... | 
 |     } | 
 |  | 
 |    so when inflate() is called again, the same case is attempted again, and | 
 |    if the appropriate resources are provided, the machine proceeds to the | 
 |    next state.  The NEEDBITS() macro is usually the way the state evaluates | 
 |    whether it can proceed or should return.  NEEDBITS() does the return if | 
 |    the requested bits are not available.  The typical use of the BITS macros | 
 |    is: | 
 |  | 
 |         NEEDBITS(n); | 
 |         ... do something with BITS(n) ... | 
 |         DROPBITS(n); | 
 |  | 
 |    where NEEDBITS(n) either returns from inflate() if there isn't enough | 
 |    input left to load n bits into the accumulator, or it continues.  BITS(n) | 
 |    gives the low n bits in the accumulator.  When done, DROPBITS(n) drops | 
 |    the low n bits off the accumulator.  INITBITS() clears the accumulator | 
 |    and sets the number of available bits to zero.  BYTEBITS() discards just | 
 |    enough bits to put the accumulator on a byte boundary.  After BYTEBITS() | 
 |    and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. | 
 |  | 
 |    NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return | 
 |    if there is no input available.  The decoding of variable length codes uses | 
 |    PULLBYTE() directly in order to pull just enough bytes to decode the next | 
 |    code, and no more. | 
 |  | 
 |    Some states loop until they get enough input, making sure that enough | 
 |    state information is maintained to continue the loop where it left off | 
 |    if NEEDBITS() returns in the loop.  For example, want, need, and keep | 
 |    would all have to actually be part of the saved state in case NEEDBITS() | 
 |    returns: | 
 |  | 
 |     case STATEw: | 
 |         while (want < need) { | 
 |             NEEDBITS(n); | 
 |             keep[want++] = BITS(n); | 
 |             DROPBITS(n); | 
 |         } | 
 |         state = STATEx; | 
 |     case STATEx: | 
 |  | 
 |    As shown above, if the next state is also the next case, then the break | 
 |    is omitted. | 
 |  | 
 |    A state may also return if there is not enough output space available to | 
 |    complete that state.  Those states are copying stored data, writing a | 
 |    literal byte, and copying a matching string. | 
 |  | 
 |    When returning, a "goto inf_leave" is used to update the total counters, | 
 |    update the check value, and determine whether any progress has been made | 
 |    during that inflate() call in order to return the proper return code. | 
 |    Progress is defined as a change in either strm->avail_in or strm->avail_out. | 
 |    When there is a window, goto inf_leave will update the window with the last | 
 |    output written.  If a goto inf_leave occurs in the middle of decompression | 
 |    and there is no window currently, goto inf_leave will create one and copy | 
 |    output to the window for the next call of inflate(). | 
 |  | 
 |    In this implementation, the flush parameter of inflate() only affects the | 
 |    return code (per zlib.h).  inflate() always writes as much as possible to | 
 |    strm->next_out, given the space available and the provided input--the effect | 
 |    documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers | 
 |    the allocation of and copying into a sliding window until necessary, which | 
 |    provides the effect documented in zlib.h for Z_FINISH when the entire input | 
 |    stream available.  So the only thing the flush parameter actually does is: | 
 |    when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it | 
 |    will return Z_BUF_ERROR if it has not reached the end of the stream. | 
 |  */ | 
 | int ZEXPORT inflate(strm, flush) | 
 | z_streamp strm; | 
 | int flush; | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |     unsigned char FAR *next;    /* next input */ | 
 |     unsigned char FAR *put;     /* next output */ | 
 |     unsigned have, left;        /* available input and output */ | 
 |     unsigned long hold;         /* bit buffer */ | 
 |     unsigned bits;              /* bits in bit buffer */ | 
 |     unsigned in, out;           /* save starting available input and output */ | 
 |     unsigned copy;              /* number of stored or match bytes to copy */ | 
 |     unsigned char FAR *from;    /* where to copy match bytes from */ | 
 |     code this;                  /* current decoding table entry */ | 
 |     code last;                  /* parent table entry */ | 
 |     unsigned len;               /* length to copy for repeats, bits to drop */ | 
 |     int ret;                    /* return code */ | 
 | #ifdef GUNZIP | 
 |     unsigned char hbuf[4];      /* buffer for gzip header crc calculation */ | 
 | #endif | 
 |     static const unsigned short order[19] = /* permutation of code lengths */ | 
 |         {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | 
 |  | 
 |     if (strm == Z_NULL || strm->state == Z_NULL || | 
 |         (strm->next_in == Z_NULL && strm->avail_in != 0)) | 
 |         return Z_STREAM_ERROR; | 
 |  | 
 |     state = (struct inflate_state FAR *)strm->state; | 
 |     if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */ | 
 |     LOAD(); | 
 |     in = have; | 
 |     out = left; | 
 |     ret = Z_OK; | 
 |     for (;;) | 
 |         switch (state->mode) { | 
 |         case HEAD: | 
 |             if (state->wrap == 0) { | 
 |                 state->mode = TYPEDO; | 
 |                 break; | 
 |             } | 
 |             NEEDBITS(16); | 
 | #ifdef GUNZIP | 
 |             if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */ | 
 |                 state->check = crc32(0L, Z_NULL, 0); | 
 |                 CRC2(state->check, hold); | 
 |                 INITBITS(); | 
 |                 state->mode = FLAGS; | 
 |                 break; | 
 |             } | 
 |             state->flags = 0;           /* expect zlib header */ | 
 |             if (state->head != Z_NULL) | 
 |                 state->head->done = -1; | 
 |             if (!(state->wrap & 1) ||   /* check if zlib header allowed */ | 
 | #else | 
 |             if ( | 
 | #endif | 
 |                 ((BITS(8) << 8) + (hold >> 8)) % 31) { | 
 |                 strm->msg = (char *)"incorrect header check"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             if (BITS(4) != Z_DEFLATED) { | 
 |                 strm->msg = (char *)"unknown compression method"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             DROPBITS(4); | 
 |             len = BITS(4) + 8; | 
 |             if (len > state->wbits) { | 
 |                 strm->msg = (char *)"invalid window size"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             state->dmax = 1U << len; | 
 |             Tracev((stderr, "inflate:   zlib header ok\n")); | 
 |             strm->adler = state->check = adler32(0L, Z_NULL, 0); | 
 |             state->mode = hold & 0x200 ? DICTID : TYPE; | 
 |             INITBITS(); | 
 |             break; | 
 | #ifdef GUNZIP | 
 |         case FLAGS: | 
 |             NEEDBITS(16); | 
 |             state->flags = (int)(hold); | 
 |             if ((state->flags & 0xff) != Z_DEFLATED) { | 
 |                 strm->msg = (char *)"unknown compression method"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             if (state->flags & 0xe000) { | 
 |                 strm->msg = (char *)"unknown header flags set"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             if (state->head != Z_NULL) | 
 |                 state->head->text = (int)((hold >> 8) & 1); | 
 |             if (state->flags & 0x0200) CRC2(state->check, hold); | 
 |             INITBITS(); | 
 |             state->mode = TIME; | 
 |         case TIME: | 
 |             NEEDBITS(32); | 
 |             if (state->head != Z_NULL) | 
 |                 state->head->time = hold; | 
 |             if (state->flags & 0x0200) CRC4(state->check, hold); | 
 |             INITBITS(); | 
 |             state->mode = OS; | 
 |         case OS: | 
 |             NEEDBITS(16); | 
 |             if (state->head != Z_NULL) { | 
 |                 state->head->xflags = (int)(hold & 0xff); | 
 |                 state->head->os = (int)(hold >> 8); | 
 |             } | 
 |             if (state->flags & 0x0200) CRC2(state->check, hold); | 
 |             INITBITS(); | 
 |             state->mode = EXLEN; | 
 |         case EXLEN: | 
 |             if (state->flags & 0x0400) { | 
 |                 NEEDBITS(16); | 
 |                 state->length = (unsigned)(hold); | 
 |                 if (state->head != Z_NULL) | 
 |                     state->head->extra_len = (unsigned)hold; | 
 |                 if (state->flags & 0x0200) CRC2(state->check, hold); | 
 |                 INITBITS(); | 
 |             } | 
 |             else if (state->head != Z_NULL) | 
 |                 state->head->extra = Z_NULL; | 
 |             state->mode = EXTRA; | 
 |         case EXTRA: | 
 |             if (state->flags & 0x0400) { | 
 |                 copy = state->length; | 
 |                 if (copy > have) copy = have; | 
 |                 if (copy) { | 
 |                     if (state->head != Z_NULL && | 
 |                         state->head->extra != Z_NULL) { | 
 |                         len = state->head->extra_len - state->length; | 
 |                         zmemcpy(state->head->extra + len, next, | 
 |                                 len + copy > state->head->extra_max ? | 
 |                                 state->head->extra_max - len : copy); | 
 |                     } | 
 |                     if (state->flags & 0x0200) | 
 |                         state->check = crc32(state->check, next, copy); | 
 |                     have -= copy; | 
 |                     next += copy; | 
 |                     state->length -= copy; | 
 |                 } | 
 |                 if (state->length) goto inf_leave; | 
 |             } | 
 |             state->length = 0; | 
 |             state->mode = NAME; | 
 |         case NAME: | 
 |             if (state->flags & 0x0800) { | 
 |                 if (have == 0) goto inf_leave; | 
 |                 copy = 0; | 
 |                 do { | 
 |                     len = (unsigned)(next[copy++]); | 
 |                     if (state->head != Z_NULL && | 
 |                             state->head->name != Z_NULL && | 
 |                             state->length < state->head->name_max) | 
 |                         state->head->name[state->length++] = len; | 
 |                 } while (len && copy < have); | 
 |                 if (state->flags & 0x0200) | 
 |                     state->check = crc32(state->check, next, copy); | 
 |                 have -= copy; | 
 |                 next += copy; | 
 |                 if (len) goto inf_leave; | 
 |             } | 
 |             else if (state->head != Z_NULL) | 
 |                 state->head->name = Z_NULL; | 
 |             state->length = 0; | 
 |             state->mode = COMMENT; | 
 |         case COMMENT: | 
 |             if (state->flags & 0x1000) { | 
 |                 if (have == 0) goto inf_leave; | 
 |                 copy = 0; | 
 |                 do { | 
 |                     len = (unsigned)(next[copy++]); | 
 |                     if (state->head != Z_NULL && | 
 |                             state->head->comment != Z_NULL && | 
 |                             state->length < state->head->comm_max) | 
 |                         state->head->comment[state->length++] = len; | 
 |                 } while (len && copy < have); | 
 |                 if (state->flags & 0x0200) | 
 |                     state->check = crc32(state->check, next, copy); | 
 |                 have -= copy; | 
 |                 next += copy; | 
 |                 if (len) goto inf_leave; | 
 |             } | 
 |             else if (state->head != Z_NULL) | 
 |                 state->head->comment = Z_NULL; | 
 |             state->mode = HCRC; | 
 |         case HCRC: | 
 |             if (state->flags & 0x0200) { | 
 |                 NEEDBITS(16); | 
 |                 if (hold != (state->check & 0xffff)) { | 
 |                     strm->msg = (char *)"header crc mismatch"; | 
 |                     state->mode = BAD; | 
 |                     break; | 
 |                 } | 
 |                 INITBITS(); | 
 |             } | 
 |             if (state->head != Z_NULL) { | 
 |                 state->head->hcrc = (int)((state->flags >> 9) & 1); | 
 |                 state->head->done = 1; | 
 |             } | 
 |             strm->adler = state->check = crc32(0L, Z_NULL, 0); | 
 |             state->mode = TYPE; | 
 |             break; | 
 | #endif | 
 |         case DICTID: | 
 |             NEEDBITS(32); | 
 |             strm->adler = state->check = REVERSE(hold); | 
 |             INITBITS(); | 
 |             state->mode = DICT; | 
 |         case DICT: | 
 |             if (state->havedict == 0) { | 
 |                 RESTORE(); | 
 |                 return Z_NEED_DICT; | 
 |             } | 
 |             strm->adler = state->check = adler32(0L, Z_NULL, 0); | 
 |             state->mode = TYPE; | 
 |         case TYPE: | 
 | 	    WATCHDOG_RESET(); | 
 |             if (flush == Z_BLOCK) goto inf_leave; | 
 |         case TYPEDO: | 
 |             if (state->last) { | 
 |                 BYTEBITS(); | 
 |                 state->mode = CHECK; | 
 |                 break; | 
 |             } | 
 |             NEEDBITS(3); | 
 |             state->last = BITS(1); | 
 |             DROPBITS(1); | 
 |             switch (BITS(2)) { | 
 |             case 0:                             /* stored block */ | 
 |                 Tracev((stderr, "inflate:     stored block%s\n", | 
 |                         state->last ? " (last)" : "")); | 
 |                 state->mode = STORED; | 
 |                 break; | 
 |             case 1:                             /* fixed block */ | 
 |                 fixedtables(state); | 
 |                 Tracev((stderr, "inflate:     fixed codes block%s\n", | 
 |                         state->last ? " (last)" : "")); | 
 |                 state->mode = LEN;              /* decode codes */ | 
 |                 break; | 
 |             case 2:                             /* dynamic block */ | 
 |                 Tracev((stderr, "inflate:     dynamic codes block%s\n", | 
 |                         state->last ? " (last)" : "")); | 
 |                 state->mode = TABLE; | 
 |                 break; | 
 |             case 3: | 
 |                 strm->msg = (char *)"invalid block type"; | 
 |                 state->mode = BAD; | 
 |             } | 
 |             DROPBITS(2); | 
 |             break; | 
 |         case STORED: | 
 |             BYTEBITS();                         /* go to byte boundary */ | 
 |             NEEDBITS(32); | 
 |             if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { | 
 |                 strm->msg = (char *)"invalid stored block lengths"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             state->length = (unsigned)hold & 0xffff; | 
 |             Tracev((stderr, "inflate:       stored length %u\n", | 
 |                     state->length)); | 
 |             INITBITS(); | 
 |             state->mode = COPY; | 
 |         case COPY: | 
 |             copy = state->length; | 
 |             if (copy) { | 
 |                 if (copy > have) copy = have; | 
 |                 if (copy > left) copy = left; | 
 |                 if (copy == 0) goto inf_leave; | 
 |                 zmemcpy(put, next, copy); | 
 |                 have -= copy; | 
 |                 next += copy; | 
 |                 left -= copy; | 
 |                 put += copy; | 
 |                 state->length -= copy; | 
 |                 break; | 
 |             } | 
 |             Tracev((stderr, "inflate:       stored end\n")); | 
 |             state->mode = TYPE; | 
 |             break; | 
 |         case TABLE: | 
 |             NEEDBITS(14); | 
 |             state->nlen = BITS(5) + 257; | 
 |             DROPBITS(5); | 
 |             state->ndist = BITS(5) + 1; | 
 |             DROPBITS(5); | 
 |             state->ncode = BITS(4) + 4; | 
 |             DROPBITS(4); | 
 | #ifndef PKZIP_BUG_WORKAROUND | 
 |             if (state->nlen > 286 || state->ndist > 30) { | 
 |                 strm->msg = (char *)"too many length or distance symbols"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 | #endif | 
 |             Tracev((stderr, "inflate:       table sizes ok\n")); | 
 |             state->have = 0; | 
 |             state->mode = LENLENS; | 
 |         case LENLENS: | 
 |             while (state->have < state->ncode) { | 
 |                 NEEDBITS(3); | 
 |                 state->lens[order[state->have++]] = (unsigned short)BITS(3); | 
 |                 DROPBITS(3); | 
 |             } | 
 |             while (state->have < 19) | 
 |                 state->lens[order[state->have++]] = 0; | 
 |             state->next = state->codes; | 
 |             state->lencode = (code const FAR *)(state->next); | 
 |             state->lenbits = 7; | 
 |             ret = inflate_table(CODES, state->lens, 19, &(state->next), | 
 |                                 &(state->lenbits), state->work); | 
 |             if (ret) { | 
 |                 strm->msg = (char *)"invalid code lengths set"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             Tracev((stderr, "inflate:       code lengths ok\n")); | 
 |             state->have = 0; | 
 |             state->mode = CODELENS; | 
 |         case CODELENS: | 
 |             while (state->have < state->nlen + state->ndist) { | 
 |                 for (;;) { | 
 |                     this = state->lencode[BITS(state->lenbits)]; | 
 |                     if ((unsigned)(this.bits) <= bits) break; | 
 |                     PULLBYTE(); | 
 |                 } | 
 |                 if (this.val < 16) { | 
 |                     NEEDBITS(this.bits); | 
 |                     DROPBITS(this.bits); | 
 |                     state->lens[state->have++] = this.val; | 
 |                 } | 
 |                 else { | 
 |                     if (this.val == 16) { | 
 |                         NEEDBITS(this.bits + 2); | 
 |                         DROPBITS(this.bits); | 
 |                         if (state->have == 0) { | 
 |                             strm->msg = (char *)"invalid bit length repeat"; | 
 |                             state->mode = BAD; | 
 |                             break; | 
 |                         } | 
 |                         len = state->lens[state->have - 1]; | 
 |                         copy = 3 + BITS(2); | 
 |                         DROPBITS(2); | 
 |                     } | 
 |                     else if (this.val == 17) { | 
 |                         NEEDBITS(this.bits + 3); | 
 |                         DROPBITS(this.bits); | 
 |                         len = 0; | 
 |                         copy = 3 + BITS(3); | 
 |                         DROPBITS(3); | 
 |                     } | 
 |                     else { | 
 |                         NEEDBITS(this.bits + 7); | 
 |                         DROPBITS(this.bits); | 
 |                         len = 0; | 
 |                         copy = 11 + BITS(7); | 
 |                         DROPBITS(7); | 
 |                     } | 
 |                     if (state->have + copy > state->nlen + state->ndist) { | 
 |                         strm->msg = (char *)"invalid bit length repeat"; | 
 |                         state->mode = BAD; | 
 |                         break; | 
 |                     } | 
 |                     while (copy--) | 
 |                         state->lens[state->have++] = (unsigned short)len; | 
 |                 } | 
 |             } | 
 |  | 
 |             /* handle error breaks in while */ | 
 |             if (state->mode == BAD) break; | 
 |  | 
 |             /* build code tables */ | 
 |             state->next = state->codes; | 
 |             state->lencode = (code const FAR *)(state->next); | 
 |             state->lenbits = 9; | 
 |             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), | 
 |                                 &(state->lenbits), state->work); | 
 |             if (ret) { | 
 |                 strm->msg = (char *)"invalid literal/lengths set"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             state->distcode = (code const FAR *)(state->next); | 
 |             state->distbits = 6; | 
 |             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, | 
 |                             &(state->next), &(state->distbits), state->work); | 
 |             if (ret) { | 
 |                 strm->msg = (char *)"invalid distances set"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             Tracev((stderr, "inflate:       codes ok\n")); | 
 |             state->mode = LEN; | 
 |         case LEN: | 
 | 	    WATCHDOG_RESET(); | 
 |             if (have >= 6 && left >= 258) { | 
 |                 RESTORE(); | 
 |                 inflate_fast(strm, out); | 
 |                 LOAD(); | 
 |                 break; | 
 |             } | 
 |             for (;;) { | 
 |                 this = state->lencode[BITS(state->lenbits)]; | 
 |                 if ((unsigned)(this.bits) <= bits) break; | 
 |                 PULLBYTE(); | 
 |             } | 
 |             if (this.op && (this.op & 0xf0) == 0) { | 
 |                 last = this; | 
 |                 for (;;) { | 
 |                     this = state->lencode[last.val + | 
 |                             (BITS(last.bits + last.op) >> last.bits)]; | 
 |                     if ((unsigned)(last.bits + this.bits) <= bits) break; | 
 |                     PULLBYTE(); | 
 |                 } | 
 |                 DROPBITS(last.bits); | 
 |             } | 
 |             DROPBITS(this.bits); | 
 |             state->length = (unsigned)this.val; | 
 |             if ((int)(this.op) == 0) { | 
 |                 Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? | 
 |                         "inflate:         literal '%c'\n" : | 
 |                         "inflate:         literal 0x%02x\n", this.val)); | 
 |                 state->mode = LIT; | 
 |                 break; | 
 |             } | 
 |             if (this.op & 32) { | 
 |                 Tracevv((stderr, "inflate:         end of block\n")); | 
 |                 state->mode = TYPE; | 
 |                 break; | 
 |             } | 
 |             if (this.op & 64) { | 
 |                 strm->msg = (char *)"invalid literal/length code"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             state->extra = (unsigned)(this.op) & 15; | 
 |             state->mode = LENEXT; | 
 |         case LENEXT: | 
 |             if (state->extra) { | 
 |                 NEEDBITS(state->extra); | 
 |                 state->length += BITS(state->extra); | 
 |                 DROPBITS(state->extra); | 
 |             } | 
 |             Tracevv((stderr, "inflate:         length %u\n", state->length)); | 
 |             state->mode = DIST; | 
 |         case DIST: | 
 |             for (;;) { | 
 |                 this = state->distcode[BITS(state->distbits)]; | 
 |                 if ((unsigned)(this.bits) <= bits) break; | 
 |                 PULLBYTE(); | 
 |             } | 
 |             if ((this.op & 0xf0) == 0) { | 
 |                 last = this; | 
 |                 for (;;) { | 
 |                     this = state->distcode[last.val + | 
 |                             (BITS(last.bits + last.op) >> last.bits)]; | 
 |                     if ((unsigned)(last.bits + this.bits) <= bits) break; | 
 |                     PULLBYTE(); | 
 |                 } | 
 |                 DROPBITS(last.bits); | 
 |             } | 
 |             DROPBITS(this.bits); | 
 |             if (this.op & 64) { | 
 |                 strm->msg = (char *)"invalid distance code"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             state->offset = (unsigned)this.val; | 
 |             state->extra = (unsigned)(this.op) & 15; | 
 |             state->mode = DISTEXT; | 
 |         case DISTEXT: | 
 |             if (state->extra) { | 
 |                 NEEDBITS(state->extra); | 
 |                 state->offset += BITS(state->extra); | 
 |                 DROPBITS(state->extra); | 
 |             } | 
 | #ifdef INFLATE_STRICT | 
 |             if (state->offset > state->dmax) { | 
 |                 strm->msg = (char *)"invalid distance too far back"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 | #endif | 
 |             if (state->offset > state->whave + out - left) { | 
 |                 strm->msg = (char *)"invalid distance too far back"; | 
 |                 state->mode = BAD; | 
 |                 break; | 
 |             } | 
 |             Tracevv((stderr, "inflate:         distance %u\n", state->offset)); | 
 |             state->mode = MATCH; | 
 |         case MATCH: | 
 |             if (left == 0) goto inf_leave; | 
 |             copy = out - left; | 
 |             if (state->offset > copy) {         /* copy from window */ | 
 |                 copy = state->offset - copy; | 
 |                 if (copy > state->write) { | 
 |                     copy -= state->write; | 
 |                     from = state->window + (state->wsize - copy); | 
 |                 } | 
 |                 else | 
 |                     from = state->window + (state->write - copy); | 
 |                 if (copy > state->length) copy = state->length; | 
 |             } | 
 |             else {                              /* copy from output */ | 
 |                 from = put - state->offset; | 
 |                 copy = state->length; | 
 |             } | 
 |             if (copy > left) copy = left; | 
 |             left -= copy; | 
 |             state->length -= copy; | 
 |             do { | 
 |                 *put++ = *from++; | 
 |             } while (--copy); | 
 |             if (state->length == 0) state->mode = LEN; | 
 |             break; | 
 |         case LIT: | 
 |             if (left == 0) goto inf_leave; | 
 |             *put++ = (unsigned char)(state->length); | 
 |             left--; | 
 |             state->mode = LEN; | 
 |             break; | 
 |         case CHECK: | 
 |             if (state->wrap) { | 
 |                 NEEDBITS(32); | 
 |                 out -= left; | 
 |                 strm->total_out += out; | 
 |                 state->total += out; | 
 |                 if (out) | 
 |                     strm->adler = state->check = | 
 |                         UPDATE(state->check, put - out, out); | 
 |                 out = left; | 
 |                 if (( | 
 | #ifdef GUNZIP | 
 |                      state->flags ? hold : | 
 | #endif | 
 |                      REVERSE(hold)) != state->check) { | 
 |                     strm->msg = (char *)"incorrect data check"; | 
 |                     state->mode = BAD; | 
 |                     break; | 
 |                 } | 
 |                 INITBITS(); | 
 |                 Tracev((stderr, "inflate:   check matches trailer\n")); | 
 |             } | 
 | #ifdef GUNZIP | 
 |             state->mode = LENGTH; | 
 |         case LENGTH: | 
 |             if (state->wrap && state->flags) { | 
 |                 NEEDBITS(32); | 
 |                 if (hold != (state->total & 0xffffffffUL)) { | 
 |                     strm->msg = (char *)"incorrect length check"; | 
 |                     state->mode = BAD; | 
 |                     break; | 
 |                 } | 
 |                 INITBITS(); | 
 |                 Tracev((stderr, "inflate:   length matches trailer\n")); | 
 |             } | 
 | #endif | 
 |             state->mode = DONE; | 
 |         case DONE: | 
 |             ret = Z_STREAM_END; | 
 |             goto inf_leave; | 
 |         case BAD: | 
 |             ret = Z_DATA_ERROR; | 
 |             goto inf_leave; | 
 |         case MEM: | 
 |             return Z_MEM_ERROR; | 
 |         case SYNC: | 
 |         default: | 
 |             return Z_STREAM_ERROR; | 
 |         } | 
 |  | 
 |     /* | 
 |        Return from inflate(), updating the total counts and the check value. | 
 |        If there was no progress during the inflate() call, return a buffer | 
 |        error.  Call updatewindow() to create and/or update the window state. | 
 |        Note: a memory error from inflate() is non-recoverable. | 
 |      */ | 
 |   inf_leave: | 
 |     RESTORE(); | 
 |     if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) | 
 |         if (updatewindow(strm, out)) { | 
 |             state->mode = MEM; | 
 |             return Z_MEM_ERROR; | 
 |         } | 
 |     in -= strm->avail_in; | 
 |     out -= strm->avail_out; | 
 |     strm->total_in += in; | 
 |     strm->total_out += out; | 
 |     state->total += out; | 
 |     if (state->wrap && out) | 
 |         strm->adler = state->check = | 
 |             UPDATE(state->check, strm->next_out - out, out); | 
 |     strm->data_type = state->bits + (state->last ? 64 : 0) + | 
 |                       (state->mode == TYPE ? 128 : 0); | 
 |     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) | 
 |         ret = Z_BUF_ERROR; | 
 |     return ret; | 
 | } | 
 |  | 
 | int ZEXPORT inflateEnd(strm) | 
 | z_streamp strm; | 
 | { | 
 |     struct inflate_state FAR *state; | 
 |     if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) | 
 |         return Z_STREAM_ERROR; | 
 |     state = (struct inflate_state FAR *)strm->state; | 
 |     if (state->window != Z_NULL) { | 
 | 	WATCHDOG_RESET(); | 
 | 	ZFREE(strm, state->window); | 
 |     } | 
 |     ZFREE(strm, strm->state); | 
 |     strm->state = Z_NULL; | 
 |     Tracev((stderr, "inflate: end\n")); | 
 |     return Z_OK; | 
 | } | 
 |  | 
 | /*+++++*/ | 
 | /* zutil.c -- target dependent utility functions for the compression library | 
 |  * Copyright (C) 1995-2005 Jean-loup Gailly. | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h | 
 |  */ | 
 |  | 
 | /* @(#) $Id$ */ | 
 |  | 
 | #ifndef NO_DUMMY_DECL | 
 | struct internal_state	{int dummy;}; /* for buggy compilers */ | 
 | #endif | 
 |  | 
 | const char * const z_errmsg[10] = { | 
 | "need dictionary",     /* Z_NEED_DICT       2  */ | 
 | "stream end",          /* Z_STREAM_END      1  */ | 
 | "",                    /* Z_OK              0  */ | 
 | "file error",          /* Z_ERRNO         (-1) */ | 
 | "stream error",        /* Z_STREAM_ERROR  (-2) */ | 
 | "data error",          /* Z_DATA_ERROR    (-3) */ | 
 | "insufficient memory", /* Z_MEM_ERROR     (-4) */ | 
 | "buffer error",        /* Z_BUF_ERROR     (-5) */ | 
 | "incompatible version",/* Z_VERSION_ERROR (-6) */ | 
 | ""}; | 
 |  | 
 | #ifdef DEBUG | 
 |  | 
 | #ifndef verbose | 
 | #define verbose 0 | 
 | #endif | 
 | int z_verbose = verbose; | 
 |  | 
 | void z_error (m) | 
 |     char *m; | 
 | { | 
 | 	fprintf(stderr, "%s\n", m); | 
 | 	hang (); | 
 | } | 
 | #endif | 
 |  | 
 | /* exported to allow conversion of error code to string for compress() and | 
 |  * uncompress() | 
 |  */ | 
 | #ifndef MY_ZCALLOC /* Any system without a special alloc function */ | 
 |  | 
 | #ifndef STDC | 
 | extern voidp    malloc OF((uInt size)); | 
 | extern voidp    calloc OF((uInt items, uInt size)); | 
 | extern void     free   OF((voidpf ptr)); | 
 | #endif | 
 |  | 
 | voidpf zcalloc (opaque, items, size) | 
 | 	voidpf opaque; | 
 | 	unsigned items; | 
 | 	unsigned size; | 
 | { | 
 | 	if (opaque) | 
 | 		items += size - size; /* make compiler happy */ | 
 | 	return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : | 
 | 		(voidpf)calloc(items, size); | 
 | } | 
 |  | 
 | void  zcfree (opaque, ptr, nb) | 
 | 	voidpf opaque; | 
 | 	voidpf ptr; | 
 | 	unsigned nb; | 
 | { | 
 | 	free(ptr); | 
 | 	if (opaque) | 
 | 		return; /* make compiler happy */ | 
 | } | 
 |  | 
 | #endif /* MY_ZCALLOC */ | 
 | /*+++++*/ | 
 | /* adler32.c -- compute the Adler-32 checksum of a data stream | 
 |  * Copyright (C) 1995-2004 Mark Adler | 
 |  * For conditions of distribution and use, see copyright notice in zlib.h | 
 |  */ | 
 |  | 
 | /* @(#) $Id$ */ | 
 |  | 
 | #define BASE 65521UL    /* largest prime smaller than 65536 */ | 
 | #define NMAX 5552 | 
 | /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ | 
 |  | 
 | #define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;} | 
 | #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1); | 
 | #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2); | 
 | #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4); | 
 | #define DO16(buf)   DO8(buf,0); DO8(buf,8); | 
 |  | 
 | /* use NO_DIVIDE if your processor does not do division in hardware */ | 
 | #ifdef NO_DIVIDE | 
 | #define MOD(a) \ | 
 | 	do { \ | 
 | 		if (a >= (BASE << 16)) \ | 
 | 			a -= (BASE << 16); \ | 
 | 		if (a >= (BASE << 15)) \ | 
 | 			a -= (BASE << 15); \ | 
 | 		if (a >= (BASE << 14)) \ | 
 | 			a -= (BASE << 14); \ | 
 | 		if (a >= (BASE << 13)) \ | 
 | 			a -= (BASE << 13); \ | 
 | 		if (a >= (BASE << 12)) \ | 
 | 			a -= (BASE << 12); \ | 
 | 		if (a >= (BASE << 11)) \ | 
 | 			a -= (BASE << 11); \ | 
 | 		if (a >= (BASE << 10)) \ | 
 | 			a -= (BASE << 10); \ | 
 | 		if (a >= (BASE << 9)) \ | 
 | 			a -= (BASE << 9); \ | 
 | 		if (a >= (BASE << 8)) \ | 
 | 			a -= (BASE << 8); \ | 
 | 		if (a >= (BASE << 7)) \ | 
 | 			a -= (BASE << 7); \ | 
 | 		if (a >= (BASE << 6)) \ | 
 | 			a -= (BASE << 6); \ | 
 | 		if (a >= (BASE << 5)) \ | 
 | 			a -= (BASE << 5); \ | 
 | 		if (a >= (BASE << 4)) \ | 
 | 			a -= (BASE << 4); \ | 
 | 		if (a >= (BASE << 3)) \ | 
 | 			a -= (BASE << 3); \ | 
 | 		if (a >= (BASE << 2)) \ | 
 | 			a -= (BASE << 2); \ | 
 | 		if (a >= (BASE << 1)) \ | 
 | 			a -= (BASE << 1); \ | 
 | 		if (a >= BASE) \ | 
 | 			a -= BASE; \ | 
 | 	} while (0) | 
 | #define MOD4(a) \ | 
 | 	do { \ | 
 | 		if (a >= (BASE << 4)) \ | 
 | 			a -= (BASE << 4); \ | 
 | 		if (a >= (BASE << 3)) \ | 
 | 			a -= (BASE << 3); \ | 
 | 		if (a >= (BASE << 2)) \ | 
 | 			a -= (BASE << 2); \ | 
 | 		if (a >= (BASE << 1)) \ | 
 | 			a -= (BASE << 1); \ | 
 | 		if (a >= BASE) \ | 
 | 			a -= BASE; \ | 
 | 	} while (0) | 
 | #else | 
 | #define MOD(a) a %= BASE | 
 | #define MOD4(a) a %= BASE | 
 | #endif | 
 |  | 
 | /* ========================================================================= */ | 
 | uLong ZEXPORT adler32(adler, buf, len) | 
 |     uLong adler; | 
 |     const Bytef *buf; | 
 |     uInt len; | 
 | { | 
 |     unsigned long sum2; | 
 |     unsigned n; | 
 |  | 
 |     /* split Adler-32 into component sums */ | 
 |     sum2 = (adler >> 16) & 0xffff; | 
 |     adler &= 0xffff; | 
 |  | 
 |     /* in case user likes doing a byte at a time, keep it fast */ | 
 |     if (len == 1) { | 
 |         adler += buf[0]; | 
 |         if (adler >= BASE) | 
 |             adler -= BASE; | 
 |         sum2 += adler; | 
 |         if (sum2 >= BASE) | 
 |             sum2 -= BASE; | 
 |         return adler | (sum2 << 16); | 
 |     } | 
 |  | 
 |     /* initial Adler-32 value (deferred check for len == 1 speed) */ | 
 |     if (buf == Z_NULL) | 
 |         return 1L; | 
 |  | 
 |     /* in case short lengths are provided, keep it somewhat fast */ | 
 |     if (len < 16) { | 
 |         while (len--) { | 
 |             adler += *buf++; | 
 |             sum2 += adler; | 
 |         } | 
 |         if (adler >= BASE) | 
 |             adler -= BASE; | 
 |         MOD4(sum2);             /* only added so many BASE's */ | 
 |         return adler | (sum2 << 16); | 
 |     } | 
 |  | 
 |     /* do length NMAX blocks -- requires just one modulo operation */ | 
 |     while (len >= NMAX) { | 
 |         len -= NMAX; | 
 |         n = NMAX / 16;          /* NMAX is divisible by 16 */ | 
 |         do { | 
 |             DO16(buf);          /* 16 sums unrolled */ | 
 |             buf += 16; | 
 |         } while (--n); | 
 |         MOD(adler); | 
 |         MOD(sum2); | 
 |     } | 
 |  | 
 |     /* do remaining bytes (less than NMAX, still just one modulo) */ | 
 |     if (len) {                  /* avoid modulos if none remaining */ | 
 |         while (len >= 16) { | 
 |             len -= 16; | 
 |             DO16(buf); | 
 |             buf += 16; | 
 |         } | 
 |         while (len--) { | 
 |             adler += *buf++; | 
 |             sum2 += adler; | 
 |         } | 
 |         MOD(adler); | 
 |         MOD(sum2); | 
 |     } | 
 |  | 
 |     /* return recombined sums */ | 
 |     return adler | (sum2 << 16); | 
 | } |