Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | d6231142d2 | ||
|   | b1c19ca6d8 | ||
|   | abf180a067 | ||
|   | 9c3a583021 | ||
|   | 6b8233bfe0 | ||
|   | 0484693e17 | 
							
								
								
									
										142
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										142
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,6 +1,145 @@ | ||||
|  | ||||
|                 ChangeLog file for zlib | ||||
|  | ||||
| Changes in 1.2.3.2 (3 September 2006) | ||||
| - Turn off silly Borland warnings [Hay] | ||||
| - Use off64_t and define _LARGEFILE64_SOURCE when present | ||||
| - Fix missing dependency on inffixed.h in Makefile.in | ||||
| - Rig configure --shared to build both shared and static [Teredesai, Truta] | ||||
| - Remove zconf.in.h and instead create a new zlibdefs.h file | ||||
| - Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] | ||||
| - Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] | ||||
|  | ||||
| Changes in 1.2.3.1 (16 August 2006) | ||||
| - Add watcom directory with OpenWatcom make files [Daniel] | ||||
| - Remove #undef of FAR in zconf.in.h for MVS [Fedtke] | ||||
| - Update make_vms.com [Zinser] | ||||
| - Use -fPIC for shared build in configure [Teredesai, Nicholson] | ||||
| - Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] | ||||
| - Use fdopen() (not _fdopen()) for Interix in zutil.h [B<>ck] | ||||
| - Add some FAQ entries about the contrib directory | ||||
| - Update the MVS question in the FAQ | ||||
| - Avoid extraneous reads after EOF in gzio.c [Brown] | ||||
| - Correct spelling of "successfully" in gzio.c [Randers-Pehrson] | ||||
| - Add comments to zlib.h about gzerror() usage [Brown] | ||||
| - Set extra flags in gzip header in gzopen() like deflate() does | ||||
| - Make configure options more compatible with double-dash conventions | ||||
|   [Weigelt] | ||||
| - Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] | ||||
| - Fix uninstall target in Makefile.in [Truta] | ||||
| - Add pkgconfig support [Weigelt] | ||||
| - Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] | ||||
| - Replace set_data_type() with a more accurate detect_data_type() in | ||||
|   trees.c, according to the txtvsbin.txt document [Truta] | ||||
| - Swap the order of #include <stdio.h> and #include "zlib.h" in | ||||
|   gzio.c, example.c and minigzip.c [Truta] | ||||
| - Shut up annoying VS2005 warnings about standard C deprecation [Rowe, | ||||
|   Truta] (where?) | ||||
| - Fix target "clean" from win32/Makefile.bor [Truta] | ||||
| - Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] | ||||
| - Update zlib www home address in win32/DLL_FAQ.txt [Truta] | ||||
| - Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] | ||||
| - Enable browse info in the "Debug" and "ASM Debug" configurations in | ||||
|   the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] | ||||
| - Add pkgconfig support [Weigelt] | ||||
| - Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, | ||||
|   for use in win32/zlib1.rc [Polushin, Rowe, Truta] | ||||
| - Add a document that explains the new text detection scheme to | ||||
|   doc/txtvsbin.txt [Truta] | ||||
| - Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] | ||||
| - Move algorithm.txt into doc/ [Truta] | ||||
| - Synchronize FAQ with website | ||||
| - Fix compressBound(), was low for some pathological cases [Fearnley] | ||||
| - Take into account wrapper variations in deflateBound() | ||||
| - Set examples/zpipe.c input and output to binary mode for Windows  | ||||
| - Update examples/zlib_how.html with new zpipe.c (also web site) | ||||
| - Fix some warnings in examples/gzlog.c and examples/zran.c (it seems | ||||
|   that gcc became pickier in 4.0) | ||||
| - Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain | ||||
|   un-versioned, the patch adds versioning only for symbols introduced in | ||||
|   zlib-1.2.0 or later.  It also declares as local those symbols which are | ||||
|   not designed to be exported." [Levin] | ||||
| - Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure | ||||
| - Do not initialize global static by default in trees.c, add a response | ||||
|   NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] | ||||
| - Don't use strerror() in gzio.c under WinCE [Yakimov] | ||||
| - Don't use errno.h in zutil.h under WinCE [Yakimov] | ||||
| - Move arguments for AR to its usage to allow replacing ar [Marot] | ||||
| - Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] | ||||
| - Improve inflateInit() and inflateInit2() documentation | ||||
| - Fix structure size comment in inflate.h | ||||
| - Change configure help option from --h* to --help [Santos] | ||||
|  | ||||
| Changes in 1.2.3 (18 July 2005) | ||||
| - Apply security vulnerability fixes to contrib/infback9 as well | ||||
| - Clean up some text files (carriage returns, trailing space) | ||||
| - Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] | ||||
|  | ||||
| Changes in 1.2.2.4 (11 July 2005) | ||||
| - Add inflatePrime() function for starting inflation at bit boundary | ||||
| - Avoid some Visual C warnings in deflate.c | ||||
| - Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit | ||||
|   compile | ||||
| - Fix some spelling errors in comments [Betts] | ||||
| - Correct inflateInit2() error return documentation in zlib.h | ||||
| - Added zran.c example of compressed data random access to examples | ||||
|   directory, shows use of inflatePrime() | ||||
| - Fix cast for assignments to strm->state in inflate.c and infback.c | ||||
| - Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] | ||||
| - Move declarations of gf2 functions to right place in crc32.c [Oberhumer] | ||||
| - Add cast in trees.c t avoid a warning [Oberhumer] | ||||
| - Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] | ||||
| - Update make_vms.com [Zinser] | ||||
| - Initialize state->write in inflateReset() since copied in inflate_fast() | ||||
| - Be more strict on incomplete code sets in inflate_table() and increase | ||||
|   ENOUGH and MAXD -- this repairs a possible security vulnerability for | ||||
|   invalid inflate input.  Thanks to Tavis Ormandy and Markus Oberhumer for | ||||
|   discovering the vulnerability and providing test cases. | ||||
| - Add ia64 support to configure for HP-UX [Smith] | ||||
| - Add error return to gzread() for format or i/o error [Levin] | ||||
| - Use malloc.h for OS/2 [Necasek] | ||||
|  | ||||
| Changes in 1.2.2.3 (27 May 2005) | ||||
| - Replace 1U constants in inflate.c and inftrees.c for 64-bit compile | ||||
| - Typecast fread() return values in gzio.c [Vollant] | ||||
| - Remove trailing space in minigzip.c outmode (VC++ can't deal with it) | ||||
| - Fix crc check bug in gzread() after gzungetc() [Heiner] | ||||
| - Add the deflateTune() function to adjust internal compression parameters | ||||
| - Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) | ||||
| - Remove an incorrect assertion in examples/zpipe.c | ||||
| - Add C++ wrapper in infback9.h [Donais] | ||||
| - Fix bug in inflateCopy() when decoding fixed codes | ||||
| - Note in zlib.h how much deflateSetDictionary() actually uses | ||||
| - Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) | ||||
| - Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] | ||||
| - Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] | ||||
| - Add gzdirect() function to indicate transparent reads | ||||
| - Update contrib/minizip [Vollant] | ||||
| - Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] | ||||
| - Add casts in crc32.c to avoid warnings [Oberhumer] | ||||
| - Add contrib/masmx64 [Vollant] | ||||
| - Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] | ||||
|  | ||||
| Changes in 1.2.2.2 (30 December 2004) | ||||
| - Replace structure assignments in deflate.c and inflate.c with zmemcpy to | ||||
|   avoid implicit memcpy calls (portability for no-library compilation) | ||||
| - Increase sprintf() buffer size in gzdopen() to allow for large numbers | ||||
| - Add INFLATE_STRICT to check distances against zlib header | ||||
| - Improve WinCE errno handling and comments [Chang] | ||||
| - Remove comment about no gzip header processing in FAQ | ||||
| - Add Z_FIXED strategy option to deflateInit2() to force fixed trees | ||||
| - Add updated make_vms.com [Coghlan], update README | ||||
| - Create a new "examples" directory, move gzappend.c there, add zpipe.c, | ||||
|   fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. | ||||
| - Add FAQ entry and comments in deflate.c on uninitialized memory access | ||||
| - Add Solaris 9 make options in configure [Gilbert] | ||||
| - Allow strerror() usage in gzio.c for STDC | ||||
| - Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] | ||||
| - Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] | ||||
| - Use z_off_t for adler32_combine() and crc32_combine() lengths | ||||
| - Make adler32() much faster for small len | ||||
| - Use OS_CODE in deflate() default gzip header | ||||
|  | ||||
| Changes in 1.2.2.1 (31 October 2004) | ||||
| - Allow inflateSetDictionary() call for raw inflate | ||||
| - Fix inflate header crc check bug for file names and comments | ||||
| @@ -20,6 +159,7 @@ Changes in 1.2.2.1 (31 October 2004) | ||||
| - Do not define an exit() prototype in zutil.c unless DEBUG defined | ||||
| - Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] | ||||
| - Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() | ||||
| - Fix Darwin build version identification [Peterson] | ||||
|  | ||||
| Changes in 1.2.2 (3 October 2004) | ||||
| - Update zlib.h comments on gzip in-memory processing | ||||
| @@ -469,7 +609,7 @@ Changes in 1.0.7 (20 Jan 1998) | ||||
| 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 | ||||
| - Fix a deflate bug occurring 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() | ||||
|   | ||||
							
								
								
									
										60
									
								
								FAQ
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								FAQ
									
									
									
									
									
								
							| @@ -77,7 +77,7 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|  | ||||
| 11. Can zlib handle .zip archives? | ||||
|  | ||||
|     Not by itself, no.  See the directory contrib/minizip in the zlib | ||||
|     Not by itself, no. See the directory contrib/minizip in the zlib | ||||
|     distribution. | ||||
|  | ||||
| 12. Can zlib handle .Z files? | ||||
| @@ -148,13 +148,6 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|     format using deflateInit2(). You can also request that inflate decode | ||||
|     the gzip format using inflateInit2(). Read zlib.h for more details. | ||||
|  | ||||
|     Note that you cannot specify special gzip header contents (e.g. a file | ||||
|     name or modification date), nor will inflate tell you what was in the | ||||
|     gzip header. If you need to customize the header or see what's in it, | ||||
|     you can use the raw deflate and inflate operations and the crc32() | ||||
|     function and roll your own gzip encoding and decoding. Read the gzip | ||||
|     RFC 1952 for details of the header and trailer format. | ||||
|  | ||||
| 21. Is zlib thread-safe? | ||||
|  | ||||
|     Yes. However any library routines that zlib uses and any application- | ||||
| @@ -224,10 +217,14 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|  | ||||
| 29. Does zlib work on MVS, OS/390, CICS, etc.? | ||||
|  | ||||
|     We don't know for sure. We have heard occasional reports of success on | ||||
|     these systems. If you do use it on one of these, please provide us with | ||||
|     a report, instructions, and patches that we can reference when we get | ||||
|     these questions. Thanks. | ||||
|     Yes, there are working ports of zlib 1.1.4 to MVS which you can find | ||||
|     here: | ||||
|  | ||||
|     http://www.homerow.net/asm/zlib390.htm | ||||
|     http://www.homerow.net/asm/zlibLE.htm | ||||
|  | ||||
|     If these are updated to more recent versions of zlib, please let us | ||||
|     know. Thanks. | ||||
|  | ||||
| 30. Is there some simpler, easier to read version of inflate I can look at | ||||
|     to understand the deflate format? | ||||
| @@ -278,7 +275,9 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|         http://www.ijs.si/software/snprintf/ | ||||
|  | ||||
|     Note that you should be using the most recent version of zlib. Versions | ||||
|     1.1.3 and before were subject to a double-free vulnerability. | ||||
|     1.1.3 and before were subject to a double-free vulnerability, and version | ||||
|     1.2.1 was subject to an access exception when decompressing invalid | ||||
|     compressed data. | ||||
|  | ||||
| 34. Is there a Java version of zlib? | ||||
|  | ||||
| @@ -295,20 +294,29 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|     were downright silly. So now, we simply make sure that the code always | ||||
|     works. | ||||
|  | ||||
| 36. Will zlib read the (insert any ancient or arcane format here) compressed | ||||
| 36. Valgrind (or some similar memory access checker) says that deflate is | ||||
|     performing a conditional jump that depends on an uninitialized value. | ||||
|     Isn't that a bug? | ||||
|  | ||||
|     No. That is intentional for performance reasons, and the output of | ||||
|     deflate is not affected. This only started showing up recently since | ||||
|     zlib 1.2.x uses malloc() by default for allocations, whereas earlier | ||||
|     versions used calloc(), which zeros out the allocated memory. | ||||
|  | ||||
| 37. Will zlib read the (insert any ancient or arcane format here) compressed | ||||
|     data format? | ||||
|  | ||||
|     Probably not. Look in the comp.compression FAQ for pointers to various | ||||
|     formats and associated software. | ||||
|  | ||||
| 37. How can I encrypt/decrypt zip files with zlib? | ||||
| 38. How can I encrypt/decrypt zip files with zlib? | ||||
|  | ||||
|     zlib doesn't support encryption. The original PKZIP encryption is very weak | ||||
|     and can be broken with freely available programs. To get strong encryption, | ||||
|     use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. | ||||
|     For PKZIP compatible "encryption", look at http://www.info-zip.org/ | ||||
|  | ||||
| 38. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? | ||||
| 39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? | ||||
|  | ||||
|     "gzip" is the gzip format, and "deflate" is the zlib format. They should | ||||
|     probably have called the second one "zlib" instead to avoid confusion | ||||
| @@ -324,14 +332,30 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html | ||||
|  | ||||
|     Bottom line: use the gzip format for HTTP 1.1 encoding. | ||||
|  | ||||
| 39. Does zlib support the new "Deflate64" format introduced by PKWare? | ||||
| 40. Does zlib support the new "Deflate64" format introduced by PKWare? | ||||
|  | ||||
|     No. PKWare has apparently decided to keep that format proprietary, since | ||||
|     they have not documented it as they have previous compression formats. | ||||
|     In any case, the compression improvements are so modest compared to other | ||||
|     more modern approaches, that it's not worth the effort to implement. | ||||
|  | ||||
| 40. Can you please sign these lengthy legal documents and fax them back to us | ||||
| 41. I'm having a problem with the zip functions in zlib, can you help? | ||||
|  | ||||
|     There are no zip functions in zlib. You are probably using minizip by | ||||
|     Giles Vollant, which is found in the contrib directory of zlib. It is not | ||||
|     part of zlib. In fact none of the stuff in contrib is part of zlib. The | ||||
|     files in there are not supported by the zlib authors. You need to contact | ||||
|     the authors of the contribution for help. | ||||
|  | ||||
| 42. The match.asm code in contrib is under the GNU General Public License. | ||||
|     Since it's part of zlib, doesn't that mean that all of zlib falls under the | ||||
|     GNU GPL? | ||||
|  | ||||
|     No. The files in contrib are not part of zlib. They were contributed by | ||||
|     other authors and are provided as a convenience to the user within the zlib | ||||
|     distribution. Each of the items in contrib have their own license. | ||||
|  | ||||
| 43. Can you please sign these lengthy legal documents and fax them back to us | ||||
|     so that we can use your software in our product? | ||||
|  | ||||
|     No. Go away. Shoo. | ||||
|   | ||||
							
								
								
									
										13
									
								
								INDEX
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								INDEX
									
									
									
									
									
								
							| @@ -4,22 +4,28 @@ INDEX           this file | ||||
| Makefile        makefile for Unix (generated by configure) | ||||
| Makefile.in     makefile for Unix (template for configure) | ||||
| README          guess what | ||||
| algorithm.txt   description of the (de)compression algorithm | ||||
| configure       configure script for Unix | ||||
| zconf.in.h      template for zconf.h (used by configure) | ||||
| make_vms.com	makefile for VMS | ||||
| treebuild.xml	see http://treebuild.metux.de/ | ||||
| zlib.3		Man page for zlib | ||||
| zlib.map	Linux symbol information | ||||
| zlib.pc.in	Template for pkg-config descriptor | ||||
|  | ||||
| amiga/          makefiles for Amiga SAS C | ||||
| as400/          makefiles for IBM AS/400 | ||||
| doc/		documentation for formats and algorithms | ||||
| msdos/          makefiles for MSDOS | ||||
| old/            makefiles for various architectures and zlib documentation | ||||
|                 files that have not yet been updated for zlib 1.2.x | ||||
| projects/       projects for various Integrated Development Environments | ||||
| qnx/            makefiles for QNX | ||||
| watcom/		makefiles for OpenWatcom | ||||
| win32/          makefiles for Windows | ||||
|  | ||||
|                 zlib public header files (must be kept): | ||||
|                 zlib public header files (required for library use): | ||||
| zconf.h | ||||
| zlib.h | ||||
| zlibdefs.h | ||||
|  | ||||
|                 private source files used to build the zlib library: | ||||
| adler32.c | ||||
| @@ -46,6 +52,7 @@ zutil.h | ||||
|                 source files for sample programs: | ||||
| example.c | ||||
| minigzip.c | ||||
| See examples/README.examples for more | ||||
|  | ||||
|                 unsupported contribution by third parties | ||||
| See contrib/README.contrib | ||||
|   | ||||
							
								
								
									
										120
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| # Makefile for zlib | ||||
| # Copyright (C) 1995-2003 Jean-loup Gailly. | ||||
| # Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
| # For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  | ||||
| # To compile and test, type: | ||||
| @@ -24,16 +24,18 @@ CFLAGS=-O | ||||
| #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||
| #           -Wstrict-prototypes -Wmissing-prototypes | ||||
|  | ||||
| SFLAGS=-O | ||||
|  | ||||
| LDFLAGS=libz.a | ||||
| LDSHARED=$(CC) | ||||
| CPP=$(CC) -E | ||||
|  | ||||
| LIBS=libz.a | ||||
| SHAREDLIB=libz.so | ||||
| SHAREDLIBV=libz.so.1.2.2.1 | ||||
| SHAREDLIBV=libz.so.1.2.3.2 | ||||
| SHAREDLIBM=libz.so.1 | ||||
|  | ||||
| AR=ar rc | ||||
| AR=ar | ||||
| RANLIB=ranlib | ||||
| TAR=tar | ||||
| SHELL=/bin/sh | ||||
| @@ -45,13 +47,18 @@ libdir = ${exec_prefix}/lib | ||||
| includedir = ${prefix}/include | ||||
| mandir = ${prefix}/share/man | ||||
| man3dir = ${mandir}/man3 | ||||
| pkgconfigdir = ${libdir}/pkgconfig | ||||
|  | ||||
| OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||
| OBJC = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||
|        zutil.o inflate.o infback.o inftrees.o inffast.o | ||||
|  | ||||
| OBJA = | ||||
| # to use the asm code: make OBJA=match.o | ||||
|  | ||||
| OBJS = $(OBJC) $(OBJA) | ||||
|  | ||||
| PIC_OBJS = $(OBJS:%.o=%.lo) | ||||
|  | ||||
| TEST_OBJS = example.o minigzip.o | ||||
|  | ||||
| all: example$(EXE) minigzip$(EXE) | ||||
| @@ -67,8 +74,8 @@ test: all | ||||
| 	  echo '		*** zlib test FAILED ***'; \ | ||||
| 	fi | ||||
|  | ||||
| libz.a: $(OBJS) $(OBJA) | ||||
| 	$(AR) $@ $(OBJS) $(OBJA) | ||||
| libz.a: $(OBJS) | ||||
| 	$(AR) $@ $(OBJS) | ||||
| 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1 | ||||
|  | ||||
| match.o: match.S | ||||
| @@ -77,8 +84,17 @@ match.o: match.S | ||||
| 	mv _match.o match.o | ||||
| 	rm -f _match.s | ||||
|  | ||||
| $(SHAREDLIBV): $(OBJS) | ||||
| 	$(LDSHARED) -o $@ $(OBJS) | ||||
| match.lo: match.S | ||||
| 	$(CPP) match.S > _match.s | ||||
| 	$(CC) -c -fPIC _match.s | ||||
| 	mv _match.o match.lo | ||||
| 	rm -f _match.s | ||||
|  | ||||
| %.lo: %.c | ||||
| 	$(CC) $(SFLAGS) -DPIC -c $< -o $@ | ||||
|  | ||||
| $(SHAREDLIBV): $(PIC_OBJS) | ||||
| 	$(LDSHARED) -o $@ $(PIC_OBJS) -lc | ||||
| 	rm -f $(SHAREDLIB) $(SHAREDLIBM) | ||||
| 	ln -s $@ $(SHAREDLIB) | ||||
| 	ln -s $@ $(SHAREDLIBM) | ||||
| @@ -89,46 +105,53 @@ example$(EXE): example.o $(LIBS) | ||||
| minigzip$(EXE): minigzip.o $(LIBS) | ||||
| 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||||
|  | ||||
| install: $(LIBS) | ||||
| 	-@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi | ||||
| 	-@if [ ! -d $(includedir)  ]; then mkdir -p $(includedir); fi | ||||
| 	-@if [ ! -d $(libdir)      ]; then mkdir -p $(libdir); fi | ||||
| 	-@if [ ! -d $(man3dir)     ]; then mkdir -p $(man3dir); fi | ||||
| 	cp zlib.h zconf.h $(includedir) | ||||
| 	chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h | ||||
| 	cp $(LIBS) $(libdir) | ||||
| 	cd $(libdir); chmod 755 $(LIBS) | ||||
| 	-@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||
| 	cd $(libdir); if test -f $(SHAREDLIBV); then \ | ||||
| install-libs: $(LIBS) | ||||
| 	-@if [ ! -d $(DESTDIR)$(exec_prefix)  ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(libdir)       ]; then mkdir -p $(DESTDIR)$(libdir); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(man3dir)      ]; then mkdir -p $(DESTDIR)$(man3dir); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi | ||||
| 	cp $(LIBS) $(DESTDIR)$(libdir) | ||||
| 	cd $(DESTDIR)$(libdir); chmod 755 $(LIBS) | ||||
| 	-@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||
| 	cd $(DESTDIR)$(libdir); if test -f $(SHAREDLIBV); then \ | ||||
| 	  rm -f $(SHAREDLIB) $(SHAREDLIBM); \ | ||||
| 	  ln -s $(SHAREDLIBV) $(SHAREDLIB); \ | ||||
| 	  ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ | ||||
| 	  (ldconfig || true)  >/dev/null 2>&1; \ | ||||
| 	fi | ||||
| 	cp zlib.3 $(man3dir) | ||||
| 	chmod 644 $(man3dir)/zlib.3 | ||||
| 	cp zlib.3 $(DESTDIR)$(man3dir) | ||||
| 	chmod 644 $(DESTDIR)$(man3dir)/zlib.3 | ||||
| 	cp zlib.pc $(DESTDIR)$(pkgconfigdir) | ||||
| 	chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc | ||||
| # The ranlib in install is needed on NeXTSTEP which checks file times | ||||
| # ldconfig is for Linux | ||||
|  | ||||
| install: install-libs | ||||
| 	-@if [ ! -d $(DESTDIR)$(includedir)   ]; then mkdir -p $(DESTDIR)$(includedir); fi | ||||
| 	cp zlib.h zconf.h zlibdefs.h $(DESTDIR)$(includedir) | ||||
| 	chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h $(DESTDIR)$(includedir)/zlibdefs.h | ||||
|  | ||||
| uninstall: | ||||
| 	cd $(includedir); \ | ||||
| 	cd $(libdir); rm -f libz.a; \ | ||||
| 	cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h zlibdefs.h | ||||
| 	cd $(DESTDIR)$(libdir); rm -f libz.a; \ | ||||
| 	if test -f $(SHAREDLIBV); then \ | ||||
| 	  rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ | ||||
| 	fi | ||||
| 	cd $(man3dir); rm -f zlib.3 | ||||
| 	cd $(DESTDIR)$(man3dir); rm -f zlib.3 | ||||
| 	cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc | ||||
|  | ||||
| mostlyclean: clean | ||||
| clean: | ||||
| 	rm -f *.o *~ example$(EXE) minigzip$(EXE) \ | ||||
| 	rm -f *.o *.lo *~ example$(EXE) minigzip$(EXE) \ | ||||
| 	   libz.* foo.gz so_locations \ | ||||
| 	   _match.s maketree contrib/infback9/*.o | ||||
|  | ||||
| maintainer-clean: distclean | ||||
| distclean: clean | ||||
| 	cp -p Makefile.in Makefile | ||||
| 	cp -p zconf.in.h zconf.h | ||||
| 	rm -f .DS_Store | ||||
| 	rm zlibdefs.h | ||||
| 	touch -r configure zlibdefs.h | ||||
| 	rm -f zlib.pc .DS_Store | ||||
|  | ||||
| tags: | ||||
| 	etags *.[ch] | ||||
| @@ -138,17 +161,32 @@ depend: | ||||
|  | ||||
| # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||
|  | ||||
| adler32.o: zlib.h zconf.h | ||||
| compress.o: zlib.h zconf.h | ||||
| crc32.o: crc32.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 | ||||
| inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||||
| minigzip.o: zlib.h zconf.h | ||||
| trees.o: deflate.h zutil.h zlib.h zconf.h trees.h | ||||
| uncompr.o: zlib.h zconf.h | ||||
| zutil.o: zutil.h zlib.h zconf.h | ||||
| adler32.o: zlib.h zconf.h zlibdefs.h | ||||
| compress.o: zlib.h zconf.h zlibdefs.h | ||||
| crc32.o: crc32.h zlib.h zconf.h zlibdefs.h | ||||
| deflate.o: deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| example.o: zlib.h zconf.h zlibdefs.h | ||||
| gzio.o: zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inffast.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h | ||||
| inflate.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| infback.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| inftrees.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| minigzip.o: zlib.h zconf.h zlibdefs.h | ||||
| trees.o: deflate.h zutil.h zlib.h zconf.h zlibdefs.h trees.h | ||||
| uncompr.o: zlib.h zconf.h zlibdefs.h | ||||
| zutil.o: zutil.h zlib.h zconf.h zlibdefs.h | ||||
|  | ||||
| adler32.lo: zlib.h zconf.h zlibdefs.h | ||||
| compress.lo: zlib.h zconf.h zlibdefs.h | ||||
| crc32.lo: crc32.h zlib.h zconf.h zlibdefs.h | ||||
| deflate.lo: deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| example.lo: zlib.h zconf.h zlibdefs.h | ||||
| gzio.lo: zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inffast.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h | ||||
| inflate.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| infback.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| inftrees.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| minigzip.lo: zlib.h zconf.h zlibdefs.h | ||||
| trees.lo: deflate.h zutil.h zlib.h zconf.h zlibdefs.h trees.h | ||||
| uncompr.lo: zlib.h zconf.h zlibdefs.h | ||||
| zutil.lo: zutil.h zlib.h zconf.h zlibdefs.h | ||||
|   | ||||
							
								
								
									
										120
									
								
								Makefile.in
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								Makefile.in
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| # Makefile for zlib | ||||
| # Copyright (C) 1995-2003 Jean-loup Gailly. | ||||
| # Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
| # For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  | ||||
| # To compile and test, type: | ||||
| @@ -24,16 +24,18 @@ CFLAGS=-O | ||||
| #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||||
| #           -Wstrict-prototypes -Wmissing-prototypes | ||||
|  | ||||
| SFLAGS=-O | ||||
|  | ||||
| LDFLAGS=libz.a | ||||
| LDSHARED=$(CC) | ||||
| CPP=$(CC) -E | ||||
|  | ||||
| LIBS=libz.a | ||||
| SHAREDLIB=libz.so | ||||
| SHAREDLIBV=libz.so.1.2.2.1 | ||||
| SHAREDLIBV=libz.so.1.2.3.2 | ||||
| SHAREDLIBM=libz.so.1 | ||||
|  | ||||
| AR=ar rc | ||||
| AR=ar | ||||
| RANLIB=ranlib | ||||
| TAR=tar | ||||
| SHELL=/bin/sh | ||||
| @@ -45,13 +47,18 @@ libdir = ${exec_prefix}/lib | ||||
| includedir = ${prefix}/include | ||||
| mandir = ${prefix}/share/man | ||||
| man3dir = ${mandir}/man3 | ||||
| pkgconfigdir = ${libdir}/pkgconfig | ||||
|  | ||||
| OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||
| OBJC = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||||
|        zutil.o inflate.o infback.o inftrees.o inffast.o | ||||
|  | ||||
| OBJA = | ||||
| # to use the asm code: make OBJA=match.o | ||||
|  | ||||
| OBJS = $(OBJC) $(OBJA) | ||||
|  | ||||
| PIC_OBJS = $(OBJS:%.o=%.lo) | ||||
|  | ||||
| TEST_OBJS = example.o minigzip.o | ||||
|  | ||||
| all: example$(EXE) minigzip$(EXE) | ||||
| @@ -67,8 +74,8 @@ test: all | ||||
| 	  echo '		*** zlib test FAILED ***'; \ | ||||
| 	fi | ||||
|  | ||||
| libz.a: $(OBJS) $(OBJA) | ||||
| 	$(AR) $@ $(OBJS) $(OBJA) | ||||
| libz.a: $(OBJS) | ||||
| 	$(AR) $@ $(OBJS) | ||||
| 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1 | ||||
|  | ||||
| match.o: match.S | ||||
| @@ -77,8 +84,17 @@ match.o: match.S | ||||
| 	mv _match.o match.o | ||||
| 	rm -f _match.s | ||||
|  | ||||
| $(SHAREDLIBV): $(OBJS) | ||||
| 	$(LDSHARED) -o $@ $(OBJS) | ||||
| match.lo: match.S | ||||
| 	$(CPP) match.S > _match.s | ||||
| 	$(CC) -c -fPIC _match.s | ||||
| 	mv _match.o match.lo | ||||
| 	rm -f _match.s | ||||
|  | ||||
| %.lo: %.c | ||||
| 	$(CC) $(SFLAGS) -DPIC -c $< -o $@ | ||||
|  | ||||
| $(SHAREDLIBV): $(PIC_OBJS) | ||||
| 	$(LDSHARED) -o $@ $(PIC_OBJS) -lc | ||||
| 	rm -f $(SHAREDLIB) $(SHAREDLIBM) | ||||
| 	ln -s $@ $(SHAREDLIB) | ||||
| 	ln -s $@ $(SHAREDLIBM) | ||||
| @@ -89,46 +105,53 @@ example$(EXE): example.o $(LIBS) | ||||
| minigzip$(EXE): minigzip.o $(LIBS) | ||||
| 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||||
|  | ||||
| install: $(LIBS) | ||||
| 	-@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi | ||||
| 	-@if [ ! -d $(includedir)  ]; then mkdir -p $(includedir); fi | ||||
| 	-@if [ ! -d $(libdir)      ]; then mkdir -p $(libdir); fi | ||||
| 	-@if [ ! -d $(man3dir)     ]; then mkdir -p $(man3dir); fi | ||||
| 	cp zlib.h zconf.h $(includedir) | ||||
| 	chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h | ||||
| 	cp $(LIBS) $(libdir) | ||||
| 	cd $(libdir); chmod 755 $(LIBS) | ||||
| 	-@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||
| 	cd $(libdir); if test -f $(SHAREDLIBV); then \ | ||||
| install-libs: $(LIBS) | ||||
| 	-@if [ ! -d $(DESTDIR)$(exec_prefix)  ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(libdir)       ]; then mkdir -p $(DESTDIR)$(libdir); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(man3dir)      ]; then mkdir -p $(DESTDIR)$(man3dir); fi | ||||
| 	-@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi | ||||
| 	cp $(LIBS) $(DESTDIR)$(libdir) | ||||
| 	cd $(DESTDIR)$(libdir); chmod 755 $(LIBS) | ||||
| 	-@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||||
| 	cd $(DESTDIR)$(libdir); if test -f $(SHAREDLIBV); then \ | ||||
| 	  rm -f $(SHAREDLIB) $(SHAREDLIBM); \ | ||||
| 	  ln -s $(SHAREDLIBV) $(SHAREDLIB); \ | ||||
| 	  ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ | ||||
| 	  (ldconfig || true)  >/dev/null 2>&1; \ | ||||
| 	fi | ||||
| 	cp zlib.3 $(man3dir) | ||||
| 	chmod 644 $(man3dir)/zlib.3 | ||||
| 	cp zlib.3 $(DESTDIR)$(man3dir) | ||||
| 	chmod 644 $(DESTDIR)$(man3dir)/zlib.3 | ||||
| 	cp zlib.pc $(DESTDIR)$(pkgconfigdir) | ||||
| 	chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc | ||||
| # The ranlib in install is needed on NeXTSTEP which checks file times | ||||
| # ldconfig is for Linux | ||||
|  | ||||
| install: install-libs | ||||
| 	-@if [ ! -d $(DESTDIR)$(includedir)   ]; then mkdir -p $(DESTDIR)$(includedir); fi | ||||
| 	cp zlib.h zconf.h zlibdefs.h $(DESTDIR)$(includedir) | ||||
| 	chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h $(DESTDIR)$(includedir)/zlibdefs.h | ||||
|  | ||||
| uninstall: | ||||
| 	cd $(includedir); \ | ||||
| 	cd $(libdir); rm -f libz.a; \ | ||||
| 	cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h zlibdefs.h | ||||
| 	cd $(DESTDIR)$(libdir); rm -f libz.a; \ | ||||
| 	if test -f $(SHAREDLIBV); then \ | ||||
| 	  rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ | ||||
| 	fi | ||||
| 	cd $(man3dir); rm -f zlib.3 | ||||
| 	cd $(DESTDIR)$(man3dir); rm -f zlib.3 | ||||
| 	cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc | ||||
|  | ||||
| mostlyclean: clean | ||||
| clean: | ||||
| 	rm -f *.o *~ example$(EXE) minigzip$(EXE) \ | ||||
| 	rm -f *.o *.lo *~ example$(EXE) minigzip$(EXE) \ | ||||
| 	   libz.* foo.gz so_locations \ | ||||
| 	   _match.s maketree contrib/infback9/*.o | ||||
|  | ||||
| maintainer-clean: distclean | ||||
| distclean: clean | ||||
| 	cp -p Makefile.in Makefile | ||||
| 	cp -p zconf.in.h zconf.h | ||||
| 	rm -f .DS_Store | ||||
| 	rm zlibdefs.h | ||||
| 	touch -r configure zlibdefs.h | ||||
| 	rm -f zlib.pc .DS_Store | ||||
|  | ||||
| tags: | ||||
| 	etags *.[ch] | ||||
| @@ -138,17 +161,32 @@ depend: | ||||
|  | ||||
| # DO NOT DELETE THIS LINE -- make depend depends on it. | ||||
|  | ||||
| adler32.o: zlib.h zconf.h | ||||
| compress.o: zlib.h zconf.h | ||||
| crc32.o: crc32.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 | ||||
| inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h | ||||
| inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||||
| minigzip.o: zlib.h zconf.h | ||||
| trees.o: deflate.h zutil.h zlib.h zconf.h trees.h | ||||
| uncompr.o: zlib.h zconf.h | ||||
| zutil.o: zutil.h zlib.h zconf.h | ||||
| adler32.o: zlib.h zconf.h zlibdefs.h | ||||
| compress.o: zlib.h zconf.h zlibdefs.h | ||||
| crc32.o: crc32.h zlib.h zconf.h zlibdefs.h | ||||
| deflate.o: deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| example.o: zlib.h zconf.h zlibdefs.h | ||||
| gzio.o: zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inffast.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h | ||||
| inflate.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| infback.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| inftrees.o: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| minigzip.o: zlib.h zconf.h zlibdefs.h | ||||
| trees.o: deflate.h zutil.h zlib.h zconf.h zlibdefs.h trees.h | ||||
| uncompr.o: zlib.h zconf.h zlibdefs.h | ||||
| zutil.o: zutil.h zlib.h zconf.h zlibdefs.h | ||||
|  | ||||
| adler32.lo: zlib.h zconf.h zlibdefs.h | ||||
| compress.lo: zlib.h zconf.h zlibdefs.h | ||||
| crc32.lo: crc32.h zlib.h zconf.h zlibdefs.h | ||||
| deflate.lo: deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| example.lo: zlib.h zconf.h zlibdefs.h | ||||
| gzio.lo: zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inffast.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h | ||||
| inflate.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| infback.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| inftrees.lo: zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| minigzip.lo: zlib.h zconf.h zlibdefs.h | ||||
| trees.lo: deflate.h zutil.h zlib.h zconf.h zlibdefs.h trees.h | ||||
| uncompr.lo: zlib.h zconf.h zlibdefs.h | ||||
| zutil.lo: zutil.h zlib.h zconf.h zlibdefs.h | ||||
|   | ||||
							
								
								
									
										9
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								README
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| ZLIB DATA COMPRESSION LIBRARY | ||||
|  | ||||
| zlib 1.2.2.1 is a general purpose data compression library.  All the code is | ||||
| zlib 1.2.3.2 is a general purpose data compression library.  All the code is | ||||
| thread safe.  The data format used by the zlib library is described by RFCs | ||||
| (Request for Comments) 1950 to 1952 in the files | ||||
| http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) | ||||
| @@ -16,9 +16,8 @@ minigzip.c. | ||||
|  | ||||
| To compile all files and run the test program, follow the instructions given at | ||||
| the top of Makefile. In short "make test; make install" should work for most | ||||
| machines. For Unix: "./configure; make test; make install" For MSDOS, use one | ||||
| of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or | ||||
| descrip.mms. | ||||
| machines. For Unix: "./configure; make test; make install". For MSDOS, use one | ||||
| of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. | ||||
|  | ||||
| Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant | ||||
| <info@winimage.com> for the Windows DLL version. The zlib home page is | ||||
| @@ -34,7 +33,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 | ||||
| issue of  Dr. Dobb's Journal; a copy of the article is available in | ||||
| http://dogma.net/markn/articles/zlibtool/zlibtool.htm | ||||
|  | ||||
| The changes made in version 1.2.2.1 are documented in the file ChangeLog. | ||||
| The changes made in version 1.2.3.2 are documented in the file ChangeLog. | ||||
|  | ||||
| Unsupported third party contributions are provided in directory "contrib". | ||||
|  | ||||
|   | ||||
							
								
								
									
										115
									
								
								adler32.c
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								adler32.c
									
									
									
									
									
								
							| @@ -12,12 +12,13 @@ | ||||
| #define NMAX 5552 | ||||
| /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ | ||||
|  | ||||
| #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;} | ||||
| #define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;} | ||||
| #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1); | ||||
| #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2); | ||||
| #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4); | ||||
| #define DO16(buf)   DO8(buf,0); DO8(buf,8); | ||||
|  | ||||
| /* use NO_DIVIDE if your processor does not do division in hardware */ | ||||
| #ifdef NO_DIVIDE | ||||
| #  define MOD(a) \ | ||||
|     do { \ | ||||
| @@ -39,8 +40,17 @@ | ||||
|         if (a >= (BASE << 1)) a -= (BASE << 1); \ | ||||
|         if (a >= BASE) a -= BASE; \ | ||||
|     } while (0) | ||||
| #  define MOD4(a) \ | ||||
|     do { \ | ||||
|         if (a >= (BASE << 4)) a -= (BASE << 4); \ | ||||
|         if (a >= (BASE << 3)) a -= (BASE << 3); \ | ||||
|         if (a >= (BASE << 2)) a -= (BASE << 2); \ | ||||
|         if (a >= (BASE << 1)) a -= (BASE << 1); \ | ||||
|         if (a >= BASE) a -= BASE; \ | ||||
|     } while (0) | ||||
| #else | ||||
| #  define MOD(a) a %= BASE | ||||
| #  define MOD4(a) a %= BASE | ||||
| #endif | ||||
|  | ||||
| /* ========================================================================= */ | ||||
| @@ -49,48 +59,91 @@ uLong ZEXPORT adler32(adler, buf, len) | ||||
|     const Bytef *buf; | ||||
|     uInt len; | ||||
| { | ||||
|     unsigned long s1 = adler & 0xffff; | ||||
|     unsigned long s2 = (adler >> 16) & 0xffff; | ||||
|     int k; | ||||
|     unsigned long sum2; | ||||
|     unsigned n; | ||||
|  | ||||
|     if (buf == Z_NULL) return 1L; | ||||
|     /* split Adler-32 into component sums */ | ||||
|     sum2 = (adler >> 16) & 0xffff; | ||||
|     adler &= 0xffff; | ||||
|  | ||||
|     while (len > 0) { | ||||
|         k = len < NMAX ? (int)len : NMAX; | ||||
|         len -= k; | ||||
|         while (k >= 16) { | ||||
|     /* in case user likes doing a byte at a time, keep it fast */ | ||||
|     if (len == 1) { | ||||
|         adler += buf[0]; | ||||
|         if (adler >= BASE) | ||||
|             adler -= BASE; | ||||
|         sum2 += adler; | ||||
|         if (sum2 >= BASE) | ||||
|             sum2 -= BASE; | ||||
|         return adler | (sum2 << 16); | ||||
|     } | ||||
|  | ||||
|     /* initial Adler-32 value (deferred check for len == 1 speed) */ | ||||
|     if (buf == Z_NULL) | ||||
|         return 1L; | ||||
|  | ||||
|     /* in case short lengths are provided, keep it somewhat fast */ | ||||
|     if (len < 16) { | ||||
|         while (len--) { | ||||
|             adler += *buf++; | ||||
|             sum2 += adler; | ||||
|         } | ||||
|         if (adler >= BASE) | ||||
|             adler -= BASE; | ||||
|         MOD4(sum2);             /* only added so many BASE's */ | ||||
|         return adler | (sum2 << 16); | ||||
|     } | ||||
|  | ||||
|     /* do length NMAX blocks -- requires just one modulo operation */ | ||||
|     while (len >= NMAX) { | ||||
|         len -= NMAX; | ||||
|         n = NMAX / 16;          /* NMAX is divisible by 16 */ | ||||
|         do { | ||||
|             DO16(buf);          /* 16 sums unrolled */ | ||||
|             buf += 16; | ||||
|         } while (--n); | ||||
|         MOD(adler); | ||||
|         MOD(sum2); | ||||
|     } | ||||
|  | ||||
|     /* do remaining bytes (less than NMAX, still just one modulo) */ | ||||
|     if (len) {                  /* avoid modulos if none remaining */ | ||||
|         while (len >= 16) { | ||||
|             len -= 16; | ||||
|             DO16(buf); | ||||
|             buf += 16; | ||||
|             k -= 16; | ||||
|         } | ||||
|         if (k != 0) do { | ||||
|             s1 += *buf++; | ||||
|             s2 += s1; | ||||
|         } while (--k); | ||||
|         MOD(s1); | ||||
|         MOD(s2); | ||||
|         while (len--) { | ||||
|             adler += *buf++; | ||||
|             sum2 += adler; | ||||
|         } | ||||
|         MOD(adler); | ||||
|         MOD(sum2); | ||||
|     } | ||||
|     return (s2 << 16) | s1; | ||||
|  | ||||
|     /* return recombined sums */ | ||||
|     return adler | (sum2 << 16); | ||||
| } | ||||
|  | ||||
| /* ========================================================================= */ | ||||
| uLong ZEXPORT adler32_combine(adler1, adler2, len2) | ||||
|     uLong adler1; | ||||
|     uLong adler2; | ||||
|     uLong len2; | ||||
|     z_off_t len2; | ||||
| { | ||||
|     unsigned long s1; | ||||
|     unsigned long s2; | ||||
|     unsigned long sum1; | ||||
|     unsigned long sum2; | ||||
|     unsigned rem; | ||||
|  | ||||
|     len2 %= BASE; | ||||
|     s1 = adler1 & 0xffff; | ||||
|     s2 = len2 * s1; | ||||
|     MOD(s2); | ||||
|     s1 += (adler2 & 0xffff) + BASE - 1; | ||||
|     s2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - len2; | ||||
|     if (s1 > BASE) s1 -= BASE; | ||||
|     if (s1 > BASE) s1 -= BASE; | ||||
|     if (s2 > (BASE << 1)) s2 -= (BASE << 1); | ||||
|     if (s2 > BASE) s2 -= BASE; | ||||
|     return (s2 << 16) | s1; | ||||
|     /* the derivation of this formula is left as an exercise for the reader */ | ||||
|     rem = (unsigned)(len2 % BASE); | ||||
|     sum1 = adler1 & 0xffff; | ||||
|     sum2 = rem * sum1; | ||||
|     MOD(sum2); | ||||
|     sum1 += (adler2 & 0xffff) + BASE - 1; | ||||
|     sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; | ||||
|     if (sum1 > BASE) sum1 -= BASE; | ||||
|     if (sum1 > BASE) sum1 -= BASE; | ||||
|     if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); | ||||
|     if (sum2 > BASE) sum2 -= BASE; | ||||
|     return sum1 | (sum2 << 16); | ||||
| } | ||||
|   | ||||
| @@ -23,7 +23,7 @@ all: SCOPTIONS example minigzip | ||||
| check: test | ||||
| test: all | ||||
| 	example | ||||
| 	echo hello world | minigzip | minigzip -d  | ||||
| 	echo hello world | minigzip | minigzip -d | ||||
|  | ||||
| install: z.lib | ||||
| 	copy clone zlib.h zconf.h INCLUDE: | ||||
|   | ||||
| @@ -118,6 +118,6 @@ | ||||
|                                  &MODLIB/INFTREES    &MODLIB/TREES       + | ||||
|                                  &MODLIB/UNCOMPR     &MODLIB/ZUTIL)      + | ||||
|                           SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) + | ||||
|                           TEXT('ZLIB 1.2.2') TGTRLS(V4R4M0) | ||||
|                           TEXT('ZLIB 1.2.3') TGTRLS(V4R4M0) | ||||
|  | ||||
|              ENDPGM | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
|         ZLIB version 1.2.2 for AS400 installation instructions | ||||
|         ZLIB version 1.2.3 for AS400 installation instructions | ||||
|  | ||||
| I) From an AS400 *SAVF file: | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
|       *  ZLIB.INC - Interface to the general purpose compression library | ||||
|       * | ||||
|       *  ILE RPG400 version by Patrick Monnerat, DATASPHERE. | ||||
|       *  Version 1.2.2.1 | ||||
|       *  Version 1.2.3.2 | ||||
|       * | ||||
|       * | ||||
|       *  WARNING: | ||||
| @@ -20,8 +20,12 @@ | ||||
|       *                               Constants | ||||
|       ************************************************************************** | ||||
|       * | ||||
|      D ZLIB_VERSION    C                   '1.2.2.1'                            Header's version | ||||
|      D ZLIB_VERNUM     C                   X'1221' | ||||
|       *  Versioning information. | ||||
|       * | ||||
|      D ZLIB_VERSION    C                   '1.2.3.2' | ||||
|      D ZLIB_VERNUM     C                   X'1232' | ||||
|       * | ||||
|       *  Other equates. | ||||
|       * | ||||
|      D Z_NO_FLUSH      C                   0 | ||||
|      D Z_SYNC_FLUSH    C                   2 | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* compress.c -- compress a memory buffer | ||||
|  * Copyright (C) 1995-2003 Jean-loup Gailly. | ||||
|  * Copyright (C) 1995-2005 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -75,5 +75,6 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) | ||||
| uLong ZEXPORT compressBound (sourceLen) | ||||
|     uLong sourceLen; | ||||
| { | ||||
|     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; | ||||
|     return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + | ||||
|            (sourceLen >> 25) + 13; | ||||
| } | ||||
|   | ||||
							
								
								
									
										146
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										146
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -23,7 +23,8 @@ LDFLAGS="-L. ${LIBS}" | ||||
| VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` | ||||
| VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` | ||||
| VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` | ||||
| AR=${AR-"ar rc"} | ||||
| AR=${AR-"ar"} | ||||
| AR_RC="${AR} rc" | ||||
| RANLIB=${RANLIB-"ranlib"} | ||||
| prefix=${prefix-/usr/local} | ||||
| exec_prefix=${exec_prefix-'${prefix}'} | ||||
| @@ -32,6 +33,7 @@ includedir=${includedir-'${prefix}/include'} | ||||
| mandir=${mandir-'${prefix}/share/man'} | ||||
| shared_ext='.so' | ||||
| shared=0 | ||||
| zprefix=0 | ||||
| gcc=0 | ||||
| old_cc="$CC" | ||||
| old_cflags="$CFLAGS" | ||||
| @@ -39,20 +41,23 @@ old_cflags="$CFLAGS" | ||||
| while test $# -ge 1 | ||||
| do | ||||
| case "$1" in | ||||
|     -h* | --h*) | ||||
|     -h* | --help) | ||||
|       echo 'usage:' | ||||
|       echo '  configure [--shared] [--prefix=PREFIX]  [--exec_prefix=EXPREFIX]' | ||||
|       echo '     [--libdir=LIBDIR] [--includedir=INCLUDEDIR]' | ||||
|       echo '     [--libdir=LIBDIR] [--includedir=INCLUDEDIR] [--zprefix]' | ||||
|         exit 0;; | ||||
|     -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; | ||||
|     -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; | ||||
|     -p*=* | --prefix=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; | ||||
|     -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; | ||||
|     -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;; | ||||
|     -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;; | ||||
|     -p* | --p*) prefix="$2"; shift; shift;; | ||||
|     -e* | --e*) exec_prefix="$2"; shift; shift;; | ||||
|     -l* | --l*) libdir="$2"; shift; shift;; | ||||
|     -i* | --i*) includedir="$2"; shift; shift;; | ||||
|     -s* | --s*) shared=1; shift;; | ||||
|     -p* | --prefix) prefix="$2"; shift; shift;; | ||||
|     -e* | --eprefix) exec_prefix="$2"; shift; shift;; | ||||
|     -l* | --libdir) libdir="$2"; shift; shift;; | ||||
|     -i* | --includedir) includedir="$2"; shift; shift;; | ||||
|     -s* | --shared | --enable-shared) shared=1; shift;; | ||||
|     -z* | --zprefix) zprefix=1; shift;; | ||||
|     --sysconfdir=*) echo "ignored option: --sysconfdir"; shift;; | ||||
|     --localstatedir=*) echo "ignored option: --localstatedir"; shift;; | ||||
|     *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;; | ||||
|     esac | ||||
| done | ||||
| @@ -73,23 +78,30 @@ esac | ||||
|  | ||||
| if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then | ||||
|   CC="$cc" | ||||
|   SFLAGS=${CFLAGS-"-fPIC -O3"} | ||||
|   CFLAGS="$cflags" | ||||
|   SFLAGS="${CFLAGS-"-O3"} -fPIC" | ||||
|   CFLAGS="${CFLAGS-"-O3"}" | ||||
|   case `(uname -s || echo unknown) 2>/dev/null` in | ||||
|   Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; | ||||
|   Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"};; | ||||
|   CYGWIN* | Cygwin* | cygwin* | OS/2* ) | ||||
|              EXE='.exe';; | ||||
|   QNX*)  # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 | ||||
|          # (alain.bonnefoy@icbt.com) | ||||
|                  LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};; | ||||
|   HP-UX*)        LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} | ||||
|   HP-UX*) | ||||
|          LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} | ||||
|          case `(uname -m || echo unknown) 2>/dev/null` in | ||||
|          ia64) | ||||
|                  shared_ext='.so' | ||||
|                  SHAREDLIB='libz.so';; | ||||
|          *) | ||||
|                  shared_ext='.sl' | ||||
|                  SHAREDLIB='libz.sl';; | ||||
|          esac;; | ||||
|   Darwin*)   shared_ext='.dylib' | ||||
|              SHAREDLIB=libz$shared_ext | ||||
|              SHAREDLIBV=libz.$VER$shared_ext | ||||
|              SHAREDLIBM=libz.$VER1$shared_ext | ||||
|              LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBV -compatibility_version $VER2 -current_version $VER"};; | ||||
|              LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"};; | ||||
|   *)             LDSHARED=${LDSHARED-"$cc -shared"};; | ||||
|   esac | ||||
| else | ||||
| @@ -100,31 +112,46 @@ else | ||||
|              CFLAGS=${CFLAGS-"-O"} | ||||
| #            LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} | ||||
|              LDSHARED=${LDSHARED-"ld -b"} | ||||
|          case `(uname -m || echo unknown) 2>/dev/null` in | ||||
|          ia64) | ||||
|              shared_ext='.so' | ||||
|              SHAREDLIB='libz.so';; | ||||
|          *) | ||||
|              shared_ext='.sl' | ||||
|              SHAREDLIB='libz.sl';; | ||||
|          esac;; | ||||
|   IRIX*)     SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} | ||||
|              CFLAGS=${CFLAGS-"-ansi -O2"} | ||||
|              LDSHARED=${LDSHARED-"cc -shared"};; | ||||
|              LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"};; | ||||
|   OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} | ||||
|              CFLAGS=${CFLAGS-"-O -std1"} | ||||
|              LDSHARED=${LDSHARED-"cc -shared  -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};; | ||||
|   OSF1*)     SFLAGS=${CFLAGS-"-O -std1"} | ||||
|              CFLAGS=${CFLAGS-"-O -std1"} | ||||
|              LDSHARED=${LDSHARED-"cc -shared"};; | ||||
|              LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"};; | ||||
|   QNX*)      SFLAGS=${CFLAGS-"-4 -O"} | ||||
|              CFLAGS=${CFLAGS-"-4 -O"} | ||||
|              LDSHARED=${LDSHARED-"cc"} | ||||
|              RANLIB=${RANLIB-"true"} | ||||
|              AR="cc -A";; | ||||
|              AR_RC="cc -A";; | ||||
|   SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} | ||||
|              CFLAGS=${CFLAGS-"-O3"} | ||||
|              LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; | ||||
|   SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} | ||||
|              CFLAGS=${CFLAGS-"-fast -xcg89"} | ||||
|              LDSHARED=${LDSHARED-"cc -G"};; | ||||
|   SunOS\ 5*) LDSHARED=${LDSHARED-"cc -G"} | ||||
|          case `(uname -m || echo unknown) 2>/dev/null` in | ||||
|          i86*) | ||||
|              SFLAGS=${CFLAGS-"-xpentium -fast -KPIC -R."} | ||||
|              CFLAGS=${CFLAGS-"-xpentium -fast"};; | ||||
|          *) | ||||
|              SFLAGS=${CFLAGS-"-fast -xcg92 -KPIC -R."} | ||||
|              CFLAGS=${CFLAGS-"-fast -xcg92"};; | ||||
|          esac;; | ||||
|   SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} | ||||
|              CFLAGS=${CFLAGS-"-O2"} | ||||
|              LDSHARED=${LDSHARED-"ld"};; | ||||
|   SunStudio\ 9*) SFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} | ||||
|              CFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xtarget=ultra3 -xarch=v9b"} | ||||
|              LDSHARED=${LDSHARED-"cc -xarch=v9b"};; | ||||
|   UNIX_System_V\ 4.2.0) | ||||
|              SFLAGS=${CFLAGS-"-KPIC -O"} | ||||
|              CFLAGS=${CFLAGS-"-O"} | ||||
| @@ -157,13 +184,16 @@ if test $shared -eq 1; then | ||||
|   # 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="$SHAREDLIBV" | ||||
|     LIBS="$LIBS $SHAREDLIBV" | ||||
|     echo Building shared library $SHAREDLIBV with $CC. | ||||
|   elif test -z "$old_cc" -a -z "$old_cflags"; then | ||||
|     echo No shared library support. | ||||
|     shared=0; | ||||
|   else | ||||
|     echo Tested $CC -c $SFLAGS $test.c | ||||
|     $CC -c $SFLAGS $test.c | ||||
|     echo Tested $LDSHARED -o $test$shared_ext $test.o | ||||
|     $LDSHARED -o $test$shared_ext $test.o | ||||
|     echo 'No shared library support; try without defining CC and CFLAGS' | ||||
|     shared=0; | ||||
|   fi | ||||
| @@ -171,8 +201,29 @@ fi | ||||
| if test $shared -eq 0; then | ||||
|   LDSHARED="$CC" | ||||
|   echo Building static library $LIBS version $VER with $CC. | ||||
| fi | ||||
|  | ||||
| cat > zlibdefs.h << EOF | ||||
| /* zlibdefs.h -- compile-time definitions for the zlib compression library | ||||
|  * Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| EOF | ||||
|  | ||||
| cat > $test.c <<EOF | ||||
| #include <sys/types.h> | ||||
| off64_t dummy = 0; | ||||
| EOF | ||||
| if test "`($CC -c $CFLAGS -D_LARGEFILE64_SOURCE $test.c) 2>&1`" = ""; then | ||||
|   cat >> zlibdefs.h <<EOF | ||||
| #define z_off_t off64_t | ||||
| EOF | ||||
|   CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE" | ||||
|   SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE" | ||||
|   echo "Checking for off64_t... Yes." | ||||
| else | ||||
|   LDFLAGS="-L. ${SHAREDLIBV}" | ||||
|   echo "Checking for off64_t... No." | ||||
| fi | ||||
|  | ||||
| cat > $test.c <<EOF | ||||
| @@ -180,13 +231,27 @@ cat > $test.c <<EOF | ||||
| int main() { return 0; } | ||||
| EOF | ||||
| if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then | ||||
|   sed < zconf.in.h "/HAVE_UNISTD_H/s%0%1%" > zconf.h | ||||
|   cat >> zlibdefs.h <<EOF | ||||
| #include <sys/types.h>	/* for off_t */ | ||||
| #include <unistd.h>	/* for SEEK_* and off_t */ | ||||
| #ifdef VMS | ||||
| #  include <unixio.h>	/* for off_t */ | ||||
| #endif | ||||
| #ifndef z_off_t | ||||
| #  define z_off_t off_t | ||||
| #endif | ||||
| EOF | ||||
|   echo "Checking for unistd.h... Yes." | ||||
| else | ||||
|   cp -p zconf.in.h zconf.h | ||||
|   echo "Checking for unistd.h... No." | ||||
| fi | ||||
|  | ||||
| if test $zprefix -eq 1; then | ||||
|   sed < zconf.h "/#ifdef Z_PREFIX/s/def Z_PREFIX/ 1/" > zconf.temp.h | ||||
|   mv zconf.temp.h zconf.h | ||||
|   echo "Using z_ prefix on all symbols." | ||||
| fi | ||||
|  | ||||
| cat > $test.c <<EOF | ||||
| #include <stdio.h> | ||||
| #include <stdarg.h> | ||||
| @@ -203,7 +268,7 @@ int main() | ||||
| EOF | ||||
|  | ||||
| if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then | ||||
|   echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()" | ||||
|   echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | ||||
|  | ||||
|   cat > $test.c <<EOF | ||||
| #include <stdio.h> | ||||
| @@ -300,7 +365,7 @@ EOF | ||||
|     fi | ||||
|   fi | ||||
| else | ||||
|   echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()" | ||||
|   echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | ||||
|  | ||||
|   cat >$test.c <<EOF | ||||
| #include <stdio.h> | ||||
| @@ -425,13 +490,14 @@ rm -f $test.[co] $test $test$shared_ext | ||||
| sed < Makefile.in " | ||||
| /^CC *=/s#=.*#=$CC# | ||||
| /^CFLAGS *=/s#=.*#=$CFLAGS# | ||||
| /^SFLAGS *=/s#=.*#=$SFLAGS# | ||||
| /^CPP *=/s#=.*#=$CPP# | ||||
| /^LDSHARED *=/s#=.*#=$LDSHARED# | ||||
| /^LIBS *=/s#=.*#=$LIBS# | ||||
| /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# | ||||
| /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# | ||||
| /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# | ||||
| /^AR *=/s#=.*#=$AR# | ||||
| /^AR *=/s#=.*#=$AR_RC# | ||||
| /^RANLIB *=/s#=.*#=$RANLIB# | ||||
| /^EXE *=/s#=.*#=$EXE# | ||||
| /^prefix *=/s#=.*#=$prefix# | ||||
| @@ -441,3 +507,25 @@ sed < Makefile.in " | ||||
| /^mandir *=/s#=.*#=$mandir# | ||||
| /^LDFLAGS *=/s#=.*#=$LDFLAGS# | ||||
| " > Makefile | ||||
|  | ||||
| sed < zlib.pc.in " | ||||
| /^CC *=/s#=.*#=$CC# | ||||
| /^CFLAGS *=/s#=.*#=$CFLAGS# | ||||
| /^CPP *=/s#=.*#=$CPP# | ||||
| /^LDSHARED *=/s#=.*#=$LDSHARED# | ||||
| /^LIBS *=/s#=.*#=$LIBS# | ||||
| /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# | ||||
| /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# | ||||
| /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# | ||||
| /^AR *=/s#=.*#=$AR_RC# | ||||
| /^RANLIB *=/s#=.*#=$RANLIB# | ||||
| /^EXE *=/s#=.*#=$EXE# | ||||
| /^prefix *=/s#=.*#=$prefix# | ||||
| /^exec_prefix *=/s#=.*#=$exec_prefix# | ||||
| /^libdir *=/s#=.*#=$libdir# | ||||
| /^includedir *=/s#=.*#=$includedir# | ||||
| /^mandir *=/s#=.*#=$mandir# | ||||
| /^LDFLAGS *=/s#=.*#=$LDFLAGS# | ||||
| " | sed -e " | ||||
| s/\@VERSION\@/$VER/g; | ||||
| " > zlib.pc | ||||
|   | ||||
| @@ -22,9 +22,6 @@ delphi/     by Cosmin Truta <cosmint@cs.ubbcluj.ro> | ||||
| dotzlib/    by Henrik Ravn <henrik@ravn.com> | ||||
|         Support for Microsoft .Net and Visual C++ .Net | ||||
|  | ||||
| gzappend/   by Mark Adler <madler@alumni.caltech.edu> | ||||
|         append to a gzip file -- illustrates the use of Z_BLOCK | ||||
|  | ||||
| infback9/   by Mark Adler <madler@alumni.caltech.edu> | ||||
|         Unsupported diffs to infback to decode the deflate64 format | ||||
|  | ||||
| @@ -45,6 +42,10 @@ masm686/    by Dan Higdon <hdan@kinesoft.com> | ||||
|             and Chuck Walbourn <chuckw@kinesoft.com> | ||||
|         asm code for Pentium Pro/PII, using the MASM syntax | ||||
|  | ||||
| masmx64/    by Gilles Vollant <info@winimage.com> | ||||
| 	x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to | ||||
| 	replace longest_match() and inflate_fast() | ||||
|  | ||||
| masmx86/    by Gilles Vollant <info@winimage.com> | ||||
|         x86 asm code to replace longest_match() and inflate_fast(), | ||||
|         for Visual C++ and MASM | ||||
|   | ||||
| @@ -45,19 +45,29 @@ | ||||
|  * program to crash horribly, without so much as a warning at | ||||
|  * compile time. Sigh.) | ||||
|  */ | ||||
| #define	dsWSize			36 | ||||
| #define	dsWMask			44 | ||||
| #define	dsWindow		48 | ||||
| #define	dsPrev			56 | ||||
| #define	dsMatchLen		88 | ||||
| #define	dsPrevMatch		92 | ||||
| #define	dsStrStart		100 | ||||
| #define	dsMatchStart		104 | ||||
| #define	dsLookahead		108 | ||||
| #define	dsPrevLen		112 | ||||
| #define	dsMaxChainLen		116 | ||||
| #define	dsGoodMatch		132 | ||||
| #define	dsNiceMatch		136 | ||||
|  | ||||
| /* All the +zlib1222add offsets are due to the addition of fields | ||||
|  *  in zlib in the deflate_state structure since the asm code was first written | ||||
|  * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). | ||||
|  * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). | ||||
|  * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). | ||||
|  */ | ||||
|  | ||||
| #define zlib1222add		(8) | ||||
|  | ||||
| #define	dsWSize			(36+zlib1222add) | ||||
| #define	dsWMask			(44+zlib1222add) | ||||
| #define	dsWindow		(48+zlib1222add) | ||||
| #define	dsPrev			(56+zlib1222add) | ||||
| #define	dsMatchLen		(88+zlib1222add) | ||||
| #define	dsPrevMatch		(92+zlib1222add) | ||||
| #define	dsStrStart		(100+zlib1222add) | ||||
| #define	dsMatchStart		(104+zlib1222add) | ||||
| #define	dsLookahead		(108+zlib1222add) | ||||
| #define	dsPrevLen		(112+zlib1222add) | ||||
| #define	dsMaxChainLen		(116+zlib1222add) | ||||
| #define	dsGoodMatch		(132+zlib1222add) | ||||
| #define	dsNiceMatch		(136+zlib1222add) | ||||
|  | ||||
|  | ||||
| .file "match.S" | ||||
|   | ||||
| @@ -38,26 +38,28 @@ | ||||
| #define	deflatestate		56	/* the function arguments	*/ | ||||
| #define	curmatch		60 | ||||
|  | ||||
| /* Offsets for fields in the deflate_state structure. These numbers | ||||
|  * are calculated from the definition of deflate_state, with the | ||||
|  * assumption that the compiler will dword-align the fields. (Thus, | ||||
|  * changing the definition of deflate_state could easily cause this | ||||
|  * program to crash horribly, without so much as a warning at | ||||
|  * compile time. Sigh.) | ||||
| /* All the +zlib1222add offsets are due to the addition of fields | ||||
|  *  in zlib in the deflate_state structure since the asm code was first written | ||||
|  * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). | ||||
|  * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). | ||||
|  * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). | ||||
|  */ | ||||
| #define	dsWSize			36 | ||||
| #define	dsWMask			44 | ||||
| #define	dsWindow		48 | ||||
| #define	dsPrev			56 | ||||
| #define	dsMatchLen		88 | ||||
| #define	dsPrevMatch		92 | ||||
| #define	dsStrStart		100 | ||||
| #define	dsMatchStart		104 | ||||
| #define	dsLookahead		108 | ||||
| #define	dsPrevLen		112 | ||||
| #define	dsMaxChainLen		116 | ||||
| #define	dsGoodMatch		132 | ||||
| #define	dsNiceMatch		136 | ||||
|  | ||||
| #define zlib1222add		(8) | ||||
|  | ||||
| #define	dsWSize			(36+zlib1222add) | ||||
| #define	dsWMask			(44+zlib1222add) | ||||
| #define	dsWindow		(48+zlib1222add) | ||||
| #define	dsPrev			(56+zlib1222add) | ||||
| #define	dsMatchLen		(88+zlib1222add) | ||||
| #define	dsPrevMatch		(92+zlib1222add) | ||||
| #define	dsStrStart		(100+zlib1222add) | ||||
| #define	dsMatchStart		(104+zlib1222add) | ||||
| #define	dsLookahead		(108+zlib1222add) | ||||
| #define	dsPrevLen		(112+zlib1222add) | ||||
| #define	dsMaxChainLen		(116+zlib1222add) | ||||
| #define	dsGoodMatch		(132+zlib1222add) | ||||
| #define	dsNiceMatch		(136+zlib1222add) | ||||
|  | ||||
|  | ||||
| .file "match.S" | ||||
|   | ||||
| @@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; | ||||
|   const OutBuf: Pointer; BufSize: Integer); | ||||
|  | ||||
| const | ||||
|   zlib_version = '1.2.2'; | ||||
|   zlib_version = '1.2.3'; | ||||
|  | ||||
| type | ||||
|   EZlibError = class(Exception); | ||||
| @@ -344,7 +344,7 @@ begin | ||||
|     strm.avail_out := OutBytes; | ||||
|     DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); | ||||
|     try | ||||
|       while DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END do | ||||
|       while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do | ||||
|       begin | ||||
|         P := OutBuf; | ||||
|         Inc(OutBytes, BufInc); | ||||
|   | ||||
| @@ -156,7 +156,7 @@ namespace DotZLibTests | ||||
|         public void Info_Version() | ||||
|         { | ||||
|             Info info = new Info(); | ||||
|             Assert.AreEqual("1.2.2", Info.Version); | ||||
|             Assert.AreEqual("1.2.3", Info.Version); | ||||
|             Assert.AreEqual(32, info.SizeOfUInt); | ||||
|             Assert.AreEqual(32, info.SizeOfULong); | ||||
|             Assert.AreEqual(32, info.SizeOfPointer); | ||||
|   | ||||
| @@ -16,6 +16,10 @@ | ||||
|  * zlib.h must be included before this header file. | ||||
|  */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, | ||||
|                                     in_func in, void FAR *in_desc, | ||||
|                                     out_func out, void FAR *out_desc)); | ||||
| @@ -27,3 +31,7 @@ ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, | ||||
| #define inflateBack9Init(strm, window) \ | ||||
|         inflateBack9Init_((strm), (window), \ | ||||
|         ZLIB_VERSION, sizeof(z_stream)) | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* inftree9.c -- generate Huffman trees for efficient decoding | ||||
|  * Copyright (C) 1995-2003 Mark Adler | ||||
|  * Copyright (C) 1995-2006 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -9,7 +9,7 @@ | ||||
| #define MAXBITS 15 | ||||
|  | ||||
| const char inflate9_copyright[] = | ||||
|    " inflate9 1.2.2.1 Copyright 1995-2004 Mark Adler "; | ||||
|    " inflate9 1.2.3.2 Copyright 1995-2006 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 | ||||
| @@ -64,7 +64,7 @@ unsigned short FAR *work; | ||||
|     static const unsigned short lext[31] = { /* Length codes 257..285 extra */ | ||||
|         128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, | ||||
|         130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, | ||||
|         133, 133, 133, 133, 144, 77, 207}; | ||||
|         133, 133, 133, 133, 144, 192, 204}; | ||||
|     static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ | ||||
|         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, | ||||
|         65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, | ||||
| @@ -128,7 +128,7 @@ unsigned short FAR *work; | ||||
|         left -= count[len]; | ||||
|         if (left < 0) return -1;        /* over-subscribed */ | ||||
|     } | ||||
|     if (left > 0 && (type == CODES || (codes - count[0] != 1))) | ||||
|     if (left > 0 && (type == CODES || max != 1)) | ||||
|         return -1;                      /* incomplete set */ | ||||
|  | ||||
|     /* generate offsets into symbol table for each length for sorting */ | ||||
|   | ||||
| @@ -36,12 +36,12 @@ typedef struct { | ||||
|  */ | ||||
|  | ||||
| /* Maximum size of dynamic tree.  The maximum found in a long but non- | ||||
|    exhaustive search was 1004 code structures (850 for length/literals | ||||
|    and 154 for distances, the latter actually the result of an | ||||
|    exhaustive search was 1444 code structures (852 for length/literals | ||||
|    and 592 for distances, the latter actually the result of an | ||||
|    exhaustive search).  The true maximum is not known, but the value | ||||
|    below is more than safe. */ | ||||
| #define ENOUGH 1440 | ||||
| #define MAXD 154 | ||||
| #define ENOUGH 2048 | ||||
| #define MAXD 592 | ||||
|  | ||||
| /* Type of code to build for inftable() */ | ||||
| typedef enum { | ||||
|   | ||||
| @@ -1,408 +1,413 @@ | ||||
|  | ||||
| ; match.asm -- Pentium-Pro optimized version of longest_match() | ||||
| ; | ||||
| ; Updated for zlib 1.1.3 and converted to MASM 6.1x | ||||
| ; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com> | ||||
| ;                    and Chuck Walbourn <chuckw@kinesoft.com> | ||||
| ; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro> | ||||
| ; | ||||
| ; This is free software; you can redistribute it and/or modify it | ||||
| ; under the terms of the GNU General Public License. | ||||
|  | ||||
| ; Based on match.S | ||||
| ; Written for zlib 1.1.2 | ||||
| ; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com> | ||||
|  | ||||
| 	.686P | ||||
| 	.MODEL	FLAT | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; EQUATES | ||||
| ;=========================================================================== | ||||
|  | ||||
| MAX_MATCH	EQU 258 | ||||
| MIN_MATCH	EQU 3 | ||||
| MIN_LOOKAHEAD	EQU (MAX_MATCH + MIN_MATCH + 1) | ||||
| MAX_MATCH_8	EQU ((MAX_MATCH + 7) AND (NOT 7)) | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; STRUCTURES | ||||
| ;=========================================================================== | ||||
|  | ||||
| ; This STRUCT assumes a 4-byte alignment | ||||
|  | ||||
| DEFLATE_STATE	STRUCT | ||||
| ds_strm			dd ? | ||||
| ds_status		dd ? | ||||
| ds_pending_buf		dd ? | ||||
| ds_pending_buf_size	dd ? | ||||
| ds_pending_out		dd ? | ||||
| ds_pending		dd ? | ||||
| ds_wrap			dd ? | ||||
| ds_data_type		db ? | ||||
| ds_method		db ? | ||||
| 			db ?	; padding | ||||
| 			db ?	; padding | ||||
| ds_last_flush		dd ? | ||||
| ds_w_size		dd ?	; used | ||||
| ds_w_bits		dd ? | ||||
| ds_w_mask		dd ?	; used | ||||
| ds_window		dd ?	; used | ||||
| ds_window_size		dd ? | ||||
| ds_prev			dd ?	; used | ||||
| ds_head			dd ? | ||||
| ds_ins_h		dd ? | ||||
| ds_hash_size		dd ? | ||||
| ds_hash_bits		dd ? | ||||
| ds_hash_mask		dd ? | ||||
| ds_hash_shift		dd ? | ||||
| ds_block_start		dd ? | ||||
| ds_match_length		dd ?	; used | ||||
| ds_prev_match		dd ?	; used | ||||
| ds_match_available	dd ? | ||||
| ds_strstart		dd ?	; used | ||||
| ds_match_start		dd ?	; used | ||||
| ds_lookahead		dd ?	; used | ||||
| ds_prev_length		dd ?	; used | ||||
| ds_max_chain_length	dd ?	; used | ||||
| ds_max_laxy_match	dd ? | ||||
| ds_level		dd ? | ||||
| ds_strategy		dd ? | ||||
| ds_good_match		dd ?	; used | ||||
| ds_nice_match		dd ?	; used | ||||
|  | ||||
| ; Don't need anymore of the struct for match | ||||
| DEFLATE_STATE	ENDS | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; CODE | ||||
| ;=========================================================================== | ||||
| _TEXT	SEGMENT | ||||
|  | ||||
| ;--------------------------------------------------------------------------- | ||||
| ; match_init | ||||
| ;--------------------------------------------------------------------------- | ||||
| 	ALIGN	4 | ||||
| PUBLIC	_match_init | ||||
| _match_init	PROC | ||||
| 	; no initialization needed | ||||
| 	ret | ||||
| _match_init	ENDP | ||||
|  | ||||
| ;--------------------------------------------------------------------------- | ||||
| ; uInt longest_match(deflate_state *deflatestate, IPos curmatch) | ||||
| ;--------------------------------------------------------------------------- | ||||
| 	ALIGN	4 | ||||
|  | ||||
| PUBLIC	_longest_match | ||||
| _longest_match	PROC | ||||
|  | ||||
| ; Since this code uses EBP for a scratch register, the stack frame must | ||||
| ; be manually constructed and referenced relative to the ESP register. | ||||
|  | ||||
| ; Stack image | ||||
| ; Variables | ||||
| chainlenwmask	=  0	; high word: current chain len | ||||
| 			; low word: s->wmask | ||||
| window		=  4	; local copy of s->window | ||||
| windowbestlen	=  8	; s->window + bestlen | ||||
| scanend		= 12	; last two bytes of string | ||||
| scanstart	= 16	; first two bytes of string | ||||
| scanalign	= 20	; dword-misalignment of string | ||||
| nicematch	= 24	; a good enough match size | ||||
| bestlen		= 28	; size of best match so far | ||||
| scan		= 32	; ptr to string wanting match | ||||
| varsize		= 36	; number of bytes (also offset to last saved register) | ||||
|  | ||||
| ; Saved Registers (actually pushed into place) | ||||
| ebx_save	= 36 | ||||
| edi_save	= 40 | ||||
| esi_save	= 44 | ||||
| ebp_save	= 48 | ||||
|  | ||||
| ; Parameters | ||||
| retaddr		= 52 | ||||
| deflatestate	= 56 | ||||
| curmatch	= 60 | ||||
|  | ||||
| ; Save registers that the compiler may be using | ||||
| 	push	ebp | ||||
| 	push	edi | ||||
| 	push	esi | ||||
| 	push	ebx | ||||
|  | ||||
| ; Allocate local variable space | ||||
| 	sub	esp,varsize | ||||
|  | ||||
| ; Retrieve the function arguments. ecx will hold cur_match | ||||
| ; throughout the entire function. edx will hold the pointer to the | ||||
| ; deflate_state structure during the function's setup (before | ||||
| ; entering the main loop). | ||||
|  | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| ASSUME	edx:PTR DEFLATE_STATE | ||||
|  | ||||
| 	mov	ecx, [esp+curmatch] | ||||
|  | ||||
| ; uInt wmask = s->w_mask; | ||||
| ; unsigned chain_length = s->max_chain_length; | ||||
| ; if (s->prev_length >= s->good_match) { | ||||
| ;     chain_length >>= 2; | ||||
| ; } | ||||
|  | ||||
| 	mov	eax, [edx].ds_prev_length | ||||
| 	mov	ebx, [edx].ds_good_match | ||||
| 	cmp	eax, ebx | ||||
| 	mov	eax, [edx].ds_w_mask | ||||
| 	mov	ebx, [edx].ds_max_chain_length | ||||
| 	jl	SHORT LastMatchGood | ||||
| 	shr	ebx, 2 | ||||
| LastMatchGood: | ||||
|  | ||||
| ; chainlen is decremented once beforehand so that the function can | ||||
| ; use the sign flag instead of the zero flag for the exit test. | ||||
| ; It is then shifted into the high word, to make room for the wmask | ||||
| ; value, which it will always accompany. | ||||
|  | ||||
| 	dec	ebx | ||||
| 	shl	ebx, 16 | ||||
| 	or	ebx, eax | ||||
| 	mov	[esp+chainlenwmask], ebx | ||||
|  | ||||
| ; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||||
|  | ||||
| 	mov	eax, [edx].ds_nice_match | ||||
| 	mov	ebx, [edx].ds_lookahead | ||||
| 	cmp	ebx, eax | ||||
| 	jl	SHORT LookaheadLess | ||||
| 	mov	ebx, eax | ||||
| LookaheadLess: | ||||
| 	mov	[esp+nicematch], ebx | ||||
|  | ||||
| ;/* register Bytef *scan = s->window + s->strstart;                     */ | ||||
|  | ||||
| 	mov	esi, [edx].ds_window | ||||
| 	mov	[esp+window], esi | ||||
| 	mov	ebp, [edx].ds_strstart | ||||
| 	lea	edi, [esi+ebp] | ||||
| 	mov	[esp+scan],edi | ||||
|  | ||||
| ;/* Determine how many bytes the scan ptr is off from being             */ | ||||
| ;/* dword-aligned.                                                      */ | ||||
|  | ||||
| 	mov	eax, edi | ||||
| 	neg	eax | ||||
| 	and	eax, 3 | ||||
| 	mov	[esp+scanalign], eax | ||||
|  | ||||
| ;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?                      */ | ||||
| ;/*     s->strstart - (IPos)MAX_DIST(s) : NIL;                          */ | ||||
|  | ||||
| 	mov	eax, [edx].ds_w_size | ||||
| 	sub	eax, MIN_LOOKAHEAD | ||||
| 	sub	ebp, eax | ||||
| 	jg	SHORT LimitPositive | ||||
| 	xor	ebp, ebp | ||||
| LimitPositive: | ||||
|  | ||||
| ;/* int best_len = s->prev_length;                                      */ | ||||
|  | ||||
| 	mov	eax, [edx].ds_prev_length | ||||
| 	mov	[esp+bestlen], eax | ||||
|  | ||||
| ;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ | ||||
|  | ||||
| 	add	esi, eax | ||||
| 	mov	[esp+windowbestlen], esi | ||||
|  | ||||
| ;/* register ush scan_start = *(ushf*)scan;                             */ | ||||
| ;/* register ush scan_end   = *(ushf*)(scan+best_len-1);                */ | ||||
| ;/* Posf *prev = s->prev;                                               */ | ||||
|  | ||||
| 	movzx	ebx, WORD PTR[edi] | ||||
| 	mov	[esp+scanstart], ebx | ||||
| 	movzx	ebx, WORD PTR[eax+edi-1] | ||||
| 	mov	[esp+scanend], ebx | ||||
| 	mov	edi, [edx].ds_prev | ||||
|  | ||||
| ;/* Jump into the main loop.                                            */ | ||||
|  | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	SHORT LoopEntry | ||||
|  | ||||
| ;/* do { | ||||
| ; *     match = s->window + cur_match; | ||||
| ; *     if (*(ushf*)(match+best_len-1) != scan_end || | ||||
| ; *         *(ushf*)match != scan_start) continue; | ||||
| ; *     [...] | ||||
| ; * } while ((cur_match = prev[cur_match & wmask]) > limit | ||||
| ; *          && --chain_length != 0); | ||||
| ; * | ||||
| ; * Here is the inner loop of the function. The function will spend the | ||||
| ; * majority of its time in this loop, and majority of that time will | ||||
| ; * be spent in the first ten instructions. | ||||
| ; * | ||||
| ; * Within this loop: | ||||
| ; * %ebx = scanend | ||||
| ; * %ecx = curmatch | ||||
| ; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) | ||||
| ; * %esi = windowbestlen - i.e., (window + bestlen) | ||||
| ; * %edi = prev | ||||
| ; * %ebp = limit | ||||
| ; */ | ||||
|  | ||||
| 	ALIGN	4 | ||||
| LookupLoop: | ||||
| 	and	ecx, edx | ||||
| 	movzx	ecx, WORD PTR[edi+ecx*2] | ||||
| 	cmp	ecx, ebp | ||||
| 	jbe	LeaveNow | ||||
| 	sub	edx, 000010000H | ||||
| 	js	LeaveNow | ||||
|  | ||||
| LoopEntry: | ||||
| 	movzx	eax, WORD PTR[esi+ecx-1] | ||||
| 	cmp	eax, ebx | ||||
| 	jnz	SHORT LookupLoop | ||||
|  | ||||
| 	mov	eax, [esp+window] | ||||
| 	movzx	eax, WORD PTR[eax+ecx] | ||||
| 	cmp	eax, [esp+scanstart] | ||||
| 	jnz	SHORT LookupLoop | ||||
|  | ||||
| ;/* Store the current value of chainlen.                                */ | ||||
|  | ||||
| 	mov	[esp+chainlenwmask], edx | ||||
|  | ||||
| ;/* Point %edi to the string under scrutiny, and %esi to the string we  */ | ||||
| ;/* are hoping to match it up with. In actuality, %esi and %edi are     */ | ||||
| ;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is     */ | ||||
| ;/* initialized to -(MAX_MATCH_8 - scanalign).                          */ | ||||
|  | ||||
| 	mov	esi, [esp+window] | ||||
| 	mov	edi, [esp+scan] | ||||
| 	add	esi, ecx | ||||
| 	mov	eax, [esp+scanalign] | ||||
| 	mov	edx, -MAX_MATCH_8 | ||||
| 	lea	edi, [edi+eax+MAX_MATCH_8] | ||||
| 	lea	esi, [esi+eax+MAX_MATCH_8] | ||||
|  | ||||
| ;/* Test the strings for equality, 8 bytes at a time. At the end, | ||||
| ; * adjust %edx so that it is offset to the exact byte that mismatched. | ||||
| ; * | ||||
| ; * We already know at this point that the first three bytes of the | ||||
| ; * strings match each other, and they can be safely passed over before | ||||
| ; * starting the compare loop. So what this code does is skip over 0-3 | ||||
| ; * bytes, as much as necessary in order to dword-align the %edi | ||||
| ; * pointer. (%esi will still be misaligned three times out of four.) | ||||
| ; * | ||||
| ; * It should be confessed that this loop usually does not represent | ||||
| ; * much of the total running time. Replacing it with a more | ||||
| ; * straightforward "rep cmpsb" would not drastically degrade | ||||
| ; * performance. | ||||
| ; */ | ||||
|  | ||||
| LoopCmps: | ||||
| 	mov	eax, DWORD PTR[esi+edx] | ||||
| 	xor	eax, DWORD PTR[edi+edx] | ||||
| 	jnz	SHORT LeaveLoopCmps | ||||
|  | ||||
| 	mov	eax, DWORD PTR[esi+edx+4] | ||||
| 	xor	eax, DWORD PTR[edi+edx+4] | ||||
| 	jnz	SHORT LeaveLoopCmps4 | ||||
|  | ||||
| 	add	edx, 8 | ||||
| 	jnz	SHORT LoopCmps | ||||
| 	jmp	LenMaximum | ||||
| 	ALIGN	4 | ||||
|  | ||||
| LeaveLoopCmps4: | ||||
| 	add	edx, 4 | ||||
|  | ||||
| LeaveLoopCmps: | ||||
| 	test	eax, 00000FFFFH | ||||
| 	jnz	SHORT LenLower | ||||
|  | ||||
| 	add	edx, 2 | ||||
| 	shr	eax, 16 | ||||
|  | ||||
| LenLower: | ||||
| 	sub	al, 1 | ||||
| 	adc	edx, 0 | ||||
|  | ||||
| ;/* Calculate the length of the match. If it is longer than MAX_MATCH,  */ | ||||
| ;/* then automatically accept it as the best possible match and leave.  */ | ||||
|  | ||||
| 	lea	eax, [edi+edx] | ||||
| 	mov	edi, [esp+scan] | ||||
| 	sub	eax, edi | ||||
| 	cmp	eax, MAX_MATCH | ||||
| 	jge	SHORT LenMaximum | ||||
|  | ||||
| ;/* If the length of the match is not longer than the best match we     */ | ||||
| ;/* have so far, then forget it and return to the lookup loop.          */ | ||||
|  | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	ebx, [esp+bestlen] | ||||
| 	cmp	eax, ebx | ||||
| 	jg	SHORT LongerMatch | ||||
| 	mov	esi, [esp+windowbestlen] | ||||
| 	mov	edi, [edx].ds_prev | ||||
| 	mov	ebx, [esp+scanend] | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	LookupLoop | ||||
| 	ALIGN	4 | ||||
|  | ||||
| ;/*         s->match_start = cur_match;                                 */ | ||||
| ;/*         best_len = len;                                             */ | ||||
| ;/*         if (len >= nice_match) break;                               */ | ||||
| ;/*         scan_end = *(ushf*)(scan+best_len-1);                       */ | ||||
|  | ||||
| LongerMatch: | ||||
| 	mov	ebx, [esp+nicematch] | ||||
| 	mov	[esp+bestlen], eax | ||||
| 	mov	[edx].ds_match_start, ecx | ||||
| 	cmp	eax, ebx | ||||
| 	jge	SHORT LeaveNow | ||||
| 	mov	esi, [esp+window] | ||||
| 	add	esi, eax | ||||
| 	mov	[esp+windowbestlen], esi | ||||
| 	movzx	ebx, WORD PTR[edi+eax-1] | ||||
| 	mov	edi, [edx].ds_prev | ||||
| 	mov	[esp+scanend], ebx | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	LookupLoop | ||||
| 	ALIGN	4 | ||||
|  | ||||
| ;/* Accept the current string, with the maximum possible length.        */ | ||||
|  | ||||
| LenMaximum: | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	DWORD PTR[esp+bestlen], MAX_MATCH | ||||
| 	mov	[edx].ds_match_start, ecx | ||||
|  | ||||
| ;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;          */ | ||||
| ;/* return s->lookahead;                                                */ | ||||
|  | ||||
| LeaveNow: | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	ebx, [esp+bestlen] | ||||
| 	mov	eax, [edx].ds_lookahead | ||||
| 	cmp	ebx, eax | ||||
| 	jg	SHORT LookaheadRet | ||||
| 	mov	eax, ebx | ||||
| LookaheadRet: | ||||
|  | ||||
| ; Restore the stack and return from whence we came. | ||||
|  | ||||
| 	add	esp, varsize | ||||
| 	pop	ebx | ||||
| 	pop	esi | ||||
| 	pop	edi | ||||
| 	pop	ebp | ||||
| 	ret | ||||
|  | ||||
| _longest_match	ENDP | ||||
|  | ||||
| _TEXT	ENDS | ||||
| END | ||||
|  | ||||
| ; match.asm -- Pentium-Pro optimized version of longest_match() | ||||
| ; | ||||
| ; Updated for zlib 1.1.3 and converted to MASM 6.1x | ||||
| ; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com> | ||||
| ;                    and Chuck Walbourn <chuckw@kinesoft.com> | ||||
| ; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro> | ||||
| ; | ||||
| ; This is free software; you can redistribute it and/or modify it | ||||
| ; under the terms of the GNU General Public License. | ||||
|  | ||||
| ; Based on match.S | ||||
| ; Written for zlib 1.1.2 | ||||
| ; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com> | ||||
| ; | ||||
| ; Modified by Gilles Vollant (2005) for add gzhead and gzindex | ||||
|  | ||||
| 	.686P | ||||
| 	.MODEL	FLAT | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; EQUATES | ||||
| ;=========================================================================== | ||||
|  | ||||
| MAX_MATCH	EQU 258 | ||||
| MIN_MATCH	EQU 3 | ||||
| MIN_LOOKAHEAD	EQU (MAX_MATCH + MIN_MATCH + 1) | ||||
| MAX_MATCH_8	EQU ((MAX_MATCH + 7) AND (NOT 7)) | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; STRUCTURES | ||||
| ;=========================================================================== | ||||
|  | ||||
| ; This STRUCT assumes a 4-byte alignment | ||||
|  | ||||
| DEFLATE_STATE	STRUCT | ||||
| ds_strm			dd ? | ||||
| ds_status		dd ? | ||||
| ds_pending_buf		dd ? | ||||
| ds_pending_buf_size	dd ? | ||||
| ds_pending_out		dd ? | ||||
| ds_pending		dd ? | ||||
| ds_wrap			dd ? | ||||
| ; gzhead and gzindex are added in zlib 1.2.2.2 (see deflate.h) | ||||
| ds_gzhead               dd ? | ||||
| ds_gzindex              dd ? | ||||
| ds_data_type		db ? | ||||
| ds_method		db ? | ||||
| 			db ?	; padding | ||||
| 			db ?	; padding | ||||
| ds_last_flush		dd ? | ||||
| ds_w_size		dd ?	; used | ||||
| ds_w_bits		dd ? | ||||
| ds_w_mask		dd ?	; used | ||||
| ds_window		dd ?	; used | ||||
| ds_window_size		dd ? | ||||
| ds_prev			dd ?	; used | ||||
| ds_head			dd ? | ||||
| ds_ins_h		dd ? | ||||
| ds_hash_size		dd ? | ||||
| ds_hash_bits		dd ? | ||||
| ds_hash_mask		dd ? | ||||
| ds_hash_shift		dd ? | ||||
| ds_block_start		dd ? | ||||
| ds_match_length		dd ?	; used | ||||
| ds_prev_match		dd ?	; used | ||||
| ds_match_available	dd ? | ||||
| ds_strstart		dd ?	; used | ||||
| ds_match_start		dd ?	; used | ||||
| ds_lookahead		dd ?	; used | ||||
| ds_prev_length		dd ?	; used | ||||
| ds_max_chain_length	dd ?	; used | ||||
| ds_max_laxy_match	dd ? | ||||
| ds_level		dd ? | ||||
| ds_strategy		dd ? | ||||
| ds_good_match		dd ?	; used | ||||
| ds_nice_match		dd ?	; used | ||||
|  | ||||
| ; Don't need anymore of the struct for match | ||||
| DEFLATE_STATE	ENDS | ||||
|  | ||||
| ;=========================================================================== | ||||
| ; CODE | ||||
| ;=========================================================================== | ||||
| _TEXT	SEGMENT | ||||
|  | ||||
| ;--------------------------------------------------------------------------- | ||||
| ; match_init | ||||
| ;--------------------------------------------------------------------------- | ||||
| 	ALIGN	4 | ||||
| PUBLIC	_match_init | ||||
| _match_init	PROC | ||||
| 	; no initialization needed | ||||
| 	ret | ||||
| _match_init	ENDP | ||||
|  | ||||
| ;--------------------------------------------------------------------------- | ||||
| ; uInt longest_match(deflate_state *deflatestate, IPos curmatch) | ||||
| ;--------------------------------------------------------------------------- | ||||
| 	ALIGN	4 | ||||
|  | ||||
| PUBLIC	_longest_match | ||||
| _longest_match	PROC | ||||
|  | ||||
| ; Since this code uses EBP for a scratch register, the stack frame must | ||||
| ; be manually constructed and referenced relative to the ESP register. | ||||
|  | ||||
| ; Stack image | ||||
| ; Variables | ||||
| chainlenwmask	=  0	; high word: current chain len | ||||
| 			; low word: s->wmask | ||||
| window		=  4	; local copy of s->window | ||||
| windowbestlen	=  8	; s->window + bestlen | ||||
| scanend		= 12	; last two bytes of string | ||||
| scanstart	= 16	; first two bytes of string | ||||
| scanalign	= 20	; dword-misalignment of string | ||||
| nicematch	= 24	; a good enough match size | ||||
| bestlen		= 28	; size of best match so far | ||||
| scan		= 32	; ptr to string wanting match | ||||
| varsize		= 36	; number of bytes (also offset to last saved register) | ||||
|  | ||||
| ; Saved Registers (actually pushed into place) | ||||
| ebx_save	= 36 | ||||
| edi_save	= 40 | ||||
| esi_save	= 44 | ||||
| ebp_save	= 48 | ||||
|  | ||||
| ; Parameters | ||||
| retaddr		= 52 | ||||
| deflatestate	= 56 | ||||
| curmatch	= 60 | ||||
|  | ||||
| ; Save registers that the compiler may be using | ||||
| 	push	ebp | ||||
| 	push	edi | ||||
| 	push	esi | ||||
| 	push	ebx | ||||
|  | ||||
| ; Allocate local variable space | ||||
| 	sub	esp,varsize | ||||
|  | ||||
| ; Retrieve the function arguments. ecx will hold cur_match | ||||
| ; throughout the entire function. edx will hold the pointer to the | ||||
| ; deflate_state structure during the function's setup (before | ||||
| ; entering the main loop). | ||||
|  | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| ASSUME	edx:PTR DEFLATE_STATE | ||||
|  | ||||
| 	mov	ecx, [esp+curmatch] | ||||
|  | ||||
| ; uInt wmask = s->w_mask; | ||||
| ; unsigned chain_length = s->max_chain_length; | ||||
| ; if (s->prev_length >= s->good_match) { | ||||
| ;     chain_length >>= 2; | ||||
| ; } | ||||
|  | ||||
| 	mov	eax, [edx].ds_prev_length | ||||
| 	mov	ebx, [edx].ds_good_match | ||||
| 	cmp	eax, ebx | ||||
| 	mov	eax, [edx].ds_w_mask | ||||
| 	mov	ebx, [edx].ds_max_chain_length | ||||
| 	jl	SHORT LastMatchGood | ||||
| 	shr	ebx, 2 | ||||
| LastMatchGood: | ||||
|  | ||||
| ; chainlen is decremented once beforehand so that the function can | ||||
| ; use the sign flag instead of the zero flag for the exit test. | ||||
| ; It is then shifted into the high word, to make room for the wmask | ||||
| ; value, which it will always accompany. | ||||
|  | ||||
| 	dec	ebx | ||||
| 	shl	ebx, 16 | ||||
| 	or	ebx, eax | ||||
| 	mov	[esp+chainlenwmask], ebx | ||||
|  | ||||
| ; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||||
|  | ||||
| 	mov	eax, [edx].ds_nice_match | ||||
| 	mov	ebx, [edx].ds_lookahead | ||||
| 	cmp	ebx, eax | ||||
| 	jl	SHORT LookaheadLess | ||||
| 	mov	ebx, eax | ||||
| LookaheadLess: | ||||
| 	mov	[esp+nicematch], ebx | ||||
|  | ||||
| ;/* register Bytef *scan = s->window + s->strstart;                     */ | ||||
|  | ||||
| 	mov	esi, [edx].ds_window | ||||
| 	mov	[esp+window], esi | ||||
| 	mov	ebp, [edx].ds_strstart | ||||
| 	lea	edi, [esi+ebp] | ||||
| 	mov	[esp+scan],edi | ||||
|  | ||||
| ;/* Determine how many bytes the scan ptr is off from being             */ | ||||
| ;/* dword-aligned.                                                      */ | ||||
|  | ||||
| 	mov	eax, edi | ||||
| 	neg	eax | ||||
| 	and	eax, 3 | ||||
| 	mov	[esp+scanalign], eax | ||||
|  | ||||
| ;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ?                      */ | ||||
| ;/*     s->strstart - (IPos)MAX_DIST(s) : NIL;                          */ | ||||
|  | ||||
| 	mov	eax, [edx].ds_w_size | ||||
| 	sub	eax, MIN_LOOKAHEAD | ||||
| 	sub	ebp, eax | ||||
| 	jg	SHORT LimitPositive | ||||
| 	xor	ebp, ebp | ||||
| LimitPositive: | ||||
|  | ||||
| ;/* int best_len = s->prev_length;                                      */ | ||||
|  | ||||
| 	mov	eax, [edx].ds_prev_length | ||||
| 	mov	[esp+bestlen], eax | ||||
|  | ||||
| ;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ | ||||
|  | ||||
| 	add	esi, eax | ||||
| 	mov	[esp+windowbestlen], esi | ||||
|  | ||||
| ;/* register ush scan_start = *(ushf*)scan;                             */ | ||||
| ;/* register ush scan_end   = *(ushf*)(scan+best_len-1);                */ | ||||
| ;/* Posf *prev = s->prev;                                               */ | ||||
|  | ||||
| 	movzx	ebx, WORD PTR[edi] | ||||
| 	mov	[esp+scanstart], ebx | ||||
| 	movzx	ebx, WORD PTR[eax+edi-1] | ||||
| 	mov	[esp+scanend], ebx | ||||
| 	mov	edi, [edx].ds_prev | ||||
|  | ||||
| ;/* Jump into the main loop.                                            */ | ||||
|  | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	SHORT LoopEntry | ||||
|  | ||||
| ;/* do { | ||||
| ; *     match = s->window + cur_match; | ||||
| ; *     if (*(ushf*)(match+best_len-1) != scan_end || | ||||
| ; *         *(ushf*)match != scan_start) continue; | ||||
| ; *     [...] | ||||
| ; * } while ((cur_match = prev[cur_match & wmask]) > limit | ||||
| ; *          && --chain_length != 0); | ||||
| ; * | ||||
| ; * Here is the inner loop of the function. The function will spend the | ||||
| ; * majority of its time in this loop, and majority of that time will | ||||
| ; * be spent in the first ten instructions. | ||||
| ; * | ||||
| ; * Within this loop: | ||||
| ; * %ebx = scanend | ||||
| ; * %ecx = curmatch | ||||
| ; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) | ||||
| ; * %esi = windowbestlen - i.e., (window + bestlen) | ||||
| ; * %edi = prev | ||||
| ; * %ebp = limit | ||||
| ; */ | ||||
|  | ||||
| 	ALIGN	4 | ||||
| LookupLoop: | ||||
| 	and	ecx, edx | ||||
| 	movzx	ecx, WORD PTR[edi+ecx*2] | ||||
| 	cmp	ecx, ebp | ||||
| 	jbe	LeaveNow | ||||
| 	sub	edx, 000010000H | ||||
| 	js	LeaveNow | ||||
|  | ||||
| LoopEntry: | ||||
| 	movzx	eax, WORD PTR[esi+ecx-1] | ||||
| 	cmp	eax, ebx | ||||
| 	jnz	SHORT LookupLoop | ||||
|  | ||||
| 	mov	eax, [esp+window] | ||||
| 	movzx	eax, WORD PTR[eax+ecx] | ||||
| 	cmp	eax, [esp+scanstart] | ||||
| 	jnz	SHORT LookupLoop | ||||
|  | ||||
| ;/* Store the current value of chainlen.                                */ | ||||
|  | ||||
| 	mov	[esp+chainlenwmask], edx | ||||
|  | ||||
| ;/* Point %edi to the string under scrutiny, and %esi to the string we  */ | ||||
| ;/* are hoping to match it up with. In actuality, %esi and %edi are     */ | ||||
| ;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is     */ | ||||
| ;/* initialized to -(MAX_MATCH_8 - scanalign).                          */ | ||||
|  | ||||
| 	mov	esi, [esp+window] | ||||
| 	mov	edi, [esp+scan] | ||||
| 	add	esi, ecx | ||||
| 	mov	eax, [esp+scanalign] | ||||
| 	mov	edx, -MAX_MATCH_8 | ||||
| 	lea	edi, [edi+eax+MAX_MATCH_8] | ||||
| 	lea	esi, [esi+eax+MAX_MATCH_8] | ||||
|  | ||||
| ;/* Test the strings for equality, 8 bytes at a time. At the end, | ||||
| ; * adjust %edx so that it is offset to the exact byte that mismatched. | ||||
| ; * | ||||
| ; * We already know at this point that the first three bytes of the | ||||
| ; * strings match each other, and they can be safely passed over before | ||||
| ; * starting the compare loop. So what this code does is skip over 0-3 | ||||
| ; * bytes, as much as necessary in order to dword-align the %edi | ||||
| ; * pointer. (%esi will still be misaligned three times out of four.) | ||||
| ; * | ||||
| ; * It should be confessed that this loop usually does not represent | ||||
| ; * much of the total running time. Replacing it with a more | ||||
| ; * straightforward "rep cmpsb" would not drastically degrade | ||||
| ; * performance. | ||||
| ; */ | ||||
|  | ||||
| LoopCmps: | ||||
| 	mov	eax, DWORD PTR[esi+edx] | ||||
| 	xor	eax, DWORD PTR[edi+edx] | ||||
| 	jnz	SHORT LeaveLoopCmps | ||||
|  | ||||
| 	mov	eax, DWORD PTR[esi+edx+4] | ||||
| 	xor	eax, DWORD PTR[edi+edx+4] | ||||
| 	jnz	SHORT LeaveLoopCmps4 | ||||
|  | ||||
| 	add	edx, 8 | ||||
| 	jnz	SHORT LoopCmps | ||||
| 	jmp	LenMaximum | ||||
| 	ALIGN	4 | ||||
|  | ||||
| LeaveLoopCmps4: | ||||
| 	add	edx, 4 | ||||
|  | ||||
| LeaveLoopCmps: | ||||
| 	test	eax, 00000FFFFH | ||||
| 	jnz	SHORT LenLower | ||||
|  | ||||
| 	add	edx, 2 | ||||
| 	shr	eax, 16 | ||||
|  | ||||
| LenLower: | ||||
| 	sub	al, 1 | ||||
| 	adc	edx, 0 | ||||
|  | ||||
| ;/* Calculate the length of the match. If it is longer than MAX_MATCH,  */ | ||||
| ;/* then automatically accept it as the best possible match and leave.  */ | ||||
|  | ||||
| 	lea	eax, [edi+edx] | ||||
| 	mov	edi, [esp+scan] | ||||
| 	sub	eax, edi | ||||
| 	cmp	eax, MAX_MATCH | ||||
| 	jge	SHORT LenMaximum | ||||
|  | ||||
| ;/* If the length of the match is not longer than the best match we     */ | ||||
| ;/* have so far, then forget it and return to the lookup loop.          */ | ||||
|  | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	ebx, [esp+bestlen] | ||||
| 	cmp	eax, ebx | ||||
| 	jg	SHORT LongerMatch | ||||
| 	mov	esi, [esp+windowbestlen] | ||||
| 	mov	edi, [edx].ds_prev | ||||
| 	mov	ebx, [esp+scanend] | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	LookupLoop | ||||
| 	ALIGN	4 | ||||
|  | ||||
| ;/*         s->match_start = cur_match;                                 */ | ||||
| ;/*         best_len = len;                                             */ | ||||
| ;/*         if (len >= nice_match) break;                               */ | ||||
| ;/*         scan_end = *(ushf*)(scan+best_len-1);                       */ | ||||
|  | ||||
| LongerMatch: | ||||
| 	mov	ebx, [esp+nicematch] | ||||
| 	mov	[esp+bestlen], eax | ||||
| 	mov	[edx].ds_match_start, ecx | ||||
| 	cmp	eax, ebx | ||||
| 	jge	SHORT LeaveNow | ||||
| 	mov	esi, [esp+window] | ||||
| 	add	esi, eax | ||||
| 	mov	[esp+windowbestlen], esi | ||||
| 	movzx	ebx, WORD PTR[edi+eax-1] | ||||
| 	mov	edi, [edx].ds_prev | ||||
| 	mov	[esp+scanend], ebx | ||||
| 	mov	edx, [esp+chainlenwmask] | ||||
| 	jmp	LookupLoop | ||||
| 	ALIGN	4 | ||||
|  | ||||
| ;/* Accept the current string, with the maximum possible length.        */ | ||||
|  | ||||
| LenMaximum: | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	DWORD PTR[esp+bestlen], MAX_MATCH | ||||
| 	mov	[edx].ds_match_start, ecx | ||||
|  | ||||
| ;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len;          */ | ||||
| ;/* return s->lookahead;                                                */ | ||||
|  | ||||
| LeaveNow: | ||||
| 	mov	edx, [esp+deflatestate] | ||||
| 	mov	ebx, [esp+bestlen] | ||||
| 	mov	eax, [edx].ds_lookahead | ||||
| 	cmp	ebx, eax | ||||
| 	jg	SHORT LookaheadRet | ||||
| 	mov	eax, ebx | ||||
| LookaheadRet: | ||||
|  | ||||
| ; Restore the stack and return from whence we came. | ||||
|  | ||||
| 	add	esp, varsize | ||||
| 	pop	ebx | ||||
| 	pop	esi | ||||
| 	pop	edi | ||||
| 	pop	ebp | ||||
| 	ret | ||||
|  | ||||
| _longest_match	ENDP | ||||
|  | ||||
| _TEXT	ENDS | ||||
| END | ||||
|   | ||||
							
								
								
									
										2
									
								
								contrib/masmx64/bld_ml64.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/masmx64/bld_ml64.bat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| ml64.exe /Flinffasx64 /c /Zi inffasx64.asm | ||||
| ml64.exe /Flgvmat64   /c /Zi gvmat64.asm | ||||
							
								
								
									
										513
									
								
								contrib/masmx64/gvmat64.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										513
									
								
								contrib/masmx64/gvmat64.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,513 @@ | ||||
| ;uInt longest_match_x64( | ||||
| ;    deflate_state *s, | ||||
| ;    IPos cur_match);                             /* current match */ | ||||
|  | ||||
| ; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86 | ||||
| ; Copyright (C) 1995-2005 Jean-loup Gailly, Brian Raiter and Gilles Vollant. | ||||
| ; | ||||
| ; File written by Gilles Vollant, by converting to assembly the longest_match | ||||
| ;  from Jean-loup Gailly in deflate.c of zLib and infoZip zip. | ||||
| ; | ||||
| ;  and by taking inspiration on asm686 with masm, optimised assembly code | ||||
| ;        from Brian Raiter, written 1998 | ||||
| ; | ||||
| ;         http://www.zlib.net | ||||
| ;         http://www.winimage.com/zLibDll | ||||
| ;         http://www.muppetlabs.com/~breadbox/software/assembly.html | ||||
| ; | ||||
| ; to compile this file for infozip Zip, I use option: | ||||
| ;   ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm | ||||
| ; | ||||
| ; to compile this file for zLib, I use option: | ||||
| ;   ml64.exe /Flgvmat64 /c /Zi gvmat64.asm | ||||
| ; Be carrefull to adapt zlib1222add below to your version of zLib | ||||
| ;   (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change | ||||
| ;    value of zlib1222add later) | ||||
| ; | ||||
| ; This file compile with Microsoft Macro Assembler (x64) for AMD64 | ||||
| ; | ||||
| ;   ml64.exe is given with Visual Studio 2005 and Windows 2003 server DDK | ||||
| ; | ||||
| ;   (you can get Windows 2003 server DDK with ml64 and cl for AMD64 from | ||||
| ;      http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) | ||||
| ; | ||||
|  | ||||
|  | ||||
| ;uInt longest_match(s, cur_match) | ||||
| ;    deflate_state *s; | ||||
| ;    IPos cur_match;                             /* current match */ | ||||
| .code | ||||
| longest_match PROC | ||||
|  | ||||
|  | ||||
| ;LocalVarsSize   equ 88 | ||||
|  LocalVarsSize   equ 72 | ||||
|  | ||||
| ; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 | ||||
| ; free register :  r14,r15 | ||||
| ; register can be saved : rsp | ||||
|  | ||||
|  chainlenwmask   equ  rsp + 8 - LocalVarsSize    ; high word: current chain len | ||||
|                                                  ; low word: s->wmask | ||||
| ;window          equ  rsp + xx - LocalVarsSize   ; local copy of s->window ; stored in r10 | ||||
| ;windowbestlen   equ  rsp + xx - LocalVarsSize   ; s->window + bestlen , use r10+r11 | ||||
| ;scanstart       equ  rsp + xx - LocalVarsSize   ; first two bytes of string ; stored in r12w | ||||
| ;scanend         equ  rsp + xx - LocalVarsSize   ; last two bytes of string use ebx | ||||
| ;scanalign       equ  rsp + xx - LocalVarsSize   ; dword-misalignment of string r13 | ||||
| ;bestlen         equ  rsp + xx - LocalVarsSize   ; size of best match so far -> r11d | ||||
| ;scan            equ  rsp + xx - LocalVarsSize   ; ptr to string wanting match -> r9 | ||||
| IFDEF INFOZIP | ||||
| ELSE | ||||
|  nicematch       equ  (rsp + 16 - LocalVarsSize) ; a good enough match size | ||||
| ENDIF | ||||
|  | ||||
| save_rdi        equ  rsp + 24 - LocalVarsSize | ||||
| save_rsi        equ  rsp + 32 - LocalVarsSize | ||||
| save_rbx        equ  rsp + 40 - LocalVarsSize | ||||
| save_rbp        equ  rsp + 48 - LocalVarsSize | ||||
| save_r12        equ  rsp + 56 - LocalVarsSize | ||||
| save_r13        equ  rsp + 64 - LocalVarsSize | ||||
| ;save_r14        equ  rsp + 72 - LocalVarsSize | ||||
| ;save_r15        equ  rsp + 80 - LocalVarsSize | ||||
|  | ||||
|  | ||||
|  | ||||
| ;  all the +4 offsets are due to the addition of pending_buf_size (in zlib | ||||
| ;  in the deflate_state structure since the asm code was first written | ||||
| ;  (if you compile with zlib 1.0.4 or older, remove the +4). | ||||
| ;  Note : these value are good with a 8 bytes boundary pack structure | ||||
|  | ||||
|  | ||||
|     MAX_MATCH           equ     258 | ||||
|     MIN_MATCH           equ     3 | ||||
|     MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1) | ||||
|  | ||||
|  | ||||
| ;;; Offsets for fields in the deflate_state structure. These numbers | ||||
| ;;; are calculated from the definition of deflate_state, with the | ||||
| ;;; assumption that the compiler will dword-align the fields. (Thus, | ||||
| ;;; changing the definition of deflate_state could easily cause this | ||||
| ;;; program to crash horribly, without so much as a warning at | ||||
| ;;; compile time. Sigh.) | ||||
|  | ||||
| ;  all the +zlib1222add offsets are due to the addition of fields | ||||
| ;  in zlib in the deflate_state structure since the asm code was first written | ||||
| ;  (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). | ||||
| ;  (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). | ||||
| ;  if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). | ||||
|  | ||||
|  | ||||
| IFDEF INFOZIP | ||||
|  | ||||
| _DATA   SEGMENT | ||||
| COMM    window_size:DWORD | ||||
| ; WMask ; 7fff | ||||
| COMM    window:BYTE:010040H | ||||
| COMM    prev:WORD:08000H | ||||
| ; MatchLen : unused | ||||
| ; PrevMatch : unused | ||||
| COMM    strstart:DWORD | ||||
| COMM    match_start:DWORD | ||||
| ; Lookahead : ignore | ||||
| COMM    prev_length:DWORD ; PrevLen | ||||
| COMM    max_chain_length:DWORD | ||||
| COMM    good_match:DWORD | ||||
| COMM    nice_match:DWORD | ||||
| prev_ad equ OFFSET prev | ||||
| window_ad equ OFFSET window | ||||
| nicematch equ nice_match | ||||
| _DATA ENDS | ||||
| WMask equ 07fffh | ||||
|  | ||||
| ELSE | ||||
|  | ||||
|   IFNDEF zlib1222add | ||||
|     zlib1222add equ 8 | ||||
|   ENDIF | ||||
| dsWSize         equ 56+zlib1222add+(zlib1222add/2) | ||||
| dsWMask         equ 64+zlib1222add+(zlib1222add/2) | ||||
| dsWindow        equ 72+zlib1222add | ||||
| dsPrev          equ 88+zlib1222add | ||||
| dsMatchLen      equ 128+zlib1222add | ||||
| dsPrevMatch     equ 132+zlib1222add | ||||
| dsStrStart      equ 140+zlib1222add | ||||
| dsMatchStart    equ 144+zlib1222add | ||||
| dsLookahead     equ 148+zlib1222add | ||||
| dsPrevLen       equ 152+zlib1222add | ||||
| dsMaxChainLen   equ 156+zlib1222add | ||||
| dsGoodMatch     equ 172+zlib1222add | ||||
| dsNiceMatch     equ 176+zlib1222add | ||||
|  | ||||
| window_size     equ [ rcx + dsWSize] | ||||
| WMask           equ [ rcx + dsWMask] | ||||
| window_ad       equ [ rcx + dsWindow] | ||||
| prev_ad         equ [ rcx + dsPrev] | ||||
| strstart        equ [ rcx + dsStrStart] | ||||
| match_start     equ [ rcx + dsMatchStart] | ||||
| Lookahead       equ [ rcx + dsLookahead] ; 0ffffffffh on infozip | ||||
| prev_length     equ [ rcx + dsPrevLen] | ||||
| max_chain_length equ [ rcx + dsMaxChainLen] | ||||
| good_match      equ [ rcx + dsGoodMatch] | ||||
| nice_match      equ [ rcx + dsNiceMatch] | ||||
| ENDIF | ||||
|  | ||||
| ; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) | ||||
|  | ||||
| ; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and | ||||
| ; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp | ||||
| ; | ||||
| ; All registers must be preserved across the call, except for | ||||
| ;   rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. | ||||
|  | ||||
|  | ||||
|  | ||||
| ;;; Save registers that the compiler may be using, and adjust esp to | ||||
| ;;; make room for our stack frame. | ||||
|  | ||||
|  | ||||
| ;;; Retrieve the function arguments. r8d will hold cur_match | ||||
| ;;; throughout the entire function. edx will hold the pointer to the | ||||
| ;;; deflate_state structure during the function's setup (before | ||||
| ;;; entering the main loop. | ||||
|  | ||||
| ; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) | ||||
|  | ||||
| ; this clear high 32 bits of r8, which can be garbage in both r8 and rdx | ||||
|  | ||||
|         mov [save_rdi],rdi | ||||
|         mov [save_rsi],rsi | ||||
|         mov [save_rbx],rbx | ||||
|         mov [save_rbp],rbp | ||||
| IFDEF INFOZIP | ||||
|         mov r8d,ecx | ||||
| ELSE | ||||
|         mov r8d,edx | ||||
| ENDIF | ||||
|         mov [save_r12],r12 | ||||
|         mov [save_r13],r13 | ||||
| ;        mov [save_r14],r14 | ||||
| ;        mov [save_r15],r15 | ||||
|  | ||||
|  | ||||
| ;;; uInt wmask = s->w_mask; | ||||
| ;;; unsigned chain_length = s->max_chain_length; | ||||
| ;;; if (s->prev_length >= s->good_match) { | ||||
| ;;;     chain_length >>= 2; | ||||
| ;;; } | ||||
|  | ||||
|         mov edi, prev_length | ||||
|         mov esi, good_match | ||||
|         mov eax, WMask | ||||
|         mov ebx, max_chain_length | ||||
|         cmp edi, esi | ||||
|         jl  LastMatchGood | ||||
|         shr ebx, 2 | ||||
| LastMatchGood: | ||||
|  | ||||
| ;;; chainlen is decremented once beforehand so that the function can | ||||
| ;;; use the sign flag instead of the zero flag for the exit test. | ||||
| ;;; It is then shifted into the high word, to make room for the wmask | ||||
| ;;; value, which it will always accompany. | ||||
|  | ||||
|         dec ebx | ||||
|         shl ebx, 16 | ||||
|         or  ebx, eax | ||||
|  | ||||
| ;;; on zlib only | ||||
| ;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; | ||||
|  | ||||
| IFDEF INFOZIP | ||||
|         mov [chainlenwmask], ebx | ||||
| ; on infozip nice_match = [nice_match] | ||||
| ELSE | ||||
|         mov eax, nice_match | ||||
|         mov [chainlenwmask], ebx | ||||
|         mov r10d, Lookahead | ||||
|         cmp r10d, eax | ||||
|         cmovnl r10d, eax | ||||
|         mov [nicematch],r10d | ||||
| ENDIF | ||||
|  | ||||
| ;;; register Bytef *scan = s->window + s->strstart; | ||||
|         mov r10, window_ad | ||||
|         mov ebp, strstart | ||||
|         lea r13, [r10 + rbp] | ||||
|  | ||||
| ;;; Determine how many bytes the scan ptr is off from being | ||||
| ;;; dword-aligned. | ||||
|  | ||||
|          mov r9,r13 | ||||
|          neg r13 | ||||
|          and r13,3 | ||||
|  | ||||
| ;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? | ||||
| ;;;     s->strstart - (IPos)MAX_DIST(s) : NIL; | ||||
| IFDEF INFOZIP | ||||
|         mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) | ||||
| ELSE | ||||
|         mov eax, window_size | ||||
|         sub eax, MIN_LOOKAHEAD | ||||
| ENDIF | ||||
|         xor edi,edi | ||||
|         sub ebp, eax | ||||
|  | ||||
|         mov r11d, prev_length | ||||
|  | ||||
|         cmovng ebp,edi | ||||
|  | ||||
| ;;; int best_len = s->prev_length; | ||||
|  | ||||
|  | ||||
| ;;; Store the sum of s->window + best_len in esi locally, and in esi. | ||||
|  | ||||
|        lea  rsi,[r10+r11] | ||||
|  | ||||
| ;;; register ush scan_start = *(ushf*)scan; | ||||
| ;;; register ush scan_end   = *(ushf*)(scan+best_len-1); | ||||
| ;;; Posf *prev = s->prev; | ||||
|  | ||||
|         movzx r12d,word ptr [r9] | ||||
|         movzx ebx, word ptr [r9 + r11 - 1] | ||||
|  | ||||
|         mov rdi, prev_ad | ||||
|  | ||||
| ;;; Jump into the main loop. | ||||
|  | ||||
|         mov edx, [chainlenwmask] | ||||
|  | ||||
|         cmp bx,word ptr [rsi + r8 - 1] | ||||
|         jz  LookupLoopIsZero | ||||
|  | ||||
| LookupLoop1: | ||||
|         and r8d, edx | ||||
|  | ||||
|         movzx   r8d, word ptr [rdi + r8*2] | ||||
|         cmp r8d, ebp | ||||
|         jbe LeaveNow | ||||
|         sub edx, 00010000h | ||||
|         js  LeaveNow | ||||
|  | ||||
| LoopEntry1: | ||||
|         cmp bx,word ptr [rsi + r8 - 1] | ||||
|         jz  LookupLoopIsZero | ||||
|  | ||||
| LookupLoop2: | ||||
|         and r8d, edx | ||||
|  | ||||
|         movzx   r8d, word ptr [rdi + r8*2] | ||||
|         cmp r8d, ebp | ||||
|         jbe LeaveNow | ||||
|         sub edx, 00010000h | ||||
|         js  LeaveNow | ||||
|  | ||||
| LoopEntry2: | ||||
|         cmp bx,word ptr [rsi + r8 - 1] | ||||
|         jz  LookupLoopIsZero | ||||
|  | ||||
| LookupLoop4: | ||||
|         and r8d, edx | ||||
|  | ||||
|         movzx   r8d, word ptr [rdi + r8*2] | ||||
|         cmp r8d, ebp | ||||
|         jbe LeaveNow | ||||
|         sub edx, 00010000h | ||||
|         js  LeaveNow | ||||
|  | ||||
| LoopEntry4: | ||||
|  | ||||
|         cmp bx,word ptr [rsi + r8 - 1] | ||||
|         jnz LookupLoop1 | ||||
|         jmp LookupLoopIsZero | ||||
|  | ||||
|  | ||||
| ;;; do { | ||||
| ;;;     match = s->window + cur_match; | ||||
| ;;;     if (*(ushf*)(match+best_len-1) != scan_end || | ||||
| ;;;         *(ushf*)match != scan_start) continue; | ||||
| ;;;     [...] | ||||
| ;;; } while ((cur_match = prev[cur_match & wmask]) > limit | ||||
| ;;;          && --chain_length != 0); | ||||
| ;;; | ||||
| ;;; Here is the inner loop of the function. The function will spend the | ||||
| ;;; majority of its time in this loop, and majority of that time will | ||||
| ;;; be spent in the first ten instructions. | ||||
| ;;; | ||||
| ;;; Within this loop: | ||||
| ;;; ebx = scanend | ||||
| ;;; r8d = curmatch | ||||
| ;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) | ||||
| ;;; esi = windowbestlen - i.e., (window + bestlen) | ||||
| ;;; edi = prev | ||||
| ;;; ebp = limit | ||||
|  | ||||
| LookupLoop: | ||||
|         and r8d, edx | ||||
|  | ||||
|         movzx   r8d, word ptr [rdi + r8*2] | ||||
|         cmp r8d, ebp | ||||
|         jbe LeaveNow | ||||
|         sub edx, 00010000h | ||||
|         js  LeaveNow | ||||
|  | ||||
| LoopEntry: | ||||
|  | ||||
|         cmp bx,word ptr [rsi + r8 - 1] | ||||
|         jnz LookupLoop1 | ||||
| LookupLoopIsZero: | ||||
|         cmp     r12w, word ptr [r10 + r8] | ||||
|         jnz LookupLoop1 | ||||
|  | ||||
|  | ||||
| ;;; Store the current value of chainlen. | ||||
|         mov [chainlenwmask], edx | ||||
|  | ||||
| ;;; Point edi to the string under scrutiny, and esi to the string we | ||||
| ;;; are hoping to match it up with. In actuality, esi and edi are | ||||
| ;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is | ||||
| ;;; initialized to -(MAX_MATCH_8 - scanalign). | ||||
|  | ||||
|         lea rsi,[r8+r10] | ||||
|         mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) | ||||
|         lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] | ||||
|         lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] | ||||
|  | ||||
|         prefetcht1 [rsi+rdx] | ||||
|         prefetcht1 [rdi+rdx] | ||||
|  | ||||
|  | ||||
| ;;; Test the strings for equality, 8 bytes at a time. At the end, | ||||
| ;;; adjust rdx so that it is offset to the exact byte that mismatched. | ||||
| ;;; | ||||
| ;;; We already know at this point that the first three bytes of the | ||||
| ;;; strings match each other, and they can be safely passed over before | ||||
| ;;; starting the compare loop. So what this code does is skip over 0-3 | ||||
| ;;; bytes, as much as necessary in order to dword-align the edi | ||||
| ;;; pointer. (rsi will still be misaligned three times out of four.) | ||||
| ;;; | ||||
| ;;; It should be confessed that this loop usually does not represent | ||||
| ;;; much of the total running time. Replacing it with a more | ||||
| ;;; straightforward "rep cmpsb" would not drastically degrade | ||||
| ;;; performance. | ||||
|  | ||||
|  | ||||
| LoopCmps: | ||||
|         mov rax, [rsi + rdx] | ||||
|         xor rax, [rdi + rdx] | ||||
|         jnz LeaveLoopCmps | ||||
|  | ||||
|         mov rax, [rsi + rdx + 8] | ||||
|         xor rax, [rdi + rdx + 8] | ||||
|         jnz LeaveLoopCmps8 | ||||
|  | ||||
|  | ||||
|         mov rax, [rsi + rdx + 8+8] | ||||
|         xor rax, [rdi + rdx + 8+8] | ||||
|         jnz LeaveLoopCmps16 | ||||
|  | ||||
|         add rdx,8+8+8 | ||||
|  | ||||
|         jmp short LoopCmps | ||||
| LeaveLoopCmps16: add rdx,8 | ||||
| LeaveLoopCmps8: add rdx,8 | ||||
| LeaveLoopCmps: | ||||
|  | ||||
|         test    eax, 0000FFFFh | ||||
|         jnz LenLower | ||||
|  | ||||
|         test eax,0ffffffffh | ||||
|  | ||||
|         jnz LenLower32 | ||||
|  | ||||
|         add rdx,4 | ||||
|         shr rax,32 | ||||
|         or ax,ax | ||||
|         jnz LenLower | ||||
|  | ||||
| LenLower32: | ||||
|         shr eax,16 | ||||
|         add rdx,2 | ||||
| LenLower:   sub al, 1 | ||||
|         adc rdx, 0 | ||||
| ;;; Calculate the length of the match. If it is longer than MAX_MATCH, | ||||
| ;;; then automatically accept it as the best possible match and leave. | ||||
|  | ||||
|         lea rax, [rdi + rdx] | ||||
|         sub rax, r9 | ||||
|         cmp eax, MAX_MATCH | ||||
|         jge LenMaximum | ||||
|  | ||||
| ;;; If the length of the match is not longer than the best match we | ||||
| ;;; have so far, then forget it and return to the lookup loop. | ||||
| ;/////////////////////////////////// | ||||
|  | ||||
|         cmp eax, r11d | ||||
|         jg  LongerMatch | ||||
|  | ||||
|         lea rsi,[r10+r11] | ||||
|  | ||||
|         mov rdi, prev_ad | ||||
|         mov edx, [chainlenwmask] | ||||
|         jmp LookupLoop | ||||
|  | ||||
| ;;;         s->match_start = cur_match; | ||||
| ;;;         best_len = len; | ||||
| ;;;         if (len >= nice_match) break; | ||||
| ;;;         scan_end = *(ushf*)(scan+best_len-1); | ||||
|  | ||||
| LongerMatch: | ||||
|         mov r11d, eax | ||||
|         mov match_start, r8d | ||||
|         cmp eax, [nicematch] | ||||
|         jge LeaveNow | ||||
|  | ||||
|         lea rsi,[r10+rax] | ||||
|  | ||||
|         movzx   ebx, word ptr [r9 + rax - 1] | ||||
|         mov rdi, prev_ad | ||||
|         mov edx, [chainlenwmask] | ||||
|         jmp LookupLoop | ||||
|  | ||||
| ;;; Accept the current string, with the maximum possible length. | ||||
|  | ||||
| LenMaximum: | ||||
|         mov r11d,MAX_MATCH | ||||
|         mov match_start, r8d | ||||
|  | ||||
| ;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; | ||||
| ;;; return s->lookahead; | ||||
|  | ||||
| LeaveNow: | ||||
| IFDEF INFOZIP | ||||
|         mov eax,r11d | ||||
| ELSE | ||||
|         mov eax, Lookahead | ||||
|         cmp r11d, eax | ||||
|         cmovng eax, r11d | ||||
| ENDIF | ||||
|  | ||||
| ;;; Restore the stack and return from whence we came. | ||||
|  | ||||
|  | ||||
|         mov rsi,[save_rsi] | ||||
|         mov rdi,[save_rdi] | ||||
|         mov rbx,[save_rbx] | ||||
|         mov rbp,[save_rbp] | ||||
|         mov r12,[save_r12] | ||||
|         mov r13,[save_r13] | ||||
| ;        mov r14,[save_r14] | ||||
| ;        mov r15,[save_r15] | ||||
|  | ||||
|  | ||||
|         ret 0 | ||||
| ; please don't remove this string ! | ||||
| ; Your can freely use gvmat64 in any free or commercial app | ||||
| ; but it is far better don't remove the string in the binary! | ||||
|     db     0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 | ||||
| longest_match   ENDP | ||||
|  | ||||
| match_init PROC | ||||
|   ret 0 | ||||
| match_init ENDP | ||||
|  | ||||
|  | ||||
| END | ||||
							
								
								
									
										
											BIN
										
									
								
								contrib/masmx64/gvmat64.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								contrib/masmx64/gvmat64.obj
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										186
									
								
								contrib/masmx64/inffas8664.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								contrib/masmx64/inffas8664.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| /* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding | ||||
|  * version for AMD64 on Windows using Microsoft C compiler | ||||
|  * | ||||
|  * Copyright (C) 1995-2003 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  * | ||||
|  * Copyright (C) 2003 Chris Anderson <christop@charm.net> | ||||
|  * Please use the copyright conditions above. | ||||
|  * | ||||
|  * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant | ||||
|  * | ||||
|  * inffas8664.c call function inffas8664fnc in inffasx64.asm | ||||
|  *  inffasx64.asm is automatically convert from AMD64 portion of inffas86.c | ||||
|  * | ||||
|  * Dec-29-2003 -- I added AMD64 inflate asm support.  This version is also | ||||
|  * slightly quicker on x86 systems because, instead of using rep movsb to copy | ||||
|  * data, it uses rep movsw, which moves data in 2-byte chunks instead of single | ||||
|  * bytes.  I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates | ||||
|  * from http://fedora.linux.duke.edu/fc1_x86_64 | ||||
|  * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with | ||||
|  * 1GB ram.  The 64-bit version is about 4% faster than the 32-bit version, | ||||
|  * when decompressing mozilla-source-1.3.tar.gz. | ||||
|  * | ||||
|  * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from | ||||
|  * the gcc -S output of zlib-1.2.0/inffast.c.  Zlib-1.2.0 is in beta release at | ||||
|  * the moment.  I have successfully compiled and tested this code with gcc2.96, | ||||
|  * gcc3.2, icc5.0, msvc6.0.  It is very close to the speed of inffast.S | ||||
|  * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX | ||||
|  * enabled.  I will attempt to merge the MMX code into this version.  Newer | ||||
|  * versions of this and inffast.S can be found at | ||||
|  * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include "zutil.h" | ||||
| #include "inftrees.h" | ||||
| #include "inflate.h" | ||||
| #include "inffast.h" | ||||
|  | ||||
| /* Mark Adler's comments from inffast.c: */ | ||||
|  | ||||
| /* | ||||
|    Decode literal, length, and distance codes and write out the resulting | ||||
|    literal and match bytes until either not enough input or output is | ||||
|    available, an end-of-block is encountered, or a data error is encountered. | ||||
|    When large enough input and output buffers are supplied to inflate(), for | ||||
|    example, a 16K input buffer and a 64K output buffer, more than 95% of the | ||||
|    inflate execution time is spent in this routine. | ||||
|  | ||||
|    Entry assumptions: | ||||
|  | ||||
|         state->mode == LEN | ||||
|         strm->avail_in >= 6 | ||||
|         strm->avail_out >= 258 | ||||
|         start >= strm->avail_out | ||||
|         state->bits < 8 | ||||
|  | ||||
|    On return, state->mode is one of: | ||||
|  | ||||
|         LEN -- ran out of enough output space or enough available input | ||||
|         TYPE -- reached end of block code, inflate() to interpret next block | ||||
|         BAD -- error in block data | ||||
|  | ||||
|    Notes: | ||||
|  | ||||
|     - The maximum input bits used by a length/distance pair is 15 bits for the | ||||
|       length code, 5 bits for the length extra, 15 bits for the distance code, | ||||
|       and 13 bits for the distance extra.  This totals 48 bits, or six bytes. | ||||
|       Therefore if strm->avail_in >= 6, then there is enough input to avoid | ||||
|       checking for available input while decoding. | ||||
|  | ||||
|     - The maximum bytes that a single length/distance pair can output is 258 | ||||
|       bytes, which is the maximum length that can be coded.  inflate_fast() | ||||
|       requires strm->avail_out >= 258 for each loop to avoid checking for | ||||
|       output space. | ||||
|  */ | ||||
|  | ||||
|  | ||||
|  | ||||
|     typedef struct inffast_ar { | ||||
| /* 64   32                               x86  x86_64 */ | ||||
| /* ar offset                              register */ | ||||
| /*  0    0 */ void *esp;                /* esp save */ | ||||
| /*  8    4 */ void *ebp;                /* ebp save */ | ||||
| /* 16    8 */ unsigned char FAR *in;    /* esi rsi  local strm->next_in */ | ||||
| /* 24   12 */ unsigned char FAR *last;  /*     r9   while in < last */ | ||||
| /* 32   16 */ unsigned char FAR *out;   /* edi rdi  local strm->next_out */ | ||||
| /* 40   20 */ unsigned char FAR *beg;   /*          inflate()'s init next_out */ | ||||
| /* 48   24 */ unsigned char FAR *end;   /*     r10  while out < end */ | ||||
| /* 56   28 */ unsigned char FAR *window;/*          size of window, wsize!=0 */ | ||||
| /* 64   32 */ code const FAR *lcode;    /* ebp rbp  local strm->lencode */ | ||||
| /* 72   36 */ code const FAR *dcode;    /*     r11  local strm->distcode */ | ||||
| /* 80   40 */ size_t /*unsigned long */hold;       /* edx rdx  local strm->hold */ | ||||
| /* 88   44 */ unsigned bits;            /* ebx rbx  local strm->bits */ | ||||
| /* 92   48 */ unsigned wsize;           /*          window size */ | ||||
| /* 96   52 */ unsigned write;           /*          window write index */ | ||||
| /*100   56 */ unsigned lmask;           /*     r12  mask for lcode */ | ||||
| /*104   60 */ unsigned dmask;           /*     r13  mask for dcode */ | ||||
| /*108   64 */ unsigned len;             /*     r14  match length */ | ||||
| /*112   68 */ unsigned dist;            /*     r15  match distance */ | ||||
| /*116   72 */ unsigned status;          /*          set when state chng*/ | ||||
|     } type_ar; | ||||
| #ifdef ASMINF | ||||
|  | ||||
| void inflate_fast(strm, start) | ||||
| z_streamp strm; | ||||
| unsigned start;         /* inflate()'s starting value for strm->avail_out */ | ||||
| { | ||||
|     struct inflate_state FAR *state; | ||||
|     type_ar ar; | ||||
|     void inffas8664fnc(struct inffast_ar * par); | ||||
|  | ||||
|      | ||||
|  | ||||
| #if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) | ||||
| #define PAD_AVAIL_IN 6 | ||||
| #define PAD_AVAIL_OUT 258     | ||||
| #else | ||||
| #define PAD_AVAIL_IN 5 | ||||
| #define PAD_AVAIL_OUT 257 | ||||
| #endif | ||||
|  | ||||
|     /* copy state to local variables */ | ||||
|     state = (struct inflate_state FAR *)strm->state; | ||||
|  | ||||
|     ar.in = strm->next_in; | ||||
|     ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); | ||||
|     ar.out = strm->next_out; | ||||
|     ar.beg = ar.out - (start - strm->avail_out); | ||||
|     ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); | ||||
|     ar.wsize = state->wsize; | ||||
|     ar.write = state->write; | ||||
|     ar.window = state->window; | ||||
|     ar.hold = state->hold; | ||||
|     ar.bits = state->bits; | ||||
|     ar.lcode = state->lencode; | ||||
|     ar.dcode = state->distcode; | ||||
|     ar.lmask = (1U << state->lenbits) - 1; | ||||
|     ar.dmask = (1U << state->distbits) - 1; | ||||
|  | ||||
|     /* decode literals and length/distances until end-of-block or not enough | ||||
|        input data or output space */ | ||||
|  | ||||
|     /* align in on 1/2 hold size boundary */ | ||||
|     while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { | ||||
|         ar.hold += (unsigned long)*ar.in++ << ar.bits; | ||||
|         ar.bits += 8; | ||||
|     } | ||||
|  | ||||
|     inffas8664fnc(&ar); | ||||
|  | ||||
|     if (ar.status > 1) { | ||||
|         if (ar.status == 2) | ||||
|             strm->msg = "invalid literal/length code"; | ||||
|         else if (ar.status == 3) | ||||
|             strm->msg = "invalid distance code"; | ||||
|         else | ||||
|             strm->msg = "invalid distance too far back"; | ||||
|         state->mode = BAD; | ||||
|     } | ||||
|     else if ( ar.status == 1 ) { | ||||
|         state->mode = TYPE; | ||||
|     } | ||||
|  | ||||
|     /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ | ||||
|     ar.len = ar.bits >> 3; | ||||
|     ar.in -= ar.len; | ||||
|     ar.bits -= ar.len << 3; | ||||
|     ar.hold &= (1U << ar.bits) - 1; | ||||
|  | ||||
|     /* update state and return */ | ||||
|     strm->next_in = ar.in; | ||||
|     strm->next_out = ar.out; | ||||
|     strm->avail_in = (unsigned)(ar.in < ar.last ? | ||||
|                                 PAD_AVAIL_IN + (ar.last - ar.in) : | ||||
|                                 PAD_AVAIL_IN - (ar.in - ar.last)); | ||||
|     strm->avail_out = (unsigned)(ar.out < ar.end ? | ||||
|                                  PAD_AVAIL_OUT + (ar.end - ar.out) : | ||||
|                                  PAD_AVAIL_OUT - (ar.out - ar.end)); | ||||
|     state->hold = (unsigned long)ar.hold; | ||||
|     state->bits = ar.bits; | ||||
|     return; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										392
									
								
								contrib/masmx64/inffasx64.asm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										392
									
								
								contrib/masmx64/inffasx64.asm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,392 @@ | ||||
| ; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding | ||||
| ; version for AMD64 on Windows using Microsoft C compiler | ||||
| ; | ||||
| ; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c | ||||
| ; inffasx64.asm is called by inffas8664.c, which contain more info. | ||||
|  | ||||
|  | ||||
| ; to compile this file, I use option | ||||
| ;   ml64.exe /Flinffasx64 /c /Zi inffasx64.asm | ||||
| ;   with Microsoft Macro Assembler (x64) for AMD64 | ||||
| ; | ||||
| ;   ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK | ||||
| ; | ||||
| ;   (you can get Windows 2003 server DDK with ml64 and cl.exe for AMD64 from  | ||||
| ;      http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) | ||||
| ; | ||||
|  | ||||
| .code | ||||
| inffas8664fnc PROC | ||||
|  | ||||
| ; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and | ||||
| ; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp | ||||
| ; | ||||
| ; All registers must be preserved across the call, except for | ||||
| ;   rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. | ||||
|  | ||||
|  | ||||
| 	mov [rsp-8],rsi | ||||
| 	mov [rsp-16],rdi | ||||
| 	mov [rsp-24],r12 | ||||
| 	mov [rsp-32],r13 | ||||
| 	mov [rsp-40],r14 | ||||
| 	mov [rsp-48],r15 | ||||
| 	mov [rsp-56],rbx | ||||
|  | ||||
| 	mov rax,rcx | ||||
|  | ||||
| 	mov	[rax+8], rbp       ; /* save regs rbp and rsp */ | ||||
| 	mov	[rax], rsp | ||||
|  | ||||
| 	mov	rsp, rax          ; /* make rsp point to &ar */ | ||||
|  | ||||
| 	mov	rsi, [rsp+16]      ; /* rsi  = in */ | ||||
| 	mov	rdi, [rsp+32]      ; /* rdi  = out */ | ||||
| 	mov	r9, [rsp+24]       ; /* r9   = last */ | ||||
| 	mov	r10, [rsp+48]      ; /* r10  = end */ | ||||
| 	mov	rbp, [rsp+64]      ; /* rbp  = lcode */ | ||||
| 	mov	r11, [rsp+72]      ; /* r11  = dcode */ | ||||
| 	mov	rdx, [rsp+80]      ; /* rdx  = hold */ | ||||
| 	mov	ebx, [rsp+88]      ; /* ebx  = bits */ | ||||
| 	mov	r12d, [rsp+100]    ; /* r12d = lmask */ | ||||
| 	mov	r13d, [rsp+104]    ; /* r13d = dmask */ | ||||
|                                           ; /* r14d = len */ | ||||
|                                           ; /* r15d = dist */ | ||||
|  | ||||
|  | ||||
| 	cld | ||||
| 	cmp	r10, rdi | ||||
| 	je	L_one_time           ; /* if only one decode left */ | ||||
| 	cmp	r9, rsi | ||||
|  | ||||
|     jne L_do_loop | ||||
|  | ||||
|  | ||||
| L_one_time: | ||||
| 	mov	r8, r12           ; /* r8 = lmask */ | ||||
| 	cmp	bl, 32 | ||||
| 	ja	L_get_length_code_one_time | ||||
|  | ||||
| 	lodsd                         ; /* eax = *(uint *)in++ */ | ||||
| 	mov	cl, bl            ; /* cl = bits, needs it for shifting */ | ||||
| 	add	bl, 32             ; /* bits += 32 */ | ||||
| 	shl	rax, cl | ||||
| 	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */ | ||||
| 	jmp	L_get_length_code_one_time | ||||
|  | ||||
| ALIGN 4 | ||||
| L_while_test: | ||||
| 	cmp	r10, rdi | ||||
| 	jbe	L_break_loop | ||||
| 	cmp	r9, rsi | ||||
| 	jbe	L_break_loop | ||||
|  | ||||
| L_do_loop: | ||||
| 	mov	r8, r12           ; /* r8 = lmask */ | ||||
| 	cmp	bl, 32 | ||||
| 	ja	L_get_length_code    ; /* if (32 < bits) */ | ||||
|  | ||||
| 	lodsd                         ; /* eax = *(uint *)in++ */ | ||||
| 	mov	cl, bl            ; /* cl = bits, needs it for shifting */ | ||||
| 	add	bl, 32             ; /* bits += 32 */ | ||||
| 	shl	rax, cl | ||||
| 	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */ | ||||
|  | ||||
| L_get_length_code: | ||||
| 	and	r8, rdx            ; /* r8 &= hold */ | ||||
| 	mov	eax, [rbp+r8*4]  ; /* eax = lcode[hold & lmask] */ | ||||
|  | ||||
| 	mov	cl, ah            ; /* cl = this.bits */ | ||||
| 	sub	bl, ah            ; /* bits -= this.bits */ | ||||
| 	shr	rdx, cl           ; /* hold >>= this.bits */ | ||||
|  | ||||
| 	test	al, al | ||||
| 	jnz	L_test_for_length_base ; /* if (op != 0) 45.7% */ | ||||
|  | ||||
| 	mov	r8, r12            ; /* r8 = lmask */ | ||||
| 	shr	eax, 16            ; /* output this.val char */ | ||||
| 	stosb | ||||
|  | ||||
| L_get_length_code_one_time: | ||||
| 	and	r8, rdx            ; /* r8 &= hold */ | ||||
| 	mov	eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ | ||||
|  | ||||
| L_dolen: | ||||
| 	mov	cl, ah            ; /* cl = this.bits */ | ||||
| 	sub	bl, ah            ; /* bits -= this.bits */ | ||||
| 	shr	rdx, cl           ; /* hold >>= this.bits */ | ||||
|  | ||||
| 	test	al, al | ||||
| 	jnz	L_test_for_length_base ; /* if (op != 0) 45.7% */ | ||||
|  | ||||
| 	shr	eax, 16            ; /* output this.val char */ | ||||
| 	stosb | ||||
| 	jmp	L_while_test | ||||
|  | ||||
| ALIGN 4 | ||||
| L_test_for_length_base: | ||||
| 	mov	r14d, eax         ; /* len = this */ | ||||
| 	shr	r14d, 16           ; /* len = this.val */ | ||||
| 	mov	cl, al | ||||
|  | ||||
| 	test	al, 16 | ||||
| 	jz	L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ | ||||
| 	and	cl, 15             ; /* op &= 15 */ | ||||
| 	jz	L_decode_distance    ; /* if (!op) */ | ||||
|  | ||||
| L_add_bits_to_len: | ||||
| 	sub	bl, cl | ||||
| 	xor	eax, eax | ||||
| 	inc	eax | ||||
| 	shl	eax, cl | ||||
| 	dec	eax | ||||
| 	and	eax, edx          ; /* eax &= hold */ | ||||
| 	shr	rdx, cl | ||||
| 	add	r14d, eax         ; /* len += hold & mask[op] */ | ||||
|  | ||||
| L_decode_distance: | ||||
| 	mov	r8, r13           ; /* r8 = dmask */ | ||||
| 	cmp	bl, 32 | ||||
| 	ja	L_get_distance_code  ; /* if (32 < bits) */ | ||||
|  | ||||
| 	lodsd                         ; /* eax = *(uint *)in++ */ | ||||
| 	mov	cl, bl            ; /* cl = bits, needs it for shifting */ | ||||
| 	add	bl, 32             ; /* bits += 32 */ | ||||
| 	shl	rax, cl | ||||
| 	or	rdx, rax          ; /* hold |= *((uint *)in)++ << bits */ | ||||
|  | ||||
| L_get_distance_code: | ||||
| 	and	r8, rdx           ; /* r8 &= hold */ | ||||
| 	mov	eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ | ||||
|  | ||||
| L_dodist: | ||||
| 	mov	r15d, eax         ; /* dist = this */ | ||||
| 	shr	r15d, 16           ; /* dist = this.val */ | ||||
| 	mov	cl, ah | ||||
| 	sub	bl, ah            ; /* bits -= this.bits */ | ||||
| 	shr	rdx, cl           ; /* hold >>= this.bits */ | ||||
| 	mov	cl, al            ; /* cl = this.op */ | ||||
|  | ||||
| 	test	al, 16             ; /* if ((op & 16) == 0) */ | ||||
| 	jz	L_test_for_second_level_dist | ||||
| 	and	cl, 15             ; /* op &= 15 */ | ||||
| 	jz	L_check_dist_one | ||||
|  | ||||
| L_add_bits_to_dist: | ||||
| 	sub	bl, cl | ||||
| 	xor	eax, eax | ||||
| 	inc	eax | ||||
| 	shl	eax, cl | ||||
| 	dec	eax                 ; /* (1 << op) - 1 */ | ||||
| 	and	eax, edx          ; /* eax &= hold */ | ||||
| 	shr	rdx, cl | ||||
| 	add	r15d, eax         ; /* dist += hold & ((1 << op) - 1) */ | ||||
|  | ||||
| L_check_window: | ||||
| 	mov	r8, rsi           ; /* save in so from can use it's reg */ | ||||
| 	mov	rax, rdi | ||||
| 	sub	rax, [rsp+40]      ; /* nbytes = out - beg */ | ||||
|  | ||||
| 	cmp	eax, r15d | ||||
| 	jb	L_clip_window        ; /* if (dist > nbytes) 4.2% */ | ||||
|  | ||||
| 	mov	ecx, r14d         ; /* ecx = len */ | ||||
| 	mov	rsi, rdi | ||||
| 	sub	rsi, r15          ; /* from = out - dist */ | ||||
|  | ||||
| 	sar	ecx, 1 | ||||
| 	jnc	L_copy_two           ; /* if len % 2 == 0 */ | ||||
|  | ||||
| 	rep     movsw | ||||
| 	mov	al, [rsi] | ||||
| 	mov	[rdi], al | ||||
| 	inc	rdi | ||||
|  | ||||
| 	mov	rsi, r8           ; /* move in back to %rsi, toss from */ | ||||
| 	jmp	L_while_test | ||||
|  | ||||
| L_copy_two: | ||||
| 	rep     movsw | ||||
| 	mov	rsi, r8           ; /* move in back to %rsi, toss from */ | ||||
| 	jmp	L_while_test | ||||
|  | ||||
| ALIGN 4 | ||||
| L_check_dist_one: | ||||
| 	cmp	r15d, 1            ; /* if dist 1, is a memset */ | ||||
| 	jne	L_check_window | ||||
| 	cmp	[rsp+40], rdi      ; /* if out == beg, outside window */ | ||||
| 	je	L_check_window | ||||
|  | ||||
| 	mov	ecx, r14d         ; /* ecx = len */ | ||||
| 	mov	al, [rdi-1] | ||||
| 	mov	ah, al | ||||
|  | ||||
| 	sar	ecx, 1 | ||||
| 	jnc	L_set_two | ||||
| 	mov	[rdi], al | ||||
| 	inc	rdi | ||||
|  | ||||
| L_set_two: | ||||
| 	rep     stosw | ||||
| 	jmp	L_while_test | ||||
|  | ||||
| ALIGN 4 | ||||
| L_test_for_second_level_length: | ||||
| 	test	al, 64 | ||||
| 	jnz	L_test_for_end_of_block ; /* if ((op & 64) != 0) */ | ||||
|  | ||||
| 	xor	eax, eax | ||||
| 	inc	eax | ||||
| 	shl	eax, cl | ||||
| 	dec	eax | ||||
| 	and	eax, edx         ; /* eax &= hold */ | ||||
| 	add	eax, r14d        ; /* eax += len */ | ||||
| 	mov	eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ | ||||
| 	jmp	L_dolen | ||||
|  | ||||
| ALIGN 4 | ||||
| L_test_for_second_level_dist: | ||||
| 	test	al, 64 | ||||
| 	jnz	L_invalid_distance_code ; /* if ((op & 64) != 0) */ | ||||
|  | ||||
| 	xor	eax, eax | ||||
| 	inc	eax | ||||
| 	shl	eax, cl | ||||
| 	dec	eax | ||||
| 	and	eax, edx         ; /* eax &= hold */ | ||||
| 	add	eax, r15d        ; /* eax += dist */ | ||||
| 	mov	eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ | ||||
| 	jmp	L_dodist | ||||
|  | ||||
| ALIGN 4 | ||||
| L_clip_window: | ||||
| 	mov	ecx, eax         ; /* ecx = nbytes */ | ||||
| 	mov	eax, [rsp+92]     ; /* eax = wsize, prepare for dist cmp */ | ||||
| 	neg	ecx                ; /* nbytes = -nbytes */ | ||||
|  | ||||
| 	cmp	eax, r15d | ||||
| 	jb	L_invalid_distance_too_far ; /* if (dist > wsize) */ | ||||
|  | ||||
| 	add	ecx, r15d         ; /* nbytes = dist - nbytes */ | ||||
| 	cmp	dword ptr [rsp+96], 0 | ||||
| 	jne	L_wrap_around_window ; /* if (write != 0) */ | ||||
|  | ||||
| 	mov	rsi, [rsp+56]     ; /* from  = window */ | ||||
| 	sub	eax, ecx         ; /* eax  -= nbytes */ | ||||
| 	add	rsi, rax         ; /* from += wsize - nbytes */ | ||||
|  | ||||
| 	mov	eax, r14d        ; /* eax = len */ | ||||
| 	cmp	r14d, ecx | ||||
| 	jbe	L_do_copy           ; /* if (nbytes >= len) */ | ||||
|  | ||||
| 	sub	eax, ecx         ; /* eax -= nbytes */ | ||||
| 	rep     movsb | ||||
| 	mov	rsi, rdi | ||||
| 	sub	rsi, r15         ; /* from = &out[ -dist ] */ | ||||
| 	jmp	L_do_copy | ||||
|  | ||||
| ALIGN 4 | ||||
| L_wrap_around_window: | ||||
| 	mov	eax, [rsp+96]     ; /* eax = write */ | ||||
| 	cmp	ecx, eax | ||||
| 	jbe	L_contiguous_in_window ; /* if (write >= nbytes) */ | ||||
|  | ||||
| 	mov	esi, [rsp+92]     ; /* from  = wsize */ | ||||
| 	add	rsi, [rsp+56]     ; /* from += window */ | ||||
| 	add	rsi, rax         ; /* from += write */ | ||||
| 	sub	rsi, rcx         ; /* from -= nbytes */ | ||||
| 	sub	ecx, eax         ; /* nbytes -= write */ | ||||
|  | ||||
| 	mov	eax, r14d        ; /* eax = len */ | ||||
| 	cmp	eax, ecx | ||||
| 	jbe	L_do_copy           ; /* if (nbytes >= len) */ | ||||
|  | ||||
| 	sub	eax, ecx         ; /* len -= nbytes */ | ||||
| 	rep     movsb | ||||
| 	mov	rsi, [rsp+56]     ; /* from = window */ | ||||
| 	mov	ecx, [rsp+96]     ; /* nbytes = write */ | ||||
| 	cmp	eax, ecx | ||||
| 	jbe	L_do_copy           ; /* if (nbytes >= len) */ | ||||
|  | ||||
| 	sub	eax, ecx         ; /* len -= nbytes */ | ||||
| 	rep     movsb | ||||
| 	mov	rsi, rdi | ||||
| 	sub	rsi, r15         ; /* from = out - dist */ | ||||
| 	jmp	L_do_copy | ||||
|  | ||||
| ALIGN 4 | ||||
| L_contiguous_in_window: | ||||
| 	mov	rsi, [rsp+56]     ; /* rsi = window */ | ||||
| 	add	rsi, rax | ||||
| 	sub	rsi, rcx         ; /* from += write - nbytes */ | ||||
|  | ||||
| 	mov	eax, r14d        ; /* eax = len */ | ||||
| 	cmp	eax, ecx | ||||
| 	jbe	L_do_copy           ; /* if (nbytes >= len) */ | ||||
|  | ||||
| 	sub	eax, ecx         ; /* len -= nbytes */ | ||||
| 	rep     movsb | ||||
| 	mov	rsi, rdi | ||||
| 	sub	rsi, r15         ; /* from = out - dist */ | ||||
| 	jmp	L_do_copy           ; /* if (nbytes >= len) */ | ||||
|  | ||||
| ALIGN 4 | ||||
| L_do_copy: | ||||
| 	mov	ecx, eax         ; /* ecx = len */ | ||||
| 	rep     movsb | ||||
|  | ||||
| 	mov	rsi, r8          ; /* move in back to %esi, toss from */ | ||||
| 	jmp	L_while_test | ||||
|  | ||||
| L_test_for_end_of_block: | ||||
| 	test	al, 32 | ||||
| 	jz	L_invalid_literal_length_code | ||||
| 	mov	dword ptr [rsp+116], 1 | ||||
| 	jmp	L_break_loop_with_status | ||||
|  | ||||
| L_invalid_literal_length_code: | ||||
| 	mov	dword ptr [rsp+116], 2 | ||||
| 	jmp	L_break_loop_with_status | ||||
|  | ||||
| L_invalid_distance_code: | ||||
| 	mov	dword ptr [rsp+116], 3 | ||||
| 	jmp	L_break_loop_with_status | ||||
|  | ||||
| L_invalid_distance_too_far: | ||||
| 	mov	dword ptr [rsp+116], 4 | ||||
| 	jmp	L_break_loop_with_status | ||||
|  | ||||
| L_break_loop: | ||||
| 	mov	dword ptr [rsp+116], 0 | ||||
|  | ||||
| L_break_loop_with_status: | ||||
| ; /* put in, out, bits, and hold back into ar and pop esp */ | ||||
| 	mov	[rsp+16], rsi     ; /* in */ | ||||
| 	mov	[rsp+32], rdi     ; /* out */ | ||||
| 	mov	[rsp+88], ebx     ; /* bits */ | ||||
| 	mov	[rsp+80], rdx     ; /* hold */ | ||||
|  | ||||
| 	mov	rax, [rsp]       ; /* restore rbp and rsp */ | ||||
| 	mov	rbp, [rsp+8] | ||||
| 	mov	rsp, rax | ||||
|  | ||||
|  | ||||
|  | ||||
| 	mov rsi,[rsp-8] | ||||
| 	mov rdi,[rsp-16] | ||||
| 	mov r12,[rsp-24] | ||||
| 	mov r13,[rsp-32] | ||||
| 	mov r14,[rsp-40] | ||||
| 	mov r15,[rsp-48] | ||||
| 	mov rbx,[rsp-56] | ||||
| 	 | ||||
|     ret 0 | ||||
| ;          : | ||||
| ;          : "m" (ar) | ||||
| ;          : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", | ||||
| ;            "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" | ||||
| ;    ); | ||||
|  | ||||
| inffas8664fnc 	ENDP | ||||
| ;_TEXT	ENDS | ||||
| END | ||||
							
								
								
									
										
											BIN
										
									
								
								contrib/masmx64/inffasx64.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								contrib/masmx64/inffasx64.obj
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										28
									
								
								contrib/masmx64/readme.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								contrib/masmx64/readme.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| Summary | ||||
| ------- | ||||
| This directory contains ASM implementations of the functions | ||||
| longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), | ||||
| for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. | ||||
|  | ||||
| gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits | ||||
|    assembly optimized version from Jean-loup Gailly original longest_match function | ||||
|  | ||||
| inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing | ||||
|    original function from Mark Adler | ||||
|  | ||||
| Use instructions | ||||
| ---------------- | ||||
| Copy these files into the zlib source directory. | ||||
|  | ||||
| define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, | ||||
| and inffasx64.obj and gvmat64.obj as object to link. | ||||
|  | ||||
|  | ||||
| Build instructions | ||||
| ------------------ | ||||
| run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) | ||||
|  | ||||
| ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK | ||||
|  | ||||
| You can get Windows 2003 server DDK with ml64 and cl for AMD64 from  | ||||
|   http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) | ||||
							
								
								
									
										2
									
								
								contrib/masmx86/bld_ml32.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								contrib/masmx86/bld_ml32.bat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| ml /coff /Zi /c /Flgvmat32.lst  gvmat32.asm  | ||||
| ml /coff /Zi /c /Flinffas32.lst inffas32.asm  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								contrib/masmx86/gvmat32.obj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								contrib/masmx86/gvmat32.obj
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,206 +1,62 @@ | ||||
| /* 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) | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "deflate.h" | ||||
|  | ||||
| #ifdef ASMV | ||||
| #define NIL 0 | ||||
|  | ||||
| #define UNALIGNED_OK | ||||
|  | ||||
|  | ||||
| /* if your C compiler don't add underline before function name, | ||||
|         define ADD_UNDERLINE_ASMFUNC */ | ||||
| #ifdef ADD_UNDERLINE_ASMFUNC | ||||
| #define longest_match_7fff _longest_match_7fff | ||||
| #define longest_match_686  _longest_match_686 | ||||
| #define cpudetect32        _cpudetect32 | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
| void match_init() | ||||
| { | ||||
| } | ||||
|  | ||||
| unsigned long cpudetect32(); | ||||
|  | ||||
| uInt longest_match_c( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
|  | ||||
| uInt longest_match_7fff( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
| uInt longest_match_686( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
| uInt longest_match( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match)                             /* current match */ | ||||
| { | ||||
|     static uInt iIsPPro=2; | ||||
|  | ||||
|     if ((s->w_mask == 0x7fff) && (iIsPPro==0)) | ||||
|         return longest_match_7fff(s,cur_match); | ||||
|  | ||||
|     if (iIsPPro==1) | ||||
|         return longest_match_686(s,cur_match); | ||||
|  | ||||
|     if (iIsPPro==2) | ||||
|         iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0; | ||||
|  | ||||
|     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 (uInt)best_len; | ||||
|     return s->lookahead; | ||||
| } | ||||
|  | ||||
| #endif /* ASMV */ | ||||
| /* 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) | ||||
|  * | ||||
|  * Read comment at beginning of gvmat32.asm for more information | ||||
|  */ | ||||
|  | ||||
| #if defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) | ||||
| #include "deflate.h" | ||||
|  | ||||
| /* if your C compiler don't add underline before function name, | ||||
|         define ADD_UNDERLINE_ASMFUNC */ | ||||
| #ifdef ADD_UNDERLINE_ASMFUNC | ||||
| #define longest_match_7fff _longest_match_7fff | ||||
| #define longest_match_686  _longest_match_686 | ||||
| #define cpudetect32        _cpudetect32 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| unsigned long cpudetect32(); | ||||
|  | ||||
| uInt longest_match_c( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
|  | ||||
| uInt longest_match_7fff( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
| uInt longest_match_686( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match);                             /* current match */ | ||||
|  | ||||
|  | ||||
| static uInt iIsPPro=2; | ||||
|  | ||||
| void match_init () | ||||
| { | ||||
|     iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0; | ||||
| } | ||||
|  | ||||
| uInt longest_match( | ||||
|     deflate_state *s, | ||||
|     IPos cur_match)                             /* current match */ | ||||
| { | ||||
|     if (iIsPPro!=0) | ||||
|         return longest_match_686(s,cur_match); | ||||
|  | ||||
|     if (s->w_mask != 0x7fff) | ||||
|         return longest_match_686(s,cur_match); | ||||
|  | ||||
|     /* now ((s->w_mask == 0x7fff) && (iIsPPro==0)) */ | ||||
|         return longest_match_7fff(s,cur_match); | ||||
| } | ||||
|  | ||||
|  | ||||
| #endif /* defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) */ | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,3 +1,7 @@ | ||||
| Change in 1.01e (12 feb 05) | ||||
| - Fix in zipOpen2 for globalcomment (Rolf Kalbermatter) | ||||
| - Fix possible memory leak in unzip.c (Zoran Stevanovic) | ||||
|  | ||||
| Change in 1.01b (20 may 04) | ||||
| - Integrate patch from Debian package (submited by Mark Brown) | ||||
| - Add tools mztools from Xavier Roche | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| /* crypt.h -- base code for crypt/uncrypt ZIPfile | ||||
|  | ||||
|  | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    This code is a modified version of crypting code in Infozip distribution | ||||
|  | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| /* ioapi.c -- IO base function header for compress/uncompress .zip | ||||
|    files using zlib + zip or unzip API | ||||
|  | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
| #include <stdio.h> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| /* ioapi.h -- IO base function header for compress/uncompress .zip | ||||
|    files using zlib + zip or unzip API | ||||
|  | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
| #ifndef _ZLIBIOAPI_H | ||||
|   | ||||
| @@ -2,9 +2,9 @@ | ||||
|    files using zlib + zip or unzip API | ||||
|    This IO API version uses the Win32 API (for Microsoft Windows) | ||||
|  | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
| @@ -2,9 +2,9 @@ | ||||
|    files using zlib + zip or unzip API | ||||
|    This IO API version uses the Win32 API (for Microsoft Windows) | ||||
|  | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
| #include <windows.h> | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| /* | ||||
|    miniunz.c | ||||
|    Version 1.01b, May 30th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
|  | ||||
| @@ -317,7 +317,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) | ||||
|  | ||||
|                     printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename); | ||||
|                     ret = scanf("%1s",answer); | ||||
|                     if (ret != 1) | ||||
|                     if (ret != 1)  | ||||
|                     { | ||||
|                        exit(EXIT_FAILURE); | ||||
|                     } | ||||
| @@ -567,7 +567,7 @@ int main(argc,argv) | ||||
|         return do_list(uf); | ||||
|     else if (opt_do_extract==1) | ||||
|     { | ||||
|         if (opt_extractdir && chdir(dirname)) | ||||
|         if (opt_extractdir && chdir(dirname))  | ||||
|         { | ||||
|           printf("Error changing into %s, aborting\n", dirname); | ||||
|           exit(-1); | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| /* | ||||
|    minizip.c | ||||
|    Version 1.01b, May 30th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
| */ | ||||
|  | ||||
| #include <stdio.h> | ||||
|   | ||||
| @@ -62,7 +62,7 @@ uLong* bytesRecovered; | ||||
|         unsigned int fnsize = READ_16(header + 26); /* file name length */ | ||||
|         unsigned int extsize = READ_16(header + 28); /* extra field length */ | ||||
|         filename[0] = extra[0] = '\0'; | ||||
|  | ||||
|          | ||||
|         /* Header */ | ||||
|         if (fwrite(header, 1, 30, fpOut) == 30) { | ||||
|           offset += 30; | ||||
| @@ -70,7 +70,7 @@ uLong* bytesRecovered; | ||||
|           err = Z_ERRNO; | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|          | ||||
|         /* Filename */ | ||||
|         if (fnsize > 0) { | ||||
|           if (fread(filename, 1, fnsize, fpZip) == fnsize) { | ||||
| @@ -103,7 +103,7 @@ uLong* bytesRecovered; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|          | ||||
|         /* Data */ | ||||
|         { | ||||
|           int dataSize = cpsize; | ||||
| @@ -133,7 +133,7 @@ uLong* bytesRecovered; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|  | ||||
|          | ||||
|         /* Central directory entry */ | ||||
|         { | ||||
|           char header[46]; | ||||
| @@ -159,7 +159,7 @@ uLong* bytesRecovered; | ||||
|           /* Header */ | ||||
|           if (fwrite(header, 1, 46, fpOutCD) == 46) { | ||||
|             offsetCD += 46; | ||||
|  | ||||
|              | ||||
|             /* Filename */ | ||||
|             if (fnsize > 0) { | ||||
|               if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { | ||||
| @@ -172,7 +172,7 @@ uLong* bytesRecovered; | ||||
|               err = Z_STREAM_ERROR; | ||||
|               break; | ||||
|             } | ||||
|  | ||||
|              | ||||
|             /* Extra field */ | ||||
|             if (extsize > 0) { | ||||
|               if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { | ||||
| @@ -182,7 +182,7 @@ uLong* bytesRecovered; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|              | ||||
|             /* Comment field */ | ||||
|             if (comsize > 0) { | ||||
|               if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { | ||||
| @@ -192,8 +192,8 @@ uLong* bytesRecovered; | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|  | ||||
|  | ||||
|              | ||||
|              | ||||
|           } else { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
| @@ -225,17 +225,17 @@ uLong* bytesRecovered; | ||||
|       WRITE_32(header + 12, offsetCD);    /* size of CD */ | ||||
|       WRITE_32(header + 16, offset);      /* offset to CD */ | ||||
|       WRITE_16(header + 20, comsize);     /* comment */ | ||||
|  | ||||
|        | ||||
|       /* Header */ | ||||
|       if (fwrite(header, 1, 22, fpOutCD) == 22) { | ||||
|  | ||||
|          | ||||
|         /* Comment field */ | ||||
|         if (comsize > 0) { | ||||
|           if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { | ||||
|             err = Z_ERRNO; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|          | ||||
|       } else { | ||||
|         err = Z_ERRNO; | ||||
|       } | ||||
| @@ -248,7 +248,7 @@ uLong* bytesRecovered; | ||||
|       if (fpOutCD != NULL) { | ||||
|         int nRead; | ||||
|         char buffer[8192]; | ||||
|         while ( (nRead = fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { | ||||
|         while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { | ||||
|           if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { | ||||
|             err = Z_ERRNO; | ||||
|             break; | ||||
| @@ -257,14 +257,14 @@ uLong* bytesRecovered; | ||||
|         fclose(fpOutCD); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|      | ||||
|     /* Close */ | ||||
|     fclose(fpZip); | ||||
|     fclose(fpOut); | ||||
|  | ||||
|      | ||||
|     /* Wipe temporary file */ | ||||
|     (void)remove(fileOutTmp); | ||||
|  | ||||
|      | ||||
|     /* Number of recovered entries */ | ||||
|     if (err == Z_OK) { | ||||
|       if (nRecovered != NULL) { | ||||
|   | ||||
| @@ -17,14 +17,14 @@ extern "C" { | ||||
|  | ||||
| #include "unzip.h" | ||||
|  | ||||
| /* Repair a ZIP file (missing central directory) | ||||
| /* Repair a ZIP file (missing central directory)  | ||||
|    file: file to recover | ||||
|    fileOut: output file after recovery | ||||
|    fileOutTmp: temporary file name used for recovery | ||||
| */ | ||||
| extern int ZEXPORT unzRepair(const char* file, | ||||
|                              const char* fileOut, | ||||
|                              const char* fileOutTmp, | ||||
| extern int ZEXPORT unzRepair(const char* file,  | ||||
|                              const char* fileOut,  | ||||
|                              const char* fileOutTmp,  | ||||
|                              uLong* nRecovered, | ||||
|                              uLong* bytesRecovered); | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* unzip.c -- IO for uncompress .zip files using zlib | ||||
|    Version 1.01d, September 22th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    Read unzip.h for more info | ||||
| */ | ||||
| @@ -1137,7 +1137,10 @@ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) | ||||
|       if (err == Z_OK) | ||||
|         pfile_in_zip_read_info->stream_initialised=1; | ||||
|       else | ||||
|       { | ||||
|         TRYFREE(pfile_in_zip_read_info); | ||||
|         return err; | ||||
|       } | ||||
|         /* windowBits is passed < 0 to tell that there is no zlib header. | ||||
|          * Note that in this case inflate *requires* an extra "dummy" byte | ||||
|          * after the compressed stream in order to complete decompression and | ||||
| @@ -1160,6 +1163,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) | ||||
|  | ||||
|     s->pfile_in_zip_read = pfile_in_zip_read_info; | ||||
|  | ||||
|     s->encrypted = 0; | ||||
|  | ||||
| #    ifndef NOUNCRYPT | ||||
|     if (password != NULL) | ||||
|     { | ||||
|   | ||||
| @@ -1,11 +1,13 @@ | ||||
| /* unzip.h -- IO for uncompress .zip files using zlib | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g | ||||
|      WinZip, InfoZip tools and compatible. | ||||
|    Encryption and multi volume ZipFile (span) are not supported. | ||||
|  | ||||
|    Multi volume ZipFile (span) are not supported. | ||||
|    Encryption compatible with pkzip 2.04g only supported | ||||
|    Old compressions used by old PKZip 1.x are not supported | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,10 @@ | ||||
| /* zip.c -- IO on .zip files using zlib | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    27 Dec 2004 Rolf Kalbermatter | ||||
|    Modification to zipOpen2 to support globalComment retrieval. | ||||
|  | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    Read zip.h for more info | ||||
| */ | ||||
| @@ -143,6 +146,9 @@ typedef struct | ||||
|     uLong begin_pos;            /* position of the beginning of the zipfile */ | ||||
|     uLong add_position_when_writting_offset; | ||||
|     uLong number_entry; | ||||
| #ifndef NO_ADDFILEINEXISTINGZIP | ||||
|     char *globalcomment; | ||||
| #endif | ||||
| } zip_internal; | ||||
|  | ||||
|  | ||||
| @@ -532,6 +538,7 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc | ||||
|  | ||||
|     /* now we add file in a zipfile */ | ||||
| #    ifndef NO_ADDFILEINEXISTINGZIP | ||||
|     ziinit.globalcomment = NULL; | ||||
|     if (append == APPEND_STATUS_ADDINZIP) | ||||
|     { | ||||
|         uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ | ||||
| @@ -592,7 +599,7 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc | ||||
|         if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) | ||||
|             err=ZIP_ERRNO; | ||||
|  | ||||
|         /* zipfile comment length */ | ||||
|         /* zipfile global comment length */ | ||||
|         if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) | ||||
|             err=ZIP_ERRNO; | ||||
|  | ||||
| @@ -606,9 +613,19 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc | ||||
|             return NULL; | ||||
|         } | ||||
|  | ||||
|         if (size_comment>0) | ||||
|         { | ||||
|             ziinit.globalcomment = ALLOC(size_comment+1); | ||||
|             if (ziinit.globalcomment) | ||||
|             { | ||||
|                size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); | ||||
|                ziinit.globalcomment[size_comment]=0; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         byte_before_the_zipfile = central_pos - | ||||
|                                 (offset_central_dir+size_central_dir); | ||||
|         ziinit.add_position_when_writting_offset = byte_before_the_zipfile ; | ||||
|         ziinit.add_position_when_writting_offset = byte_before_the_zipfile; | ||||
|  | ||||
|         { | ||||
|             uLong size_central_dir_to_read = size_central_dir; | ||||
| @@ -641,10 +658,18 @@ extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc | ||||
|                   offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) | ||||
|             err=ZIP_ERRNO; | ||||
|     } | ||||
|  | ||||
|     if (globalcomment) | ||||
|     { | ||||
|       *globalcomment = ziinit.globalcomment; | ||||
|     } | ||||
| #    endif /* !NO_ADDFILEINEXISTINGZIP*/ | ||||
|  | ||||
|     if (err != ZIP_OK) | ||||
|     { | ||||
| #    ifndef NO_ADDFILEINEXISTINGZIP | ||||
|         TRYFREE(ziinit.globalcomment); | ||||
| #    endif /* !NO_ADDFILEINEXISTINGZIP*/ | ||||
|         TRYFREE(zi); | ||||
|         return NULL; | ||||
|     } | ||||
| @@ -1112,7 +1137,7 @@ extern int ZEXPORT zipClose (file, global_comment) | ||||
|     zip_internal* zi; | ||||
|     int err = 0; | ||||
|     uLong size_centraldir = 0; | ||||
|     uLong centraldir_pos_inzip ; | ||||
|     uLong centraldir_pos_inzip; | ||||
|     uInt size_global_comment; | ||||
|     if (file == NULL) | ||||
|         return ZIP_PARAMERROR; | ||||
| @@ -1123,12 +1148,15 @@ extern int ZEXPORT zipClose (file, global_comment) | ||||
|         err = zipCloseFileInZip (file); | ||||
|     } | ||||
|  | ||||
| #ifndef NO_ADDFILEINEXISTINGZIP | ||||
|     if (global_comment==NULL) | ||||
|         global_comment = zi->globalcomment; | ||||
| #endif | ||||
|     if (global_comment==NULL) | ||||
|         size_global_comment = 0; | ||||
|     else | ||||
|         size_global_comment = (uInt)strlen(global_comment); | ||||
|  | ||||
|  | ||||
|     centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); | ||||
|     if (err==ZIP_OK) | ||||
|     { | ||||
| @@ -1182,6 +1210,9 @@ extern int ZEXPORT zipClose (file, global_comment) | ||||
|         if (err == ZIP_OK) | ||||
|             err = ZIP_ERRNO; | ||||
|  | ||||
| #ifndef NO_ADDFILEINEXISTINGZIP | ||||
|     TRYFREE(zi->globalcomment); | ||||
| #endif | ||||
|     TRYFREE(zi); | ||||
|  | ||||
|     return err; | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| /* zip.h -- IO for compress .zip files using zlib | ||||
|    Version 1.01, May 8th, 2004 | ||||
|    Version 1.01e, February 12th, 2005 | ||||
|  | ||||
|    Copyright (C) 1998-2004 Gilles Vollant | ||||
|    Copyright (C) 1998-2005 Gilles Vollant | ||||
|  | ||||
|    This unzip package allow creates .ZIP file, compatible with PKZip 2.04g | ||||
|      WinZip, InfoZip tools and compatible. | ||||
|    Encryption and multi volume ZipFile (span) are not supported. | ||||
|    Multi volume ZipFile (span) are not supported. | ||||
|    Encryption compatible with pkzip 2.04g only supported | ||||
|    Old compressions used by old PKZip 1.x are not supported | ||||
|  | ||||
|   For uncompress .zip file, look at unzip.h | ||||
|   | ||||
| @@ -10,7 +10,7 @@ unit zlibpas; | ||||
| interface | ||||
|  | ||||
| const | ||||
|   ZLIB_VERSION = '1.2.2'; | ||||
|   ZLIB_VERSION = '1.2.3'; | ||||
|  | ||||
| type | ||||
|   alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; | ||||
|   | ||||
| @@ -1,149 +1,275 @@ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <windows.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr) | ||||
| { | ||||
|     FILE* stream; | ||||
|     void* ptr; | ||||
|     int retVal=1; | ||||
|     stream=fopen(filename, "rb"); | ||||
|     if (stream==NULL) | ||||
|         return 0; | ||||
|  | ||||
|     fseek(stream,0,SEEK_END); | ||||
|  | ||||
|     *plFileSize=ftell(stream); | ||||
|     fseek(stream,0,SEEK_SET); | ||||
|     ptr=malloc((*plFileSize)+1); | ||||
|     if (ptr==NULL) | ||||
|         retVal=0; | ||||
|     else | ||||
|     { | ||||
|         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) | ||||
|             retVal=0; | ||||
|     } | ||||
|     fclose(stream); | ||||
|     *pFilePtr=ptr; | ||||
|     return retVal; | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     int BlockSizeCompress=0x8000; | ||||
|     int BlockSizeUncompress=0x8000; | ||||
|     int cprLevel=Z_DEFAULT_COMPRESSION ; | ||||
|     long lFileSize; | ||||
|     unsigned char* FilePtr; | ||||
|     long lBufferSizeCpr; | ||||
|     long lBufferSizeUncpr; | ||||
|     long lCompressedSize=0; | ||||
|     unsigned char* CprPtr; | ||||
|     unsigned char* UncprPtr; | ||||
|     long lSizeCpr,lSizeUncpr; | ||||
|     DWORD dwGetTick; | ||||
|  | ||||
|     if (argc<=1) | ||||
|     { | ||||
|         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) | ||||
|     { | ||||
|         printf("error reading %s\n",argv[1]); | ||||
|         return 1; | ||||
|     } | ||||
|     else printf("file %s read, %u bytes\n",argv[1],lFileSize); | ||||
|  | ||||
|     if (argc>=3) | ||||
|         BlockSizeCompress=atol(argv[2]); | ||||
|  | ||||
|     if (argc>=4) | ||||
|         BlockSizeUncompress=atol(argv[3]); | ||||
|  | ||||
|     if (argc>=5) | ||||
|         cprLevel=(int)atol(argv[4]); | ||||
|  | ||||
|     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; | ||||
|     lBufferSizeUncpr = lBufferSizeCpr; | ||||
|  | ||||
|     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); | ||||
|     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); | ||||
|  | ||||
|     dwGetTick=GetTickCount(); | ||||
|     { | ||||
|         z_stream zcpr; | ||||
|         int ret=Z_OK; | ||||
|         long lOrigToDo = lFileSize; | ||||
|         long lOrigDone = 0; | ||||
|         int step=0; | ||||
|         memset(&zcpr,0,sizeof(z_stream)); | ||||
|         deflateInit(&zcpr,cprLevel); | ||||
|  | ||||
|         zcpr.next_in = FilePtr; | ||||
|         zcpr.next_out = CprPtr; | ||||
|  | ||||
|  | ||||
|         do | ||||
|         { | ||||
|             long all_read_before = zcpr.total_in; | ||||
|             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); | ||||
|             zcpr.avail_out = BlockSizeCompress; | ||||
|             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); | ||||
|             lOrigDone += (zcpr.total_in-all_read_before); | ||||
|             lOrigToDo -= (zcpr.total_in-all_read_before); | ||||
|             step++; | ||||
|         } while (ret==Z_OK); | ||||
|  | ||||
|         lSizeCpr=zcpr.total_out; | ||||
|         deflateEnd(&zcpr); | ||||
|         dwGetTick=GetTickCount()-dwGetTick; | ||||
|         printf("total compress size = %u, in %u step\n",lSizeCpr,step); | ||||
|         printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.); | ||||
|     } | ||||
|  | ||||
|     dwGetTick=GetTickCount(); | ||||
|     { | ||||
|         z_stream zcpr; | ||||
|         int ret=Z_OK; | ||||
|         long lOrigToDo = lSizeCpr; | ||||
|         long lOrigDone = 0; | ||||
|         int step=0; | ||||
|         memset(&zcpr,0,sizeof(z_stream)); | ||||
|         inflateInit(&zcpr); | ||||
|  | ||||
|         zcpr.next_in = CprPtr; | ||||
|         zcpr.next_out = UncprPtr; | ||||
|  | ||||
|  | ||||
|         do | ||||
|         { | ||||
|             long all_read_before = zcpr.total_in; | ||||
|             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); | ||||
|             zcpr.avail_out = BlockSizeUncompress; | ||||
|             ret=inflate(&zcpr,Z_SYNC_FLUSH); | ||||
|             lOrigDone += (zcpr.total_in-all_read_before); | ||||
|             lOrigToDo -= (zcpr.total_in-all_read_before); | ||||
|             step++; | ||||
|         } while (ret==Z_OK); | ||||
|  | ||||
|         lSizeUncpr=zcpr.total_out; | ||||
|         inflateEnd(&zcpr); | ||||
|         dwGetTick=GetTickCount()-dwGetTick; | ||||
|         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); | ||||
|         printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.); | ||||
|     } | ||||
|  | ||||
|     if (lSizeUncpr==lFileSize) | ||||
|     { | ||||
|         if (memcmp(FilePtr,UncprPtr,lFileSize)==0) | ||||
|             printf("compare ok\n"); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
|  | ||||
| } | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <windows.h> | ||||
|  | ||||
| #include "zlib.h" | ||||
|  | ||||
|  | ||||
| void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) | ||||
| { | ||||
|     R->HighPart = A.HighPart - B.HighPart; | ||||
|     if (A.LowPart >= B.LowPart) | ||||
|         R->LowPart = A.LowPart - B.LowPart; | ||||
|     else | ||||
|     { | ||||
|         R->LowPart = A.LowPart - B.LowPart; | ||||
|         R->HighPart --; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #ifdef _M_X64 | ||||
| // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc | ||||
| unsigned __int64 __rdtsc(void); | ||||
| void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) | ||||
| { | ||||
|  //   printf("rdtsc = %I64x\n",__rdtsc()); | ||||
|    pbeginTime64->QuadPart=__rdtsc(); | ||||
| } | ||||
|  | ||||
| LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) | ||||
| { | ||||
|     LARGE_INTEGER LIres; | ||||
|     unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); | ||||
|     LIres.QuadPart=res; | ||||
|    // printf("rdtsc = %I64x\n",__rdtsc()); | ||||
|     return LIres; | ||||
| } | ||||
| #else | ||||
| #ifdef _M_IX86 | ||||
| void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) | ||||
| { | ||||
|     DWORD dwEdx,dwEax; | ||||
|     _asm | ||||
|     { | ||||
|         rdtsc | ||||
|         mov dwEax,eax | ||||
|         mov dwEdx,edx | ||||
|     } | ||||
|     pbeginTime64->LowPart=dwEax; | ||||
|     pbeginTime64->HighPart=dwEdx; | ||||
| } | ||||
|  | ||||
| void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) | ||||
| { | ||||
|     myGetRDTSC32(pbeginTime64); | ||||
| } | ||||
|  | ||||
| LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) | ||||
| { | ||||
|     LARGE_INTEGER LIres,endTime64; | ||||
|     myGetRDTSC32(&endTime64); | ||||
|  | ||||
|     LIres.LowPart=LIres.HighPart=0; | ||||
|     MyDoMinus64(&LIres,endTime64,beginTime64); | ||||
|     return LIres; | ||||
| } | ||||
| #else | ||||
| void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) | ||||
| { | ||||
| } | ||||
|  | ||||
| void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) | ||||
| { | ||||
| } | ||||
|  | ||||
| LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) | ||||
| { | ||||
|     LARGE_INTEGER lr; | ||||
|     lr.QuadPart=0; | ||||
|     return lr; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) | ||||
| { | ||||
|     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) | ||||
|     { | ||||
|         pbeginTime64->LowPart = GetTickCount(); | ||||
|         pbeginTime64->HighPart = 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) | ||||
| { | ||||
|     LARGE_INTEGER endTime64,ticksPerSecond,ticks; | ||||
|     DWORDLONG ticksShifted,tickSecShifted; | ||||
|     DWORD dwLog=16+0; | ||||
|     DWORD dwRet; | ||||
|     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) | ||||
|         dwRet = (GetTickCount() - beginTime64.LowPart)*1; | ||||
|     else | ||||
|     { | ||||
|         MyDoMinus64(&ticks,endTime64,beginTime64); | ||||
|         QueryPerformanceFrequency(&ticksPerSecond); | ||||
|  | ||||
|      | ||||
|         { | ||||
|             ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); | ||||
|             tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); | ||||
|          | ||||
|         }  | ||||
|  | ||||
|         dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); | ||||
|         dwRet *=1; | ||||
|     } | ||||
|     return dwRet; | ||||
| } | ||||
|  | ||||
| int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr) | ||||
| { | ||||
|     FILE* stream; | ||||
|     void* ptr; | ||||
|     int retVal=1; | ||||
|     stream=fopen(filename, "rb"); | ||||
|     if (stream==NULL) | ||||
|         return 0; | ||||
|  | ||||
|     fseek(stream,0,SEEK_END); | ||||
|  | ||||
|     *plFileSize=ftell(stream); | ||||
|     fseek(stream,0,SEEK_SET); | ||||
|     ptr=malloc((*plFileSize)+1); | ||||
|     if (ptr==NULL) | ||||
|         retVal=0; | ||||
|     else | ||||
|     { | ||||
|         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) | ||||
|             retVal=0; | ||||
|     } | ||||
|     fclose(stream); | ||||
|     *pFilePtr=ptr; | ||||
|     return retVal; | ||||
| } | ||||
|  | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     int BlockSizeCompress=0x8000; | ||||
|     int BlockSizeUncompress=0x8000; | ||||
|     int cprLevel=Z_DEFAULT_COMPRESSION ; | ||||
|     long lFileSize; | ||||
|     unsigned char* FilePtr; | ||||
|     long lBufferSizeCpr; | ||||
|     long lBufferSizeUncpr; | ||||
|     long lCompressedSize=0; | ||||
|     unsigned char* CprPtr; | ||||
|     unsigned char* UncprPtr; | ||||
|     long lSizeCpr,lSizeUncpr; | ||||
|     DWORD dwGetTick,dwMsecQP; | ||||
|     LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; | ||||
|  | ||||
|     if (argc<=1) | ||||
|     { | ||||
|         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) | ||||
|     { | ||||
|         printf("error reading %s\n",argv[1]); | ||||
|         return 1; | ||||
|     } | ||||
|     else printf("file %s read, %u bytes\n",argv[1],lFileSize); | ||||
|  | ||||
|     if (argc>=3) | ||||
|         BlockSizeCompress=atol(argv[2]); | ||||
|  | ||||
|     if (argc>=4) | ||||
|         BlockSizeUncompress=atol(argv[3]); | ||||
|  | ||||
|     if (argc>=5) | ||||
|         cprLevel=(int)atol(argv[4]); | ||||
|  | ||||
|     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; | ||||
|     lBufferSizeUncpr = lBufferSizeCpr; | ||||
|  | ||||
|     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); | ||||
|  | ||||
|     BeginCountPerfCounter(&li_qp,TRUE); | ||||
|     dwGetTick=GetTickCount(); | ||||
|     BeginCountRdtsc(&li_rdtsc); | ||||
|     { | ||||
|         z_stream zcpr; | ||||
|         int ret=Z_OK; | ||||
|         long lOrigToDo = lFileSize; | ||||
|         long lOrigDone = 0; | ||||
|         int step=0; | ||||
|         memset(&zcpr,0,sizeof(z_stream)); | ||||
|         deflateInit(&zcpr,cprLevel); | ||||
|  | ||||
|         zcpr.next_in = FilePtr; | ||||
|         zcpr.next_out = CprPtr; | ||||
|  | ||||
|  | ||||
|         do | ||||
|         { | ||||
|             long all_read_before = zcpr.total_in; | ||||
|             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); | ||||
|             zcpr.avail_out = BlockSizeCompress; | ||||
|             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); | ||||
|             lOrigDone += (zcpr.total_in-all_read_before); | ||||
|             lOrigToDo -= (zcpr.total_in-all_read_before); | ||||
|             step++; | ||||
|         } while (ret==Z_OK); | ||||
|  | ||||
|         lSizeCpr=zcpr.total_out; | ||||
|         deflateEnd(&zcpr); | ||||
|         dwGetTick=GetTickCount()-dwGetTick; | ||||
|         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); | ||||
|         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); | ||||
|         printf("total compress size = %u, in %u step\n",lSizeCpr,step); | ||||
|         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); | ||||
|         printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); | ||||
|         printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); | ||||
|     } | ||||
|  | ||||
|     CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); | ||||
|     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); | ||||
|  | ||||
|     BeginCountPerfCounter(&li_qp,TRUE); | ||||
|     dwGetTick=GetTickCount(); | ||||
|     BeginCountRdtsc(&li_rdtsc); | ||||
|     { | ||||
|         z_stream zcpr; | ||||
|         int ret=Z_OK; | ||||
|         long lOrigToDo = lSizeCpr; | ||||
|         long lOrigDone = 0; | ||||
|         int step=0; | ||||
|         memset(&zcpr,0,sizeof(z_stream)); | ||||
|         inflateInit(&zcpr); | ||||
|  | ||||
|         zcpr.next_in = CprPtr; | ||||
|         zcpr.next_out = UncprPtr; | ||||
|  | ||||
|  | ||||
|         do | ||||
|         { | ||||
|             long all_read_before = zcpr.total_in; | ||||
|             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); | ||||
|             zcpr.avail_out = BlockSizeUncompress; | ||||
|             ret=inflate(&zcpr,Z_SYNC_FLUSH); | ||||
|             lOrigDone += (zcpr.total_in-all_read_before); | ||||
|             lOrigToDo -= (zcpr.total_in-all_read_before); | ||||
|             step++; | ||||
|         } while (ret==Z_OK); | ||||
|  | ||||
|         lSizeUncpr=zcpr.total_out; | ||||
|         inflateEnd(&zcpr); | ||||
|         dwGetTick=GetTickCount()-dwGetTick; | ||||
|         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); | ||||
|         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); | ||||
|         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); | ||||
|         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); | ||||
|         printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); | ||||
|         printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); | ||||
|     } | ||||
|  | ||||
|     if (lSizeUncpr==lFileSize) | ||||
|     { | ||||
|         if (memcmp(FilePtr,UncprPtr,lFileSize)==0) | ||||
|             printf("compare ok\n"); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -1,21 +0,0 @@ | ||||
| Microsoft Visual Studio Solution File, Format Version 7.00 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfiguration) = preSolution | ||||
| 		ConfigName.0 = Debug | ||||
| 		ConfigName.1 = Release | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectDependencies) = postSolution | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfiguration) = postSolution | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug.ActiveCfg = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug.Build.0 = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityAddIns) = postSolution | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
							
								
								
									
										10
									
								
								contrib/testzlib/testzlib.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								contrib/testzlib/testzlib.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| To build testzLib with Visual Studio 2005: | ||||
|  | ||||
| copy to a directory file from : | ||||
| - root of zLib tree | ||||
| - contrib/testzlib | ||||
| - contrib/masmx86 | ||||
| - contrib/masmx64 | ||||
| - contrib/vstudio/vc7 | ||||
|  | ||||
| and open testzlib8.sln | ||||
| @@ -1,8 +1,8 @@ | ||||
| Building instructions for the DLL versions of Zlib 1.21 | ||||
| ======================================================= | ||||
| Building instructions for the DLL versions of Zlib 1.2.3 | ||||
| ======================================================== | ||||
|  | ||||
| This directory contains projects that build zlib and minizip using | ||||
| Microsoft Visual C++ 7.0/7.1. | ||||
| Microsoft Visual C++ 7.0/7.1, and Visual C++ . | ||||
|  | ||||
| You don't need to build these projects yourself. You can download the | ||||
| binaries from: | ||||
| @@ -11,18 +11,36 @@ binaries from: | ||||
| More information can be found at this site. | ||||
|  | ||||
|  | ||||
| Build instructions | ||||
| ------------------ | ||||
| - Unzip zlib*.zip and copy the files from contrib\vstudio\vc7, | ||||
|   from contrib\vstudio\masmx86 and from contrib\minizip into the same | ||||
|   directory. | ||||
| Build instructions for Visual Studio 7.x (32 bits) | ||||
| -------------------------------------------------- | ||||
| - Uncompress current zlib, including all contrib/* files | ||||
| - Download the crtdll library from | ||||
|     http://www.winimage.com/zLibDll/crtdll.zip | ||||
|   Unzip crtdll.zip to extract crtdll.lib. | ||||
| - If you are using x86, use the Release target. | ||||
| - Open zlibvc.sln with Microsoft Visual C++ 7.0 or 7.1 | ||||
|   Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc7. | ||||
| - Open contrib\vstudio\vc7\zlibvc.sln with Microsoft Visual C++ 7.x | ||||
|   (Visual Studio .Net 2002 or 2003). | ||||
|  | ||||
| Build instructions for Visual Studio 2005 (32 bits or 64 bits) | ||||
| -------------------------------------------------------------- | ||||
| - Uncompress current zlib, including all contrib/* files | ||||
| - For 32 bits only: download the crtdll library from | ||||
|     http://www.winimage.com/zLibDll/crtdll.zip | ||||
|   Unzip crtdll.zip to extract crtdll.lib on contrib\vstudio\vc8. | ||||
| - Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0 | ||||
|  | ||||
| Build instructions for Visual Studio 2005 64 bits, PSDK compiler | ||||
| ---------------------------------------------------------------- | ||||
| at the time of writing this text file, Visual Studio 2005 (and  | ||||
|   Microsoft Visual C++ 8.0) is on the beta 2 stage. | ||||
| Using you can get the free 64 bits compiler from Platform SDK,  | ||||
|   which is NOT a beta, and compile using the Visual studio 2005 IDE | ||||
| see http://www.winimage.com/misc/sdk64onvs2005/ for instruction | ||||
|  | ||||
| - Uncompress current zlib, including all contrib/* files | ||||
| - start Visual Studio 2005 from a platform SDK command prompt, using | ||||
|   the /useenv switch | ||||
| - Open contrib\vstudio\vc8\zlibvc.sln with Microsoft Visual C++ 8.0 | ||||
|  | ||||
|  | ||||
| Important | ||||
| --------- | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| @@ -19,6 +19,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="TRUE" | ||||
| 				BasicRuntimeChecks="3" | ||||
| @@ -63,6 +64,7 @@ | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="TRUE" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="TRUE" | ||||
| 				RuntimeLibrary="4" | ||||
| @@ -104,7 +106,7 @@ | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> | ||||
| 			<File | ||||
| 				RelativePath="miniunz.c"> | ||||
| 				RelativePath="..\..\minizip\miniunz.c"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| @@ -116,7 +118,7 @@ | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> | ||||
| 		</Filter> | ||||
| 		<File | ||||
| 			RelativePath="zlibwapi.lib"> | ||||
| 			RelativePath="ReleaseDll\zlibwapi.lib"> | ||||
| 		</File> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="TRUE" | ||||
| 				BasicRuntimeChecks="3" | ||||
| @@ -63,6 +64,7 @@ | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="TRUE" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="TRUE" | ||||
| 				RuntimeLibrary="4" | ||||
| @@ -104,7 +106,7 @@ | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> | ||||
| 			<File | ||||
| 				RelativePath="minizip.c"> | ||||
| 				RelativePath="..\..\minizip\minizip.c"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| @@ -116,7 +118,7 @@ | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> | ||||
| 		</Filter> | ||||
| 		<File | ||||
| 			RelativePath="zlibwapi.lib"> | ||||
| 			RelativePath="ReleaseDll\zlibwapi.lib"> | ||||
| 		</File> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="7.00" | ||||
| 	Name="testzlib" | ||||
| 	ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| 	Name="testZlibDll" | ||||
| 	ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}" | ||||
| 	Keyword="Win32Proj"> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| @@ -19,6 +19,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="TRUE" | ||||
| 				BasicRuntimeChecks="3" | ||||
| @@ -63,6 +64,7 @@ | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="TRUE" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="TRUE" | ||||
| 				RuntimeLibrary="4" | ||||
| @@ -104,7 +106,7 @@ | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"> | ||||
| 			<File | ||||
| 				RelativePath="testzlib.c"> | ||||
| 				RelativePath="..\..\testzlib\testzlib.c"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| @@ -116,7 +118,7 @@ | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> | ||||
| 		</Filter> | ||||
| 		<File | ||||
| 			RelativePath="zlibwapi.lib"> | ||||
| 			RelativePath="ReleaseDll\zlibwapi.lib"> | ||||
| 		</File> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| @@ -2,8 +2,8 @@ | ||||
|  | ||||
| #define IDR_VERSION1  1 | ||||
| IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE | ||||
|   FILEVERSION	 1,2,2,1 | ||||
|   PRODUCTVERSION 1,2,2,1 | ||||
|   FILEVERSION	 1,2,3,2 | ||||
|   PRODUCTVERSION 1,2,3,2 | ||||
|   FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK | ||||
|   FILEFLAGS	0 | ||||
|   FILEOS	VOS_DOS_WINDOWS32 | ||||
| @@ -17,12 +17,12 @@ BEGIN | ||||
|  | ||||
|     BEGIN | ||||
|       VALUE "FileDescription", "zlib data compression library\0" | ||||
|       VALUE "FileVersion",	"1.2.2.1\0" | ||||
|       VALUE "FileVersion",	"1.2.3.2\0" | ||||
|       VALUE "InternalName",	"zlib\0" | ||||
|       VALUE "OriginalFilename",	"zlib.dll\0" | ||||
|       VALUE "ProductName",	"ZLib.DLL\0" | ||||
|       VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" | ||||
|       VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0" | ||||
|       VALUE "LegalCopyright", "(C) 1995-2006 Jean-loup Gailly & Mark Adler\0" | ||||
|     END | ||||
|   END | ||||
|   BLOCK "VarFileInfo" | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI" | ||||
| 				ExceptionHandling="FALSE" | ||||
| 				RuntimeLibrary="5" | ||||
| @@ -61,6 +62,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -102,6 +104,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;ASMV;ASMINF" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -117,7 +120,7 @@ | ||||
| 				Name="VCCustomBuildTool"/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="gvmat32.obj inffas32.obj /NODEFAULTLIB " | ||||
| 				AdditionalOptions="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj /NODEFAULTLIB " | ||||
| 				OutputFile=".\zlibstat\zlibstat.lib" | ||||
| 				SuppressStartupBanner="TRUE"/> | ||||
| 			<Tool | ||||
| @@ -144,6 +147,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -182,49 +186,49 @@ | ||||
| 			Name="Source Files" | ||||
| 			Filter=""> | ||||
| 			<File | ||||
| 				RelativePath=".\adler32.c"> | ||||
| 				RelativePath="..\..\..\adler32.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\compress.c"> | ||||
| 				RelativePath="..\..\..\compress.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\crc32.c"> | ||||
| 				RelativePath="..\..\..\crc32.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\deflate.c"> | ||||
| 				RelativePath="..\..\..\deflate.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\gvmat32c.c"> | ||||
| 				RelativePath="..\..\masmx86\gvmat32c.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\gzio.c"> | ||||
| 				RelativePath="..\..\..\gzio.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\infback.c"> | ||||
| 				RelativePath="..\..\..\infback.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inffast.c"> | ||||
| 				RelativePath="..\..\..\inffast.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inflate.c"> | ||||
| 				RelativePath="..\..\..\inflate.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inftrees.c"> | ||||
| 				RelativePath="..\..\..\inftrees.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\ioapi.c"> | ||||
| 				RelativePath="..\..\minizip\ioapi.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\trees.c"> | ||||
| 				RelativePath="..\..\..\trees.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\uncompr.c"> | ||||
| 				RelativePath="..\..\..\uncompr.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\unzip.c"> | ||||
| 				RelativePath="..\..\minizip\unzip.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zip.c"> | ||||
| 				RelativePath="..\..\minizip\zip.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zlib.rc"> | ||||
| @@ -233,7 +237,7 @@ | ||||
| 				RelativePath=".\zlibvc.def"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zutil.c"> | ||||
| 				RelativePath="..\..\..\zutil.c"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
|  | ||||
| VERSION		1.21 | ||||
| VERSION		1.23 | ||||
|  | ||||
| HEAPSIZE	1048576,8192 | ||||
|  | ||||
| @@ -53,7 +53,7 @@ EXPORTS | ||||
|         deflateBound                             @47 | ||||
|         gzclearerr                               @48 | ||||
|         gzungetc                                 @49 | ||||
|         zlibCompileFlags                         @50 | ||||
|         zlibCompileFlags                         @50 | ||||
|         deflatePrime                             @51 | ||||
|  | ||||
|         unzOpen                                  @61 | ||||
|   | ||||
| @@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testZlibDll", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfiguration) = preSolution | ||||
| 		ConfigName.0 = Debug | ||||
| @@ -58,6 +60,16 @@ Global | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm.Build.0 = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.ActiveCfg = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Debug.Build.0 = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.Release.Build.0 = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseAxp.Build.0 = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutAsm.Build.0 = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654C}.ReleaseWithoutCrtdll.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||
| 	EndGlobalSection | ||||
|   | ||||
| @@ -20,6 +20,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF" | ||||
| 				ExceptionHandling="FALSE" | ||||
| 				RuntimeLibrary="1" | ||||
| @@ -35,7 +36,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalOptions="/MACHINE:I386" | ||||
| 				AdditionalDependencies="gvmat32.obj inffas32.obj" | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj" | ||||
| 				OutputFile=".\DebugDll\zlibwapi.dll" | ||||
| 				LinkIncremental="2" | ||||
| 				SuppressStartupBanner="TRUE" | ||||
| @@ -72,10 +73,12 @@ | ||||
| 			IntermediateDirectory=".\zlibDllWithoutAsm" | ||||
| 			ConfigurationType="2" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE"> | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE" | ||||
| 			WholeProgramOptimization="TRUE"> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32,ZLIB_WINAPI" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -134,10 +137,12 @@ | ||||
| 			IntermediateDirectory=".\zlibDllWithoutCrtDll" | ||||
| 			ConfigurationType="2" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE"> | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE" | ||||
| 			WholeProgramOptimization="TRUE"> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -156,7 +161,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalOptions="/MACHINE:I386" | ||||
| 				AdditionalDependencies="gvmat32.obj inffas32.obj " | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj " | ||||
| 				OutputFile=".\zlibDllWithoutCrtDll\zlibwapi.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				SuppressStartupBanner="TRUE" | ||||
| @@ -196,10 +201,12 @@ | ||||
| 			IntermediateDirectory=".\zlibvc__" | ||||
| 			ConfigurationType="2" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE"> | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE" | ||||
| 			WholeProgramOptimization="TRUE"> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32,ZLIB_WINAPI" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -256,10 +263,12 @@ | ||||
| 			IntermediateDirectory=".\ReleaseDll" | ||||
| 			ConfigurationType="2" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE"> | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="FALSE" | ||||
| 			WholeProgramOptimization="TRUE"> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF" | ||||
| 				StringPooling="TRUE" | ||||
| 				ExceptionHandling="FALSE" | ||||
| @@ -278,7 +287,7 @@ | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalOptions="/MACHINE:I386" | ||||
| 				AdditionalDependencies="gvmat32.obj inffas32.obj crtdll.lib" | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj crtdll.lib" | ||||
| 				OutputFile=".\ReleaseDll\zlibwapi.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				SuppressStartupBanner="TRUE" | ||||
| @@ -318,19 +327,19 @@ | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"> | ||||
| 			<File | ||||
| 				RelativePath=".\adler32.c"> | ||||
| 				RelativePath="..\..\..\adler32.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\compress.c"> | ||||
| 				RelativePath="..\..\..\compress.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\crc32.c"> | ||||
| 				RelativePath="..\..\..\crc32.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\deflate.c"> | ||||
| 				RelativePath="..\..\..\deflate.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\gvmat32c.c"> | ||||
| 				RelativePath="..\..\masmx86\gvmat32c.c"> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Win32" | ||||
| 					ExcludedFromBuild="TRUE"> | ||||
| @@ -339,34 +348,34 @@ | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\gzio.c"> | ||||
| 				RelativePath="..\..\..\gzio.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\infback.c"> | ||||
| 				RelativePath="..\..\..\infback.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inffast.c"> | ||||
| 				RelativePath="..\..\..\inffast.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inflate.c"> | ||||
| 				RelativePath="..\..\..\inflate.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inftrees.c"> | ||||
| 				RelativePath="..\..\..\inftrees.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\ioapi.c"> | ||||
| 				RelativePath="..\..\minizip\ioapi.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\iowin32.c"> | ||||
| 				RelativePath="..\..\minizip\iowin32.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\trees.c"> | ||||
| 				RelativePath="..\..\..\trees.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\uncompr.c"> | ||||
| 				RelativePath="..\..\..\uncompr.c"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\unzip.c"> | ||||
| 				RelativePath="..\..\minizip\unzip.c"> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32"> | ||||
| 					<Tool | ||||
| @@ -376,7 +385,7 @@ | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zip.c"> | ||||
| 				RelativePath="..\..\minizip\zip.c"> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32"> | ||||
| 					<Tool | ||||
| @@ -392,38 +401,38 @@ | ||||
| 				RelativePath=".\zlibvc.def"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zutil.c"> | ||||
| 				RelativePath="..\..\..\zutil.c"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;fi;fd"> | ||||
| 			<File | ||||
| 				RelativePath=".\deflate.h"> | ||||
| 				RelativePath="..\..\..\deflate.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\infblock.h"> | ||||
| 				RelativePath="..\..\..\infblock.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\infcodes.h"> | ||||
| 				RelativePath="..\..\..\infcodes.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inffast.h"> | ||||
| 				RelativePath="..\..\..\inffast.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\inftrees.h"> | ||||
| 				RelativePath="..\..\..\inftrees.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\infutil.h"> | ||||
| 				RelativePath="..\..\..\infutil.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zconf.h"> | ||||
| 				RelativePath="..\..\..\zconf.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zlib.h"> | ||||
| 				RelativePath="..\..\..\zlib.h"> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zutil.h"> | ||||
| 				RelativePath="..\..\..\zutil.h"> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
|   | ||||
							
								
								
									
										566
									
								
								contrib/vstudio/vc8/miniunz.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										566
									
								
								contrib/vstudio/vc8/miniunz.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,566 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="8,00" | ||||
| 	Name="miniunz" | ||||
| 	ProjectGUID="{C52F9E7B-498A-42BE-8DB4-85A15694382A}" | ||||
| 	Keyword="Win32Proj" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="x64" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="Itanium" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="x86\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="1" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/miniunz.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|x64" | ||||
| 			OutputDirectory="x64\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/miniunz.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Itanium" | ||||
| 			OutputDirectory="ia64\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/miniunz.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="x86\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|x64" | ||||
| 			OutputDirectory="x64\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Itanium" | ||||
| 			OutputDirectory="ia64\MiniUnzip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\MiniUnzip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/miniunz.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| 	</References> | ||||
| 	<Files> | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\..\minizip\miniunz.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
| </VisualStudioProject> | ||||
							
								
								
									
										563
									
								
								contrib/vstudio/vc8/minizip.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										563
									
								
								contrib/vstudio/vc8/minizip.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,563 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="8,00" | ||||
| 	Name="minizip" | ||||
| 	ProjectGUID="{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| 	Keyword="Win32Proj" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="x64" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="Itanium" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="x86\MiniZip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\MiniZip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="1" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/minizip.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|x64" | ||||
| 			OutputDirectory="x64\$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\$(ConfigurationName)" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/minizip.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Itanium" | ||||
| 			OutputDirectory="ia64\$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\$(ConfigurationName)" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/minizip.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="x86\MiniZip$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\MiniZip$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|x64" | ||||
| 			OutputDirectory="x64\$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\$(ConfigurationName)" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Itanium" | ||||
| 			OutputDirectory="ia64\$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\$(ConfigurationName)" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/minizip.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| 	</References> | ||||
| 	<Files> | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\..\minizip\minizip.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
| </VisualStudioProject> | ||||
							
								
								
									
										948
									
								
								contrib/vstudio/vc8/testzlib.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										948
									
								
								contrib/vstudio/vc8/testzlib.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,948 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="8,00" | ||||
| 	Name="testzlib" | ||||
| 	ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| 	RootNamespace="testzlib" | ||||
| 	Keyword="Win32Proj" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="x64" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="Itanium" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="x86\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="1" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerOutput="4" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/testzlib.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|x64" | ||||
| 			OutputDirectory="x64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj" | ||||
| 				GenerateManifest="false" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Itanium" | ||||
| 			OutputDirectory="ia64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerOutput="4" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/testzlib.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|Win32" | ||||
| 			OutputDirectory="x86\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|x64" | ||||
| 			OutputDirectory="x64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="" | ||||
| 				GenerateManifest="false" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|Itanium" | ||||
| 			OutputDirectory="ia64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="x86\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|x64" | ||||
| 			OutputDirectory="x64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj" | ||||
| 				GenerateManifest="false" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Itanium" | ||||
| 			OutputDirectory="ia64\TestZlib$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			CharacterSet="2" | ||||
| 			WholeProgramOptimization="1" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\.." | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| 	</References> | ||||
| 	<Files> | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\adler32.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\compress.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\crc32.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\deflate.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\masmx86\gvmat32c.c" | ||||
| 				> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Win64 (AMD64)" | ||||
| 					ExcludedFromBuild="TRUE" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win64 (AMD64)" | ||||
| 					ExcludedFromBuild="TRUE" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseAsm|Win64 (AMD64)" | ||||
| 					ExcludedFromBuild="TRUE" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\infback.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\masmx64\inffas8664.c" | ||||
| 				> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inffast.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inflate.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inftrees.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\testzlib\testzlib.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\trees.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\uncompr.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\zutil.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
| </VisualStudioProject> | ||||
							
								
								
									
										567
									
								
								contrib/vstudio/vc8/testzlibdll.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										567
									
								
								contrib/vstudio/vc8/testzlibdll.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,567 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="8,00" | ||||
| 	Name="TestZlibDll" | ||||
| 	ProjectGUID="{C52F9E7B-498A-42BE-8DB4-85A15694366A}" | ||||
| 	Keyword="Win32Proj" | ||||
| 	SignManifests="true" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="x64" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="Itanium" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="x86\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="1" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="4" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/testzlib.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|x64" | ||||
| 			OutputDirectory="x64\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/testzlib.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Itanium" | ||||
| 			OutputDirectory="ia64\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64" | ||||
| 				MinimalRebuild="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="2" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				ProgramDatabaseFile="$(OutDir)/testzlib.pdb" | ||||
| 				SubSystem="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="x86\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|x64" | ||||
| 			OutputDirectory="x64\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="17" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Itanium" | ||||
| 			OutputDirectory="ia64\TestZlibDll$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\TestZlibDll$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="1" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			CharacterSet="2" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="2" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				OmitFramePointers="true" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\minizip" | ||||
| 				PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				BasicRuntimeChecks="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				UsePrecompiledHeader="0" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLinkerTool" | ||||
| 				AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib" | ||||
| 				OutputFile="$(OutDir)/testzlib.exe" | ||||
| 				LinkIncremental="1" | ||||
| 				GenerateManifest="false" | ||||
| 				GenerateDebugInformation="true" | ||||
| 				SubSystem="1" | ||||
| 				OptimizeReferences="2" | ||||
| 				EnableCOMDATFolding="2" | ||||
| 				OptimizeForWindows98="1" | ||||
| 				TargetMachine="5" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManifestTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCAppVerifierTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebDeploymentTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| 	</References> | ||||
| 	<Files> | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\..\testzlib\testzlib.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Header Files" | ||||
| 			Filter="h;hpp;hxx;hm;inl;inc" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 		<Filter | ||||
| 			Name="Resource Files" | ||||
| 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||
| 			> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
| </VisualStudioProject> | ||||
							
								
								
									
										32
									
								
								contrib/vstudio/vc8/zlib.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								contrib/vstudio/vc8/zlib.rc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| #include <windows.h> | ||||
|  | ||||
| #define IDR_VERSION1  1 | ||||
| IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE | ||||
|   FILEVERSION	 1,2,3,0 | ||||
|   PRODUCTVERSION 1,2,3,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.2.3.0\0" | ||||
|       VALUE "InternalName",	"zlib\0" | ||||
|       VALUE "OriginalFilename",	"zlib.dll\0" | ||||
|       VALUE "ProductName",	"ZLib.DLL\0" | ||||
|       VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" | ||||
|       VALUE "LegalCopyright", "(C) 1995-2003 Jean-loup Gailly & Mark Adler\0" | ||||
|     END | ||||
|   END | ||||
|   BLOCK "VarFileInfo" | ||||
|   BEGIN | ||||
|     VALUE "Translation", 0x0409, 1252 | ||||
|   END | ||||
| END | ||||
							
								
								
									
										870
									
								
								contrib/vstudio/vc8/zlibstat.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										870
									
								
								contrib/vstudio/vc8/zlibstat.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,870 @@ | ||||
| <?xml version="1.0" encoding="Windows-1252"?> | ||||
| <VisualStudioProject | ||||
| 	ProjectType="Visual C++" | ||||
| 	Version="8,00" | ||||
| 	Name="zlibstat" | ||||
| 	ProjectGUID="{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" | ||||
| 	> | ||||
| 	<Platforms> | ||||
| 		<Platform | ||||
| 			Name="Win32" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="x64" | ||||
| 		/> | ||||
| 		<Platform | ||||
| 			Name="Itanium" | ||||
| 		/> | ||||
| 	</Platforms> | ||||
| 	<ToolFiles> | ||||
| 	</ToolFiles> | ||||
| 	<Configurations> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Win32" | ||||
| 			OutputDirectory="x86\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="1" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|x64" | ||||
| 			OutputDirectory="x64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Debug|Itanium" | ||||
| 			OutputDirectory="ia64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				Optimization="0" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="3" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 				Detect64BitPortabilityProblems="true" | ||||
| 				DebugInformationFormat="1" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Win32" | ||||
| 			OutputDirectory="x86\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ASMV;ASMINF" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB" | ||||
| 				AdditionalDependencies="..\..\masmx86\gvmat32.obj ..\..\masmx86\inffas32.obj " | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|x64" | ||||
| 			OutputDirectory="x64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ASMV;ASMINF;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB" | ||||
| 				AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj " | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="Release|Itanium" | ||||
| 			OutputDirectory="ia64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|Win32" | ||||
| 			OutputDirectory="x86\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="0" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|x64" | ||||
| 			OutputDirectory="x64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="3" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 		<Configuration | ||||
| 			Name="ReleaseWithoutAsm|Itanium" | ||||
| 			OutputDirectory="ia64\ZlibStat$(ConfigurationName)" | ||||
| 			IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp" | ||||
| 			ConfigurationType="4" | ||||
| 			InheritedPropertySheets="UpgradeFromVC70.vsprops" | ||||
| 			UseOfMFC="0" | ||||
| 			ATLMinimizesCRunTimeLibraryUsage="false" | ||||
| 			> | ||||
| 			<Tool | ||||
| 				Name="VCPreBuildEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCustomBuildTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXMLDataGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCWebServiceProxyGeneratorTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCMIDLTool" | ||||
| 				TargetEnvironment="2" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCCLCompilerTool" | ||||
| 				InlineFunctionExpansion="1" | ||||
| 				AdditionalIncludeDirectories="..\..\..;..\..\masmx86" | ||||
| 				PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;WIN64" | ||||
| 				StringPooling="true" | ||||
| 				ExceptionHandling="0" | ||||
| 				RuntimeLibrary="2" | ||||
| 				BufferSecurityCheck="false" | ||||
| 				EnableFunctionLevelLinking="true" | ||||
| 				PrecompiledHeaderFile="$(IntDir)/zlibstat.pch" | ||||
| 				AssemblerListingLocation="$(IntDir)\" | ||||
| 				ObjectFile="$(IntDir)\" | ||||
| 				ProgramDataBaseFileName="$(OutDir)\" | ||||
| 				WarningLevel="3" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCManagedResourceCompilerTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCResourceCompilerTool" | ||||
| 				Culture="1036" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPreLinkEventTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCLibrarianTool" | ||||
| 				AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB" | ||||
| 				OutputFile="$(OutDir)\zlibstat.lib" | ||||
| 				SuppressStartupBanner="true" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCALinkTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCXDCMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCBscMakeTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCFxCopTool" | ||||
| 			/> | ||||
| 			<Tool | ||||
| 				Name="VCPostBuildEventTool" | ||||
| 			/> | ||||
| 		</Configuration> | ||||
| 	</Configurations> | ||||
| 	<References> | ||||
| 	</References> | ||||
| 	<Files> | ||||
| 		<Filter | ||||
| 			Name="Source Files" | ||||
| 			> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\adler32.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\compress.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\crc32.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\deflate.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\masmx86\gvmat32c.c" | ||||
| 				> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|x64" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\gzio.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\infback.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\masmx64\inffas8664.c" | ||||
| 				> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Win32" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="ReleaseWithoutAsm|Itanium" | ||||
| 					ExcludedFromBuild="true" | ||||
| 					> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 					/> | ||||
| 				</FileConfiguration> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inffast.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inflate.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\inftrees.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\minizip\ioapi.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\trees.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\uncompr.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\minizip\unzip.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\minizip\zip.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zlib.rc" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath=".\zlibvc.def" | ||||
| 				> | ||||
| 			</File> | ||||
| 			<File | ||||
| 				RelativePath="..\..\..\zutil.c" | ||||
| 				> | ||||
| 			</File> | ||||
| 		</Filter> | ||||
| 	</Files> | ||||
| 	<Globals> | ||||
| 	</Globals> | ||||
| </VisualStudioProject> | ||||
							
								
								
									
										92
									
								
								contrib/vstudio/vc8/zlibvc.def
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								contrib/vstudio/vc8/zlibvc.def
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
|  | ||||
| VERSION		1.23 | ||||
|  | ||||
| HEAPSIZE	1048576,8192 | ||||
|  | ||||
| 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 | ||||
|         compress2                                @39 | ||||
|         gzputs                                   @40 | ||||
|         gzgets                                   @41 | ||||
|         inflateCopy                              @42 | ||||
|         inflateBackInit_                         @43 | ||||
|         inflateBack                              @44 | ||||
|         inflateBackEnd                           @45 | ||||
|         compressBound                            @46 | ||||
|         deflateBound                             @47 | ||||
|         gzclearerr                               @48 | ||||
|         gzungetc                                 @49 | ||||
|         zlibCompileFlags                         @50 | ||||
|         deflatePrime                             @51 | ||||
|  | ||||
|         unzOpen                                  @61 | ||||
|         unzClose                                 @62 | ||||
|         unzGetGlobalInfo                         @63 | ||||
|         unzGetCurrentFileInfo                    @64 | ||||
|         unzGoToFirstFile                         @65 | ||||
|         unzGoToNextFile                          @66 | ||||
|         unzOpenCurrentFile                       @67 | ||||
|         unzReadCurrentFile                       @68 | ||||
|         unzOpenCurrentFile3                      @69 | ||||
|         unztell                                  @70 | ||||
|         unzeof                                   @71 | ||||
|         unzCloseCurrentFile                      @72 | ||||
|         unzGetGlobalComment                      @73 | ||||
|         unzStringFileNameCompare                 @74 | ||||
|         unzLocateFile                            @75 | ||||
|         unzGetLocalExtrafield                    @76 | ||||
|         unzOpen2                                 @77 | ||||
|         unzOpenCurrentFile2                      @78 | ||||
|         unzOpenCurrentFilePassword               @79 | ||||
|  | ||||
|         zipOpen                                  @80 | ||||
|         zipOpenNewFileInZip                      @81 | ||||
|         zipWriteInFileInZip                      @82 | ||||
|         zipCloseFileInZip                        @83 | ||||
|         zipClose                                 @84 | ||||
|         zipOpenNewFileInZip2                     @86 | ||||
|         zipCloseFileInZipRaw                     @87 | ||||
|         zipOpen2                                 @88 | ||||
|         zipOpenNewFileInZip3                     @89 | ||||
|  | ||||
|         unzGetFilePos                            @100 | ||||
|         unzGoToFilePos                           @101 | ||||
|  | ||||
|         fill_win32_filefunc                      @110 | ||||
							
								
								
									
										144
									
								
								contrib/vstudio/vc8/zlibvc.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								contrib/vstudio/vc8/zlibvc.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 9.00 | ||||
| # Visual Studio 2005 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Itanium = Debug|Itanium | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Debug|x64 = Debug|x64 | ||||
| 		Release|Itanium = Release|Itanium | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 		Release|x64 = Release|x64 | ||||
| 		ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium | ||||
| 		ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 | ||||
| 		ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = ReleaseWithoutAsm|x64 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = ReleaseWithoutAsm|x64 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 | ||||
| 		{8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 | ||||
| 		{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 | ||||
| 		{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium | ||||
| 		{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Itanium | ||||
| 		{C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|Itanium | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
							
								
								
									
										1219
									
								
								contrib/vstudio/vc8/zlibvc.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1219
									
								
								contrib/vstudio/vc8/zlibvc.vcproj
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										17
									
								
								crc32.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								crc32.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* crc32.c -- compute the CRC-32 of a data stream | ||||
|  * Copyright (C) 1995-2004 Mark Adler | ||||
|  * Copyright (C) 1995-2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  * | ||||
|  * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster | ||||
| @@ -64,6 +64,11 @@ | ||||
| #  define TBLS 1 | ||||
| #endif /* BYFOUR */ | ||||
|  | ||||
| /* Local functions for crc concatenation */ | ||||
| local unsigned long gf2_matrix_times OF((unsigned long *mat, | ||||
|                                          unsigned long vec)); | ||||
| local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); | ||||
|  | ||||
| #ifdef DYNAMIC_CRC_TABLE | ||||
|  | ||||
| local volatile int crc_table_empty = 1; | ||||
| @@ -72,10 +77,6 @@ local void make_crc_table OF((void)); | ||||
| #ifdef MAKECRCH | ||||
|    local void write_table OF((FILE *, const unsigned long FAR *)); | ||||
| #endif /* MAKECRCH */ | ||||
| local unsigned long gf2_matrix_times OF((unsigned long *mat, | ||||
|                                          unsigned long vec)); | ||||
| local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); | ||||
|  | ||||
| /* | ||||
|   Generate tables 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. | ||||
| @@ -273,7 +274,7 @@ local unsigned long crc32_little(crc, buf, len) | ||||
|         len--; | ||||
|     } | ||||
|  | ||||
|     buf4 = (const u4 FAR *)buf; | ||||
|     buf4 = (const u4 FAR *)(const void FAR *)buf; | ||||
|     while (len >= 32) { | ||||
|         DOLIT32; | ||||
|         len -= 32; | ||||
| @@ -313,7 +314,7 @@ local unsigned long crc32_big(crc, buf, len) | ||||
|         len--; | ||||
|     } | ||||
|  | ||||
|     buf4 = (const u4 FAR *)buf; | ||||
|     buf4 = (const u4 FAR *)(const void FAR *)buf; | ||||
|     buf4--; | ||||
|     while (len >= 32) { | ||||
|         DOBIG32; | ||||
| @@ -369,7 +370,7 @@ local void gf2_matrix_square(square, mat) | ||||
| uLong ZEXPORT crc32_combine(crc1, crc2, len2) | ||||
|     uLong crc1; | ||||
|     uLong crc2; | ||||
|     uLong len2; | ||||
|     z_off_t len2; | ||||
| { | ||||
|     int n; | ||||
|     unsigned long row; | ||||
|   | ||||
							
								
								
									
										188
									
								
								deflate.c
									
									
									
									
									
								
							
							
						
						
									
										188
									
								
								deflate.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* deflate.c -- compress data using the deflation algorithm | ||||
|  * Copyright (C) 1995-2004 Jean-loup Gailly. | ||||
|  * Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -52,7 +52,7 @@ | ||||
| #include "deflate.h" | ||||
|  | ||||
| const char deflate_copyright[] = | ||||
|    " deflate 1.2.2.1 Copyright 1995-2004 Jean-loup Gailly "; | ||||
|    " deflate 1.2.3.2 Copyright 1995-2006 Jean-loup Gailly "; | ||||
| /* | ||||
|   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 | ||||
| @@ -264,7 +264,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, | ||||
| #endif | ||||
|     if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || | ||||
|         windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || | ||||
|         strategy < 0 || strategy > Z_RLE) { | ||||
|         strategy < 0 || strategy > Z_FIXED) { | ||||
|         return Z_STREAM_ERROR; | ||||
|     } | ||||
|     if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */ | ||||
| @@ -334,9 +334,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) | ||||
|     if (length < MIN_MATCH) return Z_OK; | ||||
|     if (length > MAX_DIST(s)) { | ||||
|         length = MAX_DIST(s); | ||||
| #ifndef USE_DICT_HEAD | ||||
|         dictionary += dictLength - length; /* use the tail of the dictionary */ | ||||
| #endif | ||||
|     } | ||||
|     zmemcpy(s->window, dictionary, length); | ||||
|     s->strstart = length; | ||||
| @@ -432,7 +430,7 @@ int ZEXPORT deflateParams(strm, level, strategy) | ||||
| #else | ||||
|     if (level == Z_DEFAULT_COMPRESSION) level = 6; | ||||
| #endif | ||||
|     if (level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) { | ||||
|     if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { | ||||
|         return Z_STREAM_ERROR; | ||||
|     } | ||||
|     func = configuration_table[s->level].func; | ||||
| @@ -452,6 +450,25 @@ int ZEXPORT deflateParams(strm, level, strategy) | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| /* ========================================================================= */ | ||||
| int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) | ||||
|     z_streamp strm; | ||||
|     int good_length; | ||||
|     int max_lazy; | ||||
|     int nice_length; | ||||
|     int max_chain; | ||||
| { | ||||
|     deflate_state *s; | ||||
|  | ||||
|     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | ||||
|     s = strm->state; | ||||
|     s->good_match = good_length; | ||||
|     s->max_lazy_match = max_lazy; | ||||
|     s->nice_match = nice_length; | ||||
|     s->max_chain_length = max_chain; | ||||
|     return Z_OK; | ||||
| } | ||||
|  | ||||
| /* ========================================================================= | ||||
|  * For the default windowBits of 15 and memLevel of 8, this function returns | ||||
|  * a close to exact, as well as small, upper bound on the compressed size. | ||||
| @@ -464,33 +481,65 @@ int ZEXPORT deflateParams(strm, level, strategy) | ||||
|  * resulting from using fixed blocks instead of stored blocks, which deflate | ||||
|  * can emit on compressed data for some combinations of the parameters. | ||||
|  * | ||||
|  * This function could be more sophisticated to provide closer upper bounds | ||||
|  * for every combination of windowBits and memLevel, as well as wrap. | ||||
|  * But even the conservative upper bound of about 14% expansion does not | ||||
|  * seem onerous for output buffer allocation. | ||||
|  * This function could be more sophisticated to provide closer upper bounds for | ||||
|  * every combination of windowBits and memLevel.  But even the conservative | ||||
|  * upper bound of about 14% expansion does not seem onerous for output buffer | ||||
|  * allocation. | ||||
|  */ | ||||
| uLong ZEXPORT deflateBound(strm, sourceLen) | ||||
|     z_streamp strm; | ||||
|     uLong sourceLen; | ||||
| { | ||||
|     deflate_state *s; | ||||
|     uLong destLen; | ||||
|     uLong complen, wraplen; | ||||
|     Bytef *str; | ||||
|  | ||||
|     /* conservative upper bound */ | ||||
|     destLen = sourceLen + | ||||
|               ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; | ||||
|     /* conservative upper bound for compressed data */ | ||||
|     complen = sourceLen + | ||||
|               ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; | ||||
|  | ||||
|     /* if can't get parameters, return conservative bound */ | ||||
|     /* if can't get parameters, return conservative bound plus zlib wrapper */ | ||||
|     if (strm == Z_NULL || strm->state == Z_NULL) | ||||
|         return destLen; | ||||
|         return complen + 6; | ||||
|  | ||||
|     /* compute wrapper length */ | ||||
|     s = strm->state; | ||||
|     switch (s->wrap) { | ||||
|     case 0:                                 /* raw deflate */ | ||||
|         wraplen = 0; | ||||
|         break; | ||||
|     case 1:                                 /* zlib wrapper */ | ||||
|         wraplen = 6 + (s->strstart ? 4 : 0); | ||||
|         break; | ||||
|     case 2:                                 /* gzip wrapper */ | ||||
|         wraplen = 18; | ||||
|         if (s->gzhead != NULL) {            /* user-supplied gzip header */ | ||||
|             if (s->gzhead->extra != NULL) | ||||
|                 wraplen += 2 + s->gzhead->extra_len; | ||||
|             str = s->gzhead->name; | ||||
|             if (str != NULL) | ||||
|                 do { | ||||
|                     wraplen++; | ||||
|                 } while (*str++); | ||||
|             str = s->gzhead->comment; | ||||
|             if (str != NULL) | ||||
|                 do { | ||||
|                     wraplen++; | ||||
|                 } while (*str++); | ||||
|             if (s->gzhead->hcrc) | ||||
|                 wraplen += 2; | ||||
|         } | ||||
|         break; | ||||
|     default:                                /* for compiler happiness */ | ||||
|         wraplen = 6; | ||||
|     } | ||||
|  | ||||
|     /* if not default parameters, return conservative bound */ | ||||
|     s = strm->state; | ||||
|     if (s->w_bits != 15 || s->hash_bits != 8 + 7) | ||||
|         return destLen; | ||||
|         return complen + wraplen; | ||||
|  | ||||
|     /* default settings: return tight bound for that case */ | ||||
|     return compressBound(sourceLen); | ||||
|     return compressBound(sourceLen) - 6 + wraplen; | ||||
| } | ||||
|  | ||||
| /* ========================================================================= | ||||
| @@ -573,7 +622,7 @@ int ZEXPORT deflate (strm, flush) | ||||
|                 put_byte(s, s->level == 9 ? 2 : | ||||
|                             (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? | ||||
|                              4 : 0)); | ||||
|                 put_byte(s, 255); | ||||
|                 put_byte(s, OS_CODE); | ||||
|                 s->status = BUSY_STATE; | ||||
|             } | ||||
|             else { | ||||
| @@ -583,10 +632,10 @@ int ZEXPORT deflate (strm, flush) | ||||
|                             (s->gzhead->name == Z_NULL ? 0 : 8) + | ||||
|                             (s->gzhead->comment == Z_NULL ? 0 : 16) | ||||
|                         ); | ||||
|                 put_byte(s, s->gzhead->time & 0xff); | ||||
|                 put_byte(s, (s->gzhead->time >> 8) & 0xff); | ||||
|                 put_byte(s, (s->gzhead->time >> 16) & 0xff); | ||||
|                 put_byte(s, (s->gzhead->time >> 24) & 0xff); | ||||
|                 put_byte(s, (Byte)(s->gzhead->time & 0xff)); | ||||
|                 put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); | ||||
|                 put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); | ||||
|                 put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); | ||||
|                 put_byte(s, s->level == 9 ? 2 : | ||||
|                             (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? | ||||
|                              4 : 0)); | ||||
| @@ -634,7 +683,7 @@ int ZEXPORT deflate (strm, flush) | ||||
| #ifdef GZIP | ||||
|     if (s->status == EXTRA_STATE) { | ||||
|         if (s->gzhead->extra != NULL) { | ||||
|             int beg = s->pending;   /* start of bytes to update crc */ | ||||
|             uInt beg = s->pending;  /* start of bytes to update crc */ | ||||
|  | ||||
|             while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { | ||||
|                 if (s->pending == s->pending_buf_size) { | ||||
| @@ -662,7 +711,7 @@ int ZEXPORT deflate (strm, flush) | ||||
|     } | ||||
|     if (s->status == NAME_STATE) { | ||||
|         if (s->gzhead->name != NULL) { | ||||
|             int beg = s->pending;   /* start of bytes to update crc */ | ||||
|             uInt beg = s->pending;  /* start of bytes to update crc */ | ||||
|             int val; | ||||
|  | ||||
|             do { | ||||
| @@ -693,7 +742,7 @@ int ZEXPORT deflate (strm, flush) | ||||
|     } | ||||
|     if (s->status == COMMENT_STATE) { | ||||
|         if (s->gzhead->comment != NULL) { | ||||
|             int beg = s->pending;   /* start of bytes to update crc */ | ||||
|             uInt beg = s->pending;  /* start of bytes to update crc */ | ||||
|             int val; | ||||
|  | ||||
|             do { | ||||
| @@ -725,8 +774,8 @@ int ZEXPORT deflate (strm, flush) | ||||
|             if (s->pending + 2 > s->pending_buf_size) | ||||
|                 flush_pending(strm); | ||||
|             if (s->pending + 2 <= s->pending_buf_size) { | ||||
|                 put_byte(s, strm->adler & 0xff); | ||||
|                 put_byte(s, (strm->adler >> 8) & 0xff); | ||||
|                 put_byte(s, (Byte)(strm->adler & 0xff)); | ||||
|                 put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); | ||||
|                 strm->adler = crc32(0L, Z_NULL, 0); | ||||
|                 s->status = BUSY_STATE; | ||||
|             } | ||||
| @@ -892,12 +941,12 @@ int ZEXPORT deflateCopy (dest, source) | ||||
|  | ||||
|     ss = source->state; | ||||
|  | ||||
|     *dest = *source; | ||||
|     zmemcpy(dest, source, sizeof(z_stream)); | ||||
|  | ||||
|     ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); | ||||
|     if (ds == Z_NULL) return Z_MEM_ERROR; | ||||
|     dest->state = (struct internal_state FAR *) ds; | ||||
|     *ds = *ss; | ||||
|     zmemcpy(ds, ss, sizeof(deflate_state)); | ||||
|     ds->strm = dest; | ||||
|  | ||||
|     ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); | ||||
| @@ -986,9 +1035,11 @@ local void lm_init (s) | ||||
|     s->match_length = s->prev_length = MIN_MATCH-1; | ||||
|     s->match_available = 0; | ||||
|     s->ins_h = 0; | ||||
| #ifndef FASTEST | ||||
| #ifdef ASMV | ||||
|     match_init(); /* initialize the asm code */ | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #ifndef FASTEST | ||||
| @@ -1057,7 +1108,12 @@ local uInt longest_match(s, cur_match) | ||||
|         match = s->window + cur_match; | ||||
|  | ||||
|         /* Skip to next match if the match length cannot increase | ||||
|          * or if the match length is less than 2: | ||||
|          * or if the match length is less than 2.  Note that the checks below | ||||
|          * for insufficient lookahead only occur occasionally for performance | ||||
|          * reasons.  Therefore uninitialized memory will be accessed, and | ||||
|          * conditional jumps will be made that depend on those values. | ||||
|          * However the length of the match is limited to the lookahead, so | ||||
|          * the output of deflate is not affected by the uninitialized values. | ||||
|          */ | ||||
| #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) | ||||
|         /* This code assumes sizeof(unsigned short) == 2. Do not use | ||||
| @@ -1279,6 +1335,7 @@ local void fill_window(s) | ||||
|                later. (Using level 0 permanently is not an optimal usage of | ||||
|                zlib, so we don't care about this pathological case.) | ||||
|              */ | ||||
|             /* %%% avoid this when Z_RLE */ | ||||
|             n = s->hash_size; | ||||
|             p = &s->head[n]; | ||||
|             do { | ||||
| @@ -1457,12 +1514,12 @@ local block_state deflate_fast(s, flush) | ||||
|              * of the string with itself at the start of the input file). | ||||
|              */ | ||||
| #ifdef FASTEST | ||||
|             if ((s->strategy < Z_HUFFMAN_ONLY) || | ||||
|             if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || | ||||
|                 (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { | ||||
|                 s->match_length = longest_match_fast (s, hash_head); | ||||
|             } | ||||
| #else | ||||
|             if (s->strategy < Z_HUFFMAN_ONLY) { | ||||
|             if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { | ||||
|                 s->match_length = longest_match (s, hash_head); | ||||
|             } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { | ||||
|                 s->match_length = longest_match_fast (s, hash_head); | ||||
| @@ -1566,7 +1623,7 @@ local block_state deflate_slow(s, flush) | ||||
|              * of window index 0 (in particular we have to avoid a match | ||||
|              * of the string with itself at the start of the input file). | ||||
|              */ | ||||
|             if (s->strategy < Z_HUFFMAN_ONLY) { | ||||
|             if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { | ||||
|                 s->match_length = longest_match (s, hash_head); | ||||
|             } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { | ||||
|                 s->match_length = longest_match_fast (s, hash_head); | ||||
| @@ -1648,3 +1705,64 @@ local block_state deflate_slow(s, flush) | ||||
|     return flush == Z_FINISH ? finish_done : block_done; | ||||
| } | ||||
| #endif /* FASTEST */ | ||||
|  | ||||
| #if 0 | ||||
| /* =========================================================================== | ||||
|  * For Z_RLE, simply look for runs of bytes, generate matches only of distance | ||||
|  * one.  Do not maintain a hash table.  (It will be regenerated if this run of | ||||
|  * deflate switches away from Z_RLE.) | ||||
|  */ | ||||
| local block_state deflate_rle(s, flush) | ||||
|     deflate_state *s; | ||||
|     int flush; | ||||
| { | ||||
|     int bflush;         /* set if current block must be flushed */ | ||||
|     uInt run;           /* length of run */ | ||||
|     uInt max;           /* maximum length of run */ | ||||
|     uInt prev;          /* byte at distance one to match */ | ||||
|     Bytef *scan;        /* scan for end of run */ | ||||
|  | ||||
|     for (;;) { | ||||
|         /* Make sure that we always have enough lookahead, except | ||||
|          * at the end of the input file. We need MAX_MATCH bytes | ||||
|          * for the longest encodable run. | ||||
|          */ | ||||
|         if (s->lookahead < MAX_MATCH) { | ||||
|             fill_window(s); | ||||
|             if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { | ||||
|                 return need_more; | ||||
|             } | ||||
|             if (s->lookahead == 0) break; /* flush the current block */ | ||||
|         } | ||||
|  | ||||
|         /* See how many times the previous byte repeats */ | ||||
|         run = 0; | ||||
|         if (s->strstart > 0) {      /* if there is a previous byte, that is */ | ||||
|             max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; | ||||
|             scan = s->window + s->strstart - 1; | ||||
|             prev = *scan++; | ||||
|             do { | ||||
|                 if (*scan++ != prev) | ||||
|                     break; | ||||
|             } while (++run < max); | ||||
|         } | ||||
|  | ||||
|         /* Emit match if have run of MIN_MATCH or longer, else emit literal */ | ||||
|         if (run >= MIN_MATCH) { | ||||
|             check_match(s, s->strstart, s->strstart - 1, run); | ||||
|             _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); | ||||
|             s->lookahead -= run; | ||||
|             s->strstart += run; | ||||
|         } else { | ||||
|             /* No match, output a literal byte */ | ||||
|             Tracevv((stderr,"%c", s->window[s->strstart])); | ||||
|             _tr_tally_lit (s, s->window[s->strstart], bflush); | ||||
|             s->lookahead--; | ||||
|             s->strstart++; | ||||
|         } | ||||
|         if (bflush) FLUSH_BLOCK(s, 0); | ||||
|     } | ||||
|     FLUSH_BLOCK(s, flush == Z_FINISH); | ||||
|     return flush == Z_FINISH ? finish_done : block_done; | ||||
| } | ||||
| #endif | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* deflate.h -- internal compression state | ||||
|  * Copyright (C) 1995-2004 Jean-loup Gailly | ||||
|  * Copyright (C) 1995-2005 Jean-loup Gailly | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -97,10 +97,10 @@ typedef struct internal_state { | ||||
|     Bytef *pending_buf;  /* output still pending */ | ||||
|     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 */ | ||||
|     uInt   pending;      /* nb of bytes in the pending buffer */ | ||||
|     int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */ | ||||
|     gz_headerp  gzhead;  /* gzip header information to write */ | ||||
|     int   gzindex;       /* where in extra, name, or comment */ | ||||
|     uInt   gzindex;      /* where in extra, name, or comment */ | ||||
|     Byte  method;        /* STORED (for zip only) or DEFLATED */ | ||||
|     int   last_flush;    /* value of flush param for previous deflate call */ | ||||
|  | ||||
|   | ||||
							
								
								
									
										619
									
								
								doc/rfc1950.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										619
									
								
								doc/rfc1950.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,619 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Network Working Group                                         P. Deutsch | ||||
| Request for Comments: 1950                           Aladdin Enterprises | ||||
| Category: Informational                                      J-L. Gailly | ||||
|                                                                 Info-ZIP | ||||
|                                                                 May 1996 | ||||
|  | ||||
|  | ||||
|          ZLIB Compressed Data Format Specification version 3.3 | ||||
|  | ||||
| Status of This Memo | ||||
|  | ||||
|    This memo provides information for the Internet community.  This memo | ||||
|    does not specify an Internet standard of any kind.  Distribution of | ||||
|    this memo is unlimited. | ||||
|  | ||||
| IESG Note: | ||||
|  | ||||
|    The IESG takes no position on the validity of any Intellectual | ||||
|    Property Rights statements contained in this document. | ||||
|  | ||||
| Notices | ||||
|  | ||||
|    Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly | ||||
|  | ||||
|    Permission is granted to copy and distribute this document for any | ||||
|    purpose and without charge, including translations into other | ||||
|    languages and incorporation into compilations, provided that the | ||||
|    copyright notice and this notice are preserved, and that any | ||||
|    substantive changes or deletions from the original are clearly | ||||
|    marked. | ||||
|  | ||||
|    A pointer to the latest version of this and related documentation in | ||||
|    HTML format can be found at the URL | ||||
|    <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. | ||||
|  | ||||
| Abstract | ||||
|  | ||||
|    This specification defines a lossless compressed data format.  The | ||||
|    data can be produced or consumed, even for an arbitrarily long | ||||
|    sequentially presented input data stream, using only an a priori | ||||
|    bounded amount of intermediate storage.  The format presently uses | ||||
|    the DEFLATE compression method but can be easily extended to use | ||||
|    other compression methods.  It can be implemented readily in a manner | ||||
|    not covered by patents.  This specification also defines the ADLER-32 | ||||
|    checksum (an extension and improvement of the Fletcher checksum), | ||||
|    used for detection of data corruption, and provides an algorithm for | ||||
|    computing it. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 1] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
| Table of Contents | ||||
|  | ||||
|    1. Introduction ................................................... 2 | ||||
|       1.1. Purpose ................................................... 2 | ||||
|       1.2. Intended audience ......................................... 3 | ||||
|       1.3. Scope ..................................................... 3 | ||||
|       1.4. Compliance ................................................ 3 | ||||
|       1.5.  Definitions of terms and conventions used ................ 3 | ||||
|       1.6. Changes from previous versions ............................ 3 | ||||
|    2. Detailed specification ......................................... 3 | ||||
|       2.1. Overall conventions ....................................... 3 | ||||
|       2.2. Data format ............................................... 4 | ||||
|       2.3. Compliance ................................................ 7 | ||||
|    3. References ..................................................... 7 | ||||
|    4. Source code .................................................... 8 | ||||
|    5. Security Considerations ........................................ 8 | ||||
|    6. Acknowledgements ............................................... 8 | ||||
|    7. Authors' Addresses ............................................. 8 | ||||
|    8. Appendix: Rationale ............................................ 9 | ||||
|    9. Appendix: Sample code ..........................................10 | ||||
|  | ||||
| 1. Introduction | ||||
|  | ||||
|    1.1. Purpose | ||||
|  | ||||
|       The purpose of this specification is to define a lossless | ||||
|       compressed data format that: | ||||
|  | ||||
|           * Is independent of CPU type, operating system, file system, | ||||
|             and character set, and hence can be used for interchange; | ||||
|  | ||||
|           * Can be produced or consumed, even for an arbitrarily long | ||||
|             sequentially presented input data stream, using only an a | ||||
|             priori bounded amount of intermediate storage, and hence can | ||||
|             be used in data communications or similar structures such as | ||||
|             Unix filters; | ||||
|  | ||||
|           * Can use a number of different compression methods; | ||||
|  | ||||
|           * Can be implemented readily in a manner not covered by | ||||
|             patents, and hence can be practiced freely. | ||||
|  | ||||
|       The data format defined by this specification does not attempt to | ||||
|       allow random access to compressed data. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 2] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|    1.2. Intended audience | ||||
|  | ||||
|       This specification is intended for use by implementors of software | ||||
|       to compress data into zlib format and/or decompress data from zlib | ||||
|       format. | ||||
|  | ||||
|       The text of the specification assumes a basic background in | ||||
|       programming at the level of bits and other primitive data | ||||
|       representations. | ||||
|  | ||||
|    1.3. Scope | ||||
|  | ||||
|       The specification specifies a compressed data format that can be | ||||
|       used for in-memory compression of a sequence of arbitrary bytes. | ||||
|  | ||||
|    1.4. Compliance | ||||
|  | ||||
|       Unless otherwise indicated below, a compliant decompressor must be | ||||
|       able to accept and decompress any data set that conforms to all | ||||
|       the specifications presented here; a compliant compressor must | ||||
|       produce data sets that conform to all the specifications presented | ||||
|       here. | ||||
|  | ||||
|    1.5.  Definitions of terms and conventions used | ||||
|  | ||||
|       byte: 8 bits stored or transmitted as a unit (same as an octet). | ||||
|       (For this specification, a byte is exactly 8 bits, even on | ||||
|       machines which store a character on a number of bits different | ||||
|       from 8.) See below, for the numbering of bits within a byte. | ||||
|  | ||||
|    1.6. Changes from previous versions | ||||
|  | ||||
|       Version 3.1 was the first public release of this specification. | ||||
|       In version 3.2, some terminology was changed and the Adler-32 | ||||
|       sample code was rewritten for clarity.  In version 3.3, the | ||||
|       support for a preset dictionary was introduced, and the | ||||
|       specification was converted to RFC style. | ||||
|  | ||||
| 2. Detailed specification | ||||
|  | ||||
|    2.1. Overall conventions | ||||
|  | ||||
|       In the diagrams below, a box like this: | ||||
|  | ||||
|          +---+ | ||||
|          |   | <-- the vertical bars might be missing | ||||
|          +---+ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 3] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|       represents one byte; a box like this: | ||||
|  | ||||
|          +==============+ | ||||
|          |              | | ||||
|          +==============+ | ||||
|  | ||||
|       represents a variable number of bytes. | ||||
|  | ||||
|       Bytes stored within a computer do not have a "bit order", since | ||||
|       they are always treated as a unit.  However, a byte considered as | ||||
|       an integer between 0 and 255 does have a most- and least- | ||||
|       significant bit, and since we write numbers with the most- | ||||
|       significant digit on the left, we also write bytes with the most- | ||||
|       significant bit on the left.  In the diagrams below, we number the | ||||
|       bits of a byte so that bit 0 is the least-significant bit, i.e., | ||||
|       the bits are numbered: | ||||
|  | ||||
|          +--------+ | ||||
|          |76543210| | ||||
|          +--------+ | ||||
|  | ||||
|       Within a computer, a number may occupy multiple bytes.  All | ||||
|       multi-byte numbers in the format described here are stored with | ||||
|       the MOST-significant byte first (at the lower memory address). | ||||
|       For example, the decimal number 520 is stored as: | ||||
|  | ||||
|              0     1 | ||||
|          +--------+--------+ | ||||
|          |00000010|00001000| | ||||
|          +--------+--------+ | ||||
|           ^        ^ | ||||
|           |        | | ||||
|           |        + less significant byte = 8 | ||||
|           + more significant byte = 2 x 256 | ||||
|  | ||||
|    2.2. Data format | ||||
|  | ||||
|       A zlib stream has the following structure: | ||||
|  | ||||
|            0   1 | ||||
|          +---+---+ | ||||
|          |CMF|FLG|   (more-->) | ||||
|          +---+---+ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 4] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|       (if FLG.FDICT set) | ||||
|  | ||||
|            0   1   2   3 | ||||
|          +---+---+---+---+ | ||||
|          |     DICTID    |   (more-->) | ||||
|          +---+---+---+---+ | ||||
|  | ||||
|          +=====================+---+---+---+---+ | ||||
|          |...compressed data...|    ADLER32    | | ||||
|          +=====================+---+---+---+---+ | ||||
|  | ||||
|       Any data which may appear after ADLER32 are not part of the zlib | ||||
|       stream. | ||||
|  | ||||
|       CMF (Compression Method and flags) | ||||
|          This byte is divided into a 4-bit compression method and a 4- | ||||
|          bit information field depending on the compression method. | ||||
|  | ||||
|             bits 0 to 3  CM     Compression method | ||||
|             bits 4 to 7  CINFO  Compression info | ||||
|  | ||||
|       CM (Compression method) | ||||
|          This identifies the compression method used in the file. CM = 8 | ||||
|          denotes the "deflate" compression method with a window size up | ||||
|          to 32K.  This is the method used by gzip and PNG (see | ||||
|          references [1] and [2] in Chapter 3, below, for the reference | ||||
|          documents).  CM = 15 is reserved.  It might be used in a future | ||||
|          version of this specification to indicate the presence of an | ||||
|          extra field before the compressed data. | ||||
|  | ||||
|       CINFO (Compression info) | ||||
|          For CM = 8, CINFO is the base-2 logarithm of the LZ77 window | ||||
|          size, minus eight (CINFO=7 indicates a 32K window size). Values | ||||
|          of CINFO above 7 are not allowed in this version of the | ||||
|          specification.  CINFO is not defined in this specification for | ||||
|          CM not equal to 8. | ||||
|  | ||||
|       FLG (FLaGs) | ||||
|          This flag byte is divided as follows: | ||||
|  | ||||
|             bits 0 to 4  FCHECK  (check bits for CMF and FLG) | ||||
|             bit  5       FDICT   (preset dictionary) | ||||
|             bits 6 to 7  FLEVEL  (compression level) | ||||
|  | ||||
|          The FCHECK value must be such that CMF and FLG, when viewed as | ||||
|          a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), | ||||
|          is a multiple of 31. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 5] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|       FDICT (Preset dictionary) | ||||
|          If FDICT is set, a DICT dictionary identifier is present | ||||
|          immediately after the FLG byte. The dictionary is a sequence of | ||||
|          bytes which are initially fed to the compressor without | ||||
|          producing any compressed output. DICT is the Adler-32 checksum | ||||
|          of this sequence of bytes (see the definition of ADLER32 | ||||
|          below).  The decompressor can use this identifier to determine | ||||
|          which dictionary has been used by the compressor. | ||||
|  | ||||
|       FLEVEL (Compression level) | ||||
|          These flags are available for use by specific compression | ||||
|          methods.  The "deflate" method (CM = 8) sets these flags as | ||||
|          follows: | ||||
|  | ||||
|             0 - compressor used fastest algorithm | ||||
|             1 - compressor used fast algorithm | ||||
|             2 - compressor used default algorithm | ||||
|             3 - compressor used maximum compression, slowest algorithm | ||||
|  | ||||
|          The information in FLEVEL is not needed for decompression; it | ||||
|          is there to indicate if recompression might be worthwhile. | ||||
|  | ||||
|       compressed data | ||||
|          For compression method 8, the compressed data is stored in the | ||||
|          deflate compressed data format as described in the document | ||||
|          "DEFLATE Compressed Data Format Specification" by L. Peter | ||||
|          Deutsch. (See reference [3] in Chapter 3, below) | ||||
|  | ||||
|          Other compressed data formats are not specified in this version | ||||
|          of the zlib specification. | ||||
|  | ||||
|       ADLER32 (Adler-32 checksum) | ||||
|          This contains a checksum value of the uncompressed data | ||||
|          (excluding any dictionary data) computed according to Adler-32 | ||||
|          algorithm. This algorithm is a 32-bit extension and improvement | ||||
|          of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 | ||||
|          standard. See references [4] and [5] in Chapter 3, below) | ||||
|  | ||||
|          Adler-32 is composed of two sums accumulated per byte: s1 is | ||||
|          the sum of all bytes, s2 is the sum of all s1 values. Both sums | ||||
|          are done modulo 65521. s1 is initialized to 1, s2 to zero.  The | ||||
|          Adler-32 checksum is stored as s2*65536 + s1 in most- | ||||
|          significant-byte first (network) order. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 6] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|    2.3. Compliance | ||||
|  | ||||
|       A compliant compressor must produce streams with correct CMF, FLG | ||||
|       and ADLER32, but need not support preset dictionaries.  When the | ||||
|       zlib data format is used as part of another standard data format, | ||||
|       the compressor may use only preset dictionaries that are specified | ||||
|       by this other data format.  If this other format does not use the | ||||
|       preset dictionary feature, the compressor must not set the FDICT | ||||
|       flag. | ||||
|  | ||||
|       A compliant decompressor must check CMF, FLG, and ADLER32, and | ||||
|       provide an error indication if any of these have incorrect values. | ||||
|       A compliant decompressor must give an error indication if CM is | ||||
|       not one of the values defined in this specification (only the | ||||
|       value 8 is permitted in this version), since another value could | ||||
|       indicate the presence of new features that would cause subsequent | ||||
|       data to be interpreted incorrectly.  A compliant decompressor must | ||||
|       give an error indication if FDICT is set and DICTID is not the | ||||
|       identifier of a known preset dictionary.  A decompressor may | ||||
|       ignore FLEVEL and still be compliant.  When the zlib data format | ||||
|       is being used as a part of another standard format, a compliant | ||||
|       decompressor must support all the preset dictionaries specified by | ||||
|       the other format. When the other format does not use the preset | ||||
|       dictionary feature, a compliant decompressor must reject any | ||||
|       stream in which the FDICT flag is set. | ||||
|  | ||||
| 3. References | ||||
|  | ||||
|    [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", | ||||
|        available in ftp://ftp.uu.net/pub/archiving/zip/doc/ | ||||
|  | ||||
|    [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", | ||||
|        available in ftp://ftp.uu.net/graphics/png/documents/ | ||||
|  | ||||
|    [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", | ||||
|        available in ftp://ftp.uu.net/pub/archiving/zip/doc/ | ||||
|  | ||||
|    [4] Fletcher, J. G., "An Arithmetic Checksum for Serial | ||||
|        Transmissions," IEEE Transactions on Communications, Vol. COM-30, | ||||
|        No. 1, January 1982, pp. 247-252. | ||||
|  | ||||
|    [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," | ||||
|        November, 1993, pp. 144, 145. (Available from | ||||
|        gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 7] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
| 4. Source code | ||||
|  | ||||
|    Source code for a C language implementation of a "zlib" compliant | ||||
|    library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. | ||||
|  | ||||
| 5. Security Considerations | ||||
|  | ||||
|    A decoder that fails to check the ADLER32 checksum value may be | ||||
|    subject to undetected data corruption. | ||||
|  | ||||
| 6. Acknowledgements | ||||
|  | ||||
|    Trademarks cited in this document are the property of their | ||||
|    respective owners. | ||||
|  | ||||
|    Jean-Loup Gailly and Mark Adler designed the zlib format and wrote | ||||
|    the related software described in this specification.  Glenn | ||||
|    Randers-Pehrson converted this document to RFC and HTML format. | ||||
|  | ||||
| 7. Authors' Addresses | ||||
|  | ||||
|    L. Peter Deutsch | ||||
|    Aladdin Enterprises | ||||
|    203 Santa Margarita Ave. | ||||
|    Menlo Park, CA 94025 | ||||
|  | ||||
|    Phone: (415) 322-0103 (AM only) | ||||
|    FAX:   (415) 322-1734 | ||||
|    EMail: <ghost@aladdin.com> | ||||
|  | ||||
|  | ||||
|    Jean-Loup Gailly | ||||
|  | ||||
|    EMail: <gzip@prep.ai.mit.edu> | ||||
|  | ||||
|    Questions about the technical content of this specification can be | ||||
|    sent by email to | ||||
|  | ||||
|    Jean-Loup Gailly <gzip@prep.ai.mit.edu> and | ||||
|    Mark Adler <madler@alumni.caltech.edu> | ||||
|  | ||||
|    Editorial comments on this specification can be sent by email to | ||||
|  | ||||
|    L. Peter Deutsch <ghost@aladdin.com> and | ||||
|    Glenn Randers-Pehrson <randeg@alumni.rpi.edu> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 8] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
| 8. Appendix: Rationale | ||||
|  | ||||
|    8.1. Preset dictionaries | ||||
|  | ||||
|       A preset dictionary is specially useful to compress short input | ||||
|       sequences. The compressor can take advantage of the dictionary | ||||
|       context to encode the input in a more compact manner. The | ||||
|       decompressor can be initialized with the appropriate context by | ||||
|       virtually decompressing a compressed version of the dictionary | ||||
|       without producing any output. However for certain compression | ||||
|       algorithms such as the deflate algorithm this operation can be | ||||
|       achieved without actually performing any decompression. | ||||
|  | ||||
|       The compressor and the decompressor must use exactly the same | ||||
|       dictionary. The dictionary may be fixed or may be chosen among a | ||||
|       certain number of predefined dictionaries, according to the kind | ||||
|       of input data. The decompressor can determine which dictionary has | ||||
|       been chosen by the compressor by checking the dictionary | ||||
|       identifier. This document does not specify the contents of | ||||
|       predefined dictionaries, since the optimal dictionaries are | ||||
|       application specific. Standard data formats using this feature of | ||||
|       the zlib specification must precisely define the allowed | ||||
|       dictionaries. | ||||
|  | ||||
|    8.2. The Adler-32 algorithm | ||||
|  | ||||
|       The Adler-32 algorithm is much faster than the CRC32 algorithm yet | ||||
|       still provides an extremely low probability of undetected errors. | ||||
|  | ||||
|       The modulo on unsigned long accumulators can be delayed for 5552 | ||||
|       bytes, so the modulo operation time is negligible.  If the bytes | ||||
|       are a, b, c, the second sum is 3a + 2b + c + 3, and so is position | ||||
|       and order sensitive, unlike the first sum, which is just a | ||||
|       checksum.  That 65521 is prime is important to avoid a possible | ||||
|       large class of two-byte errors that leave the check unchanged. | ||||
|       (The Fletcher checksum uses 255, which is not prime and which also | ||||
|       makes the Fletcher check insensitive to single byte changes 0 <-> | ||||
|       255.) | ||||
|  | ||||
|       The sum s1 is initialized to 1 instead of zero to make the length | ||||
|       of the sequence part of s2, so that the length does not have to be | ||||
|       checked separately. (Any sequence of zeroes has a Fletcher | ||||
|       checksum of zero.) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                      [Page 9] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
| 9. Appendix: Sample code | ||||
|  | ||||
|    The following C code computes the Adler-32 checksum of a data buffer. | ||||
|    It is written for clarity, not for speed.  The sample code is in the | ||||
|    ANSI C programming language. Non C users may find it easier to read | ||||
|    with these hints: | ||||
|  | ||||
|       &      Bitwise AND operator. | ||||
|       >>     Bitwise right shift operator. When applied to an | ||||
|              unsigned quantity, as here, right shift inserts zero bit(s) | ||||
|              at the left. | ||||
|       <<     Bitwise left shift operator. Left shift inserts zero | ||||
|              bit(s) at the right. | ||||
|       ++     "n++" increments the variable n. | ||||
|       %      modulo operator: a % b is the remainder of a divided by b. | ||||
|  | ||||
|       #define BASE 65521 /* largest prime smaller than 65536 */ | ||||
|  | ||||
|       /* | ||||
|          Update a running Adler-32 checksum with the bytes buf[0..len-1] | ||||
|        and return the updated checksum. The Adler-32 checksum should be | ||||
|        initialized to 1. | ||||
|  | ||||
|        Usage example: | ||||
|  | ||||
|          unsigned long adler = 1L; | ||||
|  | ||||
|          while (read_buffer(buffer, length) != EOF) { | ||||
|            adler = update_adler32(adler, buffer, length); | ||||
|          } | ||||
|          if (adler != original_adler) error(); | ||||
|       */ | ||||
|       unsigned long update_adler32(unsigned long adler, | ||||
|          unsigned char *buf, int len) | ||||
|       { | ||||
|         unsigned long s1 = adler & 0xffff; | ||||
|         unsigned long s2 = (adler >> 16) & 0xffff; | ||||
|         int n; | ||||
|  | ||||
|         for (n = 0; n < len; n++) { | ||||
|           s1 = (s1 + buf[n]) % BASE; | ||||
|           s2 = (s2 + s1)     % BASE; | ||||
|         } | ||||
|         return (s2 << 16) + s1; | ||||
|       } | ||||
|  | ||||
|       /* Return the adler32 of the bytes buf[0..len-1] */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                     [Page 10] | ||||
|  | ||||
| RFC 1950       ZLIB Compressed Data Format Specification        May 1996 | ||||
|  | ||||
|  | ||||
|       unsigned long adler32(unsigned char *buf, int len) | ||||
|       { | ||||
|         return update_adler32(1L, buf, len); | ||||
|       } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch & Gailly             Informational                     [Page 11] | ||||
|  | ||||
							
								
								
									
										955
									
								
								doc/rfc1951.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										955
									
								
								doc/rfc1951.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,955 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Network Working Group                                         P. Deutsch | ||||
| Request for Comments: 1951                           Aladdin Enterprises | ||||
| Category: Informational                                         May 1996 | ||||
|  | ||||
|  | ||||
|         DEFLATE Compressed Data Format Specification version 1.3 | ||||
|  | ||||
| Status of This Memo | ||||
|  | ||||
|    This memo provides information for the Internet community.  This memo | ||||
|    does not specify an Internet standard of any kind.  Distribution of | ||||
|    this memo is unlimited. | ||||
|  | ||||
| IESG Note: | ||||
|  | ||||
|    The IESG takes no position on the validity of any Intellectual | ||||
|    Property Rights statements contained in this document. | ||||
|  | ||||
| Notices | ||||
|  | ||||
|    Copyright (c) 1996 L. Peter Deutsch | ||||
|  | ||||
|    Permission is granted to copy and distribute this document for any | ||||
|    purpose and without charge, including translations into other | ||||
|    languages and incorporation into compilations, provided that the | ||||
|    copyright notice and this notice are preserved, and that any | ||||
|    substantive changes or deletions from the original are clearly | ||||
|    marked. | ||||
|  | ||||
|    A pointer to the latest version of this and related documentation in | ||||
|    HTML format can be found at the URL | ||||
|    <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. | ||||
|  | ||||
| Abstract | ||||
|  | ||||
|    This specification defines a lossless compressed data format that | ||||
|    compresses data using a combination of the LZ77 algorithm and Huffman | ||||
|    coding, with efficiency comparable to the best currently available | ||||
|    general-purpose compression methods.  The data can be produced or | ||||
|    consumed, even for an arbitrarily long sequentially presented input | ||||
|    data stream, using only an a priori bounded amount of intermediate | ||||
|    storage.  The format can be implemented readily in a manner not | ||||
|    covered by patents. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 1] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
| Table of Contents | ||||
|  | ||||
|    1. Introduction ................................................... 2 | ||||
|       1.1. Purpose ................................................... 2 | ||||
|       1.2. Intended audience ......................................... 3 | ||||
|       1.3. Scope ..................................................... 3 | ||||
|       1.4. Compliance ................................................ 3 | ||||
|       1.5.  Definitions of terms and conventions used ................ 3 | ||||
|       1.6. Changes from previous versions ............................ 4 | ||||
|    2. Compressed representation overview ............................. 4 | ||||
|    3. Detailed specification ......................................... 5 | ||||
|       3.1. Overall conventions ....................................... 5 | ||||
|           3.1.1. Packing into bytes .................................. 5 | ||||
|       3.2. Compressed block format ................................... 6 | ||||
|           3.2.1. Synopsis of prefix and Huffman coding ............... 6 | ||||
|           3.2.2. Use of Huffman coding in the "deflate" format ....... 7 | ||||
|           3.2.3. Details of block format ............................. 9 | ||||
|           3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 | ||||
|           3.2.5. Compressed blocks (length and distance codes) ...... 11 | ||||
|           3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 | ||||
|           3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 | ||||
|       3.3. Compliance ............................................... 14 | ||||
|    4. Compression algorithm details ................................. 14 | ||||
|    5. References .................................................... 16 | ||||
|    6. Security Considerations ....................................... 16 | ||||
|    7. Source code ................................................... 16 | ||||
|    8. Acknowledgements .............................................. 16 | ||||
|    9. Author's Address .............................................. 17 | ||||
|  | ||||
| 1. Introduction | ||||
|  | ||||
|    1.1. Purpose | ||||
|  | ||||
|       The purpose of this specification is to define a lossless | ||||
|       compressed data format that: | ||||
|           * Is independent of CPU type, operating system, file system, | ||||
|             and character set, and hence can be used for interchange; | ||||
|           * Can be produced or consumed, even for an arbitrarily long | ||||
|             sequentially presented input data stream, using only an a | ||||
|             priori bounded amount of intermediate storage, and hence | ||||
|             can be used in data communications or similar structures | ||||
|             such as Unix filters; | ||||
|           * Compresses data with efficiency comparable to the best | ||||
|             currently available general-purpose compression methods, | ||||
|             and in particular considerably better than the "compress" | ||||
|             program; | ||||
|           * Can be implemented readily in a manner not covered by | ||||
|             patents, and hence can be practiced freely; | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 2] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|           * Is compatible with the file format produced by the current | ||||
|             widely used gzip utility, in that conforming decompressors | ||||
|             will be able to read data produced by the existing gzip | ||||
|             compressor. | ||||
|  | ||||
|       The data format defined by this specification does not attempt to: | ||||
|  | ||||
|           * Allow random access to compressed data; | ||||
|           * Compress specialized data (e.g., raster graphics) as well | ||||
|             as the best currently available specialized algorithms. | ||||
|  | ||||
|       A simple counting argument shows that no lossless compression | ||||
|       algorithm can compress every possible input data set.  For the | ||||
|       format defined here, the worst case expansion is 5 bytes per 32K- | ||||
|       byte block, i.e., a size increase of 0.015% for large data sets. | ||||
|       English text usually compresses by a factor of 2.5 to 3; | ||||
|       executable files usually compress somewhat less; graphical data | ||||
|       such as raster images may compress much more. | ||||
|  | ||||
|    1.2. Intended audience | ||||
|  | ||||
|       This specification is intended for use by implementors of software | ||||
|       to compress data into "deflate" format and/or decompress data from | ||||
|       "deflate" format. | ||||
|  | ||||
|       The text of the specification assumes a basic background in | ||||
|       programming at the level of bits and other primitive data | ||||
|       representations.  Familiarity with the technique of Huffman coding | ||||
|       is helpful but not required. | ||||
|  | ||||
|    1.3. Scope | ||||
|  | ||||
|       The specification specifies a method for representing a sequence | ||||
|       of bytes as a (usually shorter) sequence of bits, and a method for | ||||
|       packing the latter bit sequence into bytes. | ||||
|  | ||||
|    1.4. Compliance | ||||
|  | ||||
|       Unless otherwise indicated below, a compliant decompressor must be | ||||
|       able to accept and decompress any data set that conforms to all | ||||
|       the specifications presented here; a compliant compressor must | ||||
|       produce data sets that conform to all the specifications presented | ||||
|       here. | ||||
|  | ||||
|    1.5.  Definitions of terms and conventions used | ||||
|  | ||||
|       Byte: 8 bits stored or transmitted as a unit (same as an octet). | ||||
|       For this specification, a byte is exactly 8 bits, even on machines | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 3] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|       which store a character on a number of bits different from eight. | ||||
|       See below, for the numbering of bits within a byte. | ||||
|  | ||||
|       String: a sequence of arbitrary bytes. | ||||
|  | ||||
|    1.6. Changes from previous versions | ||||
|  | ||||
|       There have been no technical changes to the deflate format since | ||||
|       version 1.1 of this specification.  In version 1.2, some | ||||
|       terminology was changed.  Version 1.3 is a conversion of the | ||||
|       specification to RFC style. | ||||
|  | ||||
| 2. Compressed representation overview | ||||
|  | ||||
|    A compressed data set consists of a series of blocks, corresponding | ||||
|    to successive blocks of input data.  The block sizes are arbitrary, | ||||
|    except that non-compressible blocks are limited to 65,535 bytes. | ||||
|  | ||||
|    Each block is compressed using a combination of the LZ77 algorithm | ||||
|    and Huffman coding. The Huffman trees for each block are independent | ||||
|    of those for previous or subsequent blocks; the LZ77 algorithm may | ||||
|    use a reference to a duplicated string occurring in a previous block, | ||||
|    up to 32K input bytes before. | ||||
|  | ||||
|    Each block consists of two parts: a pair of Huffman code trees that | ||||
|    describe the representation of the compressed data part, and a | ||||
|    compressed data part.  (The Huffman trees themselves are compressed | ||||
|    using Huffman encoding.)  The compressed data consists of a series of | ||||
|    elements of two types: literal bytes (of strings that have not been | ||||
|    detected as duplicated within the previous 32K input bytes), and | ||||
|    pointers to duplicated strings, where a pointer is represented as a | ||||
|    pair <length, backward distance>.  The representation used in the | ||||
|    "deflate" format limits distances to 32K bytes and lengths to 258 | ||||
|    bytes, but does not limit the size of a block, except for | ||||
|    uncompressible blocks, which are limited as noted above. | ||||
|  | ||||
|    Each type of value (literals, distances, and lengths) in the | ||||
|    compressed data is represented using a Huffman code, using one code | ||||
|    tree for literals and lengths and a separate code tree for distances. | ||||
|    The code trees for each block appear in a compact form just before | ||||
|    the compressed data for that block. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 4] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
| 3. Detailed specification | ||||
|  | ||||
|    3.1. Overall conventions In the diagrams below, a box like this: | ||||
|  | ||||
|          +---+ | ||||
|          |   | <-- the vertical bars might be missing | ||||
|          +---+ | ||||
|  | ||||
|       represents one byte; a box like this: | ||||
|  | ||||
|          +==============+ | ||||
|          |              | | ||||
|          +==============+ | ||||
|  | ||||
|       represents a variable number of bytes. | ||||
|  | ||||
|       Bytes stored within a computer do not have a "bit order", since | ||||
|       they are always treated as a unit.  However, a byte considered as | ||||
|       an integer between 0 and 255 does have a most- and least- | ||||
|       significant bit, and since we write numbers with the most- | ||||
|       significant digit on the left, we also write bytes with the most- | ||||
|       significant bit on the left.  In the diagrams below, we number the | ||||
|       bits of a byte so that bit 0 is the least-significant bit, i.e., | ||||
|       the bits are numbered: | ||||
|  | ||||
|          +--------+ | ||||
|          |76543210| | ||||
|          +--------+ | ||||
|  | ||||
|       Within a computer, a number may occupy multiple bytes.  All | ||||
|       multi-byte numbers in the format described here are stored with | ||||
|       the least-significant byte first (at the lower memory address). | ||||
|       For example, the decimal number 520 is stored as: | ||||
|  | ||||
|              0        1 | ||||
|          +--------+--------+ | ||||
|          |00001000|00000010| | ||||
|          +--------+--------+ | ||||
|           ^        ^ | ||||
|           |        | | ||||
|           |        + more significant byte = 2 x 256 | ||||
|           + less significant byte = 8 | ||||
|  | ||||
|       3.1.1. Packing into bytes | ||||
|  | ||||
|          This document does not address the issue of the order in which | ||||
|          bits of a byte are transmitted on a bit-sequential medium, | ||||
|          since the final data format described here is byte- rather than | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 5] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|          bit-oriented.  However, we describe the compressed block format | ||||
|          in below, as a sequence of data elements of various bit | ||||
|          lengths, not a sequence of bytes.  We must therefore specify | ||||
|          how to pack these data elements into bytes to form the final | ||||
|          compressed byte sequence: | ||||
|  | ||||
|              * Data elements are packed into bytes in order of | ||||
|                increasing bit number within the byte, i.e., starting | ||||
|                with the least-significant bit of the byte. | ||||
|              * Data elements other than Huffman codes are packed | ||||
|                starting with the least-significant bit of the data | ||||
|                element. | ||||
|              * Huffman codes are packed starting with the most- | ||||
|                significant bit of the code. | ||||
|  | ||||
|          In other words, if one were to print out the compressed data as | ||||
|          a sequence of bytes, starting with the first byte at the | ||||
|          *right* margin and proceeding to the *left*, with the most- | ||||
|          significant bit of each byte on the left as usual, one would be | ||||
|          able to parse the result from right to left, with fixed-width | ||||
|          elements in the correct MSB-to-LSB order and Huffman codes in | ||||
|          bit-reversed order (i.e., with the first bit of the code in the | ||||
|          relative LSB position). | ||||
|  | ||||
|    3.2. Compressed block format | ||||
|  | ||||
|       3.2.1. Synopsis of prefix and Huffman coding | ||||
|  | ||||
|          Prefix coding represents symbols from an a priori known | ||||
|          alphabet by bit sequences (codes), one code for each symbol, in | ||||
|          a manner such that different symbols may be represented by bit | ||||
|          sequences of different lengths, but a parser can always parse | ||||
|          an encoded string unambiguously symbol-by-symbol. | ||||
|  | ||||
|          We define a prefix code in terms of a binary tree in which the | ||||
|          two edges descending from each non-leaf node are labeled 0 and | ||||
|          1 and in which the leaf nodes correspond one-for-one with (are | ||||
|          labeled with) the symbols of the alphabet; then the code for a | ||||
|          symbol is the sequence of 0's and 1's on the edges leading from | ||||
|          the root to the leaf labeled with that symbol.  For example: | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 6] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|                           /\              Symbol    Code | ||||
|                          0  1             ------    ---- | ||||
|                         /    \                A      00 | ||||
|                        /\     B               B       1 | ||||
|                       0  1                    C     011 | ||||
|                      /    \                   D     010 | ||||
|                     A     /\ | ||||
|                          0  1 | ||||
|                         /    \ | ||||
|                        D      C | ||||
|  | ||||
|          A parser can decode the next symbol from an encoded input | ||||
|          stream by walking down the tree from the root, at each step | ||||
|          choosing the edge corresponding to the next input bit. | ||||
|  | ||||
|          Given an alphabet with known symbol frequencies, the Huffman | ||||
|          algorithm allows the construction of an optimal prefix code | ||||
|          (one which represents strings with those symbol frequencies | ||||
|          using the fewest bits of any possible prefix codes for that | ||||
|          alphabet).  Such a code is called a Huffman code.  (See | ||||
|          reference [1] in Chapter 5, references for additional | ||||
|          information on Huffman codes.) | ||||
|  | ||||
|          Note that in the "deflate" format, the Huffman codes for the | ||||
|          various alphabets must not exceed certain maximum code lengths. | ||||
|          This constraint complicates the algorithm for computing code | ||||
|          lengths from symbol frequencies.  Again, see Chapter 5, | ||||
|          references for details. | ||||
|  | ||||
|       3.2.2. Use of Huffman coding in the "deflate" format | ||||
|  | ||||
|          The Huffman codes used for each alphabet in the "deflate" | ||||
|          format have two additional rules: | ||||
|  | ||||
|              * All codes of a given bit length have lexicographically | ||||
|                consecutive values, in the same order as the symbols | ||||
|                they represent; | ||||
|  | ||||
|              * Shorter codes lexicographically precede longer codes. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 7] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|          We could recode the example above to follow this rule as | ||||
|          follows, assuming that the order of the alphabet is ABCD: | ||||
|  | ||||
|             Symbol  Code | ||||
|             ------  ---- | ||||
|             A       10 | ||||
|             B       0 | ||||
|             C       110 | ||||
|             D       111 | ||||
|  | ||||
|          I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are | ||||
|          lexicographically consecutive. | ||||
|  | ||||
|          Given this rule, we can define the Huffman code for an alphabet | ||||
|          just by giving the bit lengths of the codes for each symbol of | ||||
|          the alphabet in order; this is sufficient to determine the | ||||
|          actual codes.  In our example, the code is completely defined | ||||
|          by the sequence of bit lengths (2, 1, 3, 3).  The following | ||||
|          algorithm generates the codes as integers, intended to be read | ||||
|          from most- to least-significant bit.  The code lengths are | ||||
|          initially in tree[I].Len; the codes are produced in | ||||
|          tree[I].Code. | ||||
|  | ||||
|          1)  Count the number of codes for each code length.  Let | ||||
|              bl_count[N] be the number of codes of length N, N >= 1. | ||||
|  | ||||
|          2)  Find the numerical value of the smallest code for each | ||||
|              code length: | ||||
|  | ||||
|                 code = 0; | ||||
|                 bl_count[0] = 0; | ||||
|                 for (bits = 1; bits <= MAX_BITS; bits++) { | ||||
|                     code = (code + bl_count[bits-1]) << 1; | ||||
|                     next_code[bits] = code; | ||||
|                 } | ||||
|  | ||||
|          3)  Assign numerical values to all codes, using consecutive | ||||
|              values for all codes of the same length with the base | ||||
|              values determined at step 2. Codes that are never used | ||||
|              (which have a bit length of zero) must not be assigned a | ||||
|              value. | ||||
|  | ||||
|                 for (n = 0;  n <= max_code; n++) { | ||||
|                     len = tree[n].Len; | ||||
|                     if (len != 0) { | ||||
|                         tree[n].Code = next_code[len]; | ||||
|                         next_code[len]++; | ||||
|                     } | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 8] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|                 } | ||||
|  | ||||
|          Example: | ||||
|  | ||||
|          Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, | ||||
|          3, 2, 4, 4).  After step 1, we have: | ||||
|  | ||||
|             N      bl_count[N] | ||||
|             -      ----------- | ||||
|             2      1 | ||||
|             3      5 | ||||
|             4      2 | ||||
|  | ||||
|          Step 2 computes the following next_code values: | ||||
|  | ||||
|             N      next_code[N] | ||||
|             -      ------------ | ||||
|             1      0 | ||||
|             2      0 | ||||
|             3      2 | ||||
|             4      14 | ||||
|  | ||||
|          Step 3 produces the following code values: | ||||
|  | ||||
|             Symbol Length   Code | ||||
|             ------ ------   ---- | ||||
|             A       3        010 | ||||
|             B       3        011 | ||||
|             C       3        100 | ||||
|             D       3        101 | ||||
|             E       3        110 | ||||
|             F       2         00 | ||||
|             G       4       1110 | ||||
|             H       4       1111 | ||||
|  | ||||
|       3.2.3. Details of block format | ||||
|  | ||||
|          Each block of compressed data begins with 3 header bits | ||||
|          containing the following data: | ||||
|  | ||||
|             first bit       BFINAL | ||||
|             next 2 bits     BTYPE | ||||
|  | ||||
|          Note that the header bits do not necessarily begin on a byte | ||||
|          boundary, since a block does not necessarily occupy an integral | ||||
|          number of bytes. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 9] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|          BFINAL is set if and only if this is the last block of the data | ||||
|          set. | ||||
|  | ||||
|          BTYPE specifies how the data are compressed, as follows: | ||||
|  | ||||
|             00 - no compression | ||||
|             01 - compressed with fixed Huffman codes | ||||
|             10 - compressed with dynamic Huffman codes | ||||
|             11 - reserved (error) | ||||
|  | ||||
|          The only difference between the two compressed cases is how the | ||||
|          Huffman codes for the literal/length and distance alphabets are | ||||
|          defined. | ||||
|  | ||||
|          In all cases, the decoding algorithm for the actual data is as | ||||
|          follows: | ||||
|  | ||||
|             do | ||||
|                read block header from input stream. | ||||
|                if stored with no compression | ||||
|                   skip any remaining bits in current partially | ||||
|                      processed byte | ||||
|                   read LEN and NLEN (see next section) | ||||
|                   copy LEN bytes of data to output | ||||
|                otherwise | ||||
|                   if compressed with dynamic Huffman codes | ||||
|                      read representation of code trees (see | ||||
|                         subsection below) | ||||
|                   loop (until end of block code recognized) | ||||
|                      decode literal/length value from input stream | ||||
|                      if value < 256 | ||||
|                         copy value (literal byte) to output stream | ||||
|                      otherwise | ||||
|                         if value = end of block (256) | ||||
|                            break from loop | ||||
|                         otherwise (value = 257..285) | ||||
|                            decode distance from input stream | ||||
|  | ||||
|                            move backwards distance bytes in the output | ||||
|                            stream, and copy length bytes from this | ||||
|                            position to the output stream. | ||||
|                   end loop | ||||
|             while not last block | ||||
|  | ||||
|          Note that a duplicated string reference may refer to a string | ||||
|          in a previous block; i.e., the backward distance may cross one | ||||
|          or more block boundaries.  However a distance cannot refer past | ||||
|          the beginning of the output stream.  (An application using a | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 10] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|          preset dictionary might discard part of the output stream; a | ||||
|          distance can refer to that part of the output stream anyway) | ||||
|          Note also that the referenced string may overlap the current | ||||
|          position; for example, if the last 2 bytes decoded have values | ||||
|          X and Y, a string reference with <length = 5, distance = 2> | ||||
|          adds X,Y,X,Y,X to the output stream. | ||||
|  | ||||
|          We now specify each compression method in turn. | ||||
|  | ||||
|       3.2.4. Non-compressed blocks (BTYPE=00) | ||||
|  | ||||
|          Any bits of input up to the next byte boundary are ignored. | ||||
|          The rest of the block consists of the following information: | ||||
|  | ||||
|               0   1   2   3   4... | ||||
|             +---+---+---+---+================================+ | ||||
|             |  LEN  | NLEN  |... LEN bytes of literal data...| | ||||
|             +---+---+---+---+================================+ | ||||
|  | ||||
|          LEN is the number of data bytes in the block.  NLEN is the | ||||
|          one's complement of LEN. | ||||
|  | ||||
|       3.2.5. Compressed blocks (length and distance codes) | ||||
|  | ||||
|          As noted above, encoded data blocks in the "deflate" format | ||||
|          consist of sequences of symbols drawn from three conceptually | ||||
|          distinct alphabets: either literal bytes, from the alphabet of | ||||
|          byte values (0..255), or <length, backward distance> pairs, | ||||
|          where the length is drawn from (3..258) and the distance is | ||||
|          drawn from (1..32,768).  In fact, the literal and length | ||||
|          alphabets are merged into a single alphabet (0..285), where | ||||
|          values 0..255 represent literal bytes, the value 256 indicates | ||||
|          end-of-block, and values 257..285 represent length codes | ||||
|          (possibly in conjunction with extra bits following the symbol | ||||
|          code) as follows: | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 11] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|                  Extra               Extra               Extra | ||||
|             Code Bits Length(s) Code Bits Lengths   Code Bits Length(s) | ||||
|             ---- ---- ------     ---- ---- -------   ---- ---- ------- | ||||
|              257   0     3       267   1   15,16     277   4   67-82 | ||||
|              258   0     4       268   1   17,18     278   4   83-98 | ||||
|              259   0     5       269   2   19-22     279   4   99-114 | ||||
|              260   0     6       270   2   23-26     280   4  115-130 | ||||
|              261   0     7       271   2   27-30     281   5  131-162 | ||||
|              262   0     8       272   2   31-34     282   5  163-194 | ||||
|              263   0     9       273   3   35-42     283   5  195-226 | ||||
|              264   0    10       274   3   43-50     284   5  227-257 | ||||
|              265   1  11,12      275   3   51-58     285   0    258 | ||||
|              266   1  13,14      276   3   59-66 | ||||
|  | ||||
|          The extra bits should be interpreted as a machine integer | ||||
|          stored with the most-significant bit first, e.g., bits 1110 | ||||
|          represent the value 14. | ||||
|  | ||||
|                   Extra           Extra               Extra | ||||
|              Code Bits Dist  Code Bits   Dist     Code Bits Distance | ||||
|              ---- ---- ----  ---- ----  ------    ---- ---- -------- | ||||
|                0   0    1     10   4     33-48    20    9   1025-1536 | ||||
|                1   0    2     11   4     49-64    21    9   1537-2048 | ||||
|                2   0    3     12   5     65-96    22   10   2049-3072 | ||||
|                3   0    4     13   5     97-128   23   10   3073-4096 | ||||
|                4   1   5,6    14   6    129-192   24   11   4097-6144 | ||||
|                5   1   7,8    15   6    193-256   25   11   6145-8192 | ||||
|                6   2   9-12   16   7    257-384   26   12  8193-12288 | ||||
|                7   2  13-16   17   7    385-512   27   12 12289-16384 | ||||
|                8   3  17-24   18   8    513-768   28   13 16385-24576 | ||||
|                9   3  25-32   19   8   769-1024   29   13 24577-32768 | ||||
|  | ||||
|       3.2.6. Compression with fixed Huffman codes (BTYPE=01) | ||||
|  | ||||
|          The Huffman codes for the two alphabets are fixed, and are not | ||||
|          represented explicitly in the data.  The Huffman code lengths | ||||
|          for the literal/length alphabet are: | ||||
|  | ||||
|                    Lit Value    Bits        Codes | ||||
|                    ---------    ----        ----- | ||||
|                      0 - 143     8          00110000 through | ||||
|                                             10111111 | ||||
|                    144 - 255     9          110010000 through | ||||
|                                             111111111 | ||||
|                    256 - 279     7          0000000 through | ||||
|                                             0010111 | ||||
|                    280 - 287     8          11000000 through | ||||
|                                             11000111 | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 12] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|          The code lengths are sufficient to generate the actual codes, | ||||
|          as described above; we show the codes in the table for added | ||||
|          clarity.  Literal/length values 286-287 will never actually | ||||
|          occur in the compressed data, but participate in the code | ||||
|          construction. | ||||
|  | ||||
|          Distance codes 0-31 are represented by (fixed-length) 5-bit | ||||
|          codes, with possible additional bits as shown in the table | ||||
|          shown in Paragraph 3.2.5, above.  Note that distance codes 30- | ||||
|          31 will never actually occur in the compressed data. | ||||
|  | ||||
|       3.2.7. Compression with dynamic Huffman codes (BTYPE=10) | ||||
|  | ||||
|          The Huffman codes for the two alphabets appear in the block | ||||
|          immediately after the header bits and before the actual | ||||
|          compressed data, first the literal/length code and then the | ||||
|          distance code.  Each code is defined by a sequence of code | ||||
|          lengths, as discussed in Paragraph 3.2.2, above.  For even | ||||
|          greater compactness, the code length sequences themselves are | ||||
|          compressed using a Huffman code.  The alphabet for code lengths | ||||
|          is as follows: | ||||
|  | ||||
|                0 - 15: Represent code lengths of 0 - 15 | ||||
|                    16: Copy the previous code length 3 - 6 times. | ||||
|                        The next 2 bits indicate repeat length | ||||
|                              (0 = 3, ... , 3 = 6) | ||||
|                           Example:  Codes 8, 16 (+2 bits 11), | ||||
|                                     16 (+2 bits 10) will expand to | ||||
|                                     12 code lengths of 8 (1 + 6 + 5) | ||||
|                    17: Repeat a code length of 0 for 3 - 10 times. | ||||
|                        (3 bits of length) | ||||
|                    18: Repeat a code length of 0 for 11 - 138 times | ||||
|                        (7 bits of length) | ||||
|  | ||||
|          A code length of 0 indicates that the corresponding symbol in | ||||
|          the literal/length or distance alphabet will not occur in the | ||||
|          block, and should not participate in the Huffman code | ||||
|          construction algorithm given earlier.  If only one distance | ||||
|          code is used, it is encoded using one bit, not zero bits; in | ||||
|          this case there is a single code length of one, with one unused | ||||
|          code.  One distance code of zero bits means that there are no | ||||
|          distance codes used at all (the data is all literals). | ||||
|  | ||||
|          We can now define the format of the block: | ||||
|  | ||||
|                5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) | ||||
|                5 Bits: HDIST, # of Distance codes - 1        (1 - 32) | ||||
|                4 Bits: HCLEN, # of Code Length codes - 4     (4 - 19) | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 13] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|                (HCLEN + 4) x 3 bits: code lengths for the code length | ||||
|                   alphabet given just above, in the order: 16, 17, 18, | ||||
|                   0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 | ||||
|  | ||||
|                   These code lengths are interpreted as 3-bit integers | ||||
|                   (0-7); as above, a code length of 0 means the | ||||
|                   corresponding symbol (literal/length or distance code | ||||
|                   length) is not used. | ||||
|  | ||||
|                HLIT + 257 code lengths for the literal/length alphabet, | ||||
|                   encoded using the code length Huffman code | ||||
|  | ||||
|                HDIST + 1 code lengths for the distance alphabet, | ||||
|                   encoded using the code length Huffman code | ||||
|  | ||||
|                The actual compressed data of the block, | ||||
|                   encoded using the literal/length and distance Huffman | ||||
|                   codes | ||||
|  | ||||
|                The literal/length symbol 256 (end of data), | ||||
|                   encoded using the literal/length Huffman code | ||||
|  | ||||
|          The code length repeat codes can cross from HLIT + 257 to the | ||||
|          HDIST + 1 code lengths.  In other words, all code lengths form | ||||
|          a single sequence of HLIT + HDIST + 258 values. | ||||
|  | ||||
|    3.3. Compliance | ||||
|  | ||||
|       A compressor may limit further the ranges of values specified in | ||||
|       the previous section and still be compliant; for example, it may | ||||
|       limit the range of backward pointers to some value smaller than | ||||
|       32K.  Similarly, a compressor may limit the size of blocks so that | ||||
|       a compressible block fits in memory. | ||||
|  | ||||
|       A compliant decompressor must accept the full range of possible | ||||
|       values defined in the previous section, and must accept blocks of | ||||
|       arbitrary size. | ||||
|  | ||||
| 4. Compression algorithm details | ||||
|  | ||||
|    While it is the intent of this document to define the "deflate" | ||||
|    compressed data format without reference to any particular | ||||
|    compression algorithm, the format is related to the compressed | ||||
|    formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); | ||||
|    since many variations of LZ77 are patented, it is strongly | ||||
|    recommended that the implementor of a compressor follow the general | ||||
|    algorithm presented here, which is known not to be patented per se. | ||||
|    The material in this section is not part of the definition of the | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 14] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
|    specification per se, and a compressor need not follow it in order to | ||||
|    be compliant. | ||||
|  | ||||
|    The compressor terminates a block when it determines that starting a | ||||
|    new block with fresh trees would be useful, or when the block size | ||||
|    fills up the compressor's block buffer. | ||||
|  | ||||
|    The compressor uses a chained hash table to find duplicated strings, | ||||
|    using a hash function that operates on 3-byte sequences.  At any | ||||
|    given point during compression, let XYZ be the next 3 input bytes to | ||||
|    be examined (not necessarily all different, of course).  First, the | ||||
|    compressor examines the hash chain for XYZ.  If the chain is empty, | ||||
|    the compressor simply writes out X as a literal byte and advances one | ||||
|    byte in the input.  If the hash chain is not empty, indicating that | ||||
|    the sequence XYZ (or, if we are unlucky, some other 3 bytes with the | ||||
|    same hash function value) has occurred recently, the compressor | ||||
|    compares all strings on the XYZ hash chain with the actual input data | ||||
|    sequence starting at the current point, and selects the longest | ||||
|    match. | ||||
|  | ||||
|    The compressor searches the hash chains 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 | ||||
|    run-time parameter. | ||||
|  | ||||
|    To improve overall compression, the compressor optionally defers the | ||||
|    selection of matches ("lazy matching"): after a match of length N has | ||||
|    been found, the compressor searches for a longer match starting at | ||||
|    the next input byte.  If it finds a longer match, it truncates the | ||||
|    previous match to a length of one (thus producing a single literal | ||||
|    byte) and then emits the longer match.  Otherwise, it emits the | ||||
|    original match, and, as described above, advances N bytes before | ||||
|    continuing. | ||||
|  | ||||
|    Run-time parameters also control this "lazy match" procedure.  If | ||||
|    compression ratio is most important, the compressor attempts a | ||||
|    complete second search regardless of the length of the first match. | ||||
|    In the normal case, if the current match is "long enough", the | ||||
|    compressor reduces the search for a longer match, thus speeding up | ||||
|    the process.  If speed is most important, the compressor inserts new | ||||
|    strings 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. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 15] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
| 5. References | ||||
|  | ||||
|    [1] Huffman, D. A., "A Method for the Construction of Minimum | ||||
|        Redundancy Codes", Proceedings of the Institute of Radio | ||||
|        Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. | ||||
|  | ||||
|    [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data | ||||
|        Compression", IEEE Transactions on Information Theory, Vol. 23, | ||||
|        No. 3, pp. 337-343. | ||||
|  | ||||
|    [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, | ||||
|        available in ftp://ftp.uu.net/pub/archiving/zip/doc/ | ||||
|  | ||||
|    [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, | ||||
|        available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ | ||||
|  | ||||
|    [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix | ||||
|        encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. | ||||
|  | ||||
|    [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," | ||||
|        Comm. ACM, 33,4, April 1990, pp. 449-459. | ||||
|  | ||||
| 6. Security Considerations | ||||
|  | ||||
|    Any data compression method involves the reduction of redundancy in | ||||
|    the data.  Consequently, any corruption of the data is likely to have | ||||
|    severe effects and be difficult to correct.  Uncompressed text, on | ||||
|    the other hand, will probably still be readable despite the presence | ||||
|    of some corrupted bytes. | ||||
|  | ||||
|    It is recommended that systems using this data format provide some | ||||
|    means of validating the integrity of the compressed data.  See | ||||
|    reference [3], for example. | ||||
|  | ||||
| 7. Source code | ||||
|  | ||||
|    Source code for a C language implementation of a "deflate" compliant | ||||
|    compressor and decompressor is available within the zlib package at | ||||
|    ftp://ftp.uu.net/pub/archiving/zip/zlib/. | ||||
|  | ||||
| 8. Acknowledgements | ||||
|  | ||||
|    Trademarks cited in this document are the property of their | ||||
|    respective owners. | ||||
|  | ||||
|    Phil Katz designed the deflate format.  Jean-Loup Gailly and Mark | ||||
|    Adler wrote the related software described in this specification. | ||||
|    Glenn Randers-Pehrson converted this document to RFC and HTML format. | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 16] | ||||
|  | ||||
| RFC 1951      DEFLATE Compressed Data Format Specification      May 1996 | ||||
|  | ||||
|  | ||||
| 9. Author's Address | ||||
|  | ||||
|    L. Peter Deutsch | ||||
|    Aladdin Enterprises | ||||
|    203 Santa Margarita Ave. | ||||
|    Menlo Park, CA 94025 | ||||
|  | ||||
|    Phone: (415) 322-0103 (AM only) | ||||
|    FAX:   (415) 322-1734 | ||||
|    EMail: <ghost@aladdin.com> | ||||
|  | ||||
|    Questions about the technical content of this specification can be | ||||
|    sent by email to: | ||||
|  | ||||
|    Jean-Loup Gailly <gzip@prep.ai.mit.edu> and | ||||
|    Mark Adler <madler@alumni.caltech.edu> | ||||
|  | ||||
|    Editorial comments on this specification can be sent by email to: | ||||
|  | ||||
|    L. Peter Deutsch <ghost@aladdin.com> and | ||||
|    Glenn Randers-Pehrson <randeg@alumni.rpi.edu> | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 17] | ||||
|  | ||||
							
								
								
									
										675
									
								
								doc/rfc1952.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										675
									
								
								doc/rfc1952.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,675 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Network Working Group                                         P. Deutsch | ||||
| Request for Comments: 1952                           Aladdin Enterprises | ||||
| Category: Informational                                         May 1996 | ||||
|  | ||||
|  | ||||
|                GZIP file format specification version 4.3 | ||||
|  | ||||
| Status of This Memo | ||||
|  | ||||
|    This memo provides information for the Internet community.  This memo | ||||
|    does not specify an Internet standard of any kind.  Distribution of | ||||
|    this memo is unlimited. | ||||
|  | ||||
| IESG Note: | ||||
|  | ||||
|    The IESG takes no position on the validity of any Intellectual | ||||
|    Property Rights statements contained in this document. | ||||
|  | ||||
| Notices | ||||
|  | ||||
|    Copyright (c) 1996 L. Peter Deutsch | ||||
|  | ||||
|    Permission is granted to copy and distribute this document for any | ||||
|    purpose and without charge, including translations into other | ||||
|    languages and incorporation into compilations, provided that the | ||||
|    copyright notice and this notice are preserved, and that any | ||||
|    substantive changes or deletions from the original are clearly | ||||
|    marked. | ||||
|  | ||||
|    A pointer to the latest version of this and related documentation in | ||||
|    HTML format can be found at the URL | ||||
|    <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. | ||||
|  | ||||
| Abstract | ||||
|  | ||||
|    This specification defines a lossless compressed data format that is | ||||
|    compatible with the widely used GZIP utility.  The format includes a | ||||
|    cyclic redundancy check value for detecting data corruption.  The | ||||
|    format presently uses the DEFLATE method of compression but can be | ||||
|    easily extended to use other compression methods.  The format can be | ||||
|    implemented readily in a manner not covered by patents. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 1] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
| Table of Contents | ||||
|  | ||||
|    1. Introduction ................................................... 2 | ||||
|       1.1. Purpose ................................................... 2 | ||||
|       1.2. Intended audience ......................................... 3 | ||||
|       1.3. Scope ..................................................... 3 | ||||
|       1.4. Compliance ................................................ 3 | ||||
|       1.5. Definitions of terms and conventions used ................. 3 | ||||
|       1.6. Changes from previous versions ............................ 3 | ||||
|    2. Detailed specification ......................................... 4 | ||||
|       2.1. Overall conventions ....................................... 4 | ||||
|       2.2. File format ............................................... 5 | ||||
|       2.3. Member format ............................................. 5 | ||||
|           2.3.1. Member header and trailer ........................... 6 | ||||
|               2.3.1.1. Extra field ................................... 8 | ||||
|               2.3.1.2. Compliance .................................... 9 | ||||
|       3. References .................................................. 9 | ||||
|       4. Security Considerations .................................... 10 | ||||
|       5. Acknowledgements ........................................... 10 | ||||
|       6. Author's Address ........................................... 10 | ||||
|       7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 | ||||
|       8. Appendix: Sample CRC Code .................................. 11 | ||||
|  | ||||
| 1. Introduction | ||||
|  | ||||
|    1.1. Purpose | ||||
|  | ||||
|       The purpose of this specification is to define a lossless | ||||
|       compressed data format that: | ||||
|  | ||||
|           * Is independent of CPU type, operating system, file system, | ||||
|             and character set, and hence can be used for interchange; | ||||
|           * Can compress or decompress a data stream (as opposed to a | ||||
|             randomly accessible file) to produce another data stream, | ||||
|             using only an a priori bounded amount of intermediate | ||||
|             storage, and hence can be used in data communications or | ||||
|             similar structures such as Unix filters; | ||||
|           * Compresses data with efficiency comparable to the best | ||||
|             currently available general-purpose compression methods, | ||||
|             and in particular considerably better than the "compress" | ||||
|             program; | ||||
|           * Can be implemented readily in a manner not covered by | ||||
|             patents, and hence can be practiced freely; | ||||
|           * Is compatible with the file format produced by the current | ||||
|             widely used gzip utility, in that conforming decompressors | ||||
|             will be able to read data produced by the existing gzip | ||||
|             compressor. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 2] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|       The data format defined by this specification does not attempt to: | ||||
|  | ||||
|           * Provide random access to compressed data; | ||||
|           * Compress specialized data (e.g., raster graphics) as well as | ||||
|             the best currently available specialized algorithms. | ||||
|  | ||||
|    1.2. Intended audience | ||||
|  | ||||
|       This specification is intended for use by implementors of software | ||||
|       to compress data into gzip format and/or decompress data from gzip | ||||
|       format. | ||||
|  | ||||
|       The text of the specification assumes a basic background in | ||||
|       programming at the level of bits and other primitive data | ||||
|       representations. | ||||
|  | ||||
|    1.3. Scope | ||||
|  | ||||
|       The specification specifies a compression method and a file format | ||||
|       (the latter assuming only that a file can store a sequence of | ||||
|       arbitrary bytes).  It does not specify any particular interface to | ||||
|       a file system or anything about character sets or encodings | ||||
|       (except for file names and comments, which are optional). | ||||
|  | ||||
|    1.4. Compliance | ||||
|  | ||||
|       Unless otherwise indicated below, a compliant decompressor must be | ||||
|       able to accept and decompress any file that conforms to all the | ||||
|       specifications presented here; a compliant compressor must produce | ||||
|       files that conform to all the specifications presented here.  The | ||||
|       material in the appendices is not part of the specification per se | ||||
|       and is not relevant to compliance. | ||||
|  | ||||
|    1.5. Definitions of terms and conventions used | ||||
|  | ||||
|       byte: 8 bits stored or transmitted as a unit (same as an octet). | ||||
|       (For this specification, a byte is exactly 8 bits, even on | ||||
|       machines which store a character on a number of bits different | ||||
|       from 8.)  See below for the numbering of bits within a byte. | ||||
|  | ||||
|    1.6. Changes from previous versions | ||||
|  | ||||
|       There have been no technical changes to the gzip format since | ||||
|       version 4.1 of this specification.  In version 4.2, some | ||||
|       terminology was changed, and the sample CRC code was rewritten for | ||||
|       clarity and to eliminate the requirement for the caller to do pre- | ||||
|       and post-conditioning.  Version 4.3 is a conversion of the | ||||
|       specification to RFC style. | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 3] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
| 2. Detailed specification | ||||
|  | ||||
|    2.1. Overall conventions | ||||
|  | ||||
|       In the diagrams below, a box like this: | ||||
|  | ||||
|          +---+ | ||||
|          |   | <-- the vertical bars might be missing | ||||
|          +---+ | ||||
|  | ||||
|       represents one byte; a box like this: | ||||
|  | ||||
|          +==============+ | ||||
|          |              | | ||||
|          +==============+ | ||||
|  | ||||
|       represents a variable number of bytes. | ||||
|  | ||||
|       Bytes stored within a computer do not have a "bit order", since | ||||
|       they are always treated as a unit.  However, a byte considered as | ||||
|       an integer between 0 and 255 does have a most- and least- | ||||
|       significant bit, and since we write numbers with the most- | ||||
|       significant digit on the left, we also write bytes with the most- | ||||
|       significant bit on the left.  In the diagrams below, we number the | ||||
|       bits of a byte so that bit 0 is the least-significant bit, i.e., | ||||
|       the bits are numbered: | ||||
|  | ||||
|          +--------+ | ||||
|          |76543210| | ||||
|          +--------+ | ||||
|  | ||||
|       This document does not address the issue of the order in which | ||||
|       bits of a byte are transmitted on a bit-sequential medium, since | ||||
|       the data format described here is byte- rather than bit-oriented. | ||||
|  | ||||
|       Within a computer, a number may occupy multiple bytes.  All | ||||
|       multi-byte numbers in the format described here are stored with | ||||
|       the least-significant byte first (at the lower memory address). | ||||
|       For example, the decimal number 520 is stored as: | ||||
|  | ||||
|              0        1 | ||||
|          +--------+--------+ | ||||
|          |00001000|00000010| | ||||
|          +--------+--------+ | ||||
|           ^        ^ | ||||
|           |        | | ||||
|           |        + more significant byte = 2 x 256 | ||||
|           + less significant byte = 8 | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 4] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|    2.2. File format | ||||
|  | ||||
|       A gzip file consists of a series of "members" (compressed data | ||||
|       sets).  The format of each member is specified in the following | ||||
|       section.  The members simply appear one after another in the file, | ||||
|       with no additional information before, between, or after them. | ||||
|  | ||||
|    2.3. Member format | ||||
|  | ||||
|       Each member has the following structure: | ||||
|  | ||||
|          +---+---+---+---+---+---+---+---+---+---+ | ||||
|          |ID1|ID2|CM |FLG|     MTIME     |XFL|OS | (more-->) | ||||
|          +---+---+---+---+---+---+---+---+---+---+ | ||||
|  | ||||
|       (if FLG.FEXTRA set) | ||||
|  | ||||
|          +---+---+=================================+ | ||||
|          | XLEN  |...XLEN bytes of "extra field"...| (more-->) | ||||
|          +---+---+=================================+ | ||||
|  | ||||
|       (if FLG.FNAME set) | ||||
|  | ||||
|          +=========================================+ | ||||
|          |...original file name, zero-terminated...| (more-->) | ||||
|          +=========================================+ | ||||
|  | ||||
|       (if FLG.FCOMMENT set) | ||||
|  | ||||
|          +===================================+ | ||||
|          |...file comment, zero-terminated...| (more-->) | ||||
|          +===================================+ | ||||
|  | ||||
|       (if FLG.FHCRC set) | ||||
|  | ||||
|          +---+---+ | ||||
|          | CRC16 | | ||||
|          +---+---+ | ||||
|  | ||||
|          +=======================+ | ||||
|          |...compressed blocks...| (more-->) | ||||
|          +=======================+ | ||||
|  | ||||
|            0   1   2   3   4   5   6   7 | ||||
|          +---+---+---+---+---+---+---+---+ | ||||
|          |     CRC32     |     ISIZE     | | ||||
|          +---+---+---+---+---+---+---+---+ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 5] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|       2.3.1. Member header and trailer | ||||
|  | ||||
|          ID1 (IDentification 1) | ||||
|          ID2 (IDentification 2) | ||||
|             These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 | ||||
|             (0x8b, \213), to identify the file as being in gzip format. | ||||
|  | ||||
|          CM (Compression Method) | ||||
|             This identifies the compression method used in the file.  CM | ||||
|             = 0-7 are reserved.  CM = 8 denotes the "deflate" | ||||
|             compression method, which is the one customarily used by | ||||
|             gzip and which is documented elsewhere. | ||||
|  | ||||
|          FLG (FLaGs) | ||||
|             This flag byte is divided into individual bits as follows: | ||||
|  | ||||
|                bit 0   FTEXT | ||||
|                bit 1   FHCRC | ||||
|                bit 2   FEXTRA | ||||
|                bit 3   FNAME | ||||
|                bit 4   FCOMMENT | ||||
|                bit 5   reserved | ||||
|                bit 6   reserved | ||||
|                bit 7   reserved | ||||
|  | ||||
|             If FTEXT is set, the file is probably ASCII text.  This is | ||||
|             an optional indication, which the compressor may set by | ||||
|             checking a small amount of the input data to see whether any | ||||
|             non-ASCII characters are present.  In case of doubt, FTEXT | ||||
|             is cleared, indicating binary data. For systems which have | ||||
|             different file formats for ascii text and binary data, the | ||||
|             decompressor can use FTEXT to choose the appropriate format. | ||||
|             We deliberately do not specify the algorithm used to set | ||||
|             this bit, since a compressor always has the option of | ||||
|             leaving it cleared and a decompressor always has the option | ||||
|             of ignoring it and letting some other program handle issues | ||||
|             of data conversion. | ||||
|  | ||||
|             If FHCRC is set, a CRC16 for the gzip header is present, | ||||
|             immediately before the compressed data. The CRC16 consists | ||||
|             of the two least significant bytes of the CRC32 for all | ||||
|             bytes of the gzip header up to and not including the CRC16. | ||||
|             [The FHCRC bit was never set by versions of gzip up to | ||||
|             1.2.4, even though it was documented with a different | ||||
|             meaning in gzip 1.2.4.] | ||||
|  | ||||
|             If FEXTRA is set, optional extra fields are present, as | ||||
|             described in a following section. | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 6] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|             If FNAME is set, an original file name is present, | ||||
|             terminated by a zero byte.  The name must consist of ISO | ||||
|             8859-1 (LATIN-1) characters; on operating systems using | ||||
|             EBCDIC or any other character set for file names, the name | ||||
|             must be translated to the ISO LATIN-1 character set.  This | ||||
|             is the original name of the file being compressed, with any | ||||
|             directory components removed, and, if the file being | ||||
|             compressed is on a file system with case insensitive names, | ||||
|             forced to lower case. There is no original file name if the | ||||
|             data was compressed from a source other than a named file; | ||||
|             for example, if the source was stdin on a Unix system, there | ||||
|             is no file name. | ||||
|  | ||||
|             If FCOMMENT is set, a zero-terminated file comment is | ||||
|             present.  This comment is not interpreted; it is only | ||||
|             intended for human consumption.  The comment must consist of | ||||
|             ISO 8859-1 (LATIN-1) characters.  Line breaks should be | ||||
|             denoted by a single line feed character (10 decimal). | ||||
|  | ||||
|             Reserved FLG bits must be zero. | ||||
|  | ||||
|          MTIME (Modification TIME) | ||||
|             This gives the most recent modification time of the original | ||||
|             file being compressed.  The time is in Unix format, i.e., | ||||
|             seconds since 00:00:00 GMT, Jan.  1, 1970.  (Note that this | ||||
|             may cause problems for MS-DOS and other systems that use | ||||
|             local rather than Universal time.)  If the compressed data | ||||
|             did not come from a file, MTIME is set to the time at which | ||||
|             compression started.  MTIME = 0 means no time stamp is | ||||
|             available. | ||||
|  | ||||
|          XFL (eXtra FLags) | ||||
|             These flags are available for use by specific compression | ||||
|             methods.  The "deflate" method (CM = 8) sets these flags as | ||||
|             follows: | ||||
|  | ||||
|                XFL = 2 - compressor used maximum compression, | ||||
|                          slowest algorithm | ||||
|                XFL = 4 - compressor used fastest algorithm | ||||
|  | ||||
|          OS (Operating System) | ||||
|             This identifies the type of file system on which compression | ||||
|             took place.  This may be useful in determining end-of-line | ||||
|             convention for text files.  The currently defined values are | ||||
|             as follows: | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 7] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|                  0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) | ||||
|                  1 - Amiga | ||||
|                  2 - VMS (or OpenVMS) | ||||
|                  3 - Unix | ||||
|                  4 - VM/CMS | ||||
|                  5 - Atari TOS | ||||
|                  6 - HPFS filesystem (OS/2, NT) | ||||
|                  7 - Macintosh | ||||
|                  8 - Z-System | ||||
|                  9 - CP/M | ||||
|                 10 - TOPS-20 | ||||
|                 11 - NTFS filesystem (NT) | ||||
|                 12 - QDOS | ||||
|                 13 - Acorn RISCOS | ||||
|                255 - unknown | ||||
|  | ||||
|          XLEN (eXtra LENgth) | ||||
|             If FLG.FEXTRA is set, this gives the length of the optional | ||||
|             extra field.  See below for details. | ||||
|  | ||||
|          CRC32 (CRC-32) | ||||
|             This contains a Cyclic Redundancy Check value of the | ||||
|             uncompressed data computed according to CRC-32 algorithm | ||||
|             used in the ISO 3309 standard and in section 8.1.1.6.2 of | ||||
|             ITU-T recommendation V.42.  (See http://www.iso.ch for | ||||
|             ordering ISO documents. See gopher://info.itu.ch for an | ||||
|             online version of ITU-T V.42.) | ||||
|  | ||||
|          ISIZE (Input SIZE) | ||||
|             This contains the size of the original (uncompressed) input | ||||
|             data modulo 2^32. | ||||
|  | ||||
|       2.3.1.1. Extra field | ||||
|  | ||||
|          If the FLG.FEXTRA bit is set, an "extra field" is present in | ||||
|          the header, with total length XLEN bytes.  It consists of a | ||||
|          series of subfields, each of the form: | ||||
|  | ||||
|             +---+---+---+---+==================================+ | ||||
|             |SI1|SI2|  LEN  |... LEN bytes of subfield data ...| | ||||
|             +---+---+---+---+==================================+ | ||||
|  | ||||
|          SI1 and SI2 provide a subfield ID, typically two ASCII letters | ||||
|          with some mnemonic value.  Jean-Loup Gailly | ||||
|          <gzip@prep.ai.mit.edu> is maintaining a registry of subfield | ||||
|          IDs; please send him any subfield ID you wish to use.  Subfield | ||||
|          IDs with SI2 = 0 are reserved for future use.  The following | ||||
|          IDs are currently defined: | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 8] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|             SI1         SI2         Data | ||||
|             ----------  ----------  ---- | ||||
|             0x41 ('A')  0x70 ('P')  Apollo file type information | ||||
|  | ||||
|          LEN gives the length of the subfield data, excluding the 4 | ||||
|          initial bytes. | ||||
|  | ||||
|       2.3.1.2. Compliance | ||||
|  | ||||
|          A compliant compressor must produce files with correct ID1, | ||||
|          ID2, CM, CRC32, and ISIZE, but may set all the other fields in | ||||
|          the fixed-length part of the header to default values (255 for | ||||
|          OS, 0 for all others).  The compressor must set all reserved | ||||
|          bits to zero. | ||||
|  | ||||
|          A compliant decompressor must check ID1, ID2, and CM, and | ||||
|          provide an error indication if any of these have incorrect | ||||
|          values.  It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC | ||||
|          at least so it can skip over the optional fields if they are | ||||
|          present.  It need not examine any other part of the header or | ||||
|          trailer; in particular, a decompressor may ignore FTEXT and OS | ||||
|          and always produce binary output, and still be compliant.  A | ||||
|          compliant decompressor must give an error indication if any | ||||
|          reserved bit is non-zero, since such a bit could indicate the | ||||
|          presence of a new field that would cause subsequent data to be | ||||
|          interpreted incorrectly. | ||||
|  | ||||
| 3. References | ||||
|  | ||||
|    [1] "Information Processing - 8-bit single-byte coded graphic | ||||
|        character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). | ||||
|        The ISO 8859-1 (Latin-1) character set is a superset of 7-bit | ||||
|        ASCII. Files defining this character set are available as | ||||
|        iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ | ||||
|  | ||||
|    [2] ISO 3309 | ||||
|  | ||||
|    [3] ITU-T recommendation V.42 | ||||
|  | ||||
|    [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", | ||||
|        available in ftp://ftp.uu.net/pub/archiving/zip/doc/ | ||||
|  | ||||
|    [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in | ||||
|        ftp://prep.ai.mit.edu/pub/gnu/ | ||||
|  | ||||
|    [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table | ||||
|        Look-Up", Communications of the ACM, 31(8), pp.1008-1013. | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                      [Page 9] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|    [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, | ||||
|        pp.118-133. | ||||
|  | ||||
|    [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, | ||||
|        describing the CRC concept. | ||||
|  | ||||
| 4. Security Considerations | ||||
|  | ||||
|    Any data compression method involves the reduction of redundancy in | ||||
|    the data.  Consequently, any corruption of the data is likely to have | ||||
|    severe effects and be difficult to correct.  Uncompressed text, on | ||||
|    the other hand, will probably still be readable despite the presence | ||||
|    of some corrupted bytes. | ||||
|  | ||||
|    It is recommended that systems using this data format provide some | ||||
|    means of validating the integrity of the compressed data, such as by | ||||
|    setting and checking the CRC-32 check value. | ||||
|  | ||||
| 5. Acknowledgements | ||||
|  | ||||
|    Trademarks cited in this document are the property of their | ||||
|    respective owners. | ||||
|  | ||||
|    Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, | ||||
|    the related software described in this specification.  Glenn | ||||
|    Randers-Pehrson converted this document to RFC and HTML format. | ||||
|  | ||||
| 6. Author's Address | ||||
|  | ||||
|    L. Peter Deutsch | ||||
|    Aladdin Enterprises | ||||
|    203 Santa Margarita Ave. | ||||
|    Menlo Park, CA 94025 | ||||
|  | ||||
|    Phone: (415) 322-0103 (AM only) | ||||
|    FAX:   (415) 322-1734 | ||||
|    EMail: <ghost@aladdin.com> | ||||
|  | ||||
|    Questions about the technical content of this specification can be | ||||
|    sent by email to: | ||||
|  | ||||
|    Jean-Loup Gailly <gzip@prep.ai.mit.edu> and | ||||
|    Mark Adler <madler@alumni.caltech.edu> | ||||
|  | ||||
|    Editorial comments on this specification can be sent by email to: | ||||
|  | ||||
|    L. Peter Deutsch <ghost@aladdin.com> and | ||||
|    Glenn Randers-Pehrson <randeg@alumni.rpi.edu> | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 10] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
| 7. Appendix: Jean-Loup Gailly's gzip utility | ||||
|  | ||||
|    The most widely used implementation of gzip compression, and the | ||||
|    original documentation on which this specification is based, were | ||||
|    created by Jean-Loup Gailly <gzip@prep.ai.mit.edu>.  Since this | ||||
|    implementation is a de facto standard, we mention some more of its | ||||
|    features here.  Again, the material in this section is not part of | ||||
|    the specification per se, and implementations need not follow it to | ||||
|    be compliant. | ||||
|  | ||||
|    When compressing or decompressing a file, gzip preserves the | ||||
|    protection, ownership, and modification time attributes on the local | ||||
|    file system, since there is no provision for representing protection | ||||
|    attributes in the gzip file format itself.  Since the file format | ||||
|    includes a modification time, the gzip decompressor provides a | ||||
|    command line switch that assigns the modification time from the file, | ||||
|    rather than the local modification time of the compressed input, to | ||||
|    the decompressed output. | ||||
|  | ||||
| 8. Appendix: Sample CRC Code | ||||
|  | ||||
|    The following sample code represents a practical implementation of | ||||
|    the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 | ||||
|    for a formal specification.) | ||||
|  | ||||
|    The sample code is in the ANSI C programming language. Non C users | ||||
|    may find it easier to read with these hints: | ||||
|  | ||||
|       &      Bitwise AND operator. | ||||
|       ^      Bitwise exclusive-OR operator. | ||||
|       >>     Bitwise right shift operator. When applied to an | ||||
|              unsigned quantity, as here, right shift inserts zero | ||||
|              bit(s) at the left. | ||||
|       !      Logical NOT operator. | ||||
|       ++     "n++" increments the variable n. | ||||
|       0xNNN  0x introduces a hexadecimal (base 16) constant. | ||||
|              Suffix L indicates a long value (at least 32 bits). | ||||
|  | ||||
|       /* Table of CRCs of all 8-bit messages. */ | ||||
|       unsigned long crc_table[256]; | ||||
|  | ||||
|       /* Flag: has the table been computed? Initially false. */ | ||||
|       int crc_table_computed = 0; | ||||
|  | ||||
|       /* Make the table for a fast CRC. */ | ||||
|       void make_crc_table(void) | ||||
|       { | ||||
|         unsigned long c; | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 11] | ||||
|  | ||||
| RFC 1952             GZIP File Format Specification             May 1996 | ||||
|  | ||||
|  | ||||
|         int n, k; | ||||
|         for (n = 0; n < 256; n++) { | ||||
|           c = (unsigned long) n; | ||||
|           for (k = 0; k < 8; k++) { | ||||
|             if (c & 1) { | ||||
|               c = 0xedb88320L ^ (c >> 1); | ||||
|             } else { | ||||
|               c = c >> 1; | ||||
|             } | ||||
|           } | ||||
|           crc_table[n] = c; | ||||
|         } | ||||
|         crc_table_computed = 1; | ||||
|       } | ||||
|  | ||||
|       /* | ||||
|          Update a running crc with the bytes buf[0..len-1] and return | ||||
|        the updated crc. The crc should be initialized to zero. Pre- and | ||||
|        post-conditioning (one's complement) is performed within this | ||||
|        function so it shouldn't be done by the caller. Usage example: | ||||
|  | ||||
|          unsigned long crc = 0L; | ||||
|  | ||||
|          while (read_buffer(buffer, length) != EOF) { | ||||
|            crc = update_crc(crc, buffer, length); | ||||
|          } | ||||
|          if (crc != original_crc) error(); | ||||
|       */ | ||||
|       unsigned long update_crc(unsigned long crc, | ||||
|                       unsigned char *buf, int len) | ||||
|       { | ||||
|         unsigned long c = crc ^ 0xffffffffL; | ||||
|         int n; | ||||
|  | ||||
|         if (!crc_table_computed) | ||||
|           make_crc_table(); | ||||
|         for (n = 0; n < len; n++) { | ||||
|           c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); | ||||
|         } | ||||
|         return c ^ 0xffffffffL; | ||||
|       } | ||||
|  | ||||
|       /* Return the CRC of the bytes buf[0..len-1]. */ | ||||
|       unsigned long crc(unsigned char *buf, int len) | ||||
|       { | ||||
|         return update_crc(0L, buf, len); | ||||
|       } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| Deutsch                      Informational                     [Page 12] | ||||
|  | ||||
							
								
								
									
										107
									
								
								doc/txtvsbin.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								doc/txtvsbin.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| A Fast Method for Identifying Plain Text Files | ||||
| ============================================== | ||||
|  | ||||
|  | ||||
| Introduction | ||||
| ------------ | ||||
|  | ||||
| Given a file coming from an unknown source, it is sometimes desirable | ||||
| to find out whether the format of that file is plain text.  Although | ||||
| this may appear like a simple task, a fully accurate detection of the | ||||
| file type requires heavy-duty semantic analysis on the file contents. | ||||
| It is, however, possible to obtain satisfactory results by employing | ||||
| various heuristics. | ||||
|  | ||||
| Previous versions of PKZip and other zip-compatible compression tools | ||||
| were using a crude detection scheme: if more than 80% (4/5) of the bytes | ||||
| found in a certain buffer are within the range [7..127], the file is | ||||
| labeled as plain text, otherwise it is labeled as binary.  A prominent | ||||
| limitation of this scheme is the restriction to Latin-based alphabets. | ||||
| Other alphabets, like Greek, Cyrillic or Asian, make extensive use of | ||||
| the bytes within the range [128..255], and texts using these alphabets | ||||
| are most often misidentified by this scheme; in other words, the rate | ||||
| of false negatives is sometimes too high, which means that the recall | ||||
| is low.  Another weakness of this scheme is a reduced precision, due to | ||||
| the false positives that may occur when binary files containing large | ||||
| amounts of textual characters are misidentified as plain text. | ||||
|  | ||||
| In this article we propose a new, simple detection scheme that features | ||||
| a much increased precision and a near-100% recall.  This scheme is | ||||
| designed to work on ASCII, Unicode and other ASCII-derived alphabets, | ||||
| and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) | ||||
| and variable-sized encodings (ISO-2022, UTF-8, etc.).  Wider encodings | ||||
| (UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. | ||||
|  | ||||
|  | ||||
| The Algorithm | ||||
| ------------- | ||||
|  | ||||
| The algorithm works by dividing the set of bytecodes [0..255] into three | ||||
| categories: | ||||
| - The white list of textual bytecodes: | ||||
|   9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. | ||||
| - The gray list of tolerated bytecodes: | ||||
|   7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). | ||||
| - The black list of undesired, non-textual bytecodes: | ||||
|   0 (NUL) to 6, 14 to 31. | ||||
|  | ||||
| If a file contains at least one byte that belongs to the white list and | ||||
| no byte that belongs to the black list, then the file is categorized as | ||||
| plain text; otherwise, it is categorized as binary.  (The boundary case, | ||||
| when the file is empty, automatically falls into the latter category.) | ||||
|  | ||||
|  | ||||
| Rationale | ||||
| --------- | ||||
|  | ||||
| The idea behind this algorithm relies on two observations. | ||||
|  | ||||
| The first observation is that, although the full range of 7-bit codes | ||||
| [0..127] is properly specified by the ASCII standard, most control | ||||
| characters in the range [0..31] are not used in practice.  The only | ||||
| widely-used, almost universally-portable control codes are 9 (TAB), | ||||
| 10 (LF) and 13 (CR).  There are a few more control codes that are | ||||
| recognized on a reduced range of platforms and text viewers/editors: | ||||
| 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these | ||||
| codes are rarely (if ever) used alone, without being accompanied by | ||||
| some printable text.  Even the newer, portable text formats such as | ||||
| XML avoid using control characters outside the list mentioned here. | ||||
|  | ||||
| The second observation is that most of the binary files tend to contain | ||||
| control characters, especially 0 (NUL).  Even though the older text | ||||
| detection schemes observe the presence of non-ASCII codes from the range | ||||
| [128..255], the precision rarely has to suffer if this upper range is | ||||
| labeled as textual, because the files that are genuinely binary tend to | ||||
| contain both control characters and codes from the upper range.  On the | ||||
| other hand, the upper range needs to be labeled as textual, because it | ||||
| is used by virtually all ASCII extensions.  In particular, this range is | ||||
| used for encoding non-Latin scripts. | ||||
|  | ||||
| Since there is no counting involved, other than simply observing the | ||||
| presence or the absence of some byte values, the algorithm produces | ||||
| consistent results, regardless what alphabet encoding is being used. | ||||
| (If counting were involved, it could be possible to obtain different | ||||
| results on a text encoded, say, using ISO-8859-16 versus UTF-8.) | ||||
|  | ||||
| There is an extra category of plain text files that are "polluted" with | ||||
| one or more black-listed codes, either by mistake or by peculiar design | ||||
| considerations.  In such cases, a scheme that tolerates a small fraction | ||||
| of black-listed codes would provide an increased recall (i.e. more true | ||||
| positives).  This, however, incurs a reduced precision overall, since | ||||
| false positives are more likely to appear in binary files that contain | ||||
| large chunks of textual data.  Furthermore, "polluted" plain text should | ||||
| be regarded as binary by general-purpose text detection schemes, because | ||||
| general-purpose text processing algorithms might not be applicable. | ||||
| Under this premise, it is safe to say that our detection method provides | ||||
| a near-100% recall. | ||||
|  | ||||
| Experiments have been run on many files coming from various platforms | ||||
| and applications.  We tried plain text files, system logs, source code, | ||||
| formatted office documents, compiled object code, etc.  The results | ||||
| confirm the optimistic assumptions about the capabilities of this | ||||
| algorithm. | ||||
|  | ||||
|  | ||||
| -- | ||||
| Cosmin Truta | ||||
| Last updated: 2006-May-28 | ||||
| @@ -1,12 +1,12 @@ | ||||
| /* example.c -- usage example of the zlib compression library | ||||
|  * Copyright (C) 1995-2004 Jean-loup Gailly. | ||||
|  * Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| /* @(#) $Id$ */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include "zlib.h" | ||||
| #include <stdio.h> | ||||
|  | ||||
| #ifdef STDC | ||||
| #  include <string.h> | ||||
|   | ||||
							
								
								
									
										42
									
								
								examples/README.examples
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								examples/README.examples
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| This directory contains examples of the use of zlib. | ||||
|  | ||||
| fitblk.c | ||||
|     compress just enough input to nearly fill a requested output size | ||||
|     - zlib isn't designed to do this, but fitblk does it anyway | ||||
|  | ||||
| gun.c | ||||
|     uncompress a gzip file | ||||
|     - illustrates the use of inflateBack() for high speed file-to-file | ||||
|       decompression using call-back functions | ||||
|     - is approximately twice as fast as gzip -d | ||||
|     - also provides Unix uncompress functionality, again twice as fast | ||||
|  | ||||
| gzappend.c | ||||
|     append to a gzip file | ||||
|     - illustrates the use of the Z_BLOCK flush parameter for inflate() | ||||
|     - illustrates the use of deflatePrime() to start at any bit | ||||
|  | ||||
| gzjoin.c | ||||
|     join gzip files without recalculating the crc or recompressing | ||||
|     - illustrates the use of the Z_BLOCK flush parameter for inflate() | ||||
|     - illustrates the use of crc32_combine() | ||||
|  | ||||
| gzlog.c | ||||
| gzlog.h | ||||
|     efficiently maintain a message log file in gzip format | ||||
|     - illustrates use of raw deflate and Z_SYNC_FLUSH | ||||
|     - illustrates use of gzip header extra field | ||||
|  | ||||
| zlib_how.html | ||||
|     painfully comprehensive description of zpipe.c (see below) | ||||
|     - describes in excruciating detail the use of deflate() and inflate() | ||||
|  | ||||
| zpipe.c | ||||
|     reads and writes zlib streams from stdin to stdout | ||||
|     - illustrates the proper use of deflate() and inflate() | ||||
|     - deeply commented in zlib_how.html (see above) | ||||
|  | ||||
| zran.c | ||||
|     index a zlib or gzip stream and randomly access it | ||||
|     - illustrates the use of Z_BLOCK, inflatePrime(), and | ||||
|       inflateSetDictionary() to provide random access | ||||
							
								
								
									
										233
									
								
								examples/fitblk.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								examples/fitblk.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,233 @@ | ||||
| /* fitblk.c: example of fitting compressed output to a specified size | ||||
|    Not copyrighted -- provided to the public domain | ||||
|    Version 1.1  25 November 2004  Mark Adler */ | ||||
|  | ||||
| /* Version history: | ||||
|    1.0  24 Nov 2004  First version | ||||
|    1.1  25 Nov 2004  Change deflateInit2() to deflateInit() | ||||
|                      Use fixed-size, stack-allocated raw buffers | ||||
|                      Simplify code moving compression to subroutines | ||||
|                      Use assert() for internal errors | ||||
|                      Add detailed description of approach | ||||
|  */ | ||||
|  | ||||
| /* Approach to just fitting a requested compressed size: | ||||
|  | ||||
|    fitblk performs three compression passes on a portion of the input | ||||
|    data in order to determine how much of that input will compress to | ||||
|    nearly the requested output block size.  The first pass generates | ||||
|    enough deflate blocks to produce output to fill the requested | ||||
|    output size plus a specfied excess amount (see the EXCESS define | ||||
|    below).  The last deflate block may go quite a bit past that, but | ||||
|    is discarded.  The second pass decompresses and recompresses just | ||||
|    the compressed data that fit in the requested plus excess sized | ||||
|    buffer.  The deflate process is terminated after that amount of | ||||
|    input, which is less than the amount consumed on the first pass. | ||||
|    The last deflate block of the result will be of a comparable size | ||||
|    to the final product, so that the header for that deflate block and | ||||
|    the compression ratio for that block will be about the same as in | ||||
|    the final product.  The third compression pass decompresses the | ||||
|    result of the second step, but only the compressed data up to the | ||||
|    requested size minus an amount to allow the compressed stream to | ||||
|    complete (see the MARGIN define below).  That will result in a | ||||
|    final compressed stream whose length is less than or equal to the | ||||
|    requested size.  Assuming sufficient input and a requested size | ||||
|    greater than a few hundred bytes, the shortfall will typically be | ||||
|    less than ten bytes. | ||||
|  | ||||
|    If the input is short enough that the first compression completes | ||||
|    before filling the requested output size, then that compressed | ||||
|    stream is return with no recompression. | ||||
|  | ||||
|    EXCESS is chosen to be just greater than the shortfall seen in a | ||||
|    two pass approach similar to the above.  That shortfall is due to | ||||
|    the last deflate block compressing more efficiently with a smaller | ||||
|    header on the second pass.  EXCESS is set to be large enough so | ||||
|    that there is enough uncompressed data for the second pass to fill | ||||
|    out the requested size, and small enough so that the final deflate | ||||
|    block of the second pass will be close in size to the final deflate | ||||
|    block of the third and final pass.  MARGIN is chosen to be just | ||||
|    large enough to assure that the final compression has enough room | ||||
|    to complete in all cases. | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <assert.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| #define local static | ||||
|  | ||||
| /* print nastygram and leave */ | ||||
| local void quit(char *why) | ||||
| { | ||||
|     fprintf(stderr, "fitblk abort: %s\n", why); | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| #define RAWLEN 4096    /* intermediate uncompressed buffer size */ | ||||
|  | ||||
| /* compress from file to def until provided buffer is full or end of | ||||
|    input reached; return last deflate() return value, or Z_ERRNO if | ||||
|    there was read error on the file */ | ||||
| local int partcompress(FILE *in, z_streamp def) | ||||
| { | ||||
|     int ret, flush; | ||||
|     unsigned char raw[RAWLEN]; | ||||
|  | ||||
|     flush = Z_NO_FLUSH; | ||||
|     do { | ||||
|         def->avail_in = fread(raw, 1, RAWLEN, in); | ||||
|         if (ferror(in)) | ||||
|             return Z_ERRNO; | ||||
|         def->next_in = raw; | ||||
|         if (feof(in)) | ||||
|             flush = Z_FINISH; | ||||
|         ret = deflate(def, flush); | ||||
|         assert(ret != Z_STREAM_ERROR); | ||||
|     } while (def->avail_out != 0 && flush == Z_NO_FLUSH); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| /* recompress from inf's input to def's output; the input for inf and | ||||
|    the output for def are set in those structures before calling; | ||||
|    return last deflate() return value, or Z_MEM_ERROR if inflate() | ||||
|    was not able to allocate enough memory when it needed to */ | ||||
| local int recompress(z_streamp inf, z_streamp def) | ||||
| { | ||||
|     int ret, flush; | ||||
|     unsigned char raw[RAWLEN]; | ||||
|  | ||||
|     flush = Z_NO_FLUSH; | ||||
|     do { | ||||
|         /* decompress */ | ||||
|         inf->avail_out = RAWLEN; | ||||
|         inf->next_out = raw; | ||||
|         ret = inflate(inf, Z_NO_FLUSH); | ||||
|         assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && | ||||
|                ret != Z_NEED_DICT); | ||||
|         if (ret == Z_MEM_ERROR) | ||||
|             return ret; | ||||
|  | ||||
|         /* compress what was decompresed until done or no room */ | ||||
|         def->avail_in = RAWLEN - inf->avail_out; | ||||
|         def->next_in = raw; | ||||
|         if (inf->avail_out != 0) | ||||
|             flush = Z_FINISH; | ||||
|         ret = deflate(def, flush); | ||||
|         assert(ret != Z_STREAM_ERROR); | ||||
|     } while (ret != Z_STREAM_END && def->avail_out != 0); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| #define EXCESS 256      /* empirically determined stream overage */ | ||||
| #define MARGIN 8        /* amount to back off for completion */ | ||||
|  | ||||
| /* compress from stdin to fixed-size block on stdout */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     int ret;                /* return code */ | ||||
|     unsigned size;          /* requested fixed output block size */ | ||||
|     unsigned have;          /* bytes written by deflate() call */ | ||||
|     unsigned char *blk;     /* intermediate and final stream */ | ||||
|     unsigned char *tmp;     /* close to desired size stream */ | ||||
|     z_stream def, inf;      /* zlib deflate and inflate states */ | ||||
|  | ||||
|     /* get requested output size */ | ||||
|     if (argc != 2) | ||||
|         quit("need one argument: size of output block"); | ||||
|     ret = strtol(argv[1], argv + 1, 10); | ||||
|     if (argv[1][0] != 0) | ||||
|         quit("argument must be a number"); | ||||
|     if (ret < 8)            /* 8 is minimum zlib stream size */ | ||||
|         quit("need positive size of 8 or greater"); | ||||
|     size = (unsigned)ret; | ||||
|  | ||||
|     /* allocate memory for buffers and compression engine */ | ||||
|     blk = malloc(size + EXCESS); | ||||
|     def.zalloc = Z_NULL; | ||||
|     def.zfree = Z_NULL; | ||||
|     def.opaque = Z_NULL; | ||||
|     ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); | ||||
|     if (ret != Z_OK || blk == NULL) | ||||
|         quit("out of memory"); | ||||
|  | ||||
|     /* compress from stdin until output full, or no more input */ | ||||
|     def.avail_out = size + EXCESS; | ||||
|     def.next_out = blk; | ||||
|     ret = partcompress(stdin, &def); | ||||
|     if (ret == Z_ERRNO) | ||||
|         quit("error reading input"); | ||||
|  | ||||
|     /* if it all fit, then size was undersubscribed -- done! */ | ||||
|     if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { | ||||
|         /* write block to stdout */ | ||||
|         have = size + EXCESS - def.avail_out; | ||||
|         if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) | ||||
|             quit("error writing output"); | ||||
|  | ||||
|         /* clean up and print results to stderr */ | ||||
|         ret = deflateEnd(&def); | ||||
|         assert(ret != Z_STREAM_ERROR); | ||||
|         free(blk); | ||||
|         fprintf(stderr, | ||||
|                 "%u bytes unused out of %u requested (all input)\n", | ||||
|                 size - have, size); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /* it didn't all fit -- set up for recompression */ | ||||
|     inf.zalloc = Z_NULL; | ||||
|     inf.zfree = Z_NULL; | ||||
|     inf.opaque = Z_NULL; | ||||
|     inf.avail_in = 0; | ||||
|     inf.next_in = Z_NULL; | ||||
|     ret = inflateInit(&inf); | ||||
|     tmp = malloc(size + EXCESS); | ||||
|     if (ret != Z_OK || tmp == NULL) | ||||
|         quit("out of memory"); | ||||
|     ret = deflateReset(&def); | ||||
|     assert(ret != Z_STREAM_ERROR); | ||||
|  | ||||
|     /* do first recompression close to the right amount */ | ||||
|     inf.avail_in = size + EXCESS; | ||||
|     inf.next_in = blk; | ||||
|     def.avail_out = size + EXCESS; | ||||
|     def.next_out = tmp; | ||||
|     ret = recompress(&inf, &def); | ||||
|     if (ret == Z_MEM_ERROR) | ||||
|         quit("out of memory"); | ||||
|  | ||||
|     /* set up for next reocmpression */ | ||||
|     ret = inflateReset(&inf); | ||||
|     assert(ret != Z_STREAM_ERROR); | ||||
|     ret = deflateReset(&def); | ||||
|     assert(ret != Z_STREAM_ERROR); | ||||
|  | ||||
|     /* do second and final recompression (third compression) */ | ||||
|     inf.avail_in = size - MARGIN;   /* assure stream will complete */ | ||||
|     inf.next_in = tmp; | ||||
|     def.avail_out = size; | ||||
|     def.next_out = blk; | ||||
|     ret = recompress(&inf, &def); | ||||
|     if (ret == Z_MEM_ERROR) | ||||
|         quit("out of memory"); | ||||
|     assert(ret == Z_STREAM_END);    /* otherwise MARGIN too small */ | ||||
|  | ||||
|     /* done -- write block to stdout */ | ||||
|     have = size - def.avail_out; | ||||
|     if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) | ||||
|         quit("error writing output"); | ||||
|  | ||||
|     /* clean up and print results to stderr */ | ||||
|     free(tmp); | ||||
|     ret = inflateEnd(&inf); | ||||
|     assert(ret != Z_STREAM_ERROR); | ||||
|     ret = deflateEnd(&def); | ||||
|     assert(ret != Z_STREAM_ERROR); | ||||
|     free(blk); | ||||
|     fprintf(stderr, | ||||
|             "%u bytes unused out of %u requested (%lu input)\n", | ||||
|             size - have, size, def.total_in); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										693
									
								
								examples/gun.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										693
									
								
								examples/gun.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,693 @@ | ||||
| /* gun.c -- simple gunzip to give an example of the use of inflateBack() | ||||
|  * Copyright (C) 2003, 2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|    Version 1.3  12 June 2005  Mark Adler */ | ||||
|  | ||||
| /* Version history: | ||||
|    1.0  16 Feb 2003  First version for testing of inflateBack() | ||||
|    1.1  21 Feb 2005  Decompress concatenated gzip streams | ||||
|                      Remove use of "this" variable (C++ keyword) | ||||
|                      Fix return value for in() | ||||
|                      Improve allocation failure checking | ||||
|                      Add typecasting for void * structures | ||||
|                      Add -h option for command version and usage | ||||
|                      Add a bunch of comments | ||||
|    1.2  20 Mar 2005  Add Unix compress (LZW) decompression | ||||
|                      Copy file attributes from input file to output file | ||||
|    1.3  12 Jun 2005  Add casts for error messages [Oberhumer] | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|    gun [ -t ] [ name ... ] | ||||
|  | ||||
|    decompresses the data in the named gzip files.  If no arguments are given, | ||||
|    gun will decompress from stdin to stdout.  The names must end in .gz, -gz, | ||||
|    .z, -z, _z, or .Z.  The uncompressed data will be written to a file name | ||||
|    with the suffix stripped.  On success, the original file is deleted.  On | ||||
|    failure, the output file is deleted.  For most failures, the command will | ||||
|    continue to process the remaining names on the command line.  A memory | ||||
|    allocation failure will abort the command.  If -t is specified, then the | ||||
|    listed files or stdin will be tested as gzip files for integrity (without | ||||
|    checking for a proper suffix), no output will be written, and no files | ||||
|    will be deleted. | ||||
|  | ||||
|    Like gzip, gun allows concatenated gzip streams and will decompress them, | ||||
|    writing all of the uncompressed data to the output.  Unlike gzip, gun allows | ||||
|    an empty file on input, and will produce no error writing an empty output | ||||
|    file. | ||||
|  | ||||
|    gun will also decompress files made by Unix compress, which uses LZW | ||||
|    compression.  These files are automatically detected by virtue of their | ||||
|    magic header bytes.  Since the end of Unix compress stream is marked by the | ||||
|    end-of-file, they cannot be concantenated.  If a Unix compress stream is | ||||
|    encountered in an input file, it is the last stream in that file. | ||||
|  | ||||
|    Like gunzip and uncompress, the file attributes of the orignal compressed | ||||
|    file are maintained in the final uncompressed file, to the extent that the | ||||
|    user permissions allow it. | ||||
|  | ||||
|    On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version | ||||
|    1.2.4) is on the same file, when gun is linked with zlib 1.2.2.  Also the | ||||
|    LZW decompression provided by gun is about twice as fast as the standard | ||||
|    Unix uncompress command. | ||||
|  */ | ||||
|  | ||||
| /* external functions and related types and constants */ | ||||
| #include <stdio.h>          /* fprintf() */ | ||||
| #include <stdlib.h>         /* malloc(), free() */ | ||||
| #include <string.h>         /* strerror(), strcmp(), strlen(), memcpy() */ | ||||
| #include <errno.h>          /* errno */ | ||||
| #include <fcntl.h>          /* open() */ | ||||
| #include <unistd.h>         /* read(), write(), close(), chown(), unlink() */ | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h>       /* stat(), chmod() */ | ||||
| #include <utime.h>          /* utime() */ | ||||
| #include "zlib.h"           /* inflateBackInit(), inflateBack(), */ | ||||
|                             /* inflateBackEnd(), crc32() */ | ||||
|  | ||||
| /* function declaration */ | ||||
| #define local static | ||||
|  | ||||
| /* buffer constants */ | ||||
| #define SIZE 32768U         /* input and output buffer sizes */ | ||||
| #define PIECE 16384         /* limits i/o chunks for 16-bit int case */ | ||||
|  | ||||
| /* structure for infback() to pass to input function in() -- it maintains the | ||||
|    input file and a buffer of size SIZE */ | ||||
| struct ind { | ||||
|     int infile; | ||||
|     unsigned char *inbuf; | ||||
| }; | ||||
|  | ||||
| /* Load input buffer, assumed to be empty, and return bytes loaded and a | ||||
|    pointer to them.  read() is called until the buffer is full, or until it | ||||
|    returns end-of-file or error.  Return 0 on error. */ | ||||
| local unsigned in(void *in_desc, unsigned char **buf) | ||||
| { | ||||
|     int ret; | ||||
|     unsigned len; | ||||
|     unsigned char *next; | ||||
|     struct ind *me = (struct ind *)in_desc; | ||||
|  | ||||
|     next = me->inbuf; | ||||
|     *buf = next; | ||||
|     len = 0; | ||||
|     do { | ||||
|         ret = PIECE; | ||||
|         if ((unsigned)ret > SIZE - len) | ||||
|             ret = (int)(SIZE - len); | ||||
|         ret = (int)read(me->infile, next, ret); | ||||
|         if (ret == -1) { | ||||
|             len = 0; | ||||
|             break; | ||||
|         } | ||||
|         next += ret; | ||||
|         len += ret; | ||||
|     } while (ret != 0 && len < SIZE); | ||||
|     return len; | ||||
| } | ||||
|  | ||||
| /* structure for infback() to pass to output function out() -- it maintains the | ||||
|    output file, a running CRC-32 check on the output and the total number of | ||||
|    bytes output, both for checking against the gzip trailer.  (The length in | ||||
|    the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and | ||||
|    the output is greater than 4 GB.) */ | ||||
| struct outd { | ||||
|     int outfile; | ||||
|     int check;                  /* true if checking crc and total */ | ||||
|     unsigned long crc; | ||||
|     unsigned long total; | ||||
| }; | ||||
|  | ||||
| /* Write output buffer and update the CRC-32 and total bytes written.  write() | ||||
|    is called until all of the output is written or an error is encountered. | ||||
|    On success out() returns 0.  For a write failure, out() returns 1.  If the | ||||
|    output file descriptor is -1, then nothing is written. | ||||
|  */ | ||||
| local int out(void *out_desc, unsigned char *buf, unsigned len) | ||||
| { | ||||
|     int ret; | ||||
|     struct outd *me = (struct outd *)out_desc; | ||||
|  | ||||
|     if (me->check) { | ||||
|         me->crc = crc32(me->crc, buf, len); | ||||
|         me->total += len; | ||||
|     } | ||||
|     if (me->outfile != -1) | ||||
|         do { | ||||
|             ret = PIECE; | ||||
|             if ((unsigned)ret > len) | ||||
|                 ret = (int)len; | ||||
|             ret = (int)write(me->outfile, buf, ret); | ||||
|             if (ret == -1) | ||||
|                 return 1; | ||||
|             buf += ret; | ||||
|             len -= ret; | ||||
|         } while (len != 0); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* next input byte macro for use inside lunpipe() and gunpipe() */ | ||||
| #define NEXT() (have ? 0 : (have = in(indp, &next)), \ | ||||
|                 last = have ? (have--, (int)(*next++)) : -1) | ||||
|  | ||||
| /* memory for gunpipe() and lunpipe() -- | ||||
|    the first 256 entries of prefix[] and suffix[] are never used, could | ||||
|    have offset the index, but it's faster to waste the memory */ | ||||
| unsigned char inbuf[SIZE];              /* input buffer */ | ||||
| unsigned char outbuf[SIZE];             /* output buffer */ | ||||
| unsigned short prefix[65536];           /* index to LZW prefix string */ | ||||
| unsigned char suffix[65536];            /* one-character LZW suffix */ | ||||
| unsigned char match[65280 + 2];         /* buffer for reversed match or gzip | ||||
|                                            32K sliding window */ | ||||
|  | ||||
| /* throw out what's left in the current bits byte buffer (this is a vestigial | ||||
|    aspect of the compressed data format derived from an implementation that | ||||
|    made use of a special VAX machine instruction!) */ | ||||
| #define FLUSHCODE() \ | ||||
|     do { \ | ||||
|         left = 0; \ | ||||
|         rem = 0; \ | ||||
|         if (chunk > have) { \ | ||||
|             chunk -= have; \ | ||||
|             have = 0; \ | ||||
|             if (NEXT() == -1) \ | ||||
|                 break; \ | ||||
|             chunk--; \ | ||||
|             if (chunk > have) { \ | ||||
|                 chunk = have = 0; \ | ||||
|                 break; \ | ||||
|             } \ | ||||
|         } \ | ||||
|         have -= chunk; \ | ||||
|         next += chunk; \ | ||||
|         chunk = 0; \ | ||||
|     } while (0) | ||||
|  | ||||
| /* Decompress a compress (LZW) file from indp to outfile.  The compress magic | ||||
|    header (two bytes) has already been read and verified.  There are have bytes | ||||
|    of buffered input at next.  strm is used for passing error information back | ||||
|    to gunpipe(). | ||||
|  | ||||
|    lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of | ||||
|    file, read error, or write error (a write error indicated by strm->next_in | ||||
|    not equal to Z_NULL), or Z_DATA_ERROR for invalid input. | ||||
|  */ | ||||
| local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, | ||||
|                   int outfile, z_stream *strm) | ||||
| { | ||||
|     int last;                   /* last byte read by NEXT(), or -1 if EOF */ | ||||
|     int chunk;                  /* bytes left in current chunk */ | ||||
|     int left;                   /* bits left in rem */ | ||||
|     unsigned rem;               /* unused bits from input */ | ||||
|     int bits;                   /* current bits per code */ | ||||
|     unsigned code;              /* code, table traversal index */ | ||||
|     unsigned mask;              /* mask for current bits codes */ | ||||
|     int max;                    /* maximum bits per code for this stream */ | ||||
|     int flags;                  /* compress flags, then block compress flag */ | ||||
|     unsigned end;               /* last valid entry in prefix/suffix tables */ | ||||
|     unsigned temp;              /* current code */ | ||||
|     unsigned prev;              /* previous code */ | ||||
|     unsigned final;             /* last character written for previous code */ | ||||
|     unsigned stack;             /* next position for reversed string */ | ||||
|     unsigned outcnt;            /* bytes in output buffer */ | ||||
|     struct outd outd;           /* output structure */ | ||||
|  | ||||
|     /* set up output */ | ||||
|     outd.outfile = outfile; | ||||
|     outd.check = 0; | ||||
|  | ||||
|     /* process remainder of compress header -- a flags byte */ | ||||
|     flags = NEXT(); | ||||
|     if (last == -1) | ||||
|         return Z_BUF_ERROR; | ||||
|     if (flags & 0x60) { | ||||
|         strm->msg = (char *)"unknown lzw flags set"; | ||||
|         return Z_DATA_ERROR; | ||||
|     } | ||||
|     max = flags & 0x1f; | ||||
|     if (max < 9 || max > 16) { | ||||
|         strm->msg = (char *)"lzw bits out of range"; | ||||
|         return Z_DATA_ERROR; | ||||
|     } | ||||
|     if (max == 9)                           /* 9 doesn't really mean 9 */ | ||||
|         max = 10; | ||||
|     flags &= 0x80;                          /* true if block compress */ | ||||
|  | ||||
|     /* clear table */ | ||||
|     bits = 9; | ||||
|     mask = 0x1ff; | ||||
|     end = flags ? 256 : 255; | ||||
|  | ||||
|     /* set up: get first 9-bit code, which is the first decompressed byte, but | ||||
|        don't create a table entry until the next code */ | ||||
|     if (NEXT() == -1)                       /* no compressed data is ok */ | ||||
|         return Z_OK; | ||||
|     final = prev = (unsigned)last;          /* low 8 bits of code */ | ||||
|     if (NEXT() == -1)                       /* missing a bit */ | ||||
|         return Z_BUF_ERROR; | ||||
|     if (last & 1) {                         /* code must be < 256 */ | ||||
|         strm->msg = (char *)"invalid lzw code"; | ||||
|         return Z_DATA_ERROR; | ||||
|     } | ||||
|     rem = (unsigned)last >> 1;              /* remaining 7 bits */ | ||||
|     left = 7; | ||||
|     chunk = bits - 2;                       /* 7 bytes left in this chunk */ | ||||
|     outbuf[0] = (unsigned char)final;       /* write first decompressed byte */ | ||||
|     outcnt = 1; | ||||
|  | ||||
|     /* decode codes */ | ||||
|     stack = 0; | ||||
|     for (;;) { | ||||
|         /* if the table will be full after this, increment the code size */ | ||||
|         if (end >= mask && bits < max) { | ||||
|             FLUSHCODE(); | ||||
|             bits++; | ||||
|             mask <<= 1; | ||||
|             mask++; | ||||
|         } | ||||
|  | ||||
|         /* get a code of length bits */ | ||||
|         if (chunk == 0)                     /* decrement chunk modulo bits */ | ||||
|             chunk = bits; | ||||
|         code = rem;                         /* low bits of code */ | ||||
|         if (NEXT() == -1) {                 /* EOF is end of compressed data */ | ||||
|             /* write remaining buffered output */ | ||||
|             if (outcnt && out(&outd, outbuf, outcnt)) { | ||||
|                 strm->next_in = outbuf;     /* signal write error */ | ||||
|                 return Z_BUF_ERROR; | ||||
|             } | ||||
|             return Z_OK; | ||||
|         } | ||||
|         code += (unsigned)last << left;     /* middle (or high) bits of code */ | ||||
|         left += 8; | ||||
|         chunk--; | ||||
|         if (bits > left) {                  /* need more bits */ | ||||
|             if (NEXT() == -1)               /* can't end in middle of code */ | ||||
|                 return Z_BUF_ERROR; | ||||
|             code += (unsigned)last << left; /* high bits of code */ | ||||
|             left += 8; | ||||
|             chunk--; | ||||
|         } | ||||
|         code &= mask;                       /* mask to current code length */ | ||||
|         left -= bits;                       /* number of unused bits */ | ||||
|         rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ | ||||
|  | ||||
|         /* process clear code (256) */ | ||||
|         if (code == 256 && flags) { | ||||
|             FLUSHCODE(); | ||||
|             bits = 9;                       /* initialize bits and mask */ | ||||
|             mask = 0x1ff; | ||||
|             end = 255;                      /* empty table */ | ||||
|             continue;                       /* get next code */ | ||||
|         } | ||||
|  | ||||
|         /* special code to reuse last match */ | ||||
|         temp = code;                        /* save the current code */ | ||||
|         if (code > end) { | ||||
|             /* Be picky on the allowed code here, and make sure that the code | ||||
|                we drop through (prev) will be a valid index so that random | ||||
|                input does not cause an exception.  The code != end + 1 check is | ||||
|                empirically derived, and not checked in the original uncompress | ||||
|                code.  If this ever causes a problem, that check could be safely | ||||
|                removed.  Leaving this check in greatly improves gun's ability | ||||
|                to detect random or corrupted input after a compress header. | ||||
|                In any case, the prev > end check must be retained. */ | ||||
|             if (code != end + 1 || prev > end) { | ||||
|                 strm->msg = (char *)"invalid lzw code"; | ||||
|                 return Z_DATA_ERROR; | ||||
|             } | ||||
|             match[stack++] = (unsigned char)final; | ||||
|             code = prev; | ||||
|         } | ||||
|  | ||||
|         /* walk through linked list to generate output in reverse order */ | ||||
|         while (code >= 256) { | ||||
|             match[stack++] = suffix[code]; | ||||
|             code = prefix[code]; | ||||
|         } | ||||
|         match[stack++] = (unsigned char)code; | ||||
|         final = code; | ||||
|  | ||||
|         /* link new table entry */ | ||||
|         if (end < mask) { | ||||
|             end++; | ||||
|             prefix[end] = (unsigned short)prev; | ||||
|             suffix[end] = (unsigned char)final; | ||||
|         } | ||||
|  | ||||
|         /* set previous code for next iteration */ | ||||
|         prev = temp; | ||||
|  | ||||
|         /* write output in forward order */ | ||||
|         while (stack > SIZE - outcnt) { | ||||
|             while (outcnt < SIZE) | ||||
|                 outbuf[outcnt++] = match[--stack]; | ||||
|             if (out(&outd, outbuf, outcnt)) { | ||||
|                 strm->next_in = outbuf; /* signal write error */ | ||||
|                 return Z_BUF_ERROR; | ||||
|             } | ||||
|             outcnt = 0; | ||||
|         } | ||||
|         do { | ||||
|             outbuf[outcnt++] = match[--stack]; | ||||
|         } while (stack); | ||||
|  | ||||
|         /* loop for next code with final and prev as the last match, rem and | ||||
|            left provide the first 0..7 bits of the next code, end is the last | ||||
|            valid table entry */ | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Decompress a gzip file from infile to outfile.  strm is assumed to have been | ||||
|    successfully initialized with inflateBackInit().  The input file may consist | ||||
|    of a series of gzip streams, in which case all of them will be decompressed | ||||
|    to the output file.  If outfile is -1, then the gzip stream(s) integrity is | ||||
|    checked and nothing is written. | ||||
|  | ||||
|    The return value is a zlib error code: Z_MEM_ERROR if out of memory, | ||||
|    Z_DATA_ERROR if the header or the compressed data is invalid, or if the | ||||
|    trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends | ||||
|    prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip | ||||
|    stream) follows a valid gzip stream. | ||||
|  */ | ||||
| local int gunpipe(z_stream *strm, int infile, int outfile) | ||||
| { | ||||
|     int ret, first, last; | ||||
|     unsigned have, flags, len; | ||||
|     unsigned char *next; | ||||
|     struct ind ind, *indp; | ||||
|     struct outd outd; | ||||
|  | ||||
|     /* setup input buffer */ | ||||
|     ind.infile = infile; | ||||
|     ind.inbuf = inbuf; | ||||
|     indp = &ind; | ||||
|  | ||||
|     /* decompress concatenated gzip streams */ | ||||
|     have = 0;                               /* no input data read in yet */ | ||||
|     first = 1;                              /* looking for first gzip header */ | ||||
|     strm->next_in = Z_NULL;                 /* so Z_BUF_ERROR means EOF */ | ||||
|     for (;;) { | ||||
|         /* look for the two magic header bytes for a gzip stream */ | ||||
|         if (NEXT() == -1) { | ||||
|             ret = Z_OK; | ||||
|             break;                          /* empty gzip stream is ok */ | ||||
|         } | ||||
|         if (last != 31 || (NEXT() != 139 && last != 157)) { | ||||
|             strm->msg = (char *)"incorrect header check"; | ||||
|             ret = first ? Z_DATA_ERROR : Z_ERRNO; | ||||
|             break;                          /* not a gzip or compress header */ | ||||
|         } | ||||
|         first = 0;                          /* next non-header is junk */ | ||||
|  | ||||
|         /* process a compress (LZW) file -- can't be concatenated after this */ | ||||
|         if (last == 157) { | ||||
|             ret = lunpipe(have, next, indp, outfile, strm); | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         /* process remainder of gzip header */ | ||||
|         ret = Z_BUF_ERROR; | ||||
|         if (NEXT() != 8) {                  /* only deflate method allowed */ | ||||
|             if (last == -1) break; | ||||
|             strm->msg = (char *)"unknown compression method"; | ||||
|             ret = Z_DATA_ERROR; | ||||
|             break; | ||||
|         } | ||||
|         flags = NEXT();                     /* header flags */ | ||||
|         NEXT();                             /* discard mod time, xflgs, os */ | ||||
|         NEXT(); | ||||
|         NEXT(); | ||||
|         NEXT(); | ||||
|         NEXT(); | ||||
|         NEXT(); | ||||
|         if (last == -1) break; | ||||
|         if (flags & 0xe0) { | ||||
|             strm->msg = (char *)"unknown header flags set"; | ||||
|             ret = Z_DATA_ERROR; | ||||
|             break; | ||||
|         } | ||||
|         if (flags & 4) {                    /* extra field */ | ||||
|             len = NEXT(); | ||||
|             len += (unsigned)(NEXT()) << 8; | ||||
|             if (last == -1) break; | ||||
|             while (len > have) { | ||||
|                 len -= have; | ||||
|                 have = 0; | ||||
|                 if (NEXT() == -1) break; | ||||
|                 len--; | ||||
|             } | ||||
|             if (last == -1) break; | ||||
|             have -= len; | ||||
|             next += len; | ||||
|         } | ||||
|         if (flags & 8)                      /* file name */ | ||||
|             while (NEXT() != 0 && last != -1) | ||||
|                 ; | ||||
|         if (flags & 16)                     /* comment */ | ||||
|             while (NEXT() != 0 && last != -1) | ||||
|                 ; | ||||
|         if (flags & 2) {                    /* header crc */ | ||||
|             NEXT(); | ||||
|             NEXT(); | ||||
|         } | ||||
|         if (last == -1) break; | ||||
|  | ||||
|         /* set up output */ | ||||
|         outd.outfile = outfile; | ||||
|         outd.check = 1; | ||||
|         outd.crc = crc32(0L, Z_NULL, 0); | ||||
|         outd.total = 0; | ||||
|  | ||||
|         /* decompress data to output */ | ||||
|         strm->next_in = next; | ||||
|         strm->avail_in = have; | ||||
|         ret = inflateBack(strm, in, indp, out, &outd); | ||||
|         if (ret != Z_STREAM_END) break; | ||||
|         next = strm->next_in; | ||||
|         have = strm->avail_in; | ||||
|         strm->next_in = Z_NULL;             /* so Z_BUF_ERROR means EOF */ | ||||
|  | ||||
|         /* check trailer */ | ||||
|         ret = Z_BUF_ERROR; | ||||
|         if (NEXT() != (outd.crc & 0xff) || | ||||
|             NEXT() != ((outd.crc >> 8) & 0xff) || | ||||
|             NEXT() != ((outd.crc >> 16) & 0xff) || | ||||
|             NEXT() != ((outd.crc >> 24) & 0xff)) { | ||||
|             /* crc error */ | ||||
|             if (last != -1) { | ||||
|                 strm->msg = (char *)"incorrect data check"; | ||||
|                 ret = Z_DATA_ERROR; | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|         if (NEXT() != (outd.total & 0xff) || | ||||
|             NEXT() != ((outd.total >> 8) & 0xff) || | ||||
|             NEXT() != ((outd.total >> 16) & 0xff) || | ||||
|             NEXT() != ((outd.total >> 24) & 0xff)) { | ||||
|             /* length error */ | ||||
|             if (last != -1) { | ||||
|                 strm->msg = (char *)"incorrect length check"; | ||||
|                 ret = Z_DATA_ERROR; | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         /* go back and look for another gzip stream */ | ||||
|     } | ||||
|  | ||||
|     /* clean up and return */ | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| /* Copy file attributes, from -> to, as best we can.  This is best effort, so | ||||
|    no errors are reported.  The mode bits, including suid, sgid, and the sticky | ||||
|    bit are copied (if allowed), the owner's user id and group id are copied | ||||
|    (again if allowed), and the access and modify times are copied. */ | ||||
| local void copymeta(char *from, char *to) | ||||
| { | ||||
|     struct stat was; | ||||
|     struct utimbuf when; | ||||
|  | ||||
|     /* get all of from's Unix meta data, return if not a regular file */ | ||||
|     if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) | ||||
|         return; | ||||
|  | ||||
|     /* set to's mode bits, ignore errors */ | ||||
|     (void)chmod(to, was.st_mode & 07777); | ||||
|  | ||||
|     /* copy owner's user and group, ignore errors */ | ||||
|     (void)chown(to, was.st_uid, was.st_gid); | ||||
|  | ||||
|     /* copy access and modify times, ignore errors */ | ||||
|     when.actime = was.st_atime; | ||||
|     when.modtime = was.st_mtime; | ||||
|     (void)utime(to, &when); | ||||
| } | ||||
|  | ||||
| /* Decompress the file inname to the file outnname, of if test is true, just | ||||
|    decompress without writing and check the gzip trailer for integrity.  If | ||||
|    inname is NULL or an empty string, read from stdin.  If outname is NULL or | ||||
|    an empty string, write to stdout.  strm is a pre-initialized inflateBack | ||||
|    structure.  When appropriate, copy the file attributes from inname to | ||||
|    outname. | ||||
|  | ||||
|    gunzip() returns 1 if there is an out-of-memory error or an unexpected | ||||
|    return code from gunpipe().  Otherwise it returns 0. | ||||
|  */ | ||||
| local int gunzip(z_stream *strm, char *inname, char *outname, int test) | ||||
| { | ||||
|     int ret; | ||||
|     int infile, outfile; | ||||
|  | ||||
|     /* open files */ | ||||
|     if (inname == NULL || *inname == 0) { | ||||
|         inname = "-"; | ||||
|         infile = 0;     /* stdin */ | ||||
|     } | ||||
|     else { | ||||
|         infile = open(inname, O_RDONLY, 0); | ||||
|         if (infile == -1) { | ||||
|             fprintf(stderr, "gun cannot open %s\n", inname); | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
|     if (test) | ||||
|         outfile = -1; | ||||
|     else if (outname == NULL || *outname == 0) { | ||||
|         outname = "-"; | ||||
|         outfile = 1;    /* stdout */ | ||||
|     } | ||||
|     else { | ||||
|         outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); | ||||
|         if (outfile == -1) { | ||||
|             close(infile); | ||||
|             fprintf(stderr, "gun cannot create %s\n", outname); | ||||
|             return 0; | ||||
|         } | ||||
|     } | ||||
|     errno = 0; | ||||
|  | ||||
|     /* decompress */ | ||||
|     ret = gunpipe(strm, infile, outfile); | ||||
|     if (outfile > 2) close(outfile); | ||||
|     if (infile > 2) close(infile); | ||||
|  | ||||
|     /* interpret result */ | ||||
|     switch (ret) { | ||||
|     case Z_OK: | ||||
|     case Z_ERRNO: | ||||
|         if (infile > 2 && outfile > 2) { | ||||
|             copymeta(inname, outname);          /* copy attributes */ | ||||
|             unlink(inname); | ||||
|         } | ||||
|         if (ret == Z_ERRNO) | ||||
|             fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", | ||||
|                     inname); | ||||
|         break; | ||||
|     case Z_DATA_ERROR: | ||||
|         if (outfile > 2) unlink(outname); | ||||
|         fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); | ||||
|         break; | ||||
|     case Z_MEM_ERROR: | ||||
|         if (outfile > 2) unlink(outname); | ||||
|         fprintf(stderr, "gun out of memory error--aborting\n"); | ||||
|         return 1; | ||||
|     case Z_BUF_ERROR: | ||||
|         if (outfile > 2) unlink(outname); | ||||
|         if (strm->next_in != Z_NULL) { | ||||
|             fprintf(stderr, "gun write error on %s: %s\n", | ||||
|                     outname, strerror(errno)); | ||||
|         } | ||||
|         else if (errno) { | ||||
|             fprintf(stderr, "gun read error on %s: %s\n", | ||||
|                     inname, strerror(errno)); | ||||
|         } | ||||
|         else { | ||||
|             fprintf(stderr, "gun unexpected end of file on %s\n", | ||||
|                     inname); | ||||
|         } | ||||
|         break; | ||||
|     default: | ||||
|         if (outfile > 2) unlink(outname); | ||||
|         fprintf(stderr, "gun internal error--aborting\n"); | ||||
|         return 1; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* Process the gun command line arguments.  See the command syntax near the | ||||
|    beginning of this source file. */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     int ret, len, test; | ||||
|     char *outname; | ||||
|     unsigned char *window; | ||||
|     z_stream strm; | ||||
|  | ||||
|     /* initialize inflateBack state for repeated use */ | ||||
|     window = match;                         /* reuse LZW match buffer */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     ret = inflateBackInit(&strm, 15, window); | ||||
|     if (ret != Z_OK) { | ||||
|         fprintf(stderr, "gun out of memory error--aborting\n"); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* decompress each file to the same name with the suffix removed */ | ||||
|     argc--; | ||||
|     argv++; | ||||
|     test = 0; | ||||
|     if (argc && strcmp(*argv, "-h") == 0) { | ||||
|         fprintf(stderr, "gun 1.3 (12 Jun 2005)\n"); | ||||
|         fprintf(stderr, "Copyright (c) 2005 Mark Adler\n"); | ||||
|         fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); | ||||
|         return 0; | ||||
|     } | ||||
|     if (argc && strcmp(*argv, "-t") == 0) { | ||||
|         test = 1; | ||||
|         argc--; | ||||
|         argv++; | ||||
|     } | ||||
|     if (argc) | ||||
|         do { | ||||
|             if (test) | ||||
|                 outname = NULL; | ||||
|             else { | ||||
|                 len = (int)strlen(*argv); | ||||
|                 if (strcmp(*argv + len - 3, ".gz") == 0 || | ||||
|                     strcmp(*argv + len - 3, "-gz") == 0) | ||||
|                     len -= 3; | ||||
|                 else if (strcmp(*argv + len - 2, ".z") == 0 || | ||||
|                     strcmp(*argv + len - 2, "-z") == 0 || | ||||
|                     strcmp(*argv + len - 2, "_z") == 0 || | ||||
|                     strcmp(*argv + len - 2, ".Z") == 0) | ||||
|                     len -= 2; | ||||
|                 else { | ||||
|                     fprintf(stderr, "gun error: no gz type on %s--skipping\n", | ||||
|                             *argv); | ||||
|                     continue; | ||||
|                 } | ||||
|                 outname = malloc(len + 1); | ||||
|                 if (outname == NULL) { | ||||
|                     fprintf(stderr, "gun out of memory error--aborting\n"); | ||||
|                     ret = 1; | ||||
|                     break; | ||||
|                 } | ||||
|                 memcpy(outname, *argv, len); | ||||
|                 outname[len] = 0; | ||||
|             } | ||||
|             ret = gunzip(&strm, *argv, outname, test); | ||||
|             if (outname != NULL) free(outname); | ||||
|             if (ret) break; | ||||
|         } while (argv++, --argc); | ||||
|     else | ||||
|         ret = gunzip(&strm, NULL, NULL, test); | ||||
|  | ||||
|     /* clean up */ | ||||
|     inflateBackEnd(&strm); | ||||
|     return ret; | ||||
| } | ||||
							
								
								
									
										448
									
								
								examples/gzjoin.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										448
									
								
								examples/gzjoin.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,448 @@ | ||||
| /* gzjoin -- command to join gzip files into one gzip file | ||||
|  | ||||
|   Copyright (C) 2004 Mark Adler, all rights reserved | ||||
|   version 1.0, 11 Dec 2004 | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the author be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|   Mark Adler    madler@alumni.caltech.edu | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Change history: | ||||
|  * | ||||
|  * 1.0  11 Dec 2004     - First version | ||||
|  * 1.1  12 Jun 2005     - Changed ssize_t to long for portability | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|    gzjoin takes one or more gzip files on the command line and writes out a | ||||
|    single gzip file that will uncompress to the concatenation of the | ||||
|    uncompressed data from the individual gzip files.  gzjoin does this without | ||||
|    having to recompress any of the data and without having to calculate a new | ||||
|    crc32 for the concatenated uncompressed data.  gzjoin does however have to | ||||
|    decompress all of the input data in order to find the bits in the compressed | ||||
|    data that need to be modified to concatenate the streams. | ||||
|  | ||||
|    gzjoin does not do an integrity check on the input gzip files other than | ||||
|    checking the gzip header and decompressing the compressed data.  They are | ||||
|    otherwise assumed to be complete and correct. | ||||
|  | ||||
|    Each joint between gzip files removes at least 18 bytes of previous trailer | ||||
|    and subsequent header, and inserts an average of about three bytes to the | ||||
|    compressed data in order to connect the streams.  The output gzip file | ||||
|    has a minimal ten-byte gzip header with no file name or modification time. | ||||
|  | ||||
|    This program was written to illustrate the use of the Z_BLOCK option of | ||||
|    inflate() and the crc32_combine() function.  gzjoin will not compile with | ||||
|    versions of zlib earlier than 1.2.3. | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h>      /* fputs(), fprintf(), fwrite(), putc() */ | ||||
| #include <stdlib.h>     /* exit(), malloc(), free() */ | ||||
| #include <fcntl.h>      /* open() */ | ||||
| #include <unistd.h>     /* close(), read(), lseek() */ | ||||
| #include "zlib.h" | ||||
|     /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ | ||||
|  | ||||
| #define local static | ||||
|  | ||||
| /* exit with an error (return a value to allow use in an expression) */ | ||||
| local int bail(char *why1, char *why2) | ||||
| { | ||||
|     fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); | ||||
|     exit(1); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* -- simple buffered file input with access to the buffer -- */ | ||||
|  | ||||
| #define CHUNK 32768         /* must be a power of two and fit in unsigned */ | ||||
|  | ||||
| /* bin buffered input file type */ | ||||
| typedef struct { | ||||
|     char *name;             /* name of file for error messages */ | ||||
|     int fd;                 /* file descriptor */ | ||||
|     unsigned left;          /* bytes remaining at next */ | ||||
|     unsigned char *next;    /* next byte to read */ | ||||
|     unsigned char *buf;     /* allocated buffer of length CHUNK */ | ||||
| } bin; | ||||
|  | ||||
| /* close a buffered file and free allocated memory */ | ||||
| local void bclose(bin *in) | ||||
| { | ||||
|     if (in != NULL) { | ||||
|         if (in->fd != -1) | ||||
|             close(in->fd); | ||||
|         if (in->buf != NULL) | ||||
|             free(in->buf); | ||||
|         free(in); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* open a buffered file for input, return a pointer to type bin, or NULL on | ||||
|    failure */ | ||||
| local bin *bopen(char *name) | ||||
| { | ||||
|     bin *in; | ||||
|  | ||||
|     in = malloc(sizeof(bin)); | ||||
|     if (in == NULL) | ||||
|         return NULL; | ||||
|     in->buf = malloc(CHUNK); | ||||
|     in->fd = open(name, O_RDONLY, 0); | ||||
|     if (in->buf == NULL || in->fd == -1) { | ||||
|         bclose(in); | ||||
|         return NULL; | ||||
|     } | ||||
|     in->left = 0; | ||||
|     in->next = in->buf; | ||||
|     in->name = name; | ||||
|     return in; | ||||
| } | ||||
|  | ||||
| /* load buffer from file, return -1 on read error, 0 or 1 on success, with | ||||
|    1 indicating that end-of-file was reached */ | ||||
| local int bload(bin *in) | ||||
| { | ||||
|     long len; | ||||
|  | ||||
|     if (in == NULL) | ||||
|         return -1; | ||||
|     if (in->left != 0) | ||||
|         return 0; | ||||
|     in->next = in->buf; | ||||
|     do { | ||||
|         len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); | ||||
|         if (len < 0) | ||||
|             return -1; | ||||
|         in->left += (unsigned)len; | ||||
|     } while (len != 0 && in->left < CHUNK); | ||||
|     return len == 0 ? 1 : 0; | ||||
| } | ||||
|  | ||||
| /* get a byte from the file, bail if end of file */ | ||||
| #define bget(in) (in->left ? 0 : bload(in), \ | ||||
|                   in->left ? (in->left--, *(in->next)++) : \ | ||||
|                     bail("unexpected end of file on ", in->name)) | ||||
|  | ||||
| /* get a four-byte little-endian unsigned integer from file */ | ||||
| local unsigned long bget4(bin *in) | ||||
| { | ||||
|     unsigned long val; | ||||
|  | ||||
|     val = bget(in); | ||||
|     val += (unsigned long)(bget(in)) << 8; | ||||
|     val += (unsigned long)(bget(in)) << 16; | ||||
|     val += (unsigned long)(bget(in)) << 24; | ||||
|     return val; | ||||
| } | ||||
|  | ||||
| /* skip bytes in file */ | ||||
| local void bskip(bin *in, unsigned skip) | ||||
| { | ||||
|     /* check pointer */ | ||||
|     if (in == NULL) | ||||
|         return; | ||||
|  | ||||
|     /* easy case -- skip bytes in buffer */ | ||||
|     if (skip <= in->left) { | ||||
|         in->left -= skip; | ||||
|         in->next += skip; | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     /* skip what's in buffer, discard buffer contents */ | ||||
|     skip -= in->left; | ||||
|     in->left = 0; | ||||
|  | ||||
|     /* seek past multiples of CHUNK bytes */ | ||||
|     if (skip > CHUNK) { | ||||
|         unsigned left; | ||||
|  | ||||
|         left = skip & (CHUNK - 1); | ||||
|         if (left == 0) { | ||||
|             /* exact number of chunks: seek all the way minus one byte to check | ||||
|                for end-of-file with a read */ | ||||
|             lseek(in->fd, skip - 1, SEEK_CUR); | ||||
|             if (read(in->fd, in->buf, 1) != 1) | ||||
|                 bail("unexpected end of file on ", in->name); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         /* skip the integral chunks, update skip with remainder */ | ||||
|         lseek(in->fd, skip - left, SEEK_CUR); | ||||
|         skip = left; | ||||
|     } | ||||
|  | ||||
|     /* read more input and skip remainder */ | ||||
|     bload(in); | ||||
|     if (skip > in->left) | ||||
|         bail("unexpected end of file on ", in->name); | ||||
|     in->left -= skip; | ||||
|     in->next += skip; | ||||
| } | ||||
|  | ||||
| /* -- end of buffered input functions -- */ | ||||
|  | ||||
| /* skip the gzip header from file in */ | ||||
| local void gzhead(bin *in) | ||||
| { | ||||
|     int flags; | ||||
|  | ||||
|     /* verify gzip magic header and compression method */ | ||||
|     if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) | ||||
|         bail(in->name, " is not a valid gzip file"); | ||||
|  | ||||
|     /* get and verify flags */ | ||||
|     flags = bget(in); | ||||
|     if ((flags & 0xe0) != 0) | ||||
|         bail("unknown reserved bits set in ", in->name); | ||||
|  | ||||
|     /* skip modification time, extra flags, and os */ | ||||
|     bskip(in, 6); | ||||
|  | ||||
|     /* skip extra field if present */ | ||||
|     if (flags & 4) { | ||||
|         unsigned len; | ||||
|  | ||||
|         len = bget(in); | ||||
|         len += (unsigned)(bget(in)) << 8; | ||||
|         bskip(in, len); | ||||
|     } | ||||
|  | ||||
|     /* skip file name if present */ | ||||
|     if (flags & 8) | ||||
|         while (bget(in) != 0) | ||||
|             ; | ||||
|  | ||||
|     /* skip comment if present */ | ||||
|     if (flags & 16) | ||||
|         while (bget(in) != 0) | ||||
|             ; | ||||
|  | ||||
|     /* skip header crc if present */ | ||||
|     if (flags & 2) | ||||
|         bskip(in, 2); | ||||
| } | ||||
|  | ||||
| /* write a four-byte little-endian unsigned integer to out */ | ||||
| local void put4(unsigned long val, FILE *out) | ||||
| { | ||||
|     putc(val & 0xff, out); | ||||
|     putc((val >> 8) & 0xff, out); | ||||
|     putc((val >> 16) & 0xff, out); | ||||
|     putc((val >> 24) & 0xff, out); | ||||
| } | ||||
|  | ||||
| /* Load up zlib stream from buffered input, bail if end of file */ | ||||
| local void zpull(z_streamp strm, bin *in) | ||||
| { | ||||
|     if (in->left == 0) | ||||
|         bload(in); | ||||
|     if (in->left == 0) | ||||
|         bail("unexpected end of file on ", in->name); | ||||
|     strm->avail_in = in->left; | ||||
|     strm->next_in = in->next; | ||||
| } | ||||
|  | ||||
| /* Write header for gzip file to out and initialize trailer. */ | ||||
| local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) | ||||
| { | ||||
|     fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); | ||||
|     *crc = crc32(0L, Z_NULL, 0); | ||||
|     *tot = 0; | ||||
| } | ||||
|  | ||||
| /* Copy the compressed data from name, zeroing the last block bit of the last | ||||
|    block if clr is true, and adding empty blocks as needed to get to a byte | ||||
|    boundary.  If clr is false, then the last block becomes the last block of | ||||
|    the output, and the gzip trailer is written.  crc and tot maintains the | ||||
|    crc and length (modulo 2^32) of the output for the trailer.  The resulting | ||||
|    gzip file is written to out.  gzinit() must be called before the first call | ||||
|    of gzcopy() to write the gzip header and to initialize crc and tot. */ | ||||
| local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, | ||||
|                   FILE *out) | ||||
| { | ||||
|     int ret;                /* return value from zlib functions */ | ||||
|     int pos;                /* where the "last block" bit is in byte */ | ||||
|     int last;               /* true if processing the last block */ | ||||
|     bin *in;                /* buffered input file */ | ||||
|     unsigned char *start;   /* start of compressed data in buffer */ | ||||
|     unsigned char *junk;    /* buffer for uncompressed data -- discarded */ | ||||
|     z_off_t len;            /* length of uncompressed data (support > 4 GB) */ | ||||
|     z_stream strm;          /* zlib inflate stream */ | ||||
|  | ||||
|     /* open gzip file and skip header */ | ||||
|     in = bopen(name); | ||||
|     if (in == NULL) | ||||
|         bail("could not open ", name); | ||||
|     gzhead(in); | ||||
|  | ||||
|     /* allocate buffer for uncompressed data and initialize raw inflate | ||||
|        stream */ | ||||
|     junk = malloc(CHUNK); | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     strm.avail_in = 0; | ||||
|     strm.next_in = Z_NULL; | ||||
|     ret = inflateInit2(&strm, -15); | ||||
|     if (junk == NULL || ret != Z_OK) | ||||
|         bail("out of memory", ""); | ||||
|  | ||||
|     /* inflate and copy compressed data, clear last-block bit if requested */ | ||||
|     len = 0; | ||||
|     zpull(&strm, in); | ||||
|     start = strm.next_in; | ||||
|     last = start[0] & 1; | ||||
|     if (last && clr) | ||||
|         start[0] &= ~1; | ||||
|     strm.avail_out = 0; | ||||
|     for (;;) { | ||||
|         /* if input used and output done, write used input and get more */ | ||||
|         if (strm.avail_in == 0 && strm.avail_out != 0) { | ||||
|             fwrite(start, 1, strm.next_in - start, out); | ||||
|             start = in->buf; | ||||
|             in->left = 0; | ||||
|             zpull(&strm, in); | ||||
|         } | ||||
|  | ||||
|         /* decompress -- return early when end-of-block reached */ | ||||
|         strm.avail_out = CHUNK; | ||||
|         strm.next_out = junk; | ||||
|         ret = inflate(&strm, Z_BLOCK); | ||||
|         switch (ret) { | ||||
|         case Z_MEM_ERROR: | ||||
|             bail("out of memory", ""); | ||||
|         case Z_DATA_ERROR: | ||||
|             bail("invalid compressed data in ", in->name); | ||||
|         } | ||||
|  | ||||
|         /* update length of uncompressed data */ | ||||
|         len += CHUNK - strm.avail_out; | ||||
|  | ||||
|         /* check for block boundary (only get this when block copied out) */ | ||||
|         if (strm.data_type & 128) { | ||||
|             /* if that was the last block, then done */ | ||||
|             if (last) | ||||
|                 break; | ||||
|  | ||||
|             /* number of unused bits in last byte */ | ||||
|             pos = strm.data_type & 7; | ||||
|  | ||||
|             /* find the next last-block bit */ | ||||
|             if (pos != 0) { | ||||
|                 /* next last-block bit is in last used byte */ | ||||
|                 pos = 0x100 >> pos; | ||||
|                 last = strm.next_in[-1] & pos; | ||||
|                 if (last && clr) | ||||
|                     strm.next_in[-1] &= ~pos; | ||||
|             } | ||||
|             else { | ||||
|                 /* next last-block bit is in next unused byte */ | ||||
|                 if (strm.avail_in == 0) { | ||||
|                     /* don't have that byte yet -- get it */ | ||||
|                     fwrite(start, 1, strm.next_in - start, out); | ||||
|                     start = in->buf; | ||||
|                     in->left = 0; | ||||
|                     zpull(&strm, in); | ||||
|                 } | ||||
|                 last = strm.next_in[0] & 1; | ||||
|                 if (last && clr) | ||||
|                     strm.next_in[0] &= ~1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* update buffer with unused input */ | ||||
|     in->left = strm.avail_in; | ||||
|     in->next = strm.next_in; | ||||
|  | ||||
|     /* copy used input, write empty blocks to get to byte boundary */ | ||||
|     pos = strm.data_type & 7; | ||||
|     fwrite(start, 1, in->next - start - 1, out); | ||||
|     last = in->next[-1]; | ||||
|     if (pos == 0 || !clr) | ||||
|         /* already at byte boundary, or last file: write last byte */ | ||||
|         putc(last, out); | ||||
|     else { | ||||
|         /* append empty blocks to last byte */ | ||||
|         last &= ((0x100 >> pos) - 1);       /* assure unused bits are zero */ | ||||
|         if (pos & 1) { | ||||
|             /* odd -- append an empty stored block */ | ||||
|             putc(last, out); | ||||
|             if (pos == 1) | ||||
|                 putc(0, out);               /* two more bits in block header */ | ||||
|             fwrite("\0\0\xff\xff", 1, 4, out); | ||||
|         } | ||||
|         else { | ||||
|             /* even -- append 1, 2, or 3 empty fixed blocks */ | ||||
|             switch (pos) { | ||||
|             case 6: | ||||
|                 putc(last | 8, out); | ||||
|                 last = 0; | ||||
|             case 4: | ||||
|                 putc(last | 0x20, out); | ||||
|                 last = 0; | ||||
|             case 2: | ||||
|                 putc(last | 0x80, out); | ||||
|                 putc(0, out); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* update crc and tot */ | ||||
|     *crc = crc32_combine(*crc, bget4(in), len); | ||||
|     *tot += (unsigned long)len; | ||||
|  | ||||
|     /* clean up */ | ||||
|     inflateEnd(&strm); | ||||
|     free(junk); | ||||
|     bclose(in); | ||||
|  | ||||
|     /* write trailer if this is the last gzip file */ | ||||
|     if (!clr) { | ||||
|         put4(*crc, out); | ||||
|         put4(*tot, out); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* join the gzip files on the command line, write result to stdout */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     unsigned long crc, tot;     /* running crc and total uncompressed length */ | ||||
|  | ||||
|     /* skip command name */ | ||||
|     argc--; | ||||
|     argv++; | ||||
|  | ||||
|     /* show usage if no arguments */ | ||||
|     if (argc == 0) { | ||||
|         fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", | ||||
|               stderr); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /* join gzip files on command line and write to stdout */ | ||||
|     gzinit(&crc, &tot, stdout); | ||||
|     while (argc--) | ||||
|         gzcopy(*argv++, argc, &crc, &tot, stdout); | ||||
|  | ||||
|     /* done */ | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										413
									
								
								examples/gzlog.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										413
									
								
								examples/gzlog.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,413 @@ | ||||
| /* | ||||
|  * gzlog.c | ||||
|  * Copyright (C) 2004 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in gzlog.h | ||||
|  * version 1.0, 26 Nov 2004 | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <string.h>             /* memcmp() */ | ||||
| #include <stdlib.h>             /* malloc(), free(), NULL */ | ||||
| #include <sys/types.h>          /* size_t, off_t */ | ||||
| #include <unistd.h>             /* read(), close(), sleep(), ftruncate(), */ | ||||
|                                 /* lseek() */ | ||||
| #include <fcntl.h>              /* open() */ | ||||
| #include <sys/file.h>           /* flock() */ | ||||
| #include "zlib.h"               /* deflateInit2(), deflate(), deflateEnd() */ | ||||
|  | ||||
| #include "gzlog.h"              /* interface */ | ||||
| #define local static | ||||
|  | ||||
| /* log object structure */ | ||||
| typedef struct { | ||||
|     int id;                 /* object identifier */ | ||||
|     int fd;                 /* log file descriptor */ | ||||
|     off_t extra;            /* offset of extra "ap" subfield */ | ||||
|     off_t mark_off;         /* offset of marked data */ | ||||
|     off_t last_off;         /* offset of last block */ | ||||
|     unsigned long crc;      /* uncompressed crc */ | ||||
|     unsigned long len;      /* uncompressed length (modulo 2^32) */ | ||||
|     unsigned stored;        /* length of current stored block */ | ||||
| } gz_log; | ||||
|  | ||||
| #define GZLOGID 19334       /* gz_log object identifier */ | ||||
|  | ||||
| #define LOCK_RETRY 1            /* retry lock once a second */ | ||||
| #define LOCK_PATIENCE 1200      /* try about twenty minutes before forcing */ | ||||
|  | ||||
| /* acquire a lock on a file */ | ||||
| local int lock(int fd) | ||||
| { | ||||
|     int patience; | ||||
|  | ||||
|     /* try to lock every LOCK_RETRY seconds for LOCK_PATIENCE seconds */ | ||||
|     patience = LOCK_PATIENCE; | ||||
|     do { | ||||
|         if (flock(fd, LOCK_EX + LOCK_NB) == 0) | ||||
|             return 0; | ||||
|         (void)sleep(LOCK_RETRY); | ||||
|         patience -= LOCK_RETRY; | ||||
|     } while (patience > 0); | ||||
|  | ||||
|     /* we've run out of patience -- give up */ | ||||
|     return -1; | ||||
| } | ||||
|  | ||||
| /* release lock */ | ||||
| local void unlock(int fd) | ||||
| { | ||||
|     (void)flock(fd, LOCK_UN); | ||||
| } | ||||
|  | ||||
| /* release a log object */ | ||||
| local void log_clean(gz_log *log) | ||||
| { | ||||
|     unlock(log->fd); | ||||
|     (void)close(log->fd); | ||||
|     free(log); | ||||
| } | ||||
|  | ||||
| /* read an unsigned long from a byte buffer little-endian */ | ||||
| local unsigned long make_ulg(unsigned char *buf) | ||||
| { | ||||
|     int n; | ||||
|     unsigned long val; | ||||
|  | ||||
|     val = (unsigned long)(*buf++); | ||||
|     for (n = 8; n < 32; n += 8) | ||||
|         val += (unsigned long)(*buf++) << n; | ||||
|     return val; | ||||
| } | ||||
|  | ||||
| /* read an off_t from a byte buffer little-endian */ | ||||
| local off_t make_off(unsigned char *buf) | ||||
| { | ||||
|     int n; | ||||
|     off_t val; | ||||
|  | ||||
|     val = (off_t)(*buf++); | ||||
|     for (n = 8; n < 64; n += 8) | ||||
|         val += (off_t)(*buf++) << n; | ||||
|     return val; | ||||
| } | ||||
|  | ||||
| /* write an unsigned long little-endian to byte buffer */ | ||||
| local void dice_ulg(unsigned long val, unsigned char *buf) | ||||
| { | ||||
|     int n; | ||||
|  | ||||
|     for (n = 0; n < 4; n++) { | ||||
|         *buf++ = val & 0xff; | ||||
|         val >>= 8; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* write an off_t little-endian to byte buffer */ | ||||
| local void dice_off(off_t val, unsigned char *buf) | ||||
| { | ||||
|     int n; | ||||
|  | ||||
|     for (n = 0; n < 8; n++) { | ||||
|         *buf++ = val & 0xff; | ||||
|         val >>= 8; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* initial, empty gzip file for appending */ | ||||
| local char empty_gz[] = { | ||||
|     0x1f, 0x8b,                 /* magic gzip id */ | ||||
|     8,                          /* compression method is deflate */ | ||||
|     4,                          /* there is an extra field */ | ||||
|     0, 0, 0, 0,                 /* no modification time provided */ | ||||
|     0, 0xff,                    /* no extra flags, no OS */ | ||||
|     20, 0, 'a', 'p', 16, 0,     /* extra field with "ap" subfield */ | ||||
|     32, 0, 0, 0, 0, 0, 0, 0,    /* offset of uncompressed data */ | ||||
|     32, 0, 0, 0, 0, 0, 0, 0,    /* offset of last block */ | ||||
|     1, 0, 0, 0xff, 0xff,        /* empty stored block (last) */ | ||||
|     0, 0, 0, 0,                 /* crc */ | ||||
|     0, 0, 0, 0                  /* uncompressed length */ | ||||
| }; | ||||
|  | ||||
| /* initialize a log object with locking */ | ||||
| void *gzlog_open(char *path) | ||||
| { | ||||
|     unsigned xlen; | ||||
|     unsigned char temp[20]; | ||||
|     unsigned sub_len; | ||||
|     int good; | ||||
|     gz_log *log; | ||||
|  | ||||
|     /* allocate log structure */ | ||||
|     log = malloc(sizeof(gz_log)); | ||||
|     if (log == NULL) | ||||
|         return NULL; | ||||
|     log->id = GZLOGID; | ||||
|  | ||||
|     /* open file, creating it if necessary, and locking it */ | ||||
|     log->fd = open(path, O_RDWR | O_CREAT, 0600); | ||||
|     if (log->fd < 0) { | ||||
|         free(log); | ||||
|         return NULL; | ||||
|     } | ||||
|     if (lock(log->fd)) { | ||||
|         close(log->fd); | ||||
|         free(log); | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     /* if file is empty, write new gzip stream */ | ||||
|     if (lseek(log->fd, 0, SEEK_END) == 0) { | ||||
|         if (write(log->fd, empty_gz, sizeof(empty_gz)) != sizeof(empty_gz)) { | ||||
|             log_clean(log); | ||||
|             return NULL; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* check gzip header */ | ||||
|     (void)lseek(log->fd, 0, SEEK_SET); | ||||
|     if (read(log->fd, temp, 12) != 12 || temp[0] != 0x1f || | ||||
|         temp[1] != 0x8b || temp[2] != 8 || (temp[3] & 4) == 0) { | ||||
|         log_clean(log); | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     /* process extra field to find "ap" sub-field */ | ||||
|     xlen = temp[10] + (temp[11] << 8); | ||||
|     good = 0; | ||||
|     while (xlen) { | ||||
|         if (xlen < 4 || read(log->fd, temp, 4) != 4) | ||||
|             break; | ||||
|         sub_len = temp[2]; | ||||
|         sub_len += temp[3] << 8; | ||||
|         xlen -= 4; | ||||
|         if (memcmp(temp, "ap", 2) == 0 && sub_len == 16) { | ||||
|             good = 1; | ||||
|             break; | ||||
|         } | ||||
|         if (xlen < sub_len) | ||||
|             break; | ||||
|         (void)lseek(log->fd, sub_len, SEEK_CUR); | ||||
|         xlen -= sub_len; | ||||
|     } | ||||
|     if (!good) { | ||||
|         log_clean(log); | ||||
|         return NULL; | ||||
|     } | ||||
|  | ||||
|     /* read in "ap" sub-field */ | ||||
|     log->extra = lseek(log->fd, 0, SEEK_CUR); | ||||
|     if (read(log->fd, temp, 16) != 16) { | ||||
|         log_clean(log); | ||||
|         return NULL; | ||||
|     } | ||||
|     log->mark_off = make_off(temp); | ||||
|     log->last_off = make_off(temp + 8); | ||||
|  | ||||
|     /* get crc, length of gzip file */ | ||||
|     (void)lseek(log->fd, log->last_off, SEEK_SET); | ||||
|     if (read(log->fd, temp, 13) != 13 || | ||||
|         memcmp(temp, "\001\000\000\377\377", 5) != 0) { | ||||
|         log_clean(log); | ||||
|         return NULL; | ||||
|     } | ||||
|     log->crc = make_ulg(temp + 5); | ||||
|     log->len = make_ulg(temp + 9); | ||||
|  | ||||
|     /* set up to write over empty last block */ | ||||
|     (void)lseek(log->fd, log->last_off + 5, SEEK_SET); | ||||
|     log->stored = 0; | ||||
|     return (void *)log; | ||||
| } | ||||
|  | ||||
| /* maximum amount to put in a stored block before starting a new one */ | ||||
| #define MAX_BLOCK 16384 | ||||
|  | ||||
| /* write a block to a log object */ | ||||
| int gzlog_write(void *obj, char *data, size_t len) | ||||
| { | ||||
|     size_t some; | ||||
|     unsigned char temp[5]; | ||||
|     gz_log *log; | ||||
|  | ||||
|     /* check object */ | ||||
|     log = (gz_log *)obj; | ||||
|     if (log == NULL || log->id != GZLOGID) | ||||
|         return 1; | ||||
|  | ||||
|     /* write stored blocks until all of the input is written */ | ||||
|     do { | ||||
|         some = MAX_BLOCK - log->stored; | ||||
|         if (some > len) | ||||
|             some = len; | ||||
|         if (write(log->fd, data, some) != some) | ||||
|             return 1; | ||||
|         log->crc = crc32(log->crc, (unsigned char *)data, some); | ||||
|         log->len += some; | ||||
|         len -= some; | ||||
|         data += some; | ||||
|         log->stored += some; | ||||
|  | ||||
|         /* if the stored block is full, end it and start another */ | ||||
|         if (log->stored == MAX_BLOCK) { | ||||
|             (void)lseek(log->fd, log->last_off, SEEK_SET); | ||||
|             temp[0] = 0; | ||||
|             dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16), | ||||
|                      temp + 1); | ||||
|             if (write(log->fd, temp, 5) != 5) | ||||
|                 return 1; | ||||
|             log->last_off = lseek(log->fd, log->stored, SEEK_CUR); | ||||
|             (void)lseek(log->fd, 5, SEEK_CUR); | ||||
|             log->stored = 0; | ||||
|         } | ||||
|     } while (len); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* recompress the remaining stored deflate data in place */ | ||||
| local int recomp(gz_log *log) | ||||
| { | ||||
|     z_stream strm; | ||||
|     size_t len, max; | ||||
|     unsigned char *in; | ||||
|     unsigned char *out; | ||||
|     unsigned char temp[16]; | ||||
|  | ||||
|     /* allocate space and read it all in (it's around 1 MB) */ | ||||
|     len = log->last_off - log->mark_off; | ||||
|     max = len + (len >> 12) + (len >> 14) + 11; | ||||
|     out = malloc(max); | ||||
|     if (out == NULL) | ||||
|         return 1; | ||||
|     in = malloc(len); | ||||
|     if (in == NULL) { | ||||
|         free(out); | ||||
|         return 1; | ||||
|     } | ||||
|     (void)lseek(log->fd, log->mark_off, SEEK_SET); | ||||
|     if (read(log->fd, in, len) != len) { | ||||
|         free(in); | ||||
|         free(out); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* recompress in memory, decoding stored data as we go */ | ||||
|     /* note: this assumes that unsigned is four bytes or more */ | ||||
|     /*       consider not making that assumption */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     if (deflateInit2(&strm, Z_BEST_COMPRESSION, Z_DEFLATED, -15, 8, | ||||
|         Z_DEFAULT_STRATEGY) != Z_OK) { | ||||
|         free(in); | ||||
|         free(out); | ||||
|         return 1; | ||||
|     } | ||||
|     strm.next_in = in; | ||||
|     strm.avail_out = max; | ||||
|     strm.next_out = out; | ||||
|     while (len >= 5) { | ||||
|         if (strm.next_in[0] != 0) | ||||
|             break; | ||||
|         strm.avail_in = strm.next_in[1] + (strm.next_in[2] << 8); | ||||
|         strm.next_in += 5; | ||||
|         len -= 5; | ||||
|         if (strm.avail_in != 0) { | ||||
|             if (len < strm.avail_in) | ||||
|                 break; | ||||
|             len -= strm.avail_in; | ||||
|             (void)deflate(&strm, Z_NO_FLUSH); | ||||
|             if (strm.avail_in != 0 || strm.avail_out == 0) | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|     (void)deflate(&strm, Z_SYNC_FLUSH); | ||||
|     (void)deflateEnd(&strm); | ||||
|     free(in); | ||||
|     if (len != 0 || strm.avail_out == 0) { | ||||
|         free(out); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* overwrite stored data with compressed data */ | ||||
|     (void)lseek(log->fd, log->mark_off, SEEK_SET); | ||||
|     len = max - strm.avail_out; | ||||
|     if (write(log->fd, out, len) != len) { | ||||
|         free(out); | ||||
|         return 1; | ||||
|     } | ||||
|     free(out); | ||||
|  | ||||
|     /* write last empty block, crc, and length */ | ||||
|     log->mark_off = log->last_off = lseek(log->fd, 0, SEEK_CUR); | ||||
|     temp[0] = 1; | ||||
|     dice_ulg(0xffffL << 16, temp + 1); | ||||
|     dice_ulg(log->crc, temp + 5); | ||||
|     dice_ulg(log->len, temp + 9); | ||||
|     if (write(log->fd, temp, 13) != 13) | ||||
|         return 1; | ||||
|  | ||||
|     /* truncate file to discard remaining stored data and old trailer */ | ||||
|     ftruncate(log->fd, lseek(log->fd, 0, SEEK_CUR)); | ||||
|  | ||||
|     /* update extra field to point to new last empty block */ | ||||
|     (void)lseek(log->fd, log->extra, SEEK_SET); | ||||
|     dice_off(log->mark_off, temp); | ||||
|     dice_off(log->last_off, temp + 8); | ||||
|     if (write(log->fd, temp, 16) != 16) | ||||
|         return 1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* maximum accumulation of stored blocks before compressing */ | ||||
| #define MAX_STORED 1048576 | ||||
|  | ||||
| /* close log object */ | ||||
| int gzlog_close(void *obj) | ||||
| { | ||||
|     unsigned char temp[8]; | ||||
|     gz_log *log; | ||||
|  | ||||
|     /* check object */ | ||||
|     log = (gz_log *)obj; | ||||
|     if (log == NULL || log->id != GZLOGID) | ||||
|         return 1; | ||||
|  | ||||
|     /* go to start of most recent block being written */ | ||||
|     (void)lseek(log->fd, log->last_off, SEEK_SET); | ||||
|  | ||||
|     /* if some stuff was put there, update block */ | ||||
|     if (log->stored) { | ||||
|         temp[0] = 0; | ||||
|         dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16), | ||||
|                  temp + 1); | ||||
|         if (write(log->fd, temp, 5) != 5) | ||||
|             return 1; | ||||
|         log->last_off = lseek(log->fd, log->stored, SEEK_CUR); | ||||
|     } | ||||
|  | ||||
|     /* write last block (empty) */ | ||||
|     if (write(log->fd, "\001\000\000\377\377", 5) != 5) | ||||
|         return 1; | ||||
|  | ||||
|     /* write updated crc and uncompressed length */ | ||||
|     dice_ulg(log->crc, temp); | ||||
|     dice_ulg(log->len, temp + 4); | ||||
|     if (write(log->fd, temp, 8) != 8) | ||||
|         return 1; | ||||
|  | ||||
|     /* put offset of that last block in gzip extra block */ | ||||
|     (void)lseek(log->fd, log->extra + 8, SEEK_SET); | ||||
|     dice_off(log->last_off, temp); | ||||
|     if (write(log->fd, temp, 8) != 8) | ||||
|         return 1; | ||||
|  | ||||
|     /* if more than 1 MB stored, then time to compress it */ | ||||
|     if (log->last_off - log->mark_off > MAX_STORED) { | ||||
|         if (recomp(log)) | ||||
|             return 1; | ||||
|     } | ||||
|  | ||||
|     /* unlock and close file */ | ||||
|     log_clean(log); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										58
									
								
								examples/gzlog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								examples/gzlog.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /* gzlog.h | ||||
|   Copyright (C) 2004 Mark Adler, all rights reserved | ||||
|   version 1.0, 26 Nov 2004 | ||||
|  | ||||
|   This software is provided 'as-is', without any express or implied | ||||
|   warranty.  In no event will the author be held liable for any damages | ||||
|   arising from the use of this software. | ||||
|  | ||||
|   Permission is granted to anyone to use this software for any purpose, | ||||
|   including commercial applications, and to alter it and redistribute it | ||||
|   freely, subject to the following restrictions: | ||||
|  | ||||
|   1. The origin of this software must not be misrepresented; you must not | ||||
|      claim that you wrote the original software. If you use this software | ||||
|      in a product, an acknowledgment in the product documentation would be | ||||
|      appreciated but is not required. | ||||
|   2. Altered source versions must be plainly marked as such, and must not be | ||||
|      misrepresented as being the original software. | ||||
|   3. This notice may not be removed or altered from any source distribution. | ||||
|  | ||||
|   Mark Adler    madler@alumni.caltech.edu | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|    The gzlog object allows writing short messages to a gzipped log file, | ||||
|    opening the log file locked for small bursts, and then closing it.  The log | ||||
|    object works by appending stored data to the gzip file until 1 MB has been | ||||
|    accumulated.  At that time, the stored data is compressed, and replaces the | ||||
|    uncompressed data in the file.  The log file is truncated to its new size at | ||||
|    that time.  After closing, the log file is always valid gzip file that can | ||||
|    decompressed to recover what was written. | ||||
|  | ||||
|    A gzip header "extra" field contains two file offsets for appending.  The | ||||
|    first points to just after the last compressed data.  The second points to | ||||
|    the last stored block in the deflate stream, which is empty.  All of the | ||||
|    data between those pointers is uncompressed. | ||||
|  */ | ||||
|  | ||||
| /* Open a gzlog object, creating the log file if it does not exist.  Return | ||||
|    NULL on error.  Note that gzlog_open() could take a long time to return if | ||||
|    there is difficulty in locking the file. */ | ||||
| void *gzlog_open(char *path); | ||||
|  | ||||
| /* Write to a gzlog object.  Return non-zero on error.  This function will | ||||
|    simply write data to the file uncompressed.  Compression of the data | ||||
|    will not occur until gzlog_close() is called.  It is expected that | ||||
|    gzlog_write() is used for a short message, and then gzlog_close() is | ||||
|    called.  If a large amount of data is to be written, then the application | ||||
|    should write no more than 1 MB at a time with gzlog_write() before | ||||
|    calling gzlog_close() and then gzlog_open() again. */ | ||||
| int gzlog_write(void *log, char *data, size_t len); | ||||
|  | ||||
| /* Close a gzlog object.  Return non-zero on error.  The log file is locked | ||||
|    until this function is called.  This function will compress stored data | ||||
|    at the end of the gzip file if at least 1 MB has been accumulated.  Note | ||||
|    that the file will not be a valid gzip file until this function completes. | ||||
|  */ | ||||
| int gzlog_close(void *log); | ||||
							
								
								
									
										545
									
								
								examples/zlib_how.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										545
									
								
								examples/zlib_how.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,545 @@ | ||||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" | ||||
|   "http://www.w3.org/TR/REC-html40/loose.dtd"> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | ||||
| <title>zlib Usage Example</title> | ||||
| <!--  Copyright (c) 2004, 2005 Mark Adler.  --> | ||||
| </head> | ||||
| <body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#00A000"> | ||||
| <h2 align="center"> zlib Usage Example </h2> | ||||
| We often get questions about how the <tt>deflate()</tt> and <tt>inflate()</tt> functions should be used. | ||||
| Users wonder when they should provide more input, when they should use more output, | ||||
| what to do with a <tt>Z_BUF_ERROR</tt>, how to make sure the process terminates properly, and | ||||
| so on.  So for those who have read <tt>zlib.h</tt> (a few times), and | ||||
| would like further edification, below is an annotated example in C of simple routines to compress and decompress | ||||
| from an input file to an output file using <tt>deflate()</tt> and <tt>inflate()</tt> respectively.  The | ||||
| annotations are interspersed between lines of the code.  So please read between the lines. | ||||
| We hope this helps explain some of the intricacies of <em>zlib</em>. | ||||
| <p> | ||||
| Without further adieu, here is the program <a href="zpipe.c"><tt>zpipe.c</tt></a>: | ||||
| <pre><b> | ||||
| /* zpipe.c: example of proper use of zlib's inflate() and deflate() | ||||
|    Not copyrighted -- provided to the public domain | ||||
|    Version 1.4  11 December 2005  Mark Adler */ | ||||
|  | ||||
| /* Version history: | ||||
|    1.0  30 Oct 2004  First version | ||||
|    1.1   8 Nov 2004  Add void casting for unused return values | ||||
|                      Use switch statement for inflate() return values | ||||
|    1.2   9 Nov 2004  Add assertions to document zlib guarantees | ||||
|    1.3   6 Apr 2005  Remove incorrect assertion in inf() | ||||
|    1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions | ||||
|                      Avoid some compiler warnings for input and output buffers | ||||
|  */ | ||||
| </b></pre><!-- --> | ||||
| We now include the header files for the required definitions.  From | ||||
| <tt>stdio.h</tt> we use <tt>fopen()</tt>, <tt>fread()</tt>, <tt>fwrite()</tt>, | ||||
| <tt>feof()</tt>, <tt>ferror()</tt>, and <tt>fclose()</tt> for file i/o, and | ||||
| <tt>fputs()</tt> for error messages.  From <tt>string.h</tt> we use | ||||
| <tt>strcmp()</tt> for command line argument processing. | ||||
| From <tt>assert.h</tt> we use the <tt>assert()</tt> macro. | ||||
| From <tt>zlib.h</tt> | ||||
| we use the basic compression functions <tt>deflateInit()</tt>, | ||||
| <tt>deflate()</tt>, and <tt>deflateEnd()</tt>, and the basic decompression | ||||
| functions <tt>inflateInit()</tt>, <tt>inflate()</tt>, and | ||||
| <tt>inflateEnd()</tt>. | ||||
| <pre><b> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
| #include "zlib.h" | ||||
| </b></pre><!-- --> | ||||
| This is an ugly hack required to avoid corruption of the input and output data on | ||||
| Windows/MS-DOS systems.  Without this, those systems would assume that the input and output | ||||
| files are text, and try to convert the end-of-line characters from one standard to | ||||
| another.  That would corrupt binary data, and in particular would render the compressed data unusable. | ||||
| This sets the input and output to binary which suppresses the end-of-line conversions. | ||||
| <tt>SET_BINARY_MODE()</tt> will be used later on <tt>stdin</tt> and <tt>stdout</tt>, at the beginning of <tt>main()</tt>. | ||||
| <pre><b> | ||||
| #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) | ||||
| #  include <fcntl.h> | ||||
| #  include <io.h> | ||||
| #  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) | ||||
| #else | ||||
| #  define SET_BINARY_MODE(file) | ||||
| #endif | ||||
| </b></pre><!-- --> | ||||
| <tt>CHUNK</tt> is simply the buffer size for feeding data to and pulling data | ||||
| from the <em>zlib</em> routines.  Larger buffer sizes would be more efficient, | ||||
| especially for <tt>inflate()</tt>.  If the memory is available, buffers sizes | ||||
| on the order of 128K or 256K bytes should be used. | ||||
| <pre><b> | ||||
| #define CHUNK 16384 | ||||
| </b></pre><!-- --> | ||||
| The <tt>def()</tt> routine compresses data from an input file to an output file.  The output data | ||||
| will be in the <em>zlib</em> format, which is different from the <em>gzip</em> or <em>zip</em> | ||||
| formats.  The <em>zlib</em> format has a very small header of only two bytes to identify it as | ||||
| a <em>zlib</em> stream and to provide decoding information, and a four-byte trailer with a fast | ||||
| check value to verify the integrity of the uncompressed data after decoding. | ||||
| <pre><b> | ||||
| /* Compress from file source to file dest until EOF on source. | ||||
|    def() returns Z_OK on success, Z_MEM_ERROR if memory could not be | ||||
|    allocated for processing, Z_STREAM_ERROR if an invalid compression | ||||
|    level is supplied, Z_VERSION_ERROR if the version of zlib.h and the | ||||
|    version of the library linked do not match, or Z_ERRNO if there is | ||||
|    an error reading or writing the files. */ | ||||
| int def(FILE *source, FILE *dest, int level) | ||||
| { | ||||
| </b></pre> | ||||
| Here are the local variables for <tt>def()</tt>.  <tt>ret</tt> will be used for <em>zlib</em> | ||||
| return codes.  <tt>flush</tt> will keep track of the current flushing state for <tt>deflate()</tt>, | ||||
| which is either no flushing, or flush to completion after the end of the input file is reached. | ||||
| <tt>have</tt> is the amount of data returned from <tt>deflate()</tt>.  The <tt>strm</tt> structure | ||||
| is used to pass information to and from the <em>zlib</em> routines, and to maintain the | ||||
| <tt>deflate()</tt> state.  <tt>in</tt> and <tt>out</tt> are the input and output buffers for | ||||
| <tt>deflate()</tt>. | ||||
| <pre><b> | ||||
|     int ret, flush; | ||||
|     unsigned have; | ||||
|     z_stream strm; | ||||
|     unsigned char in[CHUNK]; | ||||
|     unsigned char out[CHUNK]; | ||||
| </b></pre><!-- --> | ||||
| The first thing we do is to initialize the <em>zlib</em> state for compression using | ||||
| <tt>deflateInit()</tt>.  This must be done before the first use of <tt>deflate()</tt>. | ||||
| The <tt>zalloc</tt>, <tt>zfree</tt>, and <tt>opaque</tt> fields in the <tt>strm</tt> | ||||
| structure must be initialized before calling <tt>deflateInit()</tt>.  Here they are | ||||
| set to the <em>zlib</em> constant <tt>Z_NULL</tt> to request that <em>zlib</em> use | ||||
| the default memory allocation routines.  An application may also choose to provide | ||||
| custom memory allocation routines here.  <tt>deflateInit()</tt> will allocate on the | ||||
| order of 256K bytes for the internal state. | ||||
| (See <a href="zlib_tech.html"><em>zlib Technical Details</em></a>.) | ||||
| <p> | ||||
| <tt>deflateInit()</tt> is called with a pointer to the structure to be initialized and | ||||
| the compression level, which is an integer in the range of -1 to 9.  Lower compression | ||||
| levels result in faster execution, but less compression.  Higher levels result in | ||||
| greater compression, but slower execution.  The <em>zlib</em> constant Z_DEFAULT_COMPRESSION, | ||||
| equal to -1, | ||||
| provides a good compromise between compression and speed and is equivalent to level 6. | ||||
| Level 0 actually does no compression at all, and in fact expands the data slightly to produce | ||||
| the <em>zlib</em> format (it is not a byte-for-byte copy of the input). | ||||
| More advanced applications of <em>zlib</em> | ||||
| may use <tt>deflateInit2()</tt> here instead.  Such an application may want to reduce how | ||||
| much memory will be used, at some price in compression.  Or it may need to request a | ||||
| <em>gzip</em> header and trailer instead of a <em>zlib</em> header and trailer, or raw | ||||
| encoding with no header or trailer at all. | ||||
| <p> | ||||
| We must check the return value of <tt>deflateInit()</tt> against the <em>zlib</em> constant | ||||
| <tt>Z_OK</tt> to make sure that it was able to | ||||
| allocate memory for the internal state, and that the provided arguments were valid. | ||||
| <tt>deflateInit()</tt> will also check that the version of <em>zlib</em> that the <tt>zlib.h</tt> | ||||
| file came from matches the version of <em>zlib</em> actually linked with the program.  This | ||||
| is especially important for environments in which <em>zlib</em> is a shared library. | ||||
| <p> | ||||
| Note that an application can initialize multiple, independent <em>zlib</em> streams, which can | ||||
| operate in parallel.  The state information maintained in the structure allows the <em>zlib</em> | ||||
| routines to be reentrant. | ||||
| <pre><b> | ||||
|     /* allocate deflate state */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     ret = deflateInit(&strm, level); | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
| </b></pre><!-- --> | ||||
| With the pleasantries out of the way, now we can get down to business.  The outer <tt>do</tt>-loop | ||||
| reads all of the input file and exits at the bottom of the loop once end-of-file is reached. | ||||
| This loop contains the only call of <tt>deflate()</tt>.  So we must make sure that all of the | ||||
| input data has been processed and that all of the output data has been generated and consumed | ||||
| before we fall out of the loop at the bottom. | ||||
| <pre><b> | ||||
|     /* compress until end of file */ | ||||
|     do { | ||||
| </b></pre> | ||||
| We start off by reading data from the input file.  The number of bytes read is put directly | ||||
| into <tt>avail_in</tt>, and a pointer to those bytes is put into <tt>next_in</tt>.  We also | ||||
| check to see if end-of-file on the input has been reached.  If we are at the end of file, then <tt>flush</tt> is set to the | ||||
| <em>zlib</em> constant <tt>Z_FINISH</tt>, which is later passed to <tt>deflate()</tt> to | ||||
| indicate that this is the last chunk of input data to compress.  We need to use <tt>feof()</tt> | ||||
| to check for end-of-file as opposed to seeing if fewer than <tt>CHUNK</tt> bytes have been read.  The | ||||
| reason is that if the input file length is an exact multiple of <tt>CHUNK</tt>, we will miss | ||||
| the fact that we got to the end-of-file, and not know to tell <tt>deflate()</tt> to finish | ||||
| up the compressed stream.  If we are not yet at the end of the input, then the <em>zlib</em> | ||||
| constant <tt>Z_NO_FLUSH</tt> will be passed to <tt>deflate</tt> to indicate that we are still | ||||
| in the middle of the uncompressed data. | ||||
| <p> | ||||
| If there is an error in reading from the input file, the process is aborted with | ||||
| <tt>deflateEnd()</tt> being called to free the allocated <em>zlib</em> state before returning | ||||
| the error.  We wouldn't want a memory leak, now would we?  <tt>deflateEnd()</tt> can be called | ||||
| at any time after the state has been initialized.  Once that's done, <tt>deflateInit()</tt> (or | ||||
| <tt>deflateInit2()</tt>) would have to be called to start a new compression process.  There is | ||||
| no point here in checking the <tt>deflateEnd()</tt> return code.  The deallocation can't fail. | ||||
| <pre><b> | ||||
|         strm.avail_in = fread(in, 1, CHUNK, source); | ||||
|         if (ferror(source)) { | ||||
|             (void)deflateEnd(&strm); | ||||
|             return Z_ERRNO; | ||||
|         } | ||||
|         flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; | ||||
|         strm.next_in = in; | ||||
| </b></pre><!-- --> | ||||
| The inner <tt>do</tt>-loop passes our chunk of input data to <tt>deflate()</tt>, and then | ||||
| keeps calling <tt>deflate()</tt> until it is done producing output.  Once there is no more | ||||
| new output, <tt>deflate()</tt> is guaranteed to have consumed all of the input, i.e., | ||||
| <tt>avail_in</tt> will be zero. | ||||
| <pre><b> | ||||
|         /* run deflate() on input until output buffer not full, finish | ||||
|            compression if all of source has been read in */ | ||||
|         do { | ||||
| </b></pre> | ||||
| Output space is provided to <tt>deflate()</tt> by setting <tt>avail_out</tt> to the number | ||||
| of available output bytes and <tt>next_out</tt> to a pointer to that space. | ||||
| <pre><b> | ||||
|             strm.avail_out = CHUNK; | ||||
|             strm.next_out = out; | ||||
| </b></pre> | ||||
| Now we call the compression engine itself, <tt>deflate()</tt>.  It takes as many of the | ||||
| <tt>avail_in</tt> bytes at <tt>next_in</tt> as it can process, and writes as many as | ||||
| <tt>avail_out</tt> bytes to <tt>next_out</tt>.  Those counters and pointers are then | ||||
| updated past the input data consumed and the output data written.  It is the amount of | ||||
| output space available that may limit how much input is consumed. | ||||
| Hence the inner loop to make sure that | ||||
| all of the input is consumed by providing more output space each time.  Since <tt>avail_in</tt> | ||||
| and <tt>next_in</tt> are updated by <tt>deflate()</tt>, we don't have to mess with those | ||||
| between <tt>deflate()</tt> calls until it's all used up. | ||||
| <p> | ||||
| The parameters to <tt>deflate()</tt> are a pointer to the <tt>strm</tt> structure containing | ||||
| the input and output information and the internal compression engine state, and a parameter | ||||
| indicating whether and how to flush data to the output.  Normally <tt>deflate</tt> will consume | ||||
| several K bytes of input data before producing any output (except for the header), in order | ||||
| to accumulate statistics on the data for optimum compression.  It will then put out a burst of | ||||
| compressed data, and proceed to consume more input before the next burst.  Eventually, | ||||
| <tt>deflate()</tt> | ||||
| must be told to terminate the stream, complete the compression with provided input data, and | ||||
| write out the trailer check value.  <tt>deflate()</tt> will continue to compress normally as long | ||||
| as the flush parameter is <tt>Z_NO_FLUSH</tt>.  Once the <tt>Z_FINISH</tt> parameter is provided, | ||||
| <tt>deflate()</tt> will begin to complete the compressed output stream.  However depending on how | ||||
| much output space is provided, <tt>deflate()</tt> may have to be called several times until it | ||||
| has provided the complete compressed stream, even after it has consumed all of the input.  The flush | ||||
| parameter must continue to be <tt>Z_FINISH</tt> for those subsequent calls. | ||||
| <p> | ||||
| There are other values of the flush parameter that are used in more advanced applications.  You can | ||||
| force <tt>deflate()</tt> to produce a burst of output that encodes all of the input data provided | ||||
| so far, even if it wouldn't have otherwise, for example to control data latency on a link with | ||||
| compressed data.  You can also ask that <tt>deflate()</tt> do that as well as erase any history up to | ||||
| that point so that what follows can be decompressed independently, for example for random access | ||||
| applications.  Both requests will degrade compression by an amount depending on how often such | ||||
| requests are made. | ||||
| <p> | ||||
| <tt>deflate()</tt> has a return value that can indicate errors, yet we do not check it here.  Why | ||||
| not?  Well, it turns out that <tt>deflate()</tt> can do no wrong here.  Let's go through | ||||
| <tt>deflate()</tt>'s return values and dispense with them one by one.  The possible values are | ||||
| <tt>Z_OK</tt>, <tt>Z_STREAM_END</tt>, <tt>Z_STREAM_ERROR</tt>, or <tt>Z_BUF_ERROR</tt>.  <tt>Z_OK</tt> | ||||
| is, well, ok.  <tt>Z_STREAM_END</tt> is also ok and will be returned for the last call of | ||||
| <tt>deflate()</tt>.  This is already guaranteed by calling <tt>deflate()</tt> with <tt>Z_FINISH</tt> | ||||
| until it has no more output.  <tt>Z_STREAM_ERROR</tt> is only possible if the stream is not | ||||
| initialized properly, but we did initialize it properly.  There is no harm in checking for | ||||
| <tt>Z_STREAM_ERROR</tt> here, for example to check for the possibility that some | ||||
| other part of the application inadvertently clobbered the memory containing the <em>zlib</em> state. | ||||
| <tt>Z_BUF_ERROR</tt> will be explained further below, but | ||||
| suffice it to say that this is simply an indication that <tt>deflate()</tt> could not consume | ||||
| more input or produce more output.  <tt>deflate()</tt> can be called again with more output space | ||||
| or more available input, which it will be in this code. | ||||
| <pre><b> | ||||
|             ret = deflate(&strm, flush);    /* no bad return value */ | ||||
|             assert(ret != Z_STREAM_ERROR);  /* state not clobbered */ | ||||
| </b></pre> | ||||
| Now we compute how much output <tt>deflate()</tt> provided on the last call, which is the | ||||
| difference between how much space was provided before the call, and how much output space | ||||
| is still available after the call.  Then that data, if any, is written to the output file. | ||||
| We can then reuse the output buffer for the next call of <tt>deflate()</tt>.  Again if there | ||||
| is a file i/o error, we call <tt>deflateEnd()</tt> before returning to avoid a memory leak. | ||||
| <pre><b> | ||||
|             have = CHUNK - strm.avail_out; | ||||
|             if (fwrite(out, 1, have, dest) != have || ferror(dest)) { | ||||
|                 (void)deflateEnd(&strm); | ||||
|                 return Z_ERRNO; | ||||
|             } | ||||
| </b></pre> | ||||
| The inner <tt>do</tt>-loop is repeated until the last <tt>deflate()</tt> call fails to fill the | ||||
| provided output buffer.  Then we know that <tt>deflate()</tt> has done as much as it can with | ||||
| the provided input, and that all of that input has been consumed.  We can then fall out of this | ||||
| loop and reuse the input buffer. | ||||
| <p> | ||||
| The way we tell that <tt>deflate()</tt> has no more output is by seeing that it did not fill | ||||
| the output buffer, leaving <tt>avail_out</tt> greater than zero.  However suppose that | ||||
| <tt>deflate()</tt> has no more output, but just so happened to exactly fill the output buffer! | ||||
| <tt>avail_out</tt> is zero, and we can't tell that <tt>deflate()</tt> has done all it can. | ||||
| As far as we know, <tt>deflate()</tt> | ||||
| has more output for us.  So we call it again.  But now <tt>deflate()</tt> produces no output | ||||
| at all, and <tt>avail_out</tt> remains unchanged as <tt>CHUNK</tt>.  That <tt>deflate()</tt> call | ||||
| wasn't able to do anything, either consume input or produce output, and so it returns | ||||
| <tt>Z_BUF_ERROR</tt>.  (See, I told you I'd cover this later.)  However this is not a problem at | ||||
| all.  Now we finally have the desired indication that <tt>deflate()</tt> is really done, | ||||
| and so we drop out of the inner loop to provide more input to <tt>deflate()</tt>. | ||||
| <p> | ||||
| With <tt>flush</tt> set to <tt>Z_FINISH</tt>, this final set of <tt>deflate()</tt> calls will | ||||
| complete the output stream.  Once that is done, subsequent calls of <tt>deflate()</tt> would return | ||||
| <tt>Z_STREAM_ERROR</tt> if the flush parameter is not <tt>Z_FINISH</tt>, and do no more processing | ||||
| until the state is reinitialized. | ||||
| <p> | ||||
| Some applications of <em>zlib</em> have two loops that call <tt>deflate()</tt> | ||||
| instead of the single inner loop we have here.  The first loop would call | ||||
| without flushing and feed all of the data to <tt>deflate()</tt>.  The second loop would call | ||||
| <tt>deflate()</tt> with no more | ||||
| data and the <tt>Z_FINISH</tt> parameter to complete the process.  As you can see from this | ||||
| example, that can be avoided by simply keeping track of the current flush state. | ||||
| <pre><b> | ||||
|         } while (strm.avail_out == 0); | ||||
|         assert(strm.avail_in == 0);     /* all input will be used */ | ||||
| </b></pre><!-- --> | ||||
| Now we check to see if we have already processed all of the input file.  That information was | ||||
| saved in the <tt>flush</tt> variable, so we see if that was set to <tt>Z_FINISH</tt>.  If so, | ||||
| then we're done and we fall out of the outer loop.  We're guaranteed to get <tt>Z_STREAM_END</tt> | ||||
| from the last <tt>deflate()</tt> call, since we ran it until the last chunk of input was | ||||
| consumed and all of the output was generated. | ||||
| <pre><b> | ||||
|         /* done when last data in file processed */ | ||||
|     } while (flush != Z_FINISH); | ||||
|     assert(ret == Z_STREAM_END);        /* stream will be complete */ | ||||
| </b></pre><!-- --> | ||||
| The process is complete, but we still need to deallocate the state to avoid a memory leak | ||||
| (or rather more like a memory hemorrhage if you didn't do this).  Then | ||||
| finally we can return with a happy return value. | ||||
| <pre><b> | ||||
|     /* clean up and return */ | ||||
|     (void)deflateEnd(&strm); | ||||
|     return Z_OK; | ||||
| } | ||||
| </b></pre><!-- --> | ||||
| Now we do the same thing for decompression in the <tt>inf()</tt> routine. <tt>inf()</tt> | ||||
| decompresses what is hopefully a valid <em>zlib</em> stream from the input file and writes the | ||||
| uncompressed data to the output file.  Much of the discussion above for <tt>def()</tt> | ||||
| applies to <tt>inf()</tt> as well, so the discussion here will focus on the differences between | ||||
| the two. | ||||
| <pre><b> | ||||
| /* Decompress from file source to file dest until stream ends or EOF. | ||||
|    inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be | ||||
|    allocated for processing, Z_DATA_ERROR if the deflate data is | ||||
|    invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and | ||||
|    the version of the library linked do not match, or Z_ERRNO if there | ||||
|    is an error reading or writing the files. */ | ||||
| int inf(FILE *source, FILE *dest) | ||||
| { | ||||
| </b></pre> | ||||
| The local variables have the same functionality as they do for <tt>def()</tt>.  The | ||||
| only difference is that there is no <tt>flush</tt> variable, since <tt>inflate()</tt> | ||||
| can tell from the <em>zlib</em> stream itself when the stream is complete. | ||||
| <pre><b> | ||||
|     int ret; | ||||
|     unsigned have; | ||||
|     z_stream strm; | ||||
|     unsigned char in[CHUNK]; | ||||
|     unsigned char out[CHUNK]; | ||||
| </b></pre><!-- --> | ||||
| The initialization of the state is the same, except that there is no compression level, | ||||
| of course, and two more elements of the structure are initialized.  <tt>avail_in</tt> | ||||
| and <tt>next_in</tt> must be initialized before calling <tt>inflateInit()</tt>.  This | ||||
| is because the application has the option to provide the start of the zlib stream in | ||||
| order for <tt>inflateInit()</tt> to have access to information about the compression | ||||
| method to aid in memory allocation.  In the current implementation of <em>zlib</em> | ||||
| (up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of | ||||
| <tt>inflate()</tt> anyway.  However those fields must be initialized since later versions | ||||
| of <em>zlib</em> that provide more compression methods may take advantage of this interface. | ||||
| In any case, no decompression is performed by <tt>inflateInit()</tt>, so the | ||||
| <tt>avail_out</tt> and <tt>next_out</tt> fields do not need to be initialized before calling. | ||||
| <p> | ||||
| Here <tt>avail_in</tt> is set to zero and <tt>next_in</tt> is set to <tt>Z_NULL</tt> to | ||||
| indicate that no input data is being provided. | ||||
| <pre><b> | ||||
|     /* allocate inflate state */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     strm.avail_in = 0; | ||||
|     strm.next_in = Z_NULL; | ||||
|     ret = inflateInit(&strm); | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
| </b></pre><!-- --> | ||||
| The outer <tt>do</tt>-loop decompresses input until <tt>inflate()</tt> indicates | ||||
| that it has reached the end of the compressed data and has produced all of the uncompressed | ||||
| output.  This is in contrast to <tt>def()</tt> which processes all of the input file. | ||||
| If end-of-file is reached before the compressed data self-terminates, then the compressed | ||||
| data is incomplete and an error is returned. | ||||
| <pre><b> | ||||
|     /* decompress until deflate stream ends or end of file */ | ||||
|     do { | ||||
| </b></pre> | ||||
| We read input data and set the <tt>strm</tt> structure accordingly.  If we've reached the | ||||
| end of the input file, then we leave the outer loop and report an error, since the | ||||
| compressed data is incomplete.  Note that we may read more data than is eventually consumed | ||||
| by <tt>inflate()</tt>, if the input file continues past the <em>zlib</em> stream. | ||||
| For applications where <em>zlib</em> streams are embedded in other data, this routine would | ||||
| need to be modified to return the unused data, or at least indicate how much of the input | ||||
| data was not used, so the application would know where to pick up after the <em>zlib</em> stream. | ||||
| <pre><b> | ||||
|         strm.avail_in = fread(in, 1, CHUNK, source); | ||||
|         if (ferror(source)) { | ||||
|             (void)inflateEnd(&strm); | ||||
|             return Z_ERRNO; | ||||
|         } | ||||
|         if (strm.avail_in == 0) | ||||
|             break; | ||||
|         strm.next_in = in; | ||||
| </b></pre><!-- --> | ||||
| The inner <tt>do</tt>-loop has the same function it did in <tt>def()</tt>, which is to | ||||
| keep calling <tt>inflate()</tt> until has generated all of the output it can with the | ||||
| provided input. | ||||
| <pre><b> | ||||
|         /* run inflate() on input until output buffer not full */ | ||||
|         do { | ||||
| </b></pre> | ||||
| Just like in <tt>def()</tt>, the same output space is provided for each call of <tt>inflate()</tt>. | ||||
| <pre><b> | ||||
|             strm.avail_out = CHUNK; | ||||
|             strm.next_out = out; | ||||
| </b></pre> | ||||
| Now we run the decompression engine itself.  There is no need to adjust the flush parameter, since | ||||
| the <em>zlib</em> format is self-terminating. The main difference here is that there are | ||||
| return values that we need to pay attention to.  <tt>Z_DATA_ERROR</tt> | ||||
| indicates that <tt>inflate()</tt> detected an error in the <em>zlib</em> compressed data format, | ||||
| which means that either the data is not a <em>zlib</em> stream to begin with, or that the data was | ||||
| corrupted somewhere along the way since it was compressed.  The other error to be processed is | ||||
| <tt>Z_MEM_ERROR</tt>, which can occur since memory allocation is deferred until <tt>inflate()</tt> | ||||
| needs it, unlike <tt>deflate()</tt>, whose memory is allocated at the start by <tt>deflateInit()</tt>. | ||||
| <p> | ||||
| Advanced applications may use | ||||
| <tt>deflateSetDictionary()</tt> to prime <tt>deflate()</tt> with a set of likely data to improve the | ||||
| first 32K or so of compression.  This is noted in the <em>zlib</em> header, so <tt>inflate()</tt> | ||||
| requests that that dictionary be provided before it can start to decompress.  Without the dictionary, | ||||
| correct decompression is not possible.  For this routine, we have no idea what the dictionary is, | ||||
| so the <tt>Z_NEED_DICT</tt> indication is converted to a <tt>Z_DATA_ERROR</tt>. | ||||
| <p> | ||||
| <tt>inflate()</tt> can also return <tt>Z_STREAM_ERROR</tt>, which should not be possible here, | ||||
| but could be checked for as noted above for <tt>def()</tt>.  <tt>Z_BUF_ERROR</tt> does not need to be | ||||
| checked for here, for the same reasons noted for <tt>def()</tt>.  <tt>Z_STREAM_END</tt> will be | ||||
| checked for later. | ||||
| <pre><b> | ||||
|             ret = inflate(&strm, Z_NO_FLUSH); | ||||
|             assert(ret != Z_STREAM_ERROR);  /* state not clobbered */ | ||||
|             switch (ret) { | ||||
|             case Z_NEED_DICT: | ||||
|                 ret = Z_DATA_ERROR;     /* and fall through */ | ||||
|             case Z_DATA_ERROR: | ||||
|             case Z_MEM_ERROR: | ||||
|                 (void)inflateEnd(&strm); | ||||
|                 return ret; | ||||
|             } | ||||
| </b></pre> | ||||
| The output of <tt>inflate()</tt> is handled identically to that of <tt>deflate()</tt>. | ||||
| <pre><b> | ||||
|             have = CHUNK - strm.avail_out; | ||||
|             if (fwrite(out, 1, have, dest) != have || ferror(dest)) { | ||||
|                 (void)inflateEnd(&strm); | ||||
|                 return Z_ERRNO; | ||||
|             } | ||||
| </b></pre> | ||||
| The inner <tt>do</tt>-loop ends when <tt>inflate()</tt> has no more output as indicated | ||||
| by not filling the output buffer, just as for <tt>deflate()</tt>.  In this case, we cannot | ||||
| assert that <tt>strm.avail_in</tt> will be zero, since the deflate stream may end before the file | ||||
| does. | ||||
| <pre><b> | ||||
|         } while (strm.avail_out == 0); | ||||
| </b></pre><!-- --> | ||||
| The outer <tt>do</tt>-loop ends when <tt>inflate()</tt> reports that it has reached the | ||||
| end of the input <em>zlib</em> stream, has completed the decompression and integrity | ||||
| check, and has provided all of the output.  This is indicated by the <tt>inflate()</tt> | ||||
| return value <tt>Z_STREAM_END</tt>.  The inner loop is guaranteed to leave <tt>ret</tt> | ||||
| equal to <tt>Z_STREAM_END</tt> if the last chunk of the input file read contained the end | ||||
| of the <em>zlib</em> stream.  So if the return value is not <tt>Z_STREAM_END</tt>, the | ||||
| loop continues to read more input. | ||||
| <pre><b> | ||||
|         /* done when inflate() says it's done */ | ||||
|     } while (ret != Z_STREAM_END); | ||||
| </b></pre><!-- --> | ||||
| At this point, decompression successfully completed, or we broke out of the loop due to no | ||||
| more data being available from the input file.  If the last <tt>inflate()</tt> return value | ||||
| is not <tt>Z_STREAM_END</tt>, then the <em>zlib</em> stream was incomplete and a data error | ||||
| is returned.  Otherwise, we return with a happy return value.  Of course, <tt>inflateEnd()</tt> | ||||
| is called first to avoid a memory leak. | ||||
| <pre><b> | ||||
|     /* clean up and return */ | ||||
|     (void)inflateEnd(&strm); | ||||
|     return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; | ||||
| } | ||||
| </b></pre><!-- --> | ||||
| That ends the routines that directly use <em>zlib</em>.  The following routines make this | ||||
| a command-line program by running data through the above routines from <tt>stdin</tt> to | ||||
| <tt>stdout</tt>, and handling any errors reported by <tt>def()</tt> or <tt>inf()</tt>. | ||||
| <p> | ||||
| <tt>zerr()</tt> is used to interpret the possible error codes from <tt>def()</tt> | ||||
| and <tt>inf()</tt>, as detailed in their comments above, and print out an error message. | ||||
| Note that these are only a subset of the possible return values from <tt>deflate()</tt> | ||||
| and <tt>inflate()</tt>. | ||||
| <pre><b> | ||||
| /* report a zlib or i/o error */ | ||||
| void zerr(int ret) | ||||
| { | ||||
|     fputs("zpipe: ", stderr); | ||||
|     switch (ret) { | ||||
|     case Z_ERRNO: | ||||
|         if (ferror(stdin)) | ||||
|             fputs("error reading stdin\n", stderr); | ||||
|         if (ferror(stdout)) | ||||
|             fputs("error writing stdout\n", stderr); | ||||
|         break; | ||||
|     case Z_STREAM_ERROR: | ||||
|         fputs("invalid compression level\n", stderr); | ||||
|         break; | ||||
|     case Z_DATA_ERROR: | ||||
|         fputs("invalid or incomplete deflate data\n", stderr); | ||||
|         break; | ||||
|     case Z_MEM_ERROR: | ||||
|         fputs("out of memory\n", stderr); | ||||
|         break; | ||||
|     case Z_VERSION_ERROR: | ||||
|         fputs("zlib version mismatch!\n", stderr); | ||||
|     } | ||||
| } | ||||
| </b></pre><!-- --> | ||||
| Here is the <tt>main()</tt> routine used to test <tt>def()</tt> and <tt>inf()</tt>.  The | ||||
| <tt>zpipe</tt> command is simply a compression pipe from <tt>stdin</tt> to <tt>stdout</tt>, if | ||||
| no arguments are given, or it is a decompression pipe if <tt>zpipe -d</tt> is used.  If any other | ||||
| arguments are provided, no compression or decompression is performed.  Instead a usage | ||||
| message is displayed.  Examples are <tt>zpipe < foo.txt > foo.txt.z</tt> to compress, and | ||||
| <tt>zpipe -d < foo.txt.z > foo.txt</tt> to decompress. | ||||
| <pre><b> | ||||
| /* compress or decompress from stdin to stdout */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     int ret; | ||||
|  | ||||
|     /* avoid end-of-line conversions */ | ||||
|     SET_BINARY_MODE(stdin); | ||||
|     SET_BINARY_MODE(stdout); | ||||
|  | ||||
|     /* do compression if no arguments */ | ||||
|     if (argc == 1) { | ||||
|         ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); | ||||
|         if (ret != Z_OK) | ||||
|             zerr(ret); | ||||
|         return ret; | ||||
|     } | ||||
|  | ||||
|     /* do decompression if -d specified */ | ||||
|     else if (argc == 2 && strcmp(argv[1], "-d") == 0) { | ||||
|         ret = inf(stdin, stdout); | ||||
|         if (ret != Z_OK) | ||||
|             zerr(ret); | ||||
|         return ret; | ||||
|     } | ||||
|  | ||||
|     /* otherwise, report usage */ | ||||
|     else { | ||||
|         fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); | ||||
|         return 1; | ||||
|     } | ||||
| } | ||||
| </b></pre> | ||||
| <hr> | ||||
| <i>Copyright (c) 2004, 2005 by Mark Adler<br>Last modified 11 December 2005</i> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										205
									
								
								examples/zpipe.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								examples/zpipe.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| /* zpipe.c: example of proper use of zlib's inflate() and deflate() | ||||
|    Not copyrighted -- provided to the public domain | ||||
|    Version 1.4  11 December 2005  Mark Adler */ | ||||
|  | ||||
| /* Version history: | ||||
|    1.0  30 Oct 2004  First version | ||||
|    1.1   8 Nov 2004  Add void casting for unused return values | ||||
|                      Use switch statement for inflate() return values | ||||
|    1.2   9 Nov 2004  Add assertions to document zlib guarantees | ||||
|    1.3   6 Apr 2005  Remove incorrect assertion in inf() | ||||
|    1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions | ||||
|                      Avoid some compiler warnings for input and output buffers | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <assert.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) | ||||
| #  include <fcntl.h> | ||||
| #  include <io.h> | ||||
| #  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) | ||||
| #else | ||||
| #  define SET_BINARY_MODE(file) | ||||
| #endif | ||||
|  | ||||
| #define CHUNK 16384 | ||||
|  | ||||
| /* Compress from file source to file dest until EOF on source. | ||||
|    def() returns Z_OK on success, Z_MEM_ERROR if memory could not be | ||||
|    allocated for processing, Z_STREAM_ERROR if an invalid compression | ||||
|    level is supplied, Z_VERSION_ERROR if the version of zlib.h and the | ||||
|    version of the library linked do not match, or Z_ERRNO if there is | ||||
|    an error reading or writing the files. */ | ||||
| int def(FILE *source, FILE *dest, int level) | ||||
| { | ||||
|     int ret, flush; | ||||
|     unsigned have; | ||||
|     z_stream strm; | ||||
|     unsigned char in[CHUNK]; | ||||
|     unsigned char out[CHUNK]; | ||||
|  | ||||
|     /* allocate deflate state */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     ret = deflateInit(&strm, level); | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
|  | ||||
|     /* compress until end of file */ | ||||
|     do { | ||||
|         strm.avail_in = fread(in, 1, CHUNK, source); | ||||
|         if (ferror(source)) { | ||||
|             (void)deflateEnd(&strm); | ||||
|             return Z_ERRNO; | ||||
|         } | ||||
|         flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; | ||||
|         strm.next_in = in; | ||||
|  | ||||
|         /* run deflate() on input until output buffer not full, finish | ||||
|            compression if all of source has been read in */ | ||||
|         do { | ||||
|             strm.avail_out = CHUNK; | ||||
|             strm.next_out = out; | ||||
|             ret = deflate(&strm, flush);    /* no bad return value */ | ||||
|             assert(ret != Z_STREAM_ERROR);  /* state not clobbered */ | ||||
|             have = CHUNK - strm.avail_out; | ||||
|             if (fwrite(out, 1, have, dest) != have || ferror(dest)) { | ||||
|                 (void)deflateEnd(&strm); | ||||
|                 return Z_ERRNO; | ||||
|             } | ||||
|         } while (strm.avail_out == 0); | ||||
|         assert(strm.avail_in == 0);     /* all input will be used */ | ||||
|  | ||||
|         /* done when last data in file processed */ | ||||
|     } while (flush != Z_FINISH); | ||||
|     assert(ret == Z_STREAM_END);        /* stream will be complete */ | ||||
|  | ||||
|     /* clean up and return */ | ||||
|     (void)deflateEnd(&strm); | ||||
|     return Z_OK; | ||||
| } | ||||
|  | ||||
| /* Decompress from file source to file dest until stream ends or EOF. | ||||
|    inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be | ||||
|    allocated for processing, Z_DATA_ERROR if the deflate data is | ||||
|    invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and | ||||
|    the version of the library linked do not match, or Z_ERRNO if there | ||||
|    is an error reading or writing the files. */ | ||||
| int inf(FILE *source, FILE *dest) | ||||
| { | ||||
|     int ret; | ||||
|     unsigned have; | ||||
|     z_stream strm; | ||||
|     unsigned char in[CHUNK]; | ||||
|     unsigned char out[CHUNK]; | ||||
|  | ||||
|     /* allocate inflate state */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     strm.avail_in = 0; | ||||
|     strm.next_in = Z_NULL; | ||||
|     ret = inflateInit(&strm); | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
|  | ||||
|     /* decompress until deflate stream ends or end of file */ | ||||
|     do { | ||||
|         strm.avail_in = fread(in, 1, CHUNK, source); | ||||
|         if (ferror(source)) { | ||||
|             (void)inflateEnd(&strm); | ||||
|             return Z_ERRNO; | ||||
|         } | ||||
|         if (strm.avail_in == 0) | ||||
|             break; | ||||
|         strm.next_in = in; | ||||
|  | ||||
|         /* run inflate() on input until output buffer not full */ | ||||
|         do { | ||||
|             strm.avail_out = CHUNK; | ||||
|             strm.next_out = out; | ||||
|             ret = inflate(&strm, Z_NO_FLUSH); | ||||
|             assert(ret != Z_STREAM_ERROR);  /* state not clobbered */ | ||||
|             switch (ret) { | ||||
|             case Z_NEED_DICT: | ||||
|                 ret = Z_DATA_ERROR;     /* and fall through */ | ||||
|             case Z_DATA_ERROR: | ||||
|             case Z_MEM_ERROR: | ||||
|                 (void)inflateEnd(&strm); | ||||
|                 return ret; | ||||
|             } | ||||
|             have = CHUNK - strm.avail_out; | ||||
|             if (fwrite(out, 1, have, dest) != have || ferror(dest)) { | ||||
|                 (void)inflateEnd(&strm); | ||||
|                 return Z_ERRNO; | ||||
|             } | ||||
|         } while (strm.avail_out == 0); | ||||
|  | ||||
|         /* done when inflate() says it's done */ | ||||
|     } while (ret != Z_STREAM_END); | ||||
|  | ||||
|     /* clean up and return */ | ||||
|     (void)inflateEnd(&strm); | ||||
|     return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; | ||||
| } | ||||
|  | ||||
| /* report a zlib or i/o error */ | ||||
| void zerr(int ret) | ||||
| { | ||||
|     fputs("zpipe: ", stderr); | ||||
|     switch (ret) { | ||||
|     case Z_ERRNO: | ||||
|         if (ferror(stdin)) | ||||
|             fputs("error reading stdin\n", stderr); | ||||
|         if (ferror(stdout)) | ||||
|             fputs("error writing stdout\n", stderr); | ||||
|         break; | ||||
|     case Z_STREAM_ERROR: | ||||
|         fputs("invalid compression level\n", stderr); | ||||
|         break; | ||||
|     case Z_DATA_ERROR: | ||||
|         fputs("invalid or incomplete deflate data\n", stderr); | ||||
|         break; | ||||
|     case Z_MEM_ERROR: | ||||
|         fputs("out of memory\n", stderr); | ||||
|         break; | ||||
|     case Z_VERSION_ERROR: | ||||
|         fputs("zlib version mismatch!\n", stderr); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* compress or decompress from stdin to stdout */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     int ret; | ||||
|  | ||||
|     /* avoid end-of-line conversions */ | ||||
|     SET_BINARY_MODE(stdin); | ||||
|     SET_BINARY_MODE(stdout); | ||||
|  | ||||
|     /* do compression if no arguments */ | ||||
|     if (argc == 1) { | ||||
|         ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); | ||||
|         if (ret != Z_OK) | ||||
|             zerr(ret); | ||||
|         return ret; | ||||
|     } | ||||
|  | ||||
|     /* do decompression if -d specified */ | ||||
|     else if (argc == 2 && strcmp(argv[1], "-d") == 0) { | ||||
|         ret = inf(stdin, stdout); | ||||
|         if (ret != Z_OK) | ||||
|             zerr(ret); | ||||
|         return ret; | ||||
|     } | ||||
|  | ||||
|     /* otherwise, report usage */ | ||||
|     else { | ||||
|         fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); | ||||
|         return 1; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										404
									
								
								examples/zran.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										404
									
								
								examples/zran.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,404 @@ | ||||
| /* zran.c -- example of zlib/gzip stream indexing and random access | ||||
|  * Copyright (C) 2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|    Version 1.0  29 May 2005  Mark Adler */ | ||||
|  | ||||
| /* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() | ||||
|    for random access of a compressed file.  A file containing a zlib or gzip | ||||
|    stream is provided on the command line.  The compressed stream is decoded in | ||||
|    its entirety, and an index built with access points about every SPAN bytes | ||||
|    in the uncompressed output.  The compressed file is left open, and can then | ||||
|    be read randomly, having to decompress on the average SPAN/2 uncompressed | ||||
|    bytes before getting to the desired block of data. | ||||
|  | ||||
|    An access point can be created at the start of any deflate block, by saving | ||||
|    the starting file offset and bit of that block, and the 32K bytes of | ||||
|    uncompressed data that precede that block.  Also the uncompressed offset of | ||||
|    that block is saved to provide a referece for locating a desired starting | ||||
|    point in the uncompressed stream.  build_index() works by decompressing the | ||||
|    input zlib or gzip stream a block at a time, and at the end of each block | ||||
|    deciding if enough uncompressed data has gone by to justify the creation of | ||||
|    a new access point.  If so, that point is saved in a data structure that | ||||
|    grows as needed to accommodate the points. | ||||
|  | ||||
|    To use the index, an offset in the uncompressed data is provided, for which | ||||
|    the latest accees point at or preceding that offset is located in the index. | ||||
|    The input file is positioned to the specified location in the index, and if | ||||
|    necessary the first few bits of the compressed data is read from the file. | ||||
|    inflate is initialized with those bits and the 32K of uncompressed data, and | ||||
|    the decompression then proceeds until the desired offset in the file is | ||||
|    reached.  Then the decompression continues to read the desired uncompressed | ||||
|    data from the file. | ||||
|  | ||||
|    Another approach would be to generate the index on demand.  In that case, | ||||
|    requests for random access reads from the compressed data would try to use | ||||
|    the index, but if a read far enough past the end of the index is required, | ||||
|    then further index entries would be generated and added. | ||||
|  | ||||
|    There is some fair bit of overhead to starting inflation for the random | ||||
|    access, mainly copying the 32K byte dictionary.  So if small pieces of the | ||||
|    file are being accessed, it would make sense to implement a cache to hold | ||||
|    some lookahead and avoid many calls to extract() for small lengths. | ||||
|  | ||||
|    Another way to build an index would be to use inflateCopy().  That would | ||||
|    not be constrained to have access points at block boundaries, but requires | ||||
|    more memory per access point, and also cannot be saved to file due to the | ||||
|    use of pointers in the state.  The approach here allows for storage of the | ||||
|    index in a file. | ||||
|  */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "zlib.h" | ||||
|  | ||||
| #define local static | ||||
|  | ||||
| #define SPAN 1048576L       /* desired distance between access points */ | ||||
| #define WINSIZE 32768U      /* sliding window size */ | ||||
| #define CHUNK 16384         /* file input buffer size */ | ||||
|  | ||||
| /* access point entry */ | ||||
| struct point { | ||||
|     off_t out;          /* corresponding offset in uncompressed data */ | ||||
|     off_t in;           /* offset in input file of first full byte */ | ||||
|     int bits;           /* number of bits (1-7) from byte at in - 1, or 0 */ | ||||
|     unsigned char window[WINSIZE];  /* preceding 32K of uncompressed data */ | ||||
| }; | ||||
|  | ||||
| /* access point list */ | ||||
| struct access { | ||||
|     int have;           /* number of list entries filled in */ | ||||
|     int size;           /* number of list entries allocated */ | ||||
|     struct point *list; /* allocated list */ | ||||
| }; | ||||
|  | ||||
| /* Deallocate an index built by build_index() */ | ||||
| local void free_index(struct access *index) | ||||
| { | ||||
|     if (index != NULL) { | ||||
|         free(index->list); | ||||
|         free(index); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Add an entry to the access point list.  If out of memory, deallocate the | ||||
|    existing list and return NULL. */ | ||||
| local struct access *addpoint(struct access *index, int bits, | ||||
|     off_t in, off_t out, unsigned left, unsigned char *window) | ||||
| { | ||||
|     struct point *next; | ||||
|  | ||||
|     /* if list is empty, create it (start with eight points) */ | ||||
|     if (index == NULL) { | ||||
|         index = malloc(sizeof(struct access)); | ||||
|         if (index == NULL) return NULL; | ||||
|         index->list = malloc(sizeof(struct point) << 3); | ||||
|         if (index->list == NULL) { | ||||
|             free(index); | ||||
|             return NULL; | ||||
|         } | ||||
|         index->size = 8; | ||||
|         index->have = 0; | ||||
|     } | ||||
|  | ||||
|     /* if list is full, make it bigger */ | ||||
|     else if (index->have == index->size) { | ||||
|         index->size <<= 1; | ||||
|         next = realloc(index->list, sizeof(struct point) * index->size); | ||||
|         if (next == NULL) { | ||||
|             free_index(index); | ||||
|             return NULL; | ||||
|         } | ||||
|         index->list = next; | ||||
|     } | ||||
|  | ||||
|     /* fill in entry and increment how many we have */ | ||||
|     next = index->list + index->have; | ||||
|     next->bits = bits; | ||||
|     next->in = in; | ||||
|     next->out = out; | ||||
|     if (left) | ||||
|         memcpy(next->window, window + WINSIZE - left, left); | ||||
|     if (left < WINSIZE) | ||||
|         memcpy(next->window + left, window, WINSIZE - left); | ||||
|     index->have++; | ||||
|  | ||||
|     /* return list, possibly reallocated */ | ||||
|     return index; | ||||
| } | ||||
|  | ||||
| /* Make one entire pass through the compressed stream and build an index, with | ||||
|    access points about every span bytes of uncompressed output -- span is | ||||
|    chosen to balance the speed of random access against the memory requirements | ||||
|    of the list, about 32K bytes per access point.  Note that data after the end | ||||
|    of the first zlib or gzip stream in the file is ignored.  build_index() | ||||
|    returns the number of access points on success (>= 1), Z_MEM_ERROR for out | ||||
|    of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a | ||||
|    file read error.  On success, *built points to the resulting index. */ | ||||
| local int build_index(FILE *in, off_t span, struct access **built) | ||||
| { | ||||
|     int ret; | ||||
|     off_t totin, totout;        /* our own total counters to avoid 4GB limit */ | ||||
|     off_t last;                 /* totout value of last access point */ | ||||
|     struct access *index;       /* access points being generated */ | ||||
|     z_stream strm; | ||||
|     unsigned char input[CHUNK]; | ||||
|     unsigned char window[WINSIZE]; | ||||
|  | ||||
|     /* initialize inflate */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     strm.avail_in = 0; | ||||
|     strm.next_in = Z_NULL; | ||||
|     ret = inflateInit2(&strm, 47);      /* automatic zlib or gzip decoding */ | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
|  | ||||
|     /* inflate the input, maintain a sliding window, and build an index -- this | ||||
|        also validates the integrity of the compressed data using the check | ||||
|        information at the end of the gzip or zlib stream */ | ||||
|     totin = totout = last = 0; | ||||
|     index = NULL;               /* will be allocated by first addpoint() */ | ||||
|     strm.avail_out = 0; | ||||
|     do { | ||||
|         /* get some compressed data from input file */ | ||||
|         strm.avail_in = fread(input, 1, CHUNK, in); | ||||
|         if (ferror(in)) { | ||||
|             ret = Z_ERRNO; | ||||
|             goto build_index_error; | ||||
|         } | ||||
|         if (strm.avail_in == 0) { | ||||
|             ret = Z_DATA_ERROR; | ||||
|             goto build_index_error; | ||||
|         } | ||||
|         strm.next_in = input; | ||||
|  | ||||
|         /* process all of that, or until end of stream */ | ||||
|         do { | ||||
|             /* reset sliding window if necessary */ | ||||
|             if (strm.avail_out == 0) { | ||||
|                 strm.avail_out = WINSIZE; | ||||
|                 strm.next_out = window; | ||||
|             } | ||||
|  | ||||
|             /* inflate until out of input, output, or at end of block -- | ||||
|                update the total input and output counters */ | ||||
|             totin += strm.avail_in; | ||||
|             totout += strm.avail_out; | ||||
|             ret = inflate(&strm, Z_BLOCK);      /* return at end of block */ | ||||
|             totin -= strm.avail_in; | ||||
|             totout -= strm.avail_out; | ||||
|             if (ret == Z_NEED_DICT) | ||||
|                 ret = Z_DATA_ERROR; | ||||
|             if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) | ||||
|                 goto build_index_error; | ||||
|             if (ret == Z_STREAM_END) | ||||
|                 break; | ||||
|  | ||||
|             /* if at end of block, consider adding an index entry (note that if | ||||
|                data_type indicates an end-of-block, then all of the | ||||
|                uncompressed data from that block has been delivered, and none | ||||
|                of the compressed data after that block has been consumed, | ||||
|                except for up to seven bits) -- the totout == 0 provides an | ||||
|                entry point after the zlib or gzip header, and assures that the | ||||
|                index always has at least one access point; we avoid creating an | ||||
|                access point after the last block by checking bit 6 of data_type | ||||
|              */ | ||||
|             if ((strm.data_type & 128) && !(strm.data_type & 64) && | ||||
|                 (totout == 0 || totout - last > span)) { | ||||
|                 index = addpoint(index, strm.data_type & 7, totin, | ||||
|                                  totout, strm.avail_out, window); | ||||
|                 if (index == NULL) { | ||||
|                     ret = Z_MEM_ERROR; | ||||
|                     goto build_index_error; | ||||
|                 } | ||||
|                 last = totout; | ||||
|             } | ||||
|         } while (strm.avail_in != 0); | ||||
|     } while (ret != Z_STREAM_END); | ||||
|  | ||||
|     /* clean up and return index (release unused entries in list) */ | ||||
|     (void)inflateEnd(&strm); | ||||
|     index = realloc(index, sizeof(struct point) * index->have); | ||||
|     index->size = index->have; | ||||
|     *built = index; | ||||
|     return index->size; | ||||
|  | ||||
|     /* return error */ | ||||
|   build_index_error: | ||||
|     (void)inflateEnd(&strm); | ||||
|     if (index != NULL) | ||||
|         free_index(index); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| /* Use the index to read len bytes from offset into buf, return bytes read or | ||||
|    negative for error (Z_DATA_ERROR or Z_MEM_ERROR).  If data is requested past | ||||
|    the end of the uncompressed data, then extract() will return a value less | ||||
|    than len, indicating how much as actually read into buf.  This function | ||||
|    should not return a data error unless the file was modified since the index | ||||
|    was generated.  extract() may also return Z_ERRNO if there is an error on | ||||
|    reading or seeking the input file. */ | ||||
| local int extract(FILE *in, struct access *index, off_t offset, | ||||
|                   unsigned char *buf, int len) | ||||
| { | ||||
|     int ret, skip; | ||||
|     z_stream strm; | ||||
|     struct point *here; | ||||
|     unsigned char input[CHUNK]; | ||||
|     unsigned char discard[WINSIZE]; | ||||
|  | ||||
|     /* proceed only if something reasonable to do */ | ||||
|     if (len < 0) | ||||
|         return 0; | ||||
|  | ||||
|     /* find where in stream to start */ | ||||
|     here = index->list; | ||||
|     ret = index->have; | ||||
|     while (--ret && here[1].out <= offset) | ||||
|         here++; | ||||
|  | ||||
|     /* initialize file and inflate state to start there */ | ||||
|     strm.zalloc = Z_NULL; | ||||
|     strm.zfree = Z_NULL; | ||||
|     strm.opaque = Z_NULL; | ||||
|     strm.avail_in = 0; | ||||
|     strm.next_in = Z_NULL; | ||||
|     ret = inflateInit2(&strm, -15);         /* raw inflate */ | ||||
|     if (ret != Z_OK) | ||||
|         return ret; | ||||
|     ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); | ||||
|     if (ret == -1) | ||||
|         goto extract_ret; | ||||
|     if (here->bits) { | ||||
|         ret = getc(in); | ||||
|         if (ret == -1) { | ||||
|             ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; | ||||
|             goto extract_ret; | ||||
|         } | ||||
|         (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); | ||||
|     } | ||||
|     (void)inflateSetDictionary(&strm, here->window, WINSIZE); | ||||
|  | ||||
|     /* skip uncompressed bytes until offset reached, then satisfy request */ | ||||
|     offset -= here->out; | ||||
|     strm.avail_in = 0; | ||||
|     skip = 1;                               /* while skipping to offset */ | ||||
|     do { | ||||
|         /* define where to put uncompressed data, and how much */ | ||||
|         if (offset == 0 && skip) {          /* at offset now */ | ||||
|             strm.avail_out = len; | ||||
|             strm.next_out = buf; | ||||
|             skip = 0;                       /* only do this once */ | ||||
|         } | ||||
|         if (offset > WINSIZE) {             /* skip WINSIZE bytes */ | ||||
|             strm.avail_out = WINSIZE; | ||||
|             strm.next_out = discard; | ||||
|             offset -= WINSIZE; | ||||
|         } | ||||
|         else if (offset != 0) {             /* last skip */ | ||||
|             strm.avail_out = (unsigned)offset; | ||||
|             strm.next_out = discard; | ||||
|             offset = 0; | ||||
|         } | ||||
|  | ||||
|         /* uncompress until avail_out filled, or end of stream */ | ||||
|         do { | ||||
|             if (strm.avail_in == 0) { | ||||
|                 strm.avail_in = fread(input, 1, CHUNK, in); | ||||
|                 if (ferror(in)) { | ||||
|                     ret = Z_ERRNO; | ||||
|                     goto extract_ret; | ||||
|                 } | ||||
|                 if (strm.avail_in == 0) { | ||||
|                     ret = Z_DATA_ERROR; | ||||
|                     goto extract_ret; | ||||
|                 } | ||||
|                 strm.next_in = input; | ||||
|             } | ||||
|             ret = inflate(&strm, Z_NO_FLUSH);       /* normal inflate */ | ||||
|             if (ret == Z_NEED_DICT) | ||||
|                 ret = Z_DATA_ERROR; | ||||
|             if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) | ||||
|                 goto extract_ret; | ||||
|             if (ret == Z_STREAM_END) | ||||
|                 break; | ||||
|         } while (strm.avail_out != 0); | ||||
|  | ||||
|         /* if reach end of stream, then don't keep trying to get more */ | ||||
|         if (ret == Z_STREAM_END) | ||||
|             break; | ||||
|  | ||||
|         /* do until offset reached and requested data read, or stream ends */ | ||||
|     } while (skip); | ||||
|  | ||||
|     /* compute number of uncompressed bytes read after offset */ | ||||
|     ret = skip ? 0 : len - strm.avail_out; | ||||
|  | ||||
|     /* clean up and return bytes read or error */ | ||||
|   extract_ret: | ||||
|     (void)inflateEnd(&strm); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| /* Demonstrate the use of build_index() and extract() by processing the file | ||||
|    provided on the command line, and the extracting 16K from about 2/3rds of | ||||
|    the way through the uncompressed output, and writing that to stdout. */ | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     int len; | ||||
|     off_t offset; | ||||
|     FILE *in; | ||||
|     struct access *index = NULL; | ||||
|     unsigned char buf[CHUNK]; | ||||
|  | ||||
|     /* open input file */ | ||||
|     if (argc != 2) { | ||||
|         fprintf(stderr, "usage: zran file.gz\n"); | ||||
|         return 1; | ||||
|     } | ||||
|     in = fopen(argv[1], "rb"); | ||||
|     if (in == NULL) { | ||||
|         fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     /* build index */ | ||||
|     len = build_index(in, SPAN, &index); | ||||
|     if (len < 0) { | ||||
|         fclose(in); | ||||
|         switch (len) { | ||||
|         case Z_MEM_ERROR: | ||||
|             fprintf(stderr, "zran: out of memory\n"); | ||||
|             break; | ||||
|         case Z_DATA_ERROR: | ||||
|             fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); | ||||
|             break; | ||||
|         case Z_ERRNO: | ||||
|             fprintf(stderr, "zran: read error on %s\n", argv[1]); | ||||
|             break; | ||||
|         default: | ||||
|             fprintf(stderr, "zran: error %d while building index\n", len); | ||||
|         } | ||||
|         return 1; | ||||
|     } | ||||
|     fprintf(stderr, "zran: built index with %d access points\n", len); | ||||
|  | ||||
|     /* use index by reading some bytes from an arbitrary offset */ | ||||
|     offset = (index->list[index->have - 1].out << 1) / 3; | ||||
|     len = extract(in, index, offset, buf, CHUNK); | ||||
|     if (len < 0) | ||||
|         fprintf(stderr, "zran: extraction failed: %s error\n", | ||||
|                 len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); | ||||
|     else { | ||||
|         fwrite(buf, 1, len, stdout); | ||||
|         fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); | ||||
|     } | ||||
|  | ||||
|     /* clean up and exit */ | ||||
|     free_index(index); | ||||
|     fclose(in); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										59
									
								
								gzio.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								gzio.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* gzio.c -- IO on .gz files | ||||
|  * Copyright (C) 1995-2004 Jean-loup Gailly. | ||||
|  * Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  * | ||||
|  * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. | ||||
| @@ -7,9 +7,8 @@ | ||||
|  | ||||
| /* @(#) $Id$ */ | ||||
|  | ||||
| #include <stdio.h> | ||||
|  | ||||
| #include "zutil.h" | ||||
| #include <stdio.h> | ||||
|  | ||||
| #ifdef NO_DEFLATE       /* for compatibility with old definition */ | ||||
| #  define NO_GZCOMPRESS | ||||
| @@ -187,7 +186,10 @@ local gzFile gz_open (path, mode, fd) | ||||
|         /* Write a very simple .gz header: | ||||
|          */ | ||||
|         fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], | ||||
|              Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); | ||||
|              Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, level == 9 ? 2 : | ||||
|                             (strategy >= Z_HUFFMAN_ONLY || | ||||
|                              (level != Z_DEFAULT_COMPRESSION && level < 2) ? | ||||
|                              4 : 0) /*xflags*/, OS_CODE); | ||||
|         s->start = 10L; | ||||
|         /* We use 10L instead of ftell(s->file) to because ftell causes an | ||||
|          * fflush on some systems. This version of the library doesn't use | ||||
| @@ -220,7 +222,7 @@ gzFile ZEXPORT gzdopen (fd, mode) | ||||
|     int fd; | ||||
|     const char *mode; | ||||
| { | ||||
|     char name[20]; | ||||
|     char name[46];      /* allow for up to 128-bit integers */ | ||||
|  | ||||
|     if (fd < 0) return (gzFile)Z_NULL; | ||||
|     sprintf(name, "<fd:%d>", fd); /* for debugging */ | ||||
| @@ -256,7 +258,7 @@ int ZEXPORT gzsetparams (file, level, strategy) | ||||
| /* =========================================================================== | ||||
|      Read a byte from a gz_stream; update next_in and avail_in. Return EOF | ||||
|    for end of file. | ||||
|    IN assertion: the stream s has been sucessfully opened for reading. | ||||
|    IN assertion: the stream s has been successfully opened for reading. | ||||
| */ | ||||
| local int get_byte(s) | ||||
|     gz_stream *s; | ||||
| @@ -264,7 +266,7 @@ local int get_byte(s) | ||||
|     if (s->z_eof) return EOF; | ||||
|     if (s->stream.avail_in == 0) { | ||||
|         errno = 0; | ||||
|         s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||||
|         s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||||
|         if (s->stream.avail_in == 0) { | ||||
|             s->z_eof = 1; | ||||
|             if (ferror(s->file)) s->z_err = Z_ERRNO; | ||||
| @@ -281,7 +283,7 @@ local int get_byte(s) | ||||
|     mode to transparent if the gzip magic header is not present; set s->err | ||||
|     to Z_DATA_ERROR if the magic header is present but the rest of the header | ||||
|     is incorrect. | ||||
|     IN assertion: the stream s has already been created sucessfully; | ||||
|     IN assertion: the stream s has already been created successfully; | ||||
|        s->stream.avail_in is zero for the first time, but may be non-zero | ||||
|        for concatenated .gz files. | ||||
| */ | ||||
| @@ -300,7 +302,8 @@ local void check_header(s) | ||||
|     if (len < 2) { | ||||
|         if (len) s->inbuf[0] = s->stream.next_in[0]; | ||||
|         errno = 0; | ||||
|         len = fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); | ||||
|         len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); | ||||
|         if (len == 0) s->z_eof = 1; | ||||
|         if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; | ||||
|         s->stream.avail_in += len; | ||||
|         s->stream.next_in = s->inbuf; | ||||
| @@ -415,6 +418,7 @@ int ZEXPORT gzread (file, buf, len) | ||||
|         s->stream.avail_out--; | ||||
|         s->back = EOF; | ||||
|         s->out++; | ||||
|         start++; | ||||
|         if (s->last) { | ||||
|             s->z_err = Z_STREAM_END; | ||||
|             return 1; | ||||
| @@ -435,9 +439,9 @@ int ZEXPORT gzread (file, buf, len) | ||||
|                 s->stream.avail_out -= n; | ||||
|                 s->stream.avail_in  -= n; | ||||
|             } | ||||
|             if (s->stream.avail_out > 0) { | ||||
|                 s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out, | ||||
|                                              s->file); | ||||
|             if (s->stream.avail_out > 0 && !feof(s->file)) { | ||||
|                 s->stream.avail_out -= | ||||
|                     (uInt)fread(next_out, 1, s->stream.avail_out, s->file); | ||||
|             } | ||||
|             len -= s->stream.avail_out; | ||||
|             s->in  += len; | ||||
| @@ -448,17 +452,13 @@ int ZEXPORT gzread (file, buf, len) | ||||
|         if (s->stream.avail_in == 0 && !s->z_eof) { | ||||
|  | ||||
|             errno = 0; | ||||
|             s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||||
|             s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||||
|             if (s->stream.avail_in == 0) { | ||||
|                 s->z_eof = 1; | ||||
|                 if (ferror(s->file)) { | ||||
|                     s->z_err = Z_ERRNO; | ||||
|                     break; | ||||
|                 } | ||||
|                 if (feof(s->file)) {        /* avoid error for empty file */ | ||||
|                     s->z_err = Z_STREAM_END; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             s->stream.next_in = s->inbuf; | ||||
|         } | ||||
| @@ -492,6 +492,9 @@ int ZEXPORT gzread (file, buf, len) | ||||
|     } | ||||
|     s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); | ||||
|  | ||||
|     if (len == s->stream.avail_out && | ||||
|         (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) | ||||
|         return -1; | ||||
|     return (int)(len - s->stream.avail_out); | ||||
| } | ||||
|  | ||||
| @@ -902,6 +905,18 @@ int ZEXPORT gzeof (file) | ||||
|     return s->z_err == Z_STREAM_END; | ||||
| } | ||||
|  | ||||
| /* =========================================================================== | ||||
|      Returns 1 if reading and doing so transparently, otherwise zero. | ||||
| */ | ||||
| int ZEXPORT gzdirect (file) | ||||
|     gzFile file; | ||||
| { | ||||
|     gz_stream *s = (gz_stream*)file; | ||||
|  | ||||
|     if (s == NULL || s->mode != 'r') return 0; | ||||
|     return s->transparent; | ||||
| } | ||||
|  | ||||
| /* =========================================================================== | ||||
|    Outputs a long in LSB order to the given file | ||||
| */ | ||||
| @@ -959,10 +974,16 @@ int ZEXPORT gzclose (file) | ||||
|     return destroy((gz_stream*)file); | ||||
| } | ||||
|  | ||||
| #if defined(STDC) && !defined(_WIN32_WCE) | ||||
| #  define zstrerror(errnum) strerror(errnum) | ||||
| #else | ||||
| #  define zstrerror(errnum) "" | ||||
| #endif | ||||
|  | ||||
| /* =========================================================================== | ||||
|      Returns the error message for the last error which occured 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 | ||||
|    error occured in the file system and not in the compression library, | ||||
|    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. | ||||
| */ | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* infback.c -- inflate using a call-back interface | ||||
|  * Copyright (C) 1995-2004 Mark Adler | ||||
|  * Copyright (C) 1995-2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -50,7 +50,8 @@ int stream_size; | ||||
|                                                sizeof(struct inflate_state)); | ||||
|     if (state == Z_NULL) return Z_MEM_ERROR; | ||||
|     Tracev((stderr, "inflate: allocated\n")); | ||||
|     strm->state = (voidpf)state; | ||||
|     strm->state = (struct internal_state FAR *)state; | ||||
|     state->dmax = 32768U; | ||||
|     state->wbits = windowBits; | ||||
|     state->wsize = 1U << windowBits; | ||||
|     state->window = window; | ||||
|   | ||||
							
								
								
									
										13
									
								
								inffast.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								inffast.c
									
									
									
									
									
								
							| @@ -74,6 +74,9 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */ | ||||
|     unsigned char FAR *out;     /* local strm->next_out */ | ||||
|     unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */ | ||||
|     unsigned char FAR *end;     /* while out < end, enough space available */ | ||||
| #ifdef INFLATE_STRICT | ||||
|     unsigned dmax;              /* maximum distance from zlib header */ | ||||
| #endif | ||||
|     unsigned wsize;             /* window size or zero if not using window */ | ||||
|     unsigned whave;             /* valid bytes in the window */ | ||||
|     unsigned write;             /* window write index */ | ||||
| @@ -98,6 +101,9 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */ | ||||
|     out = strm->next_out - OFF; | ||||
|     beg = out - (start - strm->avail_out); | ||||
|     end = out + (strm->avail_out - 257); | ||||
| #ifdef INFLATE_STRICT | ||||
|     dmax = state->dmax; | ||||
| #endif | ||||
|     wsize = state->wsize; | ||||
|     whave = state->whave; | ||||
|     write = state->write; | ||||
| @@ -167,6 +173,13 @@ unsigned start;         /* inflate()'s starting value for strm->avail_out */ | ||||
|                     } | ||||
|                 } | ||||
|                 dist += (unsigned)hold & ((1U << op) - 1); | ||||
| #ifdef INFLATE_STRICT | ||||
|                 if (dist > dmax) { | ||||
|                     strm->msg = (char *)"invalid distance too far back"; | ||||
|                     state->mode = BAD; | ||||
|                     break; | ||||
|                 } | ||||
| #endif | ||||
|                 hold >>= op; | ||||
|                 bits -= op; | ||||
|                 Tracevv((stderr, "inflate:         distance %u\n", dist)); | ||||
|   | ||||
							
								
								
									
										53
									
								
								inflate.c
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								inflate.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* inflate.c -- zlib decompression | ||||
|  * Copyright (C) 1995-2004 Mark Adler | ||||
|  * Copyright (C) 1995-2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -113,9 +113,11 @@ z_streamp strm; | ||||
|     state->mode = HEAD; | ||||
|     state->last = 0; | ||||
|     state->havedict = 0; | ||||
|     state->dmax = 32768U; | ||||
|     state->head = Z_NULL; | ||||
|     state->wsize = 0; | ||||
|     state->whave = 0; | ||||
|     state->write = 0; | ||||
|     state->hold = 0; | ||||
|     state->bits = 0; | ||||
|     state->lencode = state->distcode = state->next = state->codes; | ||||
| @@ -123,6 +125,22 @@ z_streamp strm; | ||||
|     return Z_OK; | ||||
| } | ||||
|  | ||||
| int ZEXPORT inflatePrime(strm, bits, value) | ||||
| z_streamp strm; | ||||
| int bits; | ||||
| int value; | ||||
| { | ||||
|     struct inflate_state FAR *state; | ||||
|  | ||||
|     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | ||||
|     state = (struct inflate_state FAR *)strm->state; | ||||
|     if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; | ||||
|     value &= (1L << bits) - 1; | ||||
|     state->hold += value << state->bits; | ||||
|     state->bits += bits; | ||||
|     return Z_OK; | ||||
| } | ||||
|  | ||||
| int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) | ||||
| z_streamp strm; | ||||
| int windowBits; | ||||
| @@ -145,7 +163,7 @@ int stream_size; | ||||
|             ZALLOC(strm, 1, sizeof(struct inflate_state)); | ||||
|     if (state == Z_NULL) return Z_MEM_ERROR; | ||||
|     Tracev((stderr, "inflate: allocated\n")); | ||||
|     strm->state = (voidpf)state; | ||||
|     strm->state = (struct internal_state FAR *)state; | ||||
|     if (windowBits < 0) { | ||||
|         state->wrap = 0; | ||||
|         windowBits = -windowBits; | ||||
| @@ -600,11 +618,13 @@ int flush; | ||||
|                 break; | ||||
|             } | ||||
|             DROPBITS(4); | ||||
|             if (BITS(4) + 8 > state->wbits) { | ||||
|             len = BITS(4) + 8; | ||||
|             if (len > state->wbits) { | ||||
|                 strm->msg = (char *)"invalid window size"; | ||||
|                 state->mode = BAD; | ||||
|                 break; | ||||
|             } | ||||
|             state->dmax = 1U << len; | ||||
|             Tracev((stderr, "inflate:   zlib header ok\n")); | ||||
|             strm->adler = state->check = adler32(0L, Z_NULL, 0); | ||||
|             state->mode = hold & 0x200 ? DICTID : TYPE; | ||||
| @@ -1009,6 +1029,13 @@ int flush; | ||||
|                 state->offset += BITS(state->extra); | ||||
|                 DROPBITS(state->extra); | ||||
|             } | ||||
| #ifdef INFLATE_STRICT | ||||
|             if (state->offset > state->dmax) { | ||||
|                 strm->msg = (char *)"invalid distance too far back"; | ||||
|                 state->mode = BAD; | ||||
|                 break; | ||||
|             } | ||||
| #endif | ||||
|             if (state->offset > state->whave + out - left) { | ||||
|                 strm->msg = (char *)"invalid distance too far back"; | ||||
|                 state->mode = BAD; | ||||
| @@ -1300,6 +1327,7 @@ z_streamp source; | ||||
|     struct inflate_state FAR *state; | ||||
|     struct inflate_state FAR *copy; | ||||
|     unsigned char FAR *window; | ||||
|     unsigned wsize; | ||||
|  | ||||
|     /* check input */ | ||||
|     if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || | ||||
| @@ -1322,14 +1350,19 @@ z_streamp source; | ||||
|     } | ||||
|  | ||||
|     /* copy state */ | ||||
|     *dest = *source; | ||||
|     *copy = *state; | ||||
|     copy->lencode = copy->codes + (state->lencode - state->codes); | ||||
|     copy->distcode = copy->codes + (state->distcode - state->codes); | ||||
|     zmemcpy(dest, source, sizeof(z_stream)); | ||||
|     zmemcpy(copy, state, sizeof(struct inflate_state)); | ||||
|     if (state->lencode >= state->codes && | ||||
|         state->lencode <= state->codes + ENOUGH - 1) { | ||||
|         copy->lencode = copy->codes + (state->lencode - state->codes); | ||||
|         copy->distcode = copy->codes + (state->distcode - state->codes); | ||||
|     } | ||||
|     copy->next = copy->codes + (state->next - state->codes); | ||||
|     if (window != Z_NULL) | ||||
|         zmemcpy(window, state->window, 1U << state->wbits); | ||||
|     if (window != Z_NULL) { | ||||
|         wsize = 1U << state->wbits; | ||||
|         zmemcpy(window, state->window, wsize); | ||||
|     } | ||||
|     copy->window = window; | ||||
|     dest->state = (voidpf)copy; | ||||
|     dest->state = (struct internal_state FAR *)copy; | ||||
|     return Z_OK; | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* inflate.h -- internal inflate state definition | ||||
|  * Copyright (C) 1995-2004 Mark Adler | ||||
|  * Copyright (C) 1995-2006 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -73,13 +73,14 @@ typedef enum { | ||||
|         CHECK -> LENGTH -> DONE | ||||
|  */ | ||||
|  | ||||
| /* state maintained between inflate() calls.  Approximately 7K bytes. */ | ||||
| /* state maintained between inflate() calls.  Approximately 10K bytes. */ | ||||
| struct inflate_state { | ||||
|     inflate_mode mode;          /* current inflate mode */ | ||||
|     int last;                   /* true if processing last block */ | ||||
|     int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */ | ||||
|     int havedict;               /* true if dictionary provided */ | ||||
|     int flags;                  /* gzip header method and flags (0 if zlib) */ | ||||
|     unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */ | ||||
|     unsigned long check;        /* protected copy of check value */ | ||||
|     unsigned long total;        /* protected copy of output count */ | ||||
|     gz_headerp head;            /* where to save gzip header information */ | ||||
|   | ||||
							
								
								
									
										11
									
								
								inftrees.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								inftrees.c
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* inftrees.c -- generate Huffman trees for efficient decoding | ||||
|  * Copyright (C) 1995-2004 Mark Adler | ||||
|  * Copyright (C) 1995-2006 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -9,7 +9,7 @@ | ||||
| #define MAXBITS 15 | ||||
|  | ||||
| const char inflate_copyright[] = | ||||
|    " inflate 1.2.2.1 Copyright 1995-2004 Mark Adler "; | ||||
|    " inflate 1.2.3.2 Copyright 1995-2006 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 | ||||
| @@ -62,7 +62,7 @@ unsigned short FAR *work; | ||||
|         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | ||||
|     static const unsigned short lext[31] = { /* Length codes 257..285 extra */ | ||||
|         16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, | ||||
|         19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 207}; | ||||
|         19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 192, 204}; | ||||
|     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ | ||||
|         1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | ||||
|         257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | ||||
| @@ -134,7 +134,7 @@ unsigned short FAR *work; | ||||
|         left -= count[len]; | ||||
|         if (left < 0) return -1;        /* over-subscribed */ | ||||
|     } | ||||
|     if (left > 0 && (type == CODES || (codes - count[0] != 1))) | ||||
|     if (left > 0 && (type == CODES || max != 1)) | ||||
|         return -1;                      /* incomplete set */ | ||||
|  | ||||
|     /* generate offsets into symbol table for each length for sorting */ | ||||
| @@ -232,6 +232,7 @@ unsigned short FAR *work; | ||||
|         /* replicate for those indices with low len bits equal to huff */ | ||||
|         incr = 1U << (len - drop); | ||||
|         fill = 1U << curr; | ||||
|         min = fill;                 /* save offset to next table */ | ||||
|         do { | ||||
|             fill -= incr; | ||||
|             next[(huff >> drop) + fill] = this; | ||||
| @@ -262,7 +263,7 @@ unsigned short FAR *work; | ||||
|                 drop = root; | ||||
|  | ||||
|             /* increment past last table */ | ||||
|             next += 1U << curr; | ||||
|             next += min;            /* here min is 1 << curr */ | ||||
|  | ||||
|             /* determine length of next table */ | ||||
|             curr = len - drop; | ||||
|   | ||||
							
								
								
									
										10
									
								
								inftrees.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								inftrees.h
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| /* inftrees.h -- header to use inftrees.c | ||||
|  * Copyright (C) 1995-2003 Mark Adler | ||||
|  * Copyright (C) 1995-2005 Mark Adler | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -36,12 +36,12 @@ typedef struct { | ||||
|  */ | ||||
|  | ||||
| /* Maximum size of dynamic tree.  The maximum found in a long but non- | ||||
|    exhaustive search was 1004 code structures (850 for length/literals | ||||
|    and 154 for distances, the latter actually the result of an | ||||
|    exhaustive search was 1444 code structures (852 for length/literals | ||||
|    and 592 for distances, the latter actually the result of an | ||||
|    exhaustive search).  The true maximum is not known, but the value | ||||
|    below is more than safe. */ | ||||
| #define ENOUGH 1440 | ||||
| #define MAXD 154 | ||||
| #define ENOUGH 2048 | ||||
| #define MAXD 592 | ||||
|  | ||||
| /* Type of code to build for inftable() */ | ||||
| typedef enum { | ||||
|   | ||||
							
								
								
									
										526
									
								
								make_vms.com
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										526
									
								
								make_vms.com
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,526 @@ | ||||
| $! make libz under VMS written by | ||||
| $! Martin P.J. Zinser | ||||
| $! | ||||
| $! In case of problems with the install you might contact me at | ||||
| $! zinser@zinser.no-ip.info(preferred) or | ||||
| $! zinser@sysdev.deutsche-boerse.com (work) | ||||
| $! | ||||
| $! Make procedure history for Zlib | ||||
| $! | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! Version history | ||||
| $! 0.01 20060120 First version to receive a number | ||||
| $! | ||||
| $ on error then goto err_exit | ||||
| $! | ||||
| $! | ||||
| $! Just some general constants... | ||||
| $! | ||||
| $ true  = 1 | ||||
| $ false = 0 | ||||
| $ tmpnam = "temp_" + f$getjpi("","pid") | ||||
| $ its_decc = false | ||||
| $ its_vaxc = false | ||||
| $ its_gnuc = false | ||||
| $ s_case   = False | ||||
| $! | ||||
| $! Setup variables holding "config" information | ||||
| $! | ||||
| $ Make     = "" | ||||
| $ name     = "Zlib" | ||||
| $ version  = "?.?.?" | ||||
| $ v_string = "ZLIB_VERSION" | ||||
| $ v_file   = "zlib.h" | ||||
| $ ccopt    = "" | ||||
| $ lopts    = "" | ||||
| $ dnsrl   = "" | ||||
| $ linkonly = false | ||||
| $ optfile  = name + ".opt" | ||||
| $ axp      = f$getsyi("HW_MODEL").ge.1024 | ||||
| $! | ||||
| $! Check for MMK/MMS | ||||
| $! | ||||
| $ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" | ||||
| $ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" | ||||
| $! | ||||
| $! | ||||
| $ gosub find_version | ||||
| $! | ||||
| $ gosub check_opts | ||||
| $! | ||||
| $! Look for the compiler used | ||||
| $! | ||||
| $ gosub check_compiler | ||||
| $ if its_decc | ||||
| $ then | ||||
| $   ccopt = "/prefix=all" + ccopt | ||||
| $   if f$trnlnm("SYS") .eqs. "" | ||||
| $   then | ||||
| $     if axp | ||||
| $     then | ||||
| $       define sys sys$library: | ||||
| $     else | ||||
| $       ccopt = "/decc" + ccopt | ||||
| $       define sys decc$library_include: | ||||
| $     endif | ||||
| $   endif | ||||
| $ endif | ||||
| $ if its_vaxc .or. its_gnuc | ||||
| $ then | ||||
| $    if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||
| $ endif | ||||
| $! | ||||
| $! Build the thing plain or with mms | ||||
| $! | ||||
| $ write sys$output "Compiling Zlib sources ..." | ||||
| $ if make.eqs."" | ||||
| $  then | ||||
| $   dele example.obj;*,minigzip.obj;* | ||||
| $   CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - | ||||
|                 adler32.c zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE compress.OBJ "CC ''CCOPT' compress" - | ||||
|                 compress.c zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - | ||||
|                 crc32.c zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - | ||||
|                 deflate.c deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE gzio.OBJ "CC ''CCOPT' gzio" - | ||||
|                 gzio.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE infback.OBJ "CC ''CCOPT' infback" - | ||||
|                 infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| $   CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - | ||||
|                 inffast.c zutil.h zlib.h zconf.h zlibdefs.h inffast.h | ||||
| $   CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - | ||||
|                 inflate.c zutil.h zlib.h zconf.h zlibdefs.h infblock.h | ||||
| $   CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - | ||||
|                 inftrees.c zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| $   CALL MAKE trees.OBJ "CC ''CCOPT' trees" - | ||||
|                 trees.c deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - | ||||
|                 uncompr.c zlib.h zconf.h zlibdefs.h | ||||
| $   CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - | ||||
|                 zutil.c zutil.h zlib.h zconf.h zlibdefs.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 zlibdefs.h | ||||
| $   call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb | ||||
| $   if f$search("x11vms:xvmsutils.olb") .nes. "" | ||||
| $   then | ||||
| $     write sys$output "Building minigzip..." | ||||
| $     CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - | ||||
|                 minigzip.c zlib.h zconf.h zlibdefs.h | ||||
| $     call make minigzip.exe - | ||||
|                 "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - | ||||
|                 minigzip.obj libz.olb | ||||
| $   endif | ||||
| $  else | ||||
| $   gosub crea_mms | ||||
| $   write sys$output "Make ''name' ''version' with ''Make' " | ||||
| $   'make' | ||||
| $  endif | ||||
| $! | ||||
| $! Alpha gets a shareable image | ||||
| $! | ||||
| $ If axp | ||||
| $ Then | ||||
| $   gosub crea_olist | ||||
| $   write sys$output "Creating libzshr.exe" | ||||
| $   call anal_obj_axp modules.opt _link.opt | ||||
| $   if s_case | ||||
| $   then | ||||
| $      open/append optf modules.opt | ||||
| $      write optf "case_sensitive=YES" | ||||
| $      close optf | ||||
| $   endif | ||||
| $   LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt | ||||
| $ endif | ||||
| $ write sys$output "Zlib build completed" | ||||
| $ exit | ||||
| $CC_ERR: | ||||
| $ write sys$output "C compiler required to build ''name'" | ||||
| $ goto err_exit | ||||
| $ERR_EXIT: | ||||
| $ set message/facil/ident/sever/text | ||||
| $ close/nolog optf | ||||
| $ write sys$output "Exiting..." | ||||
| $ exit 2 | ||||
| $! | ||||
| $! | ||||
| $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 | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Check command line options and set symbols accordingly | ||||
| $! | ||||
| $ CHECK_OPTS: | ||||
| $ i = 1 | ||||
| $ OPT_LOOP: | ||||
| $ if i .lt. 9 | ||||
| $ then | ||||
| $   cparm = f$edit(p'i',"upcase") | ||||
| $   if cparm .eqs. "DEBUG" | ||||
| $   then | ||||
| $     ccopt = ccopt + "/noopt/deb" | ||||
| $     lopts = lopts + "/deb" | ||||
| $   endif | ||||
| $   if f$locate("CCOPT=",cparm) .lt. f$length(cparm) | ||||
| $   then | ||||
| $     start = f$locate("=",cparm) + 1 | ||||
| $     len   = f$length(cparm) - start | ||||
| $     ccopt = ccopt + f$extract(start,len,cparm) | ||||
| $     if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - | ||||
|          then s_case = true | ||||
| $   endif | ||||
| $   if cparm .eqs. "LINK" then linkonly = true | ||||
| $   if f$locate("LOPTS=",cparm) .lt. f$length(cparm) | ||||
| $   then | ||||
| $     start = f$locate("=",cparm) + 1 | ||||
| $     len   = f$length(cparm) - start | ||||
| $     lopts = lopts + f$extract(start,len,cparm) | ||||
| $   endif | ||||
| $   if f$locate("CC=",cparm) .lt. f$length(cparm) | ||||
| $   then | ||||
| $     start  = f$locate("=",cparm) + 1 | ||||
| $     len    = f$length(cparm) - start | ||||
| $     cc_com = f$extract(start,len,cparm) | ||||
|       if (cc_com .nes. "DECC") .and. - | ||||
|          (cc_com .nes. "VAXC") .and. - | ||||
| 	 (cc_com .nes. "GNUC") | ||||
| $     then | ||||
| $       write sys$output "Unsupported compiler choice ''cc_com' ignored" | ||||
| $       write sys$output "Use DECC, VAXC, or GNUC instead" | ||||
| $     else | ||||
| $     	if cc_com .eqs. "DECC" then its_decc = true | ||||
| $     	if cc_com .eqs. "VAXC" then its_vaxc = true | ||||
| $     	if cc_com .eqs. "GNUC" then its_gnuc = true | ||||
| $     endif | ||||
| $   endif | ||||
| $   if f$locate("MAKE=",cparm) .lt. f$length(cparm) | ||||
| $   then | ||||
| $     start  = f$locate("=",cparm) + 1 | ||||
| $     len    = f$length(cparm) - start | ||||
| $     mmks = f$extract(start,len,cparm) | ||||
| $     if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") | ||||
| $     then | ||||
| $       make = mmks | ||||
| $     else | ||||
| $       write sys$output "Unsupported make choice ''mmks' ignored" | ||||
| $       write sys$output "Use MMK or MMS instead" | ||||
| $     endif | ||||
| $   endif | ||||
| $   i = i + 1 | ||||
| $   goto opt_loop | ||||
| $ endif | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Look for the compiler used | ||||
| $! | ||||
| $! Version history | ||||
| $! 0.01 20040223 First version to receive a number | ||||
| $! 0.02 20040229 Save/set value of decc$no_rooted_search_lists | ||||
| $CHECK_COMPILER: | ||||
| $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) | ||||
| $ then | ||||
| $   its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") | ||||
| $   its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") | ||||
| $   its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") | ||||
| $ endif | ||||
| $! | ||||
| $! Exit if no compiler available | ||||
| $! | ||||
| $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) | ||||
| $ then goto CC_ERR | ||||
| $ else | ||||
| $   if its_decc | ||||
| $   then | ||||
| $     write sys$output "CC compiler check ... Compaq C" | ||||
| $     if f$trnlnm("decc$no_rooted_search_lists") .nes. "" | ||||
| $     then | ||||
| $       dnrsl = f$trnlnm("decc$no_rooted_search_lists") | ||||
| $     endif | ||||
| $     define decc$no_rooted_search_lists 1 | ||||
| $   else | ||||
| $     if its_vaxc then write sys$output "CC compiler check ... VAX C" | ||||
| $     if its_gnuc then write sys$output "CC compiler check ... GNU C" | ||||
| $     if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" | ||||
| $     if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" | ||||
| $   endif | ||||
| $ endif | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! If MMS/MMK are available dump out the descrip.mms if required | ||||
| $! | ||||
| $CREA_MMS: | ||||
| $ write sys$output "Creating descrip.mms..." | ||||
| $ create descrip.mms | ||||
| $ open/append out descrip.mms | ||||
| $ copy sys$input: out | ||||
| $ deck | ||||
| # descrip.mms: MMS description file for building zlib on VMS | ||||
| # written by Martin P.J. Zinser | ||||
| # <zinser@zinser.no-ip.info or zinser@sysdev.deutsche-boerse.com> | ||||
|  | ||||
| OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj, infback.obj\ | ||||
|        deflate.obj, trees.obj, zutil.obj, inflate.obj, \ | ||||
|        inftrees.obj, inffast.obj | ||||
|  | ||||
| $ eod | ||||
| $ write out "CFLAGS=", ccopt | ||||
| $ write out "LOPTS=", lopts | ||||
| $ copy sys$input: out | ||||
| $ deck | ||||
|  | ||||
| all : example.exe minigzip.exe libz.olb | ||||
|         @ write sys$output " Example applications available" | ||||
|  | ||||
| libz.olb : libz.olb($(OBJS)) | ||||
| 	@ write sys$output " libz available" | ||||
|  | ||||
| example.exe : example.obj libz.olb | ||||
|               link $(LOPTS) example,libz.olb/lib | ||||
|  | ||||
| minigzip.exe : minigzip.obj libz.olb | ||||
|               link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib | ||||
|  | ||||
| clean : | ||||
| 	delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* | ||||
|  | ||||
|  | ||||
| # Other dependencies. | ||||
| adler32.obj  : adler32.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| compress.obj : compress.c zlib.h zconf.h zlibdefs.h | ||||
| crc32.obj    : crc32.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| deflate.obj  : deflate.c deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| example.obj  : example.c zlib.h zconf.h zlibdefs.h | ||||
| gzio.obj     : gzio.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inffast.obj  : inffast.c zutil.h zlib.h zconf.h zlibdefs.h inftrees.h inffast.h | ||||
| inflate.obj  : inflate.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| inftrees.obj : inftrees.c zutil.h zlib.h zconf.h zlibdefs.h inftrees.h | ||||
| minigzip.obj : minigzip.c zlib.h zconf.h zlibdefs.h | ||||
| trees.obj    : trees.c deflate.h zutil.h zlib.h zconf.h zlibdefs.h | ||||
| uncompr.obj  : uncompr.c zlib.h zconf.h zlibdefs.h | ||||
| zutil.obj    : zutil.c zutil.h zlib.h zconf.h zlibdefs.h | ||||
| infback.obj  : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h | ||||
| $ eod | ||||
| $ close out | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Read list of core library sources from makefile.in and create options | ||||
| $! needed to build shareable image | ||||
| $! | ||||
| $CREA_OLIST: | ||||
| $ open/read min makefile.in | ||||
| $ open/write mod modules.opt | ||||
| $ src_check = "OBJS =" | ||||
| $MRLOOP: | ||||
| $ read/end=mrdone min rec | ||||
| $ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop | ||||
| $ rec = rec - src_check | ||||
| $ gosub extra_filnam | ||||
| $ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone | ||||
| $MRSLOOP: | ||||
| $ read/end=mrdone min rec | ||||
| $ gosub extra_filnam | ||||
| $ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop | ||||
| $MRDONE: | ||||
| $ close min | ||||
| $ close mod | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Take record extracted in crea_olist and split it into single filenames | ||||
| $! | ||||
| $EXTRA_FILNAM: | ||||
| $ myrec = f$edit(rec - "\", "trim,compress") | ||||
| $ i = 0 | ||||
| $FELOOP: | ||||
| $ srcfil = f$element(i," ", myrec) | ||||
| $ if (srcfil .nes. " ") | ||||
| $ then | ||||
| $   write mod f$parse(srcfil,,,"NAME"), ".obj" | ||||
| $   i = i + 1 | ||||
| $   goto feloop | ||||
| $ endif | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Find current Zlib version number | ||||
| $! | ||||
| $FIND_VERSION: | ||||
| $ open/read h_in 'v_file' | ||||
| $hloop: | ||||
| $ read/end=hdone h_in rec | ||||
| $ rec = f$edit(rec,"TRIM") | ||||
| $ if (f$extract(0,1,rec) .nes. "#") then goto hloop | ||||
| $ rec = f$edit(rec - "#", "TRIM") | ||||
| $ if f$element(0," ",rec) .nes. "define" then goto hloop | ||||
| $ if f$element(1," ",rec) .eqs. v_string | ||||
| $ then | ||||
| $   version = 'f$element(2," ",rec)' | ||||
| $   goto hdone | ||||
| $ endif | ||||
| $ goto hloop | ||||
| $hdone: | ||||
| $ close h_in | ||||
| $ return | ||||
| $!------------------------------------------------------------------------------ | ||||
| $! | ||||
| $! Analyze Object files for OpenVMS AXP to extract Procedure and Data  | ||||
| $! information to build a symbol vector for a shareable image | ||||
| $! All the "brains" of this logic was suggested by Hartmut Becker | ||||
| $! (Hartmut.Becker@compaq.com). All the bugs were introduced by me | ||||
| $! (zinser@zinser.no-ip.info), so if you do have problem reports please do not | ||||
| $! bother Hartmut/HP, but get in touch with me | ||||
| $! | ||||
| $! Version history | ||||
| $! 0.01 20040406 Skip over shareable images in option file | ||||
| $! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES | ||||
| $! 0.03 20050107 Skip over Identification labels in option file | ||||
| $! 0.04 20060117 Add uppercase alias to code compiled with /name=as_is | ||||
| $! | ||||
| $ ANAL_OBJ_AXP: Subroutine    | ||||
| $ V = 'F$Verify(0) | ||||
| $ SAY := "WRITE_ SYS$OUTPUT" | ||||
| $  | ||||
| $ IF F$SEARCH("''P1'") .EQS. "" | ||||
| $ THEN | ||||
| $    SAY "ANAL_OBJ_AXP-E-NOSUCHFILE:  Error, inputfile ''p1' not available" | ||||
| $    goto exit_aa | ||||
| $ ENDIF | ||||
| $ IF "''P2'" .EQS. "" | ||||
| $ THEN | ||||
| $    SAY "ANAL_OBJ_AXP:  Error, no output file provided" | ||||
| $    goto exit_aa | ||||
| $ ENDIF | ||||
| $ | ||||
| $ open/read in 'p1 | ||||
| $ create a.tmp | ||||
| $ open/append atmp a.tmp | ||||
| $ loop: | ||||
| $ read/end=end_loop in line | ||||
| $ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) | ||||
| $ then | ||||
| $   write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" | ||||
| $   goto loop | ||||
| $ endif | ||||
| $ if f$locate("IDENTIFICATION=",f$edit(line,"upcase")) .lt. f$length(line) | ||||
| $ then | ||||
| $   write sys$output "ANAL_OBJ_AXP-i-ident: Identification ", - | ||||
|                      f$element(1,"=",line) | ||||
| $   goto loop | ||||
| $ endif | ||||
| $ f= f$search(line) | ||||
| $ if f .eqs. "" | ||||
| $ then | ||||
| $	write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" | ||||
| $	goto loop | ||||
| $ endif | ||||
| $ define/user sys$output nl: | ||||
| $ define/user sys$error nl: | ||||
| $ anal/obj/gsd 'f /out=x.tmp | ||||
| $ open/read xtmp x.tmp | ||||
| $ XLOOP: | ||||
| $ read/end=end_xloop xtmp xline | ||||
| $ xline = f$edit(xline,"compress") | ||||
| $ write atmp xline | ||||
| $ goto xloop | ||||
| $ END_XLOOP: | ||||
| $ close xtmp | ||||
| $ goto loop | ||||
| $ end_loop: | ||||
| $ close in | ||||
| $ close atmp | ||||
| $ if f$search("a.tmp") .eqs. "" - | ||||
| 	then $ exit | ||||
| $ ! all global definitions | ||||
| $ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp | ||||
| $ ! all procedures | ||||
| $ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp | ||||
| $ search c.tmp "symbol:"/out=d.tmp | ||||
| $ define/user sys$output nl: | ||||
| $ edito/edt/command=sys$input d.tmp | ||||
| sub/symbol: "/symbol_vector=(/whole | ||||
| sub/"/=PROCEDURE)/whole | ||||
| exit | ||||
| $ ! all data | ||||
| $ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp | ||||
| $ search e.tmp "symbol:"/out=f.tmp | ||||
| $ define/user sys$output nl: | ||||
| $ edito/edt/command=sys$input f.tmp | ||||
| sub/symbol: "/symbol_vector=(/whole | ||||
| sub/"/=DATA)/whole | ||||
| exit | ||||
| $ sort/nodupl d.tmp,f.tmp g.tmp | ||||
| $ open/read raw_vector g.tmp | ||||
| $ open/write case_vector 'p2' | ||||
| $ RAWLOOP: | ||||
| $ read/end=end_rawloop raw_vector raw_element | ||||
| $ write case_vector raw_element | ||||
| $ if f$locate("=PROCEDURE)",raw_element) .lt. f$length(raw_element) | ||||
| $ then | ||||
| $     name = f$element(1,"=",raw_element) - "(" | ||||
| $     if f$edit(name,"UPCASE") .nes. name then - | ||||
|           write case_vector f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)", -  | ||||
| 	                          f$edit(name,"UPCASE"), name)  | ||||
| $ endif | ||||
| $ if f$locate("=DATA)",raw_element) .lt. f$length(raw_element) | ||||
| $ then | ||||
| $     name = f$element(1,"=",raw_element) - "(" | ||||
| $     if f$edit(name,"UPCASE") .nes. name then - | ||||
|           write case_vector f$fao(" symbol_vector=(!AS/!AS=DATA)", -  | ||||
| 	                          f$edit(name,"UPCASE"), name)  | ||||
| $ endif | ||||
| $ goto rawloop | ||||
| $ END_RAWLOOP: | ||||
| $ close raw_vector | ||||
| $ close case_vector | ||||
| $ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*,g.tmp;* | ||||
| $ if f$search("x.tmp") .nes. "" - | ||||
| 	then $ delete x.tmp;* | ||||
| $! | ||||
| $ EXIT_AA: | ||||
| $ if V then set verify | ||||
| $ endsubroutine  | ||||
| $!------------------------------------------------------------------------------ | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* minigzip.c -- simulate gzip using the zlib compression library | ||||
|  * Copyright (C) 1995-2004 Jean-loup Gailly. | ||||
|  * Copyright (C) 1995-2006 Jean-loup Gailly. | ||||
|  * For conditions of distribution and use, see copyright notice in zlib.h | ||||
|  */ | ||||
|  | ||||
| @@ -15,8 +15,8 @@ | ||||
|  | ||||
| /* @(#) $Id$ */ | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include "zlib.h" | ||||
| #include <stdio.h> | ||||
|  | ||||
| #ifdef STDC | ||||
| #  include <string.h> | ||||
| @@ -295,6 +295,8 @@ int main(argc, argv) | ||||
|         break; | ||||
|       argc--, argv++; | ||||
|     } | ||||
|     if (outmode[3] == ' ') | ||||
|         outmode[3] = 0; | ||||
|     if (argc == 0) { | ||||
|         SET_BINARY_MODE(stdin); | ||||
|         SET_BINARY_MODE(stdout); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user