Compare commits
	
		
			12 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 7850e4e406 | ||
|   | ebd3c2c0e7 | ||
|   | ff11b0a61f | ||
|   | e26a448e96 | ||
|   | 423eb40306 | ||
|   | 8a2acbffc8 | ||
|   | 56bcb184fa | ||
|   | 25e5325501 | ||
|   | 23c69f1069 | ||
|   | 6b834a58bd | ||
|   | bdde4e09d2 | ||
|   | 1c71d8b13b | 
							
								
								
									
										263
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,5 +1,267 @@ | |||||||
|  |  | ||||||
| 		ChangeLog file for zlib | 		ChangeLog file for zlib | ||||||
|  |  | ||||||
|  | Changes in 1.0.7 (20 Jan 1998) | ||||||
|  | - fix gzseek which was broken in write mode | ||||||
|  | - return error for gzseek to negative absolute position | ||||||
|  | - fix configure for Linux (Chun-Chung Chen) | ||||||
|  | - increase stack space for MSC (Tim Wegner) | ||||||
|  | - get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) | ||||||
|  | - define EXPORTVA for gzprintf (Gilles Vollant) | ||||||
|  | - added man page zlib.3 (Rick Rodgers) | ||||||
|  | - for contrib/untgz, fix makedir() and improve Makefile | ||||||
|  |  | ||||||
|  | - check gzseek in write mode in example.c | ||||||
|  | - allocate extra buffer for seeks only if gzseek is actually called | ||||||
|  | - avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) | ||||||
|  | - add inflateSyncPoint in zconf.h | ||||||
|  | - fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def | ||||||
|  |  | ||||||
|  | Changes in 1.0.6 (19 Jan 1998) | ||||||
|  | - add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and | ||||||
|  |   gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) | ||||||
|  | - Fix a deflate bug occuring only with compression level 0 (thanks to | ||||||
|  |   Andy Buckler for finding this one). | ||||||
|  | - In minigzip, pass transparently also the first byte for .Z files. | ||||||
|  | - return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() | ||||||
|  | - check Z_FINISH in inflate (thanks to Marc Schluper) | ||||||
|  | - Implement deflateCopy (thanks to Adam Costello) | ||||||
|  | - make static libraries by default in configure, add --shared option. | ||||||
|  | - move MSDOS or Windows specific files to directory msdos | ||||||
|  | - suppress the notion of partial flush to simplify the interface | ||||||
|  |   (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) | ||||||
|  | - suppress history buffer provided by application to simplify the interface | ||||||
|  |   (this feature was not implemented anyway in 1.0.4) | ||||||
|  | - next_in and avail_in must be initialized before calling inflateInit or | ||||||
|  |   inflateInit2 | ||||||
|  | - add EXPORT in all exported functions (for Windows DLL) | ||||||
|  | - added Makefile.nt (thanks to Stephen Williams) | ||||||
|  | - added the unsupported "contrib" directory: | ||||||
|  |    contrib/asm386/ by Gilles Vollant <info@winimage.com> | ||||||
|  | 	386 asm code replacing longest_match(). | ||||||
|  |    contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> | ||||||
|  |         A C++ I/O streams interface to the zlib gz* functions | ||||||
|  |    contrib/iostream2/  by Tyge L<>vset <Tyge.Lovset@cmr.no> | ||||||
|  | 	Another C++ I/O streams interface | ||||||
|  |    contrib/untgz/  by "Pedro A. Aranda Guti\irrez" <paag@tid.es> | ||||||
|  | 	A very simple tar.gz file extractor using zlib | ||||||
|  |    contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl> | ||||||
|  |         How to use compress(), uncompress() and the gz* functions from VB. | ||||||
|  | - pass params -f (filtered data), -h (huffman only), -1 to -9 (compression | ||||||
|  |   level) in minigzip (thanks to Tom Lane) | ||||||
|  |  | ||||||
|  | - use const for rommable constants in deflate | ||||||
|  | - added test for gzseek and gztell in example.c | ||||||
|  | - add undocumented function inflateSyncPoint() (hack for Paul Mackerras) | ||||||
|  | - add undocumented function zError to convert error code to string | ||||||
|  |   (for Tim Smithers) | ||||||
|  | - Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. | ||||||
|  | - Use default memcpy for Symantec MSDOS compiler. | ||||||
|  | - Add EXPORT keyword for check_func (needed for Windows DLL) | ||||||
|  | - add current directory to LD_LIBRARY_PATH for "make test" | ||||||
|  | - create also a link for libz.so.1 | ||||||
|  | - added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) | ||||||
|  | - use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) | ||||||
|  | - added -soname for Linux in configure (Chun-Chung Chen, | ||||||
|  | - assign numbers to the exported functions in zlib.def (for Windows DLL) | ||||||
|  | - add advice in zlib.h for best usage of deflateSetDictionary | ||||||
|  | - work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) | ||||||
|  | - allow compilation with ANSI keywords only enabled for TurboC in large model | ||||||
|  | - avoid "versionString"[0] (Borland bug) | ||||||
|  | - add NEED_DUMMY_RETURN for Borland | ||||||
|  | - use variable z_verbose for tracing in debug mode (Peter Deutsch). | ||||||
|  | - allow compilation with CC | ||||||
|  | - defined STDC for OS/2 (David Charlap)	 | ||||||
|  | - limit external names to 8 chars for MVS (Thomas Lund) | ||||||
|  | - in minigzip.c, use static buffers only for 16-bit systems | ||||||
|  | - fix suffix check for "minigzip -d foo.gz" | ||||||
|  | - do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) | ||||||
|  | - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) | ||||||
|  | - added makelcc.bat for lcc-win32 (Tom St Denis) | ||||||
|  | - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) | ||||||
|  | - Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. | ||||||
|  | - check for unistd.h in configure (for off_t) | ||||||
|  | - use Tracev instead of Trace in infblock.c | ||||||
|  | - remove useless check parameter in inflate_blocks_free | ||||||
|  | - avoid useless assignment of s->check to itself in inflate_blocks_new | ||||||
|  | - do not flush twice in gzclose (thanks to Ken Raeburn) | ||||||
|  | - rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h | ||||||
|  | - use NO_ERRNO_H instead of enumeration of operating systems with errno.h | ||||||
|  | - work around buggy fclose on pipes for HP/UX | ||||||
|  | - support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) | ||||||
|  | - fix configure if CC is already equal to gcc | ||||||
|  |  | ||||||
|  | Changes in 1.0.5 (3 Jan 98) | ||||||
|  | - Fix inflate to terminate gracefully when fed corrupted or invalid data | ||||||
|  | - Use const for rommable constants in inflate | ||||||
|  | - Eliminate memory leaks on error conditions in inflate | ||||||
|  | - Removed some vestigial code in inflate | ||||||
|  | - Update web address in README | ||||||
|  |    | ||||||
|  | Changes in 1.0.4 (24 Jul 96) | ||||||
|  | - In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF | ||||||
|  |   bit, so the decompressor could decompress all the correct data but went | ||||||
|  |   on to attempt decompressing extra garbage data. This affected minigzip too. | ||||||
|  | - zlibVersion and gzerror return const char* (needed for DLL) | ||||||
|  | - port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) | ||||||
|  | - use z_error only for DEBUG (avoid problem with DLLs) | ||||||
|  |  | ||||||
|  | Changes in 1.0.3 (2 Jul 96) | ||||||
|  | - use z_streamp instead of z_stream *, which is now a far pointer in MSDOS | ||||||
|  |   small and medium models; this makes the library incompatible with previous | ||||||
|  |   versions for these models. (No effect in large model or on other systems.) | ||||||
|  | - return OK instead of BUF_ERROR if previous deflate call returned with | ||||||
|  |   avail_out as zero but there is nothing to do | ||||||
|  | - added memcmp for non STDC compilers | ||||||
|  | - define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) | ||||||
|  | - define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) | ||||||
|  | - better check for 16-bit mode MSC (avoids problem with Symantec) | ||||||
|  |  | ||||||
|  | Changes in 1.0.2 (23 May 96) | ||||||
|  | - added Windows DLL support | ||||||
|  | - added a function zlibVersion (for the DLL support) | ||||||
|  | - fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) | ||||||
|  | - Bytef is define's instead of typedef'd only for Borland C | ||||||
|  | - avoid reading uninitialized memory in example.c | ||||||
|  | - mention in README that the zlib format is now RFC1950 | ||||||
|  | - updated Makefile.dj2 | ||||||
|  | - added algorithm.doc | ||||||
|  |  | ||||||
|  | Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] | ||||||
|  | - fix array overlay in deflate.c which sometimes caused bad compressed data | ||||||
|  | - fix inflate bug with empty stored block | ||||||
|  | - fix MSDOS medium model which was broken in 0.99 | ||||||
|  | - fix deflateParams() which could generated bad compressed data. | ||||||
|  | - Bytef is define'd instead of typedef'ed (work around Borland bug) | ||||||
|  | - added an INDEX file | ||||||
|  | - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), | ||||||
|  |   Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) | ||||||
|  | - speed up adler32 for modern machines without auto-increment | ||||||
|  | - added -ansi for IRIX in configure | ||||||
|  | - static_init_done in trees.c is an int | ||||||
|  | - define unlink as delete for VMS | ||||||
|  | - fix configure for QNX | ||||||
|  | - add configure branch for SCO and HPUX | ||||||
|  | - avoid many warnings (unused variables, dead assignments, etc...) | ||||||
|  | - no fdopen for BeOS | ||||||
|  | - fix the Watcom fix for 32 bit mode (define FAR as empty) | ||||||
|  | - removed redefinition of Byte for MKWERKS | ||||||
|  | - work around an MWKERKS bug (incorrect merge of all .h files) | ||||||
|  |  | ||||||
|  | Changes in 0.99 (27 Jan 96) | ||||||
|  | - allow preset dictionary shared between compressor and decompressor | ||||||
|  | - allow compression level 0 (no compression) | ||||||
|  | - add deflateParams in zlib.h: allow dynamic change of compression level | ||||||
|  |   and compression strategy. | ||||||
|  | - test large buffers and deflateParams in example.c | ||||||
|  | - add optional "configure" to build zlib as a shared library | ||||||
|  | - suppress Makefile.qnx, use configure instead | ||||||
|  | - fixed deflate for 64-bit systems (detected on Cray) | ||||||
|  | - fixed inflate_blocks for 64-bit systems (detected on Alpha) | ||||||
|  | - declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) | ||||||
|  | - always return Z_BUF_ERROR when deflate() has nothing to do | ||||||
|  | - deflateInit and inflateInit are now macros to allow version checking | ||||||
|  | - prefix all global functions and types with z_ with -DZ_PREFIX | ||||||
|  | - make falloc completely reentrant (inftrees.c) | ||||||
|  | - fixed very unlikely race condition in ct_static_init | ||||||
|  | - free in reverse order of allocation to help memory manager | ||||||
|  | - use zlib-1.0/* instead of zlib/* inside the tar.gz | ||||||
|  | - make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith | ||||||
|  |   -Wconversion -Wstrict-prototypes -Wmissing-prototypes" | ||||||
|  | - allow gzread on concatenated .gz files | ||||||
|  | - deflateEnd now returns Z_DATA_ERROR if it was premature | ||||||
|  | - deflate is finally (?) fully deterministic (no matches beyond end of input) | ||||||
|  | - Document Z_SYNC_FLUSH | ||||||
|  | - add uninstall in Makefile | ||||||
|  | - Check for __cpluplus in zlib.h | ||||||
|  | - Better test in ct_align for partial flush | ||||||
|  | - avoid harmless warnings for Borland C++ | ||||||
|  | - initialize hash_head in deflate.c | ||||||
|  | - avoid warning on fdopen (gzio.c) for HP cc -Aa | ||||||
|  | - include stdlib.h for STDC compilers | ||||||
|  | - include errno.h for Cray | ||||||
|  | - ignore error if ranlib doesn't exist | ||||||
|  | - call ranlib twice for NeXTSTEP | ||||||
|  | - use exec_prefix instead of prefix for libz.a | ||||||
|  | - renamed ct_* as _tr_* to avoid conflict with applications | ||||||
|  | - clear z->msg in inflateInit2 before any error return | ||||||
|  | - initialize opaque in example.c, gzio.c, deflate.c and inflate.c | ||||||
|  | - fixed typo in zconf.h (_GNUC__ => __GNUC__) | ||||||
|  | - check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) | ||||||
|  | - fix typo in Make_vms.com (f$trnlnm -> f$getsyi) | ||||||
|  | - in fcalloc, normalize pointer if size > 65520 bytes | ||||||
|  | - don't use special fcalloc for 32 bit Borland C++ | ||||||
|  | - use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... | ||||||
|  | - use Z_BINARY instead of BINARY | ||||||
|  | - document that gzclose after gzdopen will close the file | ||||||
|  | - allow "a" as mode in gzopen. | ||||||
|  | - fix error checking in gzread | ||||||
|  | - allow skipping .gz extra-field on pipes | ||||||
|  | - added reference to Perl interface in README | ||||||
|  | - put the crc table in FAR data (I dislike more and more the medium model :) | ||||||
|  | - added get_crc_table | ||||||
|  | - added a dimension to all arrays (Borland C can't count). | ||||||
|  | - workaround Borland C bug in declaration of inflate_codes_new & inflate_fast | ||||||
|  | - guard against multiple inclusion of *.h (for precompiled header on Mac) | ||||||
|  | - Watcom C pretends to be Microsoft C small model even in 32 bit mode. | ||||||
|  | - don't use unsized arrays to avoid silly warnings by Visual C++: | ||||||
|  |      warning C4746: 'inflate_mask' : unsized array treated as  '__far' | ||||||
|  |      (what's wrong with far data in far model?). | ||||||
|  | - define enum out of inflate_blocks_state to allow compilation with C++ | ||||||
|  |  | ||||||
|  | Changes in 0.95 (16 Aug 95) | ||||||
|  | - fix MSDOS small and medium model (now easier to adapt to any compiler) | ||||||
|  | - inlined send_bits | ||||||
|  | - fix the final (:-) bug for deflate with flush (output was correct but | ||||||
|  |   not completely flushed in rare occasions). | ||||||
|  | - default window size is same for compression and decompression | ||||||
|  |   (it's now sufficient to set MAX_WBITS in zconf.h). | ||||||
|  | - voidp -> voidpf and voidnp -> voidp (for consistency with other | ||||||
|  |   typedefs and because voidnp was not near in large model). | ||||||
|  |  | ||||||
|  | Changes in 0.94 (13 Aug 95) | ||||||
|  | - support MSDOS medium model | ||||||
|  | - fix deflate with flush (could sometimes generate bad output) | ||||||
|  | - fix deflateReset (zlib header was incorrectly suppressed) | ||||||
|  | - added support for VMS | ||||||
|  | - allow a compression level in gzopen() | ||||||
|  | - gzflush now calls fflush | ||||||
|  | - For deflate with flush, flush even if no more input is provided. | ||||||
|  | - rename libgz.a as libz.a | ||||||
|  | - avoid complex expression in infcodes.c triggering Turbo C bug | ||||||
|  | - work around a problem with gcc on Alpha (in INSERT_STRING) | ||||||
|  | - don't use inline functions (problem with some gcc versions) | ||||||
|  | - allow renaming of Byte, uInt, etc... with #define. | ||||||
|  | - avoid warning about (unused) pointer before start of array in deflate.c | ||||||
|  | - avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c | ||||||
|  | - avoid reserved word 'new' in trees.c | ||||||
|  |  | ||||||
|  | Changes in 0.93 (25 June 95) | ||||||
|  | - temporarily disable inline functions | ||||||
|  | - make deflate deterministic | ||||||
|  | - give enough lookahead for PARTIAL_FLUSH | ||||||
|  | - Set binary mode for stdin/stdout in minigzip.c for OS/2 | ||||||
|  | - don't even use signed char in inflate (not portable enough) | ||||||
|  | - fix inflate memory leak for segmented architectures | ||||||
|  |  | ||||||
|  | Changes in 0.92 (3 May 95) | ||||||
|  | - don't assume that char is signed (problem on SGI) | ||||||
|  | - Clear bit buffer when starting a stored block | ||||||
|  | - no memcpy on Pyramid | ||||||
|  | - suppressed inftest.c | ||||||
|  | - optimized fill_window, put longest_match inline for gcc | ||||||
|  | - optimized inflate on stored blocks. | ||||||
|  | - untabify all sources to simplify patches | ||||||
|  |  | ||||||
|  | Changes in 0.91 (2 May 95) | ||||||
|  | - Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h | ||||||
|  | - Document the memory requirements in zconf.h | ||||||
|  | - added "make install" | ||||||
|  | - fix sync search logic in inflateSync | ||||||
|  | - deflate(Z_FULL_FLUSH) now works even if output buffer too short | ||||||
|  | - after inflateSync, don't scare people with just "lo world" | ||||||
|  | - added support for DJGPP | ||||||
|  |  | ||||||
| Changes in 0.9 (1 May 95) | Changes in 0.9 (1 May 95) | ||||||
| - don't assume that zalloc clears the allocated memory (the TurboC bug | - don't assume that zalloc clears the allocated memory (the TurboC bug | ||||||
|   was Mark's bug after all :) |   was Mark's bug after all :) | ||||||
| @@ -10,6 +272,7 @@ Changes in 0.9 (1 May 95) | |||||||
| - document explicitly that zalloc(64K) on MSDOS must return a normalized | - document explicitly that zalloc(64K) on MSDOS must return a normalized | ||||||
|   pointer (zero offset) |   pointer (zero offset) | ||||||
| - added Makefiles for Microsoft C, Turbo C, Borland C++ | - added Makefiles for Microsoft C, Turbo C, Borland C++ | ||||||
|  | - faster crc32() | ||||||
|  |  | ||||||
| Changes in 0.8 (29 April 95) | Changes in 0.8 (29 April 95) | ||||||
| - added fast inflate (inffast.c) | - added fast inflate (inffast.c) | ||||||
|   | |||||||
							
								
								
									
										74
									
								
								INDEX
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								INDEX
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | ChangeLog		history of changes | ||||||
|  | INDEX			this file | ||||||
|  | Make_vms.com		script for Vax/VMS | ||||||
|  | Makefile		makefile for Unix (generated by configure) | ||||||
|  | Makefile.in		makefile for Unix (template for configure) | ||||||
|  | Makefile.msc		makefile for Microsoft C 16-bit | ||||||
|  | Makefile.riscos 	makefile for RISCOS | ||||||
|  | Makefile.sas		makefile for Amiga SAS/C | ||||||
|  | README			guess what | ||||||
|  | algorithm.txt		description of the (de)compression algorithm | ||||||
|  | configure		configure script for Unix | ||||||
|  | descrip.mms		makefile for Vax/VMS | ||||||
|  | zlib.3			mini man page for zlib (volunteers to write full | ||||||
|  | 			man pages from zlib.h welcome. write to jloup@gzip.org) | ||||||
|  |  | ||||||
|  | msdos/Makefile.b32	makefile for Borland C++   32-bit | ||||||
|  | msdos/Makefile.bor	makefile for Borland C/C++ 16-bit | ||||||
|  | msdos/Makefile.dj2	makefile for DJGPP 2.x | ||||||
|  | msdos/Makefile.tc	makefile for Turbo C | ||||||
|  | msdos/Makefile.wat	makefile for Watcom C | ||||||
|  | msdos/zlib.def        	definition file for Windows DLL | ||||||
|  | msdos/zlib.rc         	definition file for Windows DLL | ||||||
|  |  | ||||||
|  | nt/Makefile.nt		makefile for Windows NT | ||||||
|  | nt/zlib.dnt		definition file for Windows NT DLL | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		zlib public header files (must be kept): | ||||||
|  | zconf.h | ||||||
|  | zlib.h | ||||||
|  |  | ||||||
|  | 		private source files used to build the zlib library: | ||||||
|  | adler32.c | ||||||
|  | compress.c | ||||||
|  | crc32.c | ||||||
|  | deflate.c | ||||||
|  | deflate.h | ||||||
|  | gzio.c | ||||||
|  | infblock.c | ||||||
|  | infblock.h | ||||||
|  | infcodes.c | ||||||
|  | infcodes.h | ||||||
|  | inffast.c | ||||||
|  | inffast.h | ||||||
|  | inflate.c | ||||||
|  | inftrees.c | ||||||
|  | inftrees.h | ||||||
|  | infutil.c | ||||||
|  | infutil.h | ||||||
|  | trees.c | ||||||
|  | uncompr.c | ||||||
|  | zutil.c | ||||||
|  | zutil.h | ||||||
|  |  | ||||||
|  | 		source files for sample programs: | ||||||
|  | example.c | ||||||
|  | minigzip.c | ||||||
|  |  | ||||||
|  | 		unsupported contribution by third parties | ||||||
|  |  | ||||||
|  | contrib/asm386/ by Gilles Vollant <info@winimage.com> | ||||||
|  | 	386 asm code replacing longest_match(). | ||||||
|  |  | ||||||
|  | contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> | ||||||
|  |         A C++ I/O streams interface to the zlib gz* functions | ||||||
|  |  | ||||||
|  | contrib/iostream2/  by Tyge L<>vset <Tyge.Lovset@cmr.no> | ||||||
|  | 	Another C++ I/O streams interface | ||||||
|  |  | ||||||
|  | contrib/untgz/  by "Pedro A. Aranda Guti\irrez" <paag@tid.es> | ||||||
|  | 	A very simple tar.gz extractor using zlib | ||||||
|  |  | ||||||
|  | contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl> | ||||||
|  |         How to use compress(), uncompress() and the gz* functions from VB. | ||||||
							
								
								
									
										115
									
								
								Make_vms.com
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								Make_vms.com
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | |||||||
|  | $! make libz under VMS | ||||||
|  | $! written by Martin P.J. Zinser <m.zinser@gsi.de> | ||||||
|  | $! | ||||||
|  | $! Look for the compiler used | ||||||
|  | $! | ||||||
|  | $ ccopt = "" | ||||||
|  | $ if f$getsyi("HW_MODEL").ge.1024 | ||||||
|  | $ then | ||||||
|  | $  ccopt = "/prefix=all"+ccopt | ||||||
|  | $  comp  = "__decc__=1" | ||||||
|  | $  if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $ else | ||||||
|  | $  if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs."" | ||||||
|  | $   then | ||||||
|  | $    comp  = "__vaxc__=1" | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $   else | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys decc$library_include: | ||||||
|  | $    ccopt = "/decc/prefix=all"+ccopt | ||||||
|  | $    comp  = "__decc__=1" | ||||||
|  | $  endif | ||||||
|  | $ endif | ||||||
|  | $! | ||||||
|  | $! Build the thing plain or with mms | ||||||
|  | $! | ||||||
|  | $ write sys$output "Compiling Zlib sources ..." | ||||||
|  | $ if f$search("SYS$SYSTEM:MMS.EXE").eqs."" | ||||||
|  | $  then | ||||||
|  | $   dele example.obj;*,minigzip.obj;* | ||||||
|  | $   CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - | ||||||
|  |                 adler32.c zutil.h zlib.h zconf.h | ||||||
|  | $   CALL MAKE compress.OBJ "CC ''CCOPT' compress" - | ||||||
|  |                 compress.c zlib.h zconf.h | ||||||
|  | $   CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - | ||||||
|  |                 crc32.c zutil.h zlib.h zconf.h | ||||||
|  | $   CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - | ||||||
|  |                 deflatec.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | $   CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" - | ||||||
|  |                 gsio.c zutil.h zlib.h zconf.h | ||||||
|  | $   CALL MAKE infblock.OBJ "CC ''CCOPT' infblock" - | ||||||
|  |                 infblock.c zutil.h zlib.h zconf.h infblock.h | ||||||
|  | $   CALL MAKE infcodes.OBJ "CC ''CCOPT' infcodes" - | ||||||
|  |                 infcodes.c zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | $   CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - | ||||||
|  |                 inffast.c zutil.h zlib.h zconf.h inffast.h | ||||||
|  | $   CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - | ||||||
|  |                 inflate.c zutil.h zlib.h zconf.h infblock.h | ||||||
|  | $   CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - | ||||||
|  |                 inftrees.c zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | $   CALL MAKE infutil.OBJ "CC ''CCOPT' infutil" - | ||||||
|  |                 infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | $   CALL MAKE trees.OBJ "CC ''CCOPT' trees" - | ||||||
|  |                 trees.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | $   CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - | ||||||
|  |                 uncompr.c zlib.h zconf.h | ||||||
|  | $   CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - | ||||||
|  |                 zutil.c zutil.h zlib.h zconf.h | ||||||
|  | $   write sys$output "Building Zlib ..." | ||||||
|  | $   CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ | ||||||
|  | $   write sys$output "Building example..." | ||||||
|  | $   CALL MAKE example.OBJ "CC ''CCOPT' example" - | ||||||
|  |                 example.c zlib.h zconf.h | ||||||
|  | $   call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb | ||||||
|  | $   write sys$output "Building minigzip..." | ||||||
|  | $   CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - | ||||||
|  |                 minigzip.c zlib.h zconf.h | ||||||
|  | $   call make minigzip.exe -  | ||||||
|  |                 "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" -  | ||||||
|  |                 minigzip.obj libz.olb | ||||||
|  | $  else | ||||||
|  | $   mms/macro=('comp') | ||||||
|  | $  endif | ||||||
|  | $ write sys$output "Zlib build completed" | ||||||
|  | $ exit | ||||||
|  | $! | ||||||
|  | $! | ||||||
|  | $MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES | ||||||
|  | $ V = 'F$Verify(0) | ||||||
|  | $! P1 = What we are trying to make | ||||||
|  | $! P2 = Command to make it | ||||||
|  | $! P3 - P8  What it depends on | ||||||
|  | $ | ||||||
|  | $ If F$Search(P1) .Eqs. "" Then Goto Makeit | ||||||
|  | $ Time = F$CvTime(F$File(P1,"RDT")) | ||||||
|  | $arg=3 | ||||||
|  | $Loop: | ||||||
|  | $       Argument = P'arg | ||||||
|  | $       If Argument .Eqs. "" Then Goto Exit | ||||||
|  | $       El=0 | ||||||
|  | $Loop2: | ||||||
|  | $       File = F$Element(El," ",Argument) | ||||||
|  | $       If File .Eqs. " " Then Goto Endl | ||||||
|  | $       AFile = "" | ||||||
|  | $Loop3: | ||||||
|  | $       OFile = AFile | ||||||
|  | $       AFile = F$Search(File) | ||||||
|  | $       If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl | ||||||
|  | $       If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit | ||||||
|  | $       Goto Loop3 | ||||||
|  | $NextEL: | ||||||
|  | $       El = El + 1 | ||||||
|  | $       Goto Loop2 | ||||||
|  | $EndL: | ||||||
|  | $ arg=arg+1 | ||||||
|  | $ If arg .Le. 8 Then Goto Loop | ||||||
|  | $ Goto Exit | ||||||
|  | $ | ||||||
|  | $Makeit: | ||||||
|  | $ VV=F$VERIFY(0) | ||||||
|  | $ write sys$output P2 | ||||||
|  | $ 'P2 | ||||||
|  | $ VV='F$Verify(VV) | ||||||
|  | $Exit: | ||||||
|  | $ If V Then Set Verify | ||||||
|  | $ENDSUBROUTINE | ||||||
							
								
								
									
										146
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,60 +1,146 @@ | |||||||
| CC=cc | # Makefile for zlib | ||||||
| CFLAGS=-O | # Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
| #CFLAGS=-g -DDEBUG | # For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
| LDFLAGS=-L. -lgz |  | ||||||
|  |  | ||||||
|  | # To compile and test, type: | ||||||
|  | #   ./configure; make test | ||||||
|  | # The call of configure is optional if you don't have special requirements | ||||||
|  |  | ||||||
|  | # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: | ||||||
|  | #    make install | ||||||
|  | # To install in $HOME instead of /usr/local, use: | ||||||
|  | #    make install prefix=$HOME | ||||||
|  |  | ||||||
|  | CC=cc | ||||||
|  |  | ||||||
|  | CFLAGS=-O | ||||||
|  | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 | ||||||
|  | #CFLAGS=-g -DDEBUG | ||||||
|  | #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||||
|  | #           -Wstrict-prototypes -Wmissing-prototypes | ||||||
|  |  | ||||||
|  | LDFLAGS=-L. -lz | ||||||
|  | LDSHARED=$(CC) | ||||||
|  |  | ||||||
|  | VER=1.0.7 | ||||||
|  | LIBS=libz.a | ||||||
|  | SHAREDLIB=libz.so | ||||||
|  |  | ||||||
|  | AR=ar rc | ||||||
| RANLIB=ranlib | RANLIB=ranlib | ||||||
|  | TAR=tar | ||||||
|  | SHELL=/bin/sh | ||||||
|  |  | ||||||
|  | prefix=/usr/local | ||||||
|  | exec_prefix = $(prefix) | ||||||
|  |  | ||||||
| OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||||
|        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o |        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||||||
|  |  | ||||||
| TEST_OBJS = example.o minigzip.o inftest.o | TEST_OBJS = example.o minigzip.o | ||||||
|  |  | ||||||
| all: example minigzip inftest | DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ | ||||||
|  |   algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ | ||||||
|  |   nt/Makefile.nt nt/zlib.dnt  contrib/README.contrib contrib/*.txt \ | ||||||
|  |   contrib/asm386/*.asm contrib/asm386/*.c \ | ||||||
|  |   contrib/asm386/*.bat contrib/asm386/*.mak contrib/iostream/*.cpp \ | ||||||
|  |   contrib/iostream/*.h  contrib/iostream2/*.h contrib/iostream2/*.cpp \ | ||||||
|  |   contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 | ||||||
|  |  | ||||||
|  | all: example minigzip | ||||||
|  |  | ||||||
| test: all | test: all | ||||||
| 	./example | 	@LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ | ||||||
| 	echo hello world | ./minigzip | ./minigzip -d  | 	./example ; \ | ||||||
|  | 	echo hello world | ./minigzip | ./minigzip -d | ||||||
|  |  | ||||||
| libgz.a: $(OBJS) | libz.a: $(OBJS) | ||||||
| 	ar rc $@ $(OBJS) | 	$(AR) $@ $(OBJS) | ||||||
| 	$(RANLIB) $@ | 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1 | ||||||
|  |  | ||||||
| example: example.o libgz.a | $(SHAREDLIB).$(VER): $(OBJS) | ||||||
|  | 	$(LDSHARED) -o $@ $(OBJS) | ||||||
|  | 	rm -f $(SHAREDLIB) $(SHAREDLIB).1 | ||||||
|  | 	ln -s $@ $(SHAREDLIB) | ||||||
|  | 	ln -s $@ $(SHAREDLIB).1 | ||||||
|  |  | ||||||
|  | example: example.o $(LIBS) | ||||||
| 	$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | 	$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | ||||||
|  |  | ||||||
| minigzip: minigzip.o libgz.a | minigzip: minigzip.o $(LIBS) | ||||||
| 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||||||
|  |  | ||||||
| inftest: inftest.o libgz.a | install: $(LIBS) | ||||||
| 	$(CC) $(CFLAGS) -o $@ inftest.o $(LDFLAGS) | 	-@if [ ! $(prefix)/include  ]; then mkdir $(prefix)/include; fi | ||||||
|  | 	-@if [ ! $(exec_prefix)/lib ]; then mkdir $(exec_prefix)/lib; fi | ||||||
|  | 	cp zlib.h zconf.h $(prefix)/include | ||||||
|  | 	chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||||||
|  | 	cp $(LIBS) $(exec_prefix)/lib | ||||||
|  | 	cd $(exec_prefix)/lib; chmod 644 $(LIBS) | ||||||
|  | 	-@(cd $(exec_prefix)/lib; $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||||
|  | 	cd $(exec_prefix)/lib; if test -f $(SHAREDLIB).$(VER); then \ | ||||||
|  | 	  rm -f $(SHAREDLIB) $(SHAREDLIB).1; \ | ||||||
|  | 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \ | ||||||
|  | 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \ | ||||||
|  | 	  (ldconfig || true)  >/dev/null 2>&1; \ | ||||||
|  | 	fi | ||||||
|  | # The ranlib in install is needed on NeXTSTEP which checks file times | ||||||
|  | # ldconfig is for Linux | ||||||
|  |  | ||||||
|  | uninstall: | ||||||
|  | 	cd $(exec_prefix)/lib; rm -f $(LIBS); \ | ||||||
|  | 	if test -f $(SHAREDLIB); then \ | ||||||
|  | 	 v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p'<$(prefix)/include/zlib.h`;\ | ||||||
|  | 	 rm -f $(SHAREDLIB).$$v $(SHAREDLIB); \ | ||||||
|  | 	fi | ||||||
|  | 	cdz $(prefix)/include; rm -f zlib.h zconf.h | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
| 	rm -f *.o example minigzip inftest libgz.a foo.gz | 	rm -f *.o *~ example minigzip libz.a libz.so* foo.gz | ||||||
|  |  | ||||||
|  | distclean:	clean | ||||||
|  |  | ||||||
| zip: | zip: | ||||||
| 	zip -ul9 zlib README ChangeLog Makefile Makefile.??? Makefile.?? *.[ch] | 	mv Makefile Makefile~; cp -p Makefile.in Makefile | ||||||
|  | 	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||||||
|  | 	zip -ul9 zlib$$v $(DISTFILES) | ||||||
|  | 	mv Makefile~ Makefile | ||||||
|  |  | ||||||
| tgz: | dist: | ||||||
| 	cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ | 	mv Makefile Makefile~; cp -p Makefile.in Makefile | ||||||
| 		zlib/Makefile.??? zlib/Makefile.?? zlib/*.[ch] | 	d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||||||
|  | 	rm -f $$d.tar.gz; \ | ||||||
|  | 	if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ | ||||||
|  | 	files=""; \ | ||||||
|  | 	for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ | ||||||
|  | 	cd ..; \ | ||||||
|  | 	GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ | ||||||
|  | 	if test ! -d $$d; then rm -f $$d; fi | ||||||
|  | 	mv Makefile~ Makefile | ||||||
|  |  | ||||||
|  | tags:	 | ||||||
|  | 	etags *.[ch] | ||||||
|  |  | ||||||
|  | depend: | ||||||
|  | 	makedepend -- $(CFLAGS) -- *.[ch] | ||||||
|  |  | ||||||
| # DO NOT DELETE THIS LINE -- make depend depends on it. | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||||
|  |  | ||||||
| adler32.o: zutil.h zlib.h zconf.h | adler32.o: zlib.h zconf.h | ||||||
| compress.o: zlib.h zconf.h | compress.o: zlib.h zconf.h | ||||||
| crc32.o: zutil.h zlib.h zconf.h | crc32.o: zlib.h zconf.h | ||||||
| deflate.o: deflate.h zutil.h zlib.h zconf.h | deflate.o: deflate.h zutil.h zlib.h zconf.h | ||||||
| example.o: zlib.h zconf.h | example.o: zlib.h zconf.h | ||||||
| gzio.o: zutil.h zlib.h zconf.h | gzio.o: zutil.h zlib.h zconf.h | ||||||
| infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h | ||||||
| infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h | infcodes.o: zutil.h zlib.h zconf.h | ||||||
| inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h | ||||||
|  | inffast.o: zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | inffast.o: infblock.h infcodes.h infutil.h inffast.h | ||||||
| inflate.o: zutil.h zlib.h zconf.h infblock.h | inflate.o: zutil.h zlib.h zconf.h infblock.h | ||||||
| inftest.o: zutil.h zlib.h zconf.h |  | ||||||
| inftrees.o: zutil.h zlib.h zconf.h inftrees.h | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||||||
| infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h | infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||||||
| minigzip.o: zlib.h zconf.h | minigzip.o:  zlib.h zconf.h  | ||||||
| trees.o: deflate.h zutil.h zlib.h zconf.h | trees.o: deflate.h zutil.h zlib.h zconf.h  | ||||||
| uncompr.o: zlib.h zconf.h | uncompr.o: zlib.h zconf.h | ||||||
| zutil.o: zutil.h zlib.h zconf.h | zutil.o: zutil.h zlib.h zconf.h   | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								Makefile.bak
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								Makefile.bak
									
									
									
									
									
								
							| @@ -1,59 +0,0 @@ | |||||||
| CC=gcc |  | ||||||
| CFLAGS=-O2 |  | ||||||
| #CFLAGS=-g -DDEBUG |  | ||||||
| LDFLAGS=-L. -lgz |  | ||||||
|  |  | ||||||
| RANLIB=ranlib |  | ||||||
|  |  | ||||||
| OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ |  | ||||||
|        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o |  | ||||||
|  |  | ||||||
| TEST_OBJS = example.o minigzip.o inftest.o |  | ||||||
|  |  | ||||||
| all: example minigzip inftest |  | ||||||
|  |  | ||||||
| test: all |  | ||||||
| 	./example |  | ||||||
| 	echo hello world | ./minigzip | ./minigzip -d  |  | ||||||
|  |  | ||||||
| libgz.a: $(OBJS) |  | ||||||
| 	ar rc $@ $(OBJS) |  | ||||||
| 	$(RANLIB) $@ |  | ||||||
|  |  | ||||||
| example: example.o libgz.a |  | ||||||
| 	$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) |  | ||||||
|  |  | ||||||
| minigzip: minigzip.o libgz.a |  | ||||||
| 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) |  | ||||||
|  |  | ||||||
| inftest: inftest.o libgz.a |  | ||||||
| 	$(CC) $(CFLAGS) -o $@ inftest.o $(LDFLAGS) |  | ||||||
|  |  | ||||||
| clean: |  | ||||||
| 	rm -f *.o example minigzip inftest libgz.a foo.gz |  | ||||||
|  |  | ||||||
| zip: |  | ||||||
| 	zip -ul9 zlib README ChangeLog Makefile *.[ch] |  | ||||||
|  |  | ||||||
| tgz: |  | ||||||
| 	cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ |  | ||||||
| 		zlib/*.[ch] |  | ||||||
|  |  | ||||||
| # DO NOT DELETE THIS LINE -- make depend depends on it. |  | ||||||
|  |  | ||||||
| adler32.o: zutil.h zlib.h zconf.h |  | ||||||
| compress.o: zlib.h zconf.h |  | ||||||
| crc32.o: zutil.h zlib.h zconf.h |  | ||||||
| deflate.o: deflate.h zutil.h zlib.h zconf.h |  | ||||||
| example.o: zlib.h zconf.h |  | ||||||
| gzio.o: zutil.h zlib.h zconf.h |  | ||||||
| infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h |  | ||||||
| infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h |  | ||||||
| inflate.o: zutil.h zlib.h zconf.h infblock.h |  | ||||||
| inftest.o: zutil.h zlib.h zconf.h |  | ||||||
| inftrees.o: zutil.h zlib.h zconf.h inftrees.h |  | ||||||
| infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h |  | ||||||
| minigzip.o: zlib.h zconf.h |  | ||||||
| trees.o: deflate.h zutil.h zlib.h zconf.h |  | ||||||
| uncompr.o: zlib.h zconf.h |  | ||||||
| zutil.o: zutil.h zlib.h zconf.h |  | ||||||
							
								
								
									
										146
									
								
								Makefile.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								Makefile.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | # Makefile for zlib | ||||||
|  | # Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  | # For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  |  | ||||||
|  | # To compile and test, type: | ||||||
|  | #   ./configure; make test | ||||||
|  | # The call of configure is optional if you don't have special requirements | ||||||
|  |  | ||||||
|  | # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: | ||||||
|  | #    make install | ||||||
|  | # To install in $HOME instead of /usr/local, use: | ||||||
|  | #    make install prefix=$HOME | ||||||
|  |  | ||||||
|  | CC=cc | ||||||
|  |  | ||||||
|  | CFLAGS=-O | ||||||
|  | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 | ||||||
|  | #CFLAGS=-g -DDEBUG | ||||||
|  | #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||||
|  | #           -Wstrict-prototypes -Wmissing-prototypes | ||||||
|  |  | ||||||
|  | LDFLAGS=-L. -lz | ||||||
|  | LDSHARED=$(CC) | ||||||
|  |  | ||||||
|  | VER=1.0.7 | ||||||
|  | LIBS=libz.a | ||||||
|  | SHAREDLIB=libz.so | ||||||
|  |  | ||||||
|  | AR=ar rc | ||||||
|  | RANLIB=ranlib | ||||||
|  | TAR=tar | ||||||
|  | SHELL=/bin/sh | ||||||
|  |  | ||||||
|  | prefix=/usr/local | ||||||
|  | exec_prefix = $(prefix) | ||||||
|  |  | ||||||
|  | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||||
|  |        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||||||
|  |  | ||||||
|  | TEST_OBJS = example.o minigzip.o | ||||||
|  |  | ||||||
|  | DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ | ||||||
|  |   algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ | ||||||
|  |   nt/Makefile.nt nt/zlib.dnt  contrib/README.contrib contrib/*.txt \ | ||||||
|  |   contrib/asm386/*.asm contrib/asm386/*.c \ | ||||||
|  |   contrib/asm386/*.bat contrib/asm386/*.mak contrib/iostream/*.cpp \ | ||||||
|  |   contrib/iostream/*.h  contrib/iostream2/*.h contrib/iostream2/*.cpp \ | ||||||
|  |   contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 | ||||||
|  |  | ||||||
|  | all: example minigzip | ||||||
|  |  | ||||||
|  | test: all | ||||||
|  | 	@LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ | ||||||
|  | 	./example ; \ | ||||||
|  | 	echo hello world | ./minigzip | ./minigzip -d | ||||||
|  |  | ||||||
|  | libz.a: $(OBJS) | ||||||
|  | 	$(AR) $@ $(OBJS) | ||||||
|  | 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1 | ||||||
|  |  | ||||||
|  | $(SHAREDLIB).$(VER): $(OBJS) | ||||||
|  | 	$(LDSHARED) -o $@ $(OBJS) | ||||||
|  | 	rm -f $(SHAREDLIB) $(SHAREDLIB).1 | ||||||
|  | 	ln -s $@ $(SHAREDLIB) | ||||||
|  | 	ln -s $@ $(SHAREDLIB).1 | ||||||
|  |  | ||||||
|  | example: example.o $(LIBS) | ||||||
|  | 	$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | ||||||
|  |  | ||||||
|  | minigzip: minigzip.o $(LIBS) | ||||||
|  | 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||||||
|  |  | ||||||
|  | install: $(LIBS) | ||||||
|  | 	-@if [ ! $(prefix)/include  ]; then mkdir $(prefix)/include; fi | ||||||
|  | 	-@if [ ! $(exec_prefix)/lib ]; then mkdir $(exec_prefix)/lib; fi | ||||||
|  | 	cp zlib.h zconf.h $(prefix)/include | ||||||
|  | 	chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||||||
|  | 	cp $(LIBS) $(exec_prefix)/lib | ||||||
|  | 	cd $(exec_prefix)/lib; chmod 644 $(LIBS) | ||||||
|  | 	-@(cd $(exec_prefix)/lib; $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||||
|  | 	cd $(exec_prefix)/lib; if test -f $(SHAREDLIB).$(VER); then \ | ||||||
|  | 	  rm -f $(SHAREDLIB) $(SHAREDLIB).1; \ | ||||||
|  | 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \ | ||||||
|  | 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \ | ||||||
|  | 	  (ldconfig || true)  >/dev/null 2>&1; \ | ||||||
|  | 	fi | ||||||
|  | # The ranlib in install is needed on NeXTSTEP which checks file times | ||||||
|  | # ldconfig is for Linux | ||||||
|  |  | ||||||
|  | uninstall: | ||||||
|  | 	cd $(exec_prefix)/lib; rm -f $(LIBS); \ | ||||||
|  | 	if test -f $(SHAREDLIB); then \ | ||||||
|  | 	 v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p'<$(prefix)/include/zlib.h`;\ | ||||||
|  | 	 rm -f $(SHAREDLIB).$$v $(SHAREDLIB); \ | ||||||
|  | 	fi | ||||||
|  | 	cdz $(prefix)/include; rm -f zlib.h zconf.h | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm -f *.o *~ example minigzip libz.a libz.so* foo.gz | ||||||
|  |  | ||||||
|  | distclean:	clean | ||||||
|  |  | ||||||
|  | zip: | ||||||
|  | 	mv Makefile Makefile~; cp -p Makefile.in Makefile | ||||||
|  | 	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||||||
|  | 	zip -ul9 zlib$$v $(DISTFILES) | ||||||
|  | 	mv Makefile~ Makefile | ||||||
|  |  | ||||||
|  | dist: | ||||||
|  | 	mv Makefile Makefile~; cp -p Makefile.in Makefile | ||||||
|  | 	d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||||||
|  | 	rm -f $$d.tar.gz; \ | ||||||
|  | 	if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ | ||||||
|  | 	files=""; \ | ||||||
|  | 	for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ | ||||||
|  | 	cd ..; \ | ||||||
|  | 	GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ | ||||||
|  | 	if test ! -d $$d; then rm -f $$d; fi | ||||||
|  | 	mv Makefile~ Makefile | ||||||
|  |  | ||||||
|  | tags:	 | ||||||
|  | 	etags *.[ch] | ||||||
|  |  | ||||||
|  | depend: | ||||||
|  | 	makedepend -- $(CFLAGS) -- *.[ch] | ||||||
|  |  | ||||||
|  | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||||
|  |  | ||||||
|  | adler32.o: zlib.h zconf.h | ||||||
|  | compress.o: zlib.h zconf.h | ||||||
|  | crc32.o: zlib.h zconf.h | ||||||
|  | deflate.o: deflate.h zutil.h zlib.h zconf.h | ||||||
|  | example.o: zlib.h zconf.h | ||||||
|  | gzio.o: zutil.h zlib.h zconf.h | ||||||
|  | infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h | ||||||
|  | infcodes.o: zutil.h zlib.h zconf.h | ||||||
|  | infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h | ||||||
|  | inffast.o: zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | inffast.o: infblock.h infcodes.h infutil.h inffast.h | ||||||
|  | inflate.o: zutil.h zlib.h zconf.h infblock.h | ||||||
|  | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||||||
|  | minigzip.o:  zlib.h zconf.h  | ||||||
|  | trees.o: deflate.h zutil.h zlib.h zconf.h  | ||||||
|  | uncompr.o: zlib.h zconf.h | ||||||
|  | zutil.o: zutil.h zlib.h zconf.h   | ||||||
							
								
								
									
										46
									
								
								Makefile.riscos
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								Makefile.riscos
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | # Project:   zlib_1_03 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Toolflags: | ||||||
|  | CCflags = -c -depend !Depend -IC: -g -throwback  -DRISCOS  -fnah  | ||||||
|  | C++flags = -c -depend !Depend -IC: -throwback | ||||||
|  | Linkflags = -aif -c++ -o $@  | ||||||
|  | ObjAsmflags = -throwback -NoCache -depend !Depend | ||||||
|  | CMHGflags =  | ||||||
|  | LibFileflags = -c -l -o $@  | ||||||
|  | Squeezeflags = -o $@ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Final targets: | ||||||
|  | @.zlib_lib:   @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \ | ||||||
|  |         @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \ | ||||||
|  |         @.o.uncompress @.o.zutil  | ||||||
|  |         LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \ | ||||||
|  |         @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \ | ||||||
|  |         @.o.trees @.o.uncompress @.o.zutil  | ||||||
|  | @.test:   @.tests.minigzip @.tests.example  | ||||||
|  |         echo Please run "Test" in directory tests  | ||||||
|  | @.tests.minigzip:   @.o.minigzip @.zlib_lib C:o.Stubs  | ||||||
|  |         Link $(Linkflags) @.o.minigzip @.zlib_lib C:o.Stubs  | ||||||
|  | @.tests.example:   @.o.example @.zlib_lib C:o.Stubs  | ||||||
|  |         Link $(Linkflags) @.o.example @.zlib_lib C:o.Stubs  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # User-editable dependencies: | ||||||
|  | .c.o: | ||||||
|  |         cc $(ccflags) -o $@ $< | ||||||
|  |  | ||||||
|  | # Static dependencies: | ||||||
|  | @.o.example:   @.tests.c.example | ||||||
|  |         cc $(ccflags) -o @.o.example @.tests.c.example  | ||||||
|  | @.o.minigzip:   @.tests.c.minigzip | ||||||
|  |         cc $(ccflags) -o @.o.minigzip @.tests.c.minigzip  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Dynamic dependencies: | ||||||
|  | o.minigzip:	tests.c.minigzip | ||||||
|  | o.minigzip:	h.zlib | ||||||
|  | o.minigzip:	h.zconf | ||||||
|  | o.example:	tests.c.example | ||||||
|  | o.example:	h.zlib | ||||||
|  | o.example:	h.zconf | ||||||
							
								
								
									
										64
									
								
								Makefile.sas
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								Makefile.sas
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | # SMakefile for zlib | ||||||
|  | # Modified from the standard UNIX Makefile Copyright Jean-loup Gailly | ||||||
|  | # Osma Ahvenlampi <Osma.Ahvenlampi@hut.fi> | ||||||
|  | # Amiga, SAS/C 6.56 & Smake | ||||||
|  |  | ||||||
|  | CC=sc | ||||||
|  | CFLAGS=OPT | ||||||
|  | #CFLAGS=OPT CPU=68030 | ||||||
|  | #CFLAGS=DEBUG=LINE | ||||||
|  | LDFLAGS=LIB z.lib | ||||||
|  |  | ||||||
|  | SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \ | ||||||
|  |        NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX  | ||||||
|  |  | ||||||
|  | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||||
|  |        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||||||
|  |  | ||||||
|  | TEST_OBJS = example.o minigzip.o | ||||||
|  |  | ||||||
|  | all: SCOPTIONS example minigzip | ||||||
|  |  | ||||||
|  | test: all | ||||||
|  | 	`cd`/example | ||||||
|  | 	echo hello world | minigzip | minigzip -d  | ||||||
|  |  | ||||||
|  | install: z.lib | ||||||
|  | 	copy zlib.h zconf.h INCLUDE: clone | ||||||
|  | 	copy z.lib LIB: clone | ||||||
|  |  | ||||||
|  | z.lib: $(OBJS) | ||||||
|  | 	oml z.lib r $(OBJS) | ||||||
|  |  | ||||||
|  | example: example.o z.lib | ||||||
|  | 	$(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS) | ||||||
|  |  | ||||||
|  | minigzip: minigzip.o z.lib | ||||||
|  | 	$(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS) | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	-delete force quiet *.o example minigzip z.lib foo.gz *.lnk SCOPTIONS | ||||||
|  |  | ||||||
|  | SCOPTIONS: Smakefile | ||||||
|  |         copy to $@ <from < | ||||||
|  | $(SCOPTIONS) | ||||||
|  | < | ||||||
|  |  | ||||||
|  | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||||
|  |  | ||||||
|  | adler32.o: zutil.h zlib.h zconf.h | ||||||
|  | compress.o: zlib.h zconf.h | ||||||
|  | crc32.o: zutil.h zlib.h zconf.h | ||||||
|  | deflate.o: deflate.h zutil.h zlib.h zconf.h | ||||||
|  | example.o: zlib.h zconf.h | ||||||
|  | gzio.o: zutil.h zlib.h zconf.h | ||||||
|  | infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||||||
|  | infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h | ||||||
|  | inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||||||
|  | inflate.o: zutil.h zlib.h zconf.h infblock.h | ||||||
|  | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | minigzip.o: zlib.h zconf.h | ||||||
|  | trees.o: deflate.h zutil.h zlib.h zconf.h | ||||||
|  | uncompr.o: zlib.h zconf.h | ||||||
|  | zutil.o: zutil.h zlib.h zconf.h | ||||||
							
								
								
									
										105
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								README
									
									
									
									
									
								
							| @@ -1,28 +1,95 @@ | |||||||
| zlib 0.9 is a beta version of a general purpose compression library. | zlib 1.0.7 is a general purpose data compression library.  All the code | ||||||
|  | is reentrant (thread safe).  The data format used by the zlib library | ||||||
| The data format used by the zlib library is described in the | is described by RFCs (Request for Comments) 1950 to 1952 in the files  | ||||||
| file zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available | ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate | ||||||
| in ftp.uu.net:/pub/archiving/zip/doc. | format) and rfc1952.txt (gzip format). These documents are also available in | ||||||
|  | other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html | ||||||
|  |  | ||||||
| All functions of the compression library are documented in the file | All functions of the compression library are documented in the file | ||||||
| zlib.h. A usage example of the library is given in the file example.c | zlib.h. A usage example of the library is given in the file example.c | ||||||
| which also tests that the library is working correctly. | which also tests that the library is working correctly. Another | ||||||
| To compile all files and run the test program, just type: make test | example is given in the file minigzip.c. The compression library itself | ||||||
|  | is composed of all source files except example.c and minigzip.c. | ||||||
|  |  | ||||||
| The changes made in version 0.9 are documented in the file ChangeLog. | To compile all files and run the test program, follow the instructions | ||||||
| The main changes since 0.8 are: | given at the top of Makefile. In short "make test; make install" | ||||||
| - don't assume that zalloc clears the allocated memory | should work for most machines.  For MSDOS, use one of the special | ||||||
| - let again gzread copy uncompressed data unchanged (was working in 0.71) | makefiles such as Makefile.msc; for VMS, use Make_vms.com or descrip.mms. | ||||||
| - deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented |  | ||||||
|  |  | ||||||
| On MSDOS, this version works in both large and small model. However | Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or, | ||||||
| small model compression works only for small values of MEM_LEVEL and | if this fails, to the addresses given below in the Copyright section. | ||||||
| WBITS (see zutil.h). Small model decompression should work up to WBITS=15. | The zlib home page is http://www.cdrom.com/pub/infozip/zlib/ | ||||||
| This version of zlib does not support small or medium model with far | The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/ | ||||||
| allocation of big objects. | Mark Nelson wrote an article about zlib for the Jan. 1997 issue of  | ||||||
|  | Dr. Dobb's Journal; a copy of the article is available in | ||||||
|  | http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm | ||||||
|  |  | ||||||
|  | The changes made in version 1.0.7 are documented in the file ChangeLog. | ||||||
|  | The main changes since 1.0.6 are: | ||||||
|  |  | ||||||
|  | - fix gzseek which was broken in write mode | ||||||
|  | - return error for gzseek to negative absolute position | ||||||
|  | - fix configure for Linux (Chun-Chung Chen) | ||||||
|  | - increase stack space for MSC (Tim Wegner) | ||||||
|  | - get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) | ||||||
|  | - define EXPORTVA for gzprintf (Gilles Vollant) | ||||||
|  | - added mini man page zlib.3 (Rick Rodgers) [volunteers to write full | ||||||
|  |   man pages from zlib.h most welcome. write to jloup@gzip.org] | ||||||
|  | - for contrib/untgz, fix makedir() and improve Makefile | ||||||
|  |  | ||||||
|  | Unsupported third party contributions are provided in directory "contrib". | ||||||
|  |  | ||||||
|  | A Java implementation of zlib is available in the Java Development Kit 1.1 | ||||||
|  | http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html | ||||||
|  | See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details. | ||||||
|  |  | ||||||
|  | A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk> | ||||||
|  | is in the CPAN (Comprehensive Perl Archive Network) sites, such as: | ||||||
|  | ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* | ||||||
|  |  | ||||||
|  | A Python interface to zlib written by A.M. Kuchling <amk@magnet.com> | ||||||
|  | is available from the Python Software Association sites, such as: | ||||||
|  | ftp://ftp.python.org/pub/python/contrib/Encoding/zlib*.tar.gz | ||||||
|  |  | ||||||
|  | Notes for some targets: | ||||||
|  |  | ||||||
|  | - To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc | ||||||
|  |   and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL | ||||||
|  |   The zlib DLL support was initially done by Alessandro Iacopetti and is | ||||||
|  |   now maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL | ||||||
|  |   home page at http://www.winimage.com/zLibDll | ||||||
|  |  | ||||||
|  |   From Visual Basic, you can call the DLL functions which do not take | ||||||
|  |   a structure as argument: compress, uncompress and all gz* functions. | ||||||
|  |   See contrib/visual-basic.txt for more information. | ||||||
|  |   I don't know how to handle structures in Visual Basic, sorry. | ||||||
|  |  | ||||||
|  | - For 64-bit Irix, deflate.c must be compiled without any optimization. | ||||||
|  |   With -O, one libpng test fails. The test works in 32 bit mode (with | ||||||
|  |   the -n32 compiler flag). The compiler bug has been reported to SGI. | ||||||
|  |  | ||||||
|  | - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1    | ||||||
|  |   it works when compiled with cc. | ||||||
|  |  | ||||||
|  | - zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not | ||||||
|  |   accepting the -O option). It works with the other cc compiler. | ||||||
|  |  | ||||||
|  | - gzdopen is not supported on RISCOS | ||||||
|  |  | ||||||
|  | - For Turbo C the small model is supported only with reduced performance to | ||||||
|  |   avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 | ||||||
|  |  | ||||||
|  |  | ||||||
|   Copyright (C) 1995 Jean-loup Gailly and Mark Adler | Acknowledgments: | ||||||
|  |  | ||||||
|  |   The deflate format used by zlib was defined by Phil Katz. The deflate | ||||||
|  |   and zlib specifications were written by Peter Deutsch. Thanks to all the | ||||||
|  |   people who reported problems and suggested various improvements in zlib; | ||||||
|  |   they are too numerous to cite here. | ||||||
|  |  | ||||||
|  | Copyright notice: | ||||||
|  |  | ||||||
|  |  (C) 1995-1998 Jean-loup Gailly and Mark Adler | ||||||
|  |  | ||||||
|   This software is provided 'as-is', without any express or implied |   This software is provided 'as-is', without any express or implied | ||||||
|   warranty.  In no event will the authors be held liable for any damages |   warranty.  In no event will the authors be held liable for any damages | ||||||
| @@ -41,7 +108,7 @@ allocation of big objects. | |||||||
|   3. This notice may not be removed or altered from any source distribution. |   3. This notice may not be removed or altered from any source distribution. | ||||||
|  |  | ||||||
|   Jean-loup Gailly        Mark Adler |   Jean-loup Gailly        Mark Adler | ||||||
|   gzip@prep.ai.mit.edu    madler@cco.caltech.edu |   jloup@gzip.org          madler@alumni.caltech.edu | ||||||
|  |  | ||||||
| If you use the zlib library in a product, we would appreciate *not* | If you use the zlib library in a product, we would appreciate *not* | ||||||
| receiving lengthy legal documents to sign. The sources are provided | receiving lengthy legal documents to sign. The sources are provided | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								adler32.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								adler32.c
									
									
									
									
									
								
							| @@ -1,26 +1,26 @@ | |||||||
| /* adler32.c -- compute the Adler-32 checksum of a data stream | /* adler32.c -- compute the Adler-32 checksum of a data stream | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: adler32.c,v 1.5 1995/04/14 14:49:51 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| #define BASE 65521 /* largest prime smaller than 65536 */ | #define BASE 65521L /* largest prime smaller than 65536 */ | ||||||
| #define NMAX 5552 | #define NMAX 5552 | ||||||
| /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ | /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ | ||||||
|  |  | ||||||
| #define DO1(buf)  {s1 += *buf++; s2 += s1;} | #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;} | ||||||
| #define DO2(buf)  DO1(buf); DO1(buf); | #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1); | ||||||
| #define DO4(buf)  DO2(buf); DO2(buf); | #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2); | ||||||
| #define DO8(buf)  DO4(buf); DO4(buf); | #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4); | ||||||
| #define DO16(buf) DO8(buf); DO8(buf); | #define DO16(buf)   DO8(buf,0); DO8(buf,8); | ||||||
|  |  | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
| uLong adler32(adler, buf, len) | uLong EXPORT adler32(adler, buf, len) | ||||||
|     uLong adler; |     uLong adler; | ||||||
|     Byte *buf; |     const Bytef *buf; | ||||||
|     uInt len; |     uInt len; | ||||||
| { | { | ||||||
|     unsigned long s1 = adler & 0xffff; |     unsigned long s1 = adler & 0xffff; | ||||||
| @@ -30,17 +30,19 @@ uLong adler32(adler, buf, len) | |||||||
|     if (buf == Z_NULL) return 1L; |     if (buf == Z_NULL) return 1L; | ||||||
|  |  | ||||||
|     while (len > 0) { |     while (len > 0) { | ||||||
| 	k = len < NMAX ? len : NMAX; |         k = len < NMAX ? len : NMAX; | ||||||
| 	len -= k; |         len -= k; | ||||||
| 	while (k >= 16) { |         while (k >= 16) { | ||||||
| 	    DO16(buf); |             DO16(buf); | ||||||
| 	    k -= 16; | 	    buf += 16; | ||||||
| 	} |             k -= 16; | ||||||
| 	if (k != 0) do { |         } | ||||||
| 	    DO1(buf); |         if (k != 0) do { | ||||||
| 	} while (--k); |             s1 += *buf++; | ||||||
| 	s1 %= BASE; | 	    s2 += s1; | ||||||
| 	s2 %= BASE; |         } while (--k); | ||||||
|  |         s1 %= BASE; | ||||||
|  |         s2 %= BASE; | ||||||
|     } |     } | ||||||
|     return (s2 << 16) | s1; |     return (s2 << 16) | s1; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										213
									
								
								algorithm.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								algorithm.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | |||||||
|  | 1. Compression algorithm (deflate) | ||||||
|  |  | ||||||
|  | The deflation algorithm used by gzip (also zip and zlib) is a variation of | ||||||
|  | LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in | ||||||
|  | the input data.  The second occurrence of a string is replaced by a | ||||||
|  | pointer to the previous string, in the form of a pair (distance, | ||||||
|  | length).  Distances are limited to 32K bytes, and lengths are limited | ||||||
|  | to 258 bytes. When a string does not occur anywhere in the previous | ||||||
|  | 32K bytes, it is emitted as a sequence of literal bytes.  (In this | ||||||
|  | description, `string' must be taken as an arbitrary sequence of bytes, | ||||||
|  | and is not restricted to printable characters.) | ||||||
|  |  | ||||||
|  | Literals or match lengths are compressed with one Huffman tree, and | ||||||
|  | match distances are compressed with another tree. The trees are stored | ||||||
|  | in a compact form at the start of each block. The blocks can have any | ||||||
|  | size (except that the compressed data for one block must fit in | ||||||
|  | available memory). A block is terminated when deflate() determines that | ||||||
|  | it would be useful to start another block with fresh trees. (This is | ||||||
|  | somewhat similar to the behavior of LZW-based _compress_.) | ||||||
|  |  | ||||||
|  | Duplicated strings are found using a hash table. All input strings of | ||||||
|  | length 3 are inserted in the hash table. A hash index is computed for | ||||||
|  | the next 3 bytes. If the hash chain for this index is not empty, all | ||||||
|  | strings in the chain are compared with the current input string, and | ||||||
|  | the longest match is selected. | ||||||
|  |  | ||||||
|  | The hash chains are searched starting with the most recent strings, to | ||||||
|  | favor small distances and thus take advantage of the Huffman encoding. | ||||||
|  | The hash chains are singly linked. There are no deletions from the | ||||||
|  | hash chains, the algorithm simply discards matches that are too old. | ||||||
|  |  | ||||||
|  | To avoid a worst-case situation, very long hash chains are arbitrarily | ||||||
|  | truncated at a certain length, determined by a runtime option (level | ||||||
|  | parameter of deflateInit). So deflate() does not always find the longest | ||||||
|  | possible match but generally finds a match which is long enough. | ||||||
|  |  | ||||||
|  | deflate() also defers the selection of matches with a lazy evaluation | ||||||
|  | mechanism. After a match of length N has been found, deflate() searches for | ||||||
|  | a longer match at the next input byte. If a longer match is found, the | ||||||
|  | previous match is truncated to a length of one (thus producing a single | ||||||
|  | literal byte) and the process of lazy evaluation begins again. Otherwise, | ||||||
|  | the original match is kept, and the next match search is attempted only N | ||||||
|  | steps later. | ||||||
|  |  | ||||||
|  | The lazy match evaluation is also subject to a runtime parameter. If | ||||||
|  | the current match is long enough, deflate() reduces the search for a longer | ||||||
|  | match, thus speeding up the whole process. If compression ratio is more | ||||||
|  | important than speed, deflate() attempts a complete second search even if | ||||||
|  | the first match is already long enough. | ||||||
|  |  | ||||||
|  | The lazy match evaluation is not performed for the fastest compression | ||||||
|  | modes (level parameter 1 to 3). For these fast modes, new strings | ||||||
|  | are inserted in the hash table only when no match was found, or | ||||||
|  | when the match is not too long. This degrades the compression ratio | ||||||
|  | but saves time since there are both fewer insertions and fewer searches. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 2. Decompression algorithm (inflate) | ||||||
|  |  | ||||||
|  | 2.1 Introduction | ||||||
|  |  | ||||||
|  | The real question is, given a Huffman tree, how to decode fast.  The most | ||||||
|  | important realization is that shorter codes are much more common than | ||||||
|  | longer codes, so pay attention to decoding the short codes fast, and let | ||||||
|  | the long codes take longer to decode. | ||||||
|  |  | ||||||
|  | inflate() sets up a first level table that covers some number of bits of | ||||||
|  | input less than the length of longest code.  It gets that many bits from the | ||||||
|  | stream, and looks it up in the table.  The table will tell if the next | ||||||
|  | code is that many bits or less and how many, and if it is, it will tell | ||||||
|  | the value, else it will point to the next level table for which inflate() | ||||||
|  | grabs more bits and tries to decode a longer code. | ||||||
|  |  | ||||||
|  | How many bits to make the first lookup is a tradeoff between the time it | ||||||
|  | takes to decode and the time it takes to build the table.  If building the | ||||||
|  | table took no time (and if you had infinite memory), then there would only | ||||||
|  | be a first level table to cover all the way to the longest code.  However, | ||||||
|  | building the table ends up taking a lot longer for more bits since short | ||||||
|  | codes are replicated many times in such a table.  What inflate() does is | ||||||
|  | simply to make the number of bits in the first table a variable, and set it | ||||||
|  | for the maximum speed. | ||||||
|  |  | ||||||
|  | inflate() sends new trees relatively often, so it is possibly set for a | ||||||
|  | smaller first level table than an application that has only one tree for | ||||||
|  | all the data.  For inflate, which has 286 possible codes for the | ||||||
|  | literal/length tree, the size of the first table is nine bits.  Also the | ||||||
|  | distance trees have 30 possible values, and the size of the first table is | ||||||
|  | six bits.  Note that for each of those cases, the table ended up one bit | ||||||
|  | longer than the ``average'' code length, i.e. the code length of an | ||||||
|  | approximately flat code which would be a little more than eight bits for | ||||||
|  | 286 symbols and a little less than five bits for 30 symbols.  It would be | ||||||
|  | interesting to see if optimizing the first level table for other | ||||||
|  | applications gave values within a bit or two of the flat code size. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 2.2 More details on the inflate table lookup | ||||||
|  |  | ||||||
|  | Ok, you want to know what this cleverly obfuscated inflate tree actually   | ||||||
|  | looks like.  You are correct that it's not a Huffman tree.  It is simply a   | ||||||
|  | lookup table for the first, let's say, nine bits of a Huffman symbol.  The   | ||||||
|  | symbol could be as short as one bit or as long as 15 bits.  If a particular   | ||||||
|  | symbol is shorter than nine bits, then that symbol's translation is duplicated | ||||||
|  | in all those entries that start with that symbol's bits.  For example, if the   | ||||||
|  | symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a   | ||||||
|  | symbol is nine bits long, it appears in the table once. | ||||||
|  |  | ||||||
|  | If the symbol is longer than nine bits, then that entry in the table points   | ||||||
|  | to another similar table for the remaining bits.  Again, there are duplicated   | ||||||
|  | entries as needed.  The idea is that most of the time the symbol will be short | ||||||
|  | and there will only be one table look up.  (That's whole idea behind data   | ||||||
|  | compression in the first place.)  For the less frequent long symbols, there   | ||||||
|  | will be two lookups.  If you had a compression method with really long   | ||||||
|  | symbols, you could have as many levels of lookups as is efficient.  For   | ||||||
|  | inflate, two is enough. | ||||||
|  |  | ||||||
|  | So a table entry either points to another table (in which case nine bits in   | ||||||
|  | the above example are gobbled), or it contains the translation for the symbol   | ||||||
|  | and the number of bits to gobble.  Then you start again with the next   | ||||||
|  | ungobbled bit. | ||||||
|  |  | ||||||
|  | You may wonder: why not just have one lookup table for how ever many bits the   | ||||||
|  | longest symbol is?  The reason is that if you do that, you end up spending   | ||||||
|  | more time filling in duplicate symbol entries than you do actually decoding.    | ||||||
|  | At least for deflate's output that generates new trees every several 10's of   | ||||||
|  | kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code   | ||||||
|  | would take too long if you're only decoding several thousand symbols.  At the   | ||||||
|  | other extreme, you could make a new table for every bit in the code.  In fact, | ||||||
|  | that's essentially a Huffman tree.  But then you spend two much time   | ||||||
|  | traversing the tree while decoding, even for short symbols. | ||||||
|  |  | ||||||
|  | So the number of bits for the first lookup table is a trade of the time to   | ||||||
|  | fill out the table vs. the time spent looking at the second level and above of | ||||||
|  | the table. | ||||||
|  |  | ||||||
|  | Here is an example, scaled down: | ||||||
|  |  | ||||||
|  | The code being decoded, with 10 symbols, from 1 to 6 bits long: | ||||||
|  |  | ||||||
|  | A: 0 | ||||||
|  | B: 10 | ||||||
|  | C: 1100 | ||||||
|  | D: 11010 | ||||||
|  | E: 11011 | ||||||
|  | F: 11100 | ||||||
|  | G: 11101 | ||||||
|  | H: 11110 | ||||||
|  | I: 111110 | ||||||
|  | J: 111111 | ||||||
|  |  | ||||||
|  | Let's make the first table three bits long (eight entries): | ||||||
|  |  | ||||||
|  | 000: A,1 | ||||||
|  | 001: A,1 | ||||||
|  | 010: A,1 | ||||||
|  | 011: A,1 | ||||||
|  | 100: B,2 | ||||||
|  | 101: B,2 | ||||||
|  | 110: -> table X (gobble 3 bits) | ||||||
|  | 111: -> table Y (gobble 3 bits) | ||||||
|  |  | ||||||
|  | Each entry is what the bits decode to and how many bits that is, i.e. how   | ||||||
|  | many bits to gobble.  Or the entry points to another table, with the number of | ||||||
|  | bits to gobble implicit in the size of the table. | ||||||
|  |  | ||||||
|  | Table X is two bits long since the longest code starting with 110 is five bits | ||||||
|  | long: | ||||||
|  |  | ||||||
|  | 00: C,1 | ||||||
|  | 01: C,1 | ||||||
|  | 10: D,2 | ||||||
|  | 11: E,2 | ||||||
|  |  | ||||||
|  | Table Y is three bits long since the longest code starting with 111 is six   | ||||||
|  | bits long: | ||||||
|  |  | ||||||
|  | 000: F,2 | ||||||
|  | 001: F,2 | ||||||
|  | 010: G,2 | ||||||
|  | 011: G,2 | ||||||
|  | 100: H,2 | ||||||
|  | 101: H,2 | ||||||
|  | 110: I,3 | ||||||
|  | 111: J,3 | ||||||
|  |  | ||||||
|  | So what we have here are three tables with a total of 20 entries that had to   | ||||||
|  | be constructed.  That's compared to 64 entries for a single table.  Or   | ||||||
|  | compared to 16 entries for a Huffman tree (six two entry tables and one four   | ||||||
|  | entry table).  Assuming that the code ideally represents the probability of   | ||||||
|  | the symbols, it takes on the average 1.25 lookups per symbol.  That's compared | ||||||
|  | to one lookup for the single table, or 1.66 lookups per symbol for the   | ||||||
|  | Huffman tree. | ||||||
|  |  | ||||||
|  | There, I think that gives you a picture of what's going on.  For inflate, the   | ||||||
|  | meaning of a particular symbol is often more than just a letter.  It can be a   | ||||||
|  | byte (a "literal"), or it can be either a length or a distance which   | ||||||
|  | indicates a base value and a number of bits to fetch after the code that is   | ||||||
|  | added to the base value.  Or it might be the special end-of-block code.  The   | ||||||
|  | data structures created in inftrees.c try to encode all that information   | ||||||
|  | compactly in the tables. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Jean-loup Gailly        Mark Adler | ||||||
|  | jloup@gzip.org          madler@alumni.caltech.edu | ||||||
|  |  | ||||||
|  |  | ||||||
|  | References: | ||||||
|  |  | ||||||
|  | [LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data | ||||||
|  | Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, | ||||||
|  | pp. 337-343. | ||||||
|  |  | ||||||
|  | ``DEFLATE Compressed Data Format Specification'' available in | ||||||
|  | ftp://ds.internic.net/rfc/rfc1951.txt | ||||||
							
								
								
									
										22
									
								
								compress.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								compress.c
									
									
									
									
									
								
							| @@ -1,9 +1,9 @@ | |||||||
| /* compress.c -- compress a memory buffer | /* compress.c -- compress a memory buffer | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: compress.c,v 1.5 1995/04/29 17:18:43 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| @@ -19,34 +19,36 @@ | |||||||
|    enough memory, Z_BUF_ERROR if there was not enough room in the output |    enough memory, Z_BUF_ERROR if there was not enough room in the output | ||||||
|    buffer. |    buffer. | ||||||
| */ | */ | ||||||
| int compress (dest, destLen, source, sourceLen) | int EXPORT compress (dest, destLen, source, sourceLen) | ||||||
|     Byte *dest; |     Bytef *dest; | ||||||
|     uLong *destLen; |     uLongf *destLen; | ||||||
|     Byte *source; |     const Bytef *source; | ||||||
|     uLong sourceLen; |     uLong sourceLen; | ||||||
| { | { | ||||||
|     z_stream stream; |     z_stream stream; | ||||||
|     int err; |     int err; | ||||||
|  |  | ||||||
|     stream.next_in = source; |     stream.next_in = (Bytef*)source; | ||||||
|     stream.avail_in = (uInt)sourceLen; |     stream.avail_in = (uInt)sourceLen; | ||||||
|  | #ifdef MAXSEG_64K | ||||||
|     /* Check for source > 64K on 16-bit machine: */ |     /* Check for source > 64K on 16-bit machine: */ | ||||||
|     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; |     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; | ||||||
|  | #endif | ||||||
|     stream.next_out = dest; |     stream.next_out = dest; | ||||||
|     stream.avail_out = (uInt)*destLen; |     stream.avail_out = (uInt)*destLen; | ||||||
|     if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; |     if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; | ||||||
|  |  | ||||||
|     stream.zalloc = (alloc_func)0; |     stream.zalloc = (alloc_func)0; | ||||||
|     stream.zfree = (free_func)0; |     stream.zfree = (free_func)0; | ||||||
|  |     stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|     err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); |     err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); | ||||||
|     if (err != Z_OK) return err; |     if (err != Z_OK) return err; | ||||||
|  |  | ||||||
|     err = deflate(&stream, Z_FINISH); |     err = deflate(&stream, Z_FINISH); | ||||||
|     if (err != Z_STREAM_END) { |     if (err != Z_STREAM_END) { | ||||||
| 	deflateEnd(&stream); |         deflateEnd(&stream); | ||||||
| 	return err == Z_OK ? Z_BUF_ERROR : err; |         return err == Z_OK ? Z_BUF_ERROR : err; | ||||||
|     } |     } | ||||||
|     *destLen = stream.total_out; |     *destLen = stream.total_out; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										121
									
								
								configure
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										121
									
								
								configure
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1,121 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | # configure script for zlib. This script is needed only if | ||||||
|  | # you wish to build a shared library and your system supports them, | ||||||
|  | # of if you need special compiler, flags or install directory. | ||||||
|  | # Otherwise, you can just use directly "make test; make install" | ||||||
|  | # | ||||||
|  | # To create a shared library, use "configure --shared"; by default a static | ||||||
|  | # library is created. If the primitive shared library support provided here | ||||||
|  | # does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz | ||||||
|  | # | ||||||
|  | # To impose specific compiler or flags or install directory, use for example: | ||||||
|  | #    prefix=$HOME CC=cc CFLAGS="-O4" ./configure | ||||||
|  | # or for csh/tcsh users: | ||||||
|  | #    (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) | ||||||
|  | # LDSHARED is the command to be used to create a shared library | ||||||
|  |  | ||||||
|  | LIBS=libz.a | ||||||
|  | SHAREDLIB=libz.so | ||||||
|  | VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` | ||||||
|  | AR=${AR-"ar rc"} | ||||||
|  | RANLIB=${RANLIB-"ranlib"} | ||||||
|  | prefix=${prefix-/usr/local} | ||||||
|  | exec_prefix=${exec_prefix-$prefix} | ||||||
|  | shared_ext='.so' | ||||||
|  | shared=0 | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  |   -s* | --s*) shared=1; shift;; | ||||||
|  |   -h* | --h*) echo 'syntax: configure [ --shared ]'; exit 0;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | test -z "$CC" && echo Checking for gcc... | ||||||
|  | test=ztest$$ | ||||||
|  | cat > $test.c <<EOF | ||||||
|  | int hello() { printf("hello\n"); } | ||||||
|  | EOF | ||||||
|  | if test -z "$CC" -o "$CC" = "gcc" && (gcc -c -O3 $test.c) 2>/dev/null; then | ||||||
|  |   CC=gcc | ||||||
|  |   SFLAGS=${CFLAGS-"-fPIC -O3"} | ||||||
|  |   CFLAGS=${CFLAGS-"-O3"} | ||||||
|  |   case `(uname -s || echo unknown) 2>/dev/null` in | ||||||
|  |   Linux | linux) LDSHARED=${LDSHARED-"gcc -shared -Wl,-soname,libz.so.1"};; | ||||||
|  |   *)             LDSHARED=${LDSHARED-"gcc -shared"};; | ||||||
|  |   esac | ||||||
|  | else | ||||||
|  |   # find system name and corresponding cc options | ||||||
|  |   CC=${CC-cc} | ||||||
|  |   case `(uname -sr || echo unknown) 2>/dev/null` in | ||||||
|  |   SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} | ||||||
|  |              CFLAGS=${CFLAGS-"-fast -xcg89"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc -G"};; | ||||||
|  |   SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-O2"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"ld"};; | ||||||
|  |   IRIX*)     SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-ansi -O2"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc -shared"};; | ||||||
|  |   QNX*)      SFLAGS=${CFLAGS-"-4 -O"} | ||||||
|  |              CFLAGS=${CFLAGS-"-4 -O"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc"} | ||||||
|  |              RANLIB=${RANLIB-"true"} | ||||||
|  |              AR="cc -A";; | ||||||
|  |   SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-O3"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; | ||||||
|  |   HP-UX*)    SFLAGS=${CFLAGS-"-O +z"} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-O"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} | ||||||
|  | 	     shared_ext='.sl' | ||||||
|  | 	     SHAREDLIB='libz.sl';; | ||||||
|  |   UNIX_System_V\ 4.2.0)  | ||||||
|  | 	     SFLAGS=${CFLAGS-"-KPIC -O"} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-O"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc -G"};; | ||||||
|  |   # send working options for other systems to support@gzip.org | ||||||
|  |   *)         SFLAGS=${CFLAGS-"-O"} | ||||||
|  | 	     CFLAGS=${CFLAGS-"-O"} | ||||||
|  | 	     LDSHARED=${LDSHARED-"cc -shared"};; | ||||||
|  |   esac | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if test $shared -eq 1; then | ||||||
|  |   echo Checking for shared library support... | ||||||
|  |   # we must test in two steps (cc then ld), required at least on SunOS 4.x | ||||||
|  |   if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" && | ||||||
|  |      test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then | ||||||
|  |     CFLAGS="$SFLAGS" | ||||||
|  |     LIBS="$SHAREDLIB.$VER" | ||||||
|  |     echo Building shared library $SHAREDLIB.$VER with $CC. | ||||||
|  |   else | ||||||
|  |     echo No shared library suppport. | ||||||
|  |     shared=0; | ||||||
|  |   fi | ||||||
|  | fi | ||||||
|  | if test $shared -eq 0; then | ||||||
|  |   LDSHARED="$CC" | ||||||
|  |   echo Building static library $LIBS version $VER with $CC. | ||||||
|  | fi | ||||||
|  | rm -f $test.[co] $test$shared_ext | ||||||
|  |  | ||||||
|  | if test -f /usr/include/unistd.h; then | ||||||
|  |   CFLAGS="$CFLAGS -DHAVE_UNISTD_H" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if test ! -f /usr/include/errno.h; then | ||||||
|  |   CFLAGS="$CFLAGS -DNO_ERRNO_H" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | # udpate Makefile | ||||||
|  | sed < Makefile.in " | ||||||
|  | /^CC *=/s,=.*,=$CC, | ||||||
|  | /^CFLAGS *=/s/=.*/=$CFLAGS/ | ||||||
|  | /^LDSHARED *=/s%=.*%=$LDSHARED% | ||||||
|  | /^LIBS *=/s,=.*,=$LIBS, | ||||||
|  | /^SHAREDLIB *=/s,=.*,=$SHAREDLIB, | ||||||
|  | /^AR *=/s,=.*,=$AR, | ||||||
|  | /^RANLIB *=/s,=.*,=$RANLIB, | ||||||
|  | /^VER *=/s/=.*/=$VER/ | ||||||
|  | /^prefix *=/s,=.*,=$prefix, | ||||||
|  | /^exec_prefix *=/s,=.*,=$exec_prefix, | ||||||
|  | " > Makefile | ||||||
							
								
								
									
										21
									
								
								contrib/README.contrib
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								contrib/README.contrib
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | All files under this contrib directory are UNSUPPORTED. There were | ||||||
|  | provided by users of zlib and were not tested by the authors of zlib. | ||||||
|  | Use at your own risk. Please contact the authors of the contributions | ||||||
|  | for help about these, not the zlib authors. Thanks. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | asm386/     by Gilles Vollant <info@winimage.com> | ||||||
|  | 	386 asm code replacing longest_match(). This code may be slower | ||||||
|  |         than the C code if you have a good compiler. | ||||||
|  |  | ||||||
|  | iostream/   by Kevin Ruland <kevin@rodin.wustl.edu> | ||||||
|  |         A C++ I/O streams interface to the zlib gz* functions | ||||||
|  |  | ||||||
|  | iostream2/  by Tyge L<>vset <Tyge.Lovset@cmr.no> | ||||||
|  | 	Another C++ I/O streams interface | ||||||
|  |  | ||||||
|  | untgz/      by "Pedro A. Aranda Guti\irrez" <paag@tid.es> | ||||||
|  | 	A very simple tar.gz file extractor using zlib | ||||||
|  |  | ||||||
|  | visual-basic.txt by Carlos Rios <c_rios@sonda.cl> | ||||||
|  |         How to use compress(), uncompress() and the gz* functions from VB. | ||||||
							
								
								
									
										464
									
								
								contrib/asm386/gvmat32.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										464
									
								
								contrib/asm386/gvmat32.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,464 @@ | |||||||
|  | ; | ||||||
|  | ; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86 | ||||||
|  | ; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant. | ||||||
|  | ; File written by Gilles Vollant, by modifiying the longest_match | ||||||
|  | ;  from Jean-loup Gailly in deflate.c | ||||||
|  | ; It need wmask == 0x7fff | ||||||
|  | ;     (assembly code is faster with a fixed wmask) | ||||||
|  | ; | ||||||
|  | ; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK) | ||||||
|  | ;   I compile with : "ml /coff /Zi /c gvmat32.asm" | ||||||
|  | ; | ||||||
|  | ; uInt longest_match_gvasm(IPos cur_match,int* match_start_ptr,uInt scan_end, | ||||||
|  | ;                          uInt scan_start,ush* prev,uch* window,int best_len, | ||||||
|  | ;                          IPos limit,uInt chain_length,uch* scanrp, | ||||||
|  | ;                          uInt nice_match); | ||||||
|  |  | ||||||
|  | ;uInt longest_match(s, cur_match) | ||||||
|  | ;    deflate_state *s; | ||||||
|  | ;    IPos cur_match;                             /* current match */ | ||||||
|  |  | ||||||
|  | 	NbStack		equ	76 | ||||||
|  | 	cur_match	equ	dword ptr[esp+NbStack-0] | ||||||
|  | 	str_s		equ	dword ptr[esp+NbStack-4] | ||||||
|  | 	; 5 dword on top (ret,ebp,esi,edi,ebx) | ||||||
|  | 	adrret		equ	dword ptr[esp+NbStack-8] | ||||||
|  | 	pushebp		equ	dword ptr[esp+NbStack-12] | ||||||
|  | 	pushedi		equ	dword ptr[esp+NbStack-16] | ||||||
|  | 	pushesi		equ	dword ptr[esp+NbStack-20] | ||||||
|  | 	pushebx		equ	dword ptr[esp+NbStack-24] | ||||||
|  |  | ||||||
|  | 	chain_length    equ dword ptr [esp+NbStack-28] | ||||||
|  | 	limit           equ dword ptr [esp+NbStack-32] | ||||||
|  | 	best_len        equ dword ptr [esp+NbStack-36] | ||||||
|  | 	window          equ dword ptr [esp+NbStack-40] | ||||||
|  | 	prev            equ dword ptr [esp+NbStack-44] | ||||||
|  | 	scan_start      equ  word ptr [esp+NbStack-48] | ||||||
|  | 	scan_end        equ  word ptr [esp+NbStack-52] | ||||||
|  | 	match_start_ptr equ dword ptr [esp+NbStack-56] | ||||||
|  | 	nice_match      equ dword ptr [esp+NbStack-60] | ||||||
|  | 	scanrp          equ dword ptr [esp+NbStack-64] | ||||||
|  |  | ||||||
|  | 	windowlen       equ dword ptr [esp+NbStack-68] | ||||||
|  | 	match_start     equ dword ptr [esp+NbStack-72] | ||||||
|  | 	strend			equ dword ptr [esp+NbStack-76] | ||||||
|  | 	NbStackAdd		equ	(76-24) | ||||||
|  |  | ||||||
|  |     .386p | ||||||
|  |  | ||||||
|  |     name    gvmatch | ||||||
|  |     .MODEL  FLAT | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @lmtype				TYPEDEF         PROTO C :PTR , :SDWORD | ||||||
|  | longest_match_c		PROTO           @lmtype | ||||||
|  |  | ||||||
|  | 	dep_max_chain_length	equ	70h | ||||||
|  | 	dep_window				equ	2ch | ||||||
|  | 	dep_strstart			equ	60h | ||||||
|  | 	dep_prev_length			equ 6ch | ||||||
|  | 	dep_nice_match			equ 84h | ||||||
|  | 	dep_w_size				equ	20h | ||||||
|  | 	dep_prev				equ	34h | ||||||
|  | 	dep_w_mask				equ	28h | ||||||
|  | 	dep_good_match			equ 80h | ||||||
|  | 	dep_match_start			equ	64h | ||||||
|  | 	dep_lookahead			equ	68h | ||||||
|  |  | ||||||
|  |  | ||||||
|  | _TEXT   segment | ||||||
|  |     public  _longest_match_asm7fff | ||||||
|  |  | ||||||
|  |     MAX_MATCH		equ 258 | ||||||
|  | 	MIN_MATCH		equ 3 | ||||||
|  | 	MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) | ||||||
|  |  | ||||||
|  | ; initialize or check the variables used in match.asm. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ; ----------------------------------------------------------------------- | ||||||
|  | ; Set match_start to the longest match starting at the given string and | ||||||
|  | ; return its length. Matches shorter or equal to prev_length are discarded, | ||||||
|  | ; in which case the result is equal to prev_length and match_start is | ||||||
|  | ; garbage. | ||||||
|  | ; IN assertions: cur_match is the head of the hash chain for the current | ||||||
|  | ;   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 | ||||||
|  |  | ||||||
|  | ; int longest_match(cur_match) | ||||||
|  |  | ||||||
|  | _longest_match_asm7fff proc near | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	    ; return address | ||||||
|  |  | ||||||
|  | 		mov		eax,[esp+4] | ||||||
|  | 		mov		bx,[eax+dep_w_mask] | ||||||
|  | 		cmp		bx,7fffh | ||||||
|  | 		jnz		longest_match_c | ||||||
|  |  | ||||||
|  | 	    push    ebp              | ||||||
|  | 	    push    edi              | ||||||
|  | 	    push    esi              | ||||||
|  | 	    push    ebx              | ||||||
|  |  | ||||||
|  | 	    sub     esp,NbStackAdd | ||||||
|  |  | ||||||
|  | 		;//mov		ebp,str_s | ||||||
|  | 		mov		ebp,eax | ||||||
|  |  | ||||||
|  | 		mov		eax,[ebp+dep_max_chain_length] | ||||||
|  | 		mov		ebx,[ebp+dep_prev_length] | ||||||
|  | 		cmp		[ebp+dep_good_match],ebx	; if prev_length>=good_match chain_length >>= 2 | ||||||
|  | 		ja		noshr		 | ||||||
|  | 		shr		eax,2 | ||||||
|  | noshr: | ||||||
|  | 		mov		edi,[ebp+dep_nice_match] | ||||||
|  | 		mov		chain_length,eax | ||||||
|  | 		mov		edx,[ebp+dep_lookahead] | ||||||
|  | 		cmp		edx,edi | ||||||
|  | ;if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||||||
|  | 		jae		nolookaheadnicematch | ||||||
|  | 		mov		edi,edx | ||||||
|  | nolookaheadnicematch: | ||||||
|  | 		mov		best_len,ebx | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		mov		esi,[ebp+dep_window] | ||||||
|  | 		mov		ecx,[ebp+dep_strstart] | ||||||
|  | 		mov		window,esi | ||||||
|  | 		 | ||||||
|  | 		mov		nice_match,edi | ||||||
|  | 		add		esi,ecx | ||||||
|  | 		mov		scanrp,esi | ||||||
|  | 		mov		ax,word ptr [esi] | ||||||
|  | 		mov		bx,word ptr [esi+ebx-1] | ||||||
|  | 		add		esi,MAX_MATCH-1 | ||||||
|  | 		mov		scan_start,ax | ||||||
|  | 		mov		strend,esi | ||||||
|  | 		mov		scan_end,bx | ||||||
|  |  | ||||||
|  | ;    IPos limit = s->strstart > (IPos)MAX_DIST(s) ? | ||||||
|  | ;        s->strstart - (IPos)MAX_DIST(s) : NIL; | ||||||
|  |  | ||||||
|  | 		mov		esi,[ebp+dep_w_size] | ||||||
|  | 		sub		esi,MIN_LOOKAHEAD | ||||||
|  | 		; here esi = MAX_DIST(s) | ||||||
|  | 		sub		ecx,esi | ||||||
|  | 		ja		nodist | ||||||
|  | 		xor		ecx,ecx | ||||||
|  | nodist: | ||||||
|  | 		mov		limit,ecx | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		mov		eax,[ebp+dep_prev] | ||||||
|  | 		mov		prev,eax | ||||||
|  |  | ||||||
|  | 	    mov     ebx,dword ptr [ebp+dep_match_start] | ||||||
|  | 	    mov     bp,scan_start | ||||||
|  | 	    mov     edx,cur_match | ||||||
|  | 	    mov     match_start,ebx | ||||||
|  |  | ||||||
|  | 	    mov     bx,scan_end | ||||||
|  | 	    mov     eax,window | ||||||
|  | 		mov		edi,eax | ||||||
|  | 	    add     edi,best_len | ||||||
|  | 	    mov     esi,prev | ||||||
|  | 		dec     edi | ||||||
|  | 	    mov     windowlen,edi | ||||||
|  | 	     | ||||||
|  | 	    jmp     beginloop2 | ||||||
|  | 	    align   4 | ||||||
|  |  | ||||||
|  | ; here, in the loop | ||||||
|  | ;;;;       eax = chain_length | ||||||
|  | ;       edx = dx = cur_match | ||||||
|  | ;       ecx = limit | ||||||
|  | ;        bx = scan_end | ||||||
|  | ;        bp = scan_start | ||||||
|  | ;       edi = windowlen (window + best_len) | ||||||
|  | ;       esi = prev | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;// here; eax <=16 | ||||||
|  | normalbeg0add16:  | ||||||
|  | 		add		chain_length,16 | ||||||
|  | 		jz		exitloop | ||||||
|  | normalbeg0:  | ||||||
|  | 	    cmp     word ptr[edi+edx-0],bx | ||||||
|  | 	    je      normalbeg2 | ||||||
|  | 	    and     edx,7fffh | ||||||
|  | 	    mov     dx,word ptr[esi+edx*2] | ||||||
|  | 	    cmp     ecx,edx | ||||||
|  | 	    jnb     exitloop | ||||||
|  | 	    dec     chain_length | ||||||
|  | 		jnz		normalbeg0 | ||||||
|  | ;jnbexitloopshort1: | ||||||
|  | 		jmp     exitloop | ||||||
|  |  | ||||||
|  | contloop3: | ||||||
|  | 	    mov     edi,windowlen | ||||||
|  |  | ||||||
|  | ; cur_match = prev[cur_match & wmask] | ||||||
|  | 	    and		edx,7fffh | ||||||
|  | 	    mov     dx,word ptr[esi+edx*2] | ||||||
|  | ; if cur_match > limit, go to exitloop | ||||||
|  | 	    cmp     ecx,edx | ||||||
|  | jnbexitloopshort1: | ||||||
|  | 	    jnb     exitloop | ||||||
|  | ; if --chain_length != 0, go to exitloop | ||||||
|  |  | ||||||
|  | beginloop2: | ||||||
|  | 		sub		chain_length,16+1 | ||||||
|  | 		jna     normalbeg0add16 | ||||||
|  |  | ||||||
|  | do16: | ||||||
|  | 	    cmp     word ptr[edi+edx],bx | ||||||
|  | 	    je      normalbeg2dc0 | ||||||
|  |  | ||||||
|  | maccn	MACRO	lab | ||||||
|  | 	    and     edx,7fffh | ||||||
|  | 	    mov     dx,word ptr[esi+edx*2] | ||||||
|  | 	    cmp     ecx,edx | ||||||
|  | 	    jnb     exitloop | ||||||
|  | 	    cmp     word ptr[edi+edx-0],bx | ||||||
|  | 	    je      lab | ||||||
|  | 		ENDM | ||||||
|  |  | ||||||
|  | rcontloop0: | ||||||
|  | 		maccn normalbeg2dc1 | ||||||
|  |  | ||||||
|  | rcontloop1: | ||||||
|  | 		maccn normalbeg2dc2 | ||||||
|  |  | ||||||
|  | rcontloop2: | ||||||
|  | 		maccn normalbeg2dc3 | ||||||
|  |  | ||||||
|  | rcontloop3: | ||||||
|  | 		maccn normalbeg2dc4 | ||||||
|  |  | ||||||
|  | rcontloop4: | ||||||
|  | 		maccn normalbeg2dc5 | ||||||
|  |  | ||||||
|  | rcontloop5: | ||||||
|  | 		maccn normalbeg2dc6 | ||||||
|  |  | ||||||
|  | rcontloop6: | ||||||
|  | 		maccn normalbeg2dc7 | ||||||
|  |  | ||||||
|  | rcontloop7: | ||||||
|  | 		maccn normalbeg2dc8 | ||||||
|  |  | ||||||
|  | rcontloop8: | ||||||
|  | 		maccn normalbeg2dc9 | ||||||
|  |  | ||||||
|  | rcontloop9: | ||||||
|  | 		maccn normalbeg2dc10 | ||||||
|  |  | ||||||
|  | rcontloop10: | ||||||
|  | 		maccn normalbeg2dc11 | ||||||
|  |  | ||||||
|  | rcontloop11: | ||||||
|  | 		maccn short normalbeg2dc12 | ||||||
|  |  | ||||||
|  | rcontloop12: | ||||||
|  | 		maccn short normalbeg2dc13 | ||||||
|  |  | ||||||
|  | rcontloop13: | ||||||
|  | 		maccn short normalbeg2dc14 | ||||||
|  |  | ||||||
|  | rcontloop14: | ||||||
|  | 		maccn short normalbeg2dc15 | ||||||
|  |  | ||||||
|  | rcontloop15: | ||||||
|  | 	    and     edx,7fffh | ||||||
|  | 	    mov     dx,word ptr[esi+edx*2] | ||||||
|  | 	    cmp     ecx,edx | ||||||
|  | 	    jnb     short exitloopshort | ||||||
|  |  | ||||||
|  | 		sub		chain_length,16 | ||||||
|  | 		ja		do16 | ||||||
|  | 		jmp		normalbeg0add16 | ||||||
|  |  | ||||||
|  | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
|  |  | ||||||
|  | exitloopshort: | ||||||
|  | 		jmp		exitloop                   | ||||||
|  |  | ||||||
|  | normbeg	MACRO	rcontlab,valsub | ||||||
|  | 	    cmp     bp,word ptr[eax+edx] | ||||||
|  | 		jne		rcontlab | ||||||
|  | 		add     chain_length,16-valsub | ||||||
|  | 		jmp		iseq | ||||||
|  | 		ENDM | ||||||
|  |  | ||||||
|  | normalbeg2dc12: | ||||||
|  | 		normbeg	rcontloop12,12 | ||||||
|  |  | ||||||
|  | normalbeg2dc13: | ||||||
|  | 		normbeg	rcontloop13,13 | ||||||
|  |  | ||||||
|  | normalbeg2dc14: | ||||||
|  | 		normbeg	rcontloop14,14 | ||||||
|  |  | ||||||
|  | normalbeg2dc15: | ||||||
|  | 		normbeg	rcontloop15,15 | ||||||
|  |  | ||||||
|  | normalbeg2dc11: | ||||||
|  | 		normbeg	rcontloop11,11 | ||||||
|  |  | ||||||
|  | normalbeg2dc10: | ||||||
|  | 		normbeg	rcontloop10,10 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | normalbeg2dc9: | ||||||
|  | 		normbeg	rcontloop9,9 | ||||||
|  |  | ||||||
|  | normalbeg2dc8: | ||||||
|  | 		normbeg	rcontloop8,8 | ||||||
|  |  | ||||||
|  | normalbeg2dc7: | ||||||
|  | 		normbeg	rcontloop7,7 | ||||||
|  |  | ||||||
|  | normalbeg2dc5: | ||||||
|  | 		normbeg	rcontloop5,5 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | normalbeg2dc6: | ||||||
|  | 		normbeg	rcontloop6,6 | ||||||
|  |  | ||||||
|  | normalbeg2dc4: | ||||||
|  | 		normbeg	rcontloop4,4 | ||||||
|  |  | ||||||
|  | normalbeg2dc3: | ||||||
|  | 		normbeg	rcontloop3,3 | ||||||
|  |  | ||||||
|  | normalbeg2dc2: | ||||||
|  | 		normbeg	rcontloop2,2 | ||||||
|  |  | ||||||
|  | normalbeg2dc1: | ||||||
|  | 		normbeg	rcontloop1,1 | ||||||
|  |  | ||||||
|  | normalbeg2dc0: | ||||||
|  | 		normbeg	rcontloop0,0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end | ||||||
|  |  | ||||||
|  | normalbeg2: | ||||||
|  |  | ||||||
|  | 			 ; 10 nop here take 10% time | ||||||
|  | 		mov		edi,window | ||||||
|  | 		  ;mov     chain_length,eax    ; now, we need eax... | ||||||
|  | 					 | ||||||
|  | 	    cmp     bp,word ptr[edi+edx] | ||||||
|  | 	    jne     contloop3                   ; if *(ushf*)match != scan_start, continue | ||||||
|  |  | ||||||
|  | iseq: | ||||||
|  |  | ||||||
|  | 		mov		edi,eax | ||||||
|  | 	    mov     esi,scanrp                  ; esi = scan     | ||||||
|  | 	    add     edi,edx				; edi = window + cur_match = match | ||||||
|  |  | ||||||
|  | 		        | ||||||
|  | 	    mov     eax,[esi+3]					; compare manually dword at match+3 | ||||||
|  | 	    xor     eax,[edi+3]                 ;       and scan +3 | ||||||
|  |  | ||||||
|  | 	    jz      begincompare                ; if equal, go to long compare | ||||||
|  |  | ||||||
|  | 			; we will determine the unmatch byte and calculate len (in esi) | ||||||
|  | 		or		al,al | ||||||
|  | 		je		eq1rr | ||||||
|  | 	    mov     esi,3 | ||||||
|  | 	    jmp     trfinval | ||||||
|  | eq1rr: | ||||||
|  | 	    or      ax,ax                                | ||||||
|  | 	    je      eq1 | ||||||
|  |  | ||||||
|  | 	    mov     esi,4 | ||||||
|  | 	    jmp     trfinval | ||||||
|  | eq1: | ||||||
|  | 	    shl     eax,8 | ||||||
|  | 	    jz      eq11 | ||||||
|  | 	    mov     esi,5 | ||||||
|  | 	    jmp     trfinval | ||||||
|  | eq11: | ||||||
|  | 	    mov     esi,6 | ||||||
|  | 	    jmp     trfinval | ||||||
|  |  | ||||||
|  | begincompare: | ||||||
|  | 		; here we now scan and match begin same | ||||||
|  | 	    add     edi,6 | ||||||
|  | 	    add     esi,6 | ||||||
|  | 	    mov     ecx,(MAX_MATCH-(2+4))/4     ;//; scan for at most MAX_MATCH bytes | ||||||
|  | 	    repe    cmpsd                                               ;//; loop until mismatch | ||||||
|  |  | ||||||
|  | 	    je      trfin                                               ; go to trfin if not unmatch | ||||||
|  | 			; we determine the unmatch byte | ||||||
|  | 	    sub     esi,4 | ||||||
|  | 	    mov     eax,[edi-4] | ||||||
|  | 	    xor     eax,[esi] | ||||||
|  | 	    or      al,al | ||||||
|  |  | ||||||
|  | 	    jnz     trfin | ||||||
|  | 	    inc     esi | ||||||
|  |  | ||||||
|  | 	    or      ax,ax | ||||||
|  | 	    jnz     trfin | ||||||
|  | 	    inc     esi | ||||||
|  |  | ||||||
|  | 	    shl     eax,8            | ||||||
|  | 	    jnz     trfin | ||||||
|  | 	    inc     esi | ||||||
|  |  | ||||||
|  | trfin:       | ||||||
|  | 	    sub     esi,scanrp          ; esi = len | ||||||
|  | trfinval: | ||||||
|  | 	    cmp     esi,best_len        ; if len <= best_len, go contloop2 | ||||||
|  | 	    jbe     contloop2 | ||||||
|  |  | ||||||
|  | 	    mov     best_len,esi        ; len become best_len | ||||||
|  |  | ||||||
|  | 	    mov     match_start,edx | ||||||
|  | 	    cmp     esi,nice_match ;//; if esi >= nice_match, exit | ||||||
|  | 	    mov     ecx,scanrp | ||||||
|  | 	    jae     exitloop | ||||||
|  | 	    add     esi,window | ||||||
|  | 	    add     ecx,best_len | ||||||
|  | 			dec             esi | ||||||
|  | 	    mov     windowlen,esi | ||||||
|  | 	    mov     bx,[ecx-1] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ; now we restore eax, ecx and esi, for the big loop : | ||||||
|  | contloop2: | ||||||
|  | 	    mov     esi,prev | ||||||
|  | 	    mov     ecx,limit | ||||||
|  | 	    ;mov     eax,chain_length | ||||||
|  | 		mov		eax,window | ||||||
|  | 	    jmp     contloop3 | ||||||
|  |  | ||||||
|  | exitloop:         | ||||||
|  | 	    mov     ebx,match_start | ||||||
|  | 		mov		ebp,str_s | ||||||
|  | 	    mov     dword ptr [ebp+dep_match_start],ebx | ||||||
|  | 	    mov     eax,best_len | ||||||
|  | 	    add     esp,NbStackAdd | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	    pop     ebx | ||||||
|  | 	    pop     esi | ||||||
|  | 	    pop     edi | ||||||
|  | 	    pop     ebp  | ||||||
|  | 	    ret | ||||||
|  |  | ||||||
|  | _longest_match_asm7fff endp | ||||||
|  |  | ||||||
|  | _TEXT   ends | ||||||
|  | end | ||||||
|  | 					 | ||||||
							
								
								
									
										229
									
								
								contrib/asm386/gvmat32c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								contrib/asm386/gvmat32c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,229 @@ | |||||||
|  | /* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86 | ||||||
|  |  * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant. | ||||||
|  |  * File written by Gilles Vollant, by modifiying the longest_match | ||||||
|  |  *  from Jean-loup Gailly in deflate.c | ||||||
|  |  *  it prepare all parameters and call the assembly longest_match_gvasm | ||||||
|  |  *  longest_match execute standard C code is wmask != 0x7fff | ||||||
|  |  *     (assembly code is faster with a fixed wmask) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | //#pragma optimize("agt",on) | ||||||
|  |  | ||||||
|  | #include "deflate.h" | ||||||
|  |  | ||||||
|  | #undef FAR | ||||||
|  | #include <windows.h> | ||||||
|  |  | ||||||
|  | #ifdef ASMV | ||||||
|  |  | ||||||
|  | #define NIL 0 | ||||||
|  |  | ||||||
|  | static unsigned int tot=0; | ||||||
|  | static unsigned int totl0=0; | ||||||
|  | static unsigned int totl0p0=0; | ||||||
|  | static unsigned int ba0=0; | ||||||
|  | static unsigned int ba1=0; | ||||||
|  | static unsigned int cpta=0; | ||||||
|  | static unsigned int cptb=0; | ||||||
|  |  | ||||||
|  | #define UNALIGNED_OK | ||||||
|  | #define gvshow(a,b,c,d) | ||||||
|  | /* | ||||||
|  | void gvshow(int chain_length,int len,int limit,ushf* prev) | ||||||
|  | { | ||||||
|  | static int ival=0; | ||||||
|  | char sz[80]; | ||||||
|  | unsigned long i; | ||||||
|  | int prev0=*prev; | ||||||
|  | 	ival++; | ||||||
|  | 	//wsprintf(sz,"call %u, len=%u, chain_length=%u\n",ival,len,chain_length); | ||||||
|  | 	//OutputDebugString(sz); | ||||||
|  | 	tot++; | ||||||
|  | 	if (limit==NIL) | ||||||
|  | 		totl0++; | ||||||
|  | 	if ((limit==NIL) && (prev0==0)) | ||||||
|  | 		totl0p0++; | ||||||
|  | 	for (i=limit+1;i<32768;i++) | ||||||
|  | 	{ | ||||||
|  | 		ush va=*(prev+i); | ||||||
|  | 		if (ba0>4000000000) | ||||||
|  | 		{ | ||||||
|  | 			ba0+=10; | ||||||
|  | 		} | ||||||
|  | 		ba0++; | ||||||
|  | 		if ((va>limit) || (va==0)) | ||||||
|  | 			continue; | ||||||
|  | 		ba1++; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* if your C compiler don't add underline before function name, | ||||||
|  | 		define ADD_UNDERLINE_ASMFUNC */ | ||||||
|  | #ifdef ADD_UNDERLINE_ASMFUNC | ||||||
|  | #define longest_match_asm7fff _longest_match_asm7fff | ||||||
|  | #endif | ||||||
|  | void match_init() | ||||||
|  | { | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uInt longest_match_c( | ||||||
|  |     deflate_state *s, | ||||||
|  |     IPos cur_match);                             /* current match */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | uInt longest_match_asm7fff( | ||||||
|  |     deflate_state *s, | ||||||
|  |     IPos cur_match);                             /* current match */ | ||||||
|  |  | ||||||
|  | uInt longest_match( | ||||||
|  |     deflate_state *s, | ||||||
|  |     IPos cur_match)                             /* current match */ | ||||||
|  | { | ||||||
|  |     if (s->w_mask == 0x7fff) | ||||||
|  |         return longest_match_asm7fff(s,cur_match); | ||||||
|  |     return longest_match_c(s,cur_match); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | uInt longest_match_c(s, cur_match) | ||||||
|  |     deflate_state *s; | ||||||
|  |     IPos cur_match;                             /* current match */ | ||||||
|  | { | ||||||
|  |     unsigned chain_length = s->max_chain_length;/* max hash chain length */ | ||||||
|  |     register Bytef *scan = s->window + s->strstart; /* current string */ | ||||||
|  |     register Bytef *match;                       /* matched string */ | ||||||
|  |     register int len;                           /* length of current match */ | ||||||
|  |     int best_len = s->prev_length;              /* best match length so far */ | ||||||
|  |     int nice_match = s->nice_match;             /* stop if match long enough */ | ||||||
|  |     IPos limit = s->strstart > (IPos)MAX_DIST(s) ? | ||||||
|  |         s->strstart - (IPos)MAX_DIST(s) : NIL; | ||||||
|  |     /* Stop when cur_match becomes <= limit. To simplify the code, | ||||||
|  |      * we prevent matches with the string of window index 0. | ||||||
|  |      */ | ||||||
|  |     Posf *prev = s->prev; | ||||||
|  |     uInt wmask = s->w_mask; | ||||||
|  |  | ||||||
|  | #ifdef UNALIGNED_OK | ||||||
|  |     /* Compare two bytes at a time. Note: this is not always beneficial. | ||||||
|  |      * Try with and without -DUNALIGNED_OK to check. | ||||||
|  |      */ | ||||||
|  |     register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; | ||||||
|  |     register ush scan_start = *(ushf*)scan; | ||||||
|  |     register ush scan_end   = *(ushf*)(scan+best_len-1); | ||||||
|  | #else | ||||||
|  |     register Bytef *strend = s->window + s->strstart + MAX_MATCH; | ||||||
|  |     register Byte scan_end1  = scan[best_len-1]; | ||||||
|  |     register Byte scan_end   = scan[best_len]; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. | ||||||
|  |      * It is easy to get rid of this optimization if necessary. | ||||||
|  |      */ | ||||||
|  |     Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); | ||||||
|  |  | ||||||
|  |     /* Do not waste too much time if we already have a good match: */ | ||||||
|  |     if (s->prev_length >= s->good_match) { | ||||||
|  |         chain_length >>= 2; | ||||||
|  |     } | ||||||
|  |     /* Do not look for matches beyond the end of the input. This is necessary | ||||||
|  |      * to make deflate deterministic. | ||||||
|  |      */ | ||||||
|  |     if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||||||
|  |  | ||||||
|  |     Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); | ||||||
|  |  | ||||||
|  |     do { | ||||||
|  |         Assert(cur_match < s->strstart, "no future"); | ||||||
|  |         match = s->window + cur_match; | ||||||
|  |  | ||||||
|  |         /* Skip to next match if the match length cannot increase | ||||||
|  |          * or if the match length is less than 2: | ||||||
|  |          */ | ||||||
|  | #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) | ||||||
|  |         /* This code assumes sizeof(unsigned short) == 2. Do not use | ||||||
|  |          * UNALIGNED_OK if your compiler uses a different size. | ||||||
|  |          */ | ||||||
|  |         if (*(ushf*)(match+best_len-1) != scan_end || | ||||||
|  |             *(ushf*)match != scan_start) continue; | ||||||
|  |  | ||||||
|  |         /* It is not necessary to compare scan[2] and match[2] since they are | ||||||
|  |          * always equal when the other bytes match, given that the hash keys | ||||||
|  |          * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at | ||||||
|  |          * strstart+3, +5, ... up to strstart+257. We check for insufficient | ||||||
|  |          * lookahead only every 4th comparison; the 128th check will be made | ||||||
|  |          * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is | ||||||
|  |          * necessary to put more guard bytes at the end of the window, or | ||||||
|  |          * to check more often for insufficient lookahead. | ||||||
|  |          */ | ||||||
|  |         Assert(scan[2] == match[2], "scan[2]?"); | ||||||
|  |         scan++, match++; | ||||||
|  |         do { | ||||||
|  |         } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && | ||||||
|  |                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) && | ||||||
|  |                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) && | ||||||
|  |                  *(ushf*)(scan+=2) == *(ushf*)(match+=2) && | ||||||
|  |                  scan < strend); | ||||||
|  |         /* The funny "do {}" generates better code on most compilers */ | ||||||
|  |  | ||||||
|  |         /* Here, scan <= window+strstart+257 */ | ||||||
|  |         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||||||
|  |         if (*scan == *match) scan++; | ||||||
|  |  | ||||||
|  |         len = (MAX_MATCH - 1) - (int)(strend-scan); | ||||||
|  |         scan = strend - (MAX_MATCH-1); | ||||||
|  |  | ||||||
|  | #else /* UNALIGNED_OK */ | ||||||
|  |  | ||||||
|  |         if (match[best_len]   != scan_end  || | ||||||
|  |             match[best_len-1] != scan_end1 || | ||||||
|  |             *match            != *scan     || | ||||||
|  |             *++match          != scan[1])      continue; | ||||||
|  |  | ||||||
|  |         /* The check at best_len-1 can be removed because it will be made | ||||||
|  |          * again later. (This heuristic is not always a win.) | ||||||
|  |          * It is not necessary to compare scan[2] and match[2] since they | ||||||
|  |          * are always equal when the other bytes match, given that | ||||||
|  |          * the hash keys are equal and that HASH_BITS >= 8. | ||||||
|  |          */ | ||||||
|  |         scan += 2, match++; | ||||||
|  |         Assert(*scan == *match, "match[2]?"); | ||||||
|  |  | ||||||
|  |         /* We check for insufficient lookahead only every 8th comparison; | ||||||
|  |          * the 256th check will be made at strstart+258. | ||||||
|  |          */ | ||||||
|  |         do { | ||||||
|  |         } while (*++scan == *++match && *++scan == *++match && | ||||||
|  |                  *++scan == *++match && *++scan == *++match && | ||||||
|  |                  *++scan == *++match && *++scan == *++match && | ||||||
|  |                  *++scan == *++match && *++scan == *++match && | ||||||
|  |                  scan < strend); | ||||||
|  |  | ||||||
|  |         Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); | ||||||
|  |  | ||||||
|  |         len = MAX_MATCH - (int)(strend - scan); | ||||||
|  |         scan = strend - MAX_MATCH; | ||||||
|  |  | ||||||
|  | #endif /* UNALIGNED_OK */ | ||||||
|  |  | ||||||
|  |         if (len > best_len) { | ||||||
|  |             s->match_start = cur_match; | ||||||
|  |             best_len = len; | ||||||
|  |             if (len >= nice_match) break; | ||||||
|  | #ifdef UNALIGNED_OK | ||||||
|  |             scan_end = *(ushf*)(scan+best_len-1); | ||||||
|  | #else | ||||||
|  |             scan_end1  = scan[best_len-1]; | ||||||
|  |             scan_end   = scan[best_len]; | ||||||
|  | #endif | ||||||
|  |         } | ||||||
|  |     } while ((cur_match = prev[cur_match & wmask]) > limit | ||||||
|  |              && --chain_length != 0); | ||||||
|  |  | ||||||
|  |     if ((uInt)best_len <= s->lookahead) return best_len; | ||||||
|  |     return s->lookahead; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* ASMV */ | ||||||
							
								
								
									
										1
									
								
								contrib/asm386/mkgvmt32.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								contrib/asm386/mkgvmt32.bat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm | ||||||
							
								
								
									
										781
									
								
								contrib/asm386/zlibvc.mak
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										781
									
								
								contrib/asm386/zlibvc.mak
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,781 @@ | |||||||
|  | # Microsoft Developer Studio Generated NMAKE File, Format Version 4.20 | ||||||
|  | # ** DO NOT EDIT ** | ||||||
|  |  | ||||||
|  | # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 | ||||||
|  |  | ||||||
|  | !IF "$(CFG)" == "" | ||||||
|  | CFG=zlibvc - Win32 Debug | ||||||
|  | !MESSAGE No configuration specified.  Defaulting to zlibvc - Win32 Debug. | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | !IF "$(CFG)" != "zlibvc - Win32 Release" && "$(CFG)" != "zlibvc - Win32 Debug" | ||||||
|  | !MESSAGE Invalid configuration "$(CFG)" specified. | ||||||
|  | !MESSAGE You can specify a configuration when running NMAKE on this makefile | ||||||
|  | !MESSAGE by defining the macro CFG on the command line.  For example: | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Debug" | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE Possible choices for configuration are: | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") | ||||||
|  | !MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") | ||||||
|  | !MESSAGE  | ||||||
|  | !ERROR An invalid configuration is specified. | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | !IF "$(OS)" == "Windows_NT" | ||||||
|  | NULL= | ||||||
|  | !ELSE  | ||||||
|  | NULL=nul | ||||||
|  | !ENDIF  | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Project | ||||||
|  | # PROP Target_Last_Scanned "zlibvc - Win32 Debug" | ||||||
|  | CPP=cl.exe | ||||||
|  | RSC=rc.exe | ||||||
|  | MTL=mktyplib.exe | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 0 | ||||||
|  | # PROP BASE Output_Dir "Release" | ||||||
|  | # PROP BASE Intermediate_Dir "Release" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 0 | ||||||
|  | # PROP Output_Dir "Release" | ||||||
|  | # PROP Intermediate_Dir "Release" | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | OUTDIR=.\Release | ||||||
|  | INTDIR=.\Release | ||||||
|  |  | ||||||
|  | ALL : "$(OUTDIR)\zlib.dll" "$(OUTDIR)\zlibvc.bsc" | ||||||
|  |  | ||||||
|  | CLEAN :  | ||||||
|  | 	-@erase "$(INTDIR)\adler32.obj" | ||||||
|  | 	-@erase "$(INTDIR)\adler32.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\compress.obj" | ||||||
|  | 	-@erase "$(INTDIR)\compress.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\crc32.obj" | ||||||
|  | 	-@erase "$(INTDIR)\crc32.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\deflate.obj" | ||||||
|  | 	-@erase "$(INTDIR)\deflate.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\gvmat32c.obj" | ||||||
|  | 	-@erase "$(INTDIR)\gvmat32c.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\gzio.obj" | ||||||
|  | 	-@erase "$(INTDIR)\gzio.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\infblock.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infblock.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\infcodes.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infcodes.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\inffast.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inffast.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\inflate.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inflate.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\inftrees.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inftrees.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\infutil.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infutil.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\trees.obj" | ||||||
|  | 	-@erase "$(INTDIR)\trees.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\uncompr.obj" | ||||||
|  | 	-@erase "$(INTDIR)\uncompr.sbr" | ||||||
|  | 	-@erase "$(INTDIR)\zlib.res" | ||||||
|  | 	-@erase "$(INTDIR)\zutil.obj" | ||||||
|  | 	-@erase "$(INTDIR)\zutil.sbr" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.dll" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.exp" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.lib" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.map" | ||||||
|  | 	-@erase "$(OUTDIR)\zlibvc.bsc" | ||||||
|  |  | ||||||
|  | "$(OUTDIR)" : | ||||||
|  |     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||||
|  |  | ||||||
|  | # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c | ||||||
|  | # ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D fdopen=_fdopen /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "ASMV" /FR /YX /c | ||||||
|  | CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "NDEBUG" /D fdopen=_fdopen /D "WIN32" /D\ | ||||||
|  |  "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "ASMV"\ | ||||||
|  |  /FR"$(INTDIR)/" /Fp"$(INTDIR)/zlibvc.pch" /YX /Fo"$(INTDIR)/" /c  | ||||||
|  | CPP_OBJS=.\Release/ | ||||||
|  | CPP_SBRS=.\Release/ | ||||||
|  | # ADD BASE MTL /nologo /D "NDEBUG" /win32 | ||||||
|  | # ADD MTL /nologo /D "NDEBUG" /win32 | ||||||
|  | MTL_PROJ=/nologo /D "NDEBUG" /win32  | ||||||
|  | # ADD BASE RSC /l 0x40c /d "NDEBUG" | ||||||
|  | # ADD RSC /l 0x40c /d "NDEBUG" | ||||||
|  | RSC_PROJ=/l 0x40c /fo"$(INTDIR)/zlib.res" /d "NDEBUG"  | ||||||
|  | BSC32=bscmake.exe | ||||||
|  | # ADD BASE BSC32 /nologo | ||||||
|  | # ADD BSC32 /nologo | ||||||
|  | BSC32_FLAGS=/nologo /o"$(OUTDIR)/zlibvc.bsc"  | ||||||
|  | BSC32_SBRS= \ | ||||||
|  | 	"$(INTDIR)\adler32.sbr" \ | ||||||
|  | 	"$(INTDIR)\compress.sbr" \ | ||||||
|  | 	"$(INTDIR)\crc32.sbr" \ | ||||||
|  | 	"$(INTDIR)\deflate.sbr" \ | ||||||
|  | 	"$(INTDIR)\gvmat32c.sbr" \ | ||||||
|  | 	"$(INTDIR)\gzio.sbr" \ | ||||||
|  | 	"$(INTDIR)\infblock.sbr" \ | ||||||
|  | 	"$(INTDIR)\infcodes.sbr" \ | ||||||
|  | 	"$(INTDIR)\inffast.sbr" \ | ||||||
|  | 	"$(INTDIR)\inflate.sbr" \ | ||||||
|  | 	"$(INTDIR)\inftrees.sbr" \ | ||||||
|  | 	"$(INTDIR)\infutil.sbr" \ | ||||||
|  | 	"$(INTDIR)\trees.sbr" \ | ||||||
|  | 	"$(INTDIR)\uncompr.sbr" \ | ||||||
|  | 	"$(INTDIR)\zutil.sbr" | ||||||
|  |  | ||||||
|  | "$(OUTDIR)\zlibvc.bsc" : "$(OUTDIR)" $(BSC32_SBRS) | ||||||
|  |     $(BSC32) @<< | ||||||
|  |   $(BSC32_FLAGS) $(BSC32_SBRS) | ||||||
|  | << | ||||||
|  |  | ||||||
|  | LINK32=link.exe | ||||||
|  | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 | ||||||
|  | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:"Release/zlib.dll" | ||||||
|  | LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ | ||||||
|  |  advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo\ | ||||||
|  |  /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)/zlib.pdb"\ | ||||||
|  |  /map:"$(INTDIR)/zlib.map" /machine:I386 /nodefaultlib /def:".\zlib.def"\ | ||||||
|  |  /out:"$(OUTDIR)/zlib.dll" /implib:"$(OUTDIR)/zlib.lib"  | ||||||
|  | DEF_FILE= \ | ||||||
|  | 	".\zlib.def" | ||||||
|  | LINK32_OBJS= \ | ||||||
|  | 	"$(INTDIR)\adler32.obj" \ | ||||||
|  | 	"$(INTDIR)\compress.obj" \ | ||||||
|  | 	"$(INTDIR)\crc32.obj" \ | ||||||
|  | 	"$(INTDIR)\deflate.obj" \ | ||||||
|  | 	"$(INTDIR)\gvmat32c.obj" \ | ||||||
|  | 	"$(INTDIR)\gzio.obj" \ | ||||||
|  | 	"$(INTDIR)\infblock.obj" \ | ||||||
|  | 	"$(INTDIR)\infcodes.obj" \ | ||||||
|  | 	"$(INTDIR)\inffast.obj" \ | ||||||
|  | 	"$(INTDIR)\inflate.obj" \ | ||||||
|  | 	"$(INTDIR)\inftrees.obj" \ | ||||||
|  | 	"$(INTDIR)\infutil.obj" \ | ||||||
|  | 	"$(INTDIR)\trees.obj" \ | ||||||
|  | 	"$(INTDIR)\uncompr.obj" \ | ||||||
|  | 	"$(INTDIR)\zlib.res" \ | ||||||
|  | 	"$(INTDIR)\zutil.obj" \ | ||||||
|  | 	".\GVMAT32.obj" | ||||||
|  |  | ||||||
|  | "$(OUTDIR)\zlib.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||||
|  |     $(LINK32) @<< | ||||||
|  |   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||||
|  | << | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 1 | ||||||
|  | # PROP BASE Output_Dir "Debug" | ||||||
|  | # PROP BASE Intermediate_Dir "Debug" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 1 | ||||||
|  | # PROP Output_Dir "Debug" | ||||||
|  | # PROP Intermediate_Dir "Debug" | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | OUTDIR=.\Debug | ||||||
|  | INTDIR=.\Debug | ||||||
|  |  | ||||||
|  | ALL : "$(OUTDIR)\zlib.dll" | ||||||
|  |  | ||||||
|  | CLEAN :  | ||||||
|  | 	-@erase "$(INTDIR)\adler32.obj" | ||||||
|  | 	-@erase "$(INTDIR)\compress.obj" | ||||||
|  | 	-@erase "$(INTDIR)\crc32.obj" | ||||||
|  | 	-@erase "$(INTDIR)\deflate.obj" | ||||||
|  | 	-@erase "$(INTDIR)\gvmat32c.obj" | ||||||
|  | 	-@erase "$(INTDIR)\gzio.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infblock.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infcodes.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inffast.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inflate.obj" | ||||||
|  | 	-@erase "$(INTDIR)\inftrees.obj" | ||||||
|  | 	-@erase "$(INTDIR)\infutil.obj" | ||||||
|  | 	-@erase "$(INTDIR)\trees.obj" | ||||||
|  | 	-@erase "$(INTDIR)\uncompr.obj" | ||||||
|  | 	-@erase "$(INTDIR)\vc40.idb" | ||||||
|  | 	-@erase "$(INTDIR)\vc40.pdb" | ||||||
|  | 	-@erase "$(INTDIR)\zlib.res" | ||||||
|  | 	-@erase "$(INTDIR)\zutil.obj" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.dll" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.exp" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.ilk" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.lib" | ||||||
|  | 	-@erase "$(OUTDIR)\zlib.pdb" | ||||||
|  |  | ||||||
|  | "$(OUTDIR)" : | ||||||
|  |     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" | ||||||
|  |  | ||||||
|  | # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c | ||||||
|  | # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /YX /c | ||||||
|  | CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ | ||||||
|  |  /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL"\ | ||||||
|  |  /Fp"$(INTDIR)/zlibvc.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c  | ||||||
|  | CPP_OBJS=.\Debug/ | ||||||
|  | CPP_SBRS=.\. | ||||||
|  | # ADD BASE MTL /nologo /D "_DEBUG" /win32 | ||||||
|  | # ADD MTL /nologo /D "_DEBUG" /win32 | ||||||
|  | MTL_PROJ=/nologo /D "_DEBUG" /win32  | ||||||
|  | # ADD BASE RSC /l 0x40c /d "_DEBUG" | ||||||
|  | # ADD RSC /l 0x40c /d "_DEBUG" | ||||||
|  | RSC_PROJ=/l 0x40c /fo"$(INTDIR)/zlib.res" /d "_DEBUG"  | ||||||
|  | BSC32=bscmake.exe | ||||||
|  | # ADD BASE BSC32 /nologo | ||||||
|  | # ADD BSC32 /nologo | ||||||
|  | BSC32_FLAGS=/nologo /o"$(OUTDIR)/zlibvc.bsc"  | ||||||
|  | BSC32_SBRS= \ | ||||||
|  | 	 | ||||||
|  | LINK32=link.exe | ||||||
|  | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 | ||||||
|  | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/zlib.dll" | ||||||
|  | LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\ | ||||||
|  |  advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo\ | ||||||
|  |  /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)/zlib.pdb" /debug\ | ||||||
|  |  /machine:I386 /def:".\zlib.def" /out:"$(OUTDIR)/zlib.dll"\ | ||||||
|  |  /implib:"$(OUTDIR)/zlib.lib"  | ||||||
|  | DEF_FILE= \ | ||||||
|  | 	".\zlib.def" | ||||||
|  | LINK32_OBJS= \ | ||||||
|  | 	"$(INTDIR)\adler32.obj" \ | ||||||
|  | 	"$(INTDIR)\compress.obj" \ | ||||||
|  | 	"$(INTDIR)\crc32.obj" \ | ||||||
|  | 	"$(INTDIR)\deflate.obj" \ | ||||||
|  | 	"$(INTDIR)\gvmat32c.obj" \ | ||||||
|  | 	"$(INTDIR)\gzio.obj" \ | ||||||
|  | 	"$(INTDIR)\infblock.obj" \ | ||||||
|  | 	"$(INTDIR)\infcodes.obj" \ | ||||||
|  | 	"$(INTDIR)\inffast.obj" \ | ||||||
|  | 	"$(INTDIR)\inflate.obj" \ | ||||||
|  | 	"$(INTDIR)\inftrees.obj" \ | ||||||
|  | 	"$(INTDIR)\infutil.obj" \ | ||||||
|  | 	"$(INTDIR)\trees.obj" \ | ||||||
|  | 	"$(INTDIR)\uncompr.obj" \ | ||||||
|  | 	"$(INTDIR)\zlib.res" \ | ||||||
|  | 	"$(INTDIR)\zutil.obj" \ | ||||||
|  | 	".\GVMAT32.obj" | ||||||
|  |  | ||||||
|  | "$(OUTDIR)\zlib.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) | ||||||
|  |     $(LINK32) @<< | ||||||
|  |   $(LINK32_FLAGS) $(LINK32_OBJS) | ||||||
|  | << | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | .c{$(CPP_OBJS)}.obj: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | .cpp{$(CPP_OBJS)}.obj: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | .cxx{$(CPP_OBJS)}.obj: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | .c{$(CPP_SBRS)}.sbr: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | .cpp{$(CPP_SBRS)}.sbr: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | .cxx{$(CPP_SBRS)}.sbr: | ||||||
|  |    $(CPP) $(CPP_PROJ) $<   | ||||||
|  |  | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Target | ||||||
|  |  | ||||||
|  | # Name "zlibvc - Win32 Release" | ||||||
|  | # Name "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\adler32.c | ||||||
|  | DEP_CPP_ADLER=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\adler32.obj" : $(SOURCE) $(DEP_CPP_ADLER) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\adler32.sbr" : $(SOURCE) $(DEP_CPP_ADLER) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\adler32.obj" : $(SOURCE) $(DEP_CPP_ADLER) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\compress.c | ||||||
|  | DEP_CPP_COMPR=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\compress.obj" : $(SOURCE) $(DEP_CPP_COMPR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\compress.sbr" : $(SOURCE) $(DEP_CPP_COMPR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\compress.obj" : $(SOURCE) $(DEP_CPP_COMPR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\crc32.c | ||||||
|  | DEP_CPP_CRC32=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\crc32.obj" : $(SOURCE) $(DEP_CPP_CRC32) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\crc32.sbr" : $(SOURCE) $(DEP_CPP_CRC32) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\crc32.obj" : $(SOURCE) $(DEP_CPP_CRC32) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\deflate.c | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | DEP_CPP_DEFLA=\ | ||||||
|  | 	".\deflate.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\deflate.obj" : $(SOURCE) $(DEP_CPP_DEFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\deflate.sbr" : $(SOURCE) $(DEP_CPP_DEFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | DEP_CPP_DEFLA=\ | ||||||
|  | 	".\deflate.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  | NODEP_CPP_DEFLA=\ | ||||||
|  | 	".\local"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\deflate.obj" : $(SOURCE) $(DEP_CPP_DEFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\gzio.c | ||||||
|  | DEP_CPP_GZIO_=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gzio.obj" : $(SOURCE) $(DEP_CPP_GZIO_) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gzio.sbr" : $(SOURCE) $(DEP_CPP_GZIO_) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gzio.obj" : $(SOURCE) $(DEP_CPP_GZIO_) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\infblock.c | ||||||
|  | DEP_CPP_INFBL=\ | ||||||
|  | 	".\infblock.h"\ | ||||||
|  | 	".\infcodes.h"\ | ||||||
|  | 	".\inftrees.h"\ | ||||||
|  | 	".\infutil.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infblock.obj" : $(SOURCE) $(DEP_CPP_INFBL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infblock.sbr" : $(SOURCE) $(DEP_CPP_INFBL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infblock.obj" : $(SOURCE) $(DEP_CPP_INFBL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\infcodes.c | ||||||
|  | DEP_CPP_INFCO=\ | ||||||
|  | 	".\infblock.h"\ | ||||||
|  | 	".\infcodes.h"\ | ||||||
|  | 	".\inffast.h"\ | ||||||
|  | 	".\inftrees.h"\ | ||||||
|  | 	".\infutil.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infcodes.obj" : $(SOURCE) $(DEP_CPP_INFCO) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infcodes.sbr" : $(SOURCE) $(DEP_CPP_INFCO) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infcodes.obj" : $(SOURCE) $(DEP_CPP_INFCO) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\inffast.c | ||||||
|  | DEP_CPP_INFFA=\ | ||||||
|  | 	".\infblock.h"\ | ||||||
|  | 	".\infcodes.h"\ | ||||||
|  | 	".\inffast.h"\ | ||||||
|  | 	".\inftrees.h"\ | ||||||
|  | 	".\infutil.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inffast.obj" : $(SOURCE) $(DEP_CPP_INFFA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inffast.sbr" : $(SOURCE) $(DEP_CPP_INFFA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inffast.obj" : $(SOURCE) $(DEP_CPP_INFFA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\inflate.c | ||||||
|  | DEP_CPP_INFLA=\ | ||||||
|  | 	".\infblock.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inflate.obj" : $(SOURCE) $(DEP_CPP_INFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inflate.sbr" : $(SOURCE) $(DEP_CPP_INFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inflate.obj" : $(SOURCE) $(DEP_CPP_INFLA) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\inftrees.c | ||||||
|  | DEP_CPP_INFTR=\ | ||||||
|  | 	".\inftrees.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inftrees.obj" : $(SOURCE) $(DEP_CPP_INFTR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inftrees.sbr" : $(SOURCE) $(DEP_CPP_INFTR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\inftrees.obj" : $(SOURCE) $(DEP_CPP_INFTR) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\infutil.c | ||||||
|  | DEP_CPP_INFUT=\ | ||||||
|  | 	".\infblock.h"\ | ||||||
|  | 	".\infcodes.h"\ | ||||||
|  | 	".\inftrees.h"\ | ||||||
|  | 	".\infutil.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infutil.obj" : $(SOURCE) $(DEP_CPP_INFUT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infutil.sbr" : $(SOURCE) $(DEP_CPP_INFUT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\infutil.obj" : $(SOURCE) $(DEP_CPP_INFUT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\trees.c | ||||||
|  | DEP_CPP_TREES=\ | ||||||
|  | 	".\deflate.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\trees.obj" : $(SOURCE) $(DEP_CPP_TREES) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\trees.sbr" : $(SOURCE) $(DEP_CPP_TREES) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\trees.obj" : $(SOURCE) $(DEP_CPP_TREES) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\uncompr.c | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | DEP_CPP_UNCOM=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\uncompr.obj" : $(SOURCE) $(DEP_CPP_UNCOM) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\uncompr.sbr" : $(SOURCE) $(DEP_CPP_UNCOM) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | DEP_CPP_UNCOM=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	 | ||||||
|  | NODEP_CPP_UNCOM=\ | ||||||
|  | 	".\uncompress"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\uncompr.obj" : $(SOURCE) $(DEP_CPP_UNCOM) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\zutil.c | ||||||
|  | DEP_CPP_ZUTIL=\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\zutil.obj" : $(SOURCE) $(DEP_CPP_ZUTIL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\zutil.sbr" : $(SOURCE) $(DEP_CPP_ZUTIL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | "$(INTDIR)\zutil.obj" : $(SOURCE) $(DEP_CPP_ZUTIL) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\zlib.rc | ||||||
|  |  | ||||||
|  | "$(INTDIR)\zlib.res" : $(SOURCE) "$(INTDIR)" | ||||||
|  |    $(RSC) $(RSC_PROJ) $(SOURCE) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\zlib.def | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\GVMAT32.obj | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | ################################################################################ | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\gvmat32c.c | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "zlibvc - Win32 Release" | ||||||
|  |  | ||||||
|  | DEP_CPP_GVMAT=\ | ||||||
|  | 	".\deflate.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gvmat32c.obj" : $(SOURCE) $(DEP_CPP_GVMAT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gvmat32c.sbr" : $(SOURCE) $(DEP_CPP_GVMAT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug" | ||||||
|  |  | ||||||
|  | DEP_CPP_GVMAT=\ | ||||||
|  | 	".\deflate.h"\ | ||||||
|  | 	".\zconf.h"\ | ||||||
|  | 	".\zlib.h"\ | ||||||
|  | 	".\zutil.h"\ | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | "$(INTDIR)\gvmat32c.obj" : $(SOURCE) $(DEP_CPP_GVMAT) "$(INTDIR)" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # End Source File | ||||||
|  | # End Target | ||||||
|  | # End Project | ||||||
|  | ################################################################################ | ||||||
							
								
								
									
										24
									
								
								contrib/iostream/test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								contrib/iostream/test.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  |  | ||||||
|  | #include "zfstream.h" | ||||||
|  |  | ||||||
|  | int main() { | ||||||
|  |  | ||||||
|  |   // Construct a stream object with this filebuffer.  Anything sent | ||||||
|  |   // to this stream will go to standard out. | ||||||
|  |   gzofstream os( 1, ios::out ); | ||||||
|  |  | ||||||
|  |   // This text is getting compressed and sent to stdout. | ||||||
|  |   // To prove this, run 'test | zcat'. | ||||||
|  |   os << "Hello, Mommy" << endl; | ||||||
|  |  | ||||||
|  |   os << setcompressionlevel( Z_NO_COMPRESSION ); | ||||||
|  |   os << "hello, hello, hi, ho!" << endl; | ||||||
|  |  | ||||||
|  |   setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) | ||||||
|  |     << "I'm compressing again" << endl; | ||||||
|  |  | ||||||
|  |   os.close(); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										329
									
								
								contrib/iostream/zfstream.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								contrib/iostream/zfstream.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,329 @@ | |||||||
|  |  | ||||||
|  | #include <memory.h> | ||||||
|  | #include "zfstream.h" | ||||||
|  |  | ||||||
|  | gzfilebuf::gzfilebuf() : | ||||||
|  |   file(NULL), | ||||||
|  |   mode(0), | ||||||
|  |   own_file_descriptor(0) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  | gzfilebuf::~gzfilebuf() { | ||||||
|  |  | ||||||
|  |   sync(); | ||||||
|  |   if ( own_file_descriptor ) | ||||||
|  |     close(); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzfilebuf *gzfilebuf::open( const char *name, | ||||||
|  | 			    int io_mode ) { | ||||||
|  |  | ||||||
|  |   if ( is_open() ) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   char char_mode[10]; | ||||||
|  |   char *p; | ||||||
|  |   memset(char_mode,'\0',10); | ||||||
|  |   p = char_mode; | ||||||
|  |  | ||||||
|  |   if ( io_mode & ios::in ) { | ||||||
|  |     mode = ios::in; | ||||||
|  |     *p++ = 'r'; | ||||||
|  |   } else if ( io_mode & ios::app ) { | ||||||
|  |     mode = ios::app; | ||||||
|  |     *p++ = 'a'; | ||||||
|  |   } else { | ||||||
|  |     mode = ios::out; | ||||||
|  |     *p++ = 'w'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( io_mode & ios::binary ) { | ||||||
|  |     mode |= ios::binary; | ||||||
|  |     *p++ = 'b'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Hard code the compression level | ||||||
|  |   if ( io_mode & (ios::out|ios::app )) { | ||||||
|  |     *p++ = '9'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( (file = gzopen(name, char_mode)) == NULL ) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   own_file_descriptor = 1; | ||||||
|  |  | ||||||
|  |   return this; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzfilebuf *gzfilebuf::attach( int file_descriptor, | ||||||
|  | 			      int io_mode ) { | ||||||
|  |  | ||||||
|  |   if ( is_open() ) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   char char_mode[10]; | ||||||
|  |   char *p; | ||||||
|  |   memset(char_mode,'\0',10); | ||||||
|  |   p = char_mode; | ||||||
|  |  | ||||||
|  |   if ( io_mode & ios::in ) { | ||||||
|  |     mode = ios::in; | ||||||
|  |     *p++ = 'r'; | ||||||
|  |   } else if ( io_mode & ios::app ) { | ||||||
|  |     mode = ios::app; | ||||||
|  |     *p++ = 'a'; | ||||||
|  |   } else { | ||||||
|  |     mode = ios::out; | ||||||
|  |     *p++ = 'w'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( io_mode & ios::binary ) { | ||||||
|  |     mode |= ios::binary; | ||||||
|  |     *p++ = 'b'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Hard code the compression level | ||||||
|  |   if ( io_mode & (ios::out|ios::app )) { | ||||||
|  |     *p++ = '9'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   own_file_descriptor = 0; | ||||||
|  |  | ||||||
|  |   return this; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzfilebuf *gzfilebuf::close() { | ||||||
|  |  | ||||||
|  |   if ( is_open() ) { | ||||||
|  |  | ||||||
|  |     sync(); | ||||||
|  |     gzclose( file ); | ||||||
|  |     file = NULL; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return this; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::setcompressionlevel( short comp_level ) { | ||||||
|  |  | ||||||
|  |   return gzsetparams(file, comp_level, -2); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::setcompressionstrategy( short comp_strategy ) { | ||||||
|  |  | ||||||
|  |   return gzsetparams(file, -2, comp_strategy); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { | ||||||
|  |  | ||||||
|  |   return streampos(EOF); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::underflow() { | ||||||
|  |  | ||||||
|  |   // If the file hasn't been opened for reading, error. | ||||||
|  |   if ( !is_open() || !(mode & ios::in) ) | ||||||
|  |     return EOF; | ||||||
|  |  | ||||||
|  |   // if a buffer doesn't exists, allocate one. | ||||||
|  |   if ( !base() ) { | ||||||
|  |  | ||||||
|  |     if ( (allocate()) == EOF ) | ||||||
|  |       return EOF; | ||||||
|  |     setp(0,0); | ||||||
|  |  | ||||||
|  |   } else { | ||||||
|  |  | ||||||
|  |     if ( in_avail() ) | ||||||
|  |       return (unsigned char) *gptr(); | ||||||
|  |  | ||||||
|  |     if ( out_waiting() ) { | ||||||
|  |       if ( flushbuf() == EOF ) | ||||||
|  | 	return EOF; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Attempt to fill the buffer. | ||||||
|  |  | ||||||
|  |   int result = fillbuf(); | ||||||
|  |   if ( result == EOF ) { | ||||||
|  |     // disable get area | ||||||
|  |     setg(0,0,0); | ||||||
|  |     return EOF; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return (unsigned char) *gptr(); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::overflow( int c ) { | ||||||
|  |  | ||||||
|  |   if ( !is_open() || !(mode & ios::out) ) | ||||||
|  |     return EOF; | ||||||
|  |  | ||||||
|  |   if ( !base() ) { | ||||||
|  |     if ( allocate() == EOF ) | ||||||
|  |       return EOF; | ||||||
|  |     setg(0,0,0); | ||||||
|  |   } else { | ||||||
|  |     if (in_avail()) { | ||||||
|  | 	return EOF; | ||||||
|  |     } | ||||||
|  |     if (out_waiting()) { | ||||||
|  |       if (flushbuf() == EOF) | ||||||
|  | 	return EOF; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   int bl = blen(); | ||||||
|  |   setp( base(), base() + bl); | ||||||
|  |  | ||||||
|  |   if ( c != EOF ) { | ||||||
|  |  | ||||||
|  |     *pptr() = c; | ||||||
|  |     pbump(1); | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::sync() { | ||||||
|  |  | ||||||
|  |   if ( !is_open() ) | ||||||
|  |     return EOF; | ||||||
|  |  | ||||||
|  |   if ( out_waiting() ) | ||||||
|  |     return flushbuf(); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::flushbuf() { | ||||||
|  |  | ||||||
|  |   int n; | ||||||
|  |   char *q; | ||||||
|  |  | ||||||
|  |   q = pbase(); | ||||||
|  |   n = pptr() - q; | ||||||
|  |  | ||||||
|  |   if ( gzwrite( file, q, n) < n ) | ||||||
|  |     return EOF; | ||||||
|  |  | ||||||
|  |   setp(0,0); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int gzfilebuf::fillbuf() { | ||||||
|  |  | ||||||
|  |   int required; | ||||||
|  |   char *p; | ||||||
|  |  | ||||||
|  |   p = base(); | ||||||
|  |  | ||||||
|  |   required = blen(); | ||||||
|  |  | ||||||
|  |   int t = gzread( file, p, required ); | ||||||
|  |  | ||||||
|  |   if ( t <= 0) return EOF; | ||||||
|  |  | ||||||
|  |   setg( base(), base(), base()+t); | ||||||
|  |  | ||||||
|  |   return t; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzfilestream_common::gzfilestream_common() : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { } | ||||||
|  |  | ||||||
|  | gzfilestream_common::~gzfilestream_common() | ||||||
|  | { } | ||||||
|  |  | ||||||
|  | void gzfilestream_common::attach( int fd, int io_mode ) { | ||||||
|  |  | ||||||
|  |   if ( !buffer.attach( fd, io_mode) ) | ||||||
|  |     clear( ios::failbit | ios::badbit ); | ||||||
|  |   else | ||||||
|  |     clear(); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void gzfilestream_common::open( const char *name, int io_mode ) { | ||||||
|  |  | ||||||
|  |   if ( !buffer.open( name, io_mode ) ) | ||||||
|  |     clear( ios::failbit | ios::badbit ); | ||||||
|  |   else | ||||||
|  |     clear(); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void gzfilestream_common::close() { | ||||||
|  |  | ||||||
|  |   if ( !buffer.close() ) | ||||||
|  |     clear( ios::failbit | ios::badbit ); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzfilebuf *gzfilestream_common::rdbuf() { | ||||||
|  |  | ||||||
|  |   return &buffer; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |       | ||||||
|  | gzifstream::gzifstream() : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   clear( ios::badbit ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzifstream::gzifstream( const char *name, int io_mode ) : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   gzfilestream_common::open( name, io_mode ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzifstream::gzifstream( int fd, int io_mode ) : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   gzfilestream_common::attach( fd, io_mode ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzifstream::~gzifstream() { } | ||||||
|  |  | ||||||
|  | gzofstream::gzofstream() : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   clear( ios::badbit ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzofstream::gzofstream( const char *name, int io_mode ) : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   gzfilestream_common::open( name, io_mode ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzofstream::gzofstream( int fd, int io_mode ) : | ||||||
|  |   ios( gzfilestream_common::rdbuf() ) | ||||||
|  | { | ||||||
|  |   gzfilestream_common::attach( fd, io_mode ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | gzofstream::~gzofstream() { } | ||||||
							
								
								
									
										142
									
								
								contrib/iostream/zfstream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								contrib/iostream/zfstream.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  |  | ||||||
|  | #ifndef _zfstream_h | ||||||
|  | #define _zfstream_h | ||||||
|  |  | ||||||
|  | #include <fstream.h> | ||||||
|  | #include "zlib.h" | ||||||
|  |  | ||||||
|  | class gzfilebuf : public streambuf { | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |  | ||||||
|  |   gzfilebuf( ); | ||||||
|  |   virtual ~gzfilebuf(); | ||||||
|  |  | ||||||
|  |   gzfilebuf *open( const char *name, int io_mode ); | ||||||
|  |   gzfilebuf *attach( int file_descriptor, int io_mode ); | ||||||
|  |   gzfilebuf *close(); | ||||||
|  |  | ||||||
|  |   int setcompressionlevel( short comp_level ); | ||||||
|  |   int setcompressionstrategy( short comp_strategy ); | ||||||
|  |  | ||||||
|  |   inline int is_open() const { return (file !=NULL); } | ||||||
|  |  | ||||||
|  |   virtual streampos seekoff( streamoff, ios::seek_dir, int ); | ||||||
|  |  | ||||||
|  |   virtual int sync(); | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |  | ||||||
|  |   virtual int underflow(); | ||||||
|  |   virtual int overflow( int = EOF ); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |  | ||||||
|  |   gzFile file; | ||||||
|  |   short mode; | ||||||
|  |   short own_file_descriptor; | ||||||
|  |  | ||||||
|  |   int flushbuf(); | ||||||
|  |   int fillbuf(); | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class gzfilestream_common : virtual public ios { | ||||||
|  |  | ||||||
|  |   friend class gzifstream; | ||||||
|  |   friend class gzofstream; | ||||||
|  |   friend gzofstream &setcompressionlevel( gzofstream &, int ); | ||||||
|  |   friend gzofstream &setcompressionstrategy( gzofstream &, int ); | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |   virtual ~gzfilestream_common(); | ||||||
|  |  | ||||||
|  |   void attach( int fd, int io_mode ); | ||||||
|  |   void open( const char *name, int io_mode ); | ||||||
|  |   void close(); | ||||||
|  |  | ||||||
|  | protected: | ||||||
|  |   gzfilestream_common(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |   gzfilebuf *rdbuf(); | ||||||
|  |  | ||||||
|  |   gzfilebuf buffer; | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class gzifstream : public gzfilestream_common, public istream { | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |  | ||||||
|  |   gzifstream(); | ||||||
|  |   gzifstream( const char *name, int io_mode = ios::in ); | ||||||
|  |   gzifstream( int fd, int io_mode = ios::in ); | ||||||
|  |  | ||||||
|  |   virtual ~gzifstream(); | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class gzofstream : public gzfilestream_common, public ostream { | ||||||
|  |  | ||||||
|  | public: | ||||||
|  |  | ||||||
|  |   gzofstream(); | ||||||
|  |   gzofstream( const char *name, int io_mode = ios::out ); | ||||||
|  |   gzofstream( int fd, int io_mode = ios::out ); | ||||||
|  |  | ||||||
|  |   virtual ~gzofstream(); | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template<class T> class gzomanip { | ||||||
|  |   friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &); | ||||||
|  | public: | ||||||
|  |   gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } | ||||||
|  | private: | ||||||
|  |   gzofstream &(*func)(gzofstream &, T); | ||||||
|  |   T val; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template<class T> gzofstream &operator<<(gzofstream &s, | ||||||
|  | 					 const gzomanip<T> &m) { | ||||||
|  |   return (*m.func)(s, m.val); | ||||||
|  |    | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline gzofstream &setcompressionlevel( gzofstream &s, int l ) { | ||||||
|  |   (s.rdbuf())->setcompressionlevel(l); | ||||||
|  |   return s; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) { | ||||||
|  |   (s.rdbuf())->setcompressionstrategy(l); | ||||||
|  |   return s; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline gzomanip<int> setcompressionlevel(int l) | ||||||
|  | { | ||||||
|  |   return gzomanip<int>(&setcompressionlevel,l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline gzomanip<int> setcompressionstrategy(int l) | ||||||
|  | { | ||||||
|  |   return gzomanip<int>(&setcompressionstrategy,l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										307
									
								
								contrib/iostream2/zstream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								contrib/iostream2/zstream.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,307 @@ | |||||||
|  | /* | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 1997 | ||||||
|  |  * Christian Michelsen Research AS | ||||||
|  |  * Advanced Computing | ||||||
|  |  * Fantoftvegen 38, 5036 BERGEN, Norway | ||||||
|  |  * http://www.cmr.no | ||||||
|  |  * | ||||||
|  |  * Permission to use, copy, modify, distribute and sell this software | ||||||
|  |  * and its documentation for any purpose is hereby granted without fee, | ||||||
|  |  * provided that the above copyright notice appear in all copies and | ||||||
|  |  * that both that copyright notice and this permission notice appear | ||||||
|  |  * in supporting documentation.  Christian Michelsen Research AS makes no | ||||||
|  |  * representations about the suitability of this software for any | ||||||
|  |  * purpose.  It is provided "as is" without express or implied warranty. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef ZSTREAM__H | ||||||
|  | #define ZSTREAM__H | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * zstream.h - C++ interface to the 'zlib' general purpose compression library | ||||||
|  |  * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <strstream.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include "zlib.h" | ||||||
|  |  | ||||||
|  | #if defined(_WIN32) | ||||||
|  | #   include <fcntl.h> | ||||||
|  | #   include <io.h> | ||||||
|  | #   define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) | ||||||
|  | #else | ||||||
|  | #   define SET_BINARY_MODE(file) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | class zstringlen { | ||||||
|  | public: | ||||||
|  |     zstringlen(class izstream&); | ||||||
|  |     zstringlen(class ozstream&, const char*); | ||||||
|  |     size_t value() const { return val.word; } | ||||||
|  | private: | ||||||
|  |     struct Val { unsigned char byte; size_t word; } val; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | //  ----------------------------- izstream ----------------------------- | ||||||
|  |  | ||||||
|  | class izstream | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         izstream() : m_fp(0) {} | ||||||
|  |         izstream(FILE* fp) : m_fp(0) { open(fp); } | ||||||
|  |         izstream(const char* name) : m_fp(0) { open(name); } | ||||||
|  |         ~izstream() { close(); } | ||||||
|  |  | ||||||
|  |         /* Opens a gzip (.gz) file for reading. | ||||||
|  |          * open() can be used to read a file which is not in gzip format; | ||||||
|  |          * in this case read() will directly read from the file without | ||||||
|  |          * decompression. errno can be checked to distinguish two error | ||||||
|  |          * cases (if errno is zero, the zlib error is Z_MEM_ERROR). | ||||||
|  |          */ | ||||||
|  |         void open(const char* name) { | ||||||
|  |             if (m_fp) close(); | ||||||
|  |             m_fp = ::gzopen(name, "rb"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         void open(FILE* fp) { | ||||||
|  |             SET_BINARY_MODE(fp); | ||||||
|  |             if (m_fp) close(); | ||||||
|  |             m_fp = ::gzdopen(fileno(fp), "rb"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Flushes all pending input if necessary, closes the compressed file | ||||||
|  |          * and deallocates all the (de)compression state. The return value is | ||||||
|  |          * the zlib error number (see function error() below). | ||||||
|  |          */ | ||||||
|  |         int close() { | ||||||
|  |             int r = ::gzclose(m_fp); | ||||||
|  |             m_fp = 0; return r; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Binary read the given number of bytes from the compressed file. | ||||||
|  |          */ | ||||||
|  |         int read(void* buf, size_t len) { | ||||||
|  |             return ::gzread(m_fp, buf, len); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Returns the error message for the last error which occurred on the | ||||||
|  |          * given compressed file. errnum is set to zlib error number. If an | ||||||
|  |          * error occurred in the file system and not in the compression library, | ||||||
|  |          * errnum is set to Z_ERRNO and the application may consult errno | ||||||
|  |          * to get the exact error code. | ||||||
|  |          */ | ||||||
|  |         const char* error(int* errnum) { | ||||||
|  |             return ::gzerror(m_fp, errnum); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         gzFile fp() { return m_fp; } | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         gzFile m_fp; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Binary read the given (array of) object(s) from the compressed file. | ||||||
|  |  * If the input file was not in gzip format, read() copies the objects number | ||||||
|  |  * of bytes into the buffer. | ||||||
|  |  * returns the number of uncompressed bytes actually read | ||||||
|  |  * (0 for end of file, -1 for error). | ||||||
|  |  */ | ||||||
|  | template <class T, class Items> | ||||||
|  | inline int read(izstream& zs, T* x, Items items) { | ||||||
|  |     return ::gzread(zs.fp(), x, items*sizeof(T)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Binary input with the '>' operator. | ||||||
|  |  */ | ||||||
|  | template <class T> | ||||||
|  | inline izstream& operator>(izstream& zs, T& x) { | ||||||
|  |     ::gzread(zs.fp(), &x, sizeof(T)); | ||||||
|  |     return zs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline zstringlen::zstringlen(izstream& zs) { | ||||||
|  |     zs > val.byte; | ||||||
|  |     if (val.byte == 255) zs > val.word; | ||||||
|  |     else val.word = val.byte; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Read length of string + the string with the '>' operator. | ||||||
|  |  */ | ||||||
|  | inline izstream& operator>(izstream& zs, char* x) { | ||||||
|  |     zstringlen len(zs); | ||||||
|  |     ::gzread(zs.fp(), x, len.value()); | ||||||
|  |     x[len.value()] = '\0'; | ||||||
|  |     return zs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline char* read_string(izstream& zs) { | ||||||
|  |     zstringlen len(zs); | ||||||
|  |     char* x = new char[len.value()+1]; | ||||||
|  |     ::gzread(zs.fp(), x, len.value()); | ||||||
|  |     x[len.value()] = '\0'; | ||||||
|  |     return x; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ----------------------------- ozstream ----------------------------- | ||||||
|  |  | ||||||
|  | class ozstream | ||||||
|  | { | ||||||
|  |     public: | ||||||
|  |         ozstream() : m_fp(0), m_os(0) { | ||||||
|  |         } | ||||||
|  |         ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) | ||||||
|  |             : m_fp(0), m_os(0) { | ||||||
|  |             open(fp, level); | ||||||
|  |         } | ||||||
|  |         ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) | ||||||
|  |             : m_fp(0), m_os(0) { | ||||||
|  |             open(name, level); | ||||||
|  |         } | ||||||
|  |         ~ozstream() { | ||||||
|  |             close(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Opens a gzip (.gz) file for writing. | ||||||
|  |          * The compression level parameter should be in 0..9 | ||||||
|  |          * errno can be checked to distinguish two error cases | ||||||
|  |          * (if errno is zero, the zlib error is Z_MEM_ERROR). | ||||||
|  |          */ | ||||||
|  |         void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { | ||||||
|  |             char mode[4] = "wb\0"; | ||||||
|  |             if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; | ||||||
|  |             if (m_fp) close(); | ||||||
|  |             m_fp = ::gzopen(name, mode); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* open from a FILE pointer. | ||||||
|  |          */ | ||||||
|  |         void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { | ||||||
|  |             SET_BINARY_MODE(fp); | ||||||
|  |             char mode[4] = "wb\0"; | ||||||
|  |             if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; | ||||||
|  |             if (m_fp) close(); | ||||||
|  |             m_fp = ::gzdopen(fileno(fp), mode); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Flushes all pending output if necessary, closes the compressed file | ||||||
|  |          * and deallocates all the (de)compression state. The return value is | ||||||
|  |          * the zlib error number (see function error() below). | ||||||
|  |          */ | ||||||
|  |         int close() { | ||||||
|  |             if (m_os) { | ||||||
|  |                 ::gzwrite(m_fp, m_os->str(), m_os->pcount()); | ||||||
|  |                 delete[] m_os->str(); delete m_os; m_os = 0; | ||||||
|  |             } | ||||||
|  |             int r = ::gzclose(m_fp); m_fp = 0; return r; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Binary write the given number of bytes into the compressed file. | ||||||
|  |          */ | ||||||
|  |         int write(const void* buf, size_t len) { | ||||||
|  |             return ::gzwrite(m_fp, (voidp) buf, len); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Flushes all pending output into the compressed file. The parameter | ||||||
|  |          * _flush is as in the deflate() function. The return value is the zlib | ||||||
|  |          * error number (see function gzerror below). flush() returns Z_OK if | ||||||
|  |          * the flush_ parameter is Z_FINISH and all output could be flushed. | ||||||
|  |          * flush() should be called only when strictly necessary because it can | ||||||
|  |          * degrade compression. | ||||||
|  |          */ | ||||||
|  |         int flush(int _flush) { | ||||||
|  |             os_flush(); | ||||||
|  |             return ::gzflush(m_fp, _flush); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* Returns the error message for the last error which occurred on the | ||||||
|  |          * given compressed file. errnum is set to zlib error number. If an | ||||||
|  |          * error occurred in the file system and not in the compression library, | ||||||
|  |          * errnum is set to Z_ERRNO and the application may consult errno | ||||||
|  |          * to get the exact error code. | ||||||
|  |          */ | ||||||
|  |         const char* error(int* errnum) { | ||||||
|  |             return ::gzerror(m_fp, errnum); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         gzFile fp() { return m_fp; } | ||||||
|  |  | ||||||
|  |         ostream& os() { | ||||||
|  |             if (m_os == 0) m_os = new ostrstream; | ||||||
|  |             return *m_os; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         void os_flush() { | ||||||
|  |             if (m_os && m_os->pcount()>0) { | ||||||
|  |                 ostrstream* oss = new ostrstream; | ||||||
|  |                 oss->fill(m_os->fill()); | ||||||
|  |                 oss->flags(m_os->flags()); | ||||||
|  |                 oss->precision(m_os->precision()); | ||||||
|  |                 oss->width(m_os->width()); | ||||||
|  |                 ::gzwrite(m_fp, m_os->str(), m_os->pcount()); | ||||||
|  |                 delete[] m_os->str(); delete m_os; m_os = oss; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     private: | ||||||
|  |         gzFile m_fp; | ||||||
|  |         ostrstream* m_os; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Binary write the given (array of) object(s) into the compressed file. | ||||||
|  |  * returns the number of uncompressed bytes actually written | ||||||
|  |  * (0 in case of error). | ||||||
|  |  */ | ||||||
|  | template <class T, class Items> | ||||||
|  | inline int write(ozstream& zs, const T* x, Items items) { | ||||||
|  |     return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Binary output with the '<' operator. | ||||||
|  |  */ | ||||||
|  | template <class T> | ||||||
|  | inline ozstream& operator<(ozstream& zs, const T& x) { | ||||||
|  |     ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); | ||||||
|  |     return zs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline zstringlen::zstringlen(ozstream& zs, const char* x) { | ||||||
|  |     val.byte = 255;  val.word = ::strlen(x); | ||||||
|  |     if (val.word < 255) zs < (val.byte = val.word); | ||||||
|  |     else zs < val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Write length of string + the string with the '<' operator. | ||||||
|  |  */ | ||||||
|  | inline ozstream& operator<(ozstream& zs, const char* x) { | ||||||
|  |     zstringlen len(zs, x); | ||||||
|  |     ::gzwrite(zs.fp(), (voidp) x, len.value()); | ||||||
|  |     return zs; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef _MSC_VER | ||||||
|  | inline ozstream& operator<(ozstream& zs, char* const& x) { | ||||||
|  |     return zs < (const char*) x; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Ascii write with the << operator; | ||||||
|  |  */ | ||||||
|  | template <class T> | ||||||
|  | inline ostream& operator<<(ozstream& zs, const T& x) { | ||||||
|  |     zs.os_flush(); | ||||||
|  |     return zs.os() << x; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										25
									
								
								contrib/iostream2/zstream_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								contrib/iostream2/zstream_test.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | #include "zstream.h" | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <iomanip.h> | ||||||
|  |  | ||||||
|  | void main() { | ||||||
|  | 	char h[256] = "Hello"; | ||||||
|  | 	char* g = "Goodbye"; | ||||||
|  | 	ozstream out("temp.gz"); | ||||||
|  |     out < "This works well" < h < g; | ||||||
|  |     out.close(); | ||||||
|  |  | ||||||
|  |     izstream in("temp.gz"); // read it back | ||||||
|  |     char *x = read_string(in), *y = new char[256], z[256]; | ||||||
|  |     in > y > z; | ||||||
|  |     in.close(); | ||||||
|  |     cout << x << endl << y << endl << z << endl; | ||||||
|  |  | ||||||
|  |     out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results | ||||||
|  |     out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; | ||||||
|  |     out << z << endl << y << endl << x << endl; | ||||||
|  |     out << 1.1234567890123456789 << endl; | ||||||
|  |  | ||||||
|  |     delete[] x; delete[] y; | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								contrib/untgz/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								contrib/untgz/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | CC=cc | ||||||
|  | CFLAGS=-g | ||||||
|  |  | ||||||
|  | untgz: untgz.o  ../../libz.a | ||||||
|  | 	$(CC) $(CFLAGS) -o untgz  untgz.o -L../.. -lz | ||||||
|  |  | ||||||
|  | untgz.o: untgz.c ../../zlib.h | ||||||
|  | 	$(CC) $(CFLAGS) -c -I../.. untgz.c | ||||||
|  |  | ||||||
|  | ../../libz.a: | ||||||
|  | 	cd ../..; make | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm -f untgz untgz.o *~ | ||||||
							
								
								
									
										63
									
								
								contrib/untgz/makefile.w32
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								contrib/untgz/makefile.w32
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | # Makefile for zlib.  Modified for mingw32 | ||||||
|  | # For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  |  | ||||||
|  | # To compile,  | ||||||
|  | #  | ||||||
|  | #   make -fmakefile.w32 | ||||||
|  | #  | ||||||
|  |  | ||||||
|  | CC=gcc | ||||||
|  |  | ||||||
|  | # Generate dependencies (see end of the file) | ||||||
|  |  | ||||||
|  | CPPFLAGS=-MMD  | ||||||
|  |  | ||||||
|  | #CFLAGS=-MMD -O | ||||||
|  | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 | ||||||
|  | #CFLAGS=-MMD -g -DDEBUG | ||||||
|  | CFLAGS=-O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||||
|  |              -Wstrict-prototypes -Wmissing-prototypes | ||||||
|  |  | ||||||
|  | # If cp.exe is not found, replace with copy /Y . | ||||||
|  | CP=cp -f | ||||||
|  |  | ||||||
|  | # The default value of RM is "rm -f."   | ||||||
|  | # If "rm.exe" is not found, uncomment: | ||||||
|  | # RM=del | ||||||
|  |  | ||||||
|  | LD=gcc | ||||||
|  | LDLIBS=-L. -lz | ||||||
|  | LDFLAGS=-s | ||||||
|  |  | ||||||
|  |  | ||||||
|  | INCL=zlib.h zconf.h | ||||||
|  | LIBS=libz.a | ||||||
|  |  | ||||||
|  | AR=ar rcs | ||||||
|  |  | ||||||
|  | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||||
|  |        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o \ | ||||||
|  |        inffast.o | ||||||
|  |  | ||||||
|  | TEST_OBJS = minigzip.o untgz.o | ||||||
|  |  | ||||||
|  | all: minigzip.exe untgz.exe | ||||||
|  |  | ||||||
|  | rebuild:	clean	all | ||||||
|  |  | ||||||
|  | libz.a: $(OBJS) | ||||||
|  | 	$(AR) $@ $(OBJS) | ||||||
|  |  | ||||||
|  | %.exe : %.o $(LIBS) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $< $(LDLIBS) | ||||||
|  |  | ||||||
|  | .PHONY : clean | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	$(RM) *.d *.o *.exe libz.a foo.gz | ||||||
|  |  | ||||||
|  | DEPS := $(wildcard *.d) | ||||||
|  | ifneq ($(DEPS),) | ||||||
|  | include $(DEPS) | ||||||
|  | endif | ||||||
|  |  | ||||||
							
								
								
									
										478
									
								
								contrib/untgz/untgz.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										478
									
								
								contrib/untgz/untgz.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,478 @@ | |||||||
|  | /* | ||||||
|  |  * untgz.c -- Display contents and/or extract file from | ||||||
|  |  * a gzip'd TAR file | ||||||
|  |  * written by "Pedro A. Aranda Guti\irrez" <paag@tid.es> | ||||||
|  |  * adaptation to Unix by Jean-loup Gailly <jloup@gzip.org> | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <utime.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | #ifdef unix | ||||||
|  | # include <unistd.h> | ||||||
|  | #else | ||||||
|  | # include <direct.h> | ||||||
|  | # include <io.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include "zlib.h" | ||||||
|  |  | ||||||
|  | /* Values used in typeflag field.  */ | ||||||
|  |  | ||||||
|  | #define REGTYPE	 '0'		/* regular file */ | ||||||
|  | #define AREGTYPE '\0'		/* regular file */ | ||||||
|  | #define LNKTYPE  '1'		/* link */ | ||||||
|  | #define SYMTYPE  '2'		/* reserved */ | ||||||
|  | #define CHRTYPE  '3'		/* character special */ | ||||||
|  | #define BLKTYPE  '4'		/* block special */ | ||||||
|  | #define DIRTYPE  '5'		/* directory */ | ||||||
|  | #define FIFOTYPE '6'		/* FIFO special */ | ||||||
|  | #define CONTTYPE '7'		/* reserved */ | ||||||
|  |  | ||||||
|  | #define BLOCKSIZE 512 | ||||||
|  |  | ||||||
|  | struct tar_header | ||||||
|  | {				/* byte offset */ | ||||||
|  |   char name[100];		/*   0 */ | ||||||
|  |   char mode[8];			/* 100 */ | ||||||
|  |   char uid[8];			/* 108 */ | ||||||
|  |   char gid[8];			/* 116 */ | ||||||
|  |   char size[12];		/* 124 */ | ||||||
|  |   char mtime[12];		/* 136 */ | ||||||
|  |   char chksum[8];		/* 148 */ | ||||||
|  |   char typeflag;		/* 156 */ | ||||||
|  |   char linkname[100];		/* 157 */ | ||||||
|  |   char magic[6];		/* 257 */ | ||||||
|  |   char version[2];		/* 263 */ | ||||||
|  |   char uname[32];		/* 265 */ | ||||||
|  |   char gname[32];		/* 297 */ | ||||||
|  |   char devmajor[8];		/* 329 */ | ||||||
|  |   char devminor[8];		/* 337 */ | ||||||
|  |   char prefix[155];		/* 345 */ | ||||||
|  | 				/* 500 */ | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | union tar_buffer { | ||||||
|  |   char               buffer[BLOCKSIZE]; | ||||||
|  |   struct tar_header  header; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum { TGZ_EXTRACT = 0, TGZ_LIST }; | ||||||
|  |  | ||||||
|  | static char *TGZfname	OF((const char *)); | ||||||
|  | void TGZnotfound	OF((const char *)); | ||||||
|  |  | ||||||
|  | int getoct		OF((char *, int)); | ||||||
|  | char *strtime		OF((time_t *)); | ||||||
|  | int ExprMatch		OF((char *,char *)); | ||||||
|  |  | ||||||
|  | int makedir		OF((char *)); | ||||||
|  | int matchname		OF((int,int,char **,char *)); | ||||||
|  |  | ||||||
|  | void error		OF((const char *)); | ||||||
|  | int  tar		OF((gzFile, int, int, int, char **)); | ||||||
|  |  | ||||||
|  | void help		OF((int)); | ||||||
|  | int main		OF((int, char **)); | ||||||
|  |  | ||||||
|  | char *prog; | ||||||
|  |  | ||||||
|  | /* This will give a benign warning */ | ||||||
|  |  | ||||||
|  | static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", NULL }; | ||||||
|  |  | ||||||
|  | /* Return the real name of the TGZ archive */ | ||||||
|  | /* or NULL if it does not exist. */ | ||||||
|  |  | ||||||
|  | static char *TGZfname OF((const char *fname)) | ||||||
|  | { | ||||||
|  |   static char buffer[1024]; | ||||||
|  |   int origlen,i; | ||||||
|  |    | ||||||
|  |   strcpy(buffer,fname); | ||||||
|  |   origlen = strlen(buffer); | ||||||
|  |  | ||||||
|  |   for (i=0; TGZprefix[i]; i++) | ||||||
|  |     { | ||||||
|  |        strcpy(buffer+origlen,TGZprefix[i]); | ||||||
|  |        if (access(buffer,F_OK) == 0) | ||||||
|  |          return buffer; | ||||||
|  |     } | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* error message for the filename */ | ||||||
|  |  | ||||||
|  | void TGZnotfound OF((const char *fname)) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   fprintf(stderr,"%s : couldn't find ",prog); | ||||||
|  |   for (i=0;TGZprefix[i];i++) | ||||||
|  |     fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n", | ||||||
|  |             fname, | ||||||
|  |             TGZprefix[i]); | ||||||
|  |   exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* help functions */ | ||||||
|  |  | ||||||
|  | int getoct(char *p,int width) | ||||||
|  | { | ||||||
|  |   int result = 0; | ||||||
|  |   char c; | ||||||
|  |    | ||||||
|  |   while (width --) | ||||||
|  |     { | ||||||
|  |       c = *p++; | ||||||
|  |       if (c == ' ') | ||||||
|  | 	continue; | ||||||
|  |       if (c == 0) | ||||||
|  | 	break; | ||||||
|  |       result = result * 8 + (c - '0'); | ||||||
|  |     } | ||||||
|  |   return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | char *strtime (time_t *t) | ||||||
|  | { | ||||||
|  |   struct tm   *local; | ||||||
|  |   static char result[32]; | ||||||
|  |  | ||||||
|  |   local = localtime(t); | ||||||
|  |   sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d", | ||||||
|  | 	  local->tm_mday, local->tm_mon+1, local->tm_year+1900, | ||||||
|  | 	  local->tm_hour, local->tm_min,   local->tm_sec); | ||||||
|  |   return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* regular expression matching */ | ||||||
|  |  | ||||||
|  | #define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) | ||||||
|  |  | ||||||
|  | int ExprMatch(char *string,char *expr) | ||||||
|  | { | ||||||
|  |   while (1) | ||||||
|  |     { | ||||||
|  |       if (ISSPECIAL(*expr)) | ||||||
|  | 	{ | ||||||
|  | 	  if (*expr == '/') | ||||||
|  | 	    { | ||||||
|  | 	      if (*string != '\\' && *string != '/') | ||||||
|  | 		return 0; | ||||||
|  | 	      string ++; expr++; | ||||||
|  | 	    } | ||||||
|  | 	  else if (*expr == '*') | ||||||
|  | 	    { | ||||||
|  | 	      if (*expr ++ == 0) | ||||||
|  | 		return 1; | ||||||
|  | 	      while (*++string != *expr) | ||||||
|  | 		if (*string == 0) | ||||||
|  | 		  return 0; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |       else | ||||||
|  | 	{ | ||||||
|  | 	  if (*string != *expr) | ||||||
|  | 	    return 0; | ||||||
|  | 	  if (*expr++ == 0) | ||||||
|  | 	    return 1; | ||||||
|  | 	  string++; | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* recursive make directory */ | ||||||
|  | /* abort if you get an ENOENT errno somewhere in the middle */ | ||||||
|  | /* e.g. ignore error "mkdir on existing directory" */ | ||||||
|  | /* */ | ||||||
|  | /* return 1 if OK */ | ||||||
|  | /*        0 on error */ | ||||||
|  |  | ||||||
|  | int makedir (char *newdir) | ||||||
|  | { | ||||||
|  |   char *buffer = strdup(newdir); | ||||||
|  |   char *p; | ||||||
|  |   int  len = strlen(buffer); | ||||||
|  |    | ||||||
|  |   if (len <= 0) { | ||||||
|  |     free(buffer); | ||||||
|  |     return 0; | ||||||
|  |   } | ||||||
|  |   if (buffer[len-1] == '/') { | ||||||
|  |     buffer[len-1] = '\0'; | ||||||
|  |   } | ||||||
|  |   if (mkdir(buffer, 0775) == 0) | ||||||
|  |     { | ||||||
|  |       free(buffer); | ||||||
|  |       return 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   p = buffer+1; | ||||||
|  |   while (1) | ||||||
|  |     { | ||||||
|  |       char hold; | ||||||
|  |        | ||||||
|  |       while(*p && *p != '\\' && *p != '/') | ||||||
|  | 	p++; | ||||||
|  |       hold = *p; | ||||||
|  |       *p = 0; | ||||||
|  |       if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT)) | ||||||
|  | 	{ | ||||||
|  | 	  fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer); | ||||||
|  | 	  free(buffer); | ||||||
|  | 	  return 0; | ||||||
|  | 	} | ||||||
|  |       if (hold == 0) | ||||||
|  | 	break; | ||||||
|  |       *p++ = hold; | ||||||
|  |     } | ||||||
|  |   free(buffer); | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int matchname (int arg,int argc,char **argv,char *fname) | ||||||
|  | { | ||||||
|  |   if (arg == argc)		/* no arguments given (untgz tgzarchive) */ | ||||||
|  |     return 1; | ||||||
|  |  | ||||||
|  |   while (arg < argc) | ||||||
|  |     if (ExprMatch(fname,argv[arg++])) | ||||||
|  |       return 1; | ||||||
|  |  | ||||||
|  |   return 0; /* ignore this for the moment being */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Tar file list or extract */ | ||||||
|  |  | ||||||
|  | int tar (gzFile in,int action,int arg,int argc,char **argv) | ||||||
|  | { | ||||||
|  |   union  tar_buffer buffer; | ||||||
|  |   int    len; | ||||||
|  |   int    err; | ||||||
|  |   int    getheader = 1; | ||||||
|  |   int    remaining = 0; | ||||||
|  |   FILE   *outfile = NULL; | ||||||
|  |   char   fname[BLOCKSIZE]; | ||||||
|  |   time_t tartime; | ||||||
|  |    | ||||||
|  |   if (action == TGZ_LIST) | ||||||
|  |     printf("     day      time     size                       file\n" | ||||||
|  | 	   " ---------- -------- --------- -------------------------------------\n"); | ||||||
|  |   while (1) | ||||||
|  |     { | ||||||
|  |       len = gzread(in, &buffer, BLOCKSIZE); | ||||||
|  |       if (len < 0) | ||||||
|  | 	error (gzerror(in, &err)); | ||||||
|  |       /* | ||||||
|  |        * if we met the end of the tar | ||||||
|  |        * or the end-of-tar block, | ||||||
|  |        * we are done | ||||||
|  |        */ | ||||||
|  |       if ((len == 0)  || (buffer.header.name[0]== 0)) | ||||||
|  | 	break; | ||||||
|  |        | ||||||
|  |       /* | ||||||
|  |        * Always expect complete blocks to process | ||||||
|  |        * the tar information. | ||||||
|  |        */ | ||||||
|  |       if (len != BLOCKSIZE) | ||||||
|  | 	error("gzread: incomplete block read"); | ||||||
|  |        | ||||||
|  |       /* | ||||||
|  |        * If we have to get a tar header | ||||||
|  |        */ | ||||||
|  |       if (getheader == 1) | ||||||
|  | 	{ | ||||||
|  | 	  tartime = (time_t)getoct(buffer.header.mtime,12); | ||||||
|  | 	  strcpy(fname,buffer.header.name); | ||||||
|  | 	   | ||||||
|  | 	  switch (buffer.header.typeflag) | ||||||
|  | 	    { | ||||||
|  | 	    case DIRTYPE: | ||||||
|  | 	      if (action == TGZ_LIST) | ||||||
|  | 		printf(" %s     <dir> %s\n",strtime(&tartime),fname); | ||||||
|  | 	      if (action == TGZ_EXTRACT) | ||||||
|  | 		makedir(fname); | ||||||
|  | 	      break; | ||||||
|  | 	    case REGTYPE: | ||||||
|  | 	    case AREGTYPE: | ||||||
|  | 	      remaining = getoct(buffer.header.size,12); | ||||||
|  | 	      if (action == TGZ_LIST) | ||||||
|  | 		printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); | ||||||
|  | 	      if (action == TGZ_EXTRACT) | ||||||
|  | 		{ | ||||||
|  | 		  if ((remaining) && (matchname(arg,argc,argv,fname))) | ||||||
|  | 		    { | ||||||
|  | 		      outfile = fopen(fname,"wb"); | ||||||
|  | 		      if (outfile == NULL) { | ||||||
|  | 			/* try creating directory */ | ||||||
|  | 			char *p = strrchr(fname, '/'); | ||||||
|  | 			if (p != NULL) { | ||||||
|  | 			  *p = '\0'; | ||||||
|  | 			  makedir(fname); | ||||||
|  | 			  *p = '/'; | ||||||
|  | 			  outfile = fopen(fname,"wb"); | ||||||
|  | 			} | ||||||
|  | 		      } | ||||||
|  | 		      fprintf(stderr, | ||||||
|  | 			      "%s %s\n", | ||||||
|  | 			      (outfile) ? "Extracting" : "Couldn't create", | ||||||
|  | 			      fname); | ||||||
|  | 		    } | ||||||
|  | 		  else | ||||||
|  | 		    outfile = NULL; | ||||||
|  | 		} | ||||||
|  | 	      /* | ||||||
|  | 	       * could have no contents | ||||||
|  | 	       */ | ||||||
|  | 	      getheader = (remaining) ? 0 : 1; | ||||||
|  | 	      break; | ||||||
|  | 	    default: | ||||||
|  | 	      if (action == TGZ_LIST) | ||||||
|  | 		printf(" %s     <---> %s\n",strtime(&tartime),fname); | ||||||
|  | 	      break; | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |       else | ||||||
|  | 	{ | ||||||
|  | 	  unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; | ||||||
|  |  | ||||||
|  | 	  if ((action == TGZ_EXTRACT) && (outfile != NULL)) | ||||||
|  | 	    { | ||||||
|  | 	      if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) | ||||||
|  | 		{ | ||||||
|  | 		  fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname); | ||||||
|  | 		  fclose(outfile); | ||||||
|  | 		  unlink(fname); | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	  remaining -= bytes; | ||||||
|  | 	  if (remaining == 0) | ||||||
|  | 	    { | ||||||
|  | 	      getheader = 1; | ||||||
|  | 	      if ((action == TGZ_EXTRACT) && (outfile != NULL)) | ||||||
|  | 		{ | ||||||
|  | 		  struct utimbuf settime; | ||||||
|  |  | ||||||
|  | 		  settime.actime = settime.modtime = tartime; | ||||||
|  |  | ||||||
|  | 		  fclose(outfile); | ||||||
|  | 		  outfile = NULL; | ||||||
|  | 		  utime(fname,&settime); | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |    | ||||||
|  |   if (gzclose(in) != Z_OK) | ||||||
|  |     error("failed gzclose"); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* =========================================================== */ | ||||||
|  |  | ||||||
|  | void help(int exitval) | ||||||
|  | { | ||||||
|  |   fprintf(stderr, | ||||||
|  | 	  "untgz v 0.1\n" | ||||||
|  | 	  " an sample application of zlib 1.0.4\n\n" | ||||||
|  |           "Usage : untgz TGZfile            to extract all files\n" | ||||||
|  |           "        untgz TGZfile fname ...  to extract selected files\n" | ||||||
|  |           "        untgz -l TGZfile         to list archive contents\n" | ||||||
|  |           "        untgz -h                 to display this help\n\n"); | ||||||
|  |   exit(exitval); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void error(const char *msg) | ||||||
|  | { | ||||||
|  |     fprintf(stderr, "%s: %s\n", prog, msg); | ||||||
|  |     exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ====================================================================== */ | ||||||
|  |  | ||||||
|  | int _CRT_glob = 0;	/* disable globbing of the arguments */ | ||||||
|  |  | ||||||
|  | int main(int argc,char **argv) | ||||||
|  | { | ||||||
|  |     int 	action = TGZ_EXTRACT; | ||||||
|  |     int 	arg = 1; | ||||||
|  |     char	*TGZfile; | ||||||
|  |     gzFile	*f; | ||||||
|  |      | ||||||
|  |  | ||||||
|  |     prog = strrchr(argv[0],'\\'); | ||||||
|  |     if (prog == NULL) | ||||||
|  |       { | ||||||
|  | 	prog = strrchr(argv[0],'/'); | ||||||
|  | 	if (prog == NULL) | ||||||
|  | 	  { | ||||||
|  | 	    prog = strrchr(argv[0],':'); | ||||||
|  | 	    if (prog == NULL) | ||||||
|  | 	      prog = argv[0]; | ||||||
|  | 	    else | ||||||
|  | 	      prog++; | ||||||
|  | 	  } | ||||||
|  | 	else | ||||||
|  | 	  prog++; | ||||||
|  |       } | ||||||
|  |     else | ||||||
|  |       prog++; | ||||||
|  |      | ||||||
|  |     if (argc == 1) | ||||||
|  |       help(0); | ||||||
|  |  | ||||||
|  |     if (strcmp(argv[arg],"-l") == 0) | ||||||
|  |       { | ||||||
|  | 	action = TGZ_LIST; | ||||||
|  | 	if (argc == ++arg) | ||||||
|  | 	  help(0); | ||||||
|  |       } | ||||||
|  |     else if (strcmp(argv[arg],"-h") == 0) | ||||||
|  |       { | ||||||
|  | 	help(0); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |     if ((TGZfile = TGZfname(argv[arg])) == NULL) | ||||||
|  |       TGZnotfound(argv[arg]);             | ||||||
|  |  | ||||||
|  |     ++arg; | ||||||
|  |     if ((action == TGZ_LIST) && (arg != argc)) | ||||||
|  |       help(1); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  Process the TGZ file | ||||||
|  |  */ | ||||||
|  |     switch(action) | ||||||
|  |       { | ||||||
|  |       case TGZ_LIST: | ||||||
|  |       case TGZ_EXTRACT: | ||||||
|  | 	f = gzopen(TGZfile,"rb"); | ||||||
|  | 	if (f == NULL) | ||||||
|  | 	  { | ||||||
|  | 	    fprintf(stderr,"%s: Couldn't gzopen %s\n", | ||||||
|  | 		    prog, | ||||||
|  | 		    TGZfile); | ||||||
|  | 	    return 1; | ||||||
|  | 	  } | ||||||
|  | 	exit(tar(f, action, arg, argc, argv)); | ||||||
|  |       break; | ||||||
|  | 	 | ||||||
|  |       default: | ||||||
|  | 	error("Unknown option!"); | ||||||
|  | 	exit(1); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										57
									
								
								contrib/visual-basic.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								contrib/visual-basic.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | From: "Jon Caruana" <jon-net@usa.net> | ||||||
|  | To: "Jean-loup Gailly" <gzip@prep.ai.mit.edu> | ||||||
|  | Subject: Re: How to port zlib declares to vb? | ||||||
|  | Date: Mon, 28 Oct 1996 18:33:03 -0600 | ||||||
|  |  | ||||||
|  | Got the answer! (I haven't had time to check this but it's what I got, and | ||||||
|  | looks correct): | ||||||
|  |  | ||||||
|  | He has the following routines working: | ||||||
|  |         compress | ||||||
|  |         uncompress | ||||||
|  |         gzopen | ||||||
|  |         gzwrite | ||||||
|  |         gzread | ||||||
|  |         gzclose | ||||||
|  |  | ||||||
|  | Declares follow: (Quoted from Carlos Rios <c_rios@sonda.cl>, in Vb4 form) | ||||||
|  |  | ||||||
|  | #If Win16 Then   'Use Win16 calls. | ||||||
|  | Declare Function compress Lib "ZLIB.DLL" (ByVal compr As | ||||||
|  |         String, comprLen As Any, ByVal buf As String, ByVal buflen | ||||||
|  |         As Long) As Integer | ||||||
|  | Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr | ||||||
|  |         As String, uncomprLen As Any, ByVal compr As String, ByVal | ||||||
|  |         lcompr As Long) As Integer | ||||||
|  | Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As | ||||||
|  |         String, ByVal mode As String) As Long | ||||||
|  | Declare Function gzread Lib "ZLIB.DLL" (ByVal file As | ||||||
|  |         Long, ByVal uncompr As String, ByVal uncomprLen As Integer) | ||||||
|  |         As Integer | ||||||
|  | Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As | ||||||
|  |         Long, ByVal uncompr As String, ByVal uncomprLen As Integer) | ||||||
|  |         As Integer | ||||||
|  | Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As | ||||||
|  |         Long) As Integer | ||||||
|  | #Else | ||||||
|  | Declare Function compress Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal compr As String, comprLen As Any, ByVal buf As | ||||||
|  |         String, ByVal buflen As Long) As Integer | ||||||
|  | Declare Function uncompress Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal uncompr As String, uncomprLen As Any, ByVal compr As | ||||||
|  |         String, ByVal lcompr As Long) As Long | ||||||
|  | Declare Function gzopen Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal file As String, ByVal mode As String) As Long | ||||||
|  | Declare Function gzread Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal file As Long, ByVal uncompr As String, ByVal | ||||||
|  |         uncomprLen As Long) As Long | ||||||
|  | Declare Function gzwrite Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal file As Long, ByVal uncompr As String, ByVal | ||||||
|  |         uncomprLen As Long) As Long | ||||||
|  | Declare Function gzclose Lib "ZLIB32.DLL" | ||||||
|  |         (ByVal file As Long) As Long | ||||||
|  | #End If | ||||||
|  |  | ||||||
|  | -Jon Caruana | ||||||
|  | jon-net@usa.net | ||||||
|  | Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member | ||||||
							
								
								
									
										123
									
								
								crc32.c
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								crc32.c
									
									
									
									
									
								
							| @@ -1,63 +1,71 @@ | |||||||
| /* crc32.c -- compute the CRC-32 of a data stream | /* crc32.c -- compute the CRC-32 of a data stream | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: crc32.c,v 1.5 1995/05/01 13:55:46 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| extern uLong crc_table[];   /* crc table, defined below */ | #define local static | ||||||
|  |  | ||||||
| #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); |  | ||||||
| #define DO2(buf)  DO1(buf); DO1(buf); |  | ||||||
| #define DO4(buf)  DO2(buf); DO2(buf); |  | ||||||
| #define DO8(buf)  DO4(buf); DO4(buf); |  | ||||||
|  |  | ||||||
| /* ========================================================================= */ |  | ||||||
| uLong crc32(crc, buf, len) |  | ||||||
|     uLong crc; |  | ||||||
|     Byte *buf; |  | ||||||
|     uInt len; |  | ||||||
| { |  | ||||||
|     if (buf == Z_NULL) return 0L; |  | ||||||
|     crc = crc ^ 0xffffffffL; |  | ||||||
|     while (len >= 8) |  | ||||||
|     { |  | ||||||
|       DO8(buf); |  | ||||||
|       len -= 8; |  | ||||||
|     } |  | ||||||
|     if (len) do { |  | ||||||
|       DO1(buf); |  | ||||||
|     } while (--len); |  | ||||||
|     return crc ^ 0xffffffffL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* ========================================================================= |  | ||||||
|  * Make the crc table. This function is needed only if you want to compute |  | ||||||
|  * the table dynamically. |  | ||||||
|  */ |  | ||||||
| #ifdef DYNAMIC_CRC_TABLE | #ifdef DYNAMIC_CRC_TABLE | ||||||
|  |  | ||||||
|  | local int crc_table_empty = 1; | ||||||
|  | local uLongf crc_table[256]; | ||||||
|  | local void make_crc_table OF((void)); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: | ||||||
|  |   x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. | ||||||
|  |  | ||||||
|  |   Polynomials over GF(2) are represented in binary, one bit per coefficient, | ||||||
|  |   with the lowest powers in the most significant bit.  Then adding polynomials | ||||||
|  |   is just exclusive-or, and multiplying a polynomial by x is a right shift by | ||||||
|  |   one.  If we call the above polynomial p, and represent a byte as the | ||||||
|  |   polynomial q, also with the lowest power in the most significant bit (so the | ||||||
|  |   byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, | ||||||
|  |   where a mod b means the remainder after dividing a by b. | ||||||
|  |  | ||||||
|  |   This calculation is done using the shift-register method of multiplying and | ||||||
|  |   taking the remainder.  The register is initialized to zero, and for each | ||||||
|  |   incoming bit, x^32 is added mod p to the register if the bit is a one (where | ||||||
|  |   x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by | ||||||
|  |   x (which is shifting right by one and adding x^32 mod p if the bit shifted | ||||||
|  |   out is a one).  We start with the highest power (least significant bit) of | ||||||
|  |   q and repeat for all eight bits of q. | ||||||
|  |  | ||||||
|  |   The table is simply the CRC of all possible eight bit values.  This is all | ||||||
|  |   the information needed to generate CRC's on data a byte at a time for all | ||||||
|  |   combinations of CRC register values and incoming bytes. | ||||||
|  | */ | ||||||
| local void make_crc_table() | local void make_crc_table() | ||||||
| { | { | ||||||
|   uLong c; |   uLong c; | ||||||
|   int n, k; |   int n, k; | ||||||
|  |   uLong poly;            /* polynomial exclusive-or pattern */ | ||||||
|  |   /* terms of polynomial defining this crc (except x^32): */ | ||||||
|  |   static Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; | ||||||
|  |  | ||||||
|  |   /* make exclusive-or pattern from polynomial (0xedb88320L) */ | ||||||
|  |   poly = 0L; | ||||||
|  |   for (n = 0; n < sizeof(p)/sizeof(Byte); n++) | ||||||
|  |     poly |= 1L << (31 - p[n]); | ||||||
|   |   | ||||||
|   for (n = 0; n < 256; n++) |   for (n = 0; n < 256; n++) | ||||||
|   { |   { | ||||||
|     c = (uLong)n; |     c = (uLong)n; | ||||||
|     for (k = 0; k < 8; k++) |     for (k = 0; k < 8; k++) | ||||||
|       c = c & 1 ? 0xedb88320L ^ (c >> 1) : c >> 1; |       c = c & 1 ? poly ^ (c >> 1) : c >> 1; | ||||||
|     crc_table[n] = c; |     crc_table[n] = c; | ||||||
|   } |   } | ||||||
|  |   crc_table_empty = 0; | ||||||
| } | } | ||||||
| #endif | #else | ||||||
|  |  | ||||||
| /* ======================================================================== | /* ======================================================================== | ||||||
|  * Table of CRC-32's of all single-byte values (made by make_crc_table) |  * Table of CRC-32's of all single-byte values (made by make_crc_table) | ||||||
|  */ |  */ | ||||||
| uLong crc_table[] = { | local uLongf crc_table[256] = { | ||||||
|   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, |   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, | ||||||
|   0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, |   0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, | ||||||
|   0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, |   0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, | ||||||
| @@ -111,3 +119,44 @@ uLong crc_table[] = { | |||||||
|   0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, |   0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, | ||||||
|   0x2d02ef8dL |   0x2d02ef8dL | ||||||
| }; | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* ========================================================================= | ||||||
|  |  * This function can be used by asm versions of crc32() | ||||||
|  |  */ | ||||||
|  | uLongf * EXPORT get_crc_table() | ||||||
|  | { | ||||||
|  | #ifdef DYNAMIC_CRC_TABLE | ||||||
|  |   if (crc_table_empty) make_crc_table(); | ||||||
|  | #endif | ||||||
|  |   return (uLongf *)crc_table; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* ========================================================================= */ | ||||||
|  | #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); | ||||||
|  | #define DO2(buf)  DO1(buf); DO1(buf); | ||||||
|  | #define DO4(buf)  DO2(buf); DO2(buf); | ||||||
|  | #define DO8(buf)  DO4(buf); DO4(buf); | ||||||
|  |  | ||||||
|  | /* ========================================================================= */ | ||||||
|  | uLong EXPORT crc32(crc, buf, len) | ||||||
|  |     uLong crc; | ||||||
|  |     const Bytef *buf; | ||||||
|  |     uInt len; | ||||||
|  | { | ||||||
|  |     if (buf == Z_NULL) return 0L; | ||||||
|  | #ifdef DYNAMIC_CRC_TABLE | ||||||
|  |     if (crc_table_empty) | ||||||
|  |       make_crc_table(); | ||||||
|  | #endif | ||||||
|  |     crc = crc ^ 0xffffffffL; | ||||||
|  |     while (len >= 8) | ||||||
|  |     { | ||||||
|  |       DO8(buf); | ||||||
|  |       len -= 8; | ||||||
|  |     } | ||||||
|  |     if (len) do { | ||||||
|  |       DO1(buf); | ||||||
|  |     } while (--len); | ||||||
|  |     return crc ^ 0xffffffffL; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										74
									
								
								deflate.h
									
									
									
									
									
								
							
							
						
						
									
										74
									
								
								deflate.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* deflate.h -- internal compression state | /* deflate.h -- internal compression state | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly |  * Copyright (C) 1995-1998 Jean-loup Gailly | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -8,7 +8,10 @@ | |||||||
|    subject to change. Applications should only use zlib.h. |    subject to change. Applications should only use zlib.h. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: deflate.h,v 1.4 1995/05/01 15:08:45 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
|  | #ifndef _DEFLATE_H | ||||||
|  | #define _DEFLATE_H | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
|  |  | ||||||
| @@ -16,11 +19,6 @@ | |||||||
|  * Internal compression state. |  * Internal compression state. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* Data type */ |  | ||||||
| #define BINARY  0 |  | ||||||
| #define ASCII   1 |  | ||||||
| #define UNKNOWN 2 |  | ||||||
|  |  | ||||||
| #define LENGTH_CODES 29 | #define LENGTH_CODES 29 | ||||||
| /* number of length codes, not counting the special END_BLOCK code */ | /* number of length codes, not counting the special END_BLOCK code */ | ||||||
|  |  | ||||||
| @@ -58,7 +56,7 @@ typedef struct ct_data_s { | |||||||
|         ush  dad;        /* father node in Huffman tree */ |         ush  dad;        /* father node in Huffman tree */ | ||||||
|         ush  len;        /* length of bit string */ |         ush  len;        /* length of bit string */ | ||||||
|     } dl; |     } dl; | ||||||
| } ct_data; | } FAR ct_data; | ||||||
|  |  | ||||||
| #define Freq fc.freq | #define Freq fc.freq | ||||||
| #define Code fc.code | #define Code fc.code | ||||||
| @@ -71,32 +69,35 @@ typedef struct tree_desc_s { | |||||||
|     ct_data *dyn_tree;           /* the dynamic tree */ |     ct_data *dyn_tree;           /* the dynamic tree */ | ||||||
|     int     max_code;            /* largest code with non zero frequency */ |     int     max_code;            /* largest code with non zero frequency */ | ||||||
|     static_tree_desc *stat_desc; /* the corresponding static tree */ |     static_tree_desc *stat_desc; /* the corresponding static tree */ | ||||||
| } tree_desc; | } FAR tree_desc; | ||||||
|  |  | ||||||
| typedef ush Pos; | typedef ush Pos; | ||||||
|  | typedef Pos FAR Posf; | ||||||
| typedef unsigned IPos; | typedef unsigned IPos; | ||||||
|  |  | ||||||
| /* A Pos is an index in the character window. We use short instead of int to | /* A Pos is an index in the character window. We use short instead of int to | ||||||
|  * save space in the various tables. IPos is used only for parameter passing. |  * save space in the various tables. IPos is used only for parameter passing. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| typedef struct internal_state { | typedef struct internal_state { | ||||||
|     z_stream *strm;      /* pointer back to this zlib stream */ |     z_streamp strm;      /* pointer back to this zlib stream */ | ||||||
|     int   status;        /* as the name implies */ |     int   status;        /* as the name implies */ | ||||||
|     Byte *pending_buf;   /* output still pending */ |     Bytef *pending_buf;  /* output still pending */ | ||||||
|     Byte *pending_out;   /* next pending byte to output to the stream */ |     ulg   pending_buf_size; /* size of pending_buf */ | ||||||
|  |     Bytef *pending_out;  /* next pending byte to output to the stream */ | ||||||
|     int   pending;       /* nb of bytes in the pending buffer */ |     int   pending;       /* nb of bytes in the pending buffer */ | ||||||
|     uLong adler;         /* adler32 of uncompressed data */ |  | ||||||
|     int   noheader;      /* suppress zlib header and adler32 */ |     int   noheader;      /* suppress zlib header and adler32 */ | ||||||
|     Byte  data_type;     /* UNKNOWN, BINARY or ASCII */ |     Byte  data_type;     /* UNKNOWN, BINARY or ASCII */ | ||||||
|     Byte  method;        /* STORED (for zip only) or DEFLATED */ |     Byte  method;        /* STORED (for zip only) or DEFLATED */ | ||||||
|  |     int   last_flush;    /* value of flush param for previous deflate call */ | ||||||
|  |  | ||||||
|     		/* used by deflate.c: */ |                 /* used by deflate.c: */ | ||||||
|  |  | ||||||
|     uInt  w_size;        /* LZ77 window size (32K by default) */ |     uInt  w_size;        /* LZ77 window size (32K by default) */ | ||||||
|     uInt  w_bits;        /* log2(w_size)  (8..16) */ |     uInt  w_bits;        /* log2(w_size)  (8..16) */ | ||||||
|     uInt  w_mask;        /* w_size - 1 */ |     uInt  w_mask;        /* w_size - 1 */ | ||||||
|  |  | ||||||
|     Byte *window; |     Bytef *window; | ||||||
|     /* Sliding window. Input bytes are read into the second half of the window, |     /* Sliding window. Input bytes are read into the second half of the window, | ||||||
|      * and move to the first half later to keep a dictionary of at least wSize |      * and move to the first half later to keep a dictionary of at least wSize | ||||||
|      * bytes. With this organization, matches are limited to a distance of |      * bytes. With this organization, matches are limited to a distance of | ||||||
| @@ -111,13 +112,13 @@ typedef struct internal_state { | |||||||
|      * is directly used as sliding window. |      * is directly used as sliding window. | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|     Pos *prev; |     Posf *prev; | ||||||
|     /* Link to older string with same hash index. To limit the size of this |     /* Link to older string with same hash index. To limit the size of this | ||||||
|      * array to 64K, this link is maintained only for the last 32K strings. |      * array to 64K, this link is maintained only for the last 32K strings. | ||||||
|      * An index in this array is thus a window index modulo 32K. |      * An index in this array is thus a window index modulo 32K. | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|     Pos *head; /* Heads of the hash chains or NIL. */ |     Posf *head; /* Heads of the hash chains or NIL. */ | ||||||
|  |  | ||||||
|     uInt  ins_h;          /* hash index of string to be inserted */ |     uInt  ins_h;          /* hash index of string to be inserted */ | ||||||
|     uInt  hash_size;      /* number of elements in hash table */ |     uInt  hash_size;      /* number of elements in hash table */ | ||||||
| @@ -171,17 +172,17 @@ typedef struct internal_state { | |||||||
|     uInt good_match; |     uInt good_match; | ||||||
|     /* Use a faster search when the previous match is longer than this */ |     /* Use a faster search when the previous match is longer than this */ | ||||||
|  |  | ||||||
|      int nice_match; /* Stop searching when current match exceeds this */ |     int nice_match; /* Stop searching when current match exceeds this */ | ||||||
|  |  | ||||||
|     		/* used by trees.c: */ |                 /* used by trees.c: */ | ||||||
|  |     /* Didn't use ct_data typedef below to supress compiler warning */ | ||||||
|  |     struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */ | ||||||
|  |     struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ | ||||||
|  |     struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */ | ||||||
|  |  | ||||||
|     ct_data dyn_ltree[HEAP_SIZE];   /* literal and length tree */ |     struct tree_desc_s l_desc;               /* desc. for literal tree */ | ||||||
|     ct_data dyn_dtree[2*D_CODES+1]; /* distance tree */ |     struct tree_desc_s d_desc;               /* desc. for distance tree */ | ||||||
|     ct_data bl_tree[2*BL_CODES+1];  /* Huffman tree for the bit lengths */ |     struct tree_desc_s bl_desc;              /* desc. for bit length tree */ | ||||||
|  |  | ||||||
|     tree_desc l_desc;               /* descriptor for literal tree */ |  | ||||||
|     tree_desc d_desc;               /* descriptor for distance tree */ |  | ||||||
|     tree_desc bl_desc;              /* descriptor for bit length tree */ |  | ||||||
|  |  | ||||||
|     ush bl_count[MAX_BITS+1]; |     ush bl_count[MAX_BITS+1]; | ||||||
|     /* number of codes at each bit length for an optimal tree */ |     /* number of codes at each bit length for an optimal tree */ | ||||||
| @@ -197,7 +198,7 @@ typedef struct internal_state { | |||||||
|     /* Depth of each subtree used as tie breaker for trees of equal frequency |     /* Depth of each subtree used as tie breaker for trees of equal frequency | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
|     uch *l_buf;           /* buffer for literals or lengths */ |     uchf *l_buf;          /* buffer for literals or lengths */ | ||||||
|  |  | ||||||
|     uInt  lit_bufsize; |     uInt  lit_bufsize; | ||||||
|     /* Size of match buffer for literals/lengths.  There are 4 reasons for |     /* Size of match buffer for literals/lengths.  There are 4 reasons for | ||||||
| @@ -221,7 +222,7 @@ typedef struct internal_state { | |||||||
|  |  | ||||||
|     uInt last_lit;      /* running index in l_buf */ |     uInt last_lit;      /* running index in l_buf */ | ||||||
|  |  | ||||||
|     ush *d_buf; |     ushf *d_buf; | ||||||
|     /* Buffer for distances. To simplify the code, d_buf and l_buf have |     /* Buffer for distances. To simplify the code, d_buf and l_buf have | ||||||
|      * the same number of elements. To use different lengths, an extra flag |      * the same number of elements. To use different lengths, an extra flag | ||||||
|      * array would be necessary. |      * array would be necessary. | ||||||
| @@ -231,6 +232,7 @@ typedef struct internal_state { | |||||||
|     ulg static_len;     /* bit length of current block with static trees */ |     ulg static_len;     /* bit length of current block with static trees */ | ||||||
|     ulg compressed_len; /* total bit length of compressed file */ |     ulg compressed_len; /* total bit length of compressed file */ | ||||||
|     uInt matches;       /* number of string matches in current block */ |     uInt matches;       /* number of string matches in current block */ | ||||||
|  |     int last_eob_len;   /* bit length of EOB code for last block */ | ||||||
|  |  | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
|     ulg bits_sent;      /* bit length of the compressed data */ |     ulg bits_sent;      /* bit length of the compressed data */ | ||||||
| @@ -245,8 +247,7 @@ typedef struct internal_state { | |||||||
|      * are always zero. |      * are always zero. | ||||||
|      */ |      */ | ||||||
|  |  | ||||||
| } deflate_state; | } FAR deflate_state; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Output a byte on the stream. | /* Output a byte on the stream. | ||||||
|  * IN assertion: there is enough room in pending_buf. |  * IN assertion: there is enough room in pending_buf. | ||||||
| @@ -264,9 +265,12 @@ typedef struct internal_state { | |||||||
|  * distances are limited to MAX_DIST instead of WSIZE. |  * distances are limited to MAX_DIST instead of WSIZE. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 	/* in trees.c */ |         /* in trees.c */ | ||||||
| void ct_init       __P((deflate_state *s)); | void _tr_init         OF((deflate_state *s)); | ||||||
| int  ct_tally      __P((deflate_state *s, int dist, int lc)); | int  _tr_tally        OF((deflate_state *s, unsigned dist, unsigned lc)); | ||||||
| ulg ct_flush_block __P((deflate_state *s, char *buf, ulg stored_len, int eof)); | ulg  _tr_flush_block  OF((deflate_state *s, charf *buf, ulg stored_len, | ||||||
| void ct_stored_block __P((deflate_state *s, char *buf, ulg stored_len, |  | ||||||
| 			  int eof)); | 			  int eof)); | ||||||
|  | void _tr_align        OF((deflate_state *s)); | ||||||
|  | void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, | ||||||
|  |                           int eof)); | ||||||
|  | #endif | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								descrip.mms
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								descrip.mms
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | # descrip.mms: MMS description file for building zlib on VMS | ||||||
|  | # written by Martin P.J. Zinser <m.zinser@gsi.de> | ||||||
|  |  | ||||||
|  | cc_defs =  | ||||||
|  | c_deb =  | ||||||
|  |  | ||||||
|  | .ifdef __DECC__ | ||||||
|  | pref = /prefix=all | ||||||
|  | .endif | ||||||
|  |  | ||||||
|  | OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ | ||||||
|  |        deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ | ||||||
|  |        inftrees.obj, infcodes.obj, infutil.obj, inffast.obj | ||||||
|  |  | ||||||
|  | CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) | ||||||
|  |  | ||||||
|  | all : example.exe minigzip.exe | ||||||
|  |         @ write sys$output " Example applications available" | ||||||
|  | libz.olb : libz.olb($(OBJS)) | ||||||
|  | 	@ write sys$output " libz available" | ||||||
|  |  | ||||||
|  | example.exe : example.obj libz.olb | ||||||
|  |               link example,libz.olb/lib | ||||||
|  |  | ||||||
|  | minigzip.exe : minigzip.obj libz.olb | ||||||
|  |               link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib | ||||||
|  |  | ||||||
|  | clean :  | ||||||
|  | 	delete *.obj;*,libz.olb;* | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Other dependencies. | ||||||
|  | adler32.obj : zutil.h zlib.h zconf.h | ||||||
|  | compress.obj : zlib.h zconf.h | ||||||
|  | crc32.obj : zutil.h zlib.h zconf.h | ||||||
|  | deflate.obj : deflate.h zutil.h zlib.h zconf.h | ||||||
|  | example.obj : zlib.h zconf.h | ||||||
|  | gzio.obj : zutil.h zlib.h zconf.h | ||||||
|  | infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||||||
|  | infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h | ||||||
|  | inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||||||
|  | inflate.obj : zutil.h zlib.h zconf.h infblock.h | ||||||
|  | inftrees.obj : zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | minigzip.obj : zlib.h zconf.h | ||||||
|  | trees.obj : deflate.h zutil.h zlib.h zconf.h | ||||||
|  | uncompr.obj : zlib.h zconf.h | ||||||
|  | zutil.obj : zutil.h zlib.h zconf.h | ||||||
							
								
								
									
										425
									
								
								example.c
									
									
									
									
									
								
							
							
						
						
									
										425
									
								
								example.c
									
									
									
									
									
								
							| @@ -1,55 +1,65 @@ | |||||||
| /* example.c -- usage example of the zlib compression library | /* example.c -- usage example of the zlib compression library | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: example.c,v 1.7 1995/05/01 16:57:22 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| #ifdef STDC | #ifdef STDC | ||||||
| #  include <string.h> | #  include <string.h> | ||||||
|  | #  include <stdlib.h> | ||||||
|  | #else | ||||||
|  |    extern void exit  OF((int)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern void exit  __P((int)); |  | ||||||
|  |  | ||||||
| #define BUFLEN 4096 |  | ||||||
|  |  | ||||||
| #define local static |  | ||||||
| /* For MSDOS and other systems with limitation on stack size. For Unix, |  | ||||||
|     #define local |  | ||||||
|    works also. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #define CHECK_ERR(err, msg) { \ | #define CHECK_ERR(err, msg) { \ | ||||||
|     if (err != Z_OK) { \ |     if (err != Z_OK) { \ | ||||||
|         fprintf(stderr, "%s error: %d\n", msg, err); \ |         fprintf(stderr, "%s error: %d\n", msg, err); \ | ||||||
| 	exit(1); \ |         exit(1); \ | ||||||
|     } \ |     } \ | ||||||
| } | } | ||||||
|  |  | ||||||
| char *hello = "hello world"; | const char hello[] = "hello, hello!"; | ||||||
|  | /* "hello world" would be more standard, but the repeated "hello" | ||||||
|  |  * stresses the compression code better, sorry... | ||||||
|  |  */ | ||||||
|  |  | ||||||
| void test_compress __P((void)); | const char dictionary[] = "hello"; | ||||||
| void test_gzio     __P((char *out, char *in)); | uLong dictId; /* Adler32 value of the dictionary */ | ||||||
| void test_deflate  __P((Byte compr[])); |  | ||||||
| void test_inflate  __P((Byte compr[])); | void test_compress      OF((Byte *compr, uLong comprLen, | ||||||
| void main          __P((int argc, char *argv[])); | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | void test_gzio          OF((const char *out, const char *in,  | ||||||
|  | 		            Byte *uncompr, int uncomprLen)); | ||||||
|  | void test_deflate       OF((Byte *compr, uLong comprLen)); | ||||||
|  | void test_inflate       OF((Byte *compr, uLong comprLen, | ||||||
|  | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | void test_large_deflate OF((Byte *compr, uLong comprLen, | ||||||
|  | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | void test_large_inflate OF((Byte *compr, uLong comprLen, | ||||||
|  | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | void test_flush         OF((Byte *compr, uLong comprLen)); | ||||||
|  | void test_sync          OF((Byte *compr, uLong comprLen, | ||||||
|  | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | void test_dict_deflate  OF((Byte *compr, uLong comprLen)); | ||||||
|  | void test_dict_inflate  OF((Byte *compr, uLong comprLen, | ||||||
|  | 		            Byte *uncompr, uLong uncomprLen)); | ||||||
|  | int  main               OF((int argc, char *argv[])); | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test compress() and uncompress() |  * Test compress() and uncompress() | ||||||
|  */ |  */ | ||||||
| void test_compress() | void test_compress(compr, comprLen, uncompr, uncomprLen) | ||||||
|  |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
| { | { | ||||||
|     local Byte compr[BUFLEN]; |  | ||||||
|     uLong comprLen = sizeof(compr); |  | ||||||
|     local Byte uncompr[BUFLEN]; |  | ||||||
|     uLong uncomprLen = sizeof(uncompr); |  | ||||||
|     int err; |     int err; | ||||||
|     uLong len = strlen(hello)+1; |     uLong len = strlen(hello)+1; | ||||||
|  |  | ||||||
|     err = compress(compr, &comprLen, (Byte*)hello, len); |     err = compress(compr, &comprLen, (const Bytef*)hello, len); | ||||||
|     CHECK_ERR(err, "compress"); |     CHECK_ERR(err, "compress"); | ||||||
|  |  | ||||||
|     strcpy((char*)uncompr, "garbage"); |     strcpy((char*)uncompr, "garbage"); | ||||||
| @@ -58,60 +68,77 @@ void test_compress() | |||||||
|     CHECK_ERR(err, "uncompress"); |     CHECK_ERR(err, "uncompress"); | ||||||
|  |  | ||||||
|     if (strcmp((char*)uncompr, hello)) { |     if (strcmp((char*)uncompr, hello)) { | ||||||
| 	fprintf(stderr, "bad uncompress\n"); |         fprintf(stderr, "bad uncompress\n"); | ||||||
|     } else { |     } else { | ||||||
| 	printf("uncompress(): %s\n", uncompr); |         printf("uncompress(): %s\n", uncompr); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test read/write of .gz files |  * Test read/write of .gz files | ||||||
|  */ |  */ | ||||||
| void test_gzio(out, in) | void test_gzio(out, in, uncompr, uncomprLen) | ||||||
|     char *out; /* output file */ |     const char *out; /* output file */ | ||||||
|     char *in;  /* input file */ |     const char *in;  /* input file */ | ||||||
|  |     Byte *uncompr; | ||||||
|  |     int  uncomprLen; | ||||||
| { | { | ||||||
|     local Byte uncompr[BUFLEN]; |  | ||||||
|     int uncomprLen = sizeof(uncompr); |  | ||||||
|     int err; |     int err; | ||||||
|     int len = strlen(hello)+1; |     int len = strlen(hello)+1; | ||||||
|     gzFile file; |     gzFile file; | ||||||
|  |     z_off_t pos; | ||||||
|  |  | ||||||
|     file = gzopen(out, "wb"); |     file = gzopen(out, "wb"); | ||||||
|     if (file == NULL) { |     if (file == NULL) { | ||||||
| 	fprintf(stderr, "gzopen error\n"); |         fprintf(stderr, "gzopen error\n"); | ||||||
| 	exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|  |     if (gzprintf(file, "%s, %s!", "hello", "hello") != len-1) { | ||||||
|     if (gzwrite(file, hello, len) != len) { |         fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); | ||||||
| 	fprintf(stderr, "gzwrite err: %s\n", gzerror(file, &err)); |  | ||||||
|     } |     } | ||||||
|  |     gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ | ||||||
|     gzclose(file); |     gzclose(file); | ||||||
|  |  | ||||||
|     file = gzopen(in, "rb"); |     file = gzopen(in, "rb"); | ||||||
|     if (file == NULL) { |     if (file == NULL) { | ||||||
| 	fprintf(stderr, "gzopen error\n"); |         fprintf(stderr, "gzopen error\n"); | ||||||
|     } |     } | ||||||
|     strcpy((char*)uncompr, "garbage"); |     strcpy((char*)uncompr, "garbage"); | ||||||
|  |  | ||||||
|     uncomprLen = gzread(file, uncompr, uncomprLen); |     uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen); | ||||||
|     if (uncomprLen != len) { |     if (uncomprLen != len) { | ||||||
| 	fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); |         fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); | ||||||
|     } |     } | ||||||
|     gzclose(file); |  | ||||||
|  |  | ||||||
|     if (strcmp((char*)uncompr, hello)) { |     if (strcmp((char*)uncompr, hello)) { | ||||||
| 	fprintf(stderr, "bad gzread\n"); |         fprintf(stderr, "bad gzread\n"); | ||||||
|     } else { |     } else { | ||||||
| 	printf("gzread(): %s\n", uncompr); |         printf("gzread(): %s\n", uncompr); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     pos = gzseek(file, -7L, SEEK_CUR); | ||||||
|  |     if (pos != 7 || gztell(file) != pos) { | ||||||
|  | 	fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", | ||||||
|  | 		pos, gztell(file)); | ||||||
|  |     } | ||||||
|  |     uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen); | ||||||
|  |     if (uncomprLen != 7) { | ||||||
|  |         fprintf(stderr, "gzread err after gzseek: %s\n", gzerror(file, &err)); | ||||||
|  |     } | ||||||
|  |     if (strcmp((char*)uncompr, hello+7)) { | ||||||
|  |         fprintf(stderr, "bad gzread after gzseek\n"); | ||||||
|  |     } else { | ||||||
|  |         printf("gzread() after gzseek: %s\n", uncompr); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     gzclose(file); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test deflate() with small buffers |  * Test deflate() with small buffers | ||||||
|  */ |  */ | ||||||
| void test_deflate(compr) | void test_deflate(compr, comprLen) | ||||||
|     Byte compr[]; |     Byte *compr; | ||||||
|  |     uLong comprLen; | ||||||
| { | { | ||||||
|     z_stream c_stream; /* compression stream */ |     z_stream c_stream; /* compression stream */ | ||||||
|     int err; |     int err; | ||||||
| @@ -119,24 +146,25 @@ void test_deflate(compr) | |||||||
|  |  | ||||||
|     c_stream.zalloc = (alloc_func)0; |     c_stream.zalloc = (alloc_func)0; | ||||||
|     c_stream.zfree = (free_func)0; |     c_stream.zfree = (free_func)0; | ||||||
|  |     c_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); |     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); | ||||||
|     CHECK_ERR(err, "deflateInit"); |     CHECK_ERR(err, "deflateInit"); | ||||||
|  |  | ||||||
|     c_stream.next_in  = (Byte*)hello; |     c_stream.next_in  = (Bytef*)hello; | ||||||
|     c_stream.next_out = compr; |     c_stream.next_out = compr; | ||||||
|  |  | ||||||
|     while (c_stream.total_in != (uLong)len) { |     while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) { | ||||||
| 	c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ |         c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ | ||||||
| 	err = deflate(&c_stream, Z_NO_FLUSH); |         err = deflate(&c_stream, Z_NO_FLUSH); | ||||||
| 	CHECK_ERR(err, "deflate"); |         CHECK_ERR(err, "deflate"); | ||||||
|     } |     } | ||||||
|     /* Finish the stream, still forcing small buffers: */ |     /* Finish the stream, still forcing small buffers: */ | ||||||
|     for (;;) { |     for (;;) { | ||||||
| 	c_stream.avail_out = 1; |         c_stream.avail_out = 1; | ||||||
| 	err = deflate(&c_stream, Z_FINISH); |         err = deflate(&c_stream, Z_FINISH); | ||||||
| 	if (err == Z_STREAM_END) break; |         if (err == Z_STREAM_END) break; | ||||||
| 	CHECK_ERR(err, "deflate"); |         CHECK_ERR(err, "deflate"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     err = deflateEnd(&c_stream); |     err = deflateEnd(&c_stream); | ||||||
| @@ -146,10 +174,10 @@ void test_deflate(compr) | |||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test inflate() with small buffers |  * Test inflate() with small buffers | ||||||
|  */ |  */ | ||||||
| void test_inflate(compr) | void test_inflate(compr, comprLen, uncompr, uncomprLen) | ||||||
|     Byte compr[]; |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
| { | { | ||||||
|     local Byte uncompr[BUFLEN]; |  | ||||||
|     int err; |     int err; | ||||||
|     z_stream d_stream; /* decompression stream */ |     z_stream d_stream; /* decompression stream */ | ||||||
|  |  | ||||||
| @@ -157,35 +185,131 @@ void test_inflate(compr) | |||||||
|  |  | ||||||
|     d_stream.zalloc = (alloc_func)0; |     d_stream.zalloc = (alloc_func)0; | ||||||
|     d_stream.zfree = (free_func)0; |     d_stream.zfree = (free_func)0; | ||||||
|  |     d_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     d_stream.next_in  = compr; | ||||||
|  |     d_stream.avail_in = 0; | ||||||
|  |     d_stream.next_out = uncompr; | ||||||
|  |  | ||||||
|     err = inflateInit(&d_stream); |     err = inflateInit(&d_stream); | ||||||
|     CHECK_ERR(err, "inflateInit"); |     CHECK_ERR(err, "inflateInit"); | ||||||
|  |  | ||||||
|     d_stream.next_in  = compr; |     while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { | ||||||
|     d_stream.next_out = uncompr; |         d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ | ||||||
|  |         err = inflate(&d_stream, Z_NO_FLUSH); | ||||||
|     for (;;) { |         if (err == Z_STREAM_END) break; | ||||||
| 	d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ |         CHECK_ERR(err, "inflate"); | ||||||
| 	err = inflate(&d_stream, Z_NO_FLUSH); |  | ||||||
| 	if (err == Z_STREAM_END) break; |  | ||||||
| 	CHECK_ERR(err, "inflate"); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     err = inflateEnd(&d_stream); |     err = inflateEnd(&d_stream); | ||||||
|     CHECK_ERR(err, "inflateEnd"); |     CHECK_ERR(err, "inflateEnd"); | ||||||
|  |  | ||||||
|     if (strcmp((char*)uncompr, hello)) { |     if (strcmp((char*)uncompr, hello)) { | ||||||
| 	fprintf(stderr, "bad inflate\n"); |         fprintf(stderr, "bad inflate\n"); | ||||||
|     } else { |     } else { | ||||||
| 	printf("inflate(): %s\n", uncompr); |         printf("inflate(): %s\n", uncompr); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Test deflate() with large buffers and dynamic change of compression level | ||||||
|  |  */ | ||||||
|  | void test_large_deflate(compr, comprLen, uncompr, uncomprLen) | ||||||
|  |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
|  | { | ||||||
|  |     z_stream c_stream; /* compression stream */ | ||||||
|  |     int err; | ||||||
|  |  | ||||||
|  |     c_stream.zalloc = (alloc_func)0; | ||||||
|  |     c_stream.zfree = (free_func)0; | ||||||
|  |     c_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     err = deflateInit(&c_stream, Z_BEST_SPEED); | ||||||
|  |     CHECK_ERR(err, "deflateInit"); | ||||||
|  |  | ||||||
|  |     c_stream.next_out = compr; | ||||||
|  |     c_stream.avail_out = (uInt)comprLen; | ||||||
|  |  | ||||||
|  |     /* At this point, uncompr is still mostly zeroes, so it should compress | ||||||
|  |      * very well: | ||||||
|  |      */ | ||||||
|  |     c_stream.next_in = uncompr; | ||||||
|  |     c_stream.avail_in = (uInt)uncomprLen; | ||||||
|  |     err = deflate(&c_stream, Z_NO_FLUSH); | ||||||
|  |     CHECK_ERR(err, "deflate"); | ||||||
|  |     if (c_stream.avail_in != 0) { | ||||||
|  |         fprintf(stderr, "deflate not greedy\n"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* Feed in already compressed data and switch to no compression: */ | ||||||
|  |     deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); | ||||||
|  |     c_stream.next_in = compr; | ||||||
|  |     c_stream.avail_in = (uInt)comprLen/2; | ||||||
|  |     err = deflate(&c_stream, Z_NO_FLUSH); | ||||||
|  |     CHECK_ERR(err, "deflate"); | ||||||
|  |  | ||||||
|  |     /* Switch back to compressing mode: */ | ||||||
|  |     deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); | ||||||
|  |     c_stream.next_in = uncompr; | ||||||
|  |     c_stream.avail_in = (uInt)uncomprLen; | ||||||
|  |     err = deflate(&c_stream, Z_NO_FLUSH); | ||||||
|  |     CHECK_ERR(err, "deflate"); | ||||||
|  |  | ||||||
|  |     err = deflate(&c_stream, Z_FINISH); | ||||||
|  |     if (err != Z_STREAM_END) { | ||||||
|  |         fprintf(stderr, "deflate should report Z_STREAM_END\n"); | ||||||
|  |     } | ||||||
|  |     err = deflateEnd(&c_stream); | ||||||
|  |     CHECK_ERR(err, "deflateEnd"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Test inflate() with large buffers | ||||||
|  |  */ | ||||||
|  | void test_large_inflate(compr, comprLen, uncompr, uncomprLen) | ||||||
|  |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
|  | { | ||||||
|  |     int err; | ||||||
|  |     z_stream d_stream; /* decompression stream */ | ||||||
|  |  | ||||||
|  |     strcpy((char*)uncompr, "garbage"); | ||||||
|  |  | ||||||
|  |     d_stream.zalloc = (alloc_func)0; | ||||||
|  |     d_stream.zfree = (free_func)0; | ||||||
|  |     d_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     d_stream.next_in  = compr; | ||||||
|  |     d_stream.avail_in = (uInt)comprLen; | ||||||
|  |  | ||||||
|  |     err = inflateInit(&d_stream); | ||||||
|  |     CHECK_ERR(err, "inflateInit"); | ||||||
|  |  | ||||||
|  |     for (;;) { | ||||||
|  |         d_stream.next_out = uncompr;            /* discard the output */ | ||||||
|  | 	d_stream.avail_out = (uInt)uncomprLen; | ||||||
|  |         err = inflate(&d_stream, Z_NO_FLUSH); | ||||||
|  |         if (err == Z_STREAM_END) break; | ||||||
|  |         CHECK_ERR(err, "large inflate"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     err = inflateEnd(&d_stream); | ||||||
|  |     CHECK_ERR(err, "inflateEnd"); | ||||||
|  |  | ||||||
|  |     if (d_stream.total_out != 2*uncomprLen + comprLen/2) { | ||||||
|  |         fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); | ||||||
|  |     } else { | ||||||
|  |         printf("large_inflate(): OK\n"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test deflate() with full flush |  * Test deflate() with full flush | ||||||
|  */ |  */ | ||||||
| void test_flush(compr) | void test_flush(compr, comprLen) | ||||||
|     Byte compr[]; |     Byte *compr; | ||||||
|  |     uLong comprLen; | ||||||
| { | { | ||||||
|     z_stream c_stream; /* compression stream */ |     z_stream c_stream; /* compression stream */ | ||||||
|     int err; |     int err; | ||||||
| @@ -193,14 +317,15 @@ void test_flush(compr) | |||||||
|  |  | ||||||
|     c_stream.zalloc = (alloc_func)0; |     c_stream.zalloc = (alloc_func)0; | ||||||
|     c_stream.zfree = (free_func)0; |     c_stream.zfree = (free_func)0; | ||||||
|  |     c_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); |     err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); | ||||||
|     CHECK_ERR(err, "deflateInit"); |     CHECK_ERR(err, "deflateInit"); | ||||||
|  |  | ||||||
|     c_stream.next_in  = (Byte*)hello; |     c_stream.next_in  = (Bytef*)hello; | ||||||
|     c_stream.next_out = compr; |     c_stream.next_out = compr; | ||||||
|     c_stream.avail_in = 3; |     c_stream.avail_in = 3; | ||||||
|     c_stream.avail_out = BUFLEN; |     c_stream.avail_out = (uInt)comprLen; | ||||||
|     err = deflate(&c_stream, Z_FULL_FLUSH); |     err = deflate(&c_stream, Z_FULL_FLUSH); | ||||||
|     CHECK_ERR(err, "deflate"); |     CHECK_ERR(err, "deflate"); | ||||||
|  |  | ||||||
| @@ -209,7 +334,7 @@ void test_flush(compr) | |||||||
|  |  | ||||||
|     err = deflate(&c_stream, Z_FINISH); |     err = deflate(&c_stream, Z_FINISH); | ||||||
|     if (err != Z_STREAM_END) { |     if (err != Z_STREAM_END) { | ||||||
| 	CHECK_ERR(err, "deflate"); |         CHECK_ERR(err, "deflate"); | ||||||
|     } |     } | ||||||
|     err = deflateEnd(&c_stream); |     err = deflateEnd(&c_stream); | ||||||
|     CHECK_ERR(err, "deflateEnd"); |     CHECK_ERR(err, "deflateEnd"); | ||||||
| @@ -218,10 +343,10 @@ void test_flush(compr) | |||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Test inflateSync() |  * Test inflateSync() | ||||||
|  */ |  */ | ||||||
| void test_sync(compr) | void test_sync(compr, comprLen, uncompr, uncomprLen) | ||||||
|     Byte compr[]; |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
| { | { | ||||||
|     local Byte uncompr[BUFLEN]; |  | ||||||
|     int err; |     int err; | ||||||
|     z_stream d_stream; /* decompression stream */ |     z_stream d_stream; /* decompression stream */ | ||||||
|  |  | ||||||
| @@ -229,60 +354,168 @@ void test_sync(compr) | |||||||
|  |  | ||||||
|     d_stream.zalloc = (alloc_func)0; |     d_stream.zalloc = (alloc_func)0; | ||||||
|     d_stream.zfree = (free_func)0; |     d_stream.zfree = (free_func)0; | ||||||
|  |     d_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     d_stream.next_in  = compr; | ||||||
|  |     d_stream.avail_in = 2; /* just read the zlib header */ | ||||||
|  |  | ||||||
|     err = inflateInit(&d_stream); |     err = inflateInit(&d_stream); | ||||||
|     CHECK_ERR(err, "inflateInit"); |     CHECK_ERR(err, "inflateInit"); | ||||||
|  |  | ||||||
|     d_stream.next_in  = compr; |  | ||||||
|     d_stream.next_out = uncompr; |     d_stream.next_out = uncompr; | ||||||
|     d_stream.avail_in = 2; /* just read the zlib header */ |     d_stream.avail_out = (uInt)uncomprLen; | ||||||
|     d_stream.avail_out = sizeof(uncompr); |  | ||||||
|  |  | ||||||
|     inflate(&d_stream, Z_NO_FLUSH); |     inflate(&d_stream, Z_NO_FLUSH); | ||||||
|     CHECK_ERR(err, "inflate"); |     CHECK_ERR(err, "inflate"); | ||||||
|  |  | ||||||
|     d_stream.avail_in = BUFLEN-2; /* let inflate read all compressed data */ |     d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */ | ||||||
|     err = inflateSync(&d_stream); /* skip the damaged part */ |     err = inflateSync(&d_stream);           /* but skip the damaged part */ | ||||||
|     CHECK_ERR(err, "inflateSync"); |     CHECK_ERR(err, "inflateSync"); | ||||||
|  |  | ||||||
|     err = inflate(&d_stream, Z_FINISH); |     err = inflate(&d_stream, Z_FINISH); | ||||||
|     if (err != Z_DATA_ERROR) { |     if (err != Z_DATA_ERROR) { | ||||||
|         fprintf(stderr, "inflate should report DATA_ERROR\n"); |         fprintf(stderr, "inflate should report DATA_ERROR\n"); | ||||||
| 	/* Because of incorrect adler32 */ |         /* Because of incorrect adler32 */ | ||||||
|     } |     } | ||||||
|     err = inflateEnd(&d_stream); |     err = inflateEnd(&d_stream); | ||||||
|     CHECK_ERR(err, "inflateEnd"); |     CHECK_ERR(err, "inflateEnd"); | ||||||
|  |  | ||||||
|     printf("after inflateSync(): %s\n", uncompr); |     printf("after inflateSync(): hel%s\n", uncompr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Test deflate() with preset dictionary | ||||||
|  |  */ | ||||||
|  | void test_dict_deflate(compr, comprLen) | ||||||
|  |     Byte *compr; | ||||||
|  |     uLong comprLen; | ||||||
|  | { | ||||||
|  |     z_stream c_stream; /* compression stream */ | ||||||
|  |     int err; | ||||||
|  |  | ||||||
|  |     c_stream.zalloc = (alloc_func)0; | ||||||
|  |     c_stream.zfree = (free_func)0; | ||||||
|  |     c_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     err = deflateInit(&c_stream, Z_BEST_COMPRESSION); | ||||||
|  |     CHECK_ERR(err, "deflateInit"); | ||||||
|  |  | ||||||
|  |     err = deflateSetDictionary(&c_stream, | ||||||
|  | 			       (const Bytef*)dictionary, sizeof(dictionary)); | ||||||
|  |     CHECK_ERR(err, "deflateSetDictionary"); | ||||||
|  |  | ||||||
|  |     dictId = c_stream.adler; | ||||||
|  |     c_stream.next_out = compr; | ||||||
|  |     c_stream.avail_out = (uInt)comprLen; | ||||||
|  |  | ||||||
|  |     c_stream.next_in = (Bytef*)hello; | ||||||
|  |     c_stream.avail_in = (uInt)strlen(hello)+1; | ||||||
|  |  | ||||||
|  |     err = deflate(&c_stream, Z_FINISH); | ||||||
|  |     if (err != Z_STREAM_END) { | ||||||
|  |         fprintf(stderr, "deflate should report Z_STREAM_END\n"); | ||||||
|  |     } | ||||||
|  |     err = deflateEnd(&c_stream); | ||||||
|  |     CHECK_ERR(err, "deflateEnd"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Test inflate() with a preset dictionary | ||||||
|  |  */ | ||||||
|  | void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) | ||||||
|  |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen, uncomprLen; | ||||||
|  | { | ||||||
|  |     int err; | ||||||
|  |     z_stream d_stream; /* decompression stream */ | ||||||
|  |  | ||||||
|  |     strcpy((char*)uncompr, "garbage"); | ||||||
|  |  | ||||||
|  |     d_stream.zalloc = (alloc_func)0; | ||||||
|  |     d_stream.zfree = (free_func)0; | ||||||
|  |     d_stream.opaque = (voidpf)0; | ||||||
|  |  | ||||||
|  |     d_stream.next_in  = compr; | ||||||
|  |     d_stream.avail_in = (uInt)comprLen; | ||||||
|  |  | ||||||
|  |     err = inflateInit(&d_stream); | ||||||
|  |     CHECK_ERR(err, "inflateInit"); | ||||||
|  |  | ||||||
|  |     d_stream.next_out = uncompr; | ||||||
|  |     d_stream.avail_out = (uInt)uncomprLen; | ||||||
|  |  | ||||||
|  |     for (;;) { | ||||||
|  |         err = inflate(&d_stream, Z_NO_FLUSH); | ||||||
|  |         if (err == Z_STREAM_END) break; | ||||||
|  | 	if (err == Z_NEED_DICT) { | ||||||
|  | 	    if (d_stream.adler != dictId) { | ||||||
|  | 		fprintf(stderr, "unexpected dictionary"); | ||||||
|  | 		exit(1); | ||||||
|  | 	    } | ||||||
|  | 	    err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, | ||||||
|  | 				       sizeof(dictionary)); | ||||||
|  | 	} | ||||||
|  |         CHECK_ERR(err, "inflate with dict"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     err = inflateEnd(&d_stream); | ||||||
|  |     CHECK_ERR(err, "inflateEnd"); | ||||||
|  |  | ||||||
|  |     if (strcmp((char*)uncompr, hello)) { | ||||||
|  |         fprintf(stderr, "bad inflate with dict\n"); | ||||||
|  |     } else { | ||||||
|  |         printf("inflate with dictionary: %s\n", uncompr); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Usage:  example [output.gz  [input.gz]] |  * Usage:  example [output.gz  [input.gz]] | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| void main(argc, argv) | int main(argc, argv) | ||||||
|     int argc; |     int argc; | ||||||
|     char *argv[]; |     char *argv[]; | ||||||
| { | { | ||||||
|     local Byte compr[BUFLEN]; |     Byte *compr, *uncompr; | ||||||
|  |     uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ | ||||||
|  |     uLong uncomprLen = comprLen; | ||||||
|  |     static const char* myVersion = ZLIB_VERSION; | ||||||
|  |  | ||||||
|     if (zlib_version[0] != ZLIB_VERSION[0]) { |     if (zlibVersion()[0] != myVersion[0]) { | ||||||
| 	fprintf(stderr, "incompatible zlib version\n"); |         fprintf(stderr, "incompatible zlib version\n"); | ||||||
| 	exit(1); |         exit(1); | ||||||
|  |  | ||||||
|     } else if (strcmp(zlib_version, ZLIB_VERSION) != 0) { |     } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { | ||||||
| 	fprintf(stderr, "warning: different zlib version\n"); |         fprintf(stderr, "warning: different zlib version\n"); | ||||||
|     } |     } | ||||||
|     test_compress(); |  | ||||||
|  |     compr    = (Byte*)calloc((uInt)comprLen, 1); | ||||||
|  |     uncompr  = (Byte*)calloc((uInt)uncomprLen, 1); | ||||||
|  |     /* compr and uncompr are cleared to avoid reading uninitialized | ||||||
|  |      * data and to ensure that uncompr compresses well. | ||||||
|  |      */ | ||||||
|  |     if (compr == Z_NULL || uncompr == Z_NULL) { | ||||||
|  |         printf("out of memory\n"); | ||||||
|  | 	exit(1); | ||||||
|  |     } | ||||||
|  |     test_compress(compr, comprLen, uncompr, uncomprLen); | ||||||
|  |  | ||||||
|     test_gzio((argc > 1 ? argv[1] : "foo.gz"), |     test_gzio((argc > 1 ? argv[1] : "foo.gz"), | ||||||
| 	      (argc > 2 ? argv[2] : "foo.gz")); |               (argc > 2 ? argv[2] : "foo.gz"), | ||||||
|  | 	      uncompr, (int)uncomprLen); | ||||||
|  |  | ||||||
|     test_deflate(compr); |     test_deflate(compr, comprLen); | ||||||
|     test_inflate(compr); |     test_inflate(compr, comprLen, uncompr, uncomprLen); | ||||||
|  |  | ||||||
|     test_flush(compr); |     test_large_deflate(compr, comprLen, uncompr, uncomprLen); | ||||||
|     test_sync(compr); |     test_large_inflate(compr, comprLen, uncompr, uncomprLen); | ||||||
|  |  | ||||||
|  |     test_flush(compr, comprLen); | ||||||
|  |     test_sync(compr, comprLen, uncompr, uncomprLen); | ||||||
|  |  | ||||||
|  |     test_dict_deflate(compr, comprLen); | ||||||
|  |     test_dict_inflate(compr, comprLen, uncompr, uncomprLen); | ||||||
|  |  | ||||||
|     exit(0); |     exit(0); | ||||||
|  |     return 0; /* to avoid warning */ | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										358
									
								
								infblock.c
									
									
									
									
									
								
							
							
						
						
									
										358
									
								
								infblock.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* infblock.c -- interpret and process block types to last block | /* infblock.c -- interpret and process block types to last block | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -12,7 +12,7 @@ | |||||||
| struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
| /* Table for deflate from PKZIP's appnote.txt. */ | /* Table for deflate from PKZIP's appnote.txt. */ | ||||||
| local uInt border[] = {	/* Order of the bit length code lengths */ | local const uInt border[] = { /* Order of the bit length code lengths */ | ||||||
|         16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; |         16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -62,37 +62,41 @@ local uInt border[] = {	/* Order of the bit length code lengths */ | |||||||
|  |  | ||||||
|  |  | ||||||
| void inflate_blocks_reset(s, z, c) | void inflate_blocks_reset(s, z, c) | ||||||
| struct inflate_blocks_state *s; | inflate_blocks_statef *s; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| uLong *c; | uLongf *c; | ||||||
| { | { | ||||||
|   if (s->checkfn != Z_NULL) |   if (c != Z_NULL) | ||||||
|     *c = s->check; |     *c = s->check; | ||||||
|   if (s->mode == BTREE || s->mode == DTREE) |   if (s->mode == BTREE || s->mode == DTREE) | ||||||
|     ZFREE(z, s->sub.trees.blens); |     ZFREE(z, s->sub.trees.blens); | ||||||
|   if (s->mode == CODES) |   if (s->mode == CODES) | ||||||
|     inflate_codes_free(s->sub.codes, z); |   { | ||||||
|  |     inflate_codes_free(s->sub.decode.codes, z); | ||||||
|  |     inflate_trees_free(s->sub.decode.td, z); | ||||||
|  |     inflate_trees_free(s->sub.decode.tl, z); | ||||||
|  |   } | ||||||
|   s->mode = TYPE; |   s->mode = TYPE; | ||||||
|   s->bitk = 0; |   s->bitk = 0; | ||||||
|   s->bitb = 0; |   s->bitb = 0; | ||||||
|   s->read = s->write = s->window; |   s->read = s->write = s->window; | ||||||
|   if (s->checkfn != Z_NULL) |   if (s->checkfn != Z_NULL) | ||||||
|     s->check = (*s->checkfn)(0L, Z_NULL, 0); |     z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); | ||||||
|   Trace((stderr, "inflate:   blocks reset\n")); |   Trace((stderr, "inflate:   blocks reset\n")); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| struct inflate_blocks_state *inflate_blocks_new(z, c, w) | inflate_blocks_statef *inflate_blocks_new(z, c, w) | ||||||
| z_stream *z; | z_streamp z; | ||||||
| check_func c; | check_func c; | ||||||
| uInt w; | uInt w; | ||||||
| { | { | ||||||
|   struct inflate_blocks_state *s; |   inflate_blocks_statef *s; | ||||||
|  |  | ||||||
|   if ((s = (struct inflate_blocks_state *)ZALLOC |   if ((s = (inflate_blocks_statef *)ZALLOC | ||||||
|        (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) |        (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) | ||||||
|     return s; |     return s; | ||||||
|   if ((s->window = (Byte *)ZALLOC(z, 1, w)) == Z_NULL) |   if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) | ||||||
|   { |   { | ||||||
|     ZFREE(z, s); |     ZFREE(z, s); | ||||||
|     return Z_NULL; |     return Z_NULL; | ||||||
| @@ -101,23 +105,26 @@ uInt w; | |||||||
|   s->checkfn = c; |   s->checkfn = c; | ||||||
|   s->mode = TYPE; |   s->mode = TYPE; | ||||||
|   Trace((stderr, "inflate:   blocks allocated\n")); |   Trace((stderr, "inflate:   blocks allocated\n")); | ||||||
|   inflate_blocks_reset(s, z, &s->check); |   inflate_blocks_reset(s, z, Z_NULL); | ||||||
|   return s; |   return s; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  |   extern uInt inflate_hufts; | ||||||
|  | #endif | ||||||
| int inflate_blocks(s, z, r) | int inflate_blocks(s, z, r) | ||||||
| struct inflate_blocks_state *s; | inflate_blocks_statef *s; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| int r; | int r; | ||||||
| { | { | ||||||
|   uInt t;		/* temporary storage */ |   uInt t;               /* temporary storage */ | ||||||
|   uLong b;		/* bit buffer */ |   uLong b;              /* bit buffer */ | ||||||
|   uInt k;		/* bits in bit buffer */ |   uInt k;               /* bits in bit buffer */ | ||||||
|   Byte *p;		/* input data pointer */ |   Bytef *p;             /* input data pointer */ | ||||||
|   uInt n;		/* bytes available there */ |   uInt n;               /* bytes available there */ | ||||||
|   Byte *q;		/* output window write pointer */ |   Bytef *q;             /* output window write pointer */ | ||||||
|   uInt m;		/* bytes to end of window or read pointer */ |   uInt m;               /* bytes to end of window or read pointer */ | ||||||
|  |  | ||||||
|   /* copy input/output information to locals (UPDATE macro restores) */ |   /* copy input/output information to locals (UPDATE macro restores) */ | ||||||
|   LOAD |   LOAD | ||||||
| @@ -131,69 +138,77 @@ int r; | |||||||
|       s->last = t & 1; |       s->last = t & 1; | ||||||
|       switch (t >> 1) |       switch (t >> 1) | ||||||
|       { |       { | ||||||
|         case 0:				/* stored */ |         case 0:                         /* stored */ | ||||||
| 	  Trace((stderr, "inflate:     stored block%s\n", |           Trace((stderr, "inflate:     stored block%s\n", | ||||||
| 		 s->last ? " (last)" : "")); |                  s->last ? " (last)" : "")); | ||||||
| 	  DUMPBITS(3) |           DUMPBITS(3) | ||||||
| 	  t = k & 7;			/* go to byte boundary */ |           t = k & 7;                    /* go to byte boundary */ | ||||||
| 	  DUMPBITS(t) |           DUMPBITS(t) | ||||||
| 	  s->mode = LENS;		/* get length of stored block */ |           s->mode = LENS;               /* get length of stored block */ | ||||||
| 	  break; |           break; | ||||||
| 	case 1:				/* fixed */ |         case 1:                         /* fixed */ | ||||||
| 	  Trace((stderr, "inflate:     fixed codes block%s\n", |           Trace((stderr, "inflate:     fixed codes block%s\n", | ||||||
| 		 s->last ? " (last)" : "")); |                  s->last ? " (last)" : "")); | ||||||
| 	  { |           { | ||||||
| 	    uInt bl, bd; |             uInt bl, bd; | ||||||
| 	    inflate_huft *tl, *td; |             inflate_huft *tl, *td; | ||||||
|  |  | ||||||
| 	    inflate_trees_fixed(&bl, &bd, &tl, &td); |             inflate_trees_fixed(&bl, &bd, &tl, &td); | ||||||
| 	    s->sub.codes = inflate_codes_new(bl, bd, tl, td, z); |             s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); | ||||||
| 	    if (s->sub.codes == Z_NULL) |             if (s->sub.decode.codes == Z_NULL) | ||||||
| 	    { |             { | ||||||
| 	      r = Z_MEM_ERROR; |               r = Z_MEM_ERROR; | ||||||
| 	      LEAVE |               LEAVE | ||||||
| 	    } |             } | ||||||
| 	  } |             s->sub.decode.tl = Z_NULL;  /* don't try to free these */ | ||||||
| 	  DUMPBITS(3) |             s->sub.decode.td = Z_NULL; | ||||||
| 	  s->mode = CODES; |           } | ||||||
| 	  break; |           DUMPBITS(3) | ||||||
| 	case 2:				/* dynamic */ |           s->mode = CODES; | ||||||
| 	  Trace((stderr, "inflate:     dynamic codes block%s\n", |           break; | ||||||
| 		 s->last ? " (last)" : "")); |         case 2:                         /* dynamic */ | ||||||
| 	  DUMPBITS(3) |           Trace((stderr, "inflate:     dynamic codes block%s\n", | ||||||
| 	  s->mode = TABLE; |                  s->last ? " (last)" : "")); | ||||||
| 	  break; |           DUMPBITS(3) | ||||||
| 	case 3:				/* illegal */ |           s->mode = TABLE; | ||||||
| 	  DUMPBITS(3) |           break; | ||||||
| 	  s->mode = BAD; |         case 3:                         /* illegal */ | ||||||
| 	  z->msg = "invalid block type"; |           DUMPBITS(3) | ||||||
| 	  r = Z_DATA_ERROR; |           s->mode = BAD; | ||||||
| 	  LEAVE |           z->msg = (char*)"invalid block type"; | ||||||
|  |           r = Z_DATA_ERROR; | ||||||
|  |           LEAVE | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
|     case LENS: |     case LENS: | ||||||
|       NEEDBITS(32) |       NEEDBITS(32) | ||||||
|       if ((~b) >> 16 != (b & 0xffff)) |       if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) | ||||||
|       { |       { | ||||||
|         s->mode = BAD; |         s->mode = BAD; | ||||||
| 	z->msg = "invalid stored block lengths"; |         z->msg = (char*)"invalid stored block lengths"; | ||||||
| 	r = Z_DATA_ERROR; |         r = Z_DATA_ERROR; | ||||||
| 	LEAVE |         LEAVE | ||||||
|       } |       } | ||||||
|       k = 0;				/* dump bits */ |  | ||||||
|       s->sub.left = (uInt)b & 0xffff; |       s->sub.left = (uInt)b & 0xffff; | ||||||
|  |       b = k = 0;                      /* dump bits */ | ||||||
|       Tracev((stderr, "inflate:       stored length %u\n", s->sub.left)); |       Tracev((stderr, "inflate:       stored length %u\n", s->sub.left)); | ||||||
|       s->mode = s->sub.left ? STORED : TYPE; |       s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); | ||||||
|       break; |       break; | ||||||
|     case STORED: |     case STORED: | ||||||
|       do { |       if (n == 0) | ||||||
|         NEEDBYTE |         LEAVE | ||||||
| 	NEEDOUT |       NEEDOUT | ||||||
| 	OUTBYTE(NEXTBYTE) |       t = s->sub.left; | ||||||
|       } while (--s->sub.left); |       if (t > n) t = n; | ||||||
|  |       if (t > m) t = m; | ||||||
|  |       zmemcpy(q, p, t); | ||||||
|  |       p += t;  n -= t; | ||||||
|  |       q += t;  m -= t; | ||||||
|  |       if ((s->sub.left -= t) != 0) | ||||||
|  |         break; | ||||||
|       Tracev((stderr, "inflate:       stored end, %lu total out\n", |       Tracev((stderr, "inflate:       stored end, %lu total out\n", | ||||||
| 	      z->total_out + (q >= s->read ? q - s->read : |               z->total_out + (q >= s->read ? q - s->read : | ||||||
| 	      (s->end - s->read) + (q - s->window)))); |               (s->end - s->read) + (q - s->window)))); | ||||||
|       s->mode = s->last ? DRY : TYPE; |       s->mode = s->last ? DRY : TYPE; | ||||||
|       break; |       break; | ||||||
|     case TABLE: |     case TABLE: | ||||||
| @@ -203,18 +218,16 @@ int r; | |||||||
|       if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) |       if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) | ||||||
|       { |       { | ||||||
|         s->mode = BAD; |         s->mode = BAD; | ||||||
|         z->msg = "too many length or distance symbols"; |         z->msg = (char*)"too many length or distance symbols"; | ||||||
| 	r = Z_DATA_ERROR; |         r = Z_DATA_ERROR; | ||||||
| 	LEAVE |         LEAVE | ||||||
|       } |       } | ||||||
| #endif | #endif | ||||||
|       t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); |       t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); | ||||||
|       if (t < 19) |       if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) | ||||||
|         t = 19; |  | ||||||
|       if ((s->sub.trees.blens = (uInt*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) |  | ||||||
|       { |       { | ||||||
|         r = Z_MEM_ERROR; |         r = Z_MEM_ERROR; | ||||||
| 	LEAVE |         LEAVE | ||||||
|       } |       } | ||||||
|       DUMPBITS(14) |       DUMPBITS(14) | ||||||
|       s->sub.trees.index = 0; |       s->sub.trees.index = 0; | ||||||
| @@ -224,118 +237,129 @@ int r; | |||||||
|       while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) |       while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) | ||||||
|       { |       { | ||||||
|         NEEDBITS(3) |         NEEDBITS(3) | ||||||
| 	s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; |         s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; | ||||||
| 	DUMPBITS(3) |         DUMPBITS(3) | ||||||
|       } |       } | ||||||
|       while (s->sub.trees.index < 19) |       while (s->sub.trees.index < 19) | ||||||
|         s->sub.trees.blens[border[s->sub.trees.index++]] = 0; |         s->sub.trees.blens[border[s->sub.trees.index++]] = 0; | ||||||
|       s->sub.trees.bb = 7; |       s->sub.trees.bb = 7; | ||||||
|       t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, |       t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, | ||||||
| 			     &s->sub.trees.tb, z); |                              &s->sub.trees.tb, z); | ||||||
|       if (t != Z_OK) |       if (t != Z_OK) | ||||||
|       { |       { | ||||||
|  |         ZFREE(z, s->sub.trees.blens); | ||||||
|         r = t; |         r = t; | ||||||
| 	if (r == Z_DATA_ERROR) |         if (r == Z_DATA_ERROR) | ||||||
| 	  s->mode = BAD; |           s->mode = BAD; | ||||||
| 	LEAVE |         LEAVE | ||||||
|       } |       } | ||||||
|       s->sub.trees.index = 0; |       s->sub.trees.index = 0; | ||||||
|       Tracev((stderr, "inflate:       bits tree ok\n")); |       Tracev((stderr, "inflate:       bits tree ok\n")); | ||||||
|       s->mode = DTREE; |       s->mode = DTREE; | ||||||
|     case DTREE: |     case DTREE: | ||||||
|       while (t = s->sub.trees.table, |       while (t = s->sub.trees.table, | ||||||
|       	     s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) |              s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) | ||||||
|       { |       { | ||||||
|         inflate_huft *h; |         inflate_huft *h; | ||||||
| 	uInt i, j, c; |         uInt i, j, c; | ||||||
|  |  | ||||||
|         t = s->sub.trees.bb; |         t = s->sub.trees.bb; | ||||||
|         NEEDBITS(t) |         NEEDBITS(t) | ||||||
| 	h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); |         h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); | ||||||
| 	t = h->word.what.Bits; |         t = h->word.what.Bits; | ||||||
| 	c = h->more.Base; |         c = h->more.Base; | ||||||
| 	if (c < 16) |         if (c < 16) | ||||||
| 	{ |         { | ||||||
| 	  DUMPBITS(t) |           DUMPBITS(t) | ||||||
| 	  s->sub.trees.blens[s->sub.trees.index++] = c; |           s->sub.trees.blens[s->sub.trees.index++] = c; | ||||||
| 	} |         } | ||||||
| 	else /* c == 16..18 */ |         else /* c == 16..18 */ | ||||||
| 	{ |         { | ||||||
| 	  i = c == 18 ? 7 : c - 14; |           i = c == 18 ? 7 : c - 14; | ||||||
| 	  j = c == 18 ? 11 : 3; |           j = c == 18 ? 11 : 3; | ||||||
| 	  NEEDBITS(t + i) |           NEEDBITS(t + i) | ||||||
| 	  DUMPBITS(t) |           DUMPBITS(t) | ||||||
| 	  j += (uInt)b & inflate_mask[i]; |           j += (uInt)b & inflate_mask[i]; | ||||||
| 	  DUMPBITS(i) |           DUMPBITS(i) | ||||||
| 	  i = s->sub.trees.index; |           i = s->sub.trees.index; | ||||||
| 	  t = s->sub.trees.table; |           t = s->sub.trees.table; | ||||||
| 	  if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || |           if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || | ||||||
| 	      (c == 16 && i < 1)) |               (c == 16 && i < 1)) | ||||||
| 	  { |           { | ||||||
| 	    s->mode = BAD; |             inflate_trees_free(s->sub.trees.tb, z); | ||||||
| 	    z->msg = "invalid bit length repeat"; |             ZFREE(z, s->sub.trees.blens); | ||||||
| 	    r = Z_DATA_ERROR; |             s->mode = BAD; | ||||||
| 	    LEAVE |             z->msg = (char*)"invalid bit length repeat"; | ||||||
| 	  } |             r = Z_DATA_ERROR; | ||||||
| 	  c = c == 16 ? s->sub.trees.blens[i - 1] : 0; |             LEAVE | ||||||
| 	  do { |           } | ||||||
| 	    s->sub.trees.blens[i++] = c; |           c = c == 16 ? s->sub.trees.blens[i - 1] : 0; | ||||||
| 	  } while (--j); |           do { | ||||||
| 	  s->sub.trees.index = i; |             s->sub.trees.blens[i++] = c; | ||||||
| 	} |           } while (--j); | ||||||
|  |           s->sub.trees.index = i; | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|       inflate_trees_free(s->sub.trees.tb, z); |       inflate_trees_free(s->sub.trees.tb, z); | ||||||
|       s->sub.trees.tb = Z_NULL; |       s->sub.trees.tb = Z_NULL; | ||||||
|       { |       { | ||||||
| 	uInt bl, bd; |         uInt bl, bd; | ||||||
| 	inflate_huft *tl, *td; |         inflate_huft *tl, *td; | ||||||
| 	struct inflate_codes_state *c; |         inflate_codes_statef *c; | ||||||
|  |  | ||||||
| 	bl = 9; |         bl = 9;         /* must be <= 9 for lookahead assumptions */ | ||||||
| 	bd = 6; |         bd = 6;         /* must be <= 9 for lookahead assumptions */ | ||||||
| 	t = s->sub.trees.table; |         t = s->sub.trees.table; | ||||||
| 	t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), | #ifdef DEBUG | ||||||
| 				  s->sub.trees.blens, &bl, &bd, &tl, &td, z); |       inflate_hufts = 0; | ||||||
| 	if (t != Z_OK) | #endif | ||||||
| 	{ |         t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), | ||||||
| 	  if (t == (uInt)Z_DATA_ERROR) |                                   s->sub.trees.blens, &bl, &bd, &tl, &td, z); | ||||||
| 	    s->mode = BAD; |         ZFREE(z, s->sub.trees.blens); | ||||||
| 	  r = t; |         if (t != Z_OK) | ||||||
| 	  LEAVE |         { | ||||||
| 	} |           if (t == (uInt)Z_DATA_ERROR) | ||||||
|         Tracev((stderr, "inflate:       trees ok\n")); |             s->mode = BAD; | ||||||
| 	if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) |           r = t; | ||||||
| 	{ |           LEAVE | ||||||
| 	  inflate_trees_free(td, z); |         } | ||||||
| 	  inflate_trees_free(tl, z); |         Tracev((stderr, "inflate:       trees ok, %d * %d bytes used\n", | ||||||
| 	  r = Z_MEM_ERROR; |               inflate_hufts, sizeof(inflate_huft))); | ||||||
| 	  LEAVE |         if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) | ||||||
| 	} |         { | ||||||
| 	ZFREE(z, s->sub.trees.blens); |           inflate_trees_free(td, z); | ||||||
| 	s->sub.codes = c; |           inflate_trees_free(tl, z); | ||||||
|  |           r = Z_MEM_ERROR; | ||||||
|  |           LEAVE | ||||||
|  |         } | ||||||
|  |         s->sub.decode.codes = c; | ||||||
|  |         s->sub.decode.tl = tl; | ||||||
|  |         s->sub.decode.td = td; | ||||||
|       } |       } | ||||||
|       s->mode = CODES; |       s->mode = CODES; | ||||||
|     case CODES: |     case CODES: | ||||||
|       UPDATE |       UPDATE | ||||||
|       if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) |       if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) | ||||||
| 	return inflate_flush(s, z, r); |         return inflate_flush(s, z, r); | ||||||
|       r = Z_OK; |       r = Z_OK; | ||||||
|       inflate_codes_free(s->sub.codes, z); |       inflate_codes_free(s->sub.decode.codes, z); | ||||||
|  |       inflate_trees_free(s->sub.decode.td, z); | ||||||
|  |       inflate_trees_free(s->sub.decode.tl, z); | ||||||
|       LOAD |       LOAD | ||||||
|       Tracev((stderr, "inflate:       codes end, %lu total out\n", |       Tracev((stderr, "inflate:       codes end, %lu total out\n", | ||||||
| 	      z->total_out + (q >= s->read ? q - s->read : |               z->total_out + (q >= s->read ? q - s->read : | ||||||
| 	      (s->end - s->read) + (q - s->window)))); |               (s->end - s->read) + (q - s->window)))); | ||||||
|       if (!s->last) |       if (!s->last) | ||||||
|       { |       { | ||||||
|         s->mode = TYPE; |         s->mode = TYPE; | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       if (k > 7)              /* return unused byte, if any */ |       if (k > 7)              /* return unused byte, if any */ | ||||||
|       { |       { | ||||||
|         Assert(k < 16, "inflate_codes grabbed too many bytes") |         Assert(k < 16, "inflate_codes grabbed too many bytes") | ||||||
|         k -= 8; |         k -= 8; | ||||||
| 	n++; |         n++; | ||||||
| 	p--;                    /* can always return one */ |         p--;                    /* can always return one */ | ||||||
|       } |       } | ||||||
|       s->mode = DRY; |       s->mode = DRY; | ||||||
|     case DRY: |     case DRY: | ||||||
| @@ -356,14 +380,34 @@ int r; | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_blocks_free(s, z, c) | int inflate_blocks_free(s, z) | ||||||
| struct inflate_blocks_state *s; | inflate_blocks_statef *s; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| uLong *c; |  | ||||||
| { | { | ||||||
|   inflate_blocks_reset(s, z, c); |   inflate_blocks_reset(s, z, Z_NULL); | ||||||
|   ZFREE(z, s->window); |   ZFREE(z, s->window); | ||||||
|   ZFREE(z, s); |   ZFREE(z, s); | ||||||
|   Trace((stderr, "inflate:   blocks freed\n")); |   Trace((stderr, "inflate:   blocks freed\n")); | ||||||
|   return Z_OK; |   return Z_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void inflate_set_dictionary(s, d, n) | ||||||
|  | inflate_blocks_statef *s; | ||||||
|  | const Bytef *d; | ||||||
|  | uInt  n; | ||||||
|  | { | ||||||
|  |   zmemcpy((charf *)s->window, d, n); | ||||||
|  |   s->read = s->write = s->window + n; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Returns true if inflate is currently at the end of a block generated | ||||||
|  |  * by Z_SYNC_FLUSH or Z_FULL_FLUSH.  | ||||||
|  |  * IN assertion: s != Z_NULL | ||||||
|  |  */ | ||||||
|  | int inflate_blocks_sync_point(s) | ||||||
|  | inflate_blocks_statef *s; | ||||||
|  | { | ||||||
|  |   return s->mode == LENS; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								infblock.h
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								infblock.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* infblock.h -- header to use infblock.c | /* infblock.h -- header to use infblock.c | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -9,23 +9,31 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| struct inflate_blocks_state; | struct inflate_blocks_state; | ||||||
|  | typedef struct inflate_blocks_state FAR inflate_blocks_statef; | ||||||
|  |  | ||||||
| extern struct inflate_blocks_state * inflate_blocks_new __P(( | extern inflate_blocks_statef * inflate_blocks_new OF(( | ||||||
|     z_stream *, |     z_streamp z, | ||||||
|     check_func,                 /* check function */ |     check_func c,               /* check function */ | ||||||
|     uInt));                     /* window size */ |     uInt w));                   /* window size */ | ||||||
|  |  | ||||||
| extern int inflate_blocks __P(( | extern int inflate_blocks OF(( | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *, |     z_streamp , | ||||||
|     int));			/* initial return code */ |     int));                      /* initial return code */ | ||||||
|  |  | ||||||
| extern void inflate_blocks_reset __P(( | extern void inflate_blocks_reset OF(( | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *, |     z_streamp , | ||||||
|     uLong *));                  /* check value on output */ |     uLongf *));                  /* check value on output */ | ||||||
|  |  | ||||||
| extern int inflate_blocks_free __P(( | extern int inflate_blocks_free OF(( | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *, |     z_streamp)); | ||||||
|     uLong *));                  /* check value on output */ |  | ||||||
|  | extern void inflate_set_dictionary OF(( | ||||||
|  |     inflate_blocks_statef *s, | ||||||
|  |     const Bytef *d,  /* dictionary */ | ||||||
|  |     uInt  n));       /* dictionary length */ | ||||||
|  |  | ||||||
|  | extern int inflate_blocks_sync_point OF(( | ||||||
|  |     inflate_blocks_statef *s)); | ||||||
|   | |||||||
							
								
								
									
										242
									
								
								infcodes.c
									
									
									
									
									
								
							
							
						
						
									
										242
									
								
								infcodes.c
									
									
									
									
									
								
							| @@ -1,13 +1,14 @@ | |||||||
| /* infcodes.c -- process literals and length/distance pairs | /* infcodes.c -- process literals and length/distance pairs | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
| #include "inftrees.h" | #include "inftrees.h" | ||||||
|  | #include "infblock.h" | ||||||
|  | #include "infcodes.h" | ||||||
| #include "infutil.h" | #include "infutil.h" | ||||||
| #include "inffast.h" | #include "inffast.h" | ||||||
| #include "infcodes.h" |  | ||||||
|  |  | ||||||
| /* simplify the use of the inflate_huft type with some defines */ | /* simplify the use of the inflate_huft type with some defines */ | ||||||
| #define base more.Base | #define base more.Base | ||||||
| @@ -15,54 +16,57 @@ | |||||||
| #define exop word.what.Exop | #define exop word.what.Exop | ||||||
| #define bits word.what.Bits | #define bits word.what.Bits | ||||||
|  |  | ||||||
|  | typedef enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||||||
|  |       START,    /* x: set up for LEN */ | ||||||
|  |       LEN,      /* i: get length/literal/eob next */ | ||||||
|  |       LENEXT,   /* i: getting length extra (have base) */ | ||||||
|  |       DIST,     /* i: get distance next */ | ||||||
|  |       DISTEXT,  /* i: getting distance extra */ | ||||||
|  |       COPY,     /* o: copying bytes in window, waiting for space */ | ||||||
|  |       LIT,      /* o: got literal, waiting for output space */ | ||||||
|  |       WASH,     /* o: got eob, possibly still output waiting */ | ||||||
|  |       END,      /* x: got eob and all data flushed */ | ||||||
|  |       BADCODE}  /* x: got error */ | ||||||
|  | inflate_codes_mode; | ||||||
|  |  | ||||||
| /* inflate codes private state */ | /* inflate codes private state */ | ||||||
| struct inflate_codes_state { | struct inflate_codes_state { | ||||||
|  |  | ||||||
|   /* mode */ |   /* mode */ | ||||||
|   enum {	/* waiting for "i:"=input, "o:"=output, "x:"=nothing */ |   inflate_codes_mode mode;      /* current inflate_codes mode */ | ||||||
|       START,	/* x: set up for LEN */ |  | ||||||
|       LEN,	/* i: get length/literal/eob next */ |  | ||||||
|       LENEXT,	/* i: getting length extra (have base) */ |  | ||||||
|       DIST,	/* i: get distance next */ |  | ||||||
|       DISTEXT,	/* i: getting distance extra */ |  | ||||||
|       COPY,	/* o: copying bytes in window, waiting for space */ |  | ||||||
|       LIT,	/* o: got literal, waiting for output space */ |  | ||||||
|       WASH,	/* o: got eob, possibly still output waiting */ |  | ||||||
|       END,	/* x: got eob and all data flushed */ |  | ||||||
|       BADCODE}	/* x: got error */ |  | ||||||
|     mode;		/* current inflate_codes mode */ |  | ||||||
|  |  | ||||||
|   /* mode dependent information */ |   /* mode dependent information */ | ||||||
|   uInt len; |   uInt len; | ||||||
|   union { |   union { | ||||||
|     struct { |     struct { | ||||||
|       inflate_huft *tree;	/* pointer into tree */ |       inflate_huft *tree;       /* pointer into tree */ | ||||||
|       uInt need;		/* bits needed */ |       uInt need;                /* bits needed */ | ||||||
|     } code;		/* if LEN or DIST, where in tree */ |     } code;             /* if LEN or DIST, where in tree */ | ||||||
|     uInt lit;		/* if LIT, literal */ |     uInt lit;           /* if LIT, literal */ | ||||||
|     struct { |     struct { | ||||||
|       uInt get;			/* bits to get for extra */ |       uInt get;                 /* bits to get for extra */ | ||||||
|       uInt dist;		/* distance back to copy from */ |       uInt dist;                /* distance back to copy from */ | ||||||
|     } copy;		/* if EXT or COPY, where and how much */ |     } copy;             /* if EXT or COPY, where and how much */ | ||||||
|   } sub;		/* submode */ |   } sub;                /* submode */ | ||||||
|  |  | ||||||
|   /* mode independent information */ |   /* mode independent information */ | ||||||
|   Byte lbits;		/* ltree bits decoded per branch */ |   Byte lbits;           /* ltree bits decoded per branch */ | ||||||
|   Byte dbits;		/* dtree bits decoder per branch */ |   Byte dbits;           /* dtree bits decoder per branch */ | ||||||
|   inflate_huft *ltree;		/* literal/length/eob tree */ |   inflate_huft *ltree;          /* literal/length/eob tree */ | ||||||
|   inflate_huft *dtree;		/* distance tree */ |   inflate_huft *dtree;          /* distance tree */ | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| struct inflate_codes_state *inflate_codes_new(bl, bd, tl, td, z) | inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) | ||||||
| uInt bl, bd; | uInt bl, bd; | ||||||
| inflate_huft *tl, *td; | inflate_huft *tl; | ||||||
| z_stream *z; | inflate_huft *td; /* need separate declaration for Borland C++ */ | ||||||
|  | z_streamp z; | ||||||
| { | { | ||||||
|   struct inflate_codes_state *c; |   inflate_codes_statef *c; | ||||||
|  |  | ||||||
|   if ((c = (struct inflate_codes_state *) |   if ((c = (inflate_codes_statef *) | ||||||
|        ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) |        ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) | ||||||
|   { |   { | ||||||
|     c->mode = START; |     c->mode = START; | ||||||
| @@ -77,83 +81,84 @@ z_stream *z; | |||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_codes(s, z, r) | int inflate_codes(s, z, r) | ||||||
| struct inflate_blocks_state *s; | inflate_blocks_statef *s; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| int r; | int r; | ||||||
| { | { | ||||||
|   uInt j;		/* temporary storage */ |   uInt j;               /* temporary storage */ | ||||||
|   inflate_huft *t;	/* temporary pointer */ |   inflate_huft *t;      /* temporary pointer */ | ||||||
|   int e;		/* extra bits or operation */ |   uInt e;               /* extra bits or operation */ | ||||||
|   uLong b;		/* bit buffer */ |   uLong b;              /* bit buffer */ | ||||||
|   uInt k;		/* bits in bit buffer */ |   uInt k;               /* bits in bit buffer */ | ||||||
|   Byte *p;		/* input data pointer */ |   Bytef *p;             /* input data pointer */ | ||||||
|   uInt n;		/* bytes available there */ |   uInt n;               /* bytes available there */ | ||||||
|   Byte *q;		/* output window write pointer */ |   Bytef *q;             /* output window write pointer */ | ||||||
|   uInt m;		/* bytes to end of window or read pointer */ |   uInt m;               /* bytes to end of window or read pointer */ | ||||||
|   Byte *f;		/* pointer to copy strings from */ |   Bytef *f;             /* pointer to copy strings from */ | ||||||
|   struct inflate_codes_state *c = s->sub.codes;	/* codes state */ |   inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */ | ||||||
|  |  | ||||||
|   /* copy input/output information to locals (UPDATE macro restores) */ |   /* copy input/output information to locals (UPDATE macro restores) */ | ||||||
|   LOAD |   LOAD | ||||||
|  |  | ||||||
|   /* process input and output based on current state */ |   /* process input and output based on current state */ | ||||||
|   while (1) switch (c->mode) |   while (1) switch (c->mode) | ||||||
|   {		/* waiting for "i:"=input, "o:"=output, "x:"=nothing */ |   {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ | ||||||
|     case START:		/* x: set up for LEN */ |     case START:         /* x: set up for LEN */ | ||||||
| #ifndef SLOW | #ifndef SLOW | ||||||
|       if (m >= 258 && n >= 10) |       if (m >= 258 && n >= 10) | ||||||
|       { |       { | ||||||
|         UPDATE |         UPDATE | ||||||
| 	r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); |         r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); | ||||||
| 	LOAD |         LOAD | ||||||
| 	if (r != Z_OK) |         if (r != Z_OK) | ||||||
| 	{ |         { | ||||||
| 	  c->mode = r == Z_STREAM_END ? WASH : BADCODE; |           c->mode = r == Z_STREAM_END ? WASH : BADCODE; | ||||||
| 	  break; |           break; | ||||||
| 	} |         } | ||||||
|       } |       } | ||||||
| #endif /* !SLOW */ | #endif /* !SLOW */ | ||||||
|       c->sub.code.need = c->lbits; |       c->sub.code.need = c->lbits; | ||||||
|       c->sub.code.tree = c->ltree; |       c->sub.code.tree = c->ltree; | ||||||
|       c->mode = LEN; |       c->mode = LEN; | ||||||
|     case LEN:		/* i: get length/literal/eob next */ |     case LEN:           /* i: get length/literal/eob next */ | ||||||
|       j = c->sub.code.need; |       j = c->sub.code.need; | ||||||
|       NEEDBITS(j) |       NEEDBITS(j) | ||||||
|       t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); |       t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); | ||||||
|       DUMPBITS(t->bits) |       DUMPBITS(t->bits) | ||||||
|       if ((e = (int)(t->exop)) < 0) |       e = (uInt)(t->exop); | ||||||
|  |       if (e == 0)               /* literal */ | ||||||
|       { |       { | ||||||
|         if (e == -128)		/* invalid code */ |         c->sub.lit = t->base; | ||||||
| 	{ |         Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? | ||||||
| 	  c->mode = BADCODE; |                  "inflate:         literal '%c'\n" : | ||||||
| 	  z->msg = "invalid literal/length code"; |                  "inflate:         literal 0x%02x\n", t->base)); | ||||||
| 	  r = Z_DATA_ERROR; |         c->mode = LIT; | ||||||
| 	  LEAVE |         break; | ||||||
| 	} |  | ||||||
| 	e = -e; |  | ||||||
| 	if (e & 64)		/* end of block */ |  | ||||||
| 	{ |  | ||||||
| 	  Tracevv((stderr, "inflate:         end of block\n")); |  | ||||||
| 	  c->mode = WASH; |  | ||||||
| 	  break; |  | ||||||
| 	} |  | ||||||
| 	c->sub.code.need = e; |  | ||||||
| 	c->sub.code.tree = t->next; |  | ||||||
| 	break; |  | ||||||
|       } |       } | ||||||
|       if (e & 16)		/* literal */ |       if (e & 16)               /* length */ | ||||||
|       { |       { | ||||||
| 	c->sub.lit = t->base; |         c->sub.copy.get = e & 15; | ||||||
| 	Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? |         c->len = t->base; | ||||||
| 		 "inflate:         literal '%c'\n" : |         c->mode = LENEXT; | ||||||
| 		 "inflate:         literal 0x%02x\n", t->base)); |         break; | ||||||
| 	c->mode = LIT; |  | ||||||
| 	break; |  | ||||||
|       } |       } | ||||||
|       c->sub.copy.get = e; |       if ((e & 64) == 0)        /* next table */ | ||||||
|       c->len = t->base; |       { | ||||||
|       c->mode = LENEXT; |         c->sub.code.need = e; | ||||||
|     case LENEXT:	/* i: getting length extra (have base) */ |         c->sub.code.tree = t->next; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       if (e & 32)               /* end of block */ | ||||||
|  |       { | ||||||
|  |         Tracevv((stderr, "inflate:         end of block\n")); | ||||||
|  |         c->mode = WASH; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       c->mode = BADCODE;        /* invalid code */ | ||||||
|  |       z->msg = (char*)"invalid literal/length code"; | ||||||
|  |       r = Z_DATA_ERROR; | ||||||
|  |       LEAVE | ||||||
|  |     case LENEXT:        /* i: getting length extra (have base) */ | ||||||
|       j = c->sub.copy.get; |       j = c->sub.copy.get; | ||||||
|       NEEDBITS(j) |       NEEDBITS(j) | ||||||
|       c->len += (uInt)b & inflate_mask[j]; |       c->len += (uInt)b & inflate_mask[j]; | ||||||
| @@ -162,54 +167,62 @@ int r; | |||||||
|       c->sub.code.tree = c->dtree; |       c->sub.code.tree = c->dtree; | ||||||
|       Tracevv((stderr, "inflate:         length %u\n", c->len)); |       Tracevv((stderr, "inflate:         length %u\n", c->len)); | ||||||
|       c->mode = DIST; |       c->mode = DIST; | ||||||
|     case DIST:		/* i: get distance next */ |     case DIST:          /* i: get distance next */ | ||||||
|       j = c->sub.code.need; |       j = c->sub.code.need; | ||||||
|       NEEDBITS(j) |       NEEDBITS(j) | ||||||
|       t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); |       t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); | ||||||
|       DUMPBITS(t->bits) |       DUMPBITS(t->bits) | ||||||
|       if ((e = (int)(t->exop)) < 0) |       e = (uInt)(t->exop); | ||||||
|  |       if (e & 16)               /* distance */ | ||||||
|       { |       { | ||||||
|         if (e == -128) |         c->sub.copy.get = e & 15; | ||||||
| 	{ |         c->sub.copy.dist = t->base; | ||||||
| 	  c->mode = BADCODE; |         c->mode = DISTEXT; | ||||||
| 	  z->msg = "invalid distance code"; |         break; | ||||||
| 	  r = Z_DATA_ERROR; |  | ||||||
| 	  LEAVE |  | ||||||
| 	} |  | ||||||
| 	c->sub.code.need = -e; |  | ||||||
| 	c->sub.code.tree = t->next; |  | ||||||
| 	break; |  | ||||||
|       } |       } | ||||||
|       c->sub.copy.dist = t->base; |       if ((e & 64) == 0)        /* next table */ | ||||||
|       c->sub.copy.get = e; |       { | ||||||
|       c->mode = DISTEXT; |         c->sub.code.need = e; | ||||||
|     case DISTEXT:	/* i: getting distance extra */ |         c->sub.code.tree = t->next; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       c->mode = BADCODE;        /* invalid code */ | ||||||
|  |       z->msg = (char*)"invalid distance code"; | ||||||
|  |       r = Z_DATA_ERROR; | ||||||
|  |       LEAVE | ||||||
|  |     case DISTEXT:       /* i: getting distance extra */ | ||||||
|       j = c->sub.copy.get; |       j = c->sub.copy.get; | ||||||
|       NEEDBITS(j) |       NEEDBITS(j) | ||||||
|       c->sub.copy.dist += (uInt)b & inflate_mask[j]; |       c->sub.copy.dist += (uInt)b & inflate_mask[j]; | ||||||
|       DUMPBITS(j) |       DUMPBITS(j) | ||||||
|       Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist)); |       Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist)); | ||||||
|       c->mode = COPY; |       c->mode = COPY; | ||||||
|     case COPY:		/* o: copying bytes in window, waiting for space */ |     case COPY:          /* o: copying bytes in window, waiting for space */ | ||||||
|  | #ifndef __TURBOC__ /* Turbo C bug for following expression */ | ||||||
|       f = (uInt)(q - s->window) < c->sub.copy.dist ? |       f = (uInt)(q - s->window) < c->sub.copy.dist ? | ||||||
| 	  s->end - (c->sub.copy.dist - (q - s->window)) : |           s->end - (c->sub.copy.dist - (q - s->window)) : | ||||||
| 	  q - c->sub.copy.dist; |           q - c->sub.copy.dist; | ||||||
|  | #else | ||||||
|  |       f = q - c->sub.copy.dist; | ||||||
|  |       if ((uInt)(q - s->window) < c->sub.copy.dist) | ||||||
|  |         f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); | ||||||
|  | #endif | ||||||
|       while (c->len) |       while (c->len) | ||||||
|       { |       { | ||||||
| 	NEEDOUT |         NEEDOUT | ||||||
| 	OUTBYTE(*f++) |         OUTBYTE(*f++) | ||||||
| 	if (f == s->end) |         if (f == s->end) | ||||||
| 	  f = s->window; |           f = s->window; | ||||||
| 	c->len--; |         c->len--; | ||||||
|       } |       } | ||||||
|       c->mode = START; |       c->mode = START; | ||||||
|       break; |       break; | ||||||
|     case LIT:		/* o: got literal, waiting for output space */ |     case LIT:           /* o: got literal, waiting for output space */ | ||||||
|       NEEDOUT |       NEEDOUT | ||||||
|       OUTBYTE(c->sub.lit) |       OUTBYTE(c->sub.lit) | ||||||
|       c->mode = START; |       c->mode = START; | ||||||
|       break; |       break; | ||||||
|     case WASH:		/* o: got eob, possibly more output */ |     case WASH:          /* o: got eob, possibly more output */ | ||||||
|       FLUSH |       FLUSH | ||||||
|       if (s->read != s->write) |       if (s->read != s->write) | ||||||
|         LEAVE |         LEAVE | ||||||
| @@ -217,22 +230,23 @@ int r; | |||||||
|     case END: |     case END: | ||||||
|       r = Z_STREAM_END; |       r = Z_STREAM_END; | ||||||
|       LEAVE |       LEAVE | ||||||
|     case BADCODE:	/* x: got error */ |     case BADCODE:       /* x: got error */ | ||||||
|       r = Z_DATA_ERROR; |       r = Z_DATA_ERROR; | ||||||
|       LEAVE |       LEAVE | ||||||
|     default: |     default: | ||||||
|       r = Z_STREAM_ERROR; |       r = Z_STREAM_ERROR; | ||||||
|       LEAVE |       LEAVE | ||||||
|   } |   } | ||||||
|  | #ifdef NEED_DUMMY_RETURN | ||||||
|  |   return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */ | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void inflate_codes_free(c, z) | void inflate_codes_free(c, z) | ||||||
| struct inflate_codes_state *c; | inflate_codes_statef *c; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| { | { | ||||||
|   inflate_trees_free(c->dtree, z); |  | ||||||
|   inflate_trees_free(c->ltree, z); |  | ||||||
|   ZFREE(z, c); |   ZFREE(z, c); | ||||||
|   Tracev((stderr, "inflate:       codes free\n")); |   Tracev((stderr, "inflate:       codes free\n")); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								infcodes.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								infcodes.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* infcodes.h -- header to use infcodes.c | /* infcodes.h -- header to use infcodes.c | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -9,17 +9,19 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| struct inflate_codes_state; | struct inflate_codes_state; | ||||||
|  | typedef struct inflate_codes_state FAR inflate_codes_statef; | ||||||
|  |  | ||||||
| extern struct inflate_codes_state *inflate_codes_new __P(( | extern inflate_codes_statef *inflate_codes_new OF(( | ||||||
|     uInt, uInt, |     uInt, uInt, | ||||||
|     inflate_huft *, inflate_huft *, |     inflate_huft *, inflate_huft *, | ||||||
|     z_stream *)); |     z_streamp )); | ||||||
|  |  | ||||||
| extern int inflate_codes __P(( | extern int inflate_codes OF(( | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *, |     z_streamp , | ||||||
|     int)); |     int)); | ||||||
|  |  | ||||||
| extern void inflate_codes_free __P(( | extern void inflate_codes_free OF(( | ||||||
|     struct inflate_codes_state *, |     inflate_codes_statef *, | ||||||
|     z_stream *)); |     z_streamp )); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										218
									
								
								inffast.c
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								inffast.c
									
									
									
									
									
								
							| @@ -1,10 +1,12 @@ | |||||||
| /* inffast.c -- process literals and length/distance pairs fast | /* inffast.c -- process literals and length/distance pairs fast | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
| #include "inftrees.h" | #include "inftrees.h" | ||||||
|  | #include "infblock.h" | ||||||
|  | #include "infcodes.h" | ||||||
| #include "infutil.h" | #include "infutil.h" | ||||||
| #include "inffast.h" | #include "inffast.h" | ||||||
|  |  | ||||||
| @@ -17,10 +19,6 @@ struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | |||||||
| #define bits word.what.Bits | #define bits word.what.Bits | ||||||
|  |  | ||||||
| /* macros for bit input with no checking and for returning unused bytes */ | /* macros for bit input with no checking and for returning unused bytes */ | ||||||
| #ifdef DEBUG |  | ||||||
| #  undef NEXTBYTE |  | ||||||
| #  define NEXTBYTE (n--?0:fprintf(stderr,"inffast underrun\n"),*p++) |  | ||||||
| #endif |  | ||||||
| #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} | #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||||||
| #define UNGRAB {n+=(c=k>>3);p-=c;k&=7;} | #define UNGRAB {n+=(c=k>>3);p-=c;k&=7;} | ||||||
|  |  | ||||||
| @@ -31,122 +29,136 @@ struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | |||||||
|  |  | ||||||
| int inflate_fast(bl, bd, tl, td, s, z) | int inflate_fast(bl, bd, tl, td, s, z) | ||||||
| uInt bl, bd; | uInt bl, bd; | ||||||
| inflate_huft *tl, *td; | inflate_huft *tl; | ||||||
| struct inflate_blocks_state *s; | inflate_huft *td; /* need separate declaration for Borland C++ */ | ||||||
| z_stream *z; | inflate_blocks_statef *s; | ||||||
|  | z_streamp z; | ||||||
| { | { | ||||||
|   inflate_huft *t;	/* temporary pointer */ |   inflate_huft *t;      /* temporary pointer */ | ||||||
|   int e;		/* extra bits or operation */ |   uInt e;               /* extra bits or operation */ | ||||||
|   uLong b;		/* bit buffer */ |   uLong b;              /* bit buffer */ | ||||||
|   uInt k;		/* bits in bit buffer */ |   uInt k;               /* bits in bit buffer */ | ||||||
|   Byte *p;		/* input data pointer */ |   Bytef *p;             /* input data pointer */ | ||||||
|   uInt n;		/* bytes available there */ |   uInt n;               /* bytes available there */ | ||||||
|   Byte *q;		/* output window write pointer */ |   Bytef *q;             /* output window write pointer */ | ||||||
|   uInt m;		/* bytes to end of window or read pointer */ |   uInt m;               /* bytes to end of window or read pointer */ | ||||||
|   uInt ml;		/* mask for literal/length tree */ |   uInt ml;              /* mask for literal/length tree */ | ||||||
|   uInt md;		/* mask for distance tree */ |   uInt md;              /* mask for distance tree */ | ||||||
|   uInt c;		/* bytes to copy */ |   uInt c;               /* bytes to copy */ | ||||||
|   uInt d;		/* distance back to copy from */ |   uInt d;               /* distance back to copy from */ | ||||||
|   Byte *r;		/* copy source pointer */ |   Bytef *r;             /* copy source pointer */ | ||||||
|  |  | ||||||
|   /* load input, output, bit values */ |   /* load input, output, bit values */ | ||||||
|   LOAD |   LOAD | ||||||
|  |  | ||||||
|   /* initialize masks in registers */ |   /* initialize masks */ | ||||||
|   ml = inflate_mask[bl]; |   ml = inflate_mask[bl]; | ||||||
|   md = inflate_mask[bd]; |   md = inflate_mask[bd]; | ||||||
|  |  | ||||||
|   /* do until not enough input or output space for fast loop */ |   /* do until not enough input or output space for fast loop */ | ||||||
|   do {				/* assume called with m >= 258 && n >= 10 */ |   do {                          /* assume called with m >= 258 && n >= 10 */ | ||||||
|     /* get literal/length code */ |     /* get literal/length code */ | ||||||
|     GRABBITS(20)		/* max bits for literal/length code */ |     GRABBITS(20)                /* max bits for literal/length code */ | ||||||
|     if ((e = (t = tl + ((uInt)b & ml))->exop) < 0) |     if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) | ||||||
|       do { |  | ||||||
| 	if (e == -128) |  | ||||||
| 	{ |  | ||||||
| 	  z->msg = "invalid literal/length code"; |  | ||||||
|           UNGRAB |  | ||||||
| 	  UPDATE |  | ||||||
| 	  return Z_DATA_ERROR; |  | ||||||
| 	} |  | ||||||
| 	DUMPBITS(t->bits) |  | ||||||
| 	e = -e; |  | ||||||
| 	if (e & 64)		/* end of block */ |  | ||||||
| 	{ |  | ||||||
| 	  Tracevv((stderr, "inflate:         * end of block\n")); |  | ||||||
|           UNGRAB |  | ||||||
| 	  UPDATE |  | ||||||
| 	  return Z_STREAM_END; |  | ||||||
| 	} |  | ||||||
|       } while ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) < 0); |  | ||||||
|     DUMPBITS(t->bits) |  | ||||||
|  |  | ||||||
|     /* process literal or length (end of block already trapped) */ |  | ||||||
|     if (e & 16)			/* then it's a literal */ |  | ||||||
|     { |     { | ||||||
|  |       DUMPBITS(t->bits) | ||||||
|       Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? |       Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? | ||||||
| 		"inflate:         * literal '%c'\n" : |                 "inflate:         * literal '%c'\n" : | ||||||
| 		"inflate:         * literal 0x%02x\n", t->base)); |                 "inflate:         * literal 0x%02x\n", t->base)); | ||||||
|       *q++ = (Byte)t->base; |       *q++ = (Byte)t->base; | ||||||
|       m--; |       m--; | ||||||
|  |       continue; | ||||||
|     } |     } | ||||||
|     else			/* it's a length */ |     do { | ||||||
|     { |  | ||||||
|       /* get length of block to copy (already have extra bits) */ |  | ||||||
|       c = t->base + ((uInt)b & inflate_mask[e]); |  | ||||||
|       DUMPBITS(e); |  | ||||||
|       Tracevv((stderr, "inflate:         * length %u\n", c)); |  | ||||||
|  |  | ||||||
|       /* decode distance base of block to copy */ |  | ||||||
|       GRABBITS(15);		/* max bits for distance code */ |  | ||||||
|       if ((e = (t = td + ((uInt)b & md))->exop) < 0) |  | ||||||
| 	do { |  | ||||||
| 	  if (e == -128) |  | ||||||
| 	  { |  | ||||||
| 	    z->msg = "invalid distance code"; |  | ||||||
| 	    UNGRAB |  | ||||||
| 	    UPDATE |  | ||||||
| 	    return Z_DATA_ERROR; |  | ||||||
| 	  } |  | ||||||
| 	  DUMPBITS(t->bits) |  | ||||||
| 	  e = -e; |  | ||||||
| 	} while ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) < 0); |  | ||||||
|       DUMPBITS(t->bits) |       DUMPBITS(t->bits) | ||||||
|  |       if (e & 16) | ||||||
|       /* get extra bits to add to distance base */ |  | ||||||
|       GRABBITS((uInt)e)		/* get extra bits (up to 13) */ |  | ||||||
|       d = t->base + ((uInt)b & inflate_mask[e]); |  | ||||||
|       DUMPBITS(e) |  | ||||||
|       Tracevv((stderr, "inflate:         * distance %u\n", d)); |  | ||||||
|  |  | ||||||
|       /* do the copy */ |  | ||||||
|       m -= c; |  | ||||||
|       if ((uInt)(q - s->window) >= d)	/* if offset before destination, */ |  | ||||||
|       {					/*  just copy */ |  | ||||||
| 	r = q - d; |  | ||||||
| 	*q++ = *r++;  c--;		/* minimum count is three, */ |  | ||||||
| 	*q++ = *r++;  c--;		/*  so unroll loop a little */ |  | ||||||
| 	do { |  | ||||||
| 	  *q++ = *r++; |  | ||||||
| 	} while (--c); |  | ||||||
|       } |  | ||||||
|       else				/* else offset after destination */ |  | ||||||
|       { |       { | ||||||
| 	e = d - (q - s->window);	/* bytes from offset to end */ |         /* get extra bits for length */ | ||||||
| 	r = s->end - e;			/* pointer to offset */ |         e &= 15; | ||||||
| 	if (c > (uInt)e)		/* if source crosses, */ |         c = t->base + ((uInt)b & inflate_mask[e]); | ||||||
| 	{ |         DUMPBITS(e) | ||||||
| 	  c -= e;			/* copy to end of window */ |         Tracevv((stderr, "inflate:         * length %u\n", c)); | ||||||
| 	  do { |  | ||||||
| 	    *q++ = *r++; |         /* decode distance base of block to copy */ | ||||||
| 	  } while (--e); |         GRABBITS(15);           /* max bits for distance code */ | ||||||
| 	  r = s->window;		/* copy rest from start of window */ |         e = (t = td + ((uInt)b & md))->exop; | ||||||
| 	} |         do { | ||||||
| 	do {				/* copy all or what's left */ |           DUMPBITS(t->bits) | ||||||
| 	  *q++ = *r++; |           if (e & 16) | ||||||
| 	} while (--c); |           { | ||||||
|  |             /* get extra bits to add to distance base */ | ||||||
|  |             e &= 15; | ||||||
|  |             GRABBITS(e)         /* get extra bits (up to 13) */ | ||||||
|  |             d = t->base + ((uInt)b & inflate_mask[e]); | ||||||
|  |             DUMPBITS(e) | ||||||
|  |             Tracevv((stderr, "inflate:         * distance %u\n", d)); | ||||||
|  |  | ||||||
|  |             /* do the copy */ | ||||||
|  |             m -= c; | ||||||
|  |             if ((uInt)(q - s->window) >= d)     /* offset before dest */ | ||||||
|  |             {                                   /*  just copy */ | ||||||
|  |               r = q - d; | ||||||
|  |               *q++ = *r++;  c--;        /* minimum count is three, */ | ||||||
|  |               *q++ = *r++;  c--;        /*  so unroll loop a little */ | ||||||
|  |             } | ||||||
|  |             else                        /* else offset after destination */ | ||||||
|  |             { | ||||||
|  |               e = d - (uInt)(q - s->window); /* bytes from offset to end */ | ||||||
|  |               r = s->end - e;           /* pointer to offset */ | ||||||
|  |               if (c > e)                /* if source crosses, */ | ||||||
|  |               { | ||||||
|  |                 c -= e;                 /* copy to end of window */ | ||||||
|  |                 do { | ||||||
|  |                   *q++ = *r++; | ||||||
|  |                 } while (--e); | ||||||
|  |                 r = s->window;          /* copy rest from start of window */ | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |             do {                        /* copy all or what's left */ | ||||||
|  |               *q++ = *r++; | ||||||
|  |             } while (--c); | ||||||
|  |             break; | ||||||
|  |           } | ||||||
|  |           else if ((e & 64) == 0) | ||||||
|  |             e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop; | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             z->msg = (char*)"invalid distance code"; | ||||||
|  |             UNGRAB | ||||||
|  |             UPDATE | ||||||
|  |             return Z_DATA_ERROR; | ||||||
|  |           } | ||||||
|  |         } while (1); | ||||||
|  |         break; | ||||||
|       } |       } | ||||||
|     } |       if ((e & 64) == 0) | ||||||
|  |       { | ||||||
|  |         if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0) | ||||||
|  |         { | ||||||
|  |           DUMPBITS(t->bits) | ||||||
|  |           Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? | ||||||
|  |                     "inflate:         * literal '%c'\n" : | ||||||
|  |                     "inflate:         * literal 0x%02x\n", t->base)); | ||||||
|  |           *q++ = (Byte)t->base; | ||||||
|  |           m--; | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       else if (e & 32) | ||||||
|  |       { | ||||||
|  |         Tracevv((stderr, "inflate:         * end of block\n")); | ||||||
|  |         UNGRAB | ||||||
|  |         UPDATE | ||||||
|  |         return Z_STREAM_END; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |         z->msg = (char*)"invalid literal/length code"; | ||||||
|  |         UNGRAB | ||||||
|  |         UPDATE | ||||||
|  |         return Z_DATA_ERROR; | ||||||
|  |       } | ||||||
|  |     } while (1); | ||||||
|   } while (m >= 258 && n >= 10); |   } while (m >= 258 && n >= 10); | ||||||
|  |  | ||||||
|   /* not enough input or output--restore pointers and return */ |   /* not enough input or output--restore pointers and return */ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /* inffast.h -- header to use inffast.c | /* inffast.h -- header to use inffast.c | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -8,10 +8,10 @@ | |||||||
|    subject to change. Applications should only use zlib.h. |    subject to change. Applications should only use zlib.h. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| extern int inflate_fast __P(( | extern int inflate_fast OF(( | ||||||
|     uInt, |     uInt, | ||||||
|     uInt, |     uInt, | ||||||
|     inflate_huft *, |     inflate_huft *, | ||||||
|     inflate_huft *, |     inflate_huft *, | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *)); |     z_streamp )); | ||||||
|   | |||||||
							
								
								
									
										247
									
								
								inflate.c
									
									
									
									
									
								
							
							
						
						
									
										247
									
								
								inflate.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* inflate.c -- zlib interface to inflate modules | /* inflate.c -- zlib interface to inflate modules | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -8,83 +8,97 @@ | |||||||
|  |  | ||||||
| struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ | struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
|  | typedef enum { | ||||||
|  |       METHOD,   /* waiting for method byte */ | ||||||
|  |       FLAG,     /* waiting for flag byte */ | ||||||
|  |       DICT4,    /* four dictionary check bytes to go */ | ||||||
|  |       DICT3,    /* three dictionary check bytes to go */ | ||||||
|  |       DICT2,    /* two dictionary check bytes to go */ | ||||||
|  |       DICT1,    /* one dictionary check byte to go */ | ||||||
|  |       DICT0,    /* waiting for inflateSetDictionary */ | ||||||
|  |       BLOCKS,   /* decompressing blocks */ | ||||||
|  |       CHECK4,   /* four check bytes to go */ | ||||||
|  |       CHECK3,   /* three check bytes to go */ | ||||||
|  |       CHECK2,   /* two check bytes to go */ | ||||||
|  |       CHECK1,   /* one check byte to go */ | ||||||
|  |       DONE,     /* finished check, done */ | ||||||
|  |       BAD}      /* got an error--stay here */ | ||||||
|  | inflate_mode; | ||||||
|  |  | ||||||
| /* inflate private state */ | /* inflate private state */ | ||||||
| struct internal_state { | struct internal_state { | ||||||
|  |  | ||||||
|   /* mode */ |   /* mode */ | ||||||
|   enum { |   inflate_mode  mode;   /* current inflate mode */ | ||||||
|       METHOD,	/* waiting for method byte */ |  | ||||||
|       FLAG,	/* waiting for flag byte */ |  | ||||||
|       BLOCKS,	/* decompressing blocks */ |  | ||||||
|       CHECK4,	/* four check bytes to go */ |  | ||||||
|       CHECK3,	/* three check bytes to go */ |  | ||||||
|       CHECK2,	/* two check bytes to go */ |  | ||||||
|       CHECK1,	/* one check byte to go */ |  | ||||||
|       DONE,	/* finished check, done */ |  | ||||||
|       BAD}	/* got an error--stay here */ |  | ||||||
|     mode;		/* current inflate mode */ |  | ||||||
|  |  | ||||||
|   /* mode dependent information */ |   /* mode dependent information */ | ||||||
|   union { |   union { | ||||||
|     uInt method;	/* if FLAGS, method byte */ |     uInt method;        /* if FLAGS, method byte */ | ||||||
|     struct { |     struct { | ||||||
|       uLong was;                /* computed check value */ |       uLong was;                /* computed check value */ | ||||||
|       uLong need;               /* stream check value */ |       uLong need;               /* stream check value */ | ||||||
|     } check;            /* if CHECK, check values to compare */ |     } check;            /* if CHECK, check values to compare */ | ||||||
|     uInt marker;	/* if BAD, inflateSync's marker bytes count */ |     uInt marker;        /* if BAD, inflateSync's marker bytes count */ | ||||||
|   } sub;	/* submode */ |   } sub;        /* submode */ | ||||||
|  |  | ||||||
|   /* mode independent information */ |   /* mode independent information */ | ||||||
|   int  nowrap;		/* flag for no wrapper */ |   int  nowrap;          /* flag for no wrapper */ | ||||||
|   uInt wbits;  		/* log2(window size)  (8..15, defaults to 15) */ |   uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */ | ||||||
|   struct inflate_blocks_state |   inflate_blocks_statef  | ||||||
|     *blocks;		/* current inflate_blocks state */ |     *blocks;            /* current inflate_blocks state */ | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflateReset(z) | int EXPORT inflateReset(z) | ||||||
| z_stream *z; | z_streamp z; | ||||||
| { | { | ||||||
|   uLong c; |  | ||||||
|  |  | ||||||
|   if (z == Z_NULL || z->state == Z_NULL) |   if (z == Z_NULL || z->state == Z_NULL) | ||||||
|     return Z_STREAM_ERROR; |     return Z_STREAM_ERROR; | ||||||
|   z->total_in = z->total_out = 0; |   z->total_in = z->total_out = 0; | ||||||
|   z->msg = Z_NULL; |   z->msg = Z_NULL; | ||||||
|   z->state->mode = z->state->nowrap ? BLOCKS : METHOD; |   z->state->mode = z->state->nowrap ? BLOCKS : METHOD; | ||||||
|   inflate_blocks_reset(z->state->blocks, z, &c); |   inflate_blocks_reset(z->state->blocks, z, Z_NULL); | ||||||
|   Trace((stderr, "inflate: reset\n")); |   Tracev((stderr, "inflate: reset\n")); | ||||||
|   return Z_OK; |   return Z_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflateEnd(z) | int EXPORT inflateEnd(z) | ||||||
| z_stream *z; | z_streamp z; | ||||||
| { | { | ||||||
|   uLong c; |  | ||||||
|  |  | ||||||
|   if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) |   if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) | ||||||
|     return Z_STREAM_ERROR; |     return Z_STREAM_ERROR; | ||||||
|   if (z->state->blocks != Z_NULL) |   if (z->state->blocks != Z_NULL) | ||||||
|     inflate_blocks_free(z->state->blocks, z, &c); |     inflate_blocks_free(z->state->blocks, z); | ||||||
|   ZFREE(z, z->state); |   ZFREE(z, z->state); | ||||||
|   z->state = Z_NULL; |   z->state = Z_NULL; | ||||||
|   Trace((stderr, "inflate: end\n")); |   Tracev((stderr, "inflate: end\n")); | ||||||
|   return Z_OK; |   return Z_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflateInit2(z, w) | int EXPORT inflateInit2_(z, w, version, stream_size) | ||||||
| z_stream *z; | z_streamp z; | ||||||
| int w; | int w; | ||||||
|  | const char *version; | ||||||
|  | int stream_size; | ||||||
| { | { | ||||||
|  |   if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || | ||||||
|  |       stream_size != sizeof(z_stream)) | ||||||
|  |       return Z_VERSION_ERROR; | ||||||
|  |  | ||||||
|   /* initialize state */ |   /* initialize state */ | ||||||
|   if (z == Z_NULL) |   if (z == Z_NULL) | ||||||
|     return Z_STREAM_ERROR; |     return Z_STREAM_ERROR; | ||||||
|   if (z->zalloc == Z_NULL) z->zalloc = zcalloc; |   z->msg = Z_NULL; | ||||||
|  |   if (z->zalloc == Z_NULL) | ||||||
|  |   { | ||||||
|  |     z->zalloc = zcalloc; | ||||||
|  |     z->opaque = (voidpf)0; | ||||||
|  |   } | ||||||
|   if (z->zfree == Z_NULL) z->zfree = zcfree; |   if (z->zfree == Z_NULL) z->zfree = zcfree; | ||||||
|   if ((z->state = (struct internal_state *) |   if ((z->state = (struct internal_state FAR *) | ||||||
|        ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) |        ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) | ||||||
|     return Z_MEM_ERROR; |     return Z_MEM_ERROR; | ||||||
|   z->state->blocks = Z_NULL; |   z->state->blocks = Z_NULL; | ||||||
| @@ -107,13 +121,13 @@ int w; | |||||||
|  |  | ||||||
|   /* create inflate_blocks state */ |   /* create inflate_blocks state */ | ||||||
|   if ((z->state->blocks = |   if ((z->state->blocks = | ||||||
|        inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w)) |       inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) | ||||||
|       == Z_NULL) |       == Z_NULL) | ||||||
|   { |   { | ||||||
|     inflateEnd(z); |     inflateEnd(z); | ||||||
|     return Z_MEM_ERROR; |     return Z_MEM_ERROR; | ||||||
|   } |   } | ||||||
|   Trace((stderr, "inflate: allocated\n")); |   Tracev((stderr, "inflate: allocated\n")); | ||||||
|  |  | ||||||
|   /* reset state */ |   /* reset state */ | ||||||
|   inflateReset(z); |   inflateReset(z); | ||||||
| @@ -121,81 +135,106 @@ int w; | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflateInit(z) | int EXPORT inflateInit_(z, version, stream_size) | ||||||
| z_stream *z; | z_streamp z; | ||||||
|  | const char *version; | ||||||
|  | int stream_size; | ||||||
| { | { | ||||||
|   return inflateInit2(z, DEF_WBITS); |   return inflateInit2_(z, DEF_WBITS, version, stream_size); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #define NEEDBYTE {if(z->avail_in==0)return r;r=Z_OK;} | #define NEEDBYTE {if(z->avail_in==0)return r; if (f != Z_FINISH) r = Z_OK;} | ||||||
| #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) | #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) | ||||||
|  |  | ||||||
| int inflate(z, f) | int EXPORT inflate(z, f) | ||||||
| z_stream *z; | z_streamp z; | ||||||
| int f; | int f; | ||||||
| { | { | ||||||
|   int r = f;	/* to avoid warning about unused f */ |   int r; | ||||||
|   uInt b; |   uInt b; | ||||||
|  |  | ||||||
|   if (z == Z_NULL || z->next_in == Z_NULL) |   if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL || f < 0) | ||||||
|     return Z_STREAM_ERROR; |     return Z_STREAM_ERROR; | ||||||
|   r = Z_BUF_ERROR; |   r = Z_BUF_ERROR; | ||||||
|   while (1) switch (z->state->mode) |   while (1) switch (z->state->mode) | ||||||
|   { |   { | ||||||
|     case METHOD: |     case METHOD: | ||||||
|       NEEDBYTE |       NEEDBYTE | ||||||
|       if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED)) |       if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) | ||||||
|       { |       { | ||||||
|         z->state->mode = BAD; |         z->state->mode = BAD; | ||||||
| 	z->msg = "unknown compression method"; |         z->msg = (char*)"unknown compression method"; | ||||||
| 	z->state->sub.marker = 5;	/* can't try inflateSync */ |         z->state->sub.marker = 5;       /* can't try inflateSync */ | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       if ((z->state->sub.method >> 4) + 8 > z->state->wbits) |       if ((z->state->sub.method >> 4) + 8 > z->state->wbits) | ||||||
|       { |       { | ||||||
|         z->state->mode = BAD; |         z->state->mode = BAD; | ||||||
| 	z->msg = "invalid window size"; |         z->msg = (char*)"invalid window size"; | ||||||
| 	z->state->sub.marker = 5;	/* can't try inflateSync */ |         z->state->sub.marker = 5;       /* can't try inflateSync */ | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       z->state->mode = FLAG; |       z->state->mode = FLAG; | ||||||
|     case FLAG: |     case FLAG: | ||||||
|       NEEDBYTE |       NEEDBYTE | ||||||
|       if ((b = NEXTBYTE) & 0x20) |       b = NEXTBYTE; | ||||||
|       { |  | ||||||
|         z->state->mode = BAD; |  | ||||||
| 	z->msg = "invalid reserved bit"; |  | ||||||
| 	z->state->sub.marker = 5;	/* can't try inflateSync */ |  | ||||||
| 	break; |  | ||||||
|       } |  | ||||||
|       if (((z->state->sub.method << 8) + b) % 31) |       if (((z->state->sub.method << 8) + b) % 31) | ||||||
|       { |       { | ||||||
|         z->state->mode = BAD; |         z->state->mode = BAD; | ||||||
| 	z->msg = "incorrect header check"; |         z->msg = (char*)"incorrect header check"; | ||||||
| 	z->state->sub.marker = 5;	/* can't try inflateSync */ |         z->state->sub.marker = 5;       /* can't try inflateSync */ | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       Tracev((stderr, "inflate: zlib header ok\n")); | ||||||
|  |       if (!(b & PRESET_DICT)) | ||||||
|  |       { | ||||||
|  |         z->state->mode = BLOCKS; | ||||||
| 	break; | 	break; | ||||||
|       } |       } | ||||||
|       Trace((stderr, "inflate: zlib header ok\n")); |       z->state->mode = DICT4; | ||||||
|       z->state->mode = BLOCKS; |     case DICT4: | ||||||
|  |       NEEDBYTE | ||||||
|  |       z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||||||
|  |       z->state->mode = DICT3; | ||||||
|  |     case DICT3: | ||||||
|  |       NEEDBYTE | ||||||
|  |       z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||||||
|  |       z->state->mode = DICT2; | ||||||
|  |     case DICT2: | ||||||
|  |       NEEDBYTE | ||||||
|  |       z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||||||
|  |       z->state->mode = DICT1; | ||||||
|  |     case DICT1: | ||||||
|  |       NEEDBYTE | ||||||
|  |       z->state->sub.check.need += (uLong)NEXTBYTE; | ||||||
|  |       z->adler = z->state->sub.check.need; | ||||||
|  |       z->state->mode = DICT0; | ||||||
|  |       return Z_NEED_DICT; | ||||||
|  |     case DICT0: | ||||||
|  |       z->state->mode = BAD; | ||||||
|  |       z->msg = (char*)"need dictionary"; | ||||||
|  |       z->state->sub.marker = 0;       /* can try inflateSync */ | ||||||
|  |       return Z_STREAM_ERROR; | ||||||
|     case BLOCKS: |     case BLOCKS: | ||||||
|       r = inflate_blocks(z->state->blocks, z, r); |       r = inflate_blocks(z->state->blocks, z, r); | ||||||
|       if (r == Z_DATA_ERROR) |       if (r == Z_DATA_ERROR) | ||||||
|       { |       { | ||||||
|         z->state->mode = BAD; |         z->state->mode = BAD; | ||||||
| 	z->state->sub.marker = 0;	/* can try inflateSync */ |         z->state->sub.marker = 0;       /* can try inflateSync */ | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       if (r != Z_STREAM_END) |       if (r != Z_STREAM_END) | ||||||
| 	return r; |         return f == Z_FINISH && r == Z_OK ? Z_BUF_ERROR : r; | ||||||
|       r = Z_OK; |       r = Z_OK; | ||||||
|       inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); |       inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); | ||||||
|       if (z->state->nowrap) |       if (z->state->nowrap) | ||||||
|       { |       { | ||||||
| 	z->state->mode = DONE; |         z->state->mode = DONE; | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       z->state->mode = CHECK4; |       z->state->mode = CHECK4; | ||||||
|  |       if (f == Z_FINISH) r = Z_BUF_ERROR; | ||||||
|     case CHECK4: |     case CHECK4: | ||||||
|       NEEDBYTE |       NEEDBYTE | ||||||
|       z->state->sub.check.need = (uLong)NEXTBYTE << 24; |       z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||||||
| @@ -215,11 +254,11 @@ int f; | |||||||
|       if (z->state->sub.check.was != z->state->sub.check.need) |       if (z->state->sub.check.was != z->state->sub.check.need) | ||||||
|       { |       { | ||||||
|         z->state->mode = BAD; |         z->state->mode = BAD; | ||||||
|         z->msg = "incorrect data check"; |         z->msg = (char*)"incorrect data check"; | ||||||
| 	z->state->sub.marker = 5;	/* can't try inflateSync */ |         z->state->sub.marker = 5;       /* can't try inflateSync */ | ||||||
| 	break; |         break; | ||||||
|       } |       } | ||||||
|       Trace((stderr, "inflate: zlib check ok\n")); |       Tracev((stderr, "inflate: zlib check ok\n")); | ||||||
|       z->state->mode = DONE; |       z->state->mode = DONE; | ||||||
|     case DONE: |     case DONE: | ||||||
|       return Z_STREAM_END; |       return Z_STREAM_END; | ||||||
| @@ -228,22 +267,52 @@ int f; | |||||||
|     default: |     default: | ||||||
|       return Z_STREAM_ERROR; |       return Z_STREAM_ERROR; | ||||||
|   } |   } | ||||||
|  | #ifdef NEED_DUMMY_RETURN | ||||||
|  |   return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */ | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflateSync(z) | int EXPORT inflateSetDictionary(z, dictionary, dictLength) | ||||||
| z_stream *z; | z_streamp z; | ||||||
|  | const Bytef *dictionary; | ||||||
|  | uInt  dictLength; | ||||||
| { | { | ||||||
|   uInt n;	/* number of bytes to look at */ |   uInt length = dictLength; | ||||||
|   Byte *p;	/* pointer to bytes */ |  | ||||||
|   uInt m;	/* number of marker bytes found in a row */ |   if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) | ||||||
|   uLong r, w;	/* temporaries to save total_in and total_out */ |     return Z_STREAM_ERROR; | ||||||
|  |  | ||||||
|  |   if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; | ||||||
|  |   z->adler = 1L; | ||||||
|  |  | ||||||
|  |   if (length >= ((uInt)1<<z->state->wbits)) | ||||||
|  |   { | ||||||
|  |     length = (1<<z->state->wbits)-1; | ||||||
|  |     dictionary += dictLength - length; | ||||||
|  |   } | ||||||
|  |   inflate_set_dictionary(z->state->blocks, dictionary, length); | ||||||
|  |   z->state->mode = BLOCKS; | ||||||
|  |   return Z_OK; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int EXPORT inflateSync(z) | ||||||
|  | z_streamp z; | ||||||
|  | { | ||||||
|  |   uInt n;       /* number of bytes to look at */ | ||||||
|  |   Bytef *p;     /* pointer to bytes */ | ||||||
|  |   uInt m;       /* number of marker bytes found in a row */ | ||||||
|  |   uLong r, w;   /* temporaries to save total_in and total_out */ | ||||||
|  |  | ||||||
|   /* set up */ |   /* set up */ | ||||||
|   if (z == Z_NULL || z->state == Z_NULL) |   if (z == Z_NULL || z->state == Z_NULL) | ||||||
|     return Z_STREAM_ERROR; |     return Z_STREAM_ERROR; | ||||||
|   if (z->state->mode != BAD) |   if (z->state->mode != BAD) | ||||||
|  |   { | ||||||
|  |     z->state->mode = BAD; | ||||||
|     z->state->sub.marker = 0; |     z->state->sub.marker = 0; | ||||||
|  |   } | ||||||
|   if ((n = z->avail_in) == 0) |   if ((n = z->avail_in) == 0) | ||||||
|     return Z_BUF_ERROR; |     return Z_BUF_ERROR; | ||||||
|   p = z->next_in; |   p = z->next_in; | ||||||
| @@ -252,10 +321,12 @@ z_stream *z; | |||||||
|   /* search */ |   /* search */ | ||||||
|   while (n && m < 4) |   while (n && m < 4) | ||||||
|   { |   { | ||||||
|     if (*p == (m < 2 ? 0 : 0xff)) |     if (*p == (Byte)(m < 2 ? 0 : 0xff)) | ||||||
|       m++; |       m++; | ||||||
|     else if (*p || m > 2) |     else if (*p) | ||||||
|       m = 0; |       m = 0; | ||||||
|  |     else | ||||||
|  |       m = 4 - m; | ||||||
|     p++, n--; |     p++, n--; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -274,3 +345,19 @@ z_stream *z; | |||||||
|   z->state->mode = BLOCKS; |   z->state->mode = BLOCKS; | ||||||
|   return Z_OK; |   return Z_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Returns true if inflate is currently at the end of a block generated | ||||||
|  |  * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP | ||||||
|  |  * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH | ||||||
|  |  * but removes the length bytes of the resulting empty stored block. When | ||||||
|  |  * decompressing, PPP checks that at the end of input packet, inflate is | ||||||
|  |  * waiting for these length bytes. | ||||||
|  |  */ | ||||||
|  | int EXPORT inflateSyncPoint(z) | ||||||
|  | z_streamp z; | ||||||
|  | { | ||||||
|  |   if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL) | ||||||
|  |     return Z_STREAM_ERROR; | ||||||
|  |   return inflate_blocks_sync_point(z->state->blocks); | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								inftest.c
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								inftest.c
									
									
									
									
									
								
							| @@ -1,69 +0,0 @@ | |||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include "zutil.h" |  | ||||||
|  |  | ||||||
| void main __P((void)); |  | ||||||
|  |  | ||||||
| /* This test is in honor of Ed Hamrick who suggested that the interface |  | ||||||
|    to inflate be a byte at a time--this implements that, and is, of course, |  | ||||||
|    monumentally slow.  It has the virtue though of stressing the push-pull |  | ||||||
|    interface for testing purposes. */ |  | ||||||
|  |  | ||||||
| void main() |  | ||||||
| { |  | ||||||
|   int a, r; |  | ||||||
|   char c; |  | ||||||
|   z_stream z; |  | ||||||
|  |  | ||||||
|   z.zalloc = Z_NULL; |  | ||||||
|   z.zfree = Z_NULL; |  | ||||||
|   r = inflateInit(&z); |  | ||||||
|   if (r != Z_OK) |  | ||||||
|     fprintf(stderr, "init error: %s\n", z_errmsg[1 - r]); |  | ||||||
|   while ((a = getchar()) != EOF) |  | ||||||
|   { |  | ||||||
|     /* feed one byte of input */ |  | ||||||
|     z.avail_out = 0; |  | ||||||
|     c = (char)a; |  | ||||||
|     z.next_in = (Byte*)&c; |  | ||||||
|     z.avail_in = 1; |  | ||||||
|     r = inflate(&z, 0); |  | ||||||
|     if (r == Z_STREAM_END) |  | ||||||
|       break; |  | ||||||
|     if (r != Z_OK) |  | ||||||
|     { |  | ||||||
|       fprintf(stderr, "inflate error: %s\n", z_errmsg[1 - r]); |  | ||||||
|       break; |  | ||||||
|     } |  | ||||||
|     if (z.avail_in != 0) |  | ||||||
|     { |  | ||||||
|       fprintf(stderr, "inflate didn't eat byte and didn't say buf err!\n"); |  | ||||||
|       break; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* empty output one byte at a time */ |  | ||||||
|     while (1) |  | ||||||
|     { |  | ||||||
|       z.next_out = (Byte*)&c; |  | ||||||
|       z.avail_out = 1; |  | ||||||
|       r = inflate(&z, 0); |  | ||||||
|       if (r == Z_STREAM_END) |  | ||||||
| 	break; |  | ||||||
|       if (r != Z_OK && r != Z_BUF_ERROR) |  | ||||||
|       { |  | ||||||
| 	fprintf(stderr, "inflate error: %s\n", z_errmsg[1 - r]); |  | ||||||
| 	break; |  | ||||||
|       } |  | ||||||
|       if (z.avail_out == 0) |  | ||||||
|         putchar(c); |  | ||||||
|       else |  | ||||||
|         break; |  | ||||||
|     } |  | ||||||
|     if (r != Z_OK && r != Z_BUF_ERROR) |  | ||||||
|       break; |  | ||||||
|   } |  | ||||||
|   inflateEnd(&z); |  | ||||||
|   fprintf(stderr, "%ld bytes in, %ld bytes out\n", z.total_in, z.total_out); |  | ||||||
|   if (z.msg != NULL) |  | ||||||
|     fprintf(stderr, "msg is <%s>\n", z.msg); |  | ||||||
| } |  | ||||||
							
								
								
									
										276
									
								
								inftrees.c
									
									
									
									
									
								
							
							
						
						
									
										276
									
								
								inftrees.c
									
									
									
									
									
								
							| @@ -1,11 +1,19 @@ | |||||||
| /* inftrees.c -- generate Huffman trees for efficient decoding | /* inftrees.c -- generate Huffman trees for efficient decoding | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
| #include "inftrees.h" | #include "inftrees.h" | ||||||
|  |  | ||||||
|  | const char inflate_copyright[] = | ||||||
|  |    " inflate 1.0.7 Copyright 1995-1998 Mark Adler "; | ||||||
|  | /* | ||||||
|  |   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. | ||||||
|  |  */ | ||||||
| struct internal_state  {int dummy;}; /* for buggy compilers */ | struct internal_state  {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
| /* simplify the use of the inflate_huft type with some defines */ | /* simplify the use of the inflate_huft type with some defines */ | ||||||
| @@ -15,38 +23,34 @@ struct internal_state  {int dummy;}; /* for buggy compilers */ | |||||||
| #define bits word.what.Bits | #define bits word.what.Bits | ||||||
|  |  | ||||||
|  |  | ||||||
| local int huft_build __P(( | local int huft_build OF(( | ||||||
|     uInt *,		/* code lengths in bits */ |     uIntf *,            /* code lengths in bits */ | ||||||
|     uInt,		/* number of codes */ |     uInt,               /* number of codes */ | ||||||
|     uInt,		/* number of "simple" codes */ |     uInt,               /* number of "simple" codes */ | ||||||
|     uInt *,		/* list of base values for non-simple codes */ |     const uIntf *,      /* list of base values for non-simple codes */ | ||||||
|     uInt *,		/* list of extra bits for non-simple codes */ |     const uIntf *,      /* list of extra bits for non-simple codes */ | ||||||
|     inflate_huft **,	/* result: starting table */ |     inflate_huft * FAR*,/* result: starting table */ | ||||||
|     uInt *,		/* maximum lookup bits (returns actual) */ |     uIntf *,            /* maximum lookup bits (returns actual) */ | ||||||
|     z_stream *));	/* for zalloc function */ |     z_streamp ));       /* for zalloc function */ | ||||||
|  |  | ||||||
| local voidp falloc __P(( | local voidpf falloc OF(( | ||||||
|     voidp,		/* opaque pointer (not used) */ |     voidpf,             /* opaque pointer (not used) */ | ||||||
|     uInt,		/* number of items */ |     uInt,               /* number of items */ | ||||||
|     uInt));		/* size of item */ |     uInt));             /* size of item */ | ||||||
|  |  | ||||||
| local void ffree __P(( |  | ||||||
|     voidp q,		/* opaque pointer (not used) */ |  | ||||||
|     voidp p));		/* what to free (not used) */ |  | ||||||
|  |  | ||||||
| /* Tables for deflate from PKZIP's appnote.txt. */ | /* Tables for deflate from PKZIP's appnote.txt. */ | ||||||
| local uInt cplens[] = {	/* Copy lengths for literal codes 257..285 */ | local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ | ||||||
|         3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, |         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}; |         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | ||||||
|         /* actually lengths - 2; also see note #13 above about 258 */ |         /* see note #13 above about 258 */ | ||||||
| local uInt cplext[] = {	/* Extra bits for literal codes 257..285 */ | local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ | ||||||
|         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, |         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | ||||||
|         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 128, 128}; /* 128==invalid */ |         3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ | ||||||
| local uInt cpdist[] = {	/* Copy offsets for distance codes 0..29 */ | local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ | ||||||
|         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, |         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, |         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | ||||||
|         8193, 12289, 16385, 24577}; |         8193, 12289, 16385, 24577}; | ||||||
| local uInt cpdext[] = {	/* Extra bits for distance codes */ | local const uInt cpdext[30] = { /* Extra bits for distance codes */ | ||||||
|         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, |         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | ||||||
|         7, 7, 8, 8, 9, 9, 10, 10, 11, 11, |         7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | ||||||
|         12, 12, 13, 13}; |         12, 12, 13, 13}; | ||||||
| @@ -93,39 +97,40 @@ local uInt cpdext[] = {	/* Extra bits for distance codes */ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| local int huft_build(b, n, s, d, e, t, m, zs) | local int huft_build(b, n, s, d, e, t, m, zs) | ||||||
| uInt *b;                /* code lengths in bits (all assumed <= BMAX) */ | uIntf *b;               /* code lengths in bits (all assumed <= BMAX) */ | ||||||
| uInt n;                 /* number of codes (assumed <= N_MAX) */ | uInt n;                 /* number of codes (assumed <= N_MAX) */ | ||||||
| uInt s;                 /* number of simple-valued codes (0..s-1) */ | uInt s;                 /* number of simple-valued codes (0..s-1) */ | ||||||
| uInt *d;                /* list of base values for non-simple codes */ | const uIntf *d;         /* list of base values for non-simple codes */ | ||||||
| uInt *e;                /* list of extra bits for non-simple codes */ | const uIntf *e;         /* list of extra bits for non-simple codes */ | ||||||
| inflate_huft **t;       /* result: starting table */ | inflate_huft * FAR *t;  /* result: starting table */ | ||||||
| uInt *m;                /* maximum lookup bits, returns actual */ | uIntf *m;               /* maximum lookup bits, returns actual */ | ||||||
| z_stream *zs;		/* for zalloc function */ | z_streamp zs;           /* for zalloc function */ | ||||||
| /* Given a list of code lengths and a maximum table size, make a set of | /* Given a list of code lengths and a maximum table size, make a set of | ||||||
|    tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR |    tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR | ||||||
|    if the given code set is incomplete (the tables are still built in this |    if the given code set is incomplete (the tables are still built in this | ||||||
|    case), Z_DATA_ERROR if the input is invalid (all zero length codes or an |    case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of | ||||||
|    over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */ |    lengths), or Z_MEM_ERROR if not enough memory. */ | ||||||
| { | { | ||||||
|   uInt a;			/* counter for codes of length k */ |  | ||||||
|   uInt c[BMAX+1];		/* bit length count table */ |   uInt a;                       /* counter for codes of length k */ | ||||||
|   uInt f;			/* i repeats in table every f entries */ |   uInt c[BMAX+1];               /* bit length count table */ | ||||||
|   int g;			/* maximum code length */ |   uInt f;                       /* i repeats in table every f entries */ | ||||||
|   int h;			/* table level */ |   int g;                        /* maximum code length */ | ||||||
|   register uInt i;		/* counter, current code */ |   int h;                        /* table level */ | ||||||
|   register uInt j;		/* counter */ |   register uInt i;              /* counter, current code */ | ||||||
|   register int k;		/* number of bits in current code */ |   register uInt j;              /* counter */ | ||||||
|   int l;			/* bits per table (returned in m) */ |   register int k;               /* number of bits in current code */ | ||||||
|   register uInt *p;		/* pointer into c[], b[], or v[] */ |   int l;                        /* bits per table (returned in m) */ | ||||||
|   register inflate_huft *q;	/* points to current table */ |   register uIntf *p;            /* pointer into c[], b[], or v[] */ | ||||||
|   inflate_huft r;		/* table entry for structure assignment */ |   inflate_huft *q;              /* points to current table */ | ||||||
|   inflate_huft *u[BMAX];	/* table stack */ |   struct inflate_huft_s r;      /* table entry for structure assignment */ | ||||||
|   uInt v[N_MAX];		/* values in order of bit length */ |   inflate_huft *u[BMAX];        /* table stack */ | ||||||
|   register int w;		/* bits before this table == (l * h) */ |   uInt v[N_MAX];                /* values in order of bit length */ | ||||||
|   uInt x[BMAX+1];		/* bit offsets, then code stack */ |   register int w;               /* bits before this table == (l * h) */ | ||||||
|   uInt *xp;			/* pointer into x */ |   uInt x[BMAX+1];               /* bit offsets, then code stack */ | ||||||
|   int y;			/* number of dummy codes added */ |   uIntf *xp;                    /* pointer into x */ | ||||||
|   uInt z;			/* number of entries in current table */ |   int y;                        /* number of dummy codes added */ | ||||||
|  |   uInt z;                       /* number of entries in current table */ | ||||||
|  |  | ||||||
|  |  | ||||||
|   /* Generate counts for each bit length */ |   /* Generate counts for each bit length */ | ||||||
| @@ -133,7 +138,7 @@ z_stream *zs;		/* for zalloc function */ | |||||||
| #define C0 *p++ = 0; | #define C0 *p++ = 0; | ||||||
| #define C2 C0 C0 C0 C0 | #define C2 C0 C0 C0 C0 | ||||||
| #define C4 C2 C2 C2 C2 | #define C4 C2 C2 C2 C2 | ||||||
|   C4				/* clear c[]--assume BMAX+1 is 16 */ |   C4                            /* clear c[]--assume BMAX+1 is 16 */ | ||||||
|   p = b;  i = n; |   p = b;  i = n; | ||||||
|   do { |   do { | ||||||
|     c[*p++]++;                  /* assume all entries <= BMAX */ |     c[*p++]++;                  /* assume all entries <= BMAX */ | ||||||
| @@ -186,6 +191,7 @@ z_stream *zs;		/* for zalloc function */ | |||||||
|     if ((j = *p++) != 0) |     if ((j = *p++) != 0) | ||||||
|       v[x[j]++] = i; |       v[x[j]++] = i; | ||||||
|   } while (++i < n); |   } while (++i < n); | ||||||
|  |   n = x[g];                     /* set n to length of v */ | ||||||
|  |  | ||||||
|  |  | ||||||
|   /* Generate the Huffman codes and for each, make the table entries */ |   /* Generate the Huffman codes and for each, make the table entries */ | ||||||
| @@ -193,8 +199,8 @@ z_stream *zs;		/* for zalloc function */ | |||||||
|   p = v;                        /* grab values in bit order */ |   p = v;                        /* grab values in bit order */ | ||||||
|   h = -1;                       /* no tables yet--level -1 */ |   h = -1;                       /* no tables yet--level -1 */ | ||||||
|   w = -l;                       /* bits decoded == (l * h) */ |   w = -l;                       /* bits decoded == (l * h) */ | ||||||
|   u[0] = (inflate_huft *)Z_NULL;	/* just to keep compilers happy */ |   u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */ | ||||||
|   q = (inflate_huft *)Z_NULL;	/* ditto */ |   q = (inflate_huft *)Z_NULL;   /* ditto */ | ||||||
|   z = 0;                        /* ditto */ |   z = 0;                        /* ditto */ | ||||||
|  |  | ||||||
|   /* go through the bit lengths (k already is bits in shortest code) */ |   /* go through the bit lengths (k already is bits in shortest code) */ | ||||||
| @@ -211,42 +217,43 @@ z_stream *zs;		/* for zalloc function */ | |||||||
|         w += l;                 /* previous table always l bits */ |         w += l;                 /* previous table always l bits */ | ||||||
|  |  | ||||||
|         /* compute minimum size table less than or equal to l bits */ |         /* compute minimum size table less than or equal to l bits */ | ||||||
|         z = (z = g - w) > (uInt)l ? l : z;      /* table size upper limit */ |         z = g - w; | ||||||
|  |         z = z > (uInt)l ? l : z;        /* table size upper limit */ | ||||||
|         if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */ |         if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */ | ||||||
|         {                       /* too few codes for k-w bit table */ |         {                       /* too few codes for k-w bit table */ | ||||||
|           f -= a + 1;           /* deduct codes from patterns left */ |           f -= a + 1;           /* deduct codes from patterns left */ | ||||||
|           xp = c + k; |           xp = c + k; | ||||||
|           if (j < z) |           if (j < z) | ||||||
| 	    while (++j < z)	/* try smaller tables up to z bits */ |             while (++j < z)     /* try smaller tables up to z bits */ | ||||||
| 	    { |             { | ||||||
| 	      if ((f <<= 1) <= *++xp) |               if ((f <<= 1) <= *++xp) | ||||||
| 		break;		/* enough codes to use up j bits */ |                 break;          /* enough codes to use up j bits */ | ||||||
| 	      f -= *xp;		/* else deduct codes from patterns */ |               f -= *xp;         /* else deduct codes from patterns */ | ||||||
| 	    } |             } | ||||||
|         } |         } | ||||||
|         z = 1 << j;             /* table entries for j-bit table */ |         z = 1 << j;             /* table entries for j-bit table */ | ||||||
|  |  | ||||||
|         /* allocate and link in new table */ |         /* allocate and link in new table */ | ||||||
|         if ((q = (inflate_huft *)ZALLOC |         if ((q = (inflate_huft *)ZALLOC | ||||||
| 	     (zs,z + 1,sizeof(inflate_huft))) == Z_NULL) |              (zs,z + 1,sizeof(inflate_huft))) == Z_NULL) | ||||||
|         { |         { | ||||||
|           if (h) |           if (h) | ||||||
|             inflate_trees_free(u[0], zs); |             inflate_trees_free(u[0], zs); | ||||||
|           return Z_MEM_ERROR;	/* not enough memory */ |           return Z_MEM_ERROR;   /* not enough memory */ | ||||||
|         } |         } | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| 	inflate_hufts += z + 1; |         inflate_hufts += z + 1; | ||||||
| #endif | #endif | ||||||
|         *t = q + 1;             /* link to list for huft_free() */ |         *t = q + 1;             /* link to list for huft_free() */ | ||||||
|         *(t = &(q->next)) = (inflate_huft *)Z_NULL; |         *(t = &(q->next)) = Z_NULL; | ||||||
|         u[h] = ++q;             /* table starts after link */ |         u[h] = ++q;             /* table starts after link */ | ||||||
|  |  | ||||||
|         /* connect to last table, if there is one */ |         /* connect to last table, if there is one */ | ||||||
|         if (h) |         if (h) | ||||||
|         { |         { | ||||||
|           x[h] = i;             /* save pattern for backing up */ |           x[h] = i;             /* save pattern for backing up */ | ||||||
|           r.bits = (char)l;     /* bits to dump before this table */ |           r.bits = (Byte)l;     /* bits to dump before this table */ | ||||||
|           r.exop = -(char)j;    /* bits in this table */ |           r.exop = (Byte)j;     /* bits in this table */ | ||||||
|           r.next = q;           /* pointer to this table */ |           r.next = q;           /* pointer to this table */ | ||||||
|           j = i >> (w - l);     /* (get around Turbo C bug) */ |           j = i >> (w - l);     /* (get around Turbo C bug) */ | ||||||
|           u[h-1][j] = r;        /* connect to last table */ |           u[h-1][j] = r;        /* connect to last table */ | ||||||
| @@ -254,17 +261,17 @@ z_stream *zs;		/* for zalloc function */ | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       /* set up table entry in r */ |       /* set up table entry in r */ | ||||||
|       r.bits = (char)(k - w); |       r.bits = (Byte)(k - w); | ||||||
|       if (p >= v + n) |       if (p >= v + n) | ||||||
|         r.exop = -128;          /* out of values--invalid code */ |         r.exop = 128 + 64;      /* out of values--invalid code */ | ||||||
|       else if (*p < s) |       else if (*p < s) | ||||||
|       { |       { | ||||||
|         r.exop = (char)(*p < 256 ? 16 : -64);   /* 256 is end-of-block code */ |         r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */ | ||||||
|         r.base = *p++;          /* simple code is just the value */ |         r.base = *p++;          /* simple code is just the value */ | ||||||
|       } |       } | ||||||
|       else |       else | ||||||
|       { |       { | ||||||
|         r.exop = (char)e[*p - s];       /* non-simple--look up in lists */ |         r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ | ||||||
|         r.base = d[*p++ - s]; |         r.base = d[*p++ - s]; | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -294,20 +301,20 @@ z_stream *zs;		/* for zalloc function */ | |||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_trees_bits(c, bb, tb, z) | int inflate_trees_bits(c, bb, tb, z) | ||||||
| uInt *c;		/* 19 code lengths */ | uIntf *c;               /* 19 code lengths */ | ||||||
| uInt *bb;		/* bits tree desired/actual depth */ | uIntf *bb;              /* bits tree desired/actual depth */ | ||||||
| inflate_huft **tb;	/* bits tree result */ | inflate_huft * FAR *tb; /* bits tree result */ | ||||||
| z_stream *z;		/* for zfree function */ | z_streamp z;            /* for zfree function */ | ||||||
| { | { | ||||||
|   int r; |   int r; | ||||||
|  |  | ||||||
|   r = huft_build(c, 19, 19, (uInt*)Z_NULL, (uInt*)Z_NULL, tb, bb, z); |   r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); | ||||||
|   if (r == Z_DATA_ERROR) |   if (r == Z_DATA_ERROR) | ||||||
|     z->msg = "oversubscribed dynamic bit lengths tree"; |     z->msg = (char*)"oversubscribed dynamic bit lengths tree"; | ||||||
|   else if (r == Z_BUF_ERROR) |   else if (r == Z_BUF_ERROR || *bb == 0) | ||||||
|   { |   { | ||||||
|     inflate_trees_free(*tb, z); |     inflate_trees_free(*tb, z); | ||||||
|     z->msg = "incomplete dynamic bit lengths tree"; |     z->msg = (char*)"incomplete dynamic bit lengths tree"; | ||||||
|     r = Z_DATA_ERROR; |     r = Z_DATA_ERROR; | ||||||
|   } |   } | ||||||
|   return r; |   return r; | ||||||
| @@ -315,43 +322,50 @@ z_stream *z;		/* for zfree function */ | |||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z) | int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, z) | ||||||
| uInt nl;		/* number of literal/length codes */ | uInt nl;                /* number of literal/length codes */ | ||||||
| uInt nd;		/* number of distance codes */ | uInt nd;                /* number of distance codes */ | ||||||
| uInt *c;		/* that many (total) code lengths */ | uIntf *c;               /* that many (total) code lengths */ | ||||||
| uInt *bl;		/* literal desired/actual bit depth */ | uIntf *bl;              /* literal desired/actual bit depth */ | ||||||
| uInt *bd;		/* distance desired/actual bit depth */ | uIntf *bd;              /* distance desired/actual bit depth */ | ||||||
| inflate_huft **tl;	/* literal/length tree result */ | inflate_huft * FAR *tl; /* literal/length tree result */ | ||||||
| inflate_huft **td;	/* distance tree result */ | inflate_huft * FAR *td; /* distance tree result */ | ||||||
| z_stream *z;		/* for zfree function */ | z_streamp z;            /* for zfree function */ | ||||||
| { | { | ||||||
|   int r; |   int r; | ||||||
|  |  | ||||||
|   /* build literal/length tree */ |   /* build literal/length tree */ | ||||||
|   if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK) |   r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z); | ||||||
|  |   if (r != Z_OK || *bl == 0) | ||||||
|   { |   { | ||||||
|     if (r == Z_DATA_ERROR) |     if (r == Z_DATA_ERROR) | ||||||
|       z->msg = "oversubscribed literal/length tree"; |       z->msg = (char*)"oversubscribed literal/length tree"; | ||||||
|     else if (r == Z_BUF_ERROR) |     else if (r != Z_MEM_ERROR) | ||||||
|     { |     { | ||||||
|       inflate_trees_free(*tl, z); |       inflate_trees_free(*tl, z); | ||||||
|       z->msg = "incomplete literal/length tree"; |       z->msg = (char*)"incomplete literal/length tree"; | ||||||
|       r = Z_DATA_ERROR; |       r = Z_DATA_ERROR; | ||||||
|     } |     } | ||||||
|     return r; |     return r; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /* build distance tree */ |   /* build distance tree */ | ||||||
|   if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK) |   r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z); | ||||||
|  |   if (r != Z_OK || (*bd == 0 && nl > 257)) | ||||||
|   { |   { | ||||||
|     if (r == Z_DATA_ERROR) |     if (r == Z_DATA_ERROR) | ||||||
|       z->msg = "oversubscribed literal/length tree"; |       z->msg = (char*)"oversubscribed distance tree"; | ||||||
|     else if (r == Z_BUF_ERROR) { |     else if (r == Z_BUF_ERROR) { | ||||||
| #ifdef PKZIP_BUG_WORKAROUND | #ifdef PKZIP_BUG_WORKAROUND | ||||||
|       r = Z_OK; |       r = Z_OK; | ||||||
|     } |     } | ||||||
| #else | #else | ||||||
|       inflate_trees_free(*td, z); |       inflate_trees_free(*td, z); | ||||||
|       z->msg = "incomplete literal/length tree"; |       z->msg = (char*)"incomplete distance tree"; | ||||||
|  |       r = Z_DATA_ERROR; | ||||||
|  |     } | ||||||
|  |     else if (r != Z_MEM_ERROR) | ||||||
|  |     { | ||||||
|  |       z->msg = (char*)"empty distance tree with lengths"; | ||||||
|       r = Z_DATA_ERROR; |       r = Z_DATA_ERROR; | ||||||
|     } |     } | ||||||
|     inflate_trees_free(*tl, z); |     inflate_trees_free(*tl, z); | ||||||
| @@ -365,10 +379,8 @@ z_stream *z;		/* for zfree function */ | |||||||
|  |  | ||||||
|  |  | ||||||
| /* build fixed tables only once--keep them here */ | /* build fixed tables only once--keep them here */ | ||||||
| local int fixed_lock = 0; |  | ||||||
| local int fixed_built = 0; | local int fixed_built = 0; | ||||||
| #define FIXEDH 530	/* number of hufts used by fixed tables */ | #define FIXEDH 530      /* number of hufts used by fixed tables */ | ||||||
| local uInt fixed_left = FIXEDH; |  | ||||||
| local inflate_huft fixed_mem[FIXEDH]; | local inflate_huft fixed_mem[FIXEDH]; | ||||||
| local uInt fixed_bl; | local uInt fixed_bl; | ||||||
| local uInt fixed_bd; | local uInt fixed_bd; | ||||||
| @@ -376,47 +388,36 @@ local inflate_huft *fixed_tl; | |||||||
| local inflate_huft *fixed_td; | local inflate_huft *fixed_td; | ||||||
|  |  | ||||||
|  |  | ||||||
| local voidp falloc(q, n, s) | local voidpf falloc(q, n, s) | ||||||
| voidp q;	/* opaque pointer (not used) */ | voidpf q;       /* opaque pointer */ | ||||||
| uInt n;		/* number of items */ | uInt n;         /* number of items */ | ||||||
| uInt s;		/* size of item */ | uInt s;         /* size of item */ | ||||||
| { | { | ||||||
|   Assert(s == sizeof(inflate_huft) && n <= fixed_left, |   Assert(s == sizeof(inflate_huft) && n <= *(intf *)q, | ||||||
|          "inflate_trees falloc overflow"); |          "inflate_trees falloc overflow"); | ||||||
|   if (q) s++; /* to make some compilers happy */ |   *(intf *)q -= n+s-s; /* s-s to avoid warning */ | ||||||
|   fixed_left -= n; |   return (voidpf)(fixed_mem + *(intf *)q); | ||||||
|   return (voidp)(fixed_mem + fixed_left); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| local void ffree(q, p) |  | ||||||
| voidp q; |  | ||||||
| voidp p; |  | ||||||
| { |  | ||||||
|   Assert(0, "inflate_trees ffree called!"); |  | ||||||
|   if (q) q = p; /* to make some compilers happy */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_trees_fixed(bl, bd, tl, td) | int inflate_trees_fixed(bl, bd, tl, td) | ||||||
| uInt *bl;		/* literal desired/actual bit depth */ | uIntf *bl;               /* literal desired/actual bit depth */ | ||||||
| uInt *bd;		/* distance desired/actual bit depth */ | uIntf *bd;               /* distance desired/actual bit depth */ | ||||||
| inflate_huft **tl;	/* literal/length tree result */ | inflate_huft * FAR *tl;  /* literal/length tree result */ | ||||||
| inflate_huft **td;	/* distance tree result */ | inflate_huft * FAR *td;  /* distance tree result */ | ||||||
| { | { | ||||||
|   /* build fixed tables if not built already--lock out other instances */ |   /* build fixed tables if not already (multiple overlapped executions ok) */ | ||||||
|   while (++fixed_lock > 1) |  | ||||||
|     fixed_lock--; |  | ||||||
|   if (!fixed_built) |   if (!fixed_built) | ||||||
|   { |   { | ||||||
|     int k;		/* temporary variable */ |     int k;              /* temporary variable */ | ||||||
|     unsigned c[288];	/* length list for huft_build */ |     unsigned c[288];    /* length list for huft_build */ | ||||||
|     z_stream z;		/* for falloc function */ |     z_stream z;         /* for falloc function */ | ||||||
|  |     int f = FIXEDH;     /* number of hufts left in fixed_mem */ | ||||||
|  |  | ||||||
|     /* set up fake z_stream for memory routines */ |     /* set up fake z_stream for memory routines */ | ||||||
|     z.zalloc = falloc; |     z.zalloc = falloc; | ||||||
|     z.zfree = ffree; |     z.zfree = Z_NULL; | ||||||
|     z.opaque = Z_NULL; |     z.opaque = (voidpf)&f; | ||||||
|  |  | ||||||
|     /* literal table */ |     /* literal table */ | ||||||
|     for (k = 0; k < 144; k++) |     for (k = 0; k < 144; k++) | ||||||
| @@ -437,9 +438,9 @@ inflate_huft **td;	/* distance tree result */ | |||||||
|     huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); |     huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); | ||||||
|  |  | ||||||
|     /* done */ |     /* done */ | ||||||
|  |     Assert(f == 0, "invalid build of fixed tables"); | ||||||
|     fixed_built = 1; |     fixed_built = 1; | ||||||
|   } |   } | ||||||
|   fixed_lock--; |  | ||||||
|   *bl = fixed_bl; |   *bl = fixed_bl; | ||||||
|   *bd = fixed_bd; |   *bd = fixed_bd; | ||||||
|   *tl = fixed_tl; |   *tl = fixed_tl; | ||||||
| @@ -449,20 +450,25 @@ inflate_huft **td;	/* distance tree result */ | |||||||
|  |  | ||||||
|  |  | ||||||
| int inflate_trees_free(t, z) | int inflate_trees_free(t, z) | ||||||
| inflate_huft *t;	/* table to free */ | inflate_huft *t;        /* table to free */ | ||||||
| z_stream *z;		/* for zfree function */ | z_streamp z;            /* for zfree function */ | ||||||
| /* Free the malloc'ed tables built by huft_build(), which makes a linked | /* Free the malloc'ed tables built by huft_build(), which makes a linked | ||||||
|    list of the tables it made, with the links in a dummy first entry of |    list of the tables it made, with the links in a dummy first entry of | ||||||
|    each table. */ |    each table. */ | ||||||
| { | { | ||||||
|   register inflate_huft *p, *q; |   register inflate_huft *p, *q, *r; | ||||||
|  |  | ||||||
|   /* Don't free fixed trees */ |  | ||||||
|   if (t >= fixed_mem && t <= fixed_mem + FIXEDH) |  | ||||||
|     return Z_OK; |  | ||||||
|  |  | ||||||
|  |   /* Reverse linked list */ | ||||||
|  |   p = Z_NULL; | ||||||
|  |   q = t; | ||||||
|  |   while (q != Z_NULL) | ||||||
|  |   { | ||||||
|  |     r = (q - 1)->next; | ||||||
|  |     (q - 1)->next = p; | ||||||
|  |     p = q; | ||||||
|  |     q = r; | ||||||
|  |   } | ||||||
|   /* Go through linked list, freeing from the malloced (t[-1]) address. */ |   /* Go through linked list, freeing from the malloced (t[-1]) address. */ | ||||||
|   p = t; |  | ||||||
|   while (p != Z_NULL) |   while (p != Z_NULL) | ||||||
|   { |   { | ||||||
|     q = (--p)->next; |     q = (--p)->next; | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								inftrees.h
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								inftrees.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* inftrees.h -- header to use inftrees.c | /* inftrees.h -- header to use inftrees.c | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -9,21 +9,17 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* Huffman code lookup table entry--this entry is four bytes for machines | /* Huffman code lookup table entry--this entry is four bytes for machines | ||||||
|    that have 16-bit pointers (e.g. PC's in the small or medium model). |    that have 16-bit pointers (e.g. PC's in the small or medium model). */ | ||||||
|    Valid extra bits (exop) are 0..13.  exop == -64 is EOB (end of block), |  | ||||||
|    exop == 16 means that v is a literal, exop < 0 means that v is a pointer | typedef struct inflate_huft_s FAR inflate_huft; | ||||||
|    to the next table, which codes -exop bits, and lastly exop == -128 |  | ||||||
|    indicates an unused code.  If a code with exop == -128 is looked up, |  | ||||||
|    this implies an error in the data. */ |  | ||||||
|  |  | ||||||
| typedef struct inflate_huft_s inflate_huft; |  | ||||||
| struct inflate_huft_s { | struct inflate_huft_s { | ||||||
|   union { |   union { | ||||||
|     struct { |     struct { | ||||||
|       char Exop;        /* number of extra bits or operation */ |       Byte Exop;        /* number of extra bits or operation */ | ||||||
|       char Bits;        /* number of bits in this code or subcode */ |       Byte Bits;        /* number of bits in this code or subcode */ | ||||||
|     } what; |     } what; | ||||||
|     Byte *pad;          /* pad structure to a power of 2 (4 bytes for */ |     Bytef *pad;         /* pad structure to a power of 2 (4 bytes for */ | ||||||
|   } word;               /*  16-bit, 8 bytes for 32-bit machines) */ |   } word;               /*  16-bit, 8 bytes for 32-bit machines) */ | ||||||
|   union { |   union { | ||||||
|     uInt Base;          /* literal, length base, or distance base */ |     uInt Base;          /* literal, length base, or distance base */ | ||||||
| @@ -35,28 +31,29 @@ struct inflate_huft_s { | |||||||
|   extern uInt inflate_hufts; |   extern uInt inflate_hufts; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| extern int inflate_trees_bits __P(( | extern int inflate_trees_bits OF(( | ||||||
|     uInt *,			/* 19 code lengths */ |     uIntf *,                    /* 19 code lengths */ | ||||||
|     uInt *,			/* bits tree desired/actual depth */ |     uIntf *,                    /* bits tree desired/actual depth */ | ||||||
|     inflate_huft **,		/* bits tree result */ |     inflate_huft * FAR *,       /* bits tree result */ | ||||||
|     z_stream *));		/* for zalloc, zfree functions */ |     z_streamp ));               /* for zalloc, zfree functions */ | ||||||
|  |  | ||||||
| extern int inflate_trees_dynamic __P(( | extern int inflate_trees_dynamic OF(( | ||||||
|     uInt,			/* number of literal/length codes */ |     uInt,                       /* number of literal/length codes */ | ||||||
|     uInt,			/* number of distance codes */ |     uInt,                       /* number of distance codes */ | ||||||
|     uInt *,			/* that many (total) code lengths */ |     uIntf *,                    /* that many (total) code lengths */ | ||||||
|     uInt *,			/* literal desired/actual bit depth */ |     uIntf *,                    /* literal desired/actual bit depth */ | ||||||
|     uInt *,			/* distance desired/actual bit depth */ |     uIntf *,                    /* distance desired/actual bit depth */ | ||||||
|     inflate_huft **,		/* literal/length tree result */ |     inflate_huft * FAR *,       /* literal/length tree result */ | ||||||
|     inflate_huft **,		/* distance tree result */ |     inflate_huft * FAR *,       /* distance tree result */ | ||||||
|     z_stream *));		/* for zalloc, zfree functions */ |     z_streamp ));               /* for zalloc, zfree functions */ | ||||||
|  |  | ||||||
| extern int inflate_trees_fixed __P(( | extern int inflate_trees_fixed OF(( | ||||||
|     uInt *,			/* literal desired/actual bit depth */ |     uIntf *,                    /* literal desired/actual bit depth */ | ||||||
|     uInt *,			/* distance desired/actual bit depth */ |     uIntf *,                    /* distance desired/actual bit depth */ | ||||||
|     inflate_huft **,		/* literal/length tree result */ |     inflate_huft * FAR *,       /* literal/length tree result */ | ||||||
|     inflate_huft **));		/* distance tree result */ |     inflate_huft * FAR *));     /* distance tree result */ | ||||||
|  |  | ||||||
|  | extern int inflate_trees_free OF(( | ||||||
|  |     inflate_huft *,             /* tables to free */ | ||||||
|  |     z_streamp ));               /* for zfree function */ | ||||||
|  |  | ||||||
| extern int inflate_trees_free __P(( |  | ||||||
|     inflate_huft *,		/* tables to free */ |  | ||||||
|     z_stream *));		/* for zfree function */ |  | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								infutil.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								infutil.c
									
									
									
									
									
								
							| @@ -1,16 +1,18 @@ | |||||||
| /* inflate_util.c -- data and routines common to blocks and codes | /* inflate_util.c -- data and routines common to blocks and codes | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
|  | #include "infblock.h" | ||||||
| #include "inftrees.h" | #include "inftrees.h" | ||||||
|  | #include "infcodes.h" | ||||||
| #include "infutil.h" | #include "infutil.h" | ||||||
|  |  | ||||||
| struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
| /* And'ing with mask[n] masks the lower n bits */ | /* And'ing with mask[n] masks the lower n bits */ | ||||||
| uInt inflate_mask[] = { | uInt inflate_mask[17] = { | ||||||
|     0x0000, |     0x0000, | ||||||
|     0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, |     0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | ||||||
|     0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff |     0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff | ||||||
| @@ -19,12 +21,13 @@ uInt inflate_mask[] = { | |||||||
|  |  | ||||||
| /* copy as much as possible from the sliding window to the output area */ | /* copy as much as possible from the sliding window to the output area */ | ||||||
| int inflate_flush(s, z, r) | int inflate_flush(s, z, r) | ||||||
| struct inflate_blocks_state *s; | inflate_blocks_statef *s; | ||||||
| z_stream *z; | z_streamp z; | ||||||
| int r; | int r; | ||||||
| { | { | ||||||
|   uInt n; |   uInt n; | ||||||
|   Byte *p, *q; |   Bytef *p; | ||||||
|  |   Bytef *q; | ||||||
|  |  | ||||||
|   /* local copies of source and destination pointers */ |   /* local copies of source and destination pointers */ | ||||||
|   p = z->next_out; |   p = z->next_out; | ||||||
| @@ -41,7 +44,7 @@ int r; | |||||||
|  |  | ||||||
|   /* update check information */ |   /* update check information */ | ||||||
|   if (s->checkfn != Z_NULL) |   if (s->checkfn != Z_NULL) | ||||||
|     s->check = (*s->checkfn)(s->check, q, n); |     z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||||||
|  |  | ||||||
|   /* copy as far as end of window */ |   /* copy as far as end of window */ | ||||||
|   zmemcpy(p, q, n); |   zmemcpy(p, q, n); | ||||||
| @@ -67,7 +70,7 @@ int r; | |||||||
|  |  | ||||||
|     /* update check information */ |     /* update check information */ | ||||||
|     if (s->checkfn != Z_NULL) |     if (s->checkfn != Z_NULL) | ||||||
|       s->check = (*s->checkfn)(s->check, q, n); |       z->adler = s->check = (*s->checkfn)(s->check, q, n); | ||||||
|  |  | ||||||
|     /* copy */ |     /* copy */ | ||||||
|     zmemcpy(p, q, n); |     zmemcpy(p, q, n); | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								infutil.h
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								infutil.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* infutil.h -- types and macros common to blocks and codes | /* infutil.h -- types and macros common to blocks and codes | ||||||
|  * Copyright (C) 1995 Mark Adler |  * Copyright (C) 1995-1998 Mark Adler | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -8,50 +8,60 @@ | |||||||
|    subject to change. Applications should only use zlib.h. |    subject to change. Applications should only use zlib.h. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #ifndef _INFUTIL_H | ||||||
|  | #define _INFUTIL_H | ||||||
|  |  | ||||||
|  | typedef enum { | ||||||
|  |       TYPE,     /* get type bits (3, including end bit) */ | ||||||
|  |       LENS,     /* get lengths for stored */ | ||||||
|  |       STORED,   /* processing stored block */ | ||||||
|  |       TABLE,    /* get table lengths */ | ||||||
|  |       BTREE,    /* get bit lengths tree for a dynamic block */ | ||||||
|  |       DTREE,    /* get length, distance trees for a dynamic block */ | ||||||
|  |       CODES,    /* processing fixed or dynamic block */ | ||||||
|  |       DRY,      /* output remaining window bytes */ | ||||||
|  |       DONE,     /* finished last block, done */ | ||||||
|  |       BAD}      /* got a data error--stuck here */ | ||||||
|  | inflate_block_mode; | ||||||
|  |  | ||||||
| /* inflate blocks semi-private state */ | /* inflate blocks semi-private state */ | ||||||
| struct inflate_blocks_state { | struct inflate_blocks_state { | ||||||
|  |  | ||||||
|   /* mode */ |   /* mode */ | ||||||
|   enum { |   inflate_block_mode  mode;     /* current inflate_block mode */ | ||||||
|       TYPE,	/* get type bits (3, including end bit) */ |  | ||||||
|       LENS,	/* get lengths for stored */ |  | ||||||
|       STORED,	/* processing stored block */ |  | ||||||
|       TABLE,	/* get table lengths */ |  | ||||||
|       BTREE,	/* get bit lengths tree for a dynamic block */ |  | ||||||
|       DTREE,	/* get length, distance trees for a dynamic block */ |  | ||||||
|       CODES,	/* processing fixed or dynamic block */ |  | ||||||
|       DRY,	/* output remaining window bytes */ |  | ||||||
|       DONE,	/* finished last block, done */ |  | ||||||
|       BAD}	/* got a data error--stuck here */ |  | ||||||
|     mode;		/* current inflate_block mode */ |  | ||||||
|  |  | ||||||
|   /* mode dependent information */ |   /* mode dependent information */ | ||||||
|   union { |   union { | ||||||
|     uInt left;		/* if STORED, bytes left to copy */ |     uInt left;          /* if STORED, bytes left to copy */ | ||||||
|     struct { |     struct { | ||||||
|       uInt table;		/* table lengths (14 bits) */ |       uInt table;               /* table lengths (14 bits) */ | ||||||
|       uInt index;		/* index into blens (or border) */ |       uInt index;               /* index into blens (or border) */ | ||||||
|       uInt *blens;		/* bit lengths of codes */ |       uIntf *blens;             /* bit lengths of codes */ | ||||||
|       uInt bb;			/* bit length tree depth */ |       uInt bb;                  /* bit length tree depth */ | ||||||
|       inflate_huft *tb;		/* bit length decoding tree */ |       inflate_huft *tb;         /* bit length decoding tree */ | ||||||
|     } trees;		/* if DTREE, decoding info for trees */ |     } trees;            /* if DTREE, decoding info for trees */ | ||||||
|     struct inflate_codes_state |     struct { | ||||||
|       *codes;		/* if CODES, current state */ |       inflate_huft *tl; | ||||||
|   } sub;		/* submode */ |       inflate_huft *td;         /* trees to free */ | ||||||
|   uInt last;		/* true if this block is the last block */ |       inflate_codes_statef  | ||||||
|  |          *codes; | ||||||
|  |     } decode;           /* if CODES, current state */ | ||||||
|  |   } sub;                /* submode */ | ||||||
|  |   uInt last;            /* true if this block is the last block */ | ||||||
|  |  | ||||||
|   /* mode independent information */ |   /* mode independent information */ | ||||||
|   uInt bitk;		/* bits in bit buffer */ |   uInt bitk;            /* bits in bit buffer */ | ||||||
|   uLong bitb;		/* bit buffer */ |   uLong bitb;           /* bit buffer */ | ||||||
|   Byte *window;		/* sliding window */ |   Bytef *window;        /* sliding window */ | ||||||
|   Byte *end;		/* one byte after sliding window */ |   Bytef *end;           /* one byte after sliding window */ | ||||||
|   Byte *read;		/* window read pointer */ |   Bytef *read;          /* window read pointer */ | ||||||
|   Byte *write;		/* window write pointer */ |   Bytef *write;         /* window write pointer */ | ||||||
|   check_func checkfn;   /* check function */ |   check_func checkfn;   /* check function */ | ||||||
|   uLong check;		/* check on output */ |   uLong check;          /* check on output */ | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| /* defines for inflate input/output */ | /* defines for inflate input/output */ | ||||||
| /*   update pointers and return */ | /*   update pointers and return */ | ||||||
| #define UPDBITS {s->bitb=b;s->bitk=k;} | #define UPDBITS {s->bitb=b;s->bitk=k;} | ||||||
| @@ -66,22 +76,24 @@ struct inflate_blocks_state { | |||||||
| #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | ||||||
| #define DUMPBITS(j) {b>>=(j);k-=(j);} | #define DUMPBITS(j) {b>>=(j);k-=(j);} | ||||||
| /*   output bytes */ | /*   output bytes */ | ||||||
| #define WAVAIL (q<s->read?s->read-q-1:s->end-q) | #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) | ||||||
| #define LOADOUT {q=s->write;m=WAVAIL;} | #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} | ||||||
| #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}} | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} | ||||||
| #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} | #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} | ||||||
| #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | ||||||
| #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | ||||||
| /*   load local pointers */ | /*   load local pointers */ | ||||||
| #define LOAD {LOADIN LOADOUT} | #define LOAD {LOADIN LOADOUT} | ||||||
|  |  | ||||||
| /* masks for lower bits */ | /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ | ||||||
| extern uInt inflate_mask[]; | extern uInt inflate_mask[17]; | ||||||
|  |  | ||||||
| /* copy as much as possible from the sliding window to the output area */ | /* copy as much as possible from the sliding window to the output area */ | ||||||
| extern int inflate_flush __P(( | extern int inflate_flush OF(( | ||||||
|     struct inflate_blocks_state *, |     inflate_blocks_statef *, | ||||||
|     z_stream *, |     z_streamp , | ||||||
|     int)); |     int)); | ||||||
|  |  | ||||||
| struct internal_state      {int dummy;}; /* for buggy compilers */ | struct internal_state      {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
|  | #endif | ||||||
|   | |||||||
							
								
								
									
										171
									
								
								minigzip.c
									
									
									
									
									
								
							
							
						
						
									
										171
									
								
								minigzip.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* minigzip.c -- simulate gzip using the zlib compression library | /* minigzip.c -- simulate gzip using the zlib compression library | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -13,19 +13,20 @@ | |||||||
|  * or in pipe mode. |  * or in pipe mode. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: minigzip.c,v 1.3 1995/04/29 14:27:21 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| extern void exit  __P((int)); |  | ||||||
| extern int unlink __P((const char *)); |  | ||||||
|  |  | ||||||
| #ifdef STDC | #ifdef STDC | ||||||
| #  include <string.h> | #  include <string.h> | ||||||
|  | #  include <stdlib.h> | ||||||
|  | #else | ||||||
|  |    extern void exit  OF((int)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef MSDOS |  | ||||||
|  | #if defined(MSDOS) || defined(OS2) || defined(WIN32) | ||||||
| #  include <fcntl.h> | #  include <fcntl.h> | ||||||
| #  include <io.h> | #  include <io.h> | ||||||
| #  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) | #  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) | ||||||
| @@ -33,29 +34,47 @@ extern int unlink __P((const char *)); | |||||||
| #  define SET_BINARY_MODE(file) | #  define SET_BINARY_MODE(file) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef VMS | ||||||
|  | #  define unlink delete | ||||||
|  | #  define GZ_SUFFIX "-gz" | ||||||
|  | #endif | ||||||
|  | #ifdef RISCOS | ||||||
|  | #  define unlink remove | ||||||
|  | #  define GZ_SUFFIX "-gz" | ||||||
|  | #  define fileno(file) file->__file | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef GZ_SUFFIX | ||||||
|  | #  define GZ_SUFFIX ".gz" | ||||||
|  | #endif | ||||||
|  | #define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) | ||||||
|  |  | ||||||
|  | extern int unlink OF((const char *)); | ||||||
|  |  | ||||||
| #define BUFLEN 4096 | #define BUFLEN 4096 | ||||||
| #define MAX_NAME_LEN 1024 | #define MAX_NAME_LEN 1024 | ||||||
|  |  | ||||||
| #define local static | #ifdef MAXSEG_64K | ||||||
| /* For MSDOS and other systems with limitation on stack size. For Unix, | #  define local static | ||||||
|     #define local |    /* Needed for systems with limitation on stack size. */ | ||||||
|    works also. | #else | ||||||
|  */ | #  define local | ||||||
|  | #endif | ||||||
|  |  | ||||||
| char *prog; | char *prog; | ||||||
|  |  | ||||||
| void error           __P((char *msg)); | void error           OF((const char *msg)); | ||||||
| void gz_compress     __P((FILE   *in, gzFile out)); | void gz_compress     OF((FILE   *in, gzFile out)); | ||||||
| void gz_uncompress   __P((gzFile in, FILE   *out)); | void gz_uncompress   OF((gzFile in, FILE   *out)); | ||||||
| void file_compress   __P((char  *file)); | void file_compress   OF((char  *file)); | ||||||
| void file_uncompress __P((char  *file)); | void file_uncompress OF((char  *file)); | ||||||
| void main            __P((int argc, char *argv[])); | int  main            OF((int argc, char *argv[])); | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Display error message and exit |  * Display error message and exit | ||||||
|  */ |  */ | ||||||
| void error(msg) | void error(msg) | ||||||
|     char *msg; |     const char *msg; | ||||||
| { | { | ||||||
|     fprintf(stderr, "%s: %s\n", prog, msg); |     fprintf(stderr, "%s: %s\n", prog, msg); | ||||||
|     exit(1); |     exit(1); | ||||||
| @@ -73,14 +92,14 @@ void gz_compress(in, out) | |||||||
|     int err; |     int err; | ||||||
|  |  | ||||||
|     for (;;) { |     for (;;) { | ||||||
| 	len = fread(buf, 1, sizeof(buf), in); |         len = fread(buf, 1, sizeof(buf), in); | ||||||
| 	if (ferror(in)) { |         if (ferror(in)) { | ||||||
| 	    perror("fread"); |             perror("fread"); | ||||||
| 	    exit(1); |             exit(1); | ||||||
| 	} |         } | ||||||
| 	if (len == 0) break; |         if (len == 0) break; | ||||||
|  |  | ||||||
| 	if (gzwrite(out, buf, len) != len) error(gzerror(out, &err)); |         if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); | ||||||
|     } |     } | ||||||
|     fclose(in); |     fclose(in); | ||||||
|     if (gzclose(out) != Z_OK) error("failed gzclose"); |     if (gzclose(out) != Z_OK) error("failed gzclose"); | ||||||
| @@ -98,11 +117,13 @@ void gz_uncompress(in, out) | |||||||
|     int err; |     int err; | ||||||
|  |  | ||||||
|     for (;;) { |     for (;;) { | ||||||
| 	len = gzread(in, buf, sizeof(buf)); |         len = gzread(in, buf, sizeof(buf)); | ||||||
| 	if (len < 0) error (gzerror(in, &err)); |         if (len < 0) error (gzerror(in, &err)); | ||||||
| 	if (len == 0) break; |         if (len == 0) break; | ||||||
|  |  | ||||||
| 	if (fwrite(buf, 1, len, out) != (uInt)len) error("failed fwrite"); |         if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { | ||||||
|  | 	    error("failed fwrite"); | ||||||
|  | 	} | ||||||
|     } |     } | ||||||
|     if (fclose(out)) error("failed fclose"); |     if (fclose(out)) error("failed fclose"); | ||||||
|  |  | ||||||
| @@ -122,17 +143,17 @@ void file_compress(file) | |||||||
|     gzFile out; |     gzFile out; | ||||||
|  |  | ||||||
|     strcpy(outfile, file); |     strcpy(outfile, file); | ||||||
|     strcat(outfile, ".gz"); |     strcat(outfile, GZ_SUFFIX); | ||||||
|  |  | ||||||
|     in = fopen(file, "rb"); |     in = fopen(file, "rb"); | ||||||
|     if (in == NULL) { |     if (in == NULL) { | ||||||
| 	perror(file); |         perror(file); | ||||||
| 	exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|     out = gzopen(outfile, "wb"); |     out = gzopen(outfile, "wb"); /* use "wb9" for maximal compression */ | ||||||
|     if (out == NULL) { |     if (out == NULL) { | ||||||
| 	fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); |         fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); | ||||||
| 	exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|     gz_compress(in, out); |     gz_compress(in, out); | ||||||
|  |  | ||||||
| @@ -154,24 +175,24 @@ void file_uncompress(file) | |||||||
|  |  | ||||||
|     strcpy(buf, file); |     strcpy(buf, file); | ||||||
|  |  | ||||||
|     if (len > 3 && strcmp(file+len-3, ".gz") == 0) { |     if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { | ||||||
| 	infile = file; |         infile = file; | ||||||
| 	outfile = buf; |         outfile = buf; | ||||||
| 	outfile[len-3] = '\0'; |         outfile[len-3] = '\0'; | ||||||
|     } else { |     } else { | ||||||
| 	outfile = file; |         outfile = file; | ||||||
| 	infile = buf; |         infile = buf; | ||||||
| 	strcat(infile, ".gz"); |         strcat(infile, GZ_SUFFIX); | ||||||
|     } |     } | ||||||
|     in = gzopen(infile, "rb"); |     in = gzopen(infile, "rb"); | ||||||
|     if (in == NULL) { |     if (in == NULL) { | ||||||
| 	fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); |         fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); | ||||||
| 	exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|     out = fopen(outfile, "wb"); |     out = fopen(outfile, "wb"); | ||||||
|     if (out == NULL) { |     if (out == NULL) { | ||||||
| 	perror(file); |         perror(file); | ||||||
| 	exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     gz_uncompress(in, out); |     gz_uncompress(in, out); | ||||||
| @@ -181,45 +202,61 @@ void file_uncompress(file) | |||||||
|  |  | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Usage:  minigzip [-d] [files...] |  * Usage:  minigzip [-d] [-f] [-h] [-1 to -9] [files...] | ||||||
|  |  *   -d : decompress | ||||||
|  |  *   -f : compress with Z_FILTERED | ||||||
|  |  *   -h : compress with Z_HUFFMAN_ONLY | ||||||
|  |  *   -1 to -9 : compression level | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| void main(argc, argv) | int main(argc, argv) | ||||||
|     int argc; |     int argc; | ||||||
|     char *argv[]; |     char *argv[]; | ||||||
| { | { | ||||||
|     int uncompr = 0; |     int uncompr = 0; | ||||||
|     gzFile file; |     gzFile file; | ||||||
|  |     char outmode[20]; | ||||||
|  |  | ||||||
|  |     strcpy(outmode, "wb6 "); | ||||||
|  |  | ||||||
|     prog = argv[0]; |     prog = argv[0]; | ||||||
|     argc--, argv++; |     argc--, argv++; | ||||||
|  |  | ||||||
|     if (argc > 0) { |     while (argc > 0) { | ||||||
| 	uncompr = (strcmp(*argv, "-d") == 0); |       if (strcmp(*argv, "-d") == 0) | ||||||
| 	if (uncompr) { | 	uncompr = 1; | ||||||
| 	    argc--, argv++; |       else if (strcmp(*argv, "-f") == 0) | ||||||
| 	} | 	outmode[3] = 'f'; | ||||||
|  |       else if (strcmp(*argv, "-h") == 0) | ||||||
|  | 	outmode[3] = 'h'; | ||||||
|  |       else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && | ||||||
|  | 	       (*argv)[2] == 0) | ||||||
|  | 	outmode[2] = (*argv)[1]; | ||||||
|  |       else | ||||||
|  | 	break; | ||||||
|  |       argc--, argv++; | ||||||
|     } |     } | ||||||
|     if (argc == 0) { |     if (argc == 0) { | ||||||
|         SET_BINARY_MODE(stdin); |         SET_BINARY_MODE(stdin); | ||||||
|         SET_BINARY_MODE(stdout); |         SET_BINARY_MODE(stdout); | ||||||
| 	if (uncompr) { |         if (uncompr) { | ||||||
| 	    file = gzdopen(fileno(stdin), "rb"); |             file = gzdopen(fileno(stdin), "rb"); | ||||||
|             if (file == NULL) error("can't gzdopen stdin"); |             if (file == NULL) error("can't gzdopen stdin"); | ||||||
| 	    gz_uncompress(file, stdout); |             gz_uncompress(file, stdout); | ||||||
| 	} else { |         } else { | ||||||
| 	    file = gzdopen(fileno(stdout), "wb"); |             file = gzdopen(fileno(stdout), outmode); | ||||||
|             if (file == NULL) error("can't gzdopen stdout"); |             if (file == NULL) error("can't gzdopen stdout"); | ||||||
| 	    gz_compress(stdin, file); |             gz_compress(stdin, file); | ||||||
| 	} |         } | ||||||
|     } else { |     } else { | ||||||
| 	do { |         do { | ||||||
| 	    if (uncompr) { |             if (uncompr) { | ||||||
| 		file_uncompress(*argv); |                 file_uncompress(*argv); | ||||||
| 	    } else { |             } else { | ||||||
| 		file_compress(*argv); |                 file_compress(*argv); | ||||||
| 	    } |             } | ||||||
| 	} while (argv++, --argc); |         } while (argv++, --argc); | ||||||
|     } |     } | ||||||
|     exit(0); |     exit(0); | ||||||
|  |     return 0; /* to avoid warning */ | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										104
									
								
								msdos/Makefile.b32
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								msdos/Makefile.b32
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  | # Makefile for zlib | ||||||
|  | # Borland C++    | ||||||
|  |  | ||||||
|  | # This version of the zlib makefile was adapted by Chris Young for use | ||||||
|  | # with Borland C 4.5x with the Dos Power Pack for a 32-bit protected mode | ||||||
|  | # flat memory model.  It was created for use with POV-Ray ray tracer and | ||||||
|  | # you may choose to edit the CFLAGS to suit your needs but the | ||||||
|  | # switches -WX and -DMSDOS are required. | ||||||
|  | # -- Chris Young 76702.1655@compuserve.com | ||||||
|  |  | ||||||
|  | # To use, do "make -fmakefile.b32" | ||||||
|  |  | ||||||
|  | # See zconf.h for details about the memory requirements. | ||||||
|  |  | ||||||
|  | # ------------- Borland C++ ------------- | ||||||
|  | MODEL=-WX  | ||||||
|  | CFLAGS= $(MODEL) -P-C -K -N- -k- -d -3 -r- -v- -f -DMSDOS | ||||||
|  | CC=bcc32 | ||||||
|  | LD=bcc32 | ||||||
|  | LIB=tlib | ||||||
|  | LDFLAGS= $(MODEL) | ||||||
|  | O=.obj | ||||||
|  |  | ||||||
|  | # variables | ||||||
|  | OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \ | ||||||
|  |   trees$(O) | ||||||
|  | OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\ | ||||||
|  |   trees$(O) | ||||||
|  | OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \ | ||||||
|  |   infutil$(O) inffast$(O) | ||||||
|  | OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\ | ||||||
|  |   infutil$(O)+inffast$(O) | ||||||
|  |  | ||||||
|  | all: test | ||||||
|  |  | ||||||
|  | adler32.obj: adler32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | compress.obj: compress.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | crc32.obj: crc32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | gzio.obj: gzio.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\ | ||||||
|  |    infcodes.h infutil.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\ | ||||||
|  |    infcodes.h inffast.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | uncompr.obj: uncompr.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | zutil.obj: zutil.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | example.obj: example.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | minigzip.obj: minigzip.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | # we must cut the command line to fit in the MS/DOS 128 byte limit: | ||||||
|  | zlib.lib: $(OBJ1) $(OBJ2) | ||||||
|  | 	del zlib.lib | ||||||
|  | 	$(LIB) zlib +$(OBJP1) | ||||||
|  | 	$(LIB) zlib +$(OBJP2) | ||||||
|  |  | ||||||
|  | example.exe: example.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) example.obj zlib.lib | ||||||
|  |  | ||||||
|  | minigzip.exe: minigzip.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) minigzip.obj zlib.lib | ||||||
|  |  | ||||||
|  | test: example.exe minigzip.exe | ||||||
|  | 	example | ||||||
|  | 	echo hello world | minigzip | minigzip -d  | ||||||
|  |  | ||||||
|  | #clean: | ||||||
|  | #	del *.obj | ||||||
|  | #	del *.exe | ||||||
| @@ -2,9 +2,15 @@ | |||||||
| # Borland C++   ************ UNTESTED ***********
 | # Borland C++   ************ UNTESTED ***********
 | ||||||
| 
 | 
 | ||||||
| # To use, do "make -fmakefile.bor"
 | # To use, do "make -fmakefile.bor"
 | ||||||
|  | # To compile in small model, set below: MODEL=-ms
 | ||||||
| 
 | 
 | ||||||
| # WARNING: the small model is supported but only for small values of
 | # WARNING: the small model is supported but only for small values of
 | ||||||
| # MAX_WBITS and MAX_MEM_LEVEL
 | # MAX_WBITS and MAX_MEM_LEVEL. For example:
 | ||||||
|  | #    -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3
 | ||||||
|  | # If you wish to reduce the memory requirements (default 256K for big
 | ||||||
|  | # objects plus a few K), you can add to CFLAGS below: 
 | ||||||
|  | #   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
 | ||||||
|  | # See zconf.h for details about the memory requirements.
 | ||||||
| 
 | 
 | ||||||
| # ------------- Turbo C++, Borland C++ -------------
 | # ------------- Turbo C++, Borland C++ -------------
 | ||||||
| MODEL=-ml | MODEL=-ml | ||||||
| @@ -12,7 +18,7 @@ CFLAGS=-O2 -Z $(MODEL) | |||||||
| CC=bcc | CC=bcc | ||||||
| LD=bcc | LD=bcc | ||||||
| LIB=tlib | LIB=tlib | ||||||
| #   replace bcc with tcc for Turbo C++ 1.0
 | #   replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version
 | ||||||
| LDFLAGS=$(MODEL) | LDFLAGS=$(MODEL) | ||||||
| O=.obj | O=.obj | ||||||
| 
 | 
 | ||||||
| @@ -80,6 +86,7 @@ minigzip.obj: minigzip.c zlib.h zconf.h | |||||||
| 
 | 
 | ||||||
| # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | ||||||
| zlib.lib: $(OBJ1) $(OBJ2) | zlib.lib: $(OBJ1) $(OBJ2) | ||||||
|  | 	del zlib.lib | ||||||
| 	$(LIB) zlib +$(OBJP1) | 	$(LIB) zlib +$(OBJP1) | ||||||
| 	$(LIB) zlib +$(OBJP2) | 	$(LIB) zlib +$(OBJP2) | ||||||
| 
 | 
 | ||||||
							
								
								
									
										100
									
								
								msdos/Makefile.dj2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								msdos/Makefile.dj2
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | |||||||
|  | # Makefile for zlib.  Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. | ||||||
|  | # Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  | # For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  |  | ||||||
|  | # To compile, or to compile and test, type: | ||||||
|  | #  | ||||||
|  | #   make -fmakefile.dj2;  make test -fmakefile.dj2 | ||||||
|  | #  | ||||||
|  | # To install libz.a, zconf.h and zlib.h in the djgpp directories, type: | ||||||
|  | #  | ||||||
|  | #    make install -fmakefile.dj2 | ||||||
|  | #  | ||||||
|  | # after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as | ||||||
|  | # in the sample below if the pattern of the DJGPP distribution is to | ||||||
|  | # be followed.  Remember that, while <sp>'es around <=> are ignored in | ||||||
|  | # makefiles, they are *not* in batch files or in djgpp.env. | ||||||
|  | # - - - - - | ||||||
|  | # [make] | ||||||
|  | # INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include | ||||||
|  | # LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib | ||||||
|  | # BUTT=-m486 | ||||||
|  | # - - - - - | ||||||
|  | # Alternately, these variables may be defined below, overriding the values | ||||||
|  | # in djgpp.env, as | ||||||
|  | # INCLUDE_PATH=c:\usr\include | ||||||
|  | # LIBRARY_PATH=c:\usr\lib | ||||||
|  |  | ||||||
|  | CC=gcc | ||||||
|  |  | ||||||
|  | #CFLAGS=-MMD -O | ||||||
|  | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 | ||||||
|  | #CFLAGS=-MMD -g -DDEBUG | ||||||
|  | CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||||
|  |              -Wstrict-prototypes -Wmissing-prototypes | ||||||
|  |  | ||||||
|  | # If cp.exe is available, replace "copy /Y" with "cp -fp" . | ||||||
|  | CP=copy /Y | ||||||
|  | # If gnu install.exe is available, replace $(CP) with ginstall. | ||||||
|  | INSTALL=$(CP) | ||||||
|  | # The default value of RM is "rm -f."  If "rm.exe" is found, comment out: | ||||||
|  | RM=del | ||||||
|  | LDLIBS=-L. -lz | ||||||
|  | LD=$(CC) -s -o | ||||||
|  | LDSHARED=$(CC) | ||||||
|  |  | ||||||
|  | INCL=zlib.h zconf.h | ||||||
|  | LIBS=libz.a | ||||||
|  |  | ||||||
|  | AR=ar rcs | ||||||
|  |  | ||||||
|  | prefix=/usr/local | ||||||
|  | exec_prefix = $(prefix) | ||||||
|  |  | ||||||
|  | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||||
|  |        zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||||||
|  |  | ||||||
|  | TEST_OBJS = example.o minigzip.o | ||||||
|  |  | ||||||
|  | all: example.exe minigzip.exe | ||||||
|  |  | ||||||
|  | test: all | ||||||
|  | 	./example | ||||||
|  | 	echo hello world | .\minigzip | .\minigzip -d  | ||||||
|  |  | ||||||
|  | %.o : %.c | ||||||
|  | 	$(CC) $(CFLAGS) -c $< -o $@ | ||||||
|  |  | ||||||
|  | libz.a: $(OBJS) | ||||||
|  | 	$(AR) $@ $(OBJS) | ||||||
|  |  | ||||||
|  | %.exe : %.o $(LIBS) | ||||||
|  | 	$(LD) $@ $< $(LDLIBS) | ||||||
|  |  | ||||||
|  | # INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . | ||||||
|  |  | ||||||
|  | .PHONY : uninstall clean | ||||||
|  |  | ||||||
|  | install: $(INCL) $(LIBS) | ||||||
|  | 	-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) | ||||||
|  | 	-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) | ||||||
|  | 	$(INSTALL) zlib.h $(INCLUDE_PATH) | ||||||
|  | 	$(INSTALL) zconf.h $(INCLUDE_PATH) | ||||||
|  | 	$(INSTALL) libz.a $(LIBRARY_PATH) | ||||||
|  |  | ||||||
|  | uninstall: | ||||||
|  | 	$(RM) $(INCLUDE_PATH)\zlib.h | ||||||
|  | 	$(RM) $(INCLUDE_PATH)\zconf.h | ||||||
|  | 	$(RM) $(LIBRARY_PATH)\libz.a | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	$(RM) *.d | ||||||
|  | 	$(RM) *.o | ||||||
|  | 	$(RM) *.exe | ||||||
|  | 	$(RM) libz.a | ||||||
|  | 	$(RM) foo.gz | ||||||
|  |  | ||||||
|  | DEPS := $(wildcard *.d) | ||||||
|  | ifneq ($(DEPS),) | ||||||
|  | include $(DEPS) | ||||||
|  | endif | ||||||
| @@ -2,9 +2,12 @@ | |||||||
| # Microsoft C 5.1 or later
 | # Microsoft C 5.1 or later
 | ||||||
| 
 | 
 | ||||||
| # To use, do "make makefile.msc"
 | # To use, do "make makefile.msc"
 | ||||||
|  | # To compile in small model, set below: MODEL=-AS
 | ||||||
| 
 | 
 | ||||||
| # WARNING: the small model is supported but only for small values of
 | # If you wish to reduce the memory requirements (default 256K for big
 | ||||||
| # MAX_WBITS and MAX_MEM_LEVEL
 | # objects plus a few K), you can add to CFLAGS below: 
 | ||||||
|  | #   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
 | ||||||
|  | # See zconf.h for details about the memory requirements.
 | ||||||
| 
 | 
 | ||||||
| # ------------- Microsoft C 5.1 and later -------------
 | # ------------- Microsoft C 5.1 and later -------------
 | ||||||
| MODEL=-AL | MODEL=-AL | ||||||
| @@ -12,7 +15,7 @@ CFLAGS=-Oait -Gs -nologo -W3 $(MODEL) | |||||||
| #-Ox generates bad code with MSC 5.1
 | #-Ox generates bad code with MSC 5.1
 | ||||||
| CC=cl | CC=cl | ||||||
| LD=link | LD=link | ||||||
| LDFLAGS=/e/st:0x1000/noe | LDFLAGS=/e/st:0x1500/noe | ||||||
| O=.obj | O=.obj | ||||||
| 
 | 
 | ||||||
| # variables
 | # variables
 | ||||||
| @@ -25,6 +28,8 @@ OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \ | |||||||
| OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
 | OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
 | ||||||
|   infutil$(O)+inffast$(O) |   infutil$(O)+inffast$(O) | ||||||
| 
 | 
 | ||||||
|  | all:  zlib.lib example.exe minigzip.exe | ||||||
|  | 
 | ||||||
| adler32.obj: adler32.c zutil.h zlib.h zconf.h | adler32.obj: adler32.c zutil.h zlib.h zconf.h | ||||||
| 	$(CC) -c $(CFLAGS) $*.c | 	$(CC) -c $(CFLAGS) $*.c | ||||||
| 
 | 
 | ||||||
| @@ -77,6 +82,7 @@ minigzip.obj: minigzip.c zlib.h zconf.h | |||||||
| 
 | 
 | ||||||
| # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | ||||||
| zlib.lib: $(OBJ1) $(OBJ2) | zlib.lib: $(OBJ1) $(OBJ2) | ||||||
|  | 	if exist zlib.lib del zlib.lib | ||||||
| 	lib zlib $(OBJ1); | 	lib zlib $(OBJ1); | ||||||
| 	lib zlib $(OBJ2); | 	lib zlib $(OBJ2); | ||||||
| 
 | 
 | ||||||
| @@ -2,17 +2,24 @@ | |||||||
| # TurboC 2.0
 | # TurboC 2.0
 | ||||||
| 
 | 
 | ||||||
| # To use, do "make -fmakefile.tc"
 | # To use, do "make -fmakefile.tc"
 | ||||||
|  | # To compile in small model, set below: MODEL=-ms
 | ||||||
| 
 | 
 | ||||||
| # WARNING: the small model is supported but only for small values of
 | # WARNING: the small model is supported but only for small values of
 | ||||||
| # MAX_WBITS and MAX_MEM_LEVEL
 | # MAX_WBITS and MAX_MEM_LEVEL. For example:
 | ||||||
|  | #    -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
 | ||||||
|  | # If you wish to reduce the memory requirements (default 256K for big
 | ||||||
|  | # objects plus a few K), you can add to CFLAGS below: 
 | ||||||
|  | #   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
 | ||||||
|  | # See zconf.h for details about the memory requirements.
 | ||||||
| 
 | 
 | ||||||
| # ------------- Turbo C 2.0 -------------
 | # ------------- Turbo C 2.0 -------------
 | ||||||
| MODEL=-ml | MODEL=-ml | ||||||
| CFLAGS=-O2 -Z $(MODEL) | # CFLAGS=-O2 -G -Z $(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
 | ||||||
| CC=tcc | CFLAGS=-O2 -G -Z $(MODEL) | ||||||
| LD=tcc | CC=tcc -I\tc\include | ||||||
|  | LD=tcc -L\tc\lib | ||||||
| LIB=tlib | LIB=tlib | ||||||
| LDFLAGS=$(MODEL) | LDFLAGS=$(MODEL) -f- | ||||||
| O=.obj | O=.obj | ||||||
| 
 | 
 | ||||||
| # variables
 | # variables
 | ||||||
| @@ -79,6 +86,7 @@ minigzip.obj: minigzip.c zlib.h zconf.h | |||||||
| 
 | 
 | ||||||
| # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | # we must cut the command line to fit in the MS/DOS 128 byte limit:
 | ||||||
| zlib.lib: $(OBJ1) $(OBJ2) | zlib.lib: $(OBJ1) $(OBJ2) | ||||||
|  | 	del zlib.lib | ||||||
| 	$(LIB) zlib +$(OBJP1) | 	$(LIB) zlib +$(OBJP1) | ||||||
| 	$(LIB) zlib +$(OBJP2) | 	$(LIB) zlib +$(OBJP2) | ||||||
| 
 | 
 | ||||||
							
								
								
									
										103
									
								
								msdos/Makefile.wat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								msdos/Makefile.wat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | |||||||
|  | # Makefile for zlib | ||||||
|  | # Watcom 10a | ||||||
|  |  | ||||||
|  | # This version of the zlib makefile was adapted by Chris Young for use | ||||||
|  | # with Watcom 10a 32-bit protected mode flat memory model.  It was created  | ||||||
|  | # for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to  | ||||||
|  | # suit your needs but the -DMSDOS is required. | ||||||
|  | # -- Chris Young 76702.1655@compuserve.com | ||||||
|  |  | ||||||
|  | # To use, do "wmake -f makefile.wat" | ||||||
|  |  | ||||||
|  | # See zconf.h for details about the memory requirements. | ||||||
|  |  | ||||||
|  | # ------------- Watcom 10a ------------- | ||||||
|  | MODEL=-mf  | ||||||
|  | CFLAGS= $(MODEL) -fpi87 -fp5 -zp4 -5r -w5 -oneatx -DMSDOS | ||||||
|  | CC=wcc386 | ||||||
|  | LD=wcl386 | ||||||
|  | LIB=wlib -b -c  | ||||||
|  | LDFLAGS=  | ||||||
|  | O=.obj | ||||||
|  |  | ||||||
|  | # variables | ||||||
|  | OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O)  | ||||||
|  | OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O)  | ||||||
|  | OBJ3=infutil$(O) inffast$(O) | ||||||
|  | OBJP1=adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O) | ||||||
|  | OBJP2=trees$(O)+zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O) | ||||||
|  | OBJP3=infutil$(O)+inffast$(O) | ||||||
|  |  | ||||||
|  | all: test | ||||||
|  |  | ||||||
|  | adler32.obj: adler32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | compress.obj: compress.c zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | crc32.obj: crc32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | gzio.obj: gzio.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h & | ||||||
|  |   infcodes.h infutil.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h & | ||||||
|  |   infcodes.h inffast.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | uncompr.obj: uncompr.c zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | zutil.obj: zutil.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | example.obj: example.c zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | minigzip.obj: minigzip.c zlib.h zconf.h | ||||||
|  | 	$(CC) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | # we must cut the command line to fit in the MS/DOS 128 byte limit: | ||||||
|  | zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3)  | ||||||
|  | 	del zlib.lib | ||||||
|  | 	$(LIB) zlib.lib +$(OBJP1) | ||||||
|  | 	$(LIB) zlib.lib +$(OBJP2) | ||||||
|  | 	$(LIB) zlib.lib +$(OBJP3) | ||||||
|  |  | ||||||
|  | example.exe: example.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) example.obj zlib.lib | ||||||
|  |  | ||||||
|  | minigzip.exe: minigzip.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) minigzip.obj zlib.lib | ||||||
|  |  | ||||||
|  | test: minigzip.exe example.exe | ||||||
|  | 	example | ||||||
|  | 	echo hello world | minigzip | minigzip -d >test | ||||||
|  | 	type test | ||||||
|  |  | ||||||
|  | #clean: | ||||||
|  | #	del *.obj | ||||||
|  | #	del *.exe | ||||||
							
								
								
									
										57
									
								
								msdos/zlib.def
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								msdos/zlib.def
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | LIBRARY		"zlib" | ||||||
|  |  | ||||||
|  | DESCRIPTION	'"""zlib data compression library"""' | ||||||
|  |  | ||||||
|  | EXETYPE		NT | ||||||
|  |  | ||||||
|  | SUBSYSTEM	WINDOWS | ||||||
|  |  | ||||||
|  | STUB		'WINSTUB.EXE' | ||||||
|  |  | ||||||
|  | VERSION		1.07 | ||||||
|  |  | ||||||
|  | CODE		 EXECUTE READ | ||||||
|  |  | ||||||
|  | DATA		 READ WRITE | ||||||
|  |  | ||||||
|  | HEAPSIZE	1048576,4096 | ||||||
|  |  | ||||||
|  | EXPORTS | ||||||
|  |     adler32                        @1 | ||||||
|  |     compress                       @2 | ||||||
|  |     crc32                          @3 | ||||||
|  |     deflate                        @4 | ||||||
|  |     deflateCopy                    @5 | ||||||
|  |     deflateEnd                     @6 | ||||||
|  |     deflateInit2_                  @7 | ||||||
|  |     deflateInit_                   @8 | ||||||
|  |     deflateParams                  @9 | ||||||
|  |     deflateReset                   @10 | ||||||
|  |     deflateSetDictionary           @11 | ||||||
|  |     gzclose                        @12 | ||||||
|  |     gzdopen                        @13 | ||||||
|  |     gzerror                        @14 | ||||||
|  |     gzflush                        @15 | ||||||
|  |     gzopen                         @16 | ||||||
|  |     gzread                         @17 | ||||||
|  |     gzwrite                        @18 | ||||||
|  |     inflate                        @19 | ||||||
|  |     inflateEnd                     @20 | ||||||
|  |     inflateInit2_                  @21 | ||||||
|  |     inflateInit_                   @22 | ||||||
|  |     inflateReset                   @23 | ||||||
|  |     inflateSetDictionary           @24 | ||||||
|  |     inflateSync                    @25 | ||||||
|  |     uncompress                     @26 | ||||||
|  |     zlibVersion                    @27 | ||||||
|  |     gzprintf                       @28 | ||||||
|  |     gzputc                         @29 | ||||||
|  |     gzgetc                         @30 | ||||||
|  |     gzseek                         @31 | ||||||
|  |     gzrewind                       @32 | ||||||
|  |     gztell                         @33 | ||||||
|  |     gzeof                          @34 | ||||||
|  |     gzsetparams                    @35 | ||||||
|  |     zError                         @36 | ||||||
|  |     inflateSyncPoint               @37 | ||||||
|  |     get_crc_table                  @38 | ||||||
							
								
								
									
										32
									
								
								msdos/zlib.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								msdos/zlib.rc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | #include <windows.h> | ||||||
|  |  | ||||||
|  | #define IDR_VERSION1  1 | ||||||
|  | IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE | ||||||
|  |   FILEVERSION	 1,0,7,0 | ||||||
|  |   PRODUCTVERSION 1,0,7,0 | ||||||
|  |   FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK | ||||||
|  |   FILEFLAGS	0 | ||||||
|  |   FILEOS	VOS_DOS_WINDOWS32 | ||||||
|  |   FILETYPE	VFT_DLL | ||||||
|  |   FILESUBTYPE	0	// not used | ||||||
|  | BEGIN | ||||||
|  |   BLOCK "StringFileInfo" | ||||||
|  |   BEGIN | ||||||
|  |     BLOCK "040904E4" | ||||||
|  |     //language ID = U.S. English, char set = Windows, Multilingual | ||||||
|  |  | ||||||
|  |     BEGIN | ||||||
|  |       VALUE "FileDescription", "zlib data compression library\0" | ||||||
|  |       VALUE "FileVersion",	"1.0.7\0" | ||||||
|  |       VALUE "InternalName",	"zlib\0" | ||||||
|  |       VALUE "OriginalFilename",	"zlib.lib\0" | ||||||
|  |       VALUE "ProductName",	"ZLib.DLL\0" | ||||||
|  |       VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" | ||||||
|  |       VALUE "LegalCopyright", "(C) 1995-1998 Jean-loup Gailly & Mark Adler\0" | ||||||
|  |     END | ||||||
|  |   END | ||||||
|  |   BLOCK "VarFileInfo" | ||||||
|  |   BEGIN | ||||||
|  |     VALUE "Translation", 0x0409, 1252 | ||||||
|  |   END | ||||||
|  | END | ||||||
							
								
								
									
										88
									
								
								nt/Makefile.nt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								nt/Makefile.nt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | # Makefile for zlib | ||||||
|  |  | ||||||
|  | !include <ntwin32.mak> | ||||||
|  |  | ||||||
|  | CC=cl | ||||||
|  | LD=link | ||||||
|  | CFLAGS=-O -nologo | ||||||
|  | LDFLAGS= | ||||||
|  | O=.obj | ||||||
|  |  | ||||||
|  | # variables | ||||||
|  | OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \ | ||||||
|  |   trees$(O) | ||||||
|  | OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \ | ||||||
|  |   infutil$(O) inffast$(O) | ||||||
|  |  | ||||||
|  | all:  zlib.dll example.exe minigzip.exe | ||||||
|  |  | ||||||
|  | adler32.obj: adler32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | compress.obj: compress.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | crc32.obj: crc32.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | gzio.obj: gzio.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\ | ||||||
|  |    infcodes.h infutil.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\ | ||||||
|  |    infcodes.h inffast.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | uncompr.obj: uncompr.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | zutil.obj: zutil.c zutil.h zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | example.obj: example.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | minigzip.obj: minigzip.c zlib.h zconf.h | ||||||
|  | 	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c | ||||||
|  |  | ||||||
|  | zlib.dll: $(OBJ1) $(OBJ2) zlib.dnt | ||||||
|  | 	link $(dlllflags) -out:$@ -def:zlib.dnt $(OBJ1) $(OBJ2) $(guilibsdll) | ||||||
|  |  | ||||||
|  | zlib.lib: zlib.dll | ||||||
|  |  | ||||||
|  | example.exe: example.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) example.obj zlib.lib | ||||||
|  |  | ||||||
|  | minigzip.exe: minigzip.obj zlib.lib | ||||||
|  | 	$(LD) $(LDFLAGS) minigzip.obj zlib.lib | ||||||
|  |  | ||||||
|  | test: example.exe minigzip.exe | ||||||
|  | 	example | ||||||
|  | 	echo hello world | minigzip | minigzip -d  | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	del *.obj | ||||||
|  | 	del *.exe | ||||||
|  | 	del *.dll | ||||||
|  | 	del *.lib | ||||||
							
								
								
									
										44
									
								
								nt/zlib.dnt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								nt/zlib.dnt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  | LIBRARY		zlib.dll | ||||||
|  | EXETYPE WINDOWS | ||||||
|  | CODE		 PRELOAD MOVEABLE DISCARDABLE | ||||||
|  | DATA		 PRELOAD MOVEABLE MULTIPLE | ||||||
|  |  | ||||||
|  | EXPORTS | ||||||
|  |     adler32                        @1 | ||||||
|  |     compress                       @2 | ||||||
|  |     crc32                          @3 | ||||||
|  |     deflate                        @4 | ||||||
|  |     deflateCopy                    @5 | ||||||
|  |     deflateEnd                     @6 | ||||||
|  |     deflateInit2_                  @7 | ||||||
|  |     deflateInit_                   @8 | ||||||
|  |     deflateParams                  @9 | ||||||
|  |     deflateReset                   @10 | ||||||
|  |     deflateSetDictionary           @11 | ||||||
|  |     gzclose                        @12 | ||||||
|  |     gzdopen                        @13 | ||||||
|  |     gzerror                        @14 | ||||||
|  |     gzflush                        @15 | ||||||
|  |     gzopen                         @16 | ||||||
|  |     gzread                         @17 | ||||||
|  |     gzwrite                        @18 | ||||||
|  |     inflate                        @19 | ||||||
|  |     inflateEnd                     @20 | ||||||
|  |     inflateInit2_                  @21 | ||||||
|  |     inflateInit_                   @22 | ||||||
|  |     inflateReset                   @23 | ||||||
|  |     inflateSetDictionary           @24 | ||||||
|  |     inflateSync                    @25 | ||||||
|  |     uncompress                     @26 | ||||||
|  |     zlibVersion                    @27 | ||||||
|  |     gzprintf                       @28 | ||||||
|  |     gzputc                         @29 | ||||||
|  |     gzgetc                         @30 | ||||||
|  |     gzseek                         @31 | ||||||
|  |     gzrewind                       @32 | ||||||
|  |     gztell                         @33 | ||||||
|  |     gzeof                          @34 | ||||||
|  |     gzsetparams                    @35 | ||||||
|  |     zError                         @36 | ||||||
|  |     inflateSyncPoint               @37 | ||||||
|  |     get_crc_table                  @38 | ||||||
							
								
								
									
										365
									
								
								trees.c
									
									
									
									
									
								
							
							
						
						
									
										365
									
								
								trees.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* trees.c -- output deflated data using Huffman coding | /* trees.c -- output deflated data using Huffman coding | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly |  * Copyright (C) 1995-1998 Jean-loup Gailly | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -29,7 +29,7 @@ | |||||||
|  *          Addison-Wesley, 1983. ISBN 0-201-06672-6. |  *          Addison-Wesley, 1983. ISBN 0-201-06672-6. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: trees.c,v 1.4 1995/05/01 16:53:44 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include "deflate.h" | #include "deflate.h" | ||||||
|  |  | ||||||
| @@ -56,16 +56,16 @@ | |||||||
| #define REPZ_11_138  18 | #define REPZ_11_138  18 | ||||||
| /* repeat a zero length 11-138 times  (7 bits of repeat count) */ | /* repeat a zero length 11-138 times  (7 bits of repeat count) */ | ||||||
|  |  | ||||||
| local int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ | local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ | ||||||
|    = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; |    = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; | ||||||
|  |  | ||||||
| local int extra_dbits[D_CODES] /* extra bits for each distance code */ | local const int extra_dbits[D_CODES] /* extra bits for each distance code */ | ||||||
|    = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; |    = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; | ||||||
|  |  | ||||||
| local int extra_blbits[BL_CODES]/* extra bits for each bit length code */ | local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ | ||||||
|    = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; |    = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; | ||||||
|  |  | ||||||
| local uch bl_order[BL_CODES] | local const uch bl_order[BL_CODES] | ||||||
|    = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; |    = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; | ||||||
| /* The lengths of the bit length codes are sent in order of decreasing | /* The lengths of the bit length codes are sent in order of decreasing | ||||||
|  * probability, to avoid transmitting the lengths for unused bit length codes. |  * probability, to avoid transmitting the lengths for unused bit length codes. | ||||||
| @@ -78,13 +78,12 @@ local uch bl_order[BL_CODES] | |||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Local data. These are initialized only once. |  * Local data. These are initialized only once. | ||||||
|  * To do: initialize at compile time to be completely reentrant. ??? |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| local ct_data static_ltree[L_CODES+2]; | local ct_data static_ltree[L_CODES+2]; | ||||||
| /* The static literal tree. Since the bit lengths are imposed, there is no | /* The static literal tree. Since the bit lengths are imposed, there is no | ||||||
|  * need for the L_CODES extra codes used during heap construction. However |  * need for the L_CODES extra codes used during heap construction. However | ||||||
|  * The codes 286 and 287 are needed to build a canonical tree (see ct_init |  * The codes 286 and 287 are needed to build a canonical tree (see _tr_init | ||||||
|  * below). |  * below). | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -110,7 +109,7 @@ local int base_dist[D_CODES]; | |||||||
|  |  | ||||||
| struct static_tree_desc_s { | struct static_tree_desc_s { | ||||||
|     ct_data *static_tree;        /* static tree or NULL */ |     ct_data *static_tree;        /* static tree or NULL */ | ||||||
|     int     *extra_bits;         /* extra bits for each code or NULL */ |     const intf *extra_bits;      /* extra bits for each code or NULL */ | ||||||
|     int     extra_base;          /* base index for extra_bits */ |     int     extra_base;          /* base index for extra_bits */ | ||||||
|     int     elems;               /* max number of elements in the tree */ |     int     elems;               /* max number of elements in the tree */ | ||||||
|     int     max_length;          /* max bit length for the codes */ |     int     max_length;          /* max bit length for the codes */ | ||||||
| @@ -129,25 +128,25 @@ local static_tree_desc  static_bl_desc = | |||||||
|  * Local (static) routines in this file. |  * Local (static) routines in this file. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| local void ct_static_init __P((void)); | local void tr_static_init OF((void)); | ||||||
| local void init_block     __P((deflate_state *s)); | local void init_block     OF((deflate_state *s)); | ||||||
| local void pqdownheap     __P((deflate_state *s, ct_data *tree, int k)); | local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k)); | ||||||
| local void gen_bitlen     __P((deflate_state *s, tree_desc *desc)); | local void gen_bitlen     OF((deflate_state *s, tree_desc *desc)); | ||||||
| local void gen_codes      __P((ct_data *tree, int max_code, ush bl_count[])); | local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count)); | ||||||
| local void build_tree     __P((deflate_state *s, tree_desc *desc)); | local void build_tree     OF((deflate_state *s, tree_desc *desc)); | ||||||
| local void scan_tree      __P((deflate_state *s, ct_data *tree, int max_code)); | local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code)); | ||||||
| local void send_tree      __P((deflate_state *s, ct_data *tree, int max_code)); | local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code)); | ||||||
| local int  build_bl_tree  __P((deflate_state *s)); | local int  build_bl_tree  OF((deflate_state *s)); | ||||||
| local void send_all_trees __P((deflate_state *s, int lcodes, int dcodes, | local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, | ||||||
| 			      int blcodes)); |                               int blcodes)); | ||||||
| local void compress_block __P((deflate_state *s, ct_data *ltree, | local void compress_block OF((deflate_state *s, ct_data *ltree, | ||||||
| 			      ct_data *dtree)); |                               ct_data *dtree)); | ||||||
| local void set_data_type  __P((deflate_state *s)); | local void set_data_type  OF((deflate_state *s)); | ||||||
| local void send_bits      __P((deflate_state *s, int value, int length)); | local unsigned bi_reverse OF((unsigned value, int length)); | ||||||
| local unsigned bi_reverse __P((unsigned value, int length)); | local void bi_windup      OF((deflate_state *s)); | ||||||
| local void bi_windup      __P((deflate_state *s)); | local void bi_flush       OF((deflate_state *s)); | ||||||
| local void copy_block     __P((deflate_state *s, char *buf, unsigned len, | local void copy_block     OF((deflate_state *s, charf *buf, unsigned len, | ||||||
| 			       int header)); |                               int header)); | ||||||
|  |  | ||||||
| #ifndef DEBUG | #ifndef DEBUG | ||||||
| #  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) | #  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) | ||||||
| @@ -155,7 +154,7 @@ local void copy_block     __P((deflate_state *s, char *buf, unsigned len, | |||||||
|  |  | ||||||
| #else /* DEBUG */ | #else /* DEBUG */ | ||||||
| #  define send_code(s, c, tree) \ | #  define send_code(s, c, tree) \ | ||||||
|      { if (verbose>1) fprintf(stderr,"\ncd %3d ",(c)); \ |      { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ | ||||||
|        send_bits(s, tree[c].Code, tree[c].Len); } |        send_bits(s, tree[c].Code, tree[c].Len); } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -166,15 +165,74 @@ local void copy_block     __P((deflate_state *s, char *buf, unsigned len, | |||||||
|  * used. |  * used. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Output a short LSB first on the stream. | ||||||
|  |  * IN assertion: there is enough room in pendingBuf. | ||||||
|  |  */ | ||||||
|  | #define put_short(s, w) { \ | ||||||
|  |     put_byte(s, (uch)((w) & 0xff)); \ | ||||||
|  |     put_byte(s, (uch)((ush)(w) >> 8)); \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Send a value on a given number of bits. | ||||||
|  |  * IN assertion: length <= 16 and value fits in length bits. | ||||||
|  |  */ | ||||||
|  | #ifdef DEBUG | ||||||
|  | local void send_bits      OF((deflate_state *s, int value, int length)); | ||||||
|  |  | ||||||
|  | local void send_bits(s, value, length) | ||||||
|  |     deflate_state *s; | ||||||
|  |     int value;  /* value to send */ | ||||||
|  |     int length; /* number of bits */ | ||||||
|  | { | ||||||
|  |     Tracevv((stderr," l %2d v %4x ", length, value)); | ||||||
|  |     Assert(length > 0 && length <= 15, "invalid length"); | ||||||
|  |     s->bits_sent += (ulg)length; | ||||||
|  |  | ||||||
|  |     /* If not enough room in bi_buf, use (valid) bits from bi_buf and | ||||||
|  |      * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) | ||||||
|  |      * unused bits in value. | ||||||
|  |      */ | ||||||
|  |     if (s->bi_valid > (int)Buf_size - length) { | ||||||
|  |         s->bi_buf |= (value << s->bi_valid); | ||||||
|  |         put_short(s, s->bi_buf); | ||||||
|  |         s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); | ||||||
|  |         s->bi_valid += length - Buf_size; | ||||||
|  |     } else { | ||||||
|  |         s->bi_buf |= value << s->bi_valid; | ||||||
|  |         s->bi_valid += length; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #else /* !DEBUG */ | ||||||
|  |  | ||||||
|  | #define send_bits(s, value, length) \ | ||||||
|  | { int len = length;\ | ||||||
|  |   if (s->bi_valid > (int)Buf_size - len) {\ | ||||||
|  |     int val = value;\ | ||||||
|  |     s->bi_buf |= (val << s->bi_valid);\ | ||||||
|  |     put_short(s, s->bi_buf);\ | ||||||
|  |     s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ | ||||||
|  |     s->bi_valid += len - Buf_size;\ | ||||||
|  |   } else {\ | ||||||
|  |     s->bi_buf |= (value) << s->bi_valid;\ | ||||||
|  |     s->bi_valid += len;\ | ||||||
|  |   }\ | ||||||
|  | } | ||||||
|  | #endif /* DEBUG */ | ||||||
|  |  | ||||||
|  |  | ||||||
| #define MAX(a,b) (a >= b ? a : b) | #define MAX(a,b) (a >= b ? a : b) | ||||||
| /* the arguments must not have side effects */ | /* the arguments must not have side effects */ | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Initialize the various 'constant' tables. |  * Initialize the various 'constant' tables. In a multi-threaded environment, | ||||||
|  * To do: do this at compile time. |  * this function may be called by two threads concurrently, but this is | ||||||
|  |  * harmless since both invocations do exactly the same thing. | ||||||
|  */ |  */ | ||||||
| local void ct_static_init() | local void tr_static_init() | ||||||
| { | { | ||||||
|  |     static int static_init_done = 0; | ||||||
|     int n;        /* iterates over tree elements */ |     int n;        /* iterates over tree elements */ | ||||||
|     int bits;     /* bit counter */ |     int bits;     /* bit counter */ | ||||||
|     int length;   /* length value */ |     int length;   /* length value */ | ||||||
| @@ -183,6 +241,8 @@ local void ct_static_init() | |||||||
|     ush bl_count[MAX_BITS+1]; |     ush bl_count[MAX_BITS+1]; | ||||||
|     /* number of codes at each bit length for an optimal tree */ |     /* number of codes at each bit length for an optimal tree */ | ||||||
|  |  | ||||||
|  |     if (static_init_done) return; | ||||||
|  |  | ||||||
|     /* Initialize the mapping length (0..255) -> length code (0..28) */ |     /* Initialize the mapping length (0..255) -> length code (0..28) */ | ||||||
|     length = 0; |     length = 0; | ||||||
|     for (code = 0; code < LENGTH_CODES-1; code++) { |     for (code = 0; code < LENGTH_CODES-1; code++) { | ||||||
| @@ -191,7 +251,7 @@ local void ct_static_init() | |||||||
|             length_code[length++] = (uch)code; |             length_code[length++] = (uch)code; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Assert (length == 256, "ct_static_init: length != 256"); |     Assert (length == 256, "tr_static_init: length != 256"); | ||||||
|     /* Note that the length 255 (match length 258) can be represented |     /* Note that the length 255 (match length 258) can be represented | ||||||
|      * in two different ways: code 284 + 5 bits or code 285, so we |      * in two different ways: code 284 + 5 bits or code 285, so we | ||||||
|      * overwrite length_code[255] to use the best encoding: |      * overwrite length_code[255] to use the best encoding: | ||||||
| @@ -206,7 +266,7 @@ local void ct_static_init() | |||||||
|             dist_code[dist++] = (uch)code; |             dist_code[dist++] = (uch)code; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Assert (dist == 256, "ct_static_init: dist != 256"); |     Assert (dist == 256, "tr_static_init: dist != 256"); | ||||||
|     dist >>= 7; /* from now on, all distances are divided by 128 */ |     dist >>= 7; /* from now on, all distances are divided by 128 */ | ||||||
|     for ( ; code < D_CODES; code++) { |     for ( ; code < D_CODES; code++) { | ||||||
|         base_dist[code] = dist << 7; |         base_dist[code] = dist << 7; | ||||||
| @@ -214,7 +274,7 @@ local void ct_static_init() | |||||||
|             dist_code[256 + dist++] = (uch)code; |             dist_code[256 + dist++] = (uch)code; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     Assert (dist == 256, "ct_static_init: 256+dist != 512"); |     Assert (dist == 256, "tr_static_init: 256+dist != 512"); | ||||||
|  |  | ||||||
|     /* Construct the codes of the static literal tree */ |     /* Construct the codes of the static literal tree */ | ||||||
|     for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; |     for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; | ||||||
| @@ -232,19 +292,18 @@ local void ct_static_init() | |||||||
|     /* The static distance tree is trivial: */ |     /* The static distance tree is trivial: */ | ||||||
|     for (n = 0; n < D_CODES; n++) { |     for (n = 0; n < D_CODES; n++) { | ||||||
|         static_dtree[n].Len = 5; |         static_dtree[n].Len = 5; | ||||||
|         static_dtree[n].Code = bi_reverse(n, 5); |         static_dtree[n].Code = bi_reverse((unsigned)n, 5); | ||||||
|     } |     } | ||||||
|  |     static_init_done = 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Initialize the tree data structures for a new zlib stream. |  * Initialize the tree data structures for a new zlib stream. | ||||||
|  */ |  */ | ||||||
| void ct_init(s) | void _tr_init(s) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
| { | { | ||||||
|     if (static_dtree[0].Len == 0) { |     tr_static_init(); | ||||||
| 	ct_static_init();              /* To do: at compile time */ |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     s->compressed_len = 0L; |     s->compressed_len = 0L; | ||||||
|  |  | ||||||
| @@ -259,6 +318,7 @@ void ct_init(s) | |||||||
|  |  | ||||||
|     s->bi_buf = 0; |     s->bi_buf = 0; | ||||||
|     s->bi_valid = 0; |     s->bi_valid = 0; | ||||||
|  |     s->last_eob_len = 8; /* enough lookahead for inflate */ | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
|     s->bits_sent = 0L; |     s->bits_sent = 0L; | ||||||
| #endif | #endif | ||||||
| @@ -324,9 +384,9 @@ local void pqdownheap(s, tree, k) | |||||||
|     while (j <= s->heap_len) { |     while (j <= s->heap_len) { | ||||||
|         /* Set j to the smallest of the two sons: */ |         /* Set j to the smallest of the two sons: */ | ||||||
|         if (j < s->heap_len && |         if (j < s->heap_len && | ||||||
| 	    smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { |             smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { | ||||||
| 	    j++; |             j++; | ||||||
| 	} |         } | ||||||
|         /* Exit if v is smaller than both sons */ |         /* Exit if v is smaller than both sons */ | ||||||
|         if (smaller(tree, v, s->heap[j], s->depth)) break; |         if (smaller(tree, v, s->heap[j], s->depth)) break; | ||||||
|  |  | ||||||
| @@ -356,7 +416,7 @@ local void gen_bitlen(s, desc) | |||||||
|     ct_data *tree  = desc->dyn_tree; |     ct_data *tree  = desc->dyn_tree; | ||||||
|     int max_code   = desc->max_code; |     int max_code   = desc->max_code; | ||||||
|     ct_data *stree = desc->stat_desc->static_tree; |     ct_data *stree = desc->stat_desc->static_tree; | ||||||
|     int *extra     = desc->stat_desc->extra_bits; |     const intf *extra = desc->stat_desc->extra_bits; | ||||||
|     int base       = desc->stat_desc->extra_base; |     int base       = desc->stat_desc->extra_base; | ||||||
|     int max_length = desc->stat_desc->max_length; |     int max_length = desc->stat_desc->max_length; | ||||||
|     int h;              /* heap index */ |     int h;              /* heap index */ | ||||||
| @@ -420,7 +480,7 @@ local void gen_bitlen(s, desc) | |||||||
|             if (tree[m].Len != (unsigned) bits) { |             if (tree[m].Len != (unsigned) bits) { | ||||||
|                 Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); |                 Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); | ||||||
|                 s->opt_len += ((long)bits - (long)tree[m].Len) |                 s->opt_len += ((long)bits - (long)tree[m].Len) | ||||||
| 		              *(long)tree[m].Freq; |                               *(long)tree[m].Freq; | ||||||
|                 tree[m].Len = (ush)bits; |                 tree[m].Len = (ush)bits; | ||||||
|             } |             } | ||||||
|             n--; |             n--; | ||||||
| @@ -439,7 +499,7 @@ local void gen_bitlen(s, desc) | |||||||
| local void gen_codes (tree, max_code, bl_count) | local void gen_codes (tree, max_code, bl_count) | ||||||
|     ct_data *tree;             /* the tree to decorate */ |     ct_data *tree;             /* the tree to decorate */ | ||||||
|     int max_code;              /* largest code with non zero frequency */ |     int max_code;              /* largest code with non zero frequency */ | ||||||
|     ush bl_count[];            /* number of codes at each bit length */ |     ushf *bl_count;            /* number of codes at each bit length */ | ||||||
| { | { | ||||||
|     ush next_code[MAX_BITS+1]; /* next code value for each bit length */ |     ush next_code[MAX_BITS+1]; /* next code value for each bit length */ | ||||||
|     ush code = 0;              /* running code value */ |     ush code = 0;              /* running code value */ | ||||||
| @@ -465,7 +525,7 @@ local void gen_codes (tree, max_code, bl_count) | |||||||
|         /* Now reverse the bits */ |         /* Now reverse the bits */ | ||||||
|         tree[n].Code = bi_reverse(next_code[len]++, len); |         tree[n].Code = bi_reverse(next_code[len]++, len); | ||||||
|  |  | ||||||
|         Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", |         Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||||||
|              n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); |              n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -487,8 +547,7 @@ local void build_tree(s, desc) | |||||||
|     int elems       = desc->stat_desc->elems; |     int elems       = desc->stat_desc->elems; | ||||||
|     int n, m;          /* iterate over heap elements */ |     int n, m;          /* iterate over heap elements */ | ||||||
|     int max_code = -1; /* largest code with non zero frequency */ |     int max_code = -1; /* largest code with non zero frequency */ | ||||||
|     int node = elems;  /* next internal node of the tree */ |     int node;          /* new node being created */ | ||||||
|     int new;           /* new node being created */ |  | ||||||
|  |  | ||||||
|     /* Construct the initial heap, with least frequent element in |     /* Construct the initial heap, with least frequent element in | ||||||
|      * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. |      * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. | ||||||
| @@ -511,11 +570,11 @@ local void build_tree(s, desc) | |||||||
|      * two codes of non zero frequency. |      * two codes of non zero frequency. | ||||||
|      */ |      */ | ||||||
|     while (s->heap_len < 2) { |     while (s->heap_len < 2) { | ||||||
|         new = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); |         node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); | ||||||
|         tree[new].Freq = 1; |         tree[node].Freq = 1; | ||||||
|         s->depth[new] = 0; |         s->depth[node] = 0; | ||||||
|         s->opt_len--; if (stree) s->static_len -= stree[new].Len; |         s->opt_len--; if (stree) s->static_len -= stree[node].Len; | ||||||
|         /* new is 0 or 1 so it does not have extra bits */ |         /* node is 0 or 1 so it does not have extra bits */ | ||||||
|     } |     } | ||||||
|     desc->max_code = max_code; |     desc->max_code = max_code; | ||||||
|  |  | ||||||
| @@ -527,6 +586,7 @@ local void build_tree(s, desc) | |||||||
|     /* Construct the Huffman tree by repeatedly combining the least two |     /* Construct the Huffman tree by repeatedly combining the least two | ||||||
|      * frequent nodes. |      * frequent nodes. | ||||||
|      */ |      */ | ||||||
|  |     node = elems;              /* next internal node of the tree */ | ||||||
|     do { |     do { | ||||||
|         pqremove(s, tree, n);  /* n = node of least frequency */ |         pqremove(s, tree, n);  /* n = node of least frequency */ | ||||||
|         m = s->heap[SMALLEST]; /* m = node of next least frequency */ |         m = s->heap[SMALLEST]; /* m = node of next least frequency */ | ||||||
| @@ -686,7 +746,7 @@ local int build_bl_tree(s) | |||||||
|     /* Update opt_len to include the bit length tree and counts */ |     /* Update opt_len to include the bit length tree and counts */ | ||||||
|     s->opt_len += 3*(max_blindex+1) + 5+5+4; |     s->opt_len += 3*(max_blindex+1) + 5+5+4; | ||||||
|     Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", |     Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", | ||||||
| 	    s->opt_len, s->static_len)); |             s->opt_len, s->static_len)); | ||||||
|  |  | ||||||
|     return max_blindex; |     return max_blindex; | ||||||
| } | } | ||||||
| @@ -725,62 +785,102 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) | |||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Send a stored block |  * Send a stored block | ||||||
|  */ |  */ | ||||||
| void ct_stored_block(s, buf, stored_len, eof) | void _tr_stored_block(s, buf, stored_len, eof) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
|     char *buf;        /* input block */ |     charf *buf;       /* input block */ | ||||||
|     ulg stored_len;   /* length of input block */ |     ulg stored_len;   /* length of input block */ | ||||||
|     int eof;          /* true if this is the last block for a file */ |     int eof;          /* true if this is the last block for a file */ | ||||||
| { | { | ||||||
|     send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */ |     send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */ | ||||||
|     s->compressed_len = (s->compressed_len + 3 + 7) & ~7L; |     s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; | ||||||
|     s->compressed_len += (stored_len + 4) << 3; |     s->compressed_len += (stored_len + 4) << 3; | ||||||
|  |  | ||||||
|     copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ |     copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Send one empty static block to give enough lookahead for inflate. | ||||||
|  |  * This takes 10 bits, of which 7 may remain in the bit buffer. | ||||||
|  |  * The current inflate code requires 9 bits of lookahead. If the | ||||||
|  |  * last two codes for the previous block (real code plus EOB) were coded | ||||||
|  |  * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode | ||||||
|  |  * the last real code. In this case we send two empty static blocks instead | ||||||
|  |  * of one. (There are no problems if the previous block is stored or fixed.) | ||||||
|  |  * To simplify the code, we assume the worst case of last real code encoded | ||||||
|  |  * on one bit only. | ||||||
|  |  */ | ||||||
|  | void _tr_align(s) | ||||||
|  |     deflate_state *s; | ||||||
|  | { | ||||||
|  |     send_bits(s, STATIC_TREES<<1, 3); | ||||||
|  |     send_code(s, END_BLOCK, static_ltree); | ||||||
|  |     s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ | ||||||
|  |     bi_flush(s); | ||||||
|  |     /* Of the 10 bits for the empty block, we have already sent | ||||||
|  |      * (10 - bi_valid) bits. The lookahead for the last real code (before | ||||||
|  |      * the EOB of the previous block) was thus at least one plus the length | ||||||
|  |      * of the EOB plus what we have just sent of the empty static block. | ||||||
|  |      */ | ||||||
|  |     if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { | ||||||
|  |         send_bits(s, STATIC_TREES<<1, 3); | ||||||
|  |         send_code(s, END_BLOCK, static_ltree); | ||||||
|  |         s->compressed_len += 10L; | ||||||
|  |         bi_flush(s); | ||||||
|  |     } | ||||||
|  |     s->last_eob_len = 7; | ||||||
|  | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Determine the best encoding for the current block: dynamic trees, static |  * Determine the best encoding for the current block: dynamic trees, static | ||||||
|  * trees or store, and output the encoded block to the zip file. This function |  * trees or store, and output the encoded block to the zip file. This function | ||||||
|  * returns the total compressed length for the file so far. |  * returns the total compressed length for the file so far. | ||||||
|  */ |  */ | ||||||
| ulg ct_flush_block(s, buf, stored_len, eof) | ulg _tr_flush_block(s, buf, stored_len, eof) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
|     char *buf;        /* input block, or NULL if too old */ |     charf *buf;       /* input block, or NULL if too old */ | ||||||
|     ulg stored_len;   /* length of input block */ |     ulg stored_len;   /* length of input block */ | ||||||
|     int eof;          /* true if this is the last block for a file */ |     int eof;          /* true if this is the last block for a file */ | ||||||
| { | { | ||||||
|     ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ |     ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | ||||||
|     int max_blindex;  /* index of last bit length code of non zero freq */ |     int max_blindex = 0;  /* index of last bit length code of non zero freq */ | ||||||
|  |  | ||||||
|      /* Check if the file is ascii or binary */ |     /* Build the Huffman trees unless a stored block is forced */ | ||||||
|     if (s->data_type == UNKNOWN) set_data_type(s); |     if (s->level > 0) { | ||||||
|  |  | ||||||
|     /* Construct the literal and distance trees */ | 	 /* Check if the file is ascii or binary */ | ||||||
|     build_tree(s, (tree_desc *)(&(s->l_desc))); | 	if (s->data_type == Z_UNKNOWN) set_data_type(s); | ||||||
|     Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, |  | ||||||
| 	    s->static_len)); |  | ||||||
|  |  | ||||||
|     build_tree(s, (tree_desc *)(&(s->d_desc))); | 	/* Construct the literal and distance trees */ | ||||||
|     Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | 	build_tree(s, (tree_desc *)(&(s->l_desc))); | ||||||
| 	    s->static_len)); | 	Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, | ||||||
|     /* At this point, opt_len and static_len are the total bit lengths of | 		s->static_len)); | ||||||
|      * the compressed block data, excluding the tree representations. |  | ||||||
|      */ |  | ||||||
|  |  | ||||||
|     /* Build the bit length tree for the above two trees, and get the index | 	build_tree(s, (tree_desc *)(&(s->d_desc))); | ||||||
|      * in bl_order of the last bit length code to send. | 	Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | ||||||
|      */ | 		s->static_len)); | ||||||
|     max_blindex = build_bl_tree(s); | 	/* At this point, opt_len and static_len are the total bit lengths of | ||||||
|  | 	 * the compressed block data, excluding the tree representations. | ||||||
|  | 	 */ | ||||||
|  |  | ||||||
|     /* Determine the best encoding. Compute first the block length in bytes */ | 	/* Build the bit length tree for the above two trees, and get the index | ||||||
|     opt_lenb = (s->opt_len+3+7)>>3; | 	 * in bl_order of the last bit length code to send. | ||||||
|     static_lenb = (s->static_len+3+7)>>3; | 	 */ | ||||||
|  | 	max_blindex = build_bl_tree(s); | ||||||
|  |  | ||||||
|     Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | 	/* Determine the best encoding. Compute first the block length in bytes*/ | ||||||
|             opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | 	opt_lenb = (s->opt_len+3+7)>>3; | ||||||
|             s->last_lit)); | 	static_lenb = (s->static_len+3+7)>>3; | ||||||
|  |  | ||||||
|     if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | 	Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | ||||||
|  | 		opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | ||||||
|  | 		s->last_lit)); | ||||||
|  |  | ||||||
|  | 	if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | ||||||
|  |  | ||||||
|  |     } else { | ||||||
|  |         Assert(buf != (char*)0, "lost buf"); | ||||||
|  | 	opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* If compression failed and this is the first and last block, |     /* If compression failed and this is the first and last block, | ||||||
|      * and if the .zip file can be seeked (to rewrite the local header), |      * and if the .zip file can be seeked (to rewrite the local header), | ||||||
| @@ -788,12 +888,12 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||||||
|      */ |      */ | ||||||
| #ifdef STORED_FILE_OK | #ifdef STORED_FILE_OK | ||||||
| #  ifdef FORCE_STORED_FILE | #  ifdef FORCE_STORED_FILE | ||||||
|     if (eof && compressed_len == 0L) { /* force stored file */ |     if (eof && s->compressed_len == 0L) { /* force stored file */ | ||||||
| #  else | #  else | ||||||
|     if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { |     if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { | ||||||
| #  endif | #  endif | ||||||
|         /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ |         /* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */ | ||||||
|         if (buf == (char*)0) error ("block vanished"); |         if (buf == (charf*)0) error ("block vanished"); | ||||||
|  |  | ||||||
|         copy_block(buf, (unsigned)stored_len, 0); /* without header */ |         copy_block(buf, (unsigned)stored_len, 0); /* without header */ | ||||||
|         s->compressed_len = stored_len << 3; |         s->compressed_len = stored_len << 3; | ||||||
| @@ -813,7 +913,7 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||||||
|          * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to |          * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to | ||||||
|          * transform a block into a stored block. |          * transform a block into a stored block. | ||||||
|          */ |          */ | ||||||
| 	ct_stored_block(s, buf, stored_len, eof); |         _tr_stored_block(s, buf, stored_len, eof); | ||||||
|  |  | ||||||
| #ifdef FORCE_STATIC | #ifdef FORCE_STATIC | ||||||
|     } else if (static_lenb >= 0) { /* force static trees */ |     } else if (static_lenb >= 0) { /* force static trees */ | ||||||
| @@ -826,7 +926,7 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||||||
|     } else { |     } else { | ||||||
|         send_bits(s, (DYN_TREES<<1)+eof, 3); |         send_bits(s, (DYN_TREES<<1)+eof, 3); | ||||||
|         send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, |         send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, | ||||||
| 		       max_blindex+1); |                        max_blindex+1); | ||||||
|         compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); |         compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); | ||||||
|         s->compressed_len += 3 + s->opt_len; |         s->compressed_len += 3 + s->opt_len; | ||||||
|     } |     } | ||||||
| @@ -847,10 +947,10 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||||||
|  * Save the match info and tally the frequency counts. Return true if |  * Save the match info and tally the frequency counts. Return true if | ||||||
|  * the current block must be flushed. |  * the current block must be flushed. | ||||||
|  */ |  */ | ||||||
| int ct_tally (s, dist, lc) | int _tr_tally (s, dist, lc) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
|     int dist;  /* distance of matched string */ |     unsigned dist;  /* distance of matched string */ | ||||||
|     int lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */ |     unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */ | ||||||
| { | { | ||||||
|     s->d_buf[s->last_lit] = (ush)dist; |     s->d_buf[s->last_lit] = (ush)dist; | ||||||
|     s->l_buf[s->last_lit++] = (uch)lc; |     s->l_buf[s->last_lit++] = (uch)lc; | ||||||
| @@ -858,12 +958,12 @@ int ct_tally (s, dist, lc) | |||||||
|         /* lc is the unmatched char */ |         /* lc is the unmatched char */ | ||||||
|         s->dyn_ltree[lc].Freq++; |         s->dyn_ltree[lc].Freq++; | ||||||
|     } else { |     } else { | ||||||
| 	s->matches++; |         s->matches++; | ||||||
|         /* Here, lc is the match length - MIN_MATCH */ |         /* Here, lc is the match length - MIN_MATCH */ | ||||||
|         dist--;             /* dist = match distance - 1 */ |         dist--;             /* dist = match distance - 1 */ | ||||||
|         Assert((ush)dist < (ush)MAX_DIST(s) && |         Assert((ush)dist < (ush)MAX_DIST(s) && | ||||||
|                (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && |                (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && | ||||||
|                (ush)d_code(dist) < (ush)D_CODES,  "ct_tally: bad match"); |                (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match"); | ||||||
|  |  | ||||||
|         s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; |         s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; | ||||||
|         s->dyn_dtree[d_code(dist)].Freq++; |         s->dyn_dtree[d_code(dist)].Freq++; | ||||||
| @@ -873,11 +973,11 @@ int ct_tally (s, dist, lc) | |||||||
|     if (s->level > 2 && (s->last_lit & 0xfff) == 0) { |     if (s->level > 2 && (s->last_lit & 0xfff) == 0) { | ||||||
|         /* Compute an upper bound for the compressed length */ |         /* Compute an upper bound for the compressed length */ | ||||||
|         ulg out_length = (ulg)s->last_lit*8L; |         ulg out_length = (ulg)s->last_lit*8L; | ||||||
|         ulg in_length = (ulg)s->strstart - s->block_start; |         ulg in_length = (ulg)((long)s->strstart - s->block_start); | ||||||
|         int dcode; |         int dcode; | ||||||
|         for (dcode = 0; dcode < D_CODES; dcode++) { |         for (dcode = 0; dcode < D_CODES; dcode++) { | ||||||
|             out_length += (ulg)s->dyn_dtree[dcode].Freq * |             out_length += (ulg)s->dyn_dtree[dcode].Freq * | ||||||
| 		(5L+extra_dbits[dcode]); |                 (5L+extra_dbits[dcode]); | ||||||
|         } |         } | ||||||
|         out_length >>= 3; |         out_length >>= 3; | ||||||
|         Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", |         Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", | ||||||
| @@ -907,7 +1007,7 @@ local void compress_block(s, ltree, dtree) | |||||||
|     int extra;          /* number of extra bits to send */ |     int extra;          /* number of extra bits to send */ | ||||||
|  |  | ||||||
|     if (s->last_lit != 0) do { |     if (s->last_lit != 0) do { | ||||||
| 	dist = s->d_buf[lx]; |         dist = s->d_buf[lx]; | ||||||
|         lc = s->l_buf[lx++]; |         lc = s->l_buf[lx++]; | ||||||
|         if (dist == 0) { |         if (dist == 0) { | ||||||
|             send_code(s, lc, ltree); /* send a literal byte */ |             send_code(s, lc, ltree); /* send a literal byte */ | ||||||
| @@ -921,7 +1021,7 @@ local void compress_block(s, ltree, dtree) | |||||||
|                 lc -= base_length[code]; |                 lc -= base_length[code]; | ||||||
|                 send_bits(s, lc, extra);       /* send the extra length bits */ |                 send_bits(s, lc, extra);       /* send the extra length bits */ | ||||||
|             } |             } | ||||||
| 	    dist--; /* dist is now the match distance - 1 */ |             dist--; /* dist is now the match distance - 1 */ | ||||||
|             code = d_code(dist); |             code = d_code(dist); | ||||||
|             Assert (code < D_CODES, "bad d_code"); |             Assert (code < D_CODES, "bad d_code"); | ||||||
|  |  | ||||||
| @@ -933,12 +1033,13 @@ local void compress_block(s, ltree, dtree) | |||||||
|             } |             } | ||||||
|         } /* literal or match pair ? */ |         } /* literal or match pair ? */ | ||||||
|  |  | ||||||
| 	/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ |         /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ | ||||||
| 	Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); |         Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); | ||||||
|  |  | ||||||
|     } while (lx < s->last_lit); |     } while (lx < s->last_lit); | ||||||
|  |  | ||||||
|     send_code(s, END_BLOCK, ltree); |     send_code(s, END_BLOCK, ltree); | ||||||
|  |     s->last_eob_len = ltree[END_BLOCK].Len; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
| @@ -956,45 +1057,7 @@ local void set_data_type(s) | |||||||
|     while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq; |     while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq; | ||||||
|     while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq; |     while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq; | ||||||
|     while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; |     while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; | ||||||
|     s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? BINARY : ASCII); |     s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); | ||||||
| } |  | ||||||
|  |  | ||||||
| /* =========================================================================== |  | ||||||
|  * Output a short LSB first on the stream. |  | ||||||
|  * IN assertion: there is enough room in pendingBuf. |  | ||||||
|  */ |  | ||||||
| #define put_short(s, w) { \ |  | ||||||
|     put_byte(s, (uch)((w) & 0xff)); \ |  | ||||||
|     put_byte(s, (uch)((ush)(w) >> 8)); \ |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* =========================================================================== |  | ||||||
|  * Send a value on a given number of bits. |  | ||||||
|  * IN assertion: length <= 16 and value fits in length bits. |  | ||||||
|  */ |  | ||||||
| local void send_bits(s, value, length) |  | ||||||
|     deflate_state *s; |  | ||||||
|     int value;  /* value to send */ |  | ||||||
|     int length; /* number of bits */ |  | ||||||
| { |  | ||||||
| #ifdef DEBUG |  | ||||||
|     Tracev((stderr," l %2d v %4x ", length, value)); |  | ||||||
|     Assert(length > 0 && length <= 15, "invalid length"); |  | ||||||
|     s->bits_sent += (ulg)length; |  | ||||||
| #endif |  | ||||||
|     /* If not enough room in bi_buf, use (valid) bits from bi_buf and |  | ||||||
|      * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) |  | ||||||
|      * unused bits in value. |  | ||||||
|      */ |  | ||||||
|     if (s->bi_valid > (int)Buf_size - length) { |  | ||||||
|         s->bi_buf |= (value << s->bi_valid); |  | ||||||
|         put_short(s, s->bi_buf); |  | ||||||
|         s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); |  | ||||||
|         s->bi_valid += length - Buf_size; |  | ||||||
|     } else { |  | ||||||
|         s->bi_buf |= value << s->bi_valid; |  | ||||||
|         s->bi_valid += length; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
| @@ -1015,7 +1078,24 @@ local unsigned bi_reverse(code, len) | |||||||
| } | } | ||||||
|  |  | ||||||
| /* =========================================================================== | /* =========================================================================== | ||||||
|  * Write out any remaining bits in an incomplete byte. |  * Flush the bit buffer, keeping at most 7 bits in it. | ||||||
|  |  */ | ||||||
|  | local void bi_flush(s) | ||||||
|  |     deflate_state *s; | ||||||
|  | { | ||||||
|  |     if (s->bi_valid == 16) { | ||||||
|  |         put_short(s, s->bi_buf); | ||||||
|  |         s->bi_buf = 0; | ||||||
|  |         s->bi_valid = 0; | ||||||
|  |     } else if (s->bi_valid >= 8) { | ||||||
|  |         put_byte(s, (Byte)s->bi_buf); | ||||||
|  |         s->bi_buf >>= 8; | ||||||
|  |         s->bi_valid -= 8; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* =========================================================================== | ||||||
|  |  * Flush the bit buffer and align the output on a byte boundary | ||||||
|  */ |  */ | ||||||
| local void bi_windup(s) | local void bi_windup(s) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
| @@ -1038,11 +1118,12 @@ local void bi_windup(s) | |||||||
|  */ |  */ | ||||||
| local void copy_block(s, buf, len, header) | local void copy_block(s, buf, len, header) | ||||||
|     deflate_state *s; |     deflate_state *s; | ||||||
|     char     *buf;    /* the input data */ |     charf    *buf;    /* the input data */ | ||||||
|     unsigned len;     /* its length */ |     unsigned len;     /* its length */ | ||||||
|     int      header;  /* true if block header must be written */ |     int      header;  /* true if block header must be written */ | ||||||
| { | { | ||||||
|     bi_windup(s);              /* align on byte boundary */ |     bi_windup(s);        /* align on byte boundary */ | ||||||
|  |     s->last_eob_len = 8; /* enough lookahead for inflate */ | ||||||
|  |  | ||||||
|     if (header) { |     if (header) { | ||||||
|         put_short(s, (ush)len);    |         put_short(s, (ush)len);    | ||||||
| @@ -1055,6 +1136,6 @@ local void copy_block(s, buf, len, header) | |||||||
|     s->bits_sent += (ulg)len<<3; |     s->bits_sent += (ulg)len<<3; | ||||||
| #endif | #endif | ||||||
|     while (len--) { |     while (len--) { | ||||||
| 	put_byte(s, *buf++); |         put_byte(s, *buf++); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								uncompr.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								uncompr.c
									
									
									
									
									
								
							| @@ -1,9 +1,9 @@ | |||||||
| /* uncompr.c -- decompress a memory buffer | /* uncompr.c -- decompress a memory buffer | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: uncompr.c,v 1.4 1995/04/10 16:22:22 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| @@ -22,16 +22,16 @@ | |||||||
|    enough memory, Z_BUF_ERROR if there was not enough room in the output |    enough memory, Z_BUF_ERROR if there was not enough room in the output | ||||||
|    buffer, or Z_DATA_ERROR if the input data was corrupted. |    buffer, or Z_DATA_ERROR if the input data was corrupted. | ||||||
| */ | */ | ||||||
| int uncompress (dest, destLen, source, sourceLen) | int EXPORT uncompress (dest, destLen, source, sourceLen) | ||||||
|     Byte *dest; |     Bytef *dest; | ||||||
|     uLong *destLen; |     uLongf *destLen; | ||||||
|     Byte *source; |     const Bytef *source; | ||||||
|     uLong sourceLen; |     uLong sourceLen; | ||||||
| { | { | ||||||
|     z_stream stream; |     z_stream stream; | ||||||
|     int err; |     int err; | ||||||
|  |  | ||||||
|     stream.next_in = source; |     stream.next_in = (Bytef*)source; | ||||||
|     stream.avail_in = (uInt)sourceLen; |     stream.avail_in = (uInt)sourceLen; | ||||||
|     /* Check for source > 64K on 16-bit machine: */ |     /* Check for source > 64K on 16-bit machine: */ | ||||||
|     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; |     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; | ||||||
| @@ -48,8 +48,8 @@ int uncompress (dest, destLen, source, sourceLen) | |||||||
|  |  | ||||||
|     err = inflate(&stream, Z_FINISH); |     err = inflate(&stream, Z_FINISH); | ||||||
|     if (err != Z_STREAM_END) { |     if (err != Z_STREAM_END) { | ||||||
| 	inflateEnd(&stream); |         inflateEnd(&stream); | ||||||
| 	return err; |         return err == Z_OK ? Z_BUF_ERROR : err; | ||||||
|     } |     } | ||||||
|     *destLen = stream.total_out; |     *destLen = stream.total_out; | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										236
									
								
								zconf.h
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								zconf.h
									
									
									
									
									
								
							| @@ -1,37 +1,102 @@ | |||||||
| /* zconf.h -- configuration of the zlib compression library | /* zconf.h -- configuration of the zlib compression library | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: zconf.h,v 1.10 1995/04/30 19:27:14 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #ifndef _ZCONF_H | #ifndef _ZCONF_H | ||||||
| #define _ZCONF_H | #define _ZCONF_H | ||||||
|  |  | ||||||
| /* | /* | ||||||
|      The library does not install any signal handler. It is recommended to |  * If you *really* need a unique prefix for all types and library functions, | ||||||
|   add at least a handler for SIGSEGV when decompressing; the library checks |  * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. | ||||||
|   the consistency of the input data whenever possible but may go nuts |  | ||||||
|   for some forms of corrupted input. |  | ||||||
|  */ |  */ | ||||||
|  | #ifdef Z_PREFIX | ||||||
|  | #  define deflateInit_	z_deflateInit_ | ||||||
|  | #  define deflate	z_deflate | ||||||
|  | #  define deflateEnd	z_deflateEnd | ||||||
|  | #  define inflateInit_ 	z_inflateInit_ | ||||||
|  | #  define inflate	z_inflate | ||||||
|  | #  define inflateEnd	z_inflateEnd | ||||||
|  | #  define deflateInit2_	z_deflateInit2_ | ||||||
|  | #  define deflateSetDictionary z_deflateSetDictionary | ||||||
|  | #  define deflateCopy	z_deflateCopy | ||||||
|  | #  define deflateReset	z_deflateReset | ||||||
|  | #  define deflateParams	z_deflateParams | ||||||
|  | #  define inflateInit2_	z_inflateInit2_ | ||||||
|  | #  define inflateSetDictionary z_inflateSetDictionary | ||||||
|  | #  define inflateSync	z_inflateSync | ||||||
|  | #  define inflateSyncPoint z_inflateSyncPoint | ||||||
|  | #  define inflateReset	z_inflateReset | ||||||
|  | #  define compress	z_compress | ||||||
|  | #  define uncompress	z_uncompress | ||||||
|  | #  define adler32	z_adler32 | ||||||
|  | #  define crc32		z_crc32 | ||||||
|  | #  define get_crc_table z_get_crc_table | ||||||
|  |  | ||||||
|  | #  define Byte		z_Byte | ||||||
|  | #  define uInt		z_uInt | ||||||
|  | #  define uLong		z_uLong | ||||||
|  | #  define Bytef	        z_Bytef | ||||||
|  | #  define charf		z_charf | ||||||
|  | #  define intf		z_intf | ||||||
|  | #  define uIntf		z_uIntf | ||||||
|  | #  define uLongf	z_uLongf | ||||||
|  | #  define voidpf	z_voidpf | ||||||
|  | #  define voidp		z_voidp | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) | ||||||
|  | #  define WIN32 | ||||||
|  | #endif | ||||||
|  | #if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) | ||||||
|  | #  ifndef __32BIT__ | ||||||
|  | #    define __32BIT__ | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  | #if defined(__MSDOS__) && !defined(MSDOS) | ||||||
|  | #  define MSDOS | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Compile with -DMAXSEG_64K if the alloc function cannot allocate more |  * Compile with -DMAXSEG_64K if the alloc function cannot allocate more | ||||||
|  * than 64k bytes at a time (needed on systems with 16-bit int). |  * than 64k bytes at a time (needed on systems with 16-bit int). | ||||||
|  */ |  */ | ||||||
| #if defined(_GNUC__) && !defined(__32BIT__) |  | ||||||
| #  define __32BIT__ |  | ||||||
| #endif |  | ||||||
| #if defined(__MSDOS__) && !defined(MSDOS) |  | ||||||
| #  define MSDOS |  | ||||||
| #endif |  | ||||||
| #if defined(MSDOS) && !defined(__32BIT__) | #if defined(MSDOS) && !defined(__32BIT__) | ||||||
| #  define MAXSEG_64K | #  define MAXSEG_64K | ||||||
| #endif | #endif | ||||||
| #if !defined(STDC) && (defined(MSDOS) || defined(__STDC__)) | #ifdef MSDOS | ||||||
| #  define STDC | #  define UNALIGNED_OK | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC) | ||||||
|  | #  define STDC | ||||||
|  | #endif | ||||||
|  | #if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) | ||||||
|  | #  ifndef STDC | ||||||
|  | #    define STDC | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef STDC | ||||||
|  | #  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ | ||||||
|  | #    define const | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Some Mac compilers merge all .h files incorrectly: */ | ||||||
|  | #if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) | ||||||
|  | #  define NO_DUMMY_DECL | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Borland C incorrectly complains about missing returns: */ | ||||||
|  | #if defined(__BORLANDC__) | ||||||
|  | #  define NEED_DUMMY_RETURN | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Maximum value for memLevel in deflateInit2 */ | ||||||
| #ifndef MAX_MEM_LEVEL | #ifndef MAX_MEM_LEVEL | ||||||
| #  ifdef MAXSEG_64K | #  ifdef MAXSEG_64K | ||||||
| #    define MAX_MEM_LEVEL 8 | #    define MAX_MEM_LEVEL 8 | ||||||
| @@ -40,36 +105,143 @@ | |||||||
| #  endif | #  endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* Maximum value for windowBits in deflateInit2 and inflateInit2. | ||||||
|  |  * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files | ||||||
|  |  * created by gzip. (Files created by minigzip can still be extracted by | ||||||
|  |  * gzip.) | ||||||
|  |  */ | ||||||
| #ifndef MAX_WBITS | #ifndef MAX_WBITS | ||||||
| #  define MAX_WBITS   15 /* 32K LZ77 window */ | #  define MAX_WBITS   15 /* 32K LZ77 window */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 			/* Type declarations */ | /* The memory requirements for deflate are (in bytes): | ||||||
|  |             (1 << (windowBits+2)) +  (1 << (memLevel+9)) | ||||||
|  |  that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values) | ||||||
|  |  plus a few kilobytes for small objects. For example, if you want to reduce | ||||||
|  |  the default memory requirements from 256K to 128K, compile with | ||||||
|  |      make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" | ||||||
|  |  Of course this will generally degrade compression (there's no free lunch). | ||||||
|  |  | ||||||
| #ifndef __P /* function prototypes */ |    The memory requirements for inflate are (in bytes) 1 << windowBits | ||||||
|  |  that is, 32K for windowBits=15 (default value) plus a few kilobytes | ||||||
|  |  for small objects. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |                         /* Type declarations */ | ||||||
|  |  | ||||||
|  | #ifndef OF /* function prototypes */ | ||||||
| #  ifdef STDC | #  ifdef STDC | ||||||
| #    define __P(args)  args | #    define OF(args)  args | ||||||
| #  else | #  else | ||||||
| #    define __P(args)  () | #    define OF(args)  () | ||||||
| #  endif | #  endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef Byte | /* The following definitions for FAR are needed only for MSDOS mixed | ||||||
|   typedef unsigned char  Byte;  /* 8 bits */ |  * model programming (small or medium model with some far allocations). | ||||||
| #endif |  * This was tested only with MSC; for other MSDOS compilers you may have | ||||||
| #ifndef uInt |  * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model, | ||||||
|   typedef unsigned int   uInt;  /* 16 bits or more */ |  * just define FAR to be empty. | ||||||
| #endif |  */ | ||||||
| #ifndef uLong | #if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) | ||||||
|   typedef unsigned long  uLong; /* 32 bits or more */ |    /* MSC small or medium model */ | ||||||
| #endif | #  define SMALL_MEDIUM | ||||||
| #ifndef voidp | #  ifdef _MSC_VER | ||||||
| #  ifdef STDC | #    define FAR __far | ||||||
|      typedef void *voidp; |  | ||||||
| #  else | #  else | ||||||
|      typedef Byte *voidp; | #    define FAR far | ||||||
| #  endif | #  endif | ||||||
| #endif | #endif | ||||||
|  | #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) | ||||||
|  | #  ifndef __32BIT__ | ||||||
|  | #    define SMALL_MEDIUM | ||||||
|  | #    define FAR __far | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  | #ifndef FAR | ||||||
|  | #   define FAR | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | typedef unsigned char  Byte;  /* 8 bits */ | ||||||
|  | typedef unsigned int   uInt;  /* 16 bits or more */ | ||||||
|  | typedef unsigned long  uLong; /* 32 bits or more */ | ||||||
|  |  | ||||||
|  | #if defined(__BORLANDC__) && defined(SMALL_MEDIUM) | ||||||
|  |    /* Borland C/C++ ignores FAR inside typedef */ | ||||||
|  | #  define Bytef Byte FAR | ||||||
|  | #else | ||||||
|  |    typedef Byte  FAR Bytef; | ||||||
|  | #endif | ||||||
|  | typedef char  FAR charf; | ||||||
|  | typedef int   FAR intf; | ||||||
|  | typedef uInt  FAR uIntf; | ||||||
|  | typedef uLong FAR uLongf; | ||||||
|  |  | ||||||
|  | #ifdef STDC | ||||||
|  |    typedef void FAR *voidpf; | ||||||
|  |    typedef void     *voidp; | ||||||
|  | #else | ||||||
|  |    typedef Byte FAR *voidpf; | ||||||
|  |    typedef Byte     *voidp; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
|  | #  include <unistd.h> /* for SEEK_* and off_t */ | ||||||
|  | #  define z_off_t  off_t | ||||||
|  | #endif | ||||||
|  | #ifndef SEEK_SET | ||||||
|  | #  define SEEK_SET        0       /* Seek from beginning of file.  */ | ||||||
|  | #  define SEEK_CUR        1       /* Seek from current position.  */ | ||||||
|  | #endif | ||||||
|  | #ifndef z_off_t | ||||||
|  | #  define  z_off_t long | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Compile with -DZLIB_DLL for Windows DLL support */ | ||||||
|  | #if (defined(_WINDOWS) || defined(WINDOWS)) && defined(ZLIB_DLL) | ||||||
|  | #  undef FAR | ||||||
|  | #  include <windows.h> | ||||||
|  | #  define EXPORT  WINAPI | ||||||
|  | #  ifdef WIN32 | ||||||
|  | #    define EXPORTVA  WINAPIV | ||||||
|  | #  else | ||||||
|  | #    define EXPORTVA  FAR _cdecl _export | ||||||
|  | #  endif | ||||||
|  | #else | ||||||
|  | #   if defined (__BORLANDC__) && defined (_Windows) && defined (__DLL__) | ||||||
|  | #       define EXPORT _export | ||||||
|  | #       define EXPORTVA _export | ||||||
|  | #   else | ||||||
|  | #       define EXPORT | ||||||
|  | #       define EXPORTVA | ||||||
|  | #   endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* MVS linker does not support external names larger than 8 bytes */ | ||||||
|  | #if defined(__MVS__) | ||||||
|  | #   pragma map(deflateInit_,"DEIN") | ||||||
|  | #   pragma map(deflateInit2_,"DEIN2") | ||||||
|  | #   pragma map(deflateEnd,"DEEND") | ||||||
|  | #   pragma map(inflateInit_,"ININ") | ||||||
|  | #   pragma map(inflateInit2_,"ININ2") | ||||||
|  | #   pragma map(inflateEnd,"INEND") | ||||||
|  | #   pragma map(inflateSync,"INSY") | ||||||
|  | #   pragma map(inflateSetDictionary,"INSEDI") | ||||||
|  | #   pragma map(inflate_blocks,"INBL") | ||||||
|  | #   pragma map(inflate_blocks_new,"INBLNE") | ||||||
|  | #   pragma map(inflate_blocks_free,"INBLFR") | ||||||
|  | #   pragma map(inflate_blocks_reset,"INBLRE") | ||||||
|  | #   pragma map(inflate_codes_free,"INCOFR") | ||||||
|  | #   pragma map(inflate_codes,"INCO") | ||||||
|  | #   pragma map(inflate_fast,"INFA") | ||||||
|  | #   pragma map(inflate_flush,"INFLU") | ||||||
|  | #   pragma map(inflate_mask,"INMA") | ||||||
|  | #   pragma map(inflate_set_dictionary,"INSEDI2") | ||||||
|  | #   pragma map(inflate_copyright,"INCOPY") | ||||||
|  | #   pragma map(inflate_trees_bits,"INTRBI") | ||||||
|  | #   pragma map(inflate_trees_dynamic,"INTRDY") | ||||||
|  | #   pragma map(inflate_trees_fixed,"INTRFI") | ||||||
|  | #   pragma map(inflate_trees_free,"INTRFR") | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif /* _ZCONF_H */ | #endif /* _ZCONF_H */ | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								zlib.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								zlib.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | |||||||
|  | .TH ZLIB 3 "20 January 1998" | ||||||
|  | .SH NAME | ||||||
|  | zlib \- compression/decompression library | ||||||
|  | .SH SYNOPSIS | ||||||
|  | [see | ||||||
|  | .I zlib.h | ||||||
|  | for full descripton] | ||||||
|  | .SH DESCRIPTION | ||||||
|  | The | ||||||
|  | .I zlib | ||||||
|  | library is a general purpose data compression library. | ||||||
|  | The code is reentrant (thread safe). | ||||||
|  | It provides in-memory compression and decompression functions, | ||||||
|  | including integrity checks of the uncompressed data. | ||||||
|  | This version of the library supports only one compression method (deflation) | ||||||
|  | but other algorithms will be added later and will have the same stream interface. | ||||||
|  | .LP | ||||||
|  | Compression can be done in a single step if the buffers are large enough | ||||||
|  | (for example if an input file is mmap'ed), | ||||||
|  | or can be done by repeated calls of the compression function. | ||||||
|  | In the latter case, | ||||||
|  | the application must provide more input and/or consume the output | ||||||
|  | (providing more output space) before each call. | ||||||
|  | .LP | ||||||
|  | The library also supports reading and writing files in | ||||||
|  | .I gzip | ||||||
|  | (.gz) format | ||||||
|  | with an interface similar to that of stdio. | ||||||
|  | .LP | ||||||
|  | The library does not install any signal handler. The decoder checks | ||||||
|  | the consistency of the compressed data, so the library should never | ||||||
|  | crash even in case of corrupted input. | ||||||
|  | .LP | ||||||
|  | All functions of the compression library are documented in the file | ||||||
|  | .IR zlib.h. | ||||||
|  | The distribution source includes examples of use of the library | ||||||
|  | the files | ||||||
|  | .I example.c | ||||||
|  | and | ||||||
|  | .IR minigzip.c . | ||||||
|  | .LP | ||||||
|  | A Java implementation of | ||||||
|  | .IR zlib | ||||||
|  | is available in the Java Development Kit 1.1 | ||||||
|  | .IP | ||||||
|  | http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html | ||||||
|  | .LP | ||||||
|  | A Perl interface to | ||||||
|  | .IR zlib , | ||||||
|  | written by Paul Marquess (pmarquess@bfsec.bt.co.uk) | ||||||
|  | is available at CPAN (Comprehensive Perl Archive Network) sites, | ||||||
|  | such as: | ||||||
|  | .IP | ||||||
|  | ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* | ||||||
|  | .LP | ||||||
|  | A Python interface to | ||||||
|  | .IR zlib | ||||||
|  | written by A.M. Kuchling <amk@magnet.com> | ||||||
|  | is available from the Python Software Association sites, such as: | ||||||
|  | .IP | ||||||
|  | ftp://ftp.python.org/pub/python/contrib/Encoding/zlib*.tar.gz | ||||||
|  | .SH "SEE ALSO" | ||||||
|  | Questions about zlib should be sent to: | ||||||
|  | .IP | ||||||
|  | zlib@quest.jpl.nasa.gov | ||||||
|  | or, if this fails, to the author addresses given below. | ||||||
|  | The zlib home page is: | ||||||
|  | .IP | ||||||
|  | http://www.cdrom.com/infozip/zlib/ | ||||||
|  | .LP | ||||||
|  | The data format used by the zlib library is described by RFC | ||||||
|  | (Request for Comments) 1950 to 1952 in the files:  | ||||||
|  | .IP | ||||||
|  | ftp://ds.internic.net/rfc/rfc1950.txt (zlib format) | ||||||
|  | .br | ||||||
|  | rfc1951.txt (deflate format) | ||||||
|  | .br | ||||||
|  | rfc1952.txt (gzip format) | ||||||
|  | .LP | ||||||
|  | These documents are also available in other formats from: | ||||||
|  | .IP | ||||||
|  | ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html | ||||||
|  | .SH AUTHORS | ||||||
|  | Version 1.0.7. | ||||||
|  | Copyright (C) 1995-1998 Jean-loup Gailly (jloup@gzip.org) | ||||||
|  | and Mark Adler (madler@alumni.caltech.edu). | ||||||
|  | .LP | ||||||
|  | This software is provided "as-is," | ||||||
|  | without any express or implied warranty. | ||||||
|  | In no event will the authors be held liable for any damages | ||||||
|  | arising from the use of this software. | ||||||
|  | See the distribution directory with respect to requirements | ||||||
|  | governing redistribution. | ||||||
|  | The deflate format used by | ||||||
|  | .I zlib | ||||||
|  | was defined by Phil Katz. | ||||||
|  | The deflate and | ||||||
|  | .I zlib | ||||||
|  | specifications were written by Peter Deutsch. | ||||||
|  | Thanks to all the people who reported problems and suggested various | ||||||
|  | improvements in | ||||||
|  | .IR zlib ; | ||||||
|  | who are too numerous to cite here. | ||||||
|  | .LP | ||||||
|  | UNIX manual page by R. P. C. Rodgers, | ||||||
|  | U.S. National Library of Medicine (rodgers@nlm.nih.gov). | ||||||
|  | .\" end of man page | ||||||
							
								
								
									
										611
									
								
								zlib.h
									
									
									
									
									
								
							
							
						
						
									
										611
									
								
								zlib.h
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| /* zlib.h -- interface of the 'zlib' general purpose compression library | /* zlib.h -- interface of the 'zlib' general purpose compression library | ||||||
|   version 0.9 April 30th, 1995. |   version 1.0.7, Jan 20th, 1998 | ||||||
|  |  | ||||||
|   Copyright (C) 1995 Jean-loup Gailly and Mark Adler |   Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler | ||||||
|  |  | ||||||
|   This software is provided 'as-is', without any express or implied |   This software is provided 'as-is', without any express or implied | ||||||
|   warranty.  In no event will the authors be held liable for any damages |   warranty.  In no event will the authors be held liable for any damages | ||||||
| @@ -20,60 +20,74 @@ | |||||||
|   3. This notice may not be removed or altered from any source distribution. |   3. This notice may not be removed or altered from any source distribution. | ||||||
|  |  | ||||||
|   Jean-loup Gailly        Mark Adler |   Jean-loup Gailly        Mark Adler | ||||||
|   gzip@prep.ai.mit.edu    madler@cco.caltech.edu |   jloup@gzip.org          madler@alumni.caltech.edu | ||||||
|  */ |  | ||||||
|  |  | ||||||
|  |   The data format used by the zlib library is described by RFCs (Request for | ||||||
|  |   Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt | ||||||
|  |   (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). | ||||||
|  | */ | ||||||
|  |  | ||||||
| #ifndef _ZLIB_H | #ifndef _ZLIB_H | ||||||
| #define _ZLIB_H | #define _ZLIB_H | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include "zconf.h" | #include "zconf.h" | ||||||
|  |  | ||||||
| #define ZLIB_VERSION "0.9" | #define ZLIB_VERSION "1.0.7" | ||||||
|  |  | ||||||
| /*  | /*  | ||||||
|      The 'zlib' compression library provides in-memory compression and |      The 'zlib' compression library provides in-memory compression and | ||||||
|   decompression functions, including integrity checks of the uncompressed |   decompression functions, including integrity checks of the uncompressed | ||||||
|   data.  This version of the library supports only one compression method |   data.  This version of the library supports only one compression method | ||||||
|   (deflation) but other algorithms may be added later and will have the same |   (deflation) but other algorithms will be added later and will have the same | ||||||
|   stream interface. |   stream interface. | ||||||
|  |  | ||||||
|      For compression the application must provide the output buffer and |  | ||||||
|   may optionally provide the input buffer for optimization. For decompression, |  | ||||||
|   the application must provide the input buffer and may optionally provide |  | ||||||
|   the output buffer for optimization. |  | ||||||
|  |  | ||||||
|      Compression can be done in a single step if the buffers are large |      Compression can be done in a single step if the buffers are large | ||||||
|   enough (for example if an input file is mmap'ed), or can be done by |   enough (for example if an input file is mmap'ed), or can be done by | ||||||
|   repeated calls of the compression function.  In the latter case, the |   repeated calls of the compression function.  In the latter case, the | ||||||
|   application must provide more input and/or consume the output |   application must provide more input and/or consume the output | ||||||
|   (providing more output space) before each call. |   (providing more output space) before each call. | ||||||
|  |  | ||||||
|  |      The library also supports reading and writing files in gzip (.gz) format | ||||||
|  |   with an interface similar to that of stdio. | ||||||
|  |  | ||||||
|  |      The library does not install any signal handler. The decoder checks | ||||||
|  |   the consistency of the compressed data, so the library should never | ||||||
|  |   crash even in case of corrupted input. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| typedef voidp (*alloc_func) __P((voidp opaque, uInt items, uInt size)); | typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); | ||||||
| typedef void  (*free_func)  __P((voidp opaque, voidp address)); | typedef void   (*free_func)  OF((voidpf opaque, voidpf address)); | ||||||
|  |  | ||||||
| struct internal_state; | struct internal_state; | ||||||
|  |  | ||||||
| typedef struct z_stream_s { | typedef struct z_stream_s { | ||||||
|     Byte     *next_in;  /* next input byte */ |     Bytef    *next_in;  /* next input byte */ | ||||||
|     uInt     avail_in;  /* number of bytes available at next_in */ |     uInt     avail_in;  /* number of bytes available at next_in */ | ||||||
|     uLong    total_in;  /* total nb of input bytes read so far */ |     uLong    total_in;  /* total nb of input bytes read so far */ | ||||||
|  |  | ||||||
|     Byte     *next_out; /* next output byte should be put there */ |     Bytef    *next_out; /* next output byte should be put there */ | ||||||
|     uInt     avail_out; /* remaining free space at next_out */ |     uInt     avail_out; /* remaining free space at next_out */ | ||||||
|     uLong    total_out; /* total nb of bytes output so far */ |     uLong    total_out; /* total nb of bytes output so far */ | ||||||
|  |  | ||||||
|     char     *msg;      /* last error message, NULL if no error */ |     char     *msg;      /* last error message, NULL if no error */ | ||||||
|     struct internal_state *state; /* not visible by applications */ |     struct internal_state FAR *state; /* not visible by applications */ | ||||||
|  |  | ||||||
|     alloc_func zalloc;  /* used to allocate the internal state */ |     alloc_func zalloc;  /* used to allocate the internal state */ | ||||||
|     free_func  zfree;   /* used to free the internal state */ |     free_func  zfree;   /* used to free the internal state */ | ||||||
|     voidp      opaque;  /* private data object passed to zalloc and zfree */ |     voidpf     opaque;  /* private data object passed to zalloc and zfree */ | ||||||
|  |  | ||||||
|     Byte     data_type; /* best guess about the data type: ascii or binary */ |  | ||||||
|  |  | ||||||
|  |     int     data_type;  /* best guess about the data type: ascii or binary */ | ||||||
|  |     uLong   adler;      /* adler32 value of the uncompressed data */ | ||||||
|  |     uLong   reserved;   /* reserved for future use */ | ||||||
| } z_stream; | } z_stream; | ||||||
|  |  | ||||||
|  | typedef z_stream FAR *z_streamp; | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    The application must update next_in and avail_in when avail_in has |    The application must update next_in and avail_in when avail_in has | ||||||
|    dropped to zero. It must update next_out and avail_out when avail_out |    dropped to zero. It must update next_out and avail_out when avail_out | ||||||
| @@ -103,23 +117,29 @@ typedef struct z_stream_s { | |||||||
|    a single step). |    a single step). | ||||||
| */ | */ | ||||||
|  |  | ||||||
| 			/* constants */ |                         /* constants */ | ||||||
|  |  | ||||||
| #define Z_NO_FLUSH      0 | #define Z_NO_FLUSH      0 | ||||||
| #define Z_PARTIAL_FLUSH 1 | #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ | ||||||
| #define Z_FULL_FLUSH    2 | #define Z_SYNC_FLUSH    2 | ||||||
|  | #define Z_FULL_FLUSH    3 | ||||||
| #define Z_FINISH        4 | #define Z_FINISH        4 | ||||||
| /* See deflate() below for the usage of these constants */ | /* Allowed flush values; see deflate() below for details */ | ||||||
|  |  | ||||||
| #define Z_OK            0 | #define Z_OK            0 | ||||||
| #define Z_STREAM_END    1 | #define Z_STREAM_END    1 | ||||||
|  | #define Z_NEED_DICT     2 | ||||||
| #define Z_ERRNO        (-1) | #define Z_ERRNO        (-1) | ||||||
| #define Z_STREAM_ERROR (-2) | #define Z_STREAM_ERROR (-2) | ||||||
| #define Z_DATA_ERROR   (-3) | #define Z_DATA_ERROR   (-3) | ||||||
| #define Z_MEM_ERROR    (-4) | #define Z_MEM_ERROR    (-4) | ||||||
| #define Z_BUF_ERROR    (-5) | #define Z_BUF_ERROR    (-5) | ||||||
| /* error codes for the compression/decompression functions */ | #define Z_VERSION_ERROR (-6) | ||||||
|  | /* Return codes for the compression/decompression functions. Negative | ||||||
|  |  * values are errors, positive values are used for special but normal events. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define Z_NO_COMPRESSION         0 | ||||||
| #define Z_BEST_SPEED             1 | #define Z_BEST_SPEED             1 | ||||||
| #define Z_BEST_COMPRESSION       9 | #define Z_BEST_COMPRESSION       9 | ||||||
| #define Z_DEFAULT_COMPRESSION  (-1) | #define Z_DEFAULT_COMPRESSION  (-1) | ||||||
| @@ -128,44 +148,62 @@ typedef struct z_stream_s { | |||||||
| #define Z_FILTERED            1 | #define Z_FILTERED            1 | ||||||
| #define Z_HUFFMAN_ONLY        2 | #define Z_HUFFMAN_ONLY        2 | ||||||
| #define Z_DEFAULT_STRATEGY    0 | #define Z_DEFAULT_STRATEGY    0 | ||||||
|  | /* compression strategy; see deflateInit2() below for details */ | ||||||
|  |  | ||||||
| #define Z_BINARY   0 | #define Z_BINARY   0 | ||||||
| #define Z_ASCII    1 | #define Z_ASCII    1 | ||||||
| #define Z_UNKNOWN  2 | #define Z_UNKNOWN  2 | ||||||
| /* Used to set the data_type field */ | /* Possible values of the data_type field */ | ||||||
|  |  | ||||||
|  | #define Z_DEFLATED   8 | ||||||
|  | /* The deflate compression method (the only one supported in this version) */ | ||||||
|  |  | ||||||
| #define Z_NULL  0  /* for initializing zalloc, zfree, opaque */ | #define Z_NULL  0  /* for initializing zalloc, zfree, opaque */ | ||||||
|  |  | ||||||
| extern char *zlib_version; | #define zlib_version zlibVersion() | ||||||
| /* The application can compare zlib_version and ZLIB_VERSION for consistency. | /* for compatibility with versions < 1.0.2 */ | ||||||
|  |  | ||||||
|  |                         /* basic functions */ | ||||||
|  |  | ||||||
|  | extern const char * EXPORT zlibVersion OF((void)); | ||||||
|  | /* The application can compare zlibVersion and ZLIB_VERSION for consistency. | ||||||
|    If the first character differs, the library code actually used is |    If the first character differs, the library code actually used is | ||||||
|    not compatible with the zlib.h header file used by the application. |    not compatible with the zlib.h header file used by the application. | ||||||
|  |    This check is automatically made by deflateInit and inflateInit. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 			/* basic functions */ |  | ||||||
|  |  | ||||||
| extern int deflateInit __P((z_stream *strm, int level)); |  | ||||||
| /*  | /*  | ||||||
|  | extern int EXPORT deflateInit OF((z_streamp strm, int level)); | ||||||
|  |  | ||||||
|      Initializes the internal stream state for compression. The fields |      Initializes the internal stream state for compression. The fields | ||||||
|    zalloc, zfree and opaque must be initialized before by the caller. |    zalloc, zfree and opaque must be initialized before by the caller. | ||||||
|    If zalloc and zfree are set to Z_NULL, deflateInit updates them to |    If zalloc and zfree are set to Z_NULL, deflateInit updates them to | ||||||
|    use default allocation functions. |    use default allocation functions. | ||||||
|  |  | ||||||
|      The compression level must be Z_DEFAULT_COMPRESSION, or between 1 and 9: |      The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: | ||||||
|    1 gives best speed, 9 gives best compression. Z_DEFAULT_COMPRESSION requests |    1 gives best speed, 9 gives best compression, 0 gives no compression at | ||||||
|    a default compromise between speed and compression (currently equivalent |    all (the input data is simply copied a block at a time). | ||||||
|    to level 6). |    Z_DEFAULT_COMPRESSION requests a default compromise between speed and | ||||||
|  |    compression (currently equivalent to level 6). | ||||||
|  |  | ||||||
|      deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not |      deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not | ||||||
|    enough memory, Z_STREAM_ERROR if level is not a valid compression level. |    enough memory, Z_STREAM_ERROR if level is not a valid compression level, | ||||||
|  |    Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible | ||||||
|  |    with the version assumed by the caller (ZLIB_VERSION). | ||||||
|    msg is set to null if there is no error message.  deflateInit does not |    msg is set to null if there is no error message.  deflateInit does not | ||||||
|    perform any compression: this will be done by deflate(). |    perform any compression: this will be done by deflate(). | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int deflate __P((z_stream *strm, int flush)); | extern int EXPORT deflate OF((z_streamp strm, int flush)); | ||||||
| /* | /* | ||||||
|   Performs one or both of the following actions: |     deflate compresses as much data as possible, and stops when the input | ||||||
|  |   buffer becomes empty or the output buffer becomes full. It may introduce some | ||||||
|  |   output latency (reading input without producing any output) except when | ||||||
|  |   forced to flush. | ||||||
|  |  | ||||||
|  |     The detailed semantics are as follows. deflate performs one or both of the | ||||||
|  |   following actions: | ||||||
|  |  | ||||||
|   - Compress more input starting at next_in and update next_in and avail_in |   - Compress more input starting at next_in and update next_in and avail_in | ||||||
|     accordingly. If not all input can be processed (because there is not |     accordingly. If not all input can be processed (because there is not | ||||||
| @@ -183,21 +221,30 @@ extern int deflate __P((z_stream *strm, int flush)); | |||||||
|   more output, and updating avail_in or avail_out accordingly; avail_out |   more output, and updating avail_in or avail_out accordingly; avail_out | ||||||
|   should never be zero before the call. The application can consume the |   should never be zero before the call. The application can consume the | ||||||
|   compressed output when it wants, for example when the output buffer is full |   compressed output when it wants, for example when the output buffer is full | ||||||
|   (avail_out == 0), or after each call of deflate(). |   (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK | ||||||
|  |   and with zero avail_out, it must be called again after making room in the | ||||||
|  |   output buffer because there might be more output pending. | ||||||
|  |  | ||||||
|     If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression |     If the parameter flush is set to Z_SYNC_FLUSH, all pending output is | ||||||
|   block is terminated and flushed to the output buffer so that the |   flushed to the output buffer and the output is aligned on a byte boundary, so | ||||||
|   decompressor can get all input data available so far. For method 9, a future |   that the decompressor can get all input data available so far. (In particular | ||||||
|   variant on method 8, the current block will be flushed but not terminated. |   avail_in is zero after the call if enough output space has been provided | ||||||
|   If flush is set to Z_FULL_FLUSH, the compression block is terminated, a |   before the call.)  Flushing may degrade compression for some compression | ||||||
|   special marker is output and the compression dictionary is discarded; this |   algorithms and so it should be used only when necessary. | ||||||
|   is useful to allow the decompressor to synchronize if one compressed block |  | ||||||
|   has been damaged (see inflateSync below).  Flushing degrades compression and |  | ||||||
|   so should be used only when necessary.  Using Z_FULL_FLUSH too often can |  | ||||||
|   seriously degrade the compression. |  | ||||||
|  |  | ||||||
|     If the parameter flush is set to Z_FINISH, all pending input is processed, |     If flush is set to Z_FULL_FLUSH, all output is flushed as with | ||||||
|   all pending output is flushed and deflate returns with Z_STREAM_END if there |   Z_SYNC_FLUSH, and the compression state is reset so that decompression can | ||||||
|  |   restart from this point if previous compressed data has been damaged or if | ||||||
|  |   random access is desired. Using Z_FULL_FLUSH too often can seriously degrade | ||||||
|  |   the compression. | ||||||
|  |  | ||||||
|  |     If deflate returns with avail_out == 0, this function must be called again | ||||||
|  |   with the same value of the flush parameter and more output space (updated | ||||||
|  |   avail_out), until the flush is complete (deflate returns with non-zero | ||||||
|  |   avail_out). | ||||||
|  |  | ||||||
|  |     If the parameter flush is set to Z_FINISH, pending input is processed, | ||||||
|  |   pending output is flushed and deflate returns with Z_STREAM_END if there | ||||||
|   was enough output space; if deflate returns with Z_OK, this function must be |   was enough output space; if deflate returns with Z_OK, this function must be | ||||||
|   called again with Z_FINISH and more output space (updated avail_out) but no |   called again with Z_FINISH and more output space (updated avail_out) but no | ||||||
|   more input data, until it returns with Z_STREAM_END or an error. After |   more input data, until it returns with Z_STREAM_END or an error. After | ||||||
| @@ -209,6 +256,9 @@ extern int deflate __P((z_stream *strm, int flush)); | |||||||
|   0.1% larger than avail_in plus 12 bytes.  If deflate does not return |   0.1% larger than avail_in plus 12 bytes.  If deflate does not return | ||||||
|   Z_STREAM_END, then it must be called again as described above. |   Z_STREAM_END, then it must be called again as described above. | ||||||
|  |  | ||||||
|  |     deflate() sets strm->adler to the adler32 checksum of all input read | ||||||
|  |   so far (that is, total_in bytes). | ||||||
|  |  | ||||||
|     deflate() may update data_type if it can make a good guess about |     deflate() may update data_type if it can make a good guess about | ||||||
|   the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered |   the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered | ||||||
|   binary. This field is only for information purposes and does not affect |   binary. This field is only for information purposes and does not affect | ||||||
| @@ -222,35 +272,50 @@ extern int deflate __P((z_stream *strm, int flush)); | |||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int deflateEnd __P((z_stream *strm)); | extern int EXPORT deflateEnd OF((z_streamp strm)); | ||||||
| /* | /* | ||||||
|      All dynamically allocated data structures for this stream are freed. |      All dynamically allocated data structures for this stream are freed. | ||||||
|    This function discards any unprocessed input and does not flush any |    This function discards any unprocessed input and does not flush any | ||||||
|    pending output. |    pending output. | ||||||
|  |  | ||||||
|      deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the |      deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the | ||||||
|    stream state was inconsistent. In the error case, msg may be set |    stream state was inconsistent, Z_DATA_ERROR if the stream was freed | ||||||
|    but then points to a static string (which must not be deallocated). |    prematurely (some input or output was discarded). In the error case, | ||||||
|  |    msg may be set but then points to a static string (which must not be | ||||||
|  |    deallocated). | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int inflateInit __P((z_stream *strm)); |  | ||||||
| /*  | /*  | ||||||
|      Initializes the internal stream state for decompression. The fields | extern int EXPORT inflateInit OF((z_streamp strm)); | ||||||
|    zalloc and zfree must be initialized before by the caller.  If zalloc and |  | ||||||
|    zfree are set to Z_NULL, deflateInit updates them to use default allocation |  | ||||||
|    functions. |  | ||||||
|  |  | ||||||
|      inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not |      Initializes the internal stream state for decompression. The fields | ||||||
|    enough memory.  msg is set to null if there is no error message. |    next_in, avail_in, zalloc, zfree and opaque must be initialized before by | ||||||
|    inflateInit does not perform any decompression: this will be done by |    the caller. If next_in is not Z_NULL and avail_in is large enough (the exact | ||||||
|    inflate(). |    value depends on the compression method), inflateInit determines the | ||||||
|  |    compression method from the zlib header and allocates all data structures | ||||||
|  |    accordingly; otherwise the allocation will be deferred to the first call of | ||||||
|  |    inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to | ||||||
|  |    use default allocation functions. | ||||||
|  |  | ||||||
|  |      inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough | ||||||
|  |    memory, Z_VERSION_ERROR if the zlib library version is incompatible with the | ||||||
|  |    version assumed by the caller.  msg is set to null if there is no error | ||||||
|  |    message. inflateInit does not perform any decompression apart from reading | ||||||
|  |    the zlib header if present: this will be done by inflate().  (So next_in and | ||||||
|  |    avail_in may be modified, but next_out and avail_out are unchanged.) | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int inflate __P((z_stream *strm, int flush)); | extern int EXPORT inflate OF((z_streamp strm, int flush)); | ||||||
| /* | /* | ||||||
|   Performs one or both of the following actions: |     inflate decompresses as much data as possible, and stops when the input | ||||||
|  |   buffer becomes empty or the output buffer becomes full. It may some | ||||||
|  |   introduce some output latency (reading input without producing any output) | ||||||
|  |   except when forced to flush. | ||||||
|  |  | ||||||
|  |   The detailed semantics are as follows. inflate performs one or both of the | ||||||
|  |   following actions: | ||||||
|  |  | ||||||
|   - Decompress more input starting at next_in and update next_in and avail_in |   - Decompress more input starting at next_in and update next_in and avail_in | ||||||
|     accordingly. If not all input can be processed (because there is not |     accordingly. If not all input can be processed (because there is not | ||||||
| @@ -258,19 +323,22 @@ extern int inflate __P((z_stream *strm, int flush)); | |||||||
|     will resume at this point for the next call of inflate(). |     will resume at this point for the next call of inflate(). | ||||||
|  |  | ||||||
|   - Provide more output starting at next_out and update next_out and avail_out |   - Provide more output starting at next_out and update next_out and avail_out | ||||||
|     accordingly.  inflate() always provides as much output as possible |     accordingly.  inflate() provides as much output as possible, until there | ||||||
|     (until no more input data or no more space in the output buffer). |     is no more input data or no more space in the output buffer (see below | ||||||
|  |     about the flush parameter). | ||||||
|  |  | ||||||
|   Before the call of inflate(), the application should ensure that at least |   Before the call of inflate(), the application should ensure that at least | ||||||
|   one of the actions is possible, by providing more input and/or consuming |   one of the actions is possible, by providing more input and/or consuming | ||||||
|   more output, and updating the next_* and avail_* values accordingly. |   more output, and updating the next_* and avail_* values accordingly. | ||||||
|   The application can consume the uncompressed output when it wants, for |   The application can consume the uncompressed output when it wants, for | ||||||
|   example when the output buffer is full (avail_out == 0), or after each |   example when the output buffer is full (avail_out == 0), or after each | ||||||
|   call of inflate(). |   call of inflate(). If inflate returns Z_OK and with zero avail_out, it | ||||||
|  |   must be called again after making room in the output buffer because there | ||||||
|  |   might be more output pending. | ||||||
|  |  | ||||||
|     If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much |     If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much | ||||||
|   output as possible to the output buffer. The flushing behavior of inflate is |   output as possible to the output buffer. The flushing behavior of inflate is | ||||||
|   not specified for values of the flush parameter other than Z_PARTIAL_FLUSH |   not specified for values of the flush parameter other than Z_SYNC_FLUSH | ||||||
|   and Z_FINISH, but the current implementation actually flushes as much output |   and Z_FINISH, but the current implementation actually flushes as much output | ||||||
|   as possible anyway. |   as possible anyway. | ||||||
|  |  | ||||||
| @@ -281,21 +349,34 @@ extern int inflate __P((z_stream *strm, int flush)); | |||||||
|   output is flushed; avail_out must be large enough to hold all the |   output is flushed; avail_out must be large enough to hold all the | ||||||
|   uncompressed data. (The size of the uncompressed data may have been saved |   uncompressed data. (The size of the uncompressed data may have been saved | ||||||
|   by the compressor for this purpose.) The next operation on this stream must |   by the compressor for this purpose.) The next operation on this stream must | ||||||
|   be inflateEnd to deallocate the decompression state. |   be inflateEnd to deallocate the decompression state. The use of Z_FINISH | ||||||
|  |   is never required, but can be used to inform inflate that a faster routine | ||||||
|  |   may be used for the single inflate() call. | ||||||
|  |  | ||||||
|     inflate() returns Z_OK if some progress has been made (more input |      If a preset dictionary is needed at this point (see inflateSetDictionary | ||||||
|   processed or more output produced), Z_STREAM_END if the end of the |   below), inflate sets strm-adler to the adler32 checksum of the | ||||||
|   compressed data has been reached and all uncompressed output has been |   dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise  | ||||||
|   produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if |   it sets strm->adler to the adler32 checksum of all output produced | ||||||
|   the stream structure was inconsistent (for example if next_in or next_out |   so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or | ||||||
|   was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no |   an error code as described below. At the end of the stream, inflate() | ||||||
|   progress is possible or if there was not enough room in the output buffer |   checks that its computed adler32 checksum is equal to that saved by the | ||||||
|   when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then |   compressor and returns Z_STREAM_END only if the checksum is correct. | ||||||
|   call inflateSync to look for a good compression block. |  | ||||||
|  |     inflate() returns Z_OK if some progress has been made (more input processed | ||||||
|  |   or more output produced), Z_STREAM_END if the end of the compressed data has | ||||||
|  |   been reached and all uncompressed output has been produced, Z_NEED_DICT if a | ||||||
|  |   preset dictionary is needed at this point, Z_DATA_ERROR if the input data was | ||||||
|  |   corrupted (input stream not conforming to the zlib format or incorrect | ||||||
|  |   adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent | ||||||
|  |   (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not | ||||||
|  |   enough memory, Z_BUF_ERROR if no progress is possible or if there was not | ||||||
|  |   enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR | ||||||
|  |   case, the application may then call inflateSync to look for a good | ||||||
|  |   compression block. | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  |  | ||||||
| extern int inflateEnd __P((z_stream *strm)); | extern int EXPORT inflateEnd OF((z_streamp strm)); | ||||||
| /* | /* | ||||||
|      All dynamically allocated data structures for this stream are freed. |      All dynamically allocated data structures for this stream are freed. | ||||||
|    This function discards any unprocessed input and does not flush any |    This function discards any unprocessed input and does not flush any | ||||||
| @@ -306,90 +387,111 @@ extern int inflateEnd __P((z_stream *strm)); | |||||||
|    static string (which must not be deallocated). |    static string (which must not be deallocated). | ||||||
| */ | */ | ||||||
|  |  | ||||||
|                         /* advanced functions */ |                         /* Advanced functions */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
|     The following functions are needed only in some special applications. |     The following functions are needed only in some special applications. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int deflateInit2 __P((z_stream *strm, |  | ||||||
| 			     int  level, |  | ||||||
| 			     int  method, |  | ||||||
|                              int  windowBits, |  | ||||||
|                              int  memLevel, |  | ||||||
|                              int  strategy)); |  | ||||||
| /*    | /*    | ||||||
|      This is another version of deflateInit with more compression options. The | extern int EXPORT deflateInit2 OF((z_streamp strm, | ||||||
|    fields next_in, zalloc and zfree must be initialized before by the caller. |                                    int  level, | ||||||
|  |                                    int  method, | ||||||
|  |                                    int  windowBits, | ||||||
|  |                                    int  memLevel, | ||||||
|  |                                    int  strategy)); | ||||||
|  |  | ||||||
|      The method parameter is the compression method. It must be 8 in this |      This is another version of deflateInit with more compression options. The | ||||||
|    version of the library. (Method 9 will allow a 64K history buffer and |    fields next_in, zalloc, zfree and opaque must be initialized before by | ||||||
|    partial block flushes.) |    the caller. | ||||||
|  |  | ||||||
|  |      The method parameter is the compression method. It must be Z_DEFLATED in | ||||||
|  |    this version of the library. | ||||||
|  |  | ||||||
|      The windowBits parameter is the base two logarithm of the window size |      The windowBits parameter is the base two logarithm of the window size | ||||||
|    (the size of the history buffer).  It should be in the range 8..15 for this |    (the size of the history buffer).  It should be in the range 8..15 for this | ||||||
|    version of the library (the value 16 will be allowed for method 9). Larger |    version of the library. Larger values of this parameter result in better | ||||||
|    values of this parameter result in better compression at the expense of |    compression at the expense of memory usage. The default value is 15 if | ||||||
|    memory usage. The default value is 15 if deflateInit is used instead. |    deflateInit is used instead. | ||||||
|  |  | ||||||
|     The memLevel parameter specifies how much memory should be allocated |      The memLevel parameter specifies how much memory should be allocated | ||||||
|    for the internal compression state. memLevel=1 uses minimum memory but |    for the internal compression state. memLevel=1 uses minimum memory but | ||||||
|    is slow and reduces compression ratio; memLevel=9 uses maximum memory |    is slow and reduces compression ratio; memLevel=9 uses maximum memory | ||||||
|    for optimal speed. The default value is 8. |    for optimal speed. The default value is 8. See zconf.h for total memory | ||||||
|  |    usage as a function of windowBits and memLevel. | ||||||
|  |  | ||||||
|      The strategy parameter is used to tune the compression algorithm. Use |      The strategy parameter is used to tune the compression algorithm. Use the | ||||||
|    the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data |    value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a | ||||||
|    produced by a filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman |    filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no | ||||||
|    encoding only (no string match).  Filtered data consists mostly of small |    string match).  Filtered data consists mostly of small values with a | ||||||
|    values with a somewhat random distribution. In this case, the |    somewhat random distribution. In this case, the compression algorithm is | ||||||
|    compression algorithm is tuned to compress them better. The strategy |    tuned to compress them better. The effect of Z_FILTERED is to force more | ||||||
|    parameter only affects the compression ratio but not the correctness of |    Huffman coding and less string matching; it is somewhat intermediate | ||||||
|    the compressed output even if it is not set appropriately. |    between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects | ||||||
|  |    the compression ratio but not the correctness of the compressed output even | ||||||
|  |    if it is not set appropriately. | ||||||
|  |  | ||||||
|      If next_in is not null, the library will use this buffer to hold also |       deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough | ||||||
|    some history information; the buffer must either hold the entire input |    memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid | ||||||
|    data, or have at least 1<<(windowBits+1) bytes and be writable. If next_in |    method). msg is set to null if there is no error message.  deflateInit2 does | ||||||
|    is null, the library will allocate its own history buffer (and leave next_in |    not perform any compression: this will be done by deflate(). | ||||||
|    null). next_out need not be provided here but must be provided by the |  | ||||||
|    application for the next call of deflate(). |  | ||||||
|  |  | ||||||
|      If the history buffer is provided by the application, next_in must |  | ||||||
|    must never be changed by the application since the compressor maintains |  | ||||||
|    information inside this buffer from call to call; the application |  | ||||||
|    must provide more input only by increasing avail_in. next_in is always |  | ||||||
|    reset by the library in this case. |  | ||||||
|  |  | ||||||
|       deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was |  | ||||||
|    not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as |  | ||||||
|    an invalid method). msg is set to null if there is no error message. |  | ||||||
|    deflateInit2 does not perform any compression: this will be done by |  | ||||||
|    deflate(). |  | ||||||
| */ | */ | ||||||
|                              |                              | ||||||
| extern int deflateCopy __P((z_stream *dest, | extern int EXPORT deflateSetDictionary OF((z_streamp strm, | ||||||
|                             z_stream *source)); |                                            const Bytef *dictionary, | ||||||
|  | 				           uInt  dictLength)); | ||||||
| /* | /* | ||||||
|      Sets the destination stream as a complete copy of the source stream.  If |      Initializes the compression dictionary from the given byte sequence | ||||||
|    the source stream is using an application-supplied history buffer, a new |    without producing any compressed output. This function must be called | ||||||
|    buffer is allocated for the destination stream.  The compressed output |    immediately after deflateInit or deflateInit2, before any call of | ||||||
|    buffer is always application-supplied. It's the responsibility of the |    deflate. The compressor and decompressor must use exactly the same | ||||||
|    application to provide the correct values of next_out and avail_out for the |    dictionary (see inflateSetDictionary). | ||||||
|    next call of deflate. |  | ||||||
|  |  | ||||||
|      This function is useful when several compression strategies will be |      The dictionary should consist of strings (byte sequences) that are likely | ||||||
|  |    to be encountered later in the data to be compressed, with the most commonly | ||||||
|  |    used strings preferably put towards the end of the dictionary. Using a | ||||||
|  |    dictionary is most useful when the data to be compressed is short and can be | ||||||
|  |    predicted with good accuracy; the data can then be compressed better than | ||||||
|  |    with the default empty dictionary. | ||||||
|  |  | ||||||
|  |      Depending on the size of the compression data structures selected by | ||||||
|  |    deflateInit or deflateInit2, a part of the dictionary may in effect be | ||||||
|  |    discarded, for example if the dictionary is larger than the window size in | ||||||
|  |    deflate or deflate2. Thus the strings most likely to be useful should be | ||||||
|  |    put at the end of the dictionary, not at the front. | ||||||
|  |  | ||||||
|  |      Upon return of this function, strm->adler is set to the Adler32 value | ||||||
|  |    of the dictionary; the decompressor may later use this value to determine | ||||||
|  |    which dictionary has been used by the compressor. (The Adler32 value | ||||||
|  |    applies to the whole dictionary even if only a subset of the dictionary is | ||||||
|  |    actually used by the compressor.) | ||||||
|  |  | ||||||
|  |      deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a | ||||||
|  |    parameter is invalid (such as NULL dictionary) or the stream state is | ||||||
|  |    inconsistent (for example if deflate has already been called for this stream | ||||||
|  |    or if the compression method is bsort). deflateSetDictionary does not | ||||||
|  |    perform any compression: this will be done by deflate(). | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT deflateCopy OF((z_streamp dest, | ||||||
|  |                                   z_streamp source)); | ||||||
|  | /* | ||||||
|  |      Sets the destination stream as a complete copy of the source stream. | ||||||
|  |  | ||||||
|  |      This function can be useful when several compression strategies will be | ||||||
|    tried, for example when there are several ways of pre-processing the input |    tried, for example when there are several ways of pre-processing the input | ||||||
|    data with a filter. The streams that will be discarded should then be freed |    data with a filter. The streams that will be discarded should then be freed | ||||||
|    by calling deflateEnd.  Note that deflateCopy duplicates the internal |    by calling deflateEnd.  Note that deflateCopy duplicates the internal | ||||||
|    compression state which can be quite large, so this strategy is slow and |    compression state which can be quite large, so this strategy is slow and | ||||||
|    can consume lots of memory. |    can consume lots of memory. | ||||||
|  |  | ||||||
|       deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not |      deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not | ||||||
|    enough memory, Z_STREAM_ERROR if the source stream state was inconsistent |    enough memory, Z_STREAM_ERROR if the source stream state was inconsistent | ||||||
|    (such as zalloc being NULL). msg is left unchanged in both source and |    (such as zalloc being NULL). msg is left unchanged in both source and | ||||||
|    destination. |    destination. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int deflateReset __P((z_stream *strm)); | extern int EXPORT deflateReset OF((z_streamp strm)); | ||||||
| /* | /* | ||||||
|      This function is equivalent to deflateEnd followed by deflateInit, |      This function is equivalent to deflateEnd followed by deflateInit, | ||||||
|    but does not free and reallocate all the internal compression state. |    but does not free and reallocate all the internal compression state. | ||||||
| @@ -400,47 +502,75 @@ extern int deflateReset __P((z_stream *strm)); | |||||||
|    stream state was inconsistent (such as zalloc or state being NULL). |    stream state was inconsistent (such as zalloc or state being NULL). | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int inflateInit2 __P((z_stream *strm, | extern int EXPORT deflateParams OF((z_streamp strm, int level, int strategy)); | ||||||
|                              int  windowBits)); | /* | ||||||
|  |      Dynamically update the compression level and compression strategy.  The | ||||||
|  |    interpretation of level and strategy is as in deflateInit2.  This can be | ||||||
|  |    used to switch between compression and straight copy of the input data, or | ||||||
|  |    to switch to a different kind of input data requiring a different | ||||||
|  |    strategy. If the compression level is changed, the input available so far | ||||||
|  |    is compressed with the old level (and may be flushed); the new level will | ||||||
|  |    take effect only at the next call of deflate(). | ||||||
|  |  | ||||||
|  |      Before the call of deflateParams, the stream state must be set as for | ||||||
|  |    a call of deflate(), since the currently available input may have to | ||||||
|  |    be compressed and flushed. In particular, strm->avail_out must be non-zero. | ||||||
|  |  | ||||||
|  |      deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source | ||||||
|  |    stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR | ||||||
|  |    if strm->avail_out was zero. | ||||||
|  | */ | ||||||
|  |  | ||||||
| /*    | /*    | ||||||
|      This is another version of inflateInit with more compression options. The | extern int EXPORT inflateInit2 OF((z_streamp strm, | ||||||
|    fields next_out, zalloc and zfree must be initialized before by the caller. |                                    int  windowBits)); | ||||||
|  |  | ||||||
|  |      This is another version of inflateInit with an extra parameter. The | ||||||
|  |    fields next_in, avail_in, zalloc, zfree and opaque must be initialized | ||||||
|  |    before by the caller. | ||||||
|  |  | ||||||
|      The windowBits parameter is the base two logarithm of the maximum window |      The windowBits parameter is the base two logarithm of the maximum window | ||||||
|    size (the size of the history buffer).  It should be in the range 8..15 for |    size (the size of the history buffer).  It should be in the range 8..15 for | ||||||
|    this version of the library (the value 16 will be allowed soon). The |    this version of the library. The default value is 15 if inflateInit is used | ||||||
|    default value is 15 if inflateInit is used instead. If a compressed stream |    instead. If a compressed stream with a larger window size is given as | ||||||
|    with a larger window size is given as input, inflate() will return with |    input, inflate() will return with the error code Z_DATA_ERROR instead of | ||||||
|    the error code Z_DATA_ERROR instead of trying to allocate a larger window. |    trying to allocate a larger window. | ||||||
|  |  | ||||||
|      If next_out is not null, the library will use this buffer for the history |       inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough | ||||||
|    buffer; the buffer must either be large enough to hold the entire output |    memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative | ||||||
|    data, or have at least 1<<windowBits bytes.  If next_out is null, the |    memLevel). msg is set to null if there is no error message.  inflateInit2 | ||||||
|    library will allocate its own buffer (and leave next_out null). next_in |    does not perform any decompression apart from reading the zlib header if | ||||||
|    need not be provided here but must be provided by the application for the |    present: this will be done by inflate(). (So next_in and avail_in may be | ||||||
|    next call of inflate(). |    modified, but next_out and avail_out are unchanged.) | ||||||
|  | */ | ||||||
|  |  | ||||||
|      If the history buffer is provided by the application, next_out must | extern int EXPORT inflateSetDictionary OF((z_streamp strm, | ||||||
|    never be changed by the application since the decompressor maintains | 				           const Bytef *dictionary, | ||||||
|    history information inside this buffer from call to call; the application | 					   uInt  dictLength)); | ||||||
|    can only reset next_out to the beginning of the history buffer when | /* | ||||||
|    avail_out is zero and all output has been consumed. |      Initializes the decompression dictionary from the given uncompressed byte | ||||||
|  |    sequence. This function must be called immediately after a call of inflate | ||||||
|  |    if this call returned Z_NEED_DICT. The dictionary chosen by the compressor | ||||||
|  |    can be determined from the Adler32 value returned by this call of | ||||||
|  |    inflate. The compressor and decompressor must use exactly the same | ||||||
|  |    dictionary (see deflateSetDictionary). | ||||||
|  |  | ||||||
|       inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was |      inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a | ||||||
|    not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as |    parameter is invalid (such as NULL dictionary) or the stream state is | ||||||
|    windowBits < 8). msg is set to null if there is no error message. |    inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the | ||||||
|    inflateInit2 does not perform any compression: this will be done by |    expected one (incorrect Adler32 value). inflateSetDictionary does not | ||||||
|  |    perform any decompression: this will be done by subsequent calls of | ||||||
|    inflate(). |    inflate(). | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int inflateSync __P((z_stream *strm)); | extern int EXPORT inflateSync OF((z_streamp strm)); | ||||||
| /*  | /*  | ||||||
|     Skips invalid compressed data until the special marker (see deflate() |     Skips invalid compressed data until a full flush point (see above the | ||||||
|   above) can be found, or until all available input is skipped. No output |   description of deflate with Z_FULL_FLUSH) can be found, or until all | ||||||
|   is provided. |   available input is skipped. No output is provided. | ||||||
|  |  | ||||||
|     inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR |     inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR | ||||||
|   if no more input was provided, Z_DATA_ERROR if no marker has been found, |   if no more input was provided, Z_DATA_ERROR if no flush point has been found, | ||||||
|   or Z_STREAM_ERROR if the stream structure was inconsistent. In the success |   or Z_STREAM_ERROR if the stream structure was inconsistent. In the success | ||||||
|   case, the application may save the current current value of total_in which |   case, the application may save the current current value of total_in which | ||||||
|   indicates where valid compressed data was found. In the error case, the |   indicates where valid compressed data was found. In the error case, the | ||||||
| @@ -448,7 +578,7 @@ extern int inflateSync __P((z_stream *strm)); | |||||||
|   until success or end of the input data. |   until success or end of the input data. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int inflateReset __P((z_stream *strm)); | extern int EXPORT inflateReset OF((z_streamp strm)); | ||||||
| /* | /* | ||||||
|      This function is equivalent to inflateEnd followed by inflateInit, |      This function is equivalent to inflateEnd followed by inflateInit, | ||||||
|    but does not free and reallocate all the internal decompression state. |    but does not free and reallocate all the internal decompression state. | ||||||
| @@ -464,13 +594,13 @@ extern int inflateReset __P((z_stream *strm)); | |||||||
| /* | /* | ||||||
|      The following utility functions are implemented on top of the |      The following utility functions are implemented on top of the | ||||||
|    basic stream-oriented functions. To simplify the interface, some |    basic stream-oriented functions. To simplify the interface, some | ||||||
|    default options are assumed (compression level, window size, |    default options are assumed (compression level and memory usage, | ||||||
|    standard memory allocation functions). The source code of these |    standard memory allocation functions). The source code of these | ||||||
|    utility functions can easily be modified if you need special options. |    utility functions can easily be modified if you need special options. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int compress __P((Byte *dest,   uLong *destLen, | extern int EXPORT compress OF((Bytef *dest,   uLongf *destLen, | ||||||
|                          Byte *source, uLong sourceLen)); | 			       const Bytef *source, uLong sourceLen)); | ||||||
| /* | /* | ||||||
|      Compresses the source buffer into the destination buffer.  sourceLen is |      Compresses the source buffer into the destination buffer.  sourceLen is | ||||||
|    the byte length of the source buffer. Upon entry, destLen is the total |    the byte length of the source buffer. Upon entry, destLen is the total | ||||||
| @@ -484,8 +614,8 @@ extern int compress __P((Byte *dest,   uLong *destLen, | |||||||
|    buffer. |    buffer. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int uncompress __P((Byte *dest,   uLong *destLen, | extern int EXPORT uncompress OF((Bytef *dest,   uLongf *destLen, | ||||||
|                            Byte *source, uLong sourceLen)); | 				 const Bytef *source, uLong sourceLen)); | ||||||
| /* | /* | ||||||
|      Decompresses the source buffer into the destination buffer.  sourceLen is |      Decompresses the source buffer into the destination buffer.  sourceLen is | ||||||
|    the byte length of the source buffer. Upon entry, destLen is the total |    the byte length of the source buffer. Upon entry, destLen is the total | ||||||
| @@ -505,28 +635,44 @@ extern int uncompress __P((Byte *dest,   uLong *destLen, | |||||||
|  |  | ||||||
| typedef voidp gzFile; | typedef voidp gzFile; | ||||||
|  |  | ||||||
| extern gzFile gzopen  __P((char *path, char *mode)); | extern gzFile EXPORT gzopen  OF((const char *path, const char *mode)); | ||||||
| /* | /* | ||||||
|      Opens a gzip (.gz) file for reading or writing. The mode parameter |      Opens a gzip (.gz) file for reading or writing. The mode parameter | ||||||
|    is as in fopen ("rb" or "wb"). gzopen can also be used to read a file |    is as in fopen ("rb" or "wb") but can also include a compression level | ||||||
|    which is not in gzip format; in this case gzread will directly read from |    ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for | ||||||
|    the file without decompression. |    Huffman only compression as in "wb1h". (See the description | ||||||
|  |    of deflateInit2 for more information about the strategy parameter.) | ||||||
|  |  | ||||||
|  |      gzopen can be used to read a file which is not in gzip format; in this | ||||||
|  |    case gzread will directly read from the file without decompression. | ||||||
|  |  | ||||||
|      gzopen returns NULL if the file could not be opened or if there was |      gzopen returns NULL if the file could not be opened or if there was | ||||||
|    insufficient memory to allocate the (de)compression state; errno |    insufficient memory to allocate the (de)compression state; errno | ||||||
|    can be checked to distinguish the two cases (if errno is zero, the |    can be checked to distinguish the two cases (if errno is zero, the | ||||||
|    zlib error is Z_MEM_ERROR). |    zlib error is Z_MEM_ERROR).  */ | ||||||
| */ |  | ||||||
|  |  | ||||||
| extern gzFile gzdopen  __P((int fd, char *mode)); | extern gzFile EXPORT gzdopen  OF((int fd, const char *mode)); | ||||||
| /* | /* | ||||||
|      gzdopen() associates a gzFile with the file descriptor fd.  File |      gzdopen() associates a gzFile with the file descriptor fd.  File | ||||||
|    descriptors are obtained from calls like open, dup, creat, or pipe. |    descriptors are obtained from calls like open, dup, creat, pipe or | ||||||
|    The mode parameter is as in fopen ("rb" or "wb"). |    fileno (in the file has been previously opened with fopen). | ||||||
|  |    The mode parameter is as in gzopen. | ||||||
|  |      The next call of gzclose on the returned gzFile will also close the | ||||||
|  |    file descriptor fd, just like fclose(fdopen(fd), mode) closes the file | ||||||
|  |    descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). | ||||||
|      gzdopen returns NULL if there was insufficient memory to allocate |      gzdopen returns NULL if there was insufficient memory to allocate | ||||||
|    the (de)compression state. |    the (de)compression state. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int    gzread  __P((gzFile file, voidp buf, unsigned len)); | extern int EXPORT gzsetparams OF((gzFile file, int level, int strategy)); | ||||||
|  | /* | ||||||
|  |      Dynamically update the compression level or strategy. See the description | ||||||
|  |    of deflateInit2 for the meaning of these parameters. | ||||||
|  |      gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not | ||||||
|  |    opened for writing. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzread  OF((gzFile file, voidp buf, unsigned len)); | ||||||
| /* | /* | ||||||
|      Reads the given number of uncompressed bytes from the compressed file. |      Reads the given number of uncompressed bytes from the compressed file. | ||||||
|    If the input file was not in gzip format, gzread copies the given number |    If the input file was not in gzip format, gzread copies the given number | ||||||
| @@ -534,14 +680,33 @@ extern int    gzread  __P((gzFile file, voidp buf, unsigned len)); | |||||||
|      gzread returns the number of uncompressed bytes actually read (0 for |      gzread returns the number of uncompressed bytes actually read (0 for | ||||||
|    end of file, -1 for error). */ |    end of file, -1 for error). */ | ||||||
|  |  | ||||||
| extern int    gzwrite __P((gzFile file, voidp buf, unsigned len)); | extern int EXPORT    gzwrite OF((gzFile file, const voidp buf, unsigned len)); | ||||||
| /* | /* | ||||||
|      Writes the given number of uncompressed bytes into the compressed file. |      Writes the given number of uncompressed bytes into the compressed file. | ||||||
|    gzwrite returns the number of uncompressed bytes actually written |    gzwrite returns the number of uncompressed bytes actually written | ||||||
|    (0 in case of error). |    (0 in case of error). | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int    gzflush __P((gzFile file, int flush)); | extern int EXPORTVA   gzprintf OF((gzFile file, const char *format, ...)); | ||||||
|  | /* | ||||||
|  |      Converts, formats, and writes the args to the compressed file under | ||||||
|  |    control of the format string, as in fprintf. gzprintf returns the number of | ||||||
|  |    uncompressed bytes actually written (0 in case of error). | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzputc OF((gzFile file, int c)); | ||||||
|  | /* | ||||||
|  |       Writes c, converted to an unsigned char, into the compressed file. | ||||||
|  |    gzputc returns the value that was written, or -1 in case of error. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzgetc OF((gzFile file)); | ||||||
|  | /* | ||||||
|  |       Reads one byte from the compressed file. gzgetc returns this byte | ||||||
|  |    or -1 in case of end of file or error. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzflush OF((gzFile file, int flush)); | ||||||
| /* | /* | ||||||
|      Flushes all pending output into the compressed file. The parameter |      Flushes all pending output into the compressed file. The parameter | ||||||
|    flush is as in the deflate() function. The return value is the zlib |    flush is as in the deflate() function. The return value is the zlib | ||||||
| @@ -551,14 +716,53 @@ extern int    gzflush __P((gzFile file, int flush)); | |||||||
|    degrade compression. |    degrade compression. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern int    gzclose __P((gzFile file)); | extern z_off_t EXPORT    gzseek OF((gzFile file, z_off_t offset, int whence)); | ||||||
|  | /*  | ||||||
|  |       Sets the starting position for the next gzread or gzwrite on the given | ||||||
|  |    compressed file. The offset represents a number of bytes in the | ||||||
|  |    uncompressed data stream. The whence parameter is defined as in lseek(2); | ||||||
|  |    the value SEEK_END is not supported. | ||||||
|  |      If the file is opened for reading, this function is emulated but can be | ||||||
|  |    extremely slow. If the file is opened for writing, only forward seeks are | ||||||
|  |    supported; gzseek then compresses a sequence of zeroes up to the new | ||||||
|  |    starting position. | ||||||
|  |  | ||||||
|  |       gzseek returns the resulting offset location as measured in bytes from | ||||||
|  |    the beginning of the uncompressed stream, or -1 in case of error, in | ||||||
|  |    particular if the file is opened for writing and the new starting position | ||||||
|  |    would be before the current position. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzrewind OF((gzFile file)); | ||||||
|  | /* | ||||||
|  |      Rewinds the given file. This function is supported only for reading. | ||||||
|  |  | ||||||
|  |    gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern z_off_t EXPORT    gztell OF((gzFile file)); | ||||||
|  | /* | ||||||
|  |      Returns the starting position for the next gzread or gzwrite on the | ||||||
|  |    given compressed file. This position represents a number of bytes in the | ||||||
|  |    uncompressed data stream. | ||||||
|  |  | ||||||
|  |    gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT gzeof OF((gzFile file)); | ||||||
|  | /* | ||||||
|  |      Returns 1 when EOF has previously been detected reading the given | ||||||
|  |    input stream, otherwise zero. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | extern int EXPORT    gzclose OF((gzFile file)); | ||||||
| /* | /* | ||||||
|      Flushes all pending output if necessary, closes the compressed file |      Flushes all pending output if necessary, closes the compressed file | ||||||
|    and deallocates all the (de)compression state. The return value is the zlib |    and deallocates all the (de)compression state. The return value is the zlib | ||||||
|    error number (see function gzerror below). |    error number (see function gzerror below). | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern char*   gzerror __P((gzFile file, int *errnum)); | extern const char * EXPORT gzerror OF((gzFile file, int *errnum)); | ||||||
| /* | /* | ||||||
|      Returns the error message for the last error which occurred on the |      Returns the error message for the last error which occurred on the | ||||||
|    given compressed file. errnum is set to zlib error number. If an |    given compressed file. errnum is set to zlib error number. If an | ||||||
| @@ -575,7 +779,8 @@ extern char*   gzerror __P((gzFile file, int *errnum)); | |||||||
|    compression library. |    compression library. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern uLong adler32 __P((uLong adler, Byte *buf, uInt len)); | extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|      Update a running Adler-32 checksum with the bytes buf[0..len-1] and |      Update a running Adler-32 checksum with the bytes buf[0..len-1] and | ||||||
|    return the updated checksum. If buf is NULL, this function returns |    return the updated checksum. If buf is NULL, this function returns | ||||||
| @@ -591,7 +796,7 @@ extern uLong adler32 __P((uLong adler, Byte *buf, uInt len)); | |||||||
|      if (adler != original_adler) error(); |      if (adler != original_adler) error(); | ||||||
| */ | */ | ||||||
|  |  | ||||||
| extern uLong crc32   __P((uLong crc, Byte *buf, uInt len)); | extern uLong EXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len)); | ||||||
| /* | /* | ||||||
|      Update a running crc with the bytes buf[0..len-1] and return the updated |      Update a running crc with the bytes buf[0..len-1] and return the updated | ||||||
|    crc. If buf is NULL, this function returns the required initial value |    crc. If buf is NULL, this function returns the required initial value | ||||||
| @@ -607,8 +812,42 @@ extern uLong crc32   __P((uLong crc, Byte *buf, uInt len)); | |||||||
|      if (crc != original_crc) error(); |      if (crc != original_crc) error(); | ||||||
| */ | */ | ||||||
|  |  | ||||||
| #ifndef _Z_UTIL_H |  | ||||||
|  |                         /* various hacks, don't look :) */ | ||||||
|  |  | ||||||
|  | /* deflateInit and inflateInit are macros to allow checking the zlib version | ||||||
|  |  * and the compiler's view of z_stream: | ||||||
|  |  */ | ||||||
|  | extern int EXPORT deflateInit_ OF((z_streamp strm, int level, | ||||||
|  | 			           const char *version, int stream_size)); | ||||||
|  | extern int EXPORT inflateInit_ OF((z_streamp strm, | ||||||
|  | 				   const char *version, int stream_size)); | ||||||
|  | extern int EXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method, | ||||||
|  | 				    int windowBits, int memLevel, int strategy, | ||||||
|  | 				    const char *version, int stream_size)); | ||||||
|  | extern int EXPORT inflateInit2_ OF((z_streamp strm, int  windowBits, | ||||||
|  | 				    const char *version, int stream_size)); | ||||||
|  | #define deflateInit(strm, level) \ | ||||||
|  |         deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream)) | ||||||
|  | #define inflateInit(strm) \ | ||||||
|  |         inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream)) | ||||||
|  | #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ | ||||||
|  |         deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ | ||||||
|  | 		      (strategy),           ZLIB_VERSION, sizeof(z_stream)) | ||||||
|  | #define inflateInit2(strm, windowBits) \ | ||||||
|  |         inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) | ||||||
|     struct internal_state {int dummy;}; /* hack for buggy compilers */ |     struct internal_state {int dummy;}; /* hack for buggy compilers */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | extern const char * EXPORT zError           OF((int err)); | ||||||
|  | extern int          EXPORT inflateSyncPoint OF((z_streamp z)); | ||||||
|  | extern uLongf *     EXPORT get_crc_table    OF((void)); | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #endif /* _ZLIB_H */ | #endif /* _ZLIB_H */ | ||||||
|   | |||||||
							
								
								
									
										160
									
								
								zutil.c
									
									
									
									
									
								
							
							
						
						
									
										160
									
								
								zutil.c
									
									
									
									
									
								
							| @@ -1,62 +1,106 @@ | |||||||
| /* zutil.c -- target dependent utility functions for the compression library | /* zutil.c -- target dependent utility functions for the compression library | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h  |  * For conditions of distribution and use, see copyright notice in zlib.h  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: zutil.c,v 1.6 1995/04/29 14:54:02 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  |  | ||||||
| #include "zutil.h" | #include "zutil.h" | ||||||
|  |  | ||||||
| extern void exit __P((int)); | struct internal_state      {int dummy;}; /* for buggy compilers */ | ||||||
|  |  | ||||||
| char *zlib_version = ZLIB_VERSION; | #ifndef STDC | ||||||
|  | extern void exit OF((int)); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| char *z_errmsg[] = { | const char *z_errmsg[10] = { | ||||||
| "stream end",          /* Z_STREAM_END    1 */ | "need dictionary",     /* Z_NEED_DICT       2  */ | ||||||
| "",                    /* Z_OK            0 */ | "stream end",          /* Z_STREAM_END      1  */ | ||||||
| "file error",          /* Z_ERRNO        (-1) */ | "",                    /* Z_OK              0  */ | ||||||
| "stream error",        /* Z_STREAM_ERROR (-2) */ | "file error",          /* Z_ERRNO         (-1) */ | ||||||
| "data error",          /* Z_DATA_ERROR   (-3) */ | "stream error",        /* Z_STREAM_ERROR  (-2) */ | ||||||
| "insufficient memory", /* Z_MEM_ERROR    (-4) */ | "data error",          /* Z_DATA_ERROR    (-3) */ | ||||||
| "buffer error",        /* Z_BUF_ERROR    (-5) */ | "insufficient memory", /* Z_MEM_ERROR     (-4) */ | ||||||
|  | "buffer error",        /* Z_BUF_ERROR     (-5) */ | ||||||
|  | "incompatible version",/* Z_VERSION_ERROR (-6) */ | ||||||
| ""}; | ""}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | const char * EXPORT zlibVersion() | ||||||
|  | { | ||||||
|  |     return ZLIB_VERSION; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  |  | ||||||
|  | #  ifndef verbose | ||||||
|  | #    define verbose 0 | ||||||
|  | #  endif | ||||||
|  | int z_verbose = verbose; | ||||||
|  |  | ||||||
| void z_error (m) | void z_error (m) | ||||||
|     char *m; |     char *m; | ||||||
| { | { | ||||||
|     fprintf(stderr, "%s\n", m); |     fprintf(stderr, "%s\n", m); | ||||||
|     exit(1); |     exit(1); | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* exported to allow conversion of error code to string for compress() and | ||||||
|  |  * uncompress() | ||||||
|  |  */ | ||||||
|  | const char * EXPORT zError(err) | ||||||
|  |     int err; | ||||||
|  | { | ||||||
|  |     return ERR_MSG(err); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef HAVE_MEMCPY | #ifndef HAVE_MEMCPY | ||||||
|  |  | ||||||
| void zmemcpy(dest, source, len) | void zmemcpy(dest, source, len) | ||||||
|     Byte* dest; |     Bytef* dest; | ||||||
|     Byte* source; |     Bytef* source; | ||||||
|     uInt  len; |     uInt  len; | ||||||
| { | { | ||||||
|     if (len == 0) return; |     if (len == 0) return; | ||||||
|     do { |     do { | ||||||
| 	*dest++ = *source++; /* ??? to be unrolled */ |         *dest++ = *source++; /* ??? to be unrolled */ | ||||||
|     } while (--len != 0); |     } while (--len != 0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int zmemcmp(s1, s2, len) | ||||||
|  |     Bytef* s1; | ||||||
|  |     Bytef* s2; | ||||||
|  |     uInt  len; | ||||||
|  | { | ||||||
|  |     uInt j; | ||||||
|  |  | ||||||
|  |     for (j = 0; j < len; j++) { | ||||||
|  |         if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| void zmemzero(dest, len) | void zmemzero(dest, len) | ||||||
|     Byte* dest; |     Bytef* dest; | ||||||
|     uInt  len; |     uInt  len; | ||||||
| { | { | ||||||
|     if (len == 0) return; |     if (len == 0) return; | ||||||
|     do { |     do { | ||||||
| 	*dest++ = 0;  /* ??? to be unrolled */ |         *dest++ = 0;  /* ??? to be unrolled */ | ||||||
|     } while (--len != 0); |     } while (--len != 0); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(MSDOS) && !defined(__SMALL__) && !defined(M_I86SM) | #ifdef __TURBOC__ | ||||||
| #  ifdef __TURBOC__ | #if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) | ||||||
|  | /* Small and medium model in Turbo C are for now limited to near allocation | ||||||
|  |  * with reduced MAX_WBITS and MAX_MEM_LEVEL | ||||||
|  |  */ | ||||||
|  | #  define MY_ZCALLOC | ||||||
|  |  | ||||||
| /* Turbo C malloc() does not allow dynamic allocation of 64K bytes | /* Turbo C malloc() does not allow dynamic allocation of 64K bytes | ||||||
|  * and farmalloc(64K) returns a pointer with an offset of 8, so we |  * and farmalloc(64K) returns a pointer with an offset of 8, so we | ||||||
| @@ -70,8 +114,8 @@ void zmemzero(dest, len) | |||||||
| local int next_ptr = 0; | local int next_ptr = 0; | ||||||
|  |  | ||||||
| typedef struct ptr_table_s { | typedef struct ptr_table_s { | ||||||
|     voidp org_ptr; |     voidpf org_ptr; | ||||||
|     voidp new_ptr; |     voidpf new_ptr; | ||||||
| } ptr_table; | } ptr_table; | ||||||
|  |  | ||||||
| local ptr_table table[MAX_PTR]; | local ptr_table table[MAX_PTR]; | ||||||
| @@ -82,16 +126,19 @@ local ptr_table table[MAX_PTR]; | |||||||
|  * a protected system like OS/2. Use Microsoft C instead. |  * a protected system like OS/2. Use Microsoft C instead. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| voidp zcalloc (voidp opaque, unsigned items, unsigned size) | voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) | ||||||
| { | { | ||||||
|     voidp buf = opaque; /* just to make some compilers happy */ |     voidpf buf = opaque; /* just to make some compilers happy */ | ||||||
|     ulg bsize = (ulg)items*size; |     ulg bsize = (ulg)items*size; | ||||||
|  |  | ||||||
|     if (bsize < 65536L) { |     /* If we allocate less than 65520 bytes, we assume that farmalloc | ||||||
| 	buf = farmalloc(bsize); |      * will return a usable pointer which doesn't have to be normalized. | ||||||
| 	if (*(ush*)&buf != 0) return buf; |      */ | ||||||
|  |     if (bsize < 65520L) { | ||||||
|  |         buf = farmalloc(bsize); | ||||||
|  |         if (*(ush*)&buf != 0) return buf; | ||||||
|     } else { |     } else { | ||||||
| 	buf = farmalloc(bsize + 16L); |         buf = farmalloc(bsize + 16L); | ||||||
|     } |     } | ||||||
|     if (buf == NULL || next_ptr >= MAX_PTR) return NULL; |     if (buf == NULL || next_ptr >= MAX_PTR) return NULL; | ||||||
|     table[next_ptr].org_ptr = buf; |     table[next_ptr].org_ptr = buf; | ||||||
| @@ -103,67 +150,78 @@ voidp zcalloc (voidp opaque, unsigned items, unsigned size) | |||||||
|     return buf; |     return buf; | ||||||
| } | } | ||||||
|  |  | ||||||
| void  zcfree (voidp opaque, voidp ptr) | void  zcfree (voidpf opaque, voidpf ptr) | ||||||
| { | { | ||||||
|     int n; |     int n; | ||||||
|     if (*(ush*)&ptr != 0) { /* object < 64K */ |     if (*(ush*)&ptr != 0) { /* object < 64K */ | ||||||
| 	farfree(ptr); |         farfree(ptr); | ||||||
| 	return; |         return; | ||||||
|     } |     } | ||||||
|     /* Find the original pointer */ |     /* Find the original pointer */ | ||||||
|     for (n = 0; n < next_ptr; n++) { |     for (n = 0; n < next_ptr; n++) { | ||||||
| 	if (ptr != table[n].new_ptr) continue; |         if (ptr != table[n].new_ptr) continue; | ||||||
|  |  | ||||||
| 	farfree(table[n].org_ptr); |         farfree(table[n].org_ptr); | ||||||
| 	while (++n < next_ptr) { |         while (++n < next_ptr) { | ||||||
| 	    table[n-1] = table[n]; |             table[n-1] = table[n]; | ||||||
| 	} |         } | ||||||
| 	next_ptr--; |         next_ptr--; | ||||||
| 	return; |         return; | ||||||
|     } |     } | ||||||
|     ptr = opaque; /* just to make some compilers happy */ |     ptr = opaque; /* just to make some compilers happy */ | ||||||
|     z_error("zcfree: ptr not found"); |     Assert(0, "zcfree: ptr not found"); | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  | #endif /* __TURBOC__ */ | ||||||
|  |  | ||||||
| #  else /* MSC */ |  | ||||||
|  | #if defined(M_I86) && !defined(__32BIT__) | ||||||
|  | /* Microsoft C in 16-bit mode */ | ||||||
|  |  | ||||||
|  | #  define MY_ZCALLOC | ||||||
|  |  | ||||||
| #if (!defined(_MSC_VER) || (_MSC_VER < 600)) | #if (!defined(_MSC_VER) || (_MSC_VER < 600)) | ||||||
| #  define _halloc  halloc | #  define _halloc  halloc | ||||||
| #  define _hfree   hfree | #  define _hfree   hfree | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| voidp zcalloc (voidp opaque, unsigned items, unsigned size) | voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) | ||||||
| { | { | ||||||
|     if (opaque) opaque = 0; /* to make compiler happy */ |     if (opaque) opaque = 0; /* to make compiler happy */ | ||||||
|     return _halloc((long)items, size); |     return _halloc((long)items, size); | ||||||
| } | } | ||||||
|  |  | ||||||
| void  zcfree (voidp opaque, voidp ptr) | void  zcfree (voidpf opaque, voidpf ptr) | ||||||
| { | { | ||||||
|     if (opaque) opaque = 0; /* to make compiler happy */ |     if (opaque) opaque = 0; /* to make compiler happy */ | ||||||
|     _hfree(ptr); |     _hfree(ptr); | ||||||
| } | } | ||||||
|  |  | ||||||
| #  endif /* __TURBOC__ ? */ | #endif /* MSC */ | ||||||
|  |  | ||||||
| #else /* !MSDOS */ |  | ||||||
|  |  | ||||||
| extern voidp calloc __P((uInt items, uInt size)); | #ifndef MY_ZCALLOC /* Any system without a special alloc function */ | ||||||
| extern void  free   __P((voidp ptr)); |  | ||||||
|  |  | ||||||
| voidp zcalloc (opaque, items, size) | #ifndef STDC | ||||||
|     voidp opaque; | 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 items; | ||||||
|     unsigned size; |     unsigned size; | ||||||
| { | { | ||||||
|     return calloc(items, size); |     if (opaque) items += size - size; /* make compiler happy */ | ||||||
|  |     return (voidpf)calloc(items, size); | ||||||
| } | } | ||||||
|  |  | ||||||
| void  zcfree (opaque, ptr) | void  zcfree (opaque, ptr) | ||||||
|     voidp opaque; |     voidpf opaque; | ||||||
|     voidp ptr; |     voidpf ptr; | ||||||
| { | { | ||||||
|     free(ptr); |     free(ptr); | ||||||
|  |     if (opaque) return; /* make compiler happy */ | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif /* MSDOS */ | #endif /* MY_ZCALLOC */ | ||||||
|   | |||||||
							
								
								
									
										131
									
								
								zutil.h
									
									
									
									
									
								
							
							
						
						
									
										131
									
								
								zutil.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| /* zutil.h -- internal interface and configuration of the compression library | /* zutil.h -- internal interface and configuration of the compression library | ||||||
|  * Copyright (C) 1995 Jean-loup Gailly. |  * Copyright (C) 1995-1998 Jean-loup Gailly. | ||||||
|  * For conditions of distribution and use, see copyright notice in zlib.h |  * For conditions of distribution and use, see copyright notice in zlib.h | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| @@ -8,20 +8,22 @@ | |||||||
|    subject to change. Applications should only use zlib.h. |    subject to change. Applications should only use zlib.h. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /* $Id: zutil.h,v 1.7 1995/04/30 10:55:33 jloup Exp $ */ | /* @(#) $Id$ */ | ||||||
|  |  | ||||||
| #ifndef _Z_UTIL_H | #ifndef _Z_UTIL_H | ||||||
| #define _Z_UTIL_H | #define _Z_UTIL_H | ||||||
|  |  | ||||||
| #include "zlib.h" | #include "zlib.h" | ||||||
|  |  | ||||||
| #ifdef MSDOS |  | ||||||
| #   include <stddef.h> |  | ||||||
| #else |  | ||||||
|     extern int errno; |  | ||||||
| #endif |  | ||||||
| #ifdef STDC | #ifdef STDC | ||||||
|  | #  include <stddef.h> | ||||||
| #  include <string.h> | #  include <string.h> | ||||||
|  | #  include <stdlib.h> | ||||||
|  | #endif | ||||||
|  | #ifdef NO_ERRNO_H | ||||||
|  |     extern int errno; | ||||||
|  | #else | ||||||
|  | #   include <errno.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef local | #ifndef local | ||||||
| @@ -30,20 +32,33 @@ | |||||||
| /* compile with -Dlocal if your debugger can't find static symbols */ | /* compile with -Dlocal if your debugger can't find static symbols */ | ||||||
|  |  | ||||||
| typedef unsigned char  uch; | typedef unsigned char  uch; | ||||||
|  | typedef uch FAR uchf; | ||||||
| typedef unsigned short ush; | typedef unsigned short ush; | ||||||
|  | typedef ush FAR ushf; | ||||||
| typedef unsigned long  ulg; | typedef unsigned long  ulg; | ||||||
|  |  | ||||||
| extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ | ||||||
|  | /* (size given to avoid silly warnings with Visual C++) */ | ||||||
|  |  | ||||||
| #define ERR_RETURN(strm,err) return (strm->msg=z_errmsg[1-err], err) | #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 */ | /* To be used only when the state is known to be valid */ | ||||||
|  |  | ||||||
| 	/* common constants */ |         /* common constants */ | ||||||
|  |  | ||||||
| #define DEFLATED   8 | #ifndef DEF_WBITS | ||||||
|  | #  define DEF_WBITS MAX_WBITS | ||||||
|  | #endif | ||||||
|  | /* default windowBits for decompression. MAX_WBITS is for compression only */ | ||||||
|  |  | ||||||
| #define DEF_WBITS 15 | #if MAX_MEM_LEVEL >= 8 | ||||||
| /* default WBITS for decompression. MAX_WBITS is useful for compression only */ | #  define DEF_MEM_LEVEL 8 | ||||||
|  | #else | ||||||
|  | #  define DEF_MEM_LEVEL  MAX_MEM_LEVEL | ||||||
|  | #endif | ||||||
|  | /* default memLevel */ | ||||||
|  |  | ||||||
| #define STORED_BLOCK 0 | #define STORED_BLOCK 0 | ||||||
| #define STATIC_TREES 1 | #define STATIC_TREES 1 | ||||||
| @@ -54,13 +69,21 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||||||
| #define MAX_MATCH  258 | #define MAX_MATCH  258 | ||||||
| /* The minimum and maximum match lengths */ | /* The minimum and maximum match lengths */ | ||||||
|  |  | ||||||
| 	/* target dependencies */ | #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ | ||||||
|  |  | ||||||
|  |         /* target dependencies */ | ||||||
|  |  | ||||||
| #ifdef MSDOS | #ifdef MSDOS | ||||||
| #  define OS_CODE  0x00 | #  define OS_CODE  0x00 | ||||||
| #  ifdef __TURBOC__ | #  ifdef __TURBOC__ | ||||||
| #    include <alloc.h> | #    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) | ||||||
| #  else /* MSC */ |        /* Allow compilation with ANSI keywords only enabled */ | ||||||
|  |        void _Cdecl farfree( void *block ); | ||||||
|  |        void *_Cdecl farmalloc( unsigned long nbytes ); | ||||||
|  | #    else | ||||||
|  | #     include <alloc.h> | ||||||
|  | #    endif | ||||||
|  | #  else /* MSC or DJGPP */ | ||||||
| #    include <malloc.h> | #    include <malloc.h> | ||||||
| #  endif | #  endif | ||||||
| #endif | #endif | ||||||
| @@ -69,13 +92,13 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||||||
| #  define OS_CODE  0x06 | #  define OS_CODE  0x06 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef WIN32 /* Windows NT */ | #ifdef WIN32 /* Window 95 & Windows NT */ | ||||||
| #  define OS_CODE  0x0b | #  define OS_CODE  0x0b | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(VAXC) || defined(VMS) | #if defined(VAXC) || defined(VMS) | ||||||
| #  define OS_CODE  0x02 | #  define OS_CODE  0x02 | ||||||
| #  define FOPEN(name, mode) \ | #  define F_OPEN(name, mode) \ | ||||||
|      fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") |      fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -99,48 +122,74 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||||||
| #  define OS_CODE  0x0a | #  define OS_CODE  0x0a | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	/* Common defaults */ | #if defined(_BEOS_) || defined(RISCOS) | ||||||
|  | #  define fdopen(fd,mode) NULL /* No fdopen() */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (defined(_MSC_VER) && (_MSC_VER >= 600)) | ||||||
|  | #  define fdopen(fd,type)  _fdopen(fd,type) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /* Common defaults */ | ||||||
|  |  | ||||||
| #ifndef OS_CODE | #ifndef OS_CODE | ||||||
| #  define OS_CODE  0x03  /* assume Unix */ | #  define OS_CODE  0x03  /* assume Unix */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef FOPEN | #ifndef F_OPEN | ||||||
| #  define FOPEN(name, mode) fopen((name), (mode)) | #  define F_OPEN(name, mode) fopen((name), (mode)) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|          /* functions */ |          /* functions */ | ||||||
|  |  | ||||||
| #ifdef HAVE_STRERROR | #ifdef HAVE_STRERROR | ||||||
|    extern char *strerror __P((int)); |    extern char *strerror OF((int)); | ||||||
| #  define zstrerror(errnum) strerror(errnum) | #  define zstrerror(errnum) strerror(errnum) | ||||||
| #else | #else | ||||||
| #  define zstrerror(errnum) "" | #  define zstrerror(errnum) "" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(STDC) && !defined(HAVE_MEMCPY) | #if defined(pyr) | ||||||
|  | #  define NO_MEMCPY | ||||||
|  | #endif | ||||||
|  | #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) | ||||||
|  |  /* Use our own functions for small and medium model with MSC <= 5.0. | ||||||
|  |   * You may have to use the same strategy for Borland C (untested). | ||||||
|  |   * The __SC__ check is for Symantec. | ||||||
|  |   */ | ||||||
|  | #  define NO_MEMCPY | ||||||
|  | #endif | ||||||
|  | #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) | ||||||
| #  define HAVE_MEMCPY | #  define HAVE_MEMCPY | ||||||
| #endif | #endif | ||||||
| #ifdef HAVE_MEMCPY | #ifdef HAVE_MEMCPY | ||||||
| #  define zmemcpy memcpy | #  ifdef SMALL_MEDIUM /* MSDOS small or medium model */ | ||||||
| #  define zmemzero(dest, len) memset(dest, 0, len) | #    define zmemcpy _fmemcpy | ||||||
|  | #    define zmemcmp _fmemcmp | ||||||
|  | #    define zmemzero(dest, len) _fmemset(dest, 0, len) | ||||||
|  | #  else | ||||||
|  | #    define zmemcpy memcpy | ||||||
|  | #    define zmemcmp memcmp | ||||||
|  | #    define zmemzero(dest, len) memset(dest, 0, len) | ||||||
|  | #  endif | ||||||
| #else | #else | ||||||
|    extern void zmemcpy  __P((Byte* dest, Byte* source, uInt len)); |    extern void zmemcpy  OF((Bytef* dest, Bytef* source, uInt len)); | ||||||
|    extern void zmemzero __P((Byte* dest, uInt len)); |    extern int  zmemcmp  OF((Bytef* s1,   Bytef* s2, uInt len)); | ||||||
|  |    extern void zmemzero OF((Bytef* dest, uInt len)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Diagnostic functions */ | /* Diagnostic functions */ | ||||||
| #ifdef DEBUG | #ifdef DEBUG | ||||||
| #  include <stdio.h> | #  include <stdio.h> | ||||||
| #  ifndef verbose |    extern int z_verbose; | ||||||
| #    define verbose 0 |    extern void z_error    OF((char *m)); | ||||||
| #  endif |  | ||||||
| #  define Assert(cond,msg) {if(!(cond)) z_error(msg);} | #  define Assert(cond,msg) {if(!(cond)) z_error(msg);} | ||||||
| #  define Trace(x) fprintf x | #  define Trace(x) {if (z_verbose>=0) fprintf x ;} | ||||||
| #  define Tracev(x) {if (verbose) fprintf x ;} | #  define Tracev(x) {if (z_verbose>0) fprintf x ;} | ||||||
| #  define Tracevv(x) {if (verbose>1) fprintf x ;} | #  define Tracevv(x) {if (z_verbose>1) fprintf x ;} | ||||||
| #  define Tracec(c,x) {if (verbose && (c)) fprintf x ;} | #  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} | ||||||
| #  define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} | #  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} | ||||||
| #else | #else | ||||||
| #  define Assert(cond,msg) | #  define Assert(cond,msg) | ||||||
| #  define Trace(x) | #  define Trace(x) | ||||||
| @@ -151,16 +200,14 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef uLong (*check_func) __P((uLong check, Byte *buf, uInt len)); | typedef uLong (EXPORT *check_func) OF((uLong check, const Bytef *buf, | ||||||
|  | 				       uInt len)); | ||||||
| extern void z_error    __P((char *m)); | voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); | ||||||
|  | void   zcfree  OF((voidpf opaque, voidpf ptr)); | ||||||
| voidp zcalloc __P((voidp opaque, unsigned items, unsigned size)); |  | ||||||
| void  zcfree  __P((voidp opaque, voidp ptr)); |  | ||||||
|  |  | ||||||
| #define ZALLOC(strm, items, size) \ | #define ZALLOC(strm, items, size) \ | ||||||
|            (*((strm)->zalloc))((strm)->opaque, (items), (size)) |            (*((strm)->zalloc))((strm)->opaque, (items), (size)) | ||||||
| #define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidp)(addr)) | #define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) | ||||||
| #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} | #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} | ||||||
|  |  | ||||||
| #endif /* _Z_UTIL_H */ | #endif /* _Z_UTIL_H */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user