zlib 1.2.0.5
diff --git a/ChangeLog b/ChangeLog
index 8e3d521..ebf063a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,72 @@
 
                 ChangeLog file for zlib
+
+Changes in 1.2.0.5 (8 September 2003)
+- Add infback9 diffs to contrib
+- Add OF to inflateBackEnd() declaration in zlib.h
+- Remember start when using gzdopen in the middle of a file
+- Use internal off_t counters in gz* functions to properly handle seeks
+- Perform more rigorous check for distance-too-far in inffast.c
+- Add Z_BLOCK flush option to return from inflate at block boundary
+- Set strm->data_type on return from inflate
+    - Indicate bits unused, if at block boundary, and if in last block
+- Replace size_t with ptrdiff_t in crc32.c, and check for correct size
+- Add condition so old NO_DEFLATE define still works for compatibility
+- FAQ update regarding the Windows DLL [Truta]
+- INDEX update: add qnx entry, remove aix entry [Truta]
+- Install zlib.3 into mandir [Wilson]
+- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta]
+- Adapt the zlib interface to the new DLL convention guidelines [Truta]
+- Introduce ZLIB_WINAPI macro to allow the export of functions using
+  the WINAPI calling convention, for Visual Basic [Vollant, Truta]
+- Update msdos and win32 scripts and makefiles [Truta]
+- Export symbols by name, not by ordinal, in win32/zlib.def [Truta]
+- Add contrib/ada [Anisimkov]
+- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta]
+- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant]
+- Add contrib/masm686 [Truta]
+- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm
+  [Truta, Vollant]
+- Update contrib/delphi; rename to contrib/pascal; add example [Truta]
+- Remove contrib/delphi2; add a new contrib/delphi [Truta]
+- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream,
+  and fix some method prototypes [Truta]
+- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip
+  [Truta]
+- Avoid the use of backslash (\) in contrib/minizip [Vollant]
+- Fix file time handling in contrib/untgz; update makefiles [Truta]
+- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines
+  [Vollant]
+- Remove contrib/vstudio/vc15_16 [Vollant]
+- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta]
+- Update README.contrib [Truta]
+- Invert the assignment order of match_head and s->prev[...] in
+  INSERT_STRING [Truta]
+- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings
+  [Truta]
+- Compare function pointers with 0, not with NULL or Z_NULL [Truta]
+- Fix prototype of syncsearch in inflate.c [Truta]
+- Introduce ASMINF macro to be enabled when using an ASM implementation
+  of inflate_fast [Truta]
+- Change NO_DEFLATE to NO_GZCOMPRESS [Truta]
+- Modify test_gzio in example.c to take a single file name as a
+  parameter [Truta]
+- Exit the example.c program if gzopen fails [Truta]
+- Add type casts around strlen in example.c [Truta]
+- Remove casting to sizeof in minigzip.c; give a proper type
+  to the variable compared with SUFFIX_LEN [Truta]
+- Update definitions of STDC and STDC99 in zconf.h [Truta]
+- Synchronize zconf.h with the new Windows DLL interface [Truta]
+- Use SYS16BIT instead of __32BIT__ to distinguish between
+  16- and 32-bit platforms [Truta]
+- Use far memory allocators in small 16-bit memory models for
+  Turbo C [Truta]
+- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in
+  zlibCompileFlags [Truta]
+- Cygwin has vsnprintf [Wilson]
+- In Windows16, OS_CODE is 0, as in MSDOS [Truta]
+- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson]
+
 Changes in 1.2.0.4 (10 August 2003)
 - Minor FAQ updates
 - Be more strict when checking inflateInit2's windowBits parameter
@@ -369,7 +436,7 @@
 - Eliminate memory leaks on error conditions in inflate
 - Removed some vestigial code in inflate
 - Update web address in README
-  
+
 Changes in 1.0.4 (24 Jul 96)
 - In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
   bit, so the decompressor could decompress all the correct data but went
diff --git a/FAQ b/FAQ
index e9bc6fc..e82dff1 100644
--- a/FAQ
+++ b/FAQ
@@ -2,7 +2,7 @@
                 Frequently Asked Questions about zlib
 
 
-If your question is not there, please check the zlib home page 
+If your question is not there, please check the zlib home page
 http://www.zlib.org which may have more recent information.
 The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
 
@@ -13,9 +13,10 @@
 
  2. Where can I get a Windows DLL version?
 
-    The zlib sources can be compiled without change to produce a DLL. If you
-    want a precompiled DLL, see http://www.winimage.com/zLibDll/ . Questions
-    about the zlib DLL should be sent to Gilles Vollant (info@winimage.com).
+    The zlib sources can be compiled without change to produce a DLL.
+    See the file win32/DLL_FAQ.txt in the zlib distribution.
+    Pointers to the precompiled DLL are found in the zlib web site at
+    http://www.zlib.org.
 
  3. Where can I get a Visual Basic interface to zlib?
 
@@ -66,7 +67,7 @@
     If "make test" produces something like
 
        example.o(.text+0x154): undefined reference to `gzputc'
-      
+
     check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
     /usr/X11R6/lib. Remove any old versions, then do "make install".
 
diff --git a/INDEX b/INDEX
index a1463ce..a9de784 100644
--- a/INDEX
+++ b/INDEX
@@ -8,11 +8,11 @@
 configure       configure script for Unix
 zconf.in.h      template for zconf.h (used by configure)
 
-aix/            instructions for building an AIX shared library
-msdos/		makefiles for MSDOS
+msdos/          makefiles for MSDOS
 old/            makefiles for various architectures and zlib documentation
                 files that have not yet been updated for zlib 1.2.x
-win32/		makefiles for Windows
+qnx/            makefiles for QNX
+win32/          makefiles for Windows
 
                 zlib public header files (must be kept):
 zconf.h
diff --git a/Makefile b/Makefile
index 425ad35..ac69ed9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,16 @@
 # Makefile for zlib
 # Copyright (C) 1995-2003 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile and test, type:
-#   ./configure; make test
+#    ./configure; make test
 # The call of configure is optional if you don't have special requirements
 # If you wish to build zlib as a shared library, use: ./configure -s
 
+# To use the asm code, type:
+#    cp contrib/asm?86/match.S ./match.S
+#    make LOC=-DASMV OBJA=match.o
+
 # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
 #    make install
 # To install in $HOME instead of /usr/local, use:
@@ -24,7 +28,7 @@
 LDSHARED=$(CC)
 CPP=$(CC) -E
 
-VER=1.2.0.4
+VER=1.2.0.5
 LIBS=libz.a
 SHAREDLIB=libz.so
 
@@ -37,6 +41,8 @@
 exec_prefix = ${prefix}
 libdir = ${exec_prefix}/lib
 includedir = ${prefix}/include
+mandir = ${prefix}/share/man
+man3dir = ${mandir}/man3
 
 OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
        zutil.o inflate.o infback.o inftrees.o inffast.o
@@ -46,7 +52,7 @@
 
 TEST_OBJS = example.o minigzip.o
 
-# Note: this hasn't been updated for zlib 1.2.0
+# Note: this has not been updated for zlib 1.2.0
 DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
   algorithm.txt zlib.3 zlib.html \
   msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
@@ -97,7 +103,8 @@
 install: $(LIBS)
 	-@if [ ! -d $(exec_prefix) ]; then mkdir $(exec_prefix); fi
 	-@if [ ! -d $(includedir)  ]; then mkdir $(includedir); fi
-	-@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
+	-@if [ ! -d $(libdir)      ]; then mkdir $(libdir); fi
+	-@if [ ! -d $(man3dir)     ]; then mkdir $(man3dir); fi
 	cp zlib.h zconf.h $(includedir)
 	chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
 	cp $(LIBS) $(libdir)
@@ -109,6 +116,8 @@
 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
 	  (ldconfig || true)  >/dev/null 2>&1; \
 	fi
+	cp zlib.3 $(man3dir)
+	chmod 644 $(man3dir)/zlib.3
 # The ranlib in install is needed on NeXTSTEP which checks file times
 # ldconfig is for Linux
 
@@ -123,6 +132,7 @@
 	if test -f $(SHAREDLIB).$$v; then \
 	  rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
 	fi
+	cd $(man3dir); rm -f zlib.3
 
 mostlyclean: clean
 clean:
@@ -130,11 +140,13 @@
 	   _match.s maketree
 
 maintainer-clean: distclean
-distclean:	clean
+distclean: clean
 	cp -p Makefile.in Makefile
 	cp -p zconf.in.h zconf.h
+	rm -f .DS_Store
 
 zip:
+	echo Warning: this has not been updated for zlib 1.2.0 -- do not use
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
 	rm -f test.c ztest*.c contrib/minizip/test.zip
 	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
@@ -142,7 +154,7 @@
 	mv Makefile~ Makefile
 
 dist:
-	echo Warning: this hasn't been updated for zlib 1.2.0 -- don't use
+	echo Warning: this has not been updated for zlib 1.2.0 -- do not use
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
 	rm -f test.c ztest*.c contrib/minizip/test.zip
 	d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
@@ -155,7 +167,7 @@
 	if test ! -d $$d; then rm -f $$d; fi
 	mv Makefile~ Makefile
 
-tags:	
+tags:
 	etags *.[ch]
 
 depend:
@@ -173,7 +185,7 @@
 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 
+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  
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/Makefile.in b/Makefile.in
index 425ad35..ac69ed9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,12 +1,16 @@
 # Makefile for zlib
 # Copyright (C) 1995-2003 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile and test, type:
-#   ./configure; make test
+#    ./configure; make test
 # The call of configure is optional if you don't have special requirements
 # If you wish to build zlib as a shared library, use: ./configure -s
 
+# To use the asm code, type:
+#    cp contrib/asm?86/match.S ./match.S
+#    make LOC=-DASMV OBJA=match.o
+
 # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
 #    make install
 # To install in $HOME instead of /usr/local, use:
@@ -24,7 +28,7 @@
 LDSHARED=$(CC)
 CPP=$(CC) -E
 
-VER=1.2.0.4
+VER=1.2.0.5
 LIBS=libz.a
 SHAREDLIB=libz.so
 
@@ -37,6 +41,8 @@
 exec_prefix = ${prefix}
 libdir = ${exec_prefix}/lib
 includedir = ${prefix}/include
+mandir = ${prefix}/share/man
+man3dir = ${mandir}/man3
 
 OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
        zutil.o inflate.o infback.o inftrees.o inffast.o
@@ -46,7 +52,7 @@
 
 TEST_OBJS = example.o minigzip.o
 
-# Note: this hasn't been updated for zlib 1.2.0
+# Note: this has not been updated for zlib 1.2.0
 DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
   algorithm.txt zlib.3 zlib.html \
   msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
@@ -97,7 +103,8 @@
 install: $(LIBS)
 	-@if [ ! -d $(exec_prefix) ]; then mkdir $(exec_prefix); fi
 	-@if [ ! -d $(includedir)  ]; then mkdir $(includedir); fi
-	-@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
+	-@if [ ! -d $(libdir)      ]; then mkdir $(libdir); fi
+	-@if [ ! -d $(man3dir)     ]; then mkdir $(man3dir); fi
 	cp zlib.h zconf.h $(includedir)
 	chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
 	cp $(LIBS) $(libdir)
@@ -109,6 +116,8 @@
 	  ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
 	  (ldconfig || true)  >/dev/null 2>&1; \
 	fi
+	cp zlib.3 $(man3dir)
+	chmod 644 $(man3dir)/zlib.3
 # The ranlib in install is needed on NeXTSTEP which checks file times
 # ldconfig is for Linux
 
@@ -123,6 +132,7 @@
 	if test -f $(SHAREDLIB).$$v; then \
 	  rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
 	fi
+	cd $(man3dir); rm -f zlib.3
 
 mostlyclean: clean
 clean:
@@ -130,11 +140,13 @@
 	   _match.s maketree
 
 maintainer-clean: distclean
-distclean:	clean
+distclean: clean
 	cp -p Makefile.in Makefile
 	cp -p zconf.in.h zconf.h
+	rm -f .DS_Store
 
 zip:
+	echo Warning: this has not been updated for zlib 1.2.0 -- do not use
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
 	rm -f test.c ztest*.c contrib/minizip/test.zip
 	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
@@ -142,7 +154,7 @@
 	mv Makefile~ Makefile
 
 dist:
-	echo Warning: this hasn't been updated for zlib 1.2.0 -- don't use
+	echo Warning: this has not been updated for zlib 1.2.0 -- do not use
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
 	rm -f test.c ztest*.c contrib/minizip/test.zip
 	d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
@@ -155,7 +167,7 @@
 	if test ! -d $$d; then rm -f $$d; fi
 	mv Makefile~ Makefile
 
-tags:	
+tags:
 	etags *.[ch]
 
 depend:
@@ -173,7 +185,7 @@
 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 
+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  
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/README b/README
index f3f34ba..c95b0d2 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
 ZLIB DATA COMPRESSION LIBRARY
 
-zlib 1.2.0.4 is a general purpose data compression library.  All the code is
+zlib 1.2.0.5 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)
@@ -34,7 +34,7 @@
 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.0.4 are documented in the file ChangeLog.
+The changes made in version 1.2.0.5 are documented in the file ChangeLog.
 
 Unsupported third party contributions are provided in directory "contrib".
 
diff --git a/adler32.c b/adler32.c
index 5506363..4d52399 100644
--- a/adler32.c
+++ b/adler32.c
@@ -1,6 +1,6 @@
 /* adler32.c -- compute the Adler-32 checksum of a data stream
  * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* @(#) $Id$ */
diff --git a/algorithm.txt b/algorithm.txt
index a049765..b022dde 100644
--- a/algorithm.txt
+++ b/algorithm.txt
@@ -91,40 +91,40 @@
 
 2.2 More details on the inflate table lookup
 
-Ok, you want to know what this cleverly obfuscated inflate tree actually  
-looks like.  You are correct that it's not a Huffman tree.  It is simply a  
-lookup table for the first, let's say, nine bits of a Huffman symbol.  The  
-symbol could be as short as one bit or as long as 15 bits.  If a particular  
+Ok, you want to know what this cleverly obfuscated inflate tree actually
+looks like.  You are correct that it's not a Huffman tree.  It is simply a
+lookup table for the first, let's say, nine bits of a Huffman symbol.  The
+symbol could be as short as one bit or as long as 15 bits.  If a particular
 symbol is shorter than nine bits, then that symbol's translation is duplicated
-in all those entries that start with that symbol's bits.  For example, if the  
-symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a  
+in all those entries that start with that symbol's bits.  For example, if the
+symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a
 symbol is nine bits long, it appears in the table once.
 
-If the symbol is longer than nine bits, then that entry in the table points  
-to another similar table for the remaining bits.  Again, there are duplicated  
+If the symbol is longer than nine bits, then that entry in the table points
+to another similar table for the remaining bits.  Again, there are duplicated
 entries as needed.  The idea is that most of the time the symbol will be short
-and there will only be one table look up.  (That's whole idea behind data  
-compression in the first place.)  For the less frequent long symbols, there  
-will be two lookups.  If you had a compression method with really long  
-symbols, you could have as many levels of lookups as is efficient.  For  
+and there will only be one table look up.  (That's whole idea behind data
+compression in the first place.)  For the less frequent long symbols, there
+will be two lookups.  If you had a compression method with really long
+symbols, you could have as many levels of lookups as is efficient.  For
 inflate, two is enough.
 
-So a table entry either points to another table (in which case nine bits in  
-the above example are gobbled), or it contains the translation for the symbol  
-and the number of bits to gobble.  Then you start again with the next  
+So a table entry either points to another table (in which case nine bits in
+the above example are gobbled), or it contains the translation for the symbol
+and the number of bits to gobble.  Then you start again with the next
 ungobbled bit.
 
-You may wonder: why not just have one lookup table for how ever many bits the  
-longest symbol is?  The reason is that if you do that, you end up spending  
-more time filling in duplicate symbol entries than you do actually decoding.   
-At least for deflate's output that generates new trees every several 10's of  
-kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code  
-would take too long if you're only decoding several thousand symbols.  At the  
+You may wonder: why not just have one lookup table for how ever many bits the
+longest symbol is?  The reason is that if you do that, you end up spending
+more time filling in duplicate symbol entries than you do actually decoding.
+At least for deflate's output that generates new trees every several 10's of
+kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code
+would take too long if you're only decoding several thousand symbols.  At the
 other extreme, you could make a new table for every bit in the code.  In fact,
-that's essentially a Huffman tree.  But then you spend two much time  
+that's essentially a Huffman tree.  But then you spend two much time
 traversing the tree while decoding, even for short symbols.
 
-So the number of bits for the first lookup table is a trade of the time to  
+So the number of bits for the first lookup table is a trade of the time to
 fill out the table vs. the time spent looking at the second level and above of
 the table.
 
@@ -154,7 +154,7 @@
 110: -> table X (gobble 3 bits)
 111: -> table Y (gobble 3 bits)
 
-Each entry is what the bits decode as and how many bits that is, i.e. how  
+Each entry is what the bits decode as and how many bits that is, i.e. how
 many bits to gobble.  Or the entry points to another table, with the number of
 bits to gobble implicit in the size of the table.
 
@@ -166,7 +166,7 @@
 10: D,2
 11: E,2
 
-Table Y is three bits long since the longest code starting with 111 is six  
+Table Y is three bits long since the longest code starting with 111 is six
 bits long:
 
 000: F,2
@@ -178,20 +178,20 @@
 110: I,3
 111: J,3
 
-So what we have here are three tables with a total of 20 entries that had to  
-be constructed.  That's compared to 64 entries for a single table.  Or  
-compared to 16 entries for a Huffman tree (six two entry tables and one four  
-entry table).  Assuming that the code ideally represents the probability of  
+So what we have here are three tables with a total of 20 entries that had to
+be constructed.  That's compared to 64 entries for a single table.  Or
+compared to 16 entries for a Huffman tree (six two entry tables and one four
+entry table).  Assuming that the code ideally represents the probability of
 the symbols, it takes on the average 1.25 lookups per symbol.  That's compared
-to one lookup for the single table, or 1.66 lookups per symbol for the  
+to one lookup for the single table, or 1.66 lookups per symbol for the
 Huffman tree.
 
-There, I think that gives you a picture of what's going on.  For inflate, the  
-meaning of a particular symbol is often more than just a letter.  It can be a  
-byte (a "literal"), or it can be either a length or a distance which  
-indicates a base value and a number of bits to fetch after the code that is  
-added to the base value.  Or it might be the special end-of-block code.  The  
-data structures created in inftrees.c try to encode all that information  
+There, I think that gives you a picture of what's going on.  For inflate, the
+meaning of a particular symbol is often more than just a letter.  It can be a
+byte (a "literal"), or it can be either a length or a distance which
+indicates a base value and a number of bits to fetch after the code that is
+added to the base value.  Or it might be the special end-of-block code.  The
+data structures created in inftrees.c try to encode all that information
 compactly in the tables.
 
 
diff --git a/compress.c b/compress.c
index fbee085..24ef029 100644
--- a/compress.c
+++ b/compress.c
@@ -1,6 +1,6 @@
 /* compress.c -- compress a memory buffer
  * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* @(#) $Id$ */
diff --git a/configure b/configure
index 39f5d8d..9999de8 100755
--- a/configure
+++ b/configure
@@ -28,6 +28,7 @@
 exec_prefix=${exec_prefix-'${prefix}'}
 libdir=${libdir-'${exec_prefix}/lib'}
 includedir=${includedir-'${prefix}/include'}
+mandir=${mandir-'${prefix}/share/man'}
 shared_ext='.so'
 shared=0
 gcc=0
@@ -78,8 +79,9 @@
   CFLAGS="$cflags"
   case `(uname -s || echo unknown) 2>/dev/null` in
   Linux | linux) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};;
-  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"};;
+  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"}
                  shared_ext='.sl'
                  SHAREDLIB='libz.sl';;
@@ -90,54 +92,54 @@
   CC=${CC-cc}
   case `(uname -sr || echo unknown) 2>/dev/null` in
   HP-UX*)    SFLAGS=${CFLAGS-"-O +z"}
-	     CFLAGS=${CFLAGS-"-O"}
-#	     LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
-	     LDSHARED=${LDSHARED-"ld -b"}
-	     shared_ext='.sl'
-	     SHAREDLIB='libz.sl';;
+             CFLAGS=${CFLAGS-"-O"}
+#            LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
+             LDSHARED=${LDSHARED-"ld -b"}
+             shared_ext='.sl'
+             SHAREDLIB='libz.sl';;
   IRIX*)     SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
-	     CFLAGS=${CFLAGS-"-ansi -O2"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
+             CFLAGS=${CFLAGS-"-ansi -O2"}
+             LDSHARED=${LDSHARED-"cc -shared"};;
   OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
-	     CFLAGS=${CFLAGS-"-O -std1"}
-	     LDSHARED=${LDSHARED-"cc -shared  -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
+             CFLAGS=${CFLAGS-"-O -std1"}
+             LDSHARED=${LDSHARED-"cc -shared  -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
   OSF1*)     SFLAGS=${CFLAGS-"-O -std1"}
-	     CFLAGS=${CFLAGS-"-O -std1"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
+             CFLAGS=${CFLAGS-"-O -std1"}
+             LDSHARED=${LDSHARED-"cc -shared"};;
   QNX*)      SFLAGS=${CFLAGS-"-4 -O"}
              CFLAGS=${CFLAGS-"-4 -O"}
-	     LDSHARED=${LDSHARED-"cc"}
+             LDSHARED=${LDSHARED-"cc"}
              RANLIB=${RANLIB-"true"}
              AR="cc -A";;
   SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
-	     CFLAGS=${CFLAGS-"-O3"}
-	     LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
+             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"};;
+             LDSHARED=${LDSHARED-"cc -G"};;
   SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
-	     CFLAGS=${CFLAGS-"-O2"}
-	     LDSHARED=${LDSHARED-"ld"};;
-  UNIX_System_V\ 4.2.0) 
-	     SFLAGS=${CFLAGS-"-KPIC -O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
+             CFLAGS=${CFLAGS-"-O2"}
+             LDSHARED=${LDSHARED-"ld"};;
+  UNIX_System_V\ 4.2.0)
+             SFLAGS=${CFLAGS-"-KPIC -O"}
+             CFLAGS=${CFLAGS-"-O"}
+             LDSHARED=${LDSHARED-"cc -G"};;
   UNIX_SV\ 4.2MP)
-	     SFLAGS=${CFLAGS-"-Kconform_pic -O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
-  OpenUNIX\ 5) 
-	     SFLAGS=${CFLAGS-"-KPIC -O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -G"};;
+             SFLAGS=${CFLAGS-"-Kconform_pic -O"}
+             CFLAGS=${CFLAGS-"-O"}
+             LDSHARED=${LDSHARED-"cc -G"};;
+  OpenUNIX\ 5)
+             SFLAGS=${CFLAGS-"-KPIC -O"}
+             CFLAGS=${CFLAGS-"-O"}
+             LDSHARED=${LDSHARED-"cc -G"};;
   AIX*)  # Courtesy of dbakker@arrayasolutions.com
-	     SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
-	     CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
-	     LDSHARED=${LDSHARED-"xlc -G"};;
+             SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
+             CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
+             LDSHARED=${LDSHARED-"xlc -G"};;
   # send working options for other systems to support@gzip.org
   *)         SFLAGS=${CFLAGS-"-O"}
-	     CFLAGS=${CFLAGS-"-O"}
-	     LDSHARED=${LDSHARED-"cc -shared"};;
+             CFLAGS=${CFLAGS-"-O"}
+             LDSHARED=${LDSHARED-"cc -shared"};;
   esac
 fi
 
@@ -150,10 +152,10 @@
     LIBS="$SHAREDLIB.$VER"
     echo Building shared library $SHAREDLIB.$VER with $CC.
   elif test -z "$old_cc" -a -z "$old_cflags"; then
-    echo No shared library suppport.
+    echo No shared library support.
     shared=0;
   else
-    echo 'No shared library suppport; try without defining CC and CFLAGS'
+    echo 'No shared library support; try without defining CC and CFLAGS'
     shared=0;
   fi
 fi
@@ -182,7 +184,7 @@
 #  define STDC
 #endif
 
-int main() 
+int main()
 {
 #ifndef STDC
   choke me
@@ -215,7 +217,7 @@
   return (mytest("Hello%d\n", 1));
 }
 EOF
-  
+
   if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
     echo "Checking for vsnprintf() in stdio.h... Yes."
 
@@ -273,7 +275,7 @@
   return 0;
 }
 
-int main() 
+int main()
 {
   return (mytest("Hello%d\n", 1));
 }
@@ -296,7 +298,7 @@
 #include <stdio.h>
 #include <stdarg.h>
 
-int mytest() 
+int mytest()
 {
   char buf[20];
 
@@ -304,7 +306,7 @@
   return 0;
 }
 
-int main() 
+int main()
 {
   return (mytest());
 }
@@ -326,7 +328,7 @@
   return 0;
 }
 
-int main() 
+int main()
 {
   return (mytest());
 }
@@ -352,7 +354,7 @@
 #include <stdio.h>
 #include <stdarg.h>
 
-int mytest(char *fmt, ...) 
+int mytest(char *fmt, ...)
 {
   int i;
   char buf[20];
@@ -361,7 +363,7 @@
   return 0;
 }
 
-int main() 
+int main()
 {
   return (mytest());
 }
@@ -384,9 +386,9 @@
 int main() { return 0; }
 EOF
 if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
-  echo "Checking for errno.h...	 Yes."
+  echo "Checking for errno.h... Yes."
 else
-  echo "Checking for errno.h...	 No."
+  echo "Checking for errno.h... No."
   CFLAGS="$CFLAGS -DNO_ERRNO_H"
 fi
 
@@ -395,7 +397,7 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 caddr_t hello() {
-  return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); 
+  return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0);
 }
 EOF
 if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
@@ -433,5 +435,6 @@
 /^exec_prefix *=/s%=.*%=$exec_prefix%
 /^libdir *=/s%=.*%=$libdir%
 /^includedir *=/s%=.*%=$includedir%
+/^mandir *=/s%=.*%=$mandir%
 /^LDFLAGS *=/s%=.*%=$LDFLAGS%
 " > Makefile
diff --git a/contrib/README.contrib b/contrib/README.contrib
index 3579d43..b1de0d1 100644
--- a/contrib/README.contrib
+++ b/contrib/README.contrib
@@ -4,44 +4,64 @@
 for help about these, not the zlib authors. Thanks.
 
 
-asm386/     by Gilles Vollant <info@winimage.com>
-	386 asm code replacing longest_match(), for Visual C++ 4.2 and ML 6.11c
+ada/        by Dmitriy Anisimkov <anisimkov@yahoo.com>
+	Support for Ada
+	See http://zlib-ada.sourceforge.net/
 
-asm586/ and asm686/    by Brian Raiter <breadbox@muppetlabs.com> 
-        asm code for Pentium and Pentium Pro
-        See http://www.muppetlabs.com/~breadbox/software/assembly.html
+asm586/ and asm686/ by Brian Raiter <breadbox@muppetlabs.com>
+	asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
+	See http://www.muppetlabs.com/~breadbox/software/assembly.html
 
 blast/      by Mark Adler <madler@alumni.caltech.edu>
 	Decompressor for output of PKWare Data Compression Library (DCL)
 
-delphi/     by Bob Dellaca <bobdl@xtra.co.nz>
-	Support for Delphi
+delphi/     by Cosmin Truta <cosmint@cs.ubbcluj.ro>
+	Support for Delphi and C++ Builder
 
-delphi2/    by Davide Moretti <dave@rimini.com>
-        Another support for C++Builder and Delphi
+infback9/   by Mark Adler <madler@alumni.caltech.edu>
+        Unsupported diffs to infback to decode the deflate64 format
+        (Worse than that, it's not even tested)
 
 inflate86/  by Chris Anderson <christop@charm.net>
 	Tuned x86 gcc asm code to replace inflate_fast()
 
-minizip/    by Gilles Vollant <info@winimage.com>
-	Mini zip and unzip based on zlib
-        See http://www.winimage.com/zLibDll/unzip.html
-
 iostream/   by Kevin Ruland <kevin@rodin.wustl.edu>
-        A C++ I/O streams interface to the zlib gz* functions
+	A C++ I/O streams interface to the zlib gz* functions
 
 iostream2/  by Tyge Løvset <Tyge.Lovset@cmr.no>
 	Another C++ I/O streams interface
 
-testzlib/    by Gilles Vollant <info@winimage.com>
+iostream3/  by Ludwig Schwardt <schwardt@sun.ac.za>
+            and Kevin Ruland <kevin@rodin.wustl.edu>
+	Yet another C++ I/O streams interface
+
+masm686/    by Dan Higdon <hdan@kinesoft.com>
+            and Chuck Walbourn <chuckw@kinesoft.com>
+	asm code for Pentium Pro/PII, using the MASM syntax
+
+masmx86/    by Gilles Vollant <info@winimage.com>
+	x86 asm code to replace longest_match() and inflate_fast(),
+	for Visual C++ and MASM
+
+minizip/    by Gilles Vollant <info@winimage.com>
+	Mini zip and unzip based on zlib
+	See http://www.winimage.com/zLibDll/unzip.html
+
+pascal/     by Bob Dellaca <bobdl@xtra.co.nz> et al.
+	Support for Pascal
+
+puff/       by Mark Adler <madler@alumni.caltech.edu>
+	Small, low memory usage inflate.  Also serves to provide an
+	unambiguous description of the deflate format.
+
+testzlib/   by Gilles Vollant <info@winimage.com>
 	Example of the use of zlib
 
 untgz/      by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
 	A very simple tar.gz file extractor using zlib
 
 visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
-        How to use compress(), uncompress() and the gz* functions from VB.
+	How to use compress(), uncompress() and the gz* functions from VB
 
 vstudio/    by Gilles Vollant <info@winimage.com>
-	Building zlib DLL with Visual Studio .NET
-	Includes x86 inffast.asm for MASM
+	Building zlib with Visual Studio .NET
diff --git a/contrib/ada/mtest.adb b/contrib/ada/mtest.adb
new file mode 100644
index 0000000..91a96cd
--- /dev/null
+++ b/contrib/ada/mtest.adb
@@ -0,0 +1,153 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+--  Continuous test for ZLib multithreading. If the test is fail
+--  Wou should provide thread safe allocation routines for the Z_Stream.
+--
+--  $Id: mtest.adb,v 1.2 2003/08/12 12:11:05 vagul Exp $
+
+with ZLib;
+with Ada.Streams;
+with Ada.Numerics.Discrete_Random;
+with Ada.Text_IO;
+with Ada.Exceptions;
+with Ada.Task_Identification;
+
+procedure MTest is
+   use Ada.Streams;
+   use ZLib;
+
+   Stop : Boolean := False;
+
+   pragma Atomic (Stop);
+
+   subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
+
+   package Random_Elements is
+      new Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+   task type Test_Task;
+
+   task body Test_Task is
+      Buffer : Stream_Element_Array (1 .. 100_000);
+      Gen : Random_Elements.Generator;
+
+      Buffer_First  : Stream_Element_Offset;
+      Compare_First : Stream_Element_Offset;
+
+      Deflate : Filter_Type;
+      Inflate : Filter_Type;
+
+      procedure Further (Item : in Stream_Element_Array);
+
+      procedure Read_Buffer
+        (Item : out Ada.Streams.Stream_Element_Array;
+         Last : out Ada.Streams.Stream_Element_Offset);
+
+      -------------
+      -- Further --
+      -------------
+
+      procedure Further (Item : in Stream_Element_Array) is
+
+         procedure Compare (Item : in Stream_Element_Array);
+
+         -------------
+         -- Compare --
+         -------------
+
+         procedure Compare (Item : in Stream_Element_Array) is
+            Next_First : Stream_Element_Offset := Compare_First + Item'Length;
+         begin
+            if Buffer (Compare_First .. Next_First - 1) /= Item then
+               raise Program_Error;
+            end if;
+
+            Compare_First := Next_First;
+         end Compare;
+
+         procedure Compare_Write is new ZLib.Write (Write => Compare);
+      begin
+         Compare_Write (Inflate, Item, No_Flush);
+      end Further;
+
+      -----------------
+      -- Read_Buffer --
+      -----------------
+
+      procedure Read_Buffer
+        (Item : out Ada.Streams.Stream_Element_Array;
+         Last : out Ada.Streams.Stream_Element_Offset)
+      is
+         Buff_Diff   : Stream_Element_Offset := Buffer'Last - Buffer_First;
+         Next_First : Stream_Element_Offset;
+      begin
+         if Item'Length <= Buff_Diff then
+            Last := Item'Last;
+
+            Next_First := Buffer_First + Item'Length;
+
+            Item := Buffer (Buffer_First .. Next_First - 1);
+
+            Buffer_First := Next_First;
+         else
+            Last := Item'First + Buff_Diff;
+            Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
+            Buffer_First := Buffer'Last + 1;
+         end if;
+      end Read_Buffer;
+
+      procedure Translate is new Generic_Translate
+                                   (Data_In  => Read_Buffer,
+                                    Data_Out => Further);
+
+   begin
+      Random_Elements.Reset (Gen);
+
+      Buffer := (others => 20);
+
+      Main : loop
+         for J in Buffer'Range loop
+            Buffer (J) := Random_Elements.Random (Gen);
+
+            Deflate_Init (Deflate);
+            Inflate_Init (Inflate);
+
+            Buffer_First  := Buffer'First;
+            Compare_First := Buffer'First;
+
+            Translate (Deflate);
+
+            if Compare_First /= Buffer'Last + 1 then
+               raise Program_Error;
+            end if;
+
+            Ada.Text_IO.Put_Line
+              (Ada.Task_Identification.Image
+                 (Ada.Task_Identification.Current_Task)
+               & Stream_Element_Offset'Image (J)
+               & ZLib.Count'Image (Total_Out (Deflate)));
+
+            Close (Deflate);
+            Close (Inflate);
+
+            exit Main when Stop;
+         end loop;
+      end loop Main;
+   exception
+      when E : others =>
+         Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
+         Stop := True;
+   end Test_Task;
+
+   Test : array (1 .. 4) of Test_Task;
+
+   pragma Unreferenced (Test);
+
+begin
+   null;
+end MTest;
diff --git a/contrib/ada/read.adb b/contrib/ada/read.adb
new file mode 100644
index 0000000..184ea00
--- /dev/null
+++ b/contrib/ada/read.adb
@@ -0,0 +1,151 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: read.adb,v 1.7 2003/08/12 12:12:35 vagul Exp $
+
+--  Test/demo program for the generic read interface.
+
+with Ada.Numerics.Discrete_Random;
+with Ada.Streams;
+with Ada.Text_IO;
+
+with ZLib;
+
+procedure Read is
+
+   use Ada.Streams;
+
+   ------------------------------------
+   --  Test configuration parameters --
+   ------------------------------------
+
+   File_Size   : Stream_Element_Offset := 100_000;
+
+   Continuous  : constant Boolean          := False;
+   --  If this constant is True, the test would be repeated again and again,
+   --  with increment File_Size for every iteration.
+
+   Header      : constant ZLib.Header_Type := ZLib.Default;
+   --  Do not use Header other than Default in ZLib versions 1.1.4 and older.
+
+   Init_Random : constant := 8;
+   --  We are using the same random sequence, in case of we catch bug,
+   --  so we would be able to reproduce it.
+
+   -- End --
+
+   Pack_Size : Stream_Element_Offset;
+   Offset    : Stream_Element_Offset;
+
+   Filter     : ZLib.Filter_Type;
+
+   subtype Visible_Symbols
+      is Stream_Element range 16#20# .. 16#7E#;
+
+   package Random_Elements is new
+      Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+   Gen : Random_Elements.Generator;
+   Period  : constant Stream_Element_Offset := 200;
+   --  Period constant variable for random generator not to be very random.
+   --  Bigger period, harder random.
+
+   Read_Buffer : Stream_Element_Array (1 .. 2048);
+   Read_First  : Stream_Element_Offset;
+   Read_Last   : Stream_Element_Offset;
+
+   procedure Reset;
+
+   procedure Read
+     (Item : out Stream_Element_Array;
+      Last : out Stream_Element_Offset);
+   --  this procedure is for generic instantiation of
+   --  ZLib.Read
+   --  reading data from the File_In.
+
+   procedure Read is new ZLib.Read (Read, Read_Buffer, Read_First, Read_Last);
+
+   ----------
+   -- Read --
+   ----------
+
+   procedure Read
+     (Item : out Stream_Element_Array;
+      Last : out Stream_Element_Offset) is
+   begin
+      Last := Stream_Element_Offset'Min
+               (Item'Last,
+                Item'First + File_Size - Offset);
+
+      for J in Item'First .. Last loop
+         if J < Item'First + Period then
+            Item (J) := Random_Elements.Random (Gen);
+         else
+            Item (J) := Item (J - Period);
+         end if;
+
+         Offset   := Offset + 1;
+      end loop;
+   end Read;
+
+   -----------
+   -- Reset --
+   -----------
+
+   procedure Reset is
+   begin
+      Random_Elements.Reset (Gen, Init_Random);
+      Pack_Size := 0;
+      Offset := 1;
+      Read_First := Read_Buffer'Last + 1;
+   end Reset;
+
+begin
+   Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
+
+   loop
+      for Level in ZLib.Compression_Level'Range loop
+
+         Ada.Text_IO.Put ("Level ="
+            & ZLib.Compression_Level'Image (Level));
+
+         --  Deflate using generic instantiation.
+
+         ZLib.Deflate_Init
+               (Filter,
+                Level,
+                Header => Header);
+
+         Reset;
+
+         Ada.Text_IO.Put
+           (Stream_Element_Offset'Image (File_Size) & " ->");
+
+         loop
+            declare
+               Buffer : Stream_Element_Array (1 .. 1024);
+               Last   : Stream_Element_Offset;
+            begin
+               Read (Filter, Buffer, Last);
+
+               Pack_Size := Pack_Size + Last - Buffer'First + 1;
+
+               exit when Last < Buffer'Last;
+            end;
+         end loop;
+
+         Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
+
+         ZLib.Close (Filter);
+      end loop;
+
+      exit when not Continuous;
+
+      File_Size := File_Size + 1;
+   end loop;
+end Read;
diff --git a/contrib/ada/readme.txt b/contrib/ada/readme.txt
new file mode 100644
index 0000000..ad02c22
--- /dev/null
+++ b/contrib/ada/readme.txt
@@ -0,0 +1,52 @@
+
+			ZLib for Ada thick binding (ZLib.Ada)
+			Release 1.2
+
+ZLib.Ada is a thick binding interface to the popular ZLib data
+compression library, available at http://www.gzip.org/zlib/.
+It provides Ada-style access to the ZLib C library.
+
+
+	Here are the main changes since ZLib.Ada 1.1:
+
+- The default header type has a name "Default" now. Auto is used only for
+  automatic GZip/ZLib header detection.
+
+- Added test for multitasking mtest.adb.
+
+- Added GNAT project file zlib.gpr.
+
+
+	How to build ZLib.Ada under GNAT
+
+You should have the ZLib library already build on your computer, before
+building ZLib.Ada. Make the directory of ZLib.Ada sources current and
+issue the command:
+
+  gnatmake test -largs -L<directory where libz.a is> -lz
+
+Or use the GNAT project file build for GNAT 3.15 or later:
+
+  gnatmake -Pzlib.gpr -L<directory where libz.a is>
+
+
+	How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
+
+1. Make a project with all *.ads and *.adb files from the distribution.
+2. Build the libz.a library from the ZLib C sources.
+3. Rename libz.a to z.lib.
+4. Add the library z.lib to the project.
+5. Add the libc.lib library from the ObjectAda distribution to the project.
+6. Build the executable using test.adb as a main procedure.
+
+
+	How to use ZLib.Ada
+
+The source files test.adb and read.adb are small demo programs that show
+the main functionality of ZLib.Ada.
+
+The routines from the package specifications are commented.
+
+
+Homepage: http://zlib-ada.sourceforge.net/
+Author: Dmitriy Anisimkov <anisimkov@yahoo.com>
diff --git a/contrib/ada/test.adb b/contrib/ada/test.adb
new file mode 100644
index 0000000..90773ac
--- /dev/null
+++ b/contrib/ada/test.adb
@@ -0,0 +1,463 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
+
+--  The program has a few aims.
+--  1. Test ZLib.Ada95 thick binding functionality.
+--  2. Show the example of use main functionality of the ZLib.Ada95 binding.
+--  3. Build this program automatically compile all ZLib.Ada95 packages under
+--     GNAT Ada95 compiler.
+
+with ZLib.Streams;
+with Ada.Streams.Stream_IO;
+with Ada.Numerics.Discrete_Random;
+
+with Ada.Text_IO;
+
+with Ada.Calendar;
+
+procedure Test is
+
+   use Ada.Streams;
+   use Stream_IO;
+
+   ------------------------------------
+   --  Test configuration parameters --
+   ------------------------------------
+
+   File_Size   : Count   := 100_000;
+   Continuous  : constant Boolean := False;
+
+   Header      : constant ZLib.Header_Type := ZLib.Default;
+                                              --  ZLib.None;
+                                              --  ZLib.Auto;
+                                              --  ZLib.GZip;
+   --  Do not use Header other then Default in ZLib versions 1.1.4
+   --  and older.
+
+   Strategy    : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
+   Init_Random : constant := 10;
+
+   -- End --
+
+   In_File_Name  : constant String := "testzlib.in";
+   --  Name of the input file
+
+   Z_File_Name   : constant String := "testzlib.zlb";
+   --  Name of the compressed file.
+
+   Out_File_Name : constant String := "testzlib.out";
+   --  Name of the decompressed file.
+
+   File_In   : File_Type;
+   File_Out  : File_Type;
+   File_Back : File_Type;
+   File_Z    : ZLib.Streams.Stream_Type;
+
+   Filter : ZLib.Filter_Type;
+
+   Time_Stamp : Ada.Calendar.Time;
+
+   procedure Generate_File;
+   --  Generate file of spetsified size with some random data.
+   --  The random data is repeatable, for the good compression.
+
+   procedure Compare_Streams
+     (Left, Right : in out Root_Stream_Type'Class);
+   --  The procedure compearing data in 2 streams.
+   --  It is for compare data before and after compression/decompression.
+
+   procedure Compare_Files (Left, Right : String);
+   --  Compare files. Based on the Compare_Streams.
+
+   procedure Copy_Streams
+     (Source, Target : in out Root_Stream_Type'Class;
+      Buffer_Size    : in     Stream_Element_Offset := 1024);
+   --  Copying data from one stream to another. It is for test stream
+   --  interface of the library.
+
+   procedure Data_In
+     (Item : out Stream_Element_Array;
+      Last : out Stream_Element_Offset);
+   --  this procedure is for generic instantiation of
+   --  ZLib.Generic_Translate.
+   --  reading data from the File_In.
+
+   procedure Data_Out (Item : in Stream_Element_Array);
+   --  this procedure is for generic instantiation of
+   --  ZLib.Generic_Translate.
+   --  writing data to the File_Out.
+
+   procedure Stamp;
+   --  Store the timestamp to the local variable.
+
+   procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
+   --  Print the time statistic with the message.
+
+   procedure Translate is new ZLib.Generic_Translate
+                                (Data_In  => Data_In,
+                                 Data_Out => Data_Out);
+   --  This procedure is moving data from File_In to File_Out
+   --  with compression or decompression, depend on initialization of
+   --  Filter parameter.
+
+   -------------------
+   -- Compare_Files --
+   -------------------
+
+   procedure Compare_Files (Left, Right : String) is
+      Left_File, Right_File : File_Type;
+   begin
+      Open (Left_File, In_File, Left);
+      Open (Right_File, In_File, Right);
+      Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
+      Close (Left_File);
+      Close (Right_File);
+   end Compare_Files;
+
+   ---------------------
+   -- Compare_Streams --
+   ---------------------
+
+   procedure Compare_Streams
+     (Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
+   is
+      Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
+      Left_Last, Right_Last : Stream_Element_Offset;
+   begin
+      loop
+         Read (Left, Left_Buffer, Left_Last);
+         Read (Right, Right_Buffer, Right_Last);
+
+         if Left_Last /= Right_Last then
+            Ada.Text_IO.Put_Line ("Compare error :"
+              & Stream_Element_Offset'Image (Left_Last)
+              & " /= "
+              & Stream_Element_Offset'Image (Right_Last));
+
+            raise Constraint_Error;
+
+         elsif Left_Buffer (0 .. Left_Last)
+               /= Right_Buffer (0 .. Right_Last)
+         then
+            Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
+            raise Constraint_Error;
+
+         end if;
+
+         exit when Left_Last < Left_Buffer'Last;
+      end loop;
+   end Compare_Streams;
+
+   ------------------
+   -- Copy_Streams --
+   ------------------
+
+   procedure Copy_Streams
+     (Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
+      Buffer_Size    : in     Stream_Element_Offset := 1024)
+   is
+      Buffer : Stream_Element_Array (1 .. Buffer_Size);
+      Last   : Stream_Element_Offset;
+   begin
+      loop
+         Read  (Source, Buffer, Last);
+         Write (Target, Buffer (1 .. Last));
+
+         exit when Last < Buffer'Last;
+      end loop;
+   end Copy_Streams;
+
+   -------------
+   -- Data_In --
+   -------------
+
+   procedure Data_In
+     (Item : out Stream_Element_Array;
+      Last : out Stream_Element_Offset) is
+   begin
+      Read (File_In, Item, Last);
+   end Data_In;
+
+   --------------
+   -- Data_Out --
+   --------------
+
+   procedure Data_Out (Item : in Stream_Element_Array) is
+   begin
+      Write (File_Out, Item);
+   end Data_Out;
+
+   -------------------
+   -- Generate_File --
+   -------------------
+
+   procedure Generate_File is
+      subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
+
+      package Random_Elements is
+         new Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+      Gen    : Random_Elements.Generator;
+      Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
+
+      Buffer_Count : constant Count := File_Size / Buffer'Length;
+      --  Number of same buffers in the packet.
+
+      Density : constant Count := 30; --  from 0 to Buffer'Length - 2;
+
+      procedure Fill_Buffer (J, D : in Count);
+      --  Change the part of the buffer.
+
+      -----------------
+      -- Fill_Buffer --
+      -----------------
+
+      procedure Fill_Buffer (J, D : in Count) is
+      begin
+         for K in 0 .. D loop
+            Buffer
+              (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
+             := Random_Elements.Random (Gen);
+
+         end loop;
+      end Fill_Buffer;
+
+   begin
+      Random_Elements.Reset (Gen, Init_Random);
+
+      Create (File_In, Out_File, In_File_Name);
+
+      Fill_Buffer (1, Buffer'Length - 2);
+
+      for J in 1 .. Buffer_Count loop
+         Write (File_In, Buffer);
+
+         Fill_Buffer (J, Density);
+      end loop;
+
+      --  fill remain size.
+
+      Write
+        (File_In,
+         Buffer
+           (1 .. Stream_Element_Offset
+                   (File_Size - Buffer'Length * Buffer_Count)));
+
+      Flush (File_In);
+      Close (File_In);
+   end Generate_File;
+
+   ---------------------
+   -- Print_Statistic --
+   ---------------------
+
+   procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
+      use Ada.Calendar;
+      use Ada.Text_IO;
+
+      package Count_IO is new Integer_IO (ZLib.Count);
+
+      Curr_Dur : Duration := Clock - Time_Stamp;
+   begin
+      Put (Msg);
+
+      Set_Col (20);
+      Ada.Text_IO.Put ("size =");
+
+      Count_IO.Put
+        (Data_Size,
+         Width => Stream_IO.Count'Image (File_Size)'Length);
+
+      Put_Line (" duration =" & Duration'Image (Curr_Dur));
+   end Print_Statistic;
+
+   -----------
+   -- Stamp --
+   -----------
+
+   procedure Stamp is
+   begin
+      Time_Stamp := Ada.Calendar.Clock;
+   end Stamp;
+
+begin
+   Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
+
+   loop
+      Generate_File;
+
+      for Level in ZLib.Compression_Level'Range loop
+
+         Ada.Text_IO.Put_Line ("Level ="
+            & ZLib.Compression_Level'Image (Level));
+
+         --  Test generic interface.
+         Open   (File_In, In_File, In_File_Name);
+         Create (File_Out, Out_File, Z_File_Name);
+
+         Stamp;
+
+         --  Deflate using generic instantiation.
+
+         ZLib.Deflate_Init
+               (Filter   => Filter,
+                Level    => Level,
+                Strategy => Strategy,
+                Header   => Header);
+
+         Translate (Filter);
+         Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
+         ZLib.Close (Filter);
+
+         Close (File_In);
+         Close (File_Out);
+
+         Open   (File_In, In_File, Z_File_Name);
+         Create (File_Out, Out_File, Out_File_Name);
+
+         Stamp;
+
+         --  Inflate using generic instantiation.
+
+         ZLib.Inflate_Init (Filter, Header => Header);
+
+         Translate (Filter);
+         Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
+
+         ZLib.Close (Filter);
+
+         Close (File_In);
+         Close (File_Out);
+
+         Compare_Files (In_File_Name, Out_File_Name);
+
+         --  Test stream interface.
+
+         --  Compress to the back stream.
+
+         Open   (File_In, In_File, In_File_Name);
+         Create (File_Back, Out_File, Z_File_Name);
+
+         Stamp;
+
+         ZLib.Streams.Create
+           (Stream          => File_Z,
+            Mode            => ZLib.Streams.Out_Stream,
+            Back            => ZLib.Streams.Stream_Access
+                                 (Stream (File_Back)),
+            Back_Compressed => True,
+            Level           => Level,
+            Strategy        => Strategy,
+            Header          => Header);
+
+         Copy_Streams
+           (Source => Stream (File_In).all,
+            Target => File_Z);
+
+         --  Flushing internal buffers to the back stream.
+
+         ZLib.Streams.Flush (File_Z, ZLib.Finish);
+
+         Print_Statistic ("Write compress",
+                          ZLib.Streams.Write_Total_Out (File_Z));
+
+         ZLib.Streams.Close (File_Z);
+
+         Close (File_In);
+         Close (File_Back);
+
+         --  Compare reading from original file and from
+         --  decompression stream.
+
+         Open (File_In,   In_File, In_File_Name);
+         Open (File_Back, In_File, Z_File_Name);
+
+         ZLib.Streams.Create
+           (Stream          => File_Z,
+            Mode            => ZLib.Streams.In_Stream,
+            Back            => ZLib.Streams.Stream_Access
+                                 (Stream (File_Back)),
+            Back_Compressed => True,
+            Header          => Header);
+
+         Stamp;
+         Compare_Streams (Stream (File_In).all, File_Z);
+
+         Print_Statistic ("Read decompress",
+                          ZLib.Streams.Read_Total_Out (File_Z));
+
+         ZLib.Streams.Close (File_Z);
+         Close (File_In);
+         Close (File_Back);
+
+         --  Compress by reading from compression stream.
+
+         Open (File_Back, In_File, In_File_Name);
+         Create (File_Out, Out_File, Z_File_Name);
+
+         ZLib.Streams.Create
+           (Stream          => File_Z,
+            Mode            => ZLib.Streams.In_Stream,
+            Back            => ZLib.Streams.Stream_Access
+                                 (Stream (File_Back)),
+            Back_Compressed => False,
+            Level           => Level,
+            Strategy        => Strategy,
+            Header          => Header);
+
+         Stamp;
+         Copy_Streams
+           (Source => File_Z,
+            Target => Stream (File_Out).all);
+
+         Print_Statistic ("Read compress",
+                          ZLib.Streams.Read_Total_Out (File_Z));
+
+         ZLib.Streams.Close (File_Z);
+
+         Close (File_Out);
+         Close (File_Back);
+
+         --  Decompress to decompression stream.
+
+         Open   (File_In,   In_File, Z_File_Name);
+         Create (File_Back, Out_File, Out_File_Name);
+
+         ZLib.Streams.Create
+           (Stream          => File_Z,
+            Mode            => ZLib.Streams.Out_Stream,
+            Back            => ZLib.Streams.Stream_Access
+                                 (Stream (File_Back)),
+            Back_Compressed => False,
+            Header          => Header);
+
+         Stamp;
+
+         Copy_Streams
+           (Source => Stream (File_In).all,
+            Target => File_Z);
+
+         Print_Statistic ("Write decompress",
+                          ZLib.Streams.Write_Total_Out (File_Z));
+
+         ZLib.Streams.Close (File_Z);
+         Close (File_In);
+         Close (File_Back);
+
+         Compare_Files (In_File_Name, Out_File_Name);
+      end loop;
+
+      Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
+
+      exit when not Continuous;
+
+      File_Size := File_Size + 1;
+   end loop;
+end Test;
diff --git a/contrib/ada/zlib-streams.adb b/contrib/ada/zlib-streams.adb
new file mode 100644
index 0000000..d213b5c
--- /dev/null
+++ b/contrib/ada/zlib-streams.adb
@@ -0,0 +1,215 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: zlib-streams.adb,v 1.9 2003/08/12 13:15:31 vagul Exp $
+
+with Ada.Unchecked_Deallocation;
+
+package body ZLib.Streams is
+
+   -----------
+   -- Close --
+   -----------
+
+   procedure Close (Stream : in out Stream_Type) is
+      procedure Free is new Ada.Unchecked_Deallocation
+         (Stream_Element_Array, Buffer_Access);
+   begin
+      if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
+         --  We should flush the data written by the writer.
+
+         Flush (Stream, Finish);
+
+         Close (Stream.Writer);
+      end if;
+
+      if Stream.Mode = In_Stream or Stream.Mode = Duplex then
+         Close (Stream.Reader);
+         Free (Stream.Buffer);
+      end if;
+   end Close;
+
+   ------------
+   -- Create --
+   ------------
+
+   procedure Create
+     (Stream            :    out Stream_Type;
+      Mode              : in     Stream_Mode;
+      Back              : in     Stream_Access;
+      Back_Compressed   : in     Boolean;
+      Level             : in     Compression_Level := Default_Compression;
+      Strategy          : in     Strategy_Type     := Default_Strategy;
+      Header            : in     Header_Type       := Default;
+      Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
+                                    := Default_Buffer_Size;
+      Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
+                                    := Default_Buffer_Size)
+   is
+
+      subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
+
+      procedure Init_Filter
+         (Filter   : in out Filter_Type;
+          Compress : in     Boolean);
+
+      -----------------
+      -- Init_Filter --
+      -----------------
+
+      procedure Init_Filter
+         (Filter   : in out Filter_Type;
+          Compress : in     Boolean) is
+      begin
+         if Compress then
+            Deflate_Init
+              (Filter, Level, Strategy, Header => Header);
+         else
+            Inflate_Init (Filter, Header => Header);
+         end if;
+      end Init_Filter;
+
+   begin
+      Stream.Back := Back;
+      Stream.Mode := Mode;
+
+      if Mode = Out_Stream or Mode = Duplex then
+         Init_Filter (Stream.Writer, Back_Compressed);
+         Stream.Buffer_Size := Write_Buffer_Size;
+      else
+         Stream.Buffer_Size := 0;
+      end if;
+
+      if Mode = In_Stream or Mode = Duplex then
+         Init_Filter (Stream.Reader, not Back_Compressed);
+
+         Stream.Buffer     := new Buffer_Subtype;
+         Stream.Rest_First := Stream.Buffer'Last + 1;
+      end if;
+   end Create;
+
+   -----------
+   -- Flush --
+   -----------
+
+   procedure Flush
+     (Stream : in out Stream_Type;
+      Mode   : in     Flush_Mode := Sync_Flush)
+   is
+      Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
+      Last   : Stream_Element_Offset;
+   begin
+      loop
+         Flush (Stream.Writer, Buffer, Last, Mode);
+
+         Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
+
+         exit when Last < Buffer'Last;
+      end loop;
+   end Flush;
+
+   ----------
+   -- Read --
+   ----------
+
+   procedure Read
+     (Stream : in out Stream_Type;
+      Item   :    out Stream_Element_Array;
+      Last   :    out Stream_Element_Offset)
+   is
+
+      procedure Read
+        (Item : out Stream_Element_Array;
+         Last : out Stream_Element_Offset);
+
+      ----------
+      -- Read --
+      ----------
+
+      procedure Read
+        (Item : out Stream_Element_Array;
+         Last : out Stream_Element_Offset) is
+      begin
+         Ada.Streams.Read (Stream.Back.all, Item, Last);
+      end Read;
+
+      procedure Read is new ZLib.Read
+         (Read       => Read,
+          Buffer     => Stream.Buffer.all,
+          Rest_First => Stream.Rest_First,
+          Rest_Last  => Stream.Rest_Last);
+
+   begin
+      Read (Stream.Reader, Item, Last);
+   end Read;
+
+   -------------------
+   -- Read_Total_In --
+   -------------------
+
+   function Read_Total_In (Stream : in Stream_Type) return Count is
+   begin
+      return Total_In (Stream.Reader);
+   end Read_Total_In;
+
+   --------------------
+   -- Read_Total_Out --
+   --------------------
+
+   function Read_Total_Out (Stream : in Stream_Type) return Count is
+   begin
+      return Total_Out (Stream.Reader);
+   end Read_Total_Out;
+
+   -----------
+   -- Write --
+   -----------
+
+   procedure Write
+     (Stream : in out Stream_Type;
+      Item   : in     Stream_Element_Array)
+   is
+
+      procedure Write (Item : in Stream_Element_Array);
+
+      -----------
+      -- Write --
+      -----------
+
+      procedure Write (Item : in Stream_Element_Array) is
+      begin
+         Ada.Streams.Write (Stream.Back.all, Item);
+      end Write;
+
+      procedure Write is new ZLib.Write
+         (Write       => Write,
+          Buffer_Size => Stream.Buffer_Size);
+
+   begin
+      Write (Stream.Writer, Item, No_Flush);
+   end Write;
+
+   --------------------
+   -- Write_Total_In --
+   --------------------
+
+   function Write_Total_In (Stream : in Stream_Type) return Count is
+   begin
+      return Total_In (Stream.Writer);
+   end Write_Total_In;
+
+   ---------------------
+   -- Write_Total_Out --
+   ---------------------
+
+   function Write_Total_Out (Stream : in Stream_Type) return Count is
+   begin
+      return Total_Out (Stream.Writer);
+   end Write_Total_Out;
+
+end ZLib.Streams;
diff --git a/contrib/ada/zlib-streams.ads b/contrib/ada/zlib-streams.ads
new file mode 100644
index 0000000..1d5e904
--- /dev/null
+++ b/contrib/ada/zlib-streams.ads
@@ -0,0 +1,112 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: zlib-streams.ads,v 1.11 2003/08/12 13:15:31 vagul Exp $
+
+package ZLib.Streams is
+
+   type Stream_Mode is (In_Stream, Out_Stream, Duplex);
+
+   type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class;
+
+   type Stream_Type is
+      new Ada.Streams.Root_Stream_Type with private;
+
+   procedure Read
+     (Stream : in out Stream_Type;
+      Item   :    out Ada.Streams.Stream_Element_Array;
+      Last   :    out Ada.Streams.Stream_Element_Offset);
+
+   procedure Write
+     (Stream : in out Stream_Type;
+      Item   : in     Ada.Streams.Stream_Element_Array);
+
+   procedure Flush
+     (Stream : in out Stream_Type;
+      Mode   : in     Flush_Mode := Sync_Flush);
+   --  Flush the written data to the back stream,
+   --  all data placed to the compressor is flushing to the Back stream.
+   --  Should not be used untill necessary, becouse it is decreasing
+   --  compression.
+
+   function Read_Total_In (Stream : in Stream_Type) return Count;
+   pragma Inline (Read_Total_In);
+   --  Return total number of bytes read from back stream so far.
+
+   function Read_Total_Out (Stream : in Stream_Type) return Count;
+   pragma Inline (Read_Total_Out);
+   --  Return total number of bytes read so far.
+
+   function Write_Total_In (Stream : in Stream_Type) return Count;
+   pragma Inline (Write_Total_In);
+   --  Return total number of bytes written so far.
+
+   function Write_Total_Out (Stream : in Stream_Type) return Count;
+   pragma Inline (Write_Total_Out);
+   --  Return total number of bytes written to the back stream.
+
+   procedure Create
+     (Stream            :    out Stream_Type;
+      Mode              : in     Stream_Mode;
+      Back              : in     Stream_Access;
+      Back_Compressed   : in     Boolean;
+      Level             : in     Compression_Level := Default_Compression;
+      Strategy          : in     Strategy_Type     := Default_Strategy;
+      Header            : in     Header_Type       := Default;
+      Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
+                                    := Default_Buffer_Size;
+      Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
+                                    := Default_Buffer_Size);
+   --  Create the Comression/Decompression stream.
+   --  If mode is In_Stream then Write operation is disabled.
+   --  If mode is Out_Stream then Read operation is disabled.
+
+   --  If Back_Compressed is true then
+   --  Data written to the Stream is compressing to the Back stream
+   --  and data read from the Stream is decompressed data from the Back stream.
+
+   --  If Back_Compressed is false then
+   --  Data written to the Stream is decompressing to the Back stream
+   --  and data read from the Stream is compressed data from the Back stream.
+
+   --  !!! When the Need_Header is False ZLib-Ada is using undocumented
+   --  ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
+
+   procedure Close (Stream : in out Stream_Type);
+
+private
+
+   use Ada.Streams;
+
+   type Buffer_Access is access all Stream_Element_Array;
+
+   type Stream_Type
+     is new Root_Stream_Type with
+   record
+      Mode       : Stream_Mode;
+
+      Buffer     : Buffer_Access;
+      Rest_First : Stream_Element_Offset;
+      Rest_Last  : Stream_Element_Offset;
+      --  Buffer for Read operation.
+      --  We need to have this buffer in the record
+      --  becouse not all read data from back stream
+      --  could be processed during the read operation.
+
+      Buffer_Size : Stream_Element_Offset;
+      --  Buffer size for write operation.
+      --  We do not need to have this buffer
+      --  in the record becouse all data could be
+      --  processed in the write operation.
+
+      Back       : Stream_Access;
+      Reader     : Filter_Type;
+      Writer     : Filter_Type;
+   end record;
+
+end ZLib.Streams;
diff --git a/contrib/ada/zlib-thin.adb b/contrib/ada/zlib-thin.adb
new file mode 100644
index 0000000..163bd5b
--- /dev/null
+++ b/contrib/ada/zlib-thin.adb
@@ -0,0 +1,185 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: zlib-thin.adb,v 1.6 2003/01/21 15:26:37 vagul Exp $
+
+package body ZLib.Thin is
+
+   ZLIB_VERSION : constant Chars_Ptr :=
+      Interfaces.C.Strings.New_String ("1.1.4");
+
+   Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
+
+   --------------
+   -- Avail_In --
+   --------------
+
+   function Avail_In (Strm : in Z_Stream) return UInt is
+   begin
+      return Strm.Avail_In;
+   end Avail_In;
+
+   ---------------
+   -- Avail_Out --
+   ---------------
+
+   function Avail_Out (Strm : in Z_Stream) return UInt is
+   begin
+      return Strm.Avail_Out;
+   end Avail_Out;
+
+   ------------------
+   -- Deflate_Init --
+   ------------------
+
+   function Deflate_Init
+     (strm  : in Z_Streamp;
+      level : in Int := Z_DEFAULT_COMPRESSION)
+      return  Int is
+   begin
+      return deflateInit (strm, level, ZLIB_VERSION, Z_Stream_Size);
+   end Deflate_Init;
+
+   function Deflate_Init
+     (strm       : Z_Streamp;
+      level      : Int;
+      method     : Int;
+      windowBits : Int;
+      memLevel   : Int;
+      strategy   : Int)
+      return       Int is
+   begin
+      return deflateInit2
+               (strm,
+                level,
+                method,
+                windowBits,
+                memLevel,
+                strategy,
+                ZLIB_VERSION,
+                Z_Stream_Size);
+   end Deflate_Init;
+
+   ------------------
+   -- Inflate_Init --
+   ------------------
+
+   function Inflate_Init (strm : Z_Streamp) return Int is
+   begin
+      return inflateInit (strm, ZLIB_VERSION, Z_Stream_Size);
+   end Inflate_Init;
+
+   function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is
+   begin
+      return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size);
+   end Inflate_Init;
+
+   function Last_Error_Message (Strm : in Z_Stream) return String is
+      use Interfaces.C.Strings;
+   begin
+      if Strm.msg = Null_Ptr then
+         return "";
+      else
+         return Value (Strm.msg);
+      end if;
+   end Last_Error_Message;
+
+   -------------
+   -- Need_In --
+   -------------
+
+   function Need_In (strm : Z_Stream) return Boolean is
+   begin
+      return strm.Avail_In = 0;
+   end Need_In;
+
+   --------------
+   -- Need_Out --
+   --------------
+
+   function Need_Out (strm : Z_Stream) return Boolean is
+   begin
+      return strm.Avail_Out = 0;
+   end Need_Out;
+
+   ------------
+   -- Set_In --
+   ------------
+
+   procedure Set_In
+     (Strm   : in out Z_Stream;
+      Buffer : in Byte_Access;
+      Size   : in UInt) is
+   begin
+      Strm.Next_In  := Buffer;
+      Strm.Avail_In := Size;
+   end Set_In;
+
+   procedure Set_In
+     (Strm   : in out Z_Stream;
+      Buffer : in Voidp;
+      Size   : in UInt) is
+   begin
+      Set_In (Strm, Bytes.To_Pointer (Buffer), Size);
+   end Set_In;
+
+   ------------------
+   -- Set_Mem_Func --
+   ------------------
+
+   procedure Set_Mem_Func
+     (Strm   : in out Z_Stream;
+      Opaque : in Voidp;
+      Alloc  : in alloc_func;
+      Free   : in free_func) is
+   begin
+      Strm.opaque := Opaque;
+      Strm.zalloc := Alloc;
+      Strm.zfree  := Free;
+   end Set_Mem_Func;
+
+   -------------
+   -- Set_Out --
+   -------------
+
+   procedure Set_Out
+     (Strm   : in out Z_Stream;
+      Buffer : in Byte_Access;
+      Size   : in UInt) is
+   begin
+      Strm.Next_Out  := Buffer;
+      Strm.Avail_Out := Size;
+   end Set_Out;
+
+   procedure Set_Out
+     (Strm   : in out Z_Stream;
+      Buffer : in Voidp;
+      Size   : in UInt) is
+   begin
+      Set_Out (Strm, Bytes.To_Pointer (Buffer), Size);
+   end Set_Out;
+
+   --------------
+   -- Total_In --
+   --------------
+
+   function Total_In (Strm : in Z_Stream) return ULong is
+   begin
+      return Strm.Total_In;
+   end Total_In;
+
+   ---------------
+   -- Total_Out --
+   ---------------
+
+   function Total_Out (Strm : in Z_Stream) return ULong is
+   begin
+      return Strm.Total_Out;
+   end Total_Out;
+
+end ZLib.Thin;
diff --git a/contrib/ada/zlib-thin.ads b/contrib/ada/zlib-thin.ads
new file mode 100644
index 0000000..19cbb96
--- /dev/null
+++ b/contrib/ada/zlib-thin.ads
@@ -0,0 +1,478 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: zlib-thin.ads,v 1.8 2003/08/12 13:16:51 vagul Exp $
+
+with Interfaces.C.Strings;
+with System.Address_To_Access_Conversions;
+
+private package ZLib.Thin is
+
+   --  From zconf.h
+
+   MAX_MEM_LEVEL : constant := 9;         --  zconf.h:105
+                                          --  zconf.h:105
+   MAX_WBITS : constant := 15;      --  zconf.h:115
+                                    --  32K LZ77 window
+                                    --  zconf.h:115
+   SEEK_SET : constant := 8#0000#;  --  zconf.h:244
+                                    --  Seek from beginning of file.
+                                    --  zconf.h:244
+   SEEK_CUR : constant := 1;        --  zconf.h:245
+                                    --  Seek from current position.
+                                    --  zconf.h:245
+   SEEK_END : constant := 2;        --  zconf.h:246
+                                    --  Set file pointer to EOF plus "offset"
+                                    --  zconf.h:246
+
+   type Byte is new Interfaces.C.unsigned_char; --  8 bits
+                                                --  zconf.h:214
+   type UInt is new Interfaces.C.unsigned;      --  16 bits or more
+                                                --  zconf.h:216
+   type Int is new Interfaces.C.int;
+
+   type ULong is new Interfaces.C.unsigned;     --  32 bits or more
+                                                --  zconf.h:217
+   subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr;
+
+   type ULong_Access is access ULong;
+   type Int_Access is access Int;
+   subtype Voidp is System.Address;            --  zconf.h:232
+
+   package Bytes is new System.Address_To_Access_Conversions (Byte);
+
+   subtype Byte_Access is Bytes.Object_Pointer;
+
+   --  end from zconf
+
+   Z_NO_FLUSH : constant := 8#0000#;   --  zlib.h:125
+                                       --  zlib.h:125
+   Z_PARTIAL_FLUSH : constant := 1;       --  zlib.h:126
+                                          --  will be removed, use
+                                          --  Z_SYNC_FLUSH instead
+                                          --  zlib.h:126
+   Z_SYNC_FLUSH : constant := 2;       --  zlib.h:127
+                                       --  zlib.h:127
+   Z_FULL_FLUSH : constant := 3;       --  zlib.h:128
+                                       --  zlib.h:128
+   Z_FINISH : constant := 4;        --  zlib.h:129
+                                    --  zlib.h:129
+   Z_OK : constant := 8#0000#;   --  zlib.h:132
+                                 --  zlib.h:132
+   Z_STREAM_END : constant := 1;       --  zlib.h:133
+                                       --  zlib.h:133
+   Z_NEED_DICT : constant := 2;        --  zlib.h:134
+                                       --  zlib.h:134
+   Z_ERRNO : constant := -1;        --  zlib.h:135
+                                    --  zlib.h:135
+   Z_STREAM_ERROR : constant := -2;       --  zlib.h:136
+                                          --  zlib.h:136
+   Z_DATA_ERROR : constant := -3;      --  zlib.h:137
+                                       --  zlib.h:137
+   Z_MEM_ERROR : constant := -4;       --  zlib.h:138
+                                       --  zlib.h:138
+   Z_BUF_ERROR : constant := -5;       --  zlib.h:139
+                                       --  zlib.h:139
+   Z_VERSION_ERROR : constant := -6;      --  zlib.h:140
+                                          --  zlib.h:140
+   Z_NO_COMPRESSION : constant := 8#0000#;   --  zlib.h:145
+                                             --  zlib.h:145
+   Z_BEST_SPEED : constant := 1;       --  zlib.h:146
+                                       --  zlib.h:146
+   Z_BEST_COMPRESSION : constant := 9;       --  zlib.h:147
+                                             --  zlib.h:147
+   Z_DEFAULT_COMPRESSION : constant := -1;      --  zlib.h:148
+                                                --  zlib.h:148
+   Z_FILTERED : constant := 1;      --  zlib.h:151
+                                    --  zlib.h:151
+   Z_HUFFMAN_ONLY : constant := 2;        --  zlib.h:152
+                                          --  zlib.h:152
+   Z_DEFAULT_STRATEGY : constant := 8#0000#; --  zlib.h:153
+                                             --  zlib.h:153
+   Z_BINARY : constant := 8#0000#;  --  zlib.h:156
+                                    --  zlib.h:156
+   Z_ASCII : constant := 1;      --  zlib.h:157
+                                 --  zlib.h:157
+   Z_UNKNOWN : constant := 2;       --  zlib.h:158
+                                    --  zlib.h:158
+   Z_DEFLATED : constant := 8;      --  zlib.h:161
+                                    --  zlib.h:161
+   Z_NULL : constant := 8#0000#; --  zlib.h:164
+                                 --  for initializing zalloc, zfree, opaque
+                                 --  zlib.h:164
+   type gzFile is new Voidp;                  --  zlib.h:646
+
+   type Z_Stream is private;
+
+   type Z_Streamp is access all Z_Stream;     --  zlib.h:89
+
+   type alloc_func is access function
+     (Opaque : Voidp;
+      Items  : UInt;
+      Size   : UInt)
+      return Voidp; --  zlib.h:63
+
+   type free_func is access procedure (opaque : Voidp; address : Voidp);
+
+   function zlibVersion return Chars_Ptr;
+
+   function Deflate (strm : Z_Streamp; flush : Int) return Int;
+
+   function DeflateEnd (strm : Z_Streamp) return Int;
+
+   function Inflate (strm : Z_Streamp; flush : Int) return Int;
+
+   function InflateEnd (strm : Z_Streamp) return Int;
+
+   function deflateSetDictionary
+     (strm       : Z_Streamp;
+      dictionary : Byte_Access;
+      dictLength : UInt)
+      return       Int;
+
+   function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int;
+   --  zlib.h:478
+
+   function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495
+
+   function deflateParams
+     (strm     : Z_Streamp;
+      level    : Int;
+      strategy : Int)
+      return     Int;       -- zlib.h:506
+
+   function inflateSetDictionary
+     (strm       : Z_Streamp;
+      dictionary : Byte_Access;
+      dictLength : UInt)
+      return       Int; --  zlib.h:548
+
+   function inflateSync (strm : Z_Streamp) return Int;  --  zlib.h:565
+
+   function inflateReset (strm : Z_Streamp) return Int; --  zlib.h:580
+
+   function compress
+     (dest      : Byte_Access;
+      destLen   : ULong_Access;
+      source    : Byte_Access;
+      sourceLen : ULong)
+      return      Int;           -- zlib.h:601
+
+   function compress2
+     (dest      : Byte_Access;
+      destLen   : ULong_Access;
+      source    : Byte_Access;
+      sourceLen : ULong;
+      level     : Int)
+      return      Int;          -- zlib.h:615
+
+   function uncompress
+     (dest      : Byte_Access;
+      destLen   : ULong_Access;
+      source    : Byte_Access;
+      sourceLen : ULong)
+      return      Int;
+
+   function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile;
+
+   function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile;
+
+   function gzsetparams
+     (file     : gzFile;
+      level    : Int;
+      strategy : Int)
+      return     Int;
+
+   function gzread
+     (file : gzFile;
+      buf  : Voidp;
+      len  : UInt)
+      return Int;
+
+   function gzwrite
+     (file : in gzFile;
+      buf  : in Voidp;
+      len  : in UInt)
+      return Int;
+
+   function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int;
+
+   function gzputs (file : in gzFile; s : in Chars_Ptr) return Int;
+
+   function gzgets
+     (file : gzFile;
+      buf  : Chars_Ptr;
+      len  : Int)
+      return Chars_Ptr;
+
+   function gzputc (file : gzFile; char : Int) return Int;
+
+   function gzgetc (file : gzFile) return Int;
+
+   function gzflush (file : gzFile; flush : Int) return Int;
+
+   function gzseek
+     (file   : gzFile;
+      offset : Int;
+      whence : Int)
+      return   Int;
+
+   function gzrewind (file : gzFile) return Int;
+
+   function gztell (file : gzFile) return Int;
+
+   function gzeof (file : gzFile) return Int;
+
+   function gzclose (file : gzFile) return Int;
+
+   function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr;
+
+   function adler32
+     (adler : ULong;
+      buf   : Byte_Access;
+      len   : UInt)
+      return  ULong;
+
+   function crc32
+     (crc  : ULong;
+      buf  : Byte_Access;
+      len  : UInt)
+      return ULong;
+
+   function deflateInit
+     (strm        : Z_Streamp;
+      level       : Int;
+      version     : Chars_Ptr;
+      stream_size : Int)
+      return        Int;
+
+   function Deflate_Init
+     (strm  : in Z_Streamp;
+      level : in Int := Z_DEFAULT_COMPRESSION)
+      return  Int;
+   pragma Inline (Deflate_Init);
+
+   function deflateInit2
+     (strm        : Z_Streamp;
+      level       : Int;
+      method      : Int;
+      windowBits  : Int;
+      memLevel    : Int;
+      strategy    : Int;
+      version     : Chars_Ptr;
+      stream_size : Int)
+      return        Int;
+
+   function Deflate_Init
+     (strm       : Z_Streamp;
+      level      : Int;
+      method     : Int;
+      windowBits : Int;
+      memLevel   : Int;
+      strategy   : Int)
+      return       Int;
+   pragma Inline (Deflate_Init);
+
+   function inflateInit
+     (strm        : Z_Streamp;
+      version     : Chars_Ptr;
+      stream_size : Int)
+      return        Int;
+
+   function Inflate_Init (strm : Z_Streamp) return Int;
+   pragma Inline (Inflate_Init);
+
+   function inflateInit2
+     (strm        : in Z_Streamp;
+      windowBits  : in Int;
+      version     : in Chars_Ptr;
+      stream_size : in Int)
+      return      Int;
+
+   function inflateBackInit
+     (strm        : in Z_Streamp;
+      windowBits  : in Int;
+      window      : in Byte_Access;
+      version     : in Chars_Ptr;
+      stream_size : in Int)
+      return      Int;
+   --  Size of window have to be 2**windowBits.
+
+   function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int;
+   pragma Inline (Inflate_Init);
+
+   function zError (err : Int) return Chars_Ptr;
+
+   function inflateSyncPoint (z : Z_Streamp) return Int;
+
+   function get_crc_table return ULong_Access;
+
+   --  Interface to the available fields of the z_stream structure.
+   --  The application must update next_in and avail_in when avail_in has
+   --  dropped to zero. It must update next_out and avail_out when avail_out
+   --  has dropped to zero. The application must initialize zalloc, zfree and
+   --  opaque before calling the init function.
+
+   function Need_In (strm : in Z_Stream) return Boolean;
+   --  return true when we do not need to setup Next_In and Avail_In fields.
+   pragma Inline (Need_In);
+
+   function Need_Out (strm : in Z_Stream) return Boolean;
+   --  return true when we do not need to setup Next_Out and Avail_Out field.
+   pragma Inline (Need_Out);
+
+   procedure Set_In
+     (Strm   : in out Z_Stream;
+      Buffer : in Byte_Access;
+      Size   : in UInt);
+   pragma Inline (Set_In);
+
+   procedure Set_In
+     (Strm   : in out Z_Stream;
+      Buffer : in Voidp;
+      Size   : in UInt);
+   pragma Inline (Set_In);
+
+   procedure Set_Out
+     (Strm   : in out Z_Stream;
+      Buffer : in Byte_Access;
+      Size   : in UInt);
+   pragma Inline (Set_Out);
+
+   procedure Set_Out
+     (Strm   : in out Z_Stream;
+      Buffer : in Voidp;
+      Size   : in UInt);
+   pragma Inline (Set_Out);
+
+   procedure Set_Mem_Func
+     (Strm   : in out Z_Stream;
+      Opaque : in Voidp;
+      Alloc  : in alloc_func;
+      Free   : in free_func);
+   pragma Inline (Set_Mem_Func);
+
+   function Last_Error_Message (Strm : in Z_Stream) return String;
+   pragma Inline (Last_Error_Message);
+
+   function Avail_Out (Strm : in Z_Stream) return UInt;
+   pragma Inline (Avail_Out);
+
+   function Avail_In (Strm : in Z_Stream) return UInt;
+   pragma Inline (Avail_In);
+
+   function Total_In (Strm : in Z_Stream) return ULong;
+   pragma Inline (Total_In);
+
+   function Total_Out (Strm : in Z_Stream) return ULong;
+   pragma Inline (Total_Out);
+
+   function inflateCopy
+     (dest   : in Z_Streamp;
+      Source : in Z_Streamp)
+      return Int;
+
+   function compressBound (Source_Len : in ULong) return ULong;
+
+   function deflateBound
+     (Strm       : in Z_Streamp;
+      Source_Len : in ULong)
+      return     ULong;
+
+   function gzungetc (C : in Int; File : in  gzFile) return Int;
+
+   function zlibCompileFlags return ULong;
+
+private
+
+   type Z_Stream is record            -- zlib.h:68
+      Next_In   : Byte_Access;        -- next input byte
+      Avail_In  : UInt       := 0;    -- number of bytes available at next_in
+      Total_In  : ULong      := 0;    -- total nb of input bytes read so far
+      Next_Out  : Byte_Access;        -- next output byte should be put there
+      Avail_Out : UInt       := 0;    -- remaining free space at next_out
+      Total_Out : ULong      := 0;    -- total nb of bytes output so far
+      msg       : Chars_Ptr;          -- last error message, NULL if no error
+      state     : Voidp;              -- not visible by applications
+      zalloc    : alloc_func := null; -- used to allocate the internal state
+      zfree     : free_func  := null; -- used to free the internal state
+      opaque    : Voidp;              -- private data object passed to
+                                      --  zalloc and zfree
+      data_type : Int;                -- best guess about the data type:
+                                      --  ascii or binary
+      adler     : ULong;              -- adler32 value of the uncompressed
+                                      --  data
+      reserved  : ULong;              -- reserved for future use
+   end record;
+
+   pragma Convention (C, Z_Stream);
+
+   pragma Import (C, zlibVersion, "zlibVersion");
+   pragma Import (C, Deflate, "deflate");
+   pragma Import (C, DeflateEnd, "deflateEnd");
+   pragma Import (C, Inflate, "inflate");
+   pragma Import (C, InflateEnd, "inflateEnd");
+   pragma Import (C, deflateSetDictionary, "deflateSetDictionary");
+   pragma Import (C, deflateCopy, "deflateCopy");
+   pragma Import (C, deflateReset, "deflateReset");
+   pragma Import (C, deflateParams, "deflateParams");
+   pragma Import (C, inflateSetDictionary, "inflateSetDictionary");
+   pragma Import (C, inflateSync, "inflateSync");
+   pragma Import (C, inflateReset, "inflateReset");
+   pragma Import (C, compress, "compress");
+   pragma Import (C, compress2, "compress2");
+   pragma Import (C, uncompress, "uncompress");
+   pragma Import (C, gzopen, "gzopen");
+   pragma Import (C, gzdopen, "gzdopen");
+   pragma Import (C, gzsetparams, "gzsetparams");
+   pragma Import (C, gzread, "gzread");
+   pragma Import (C, gzwrite, "gzwrite");
+   pragma Import (C, gzprintf, "gzprintf");
+   pragma Import (C, gzputs, "gzputs");
+   pragma Import (C, gzgets, "gzgets");
+   pragma Import (C, gzputc, "gzputc");
+   pragma Import (C, gzgetc, "gzgetc");
+   pragma Import (C, gzflush, "gzflush");
+   pragma Import (C, gzseek, "gzseek");
+   pragma Import (C, gzrewind, "gzrewind");
+   pragma Import (C, gztell, "gztell");
+   pragma Import (C, gzeof, "gzeof");
+   pragma Import (C, gzclose, "gzclose");
+   pragma Import (C, gzerror, "gzerror");
+   pragma Import (C, adler32, "adler32");
+   pragma Import (C, crc32, "crc32");
+   pragma Import (C, deflateInit, "deflateInit_");
+   pragma Import (C, inflateInit, "inflateInit_");
+   pragma Import (C, deflateInit2, "deflateInit2_");
+   pragma Import (C, inflateInit2, "inflateInit2_");
+   pragma Import (C, zError, "zError");
+   pragma Import (C, inflateSyncPoint, "inflateSyncPoint");
+   pragma Import (C, get_crc_table, "get_crc_table");
+
+   --  since zlib 1.2.0:
+
+   pragma Import (C, inflateCopy, "inflateCopy");
+   pragma Import (C, compressBound, "compressBound");
+   pragma Import (C, deflateBound, "deflateBound");
+   pragma Import (C, gzungetc, "gzungetc");
+   pragma Import (C, zlibCompileFlags, "zlibCompileFlags");
+
+   pragma Import (C, inflateBackInit, "inflateBackInit_");
+
+   --  I stopped binding the inflateBack routines, becouse realize that
+   --  it does not support zlib and gzip headers for now, and have no
+   --  symmetric deflateBack routines.
+   --  ZLib-Ada is symmetric regarding deflate/inflate data transformation
+   --  and has a similar generic callback interface for the
+   --  deflate/inflate transformation based on the regular Deflate/Inflate
+   --  routines.
+
+   --  pragma Import (C, inflateBack, "inflateBack");
+   --  pragma Import (C, inflateBackEnd, "inflateBackEnd");
+
+end ZLib.Thin;
diff --git a/contrib/ada/zlib.adb b/contrib/ada/zlib.adb
new file mode 100644
index 0000000..93bf885
--- /dev/null
+++ b/contrib/ada/zlib.adb
@@ -0,0 +1,674 @@
+----------------------------------------------------------------
+--  ZLib for Ada thick binding.                               --
+--                                                            --
+--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
+--                                                            --
+--  Open source license information is in the zlib.ads file.  --
+----------------------------------------------------------------
+
+--  $Id: zlib.adb,v 1.19 2003/07/13 16:02:19 vagul Exp $
+
+with Ada.Exceptions;
+with Ada.Unchecked_Conversion;
+with Ada.Unchecked_Deallocation;
+
+with Interfaces.C.Strings;
+
+with ZLib.Thin;
+
+package body ZLib is
+
+   use type Thin.Int;
+
+   type Z_Stream is new Thin.Z_Stream;
+
+   type Return_Code_Enum is
+      (OK,
+       STREAM_END,
+       NEED_DICT,
+       ERRNO,
+       STREAM_ERROR,
+       DATA_ERROR,
+       MEM_ERROR,
+       BUF_ERROR,
+       VERSION_ERROR);
+
+   type Flate_Step_Function is access
+     function (Strm : Thin.Z_Streamp; flush : Thin.Int) return Thin.Int;
+   pragma Convention (C, Flate_Step_Function);
+
+   type Flate_End_Function is access
+      function (Ctrm : in Thin.Z_Streamp) return Thin.Int;
+   pragma Convention (C, Flate_End_Function);
+
+   type Flate_Type is record
+      Step : Flate_Step_Function;
+      Done : Flate_End_Function;
+   end record;
+
+   subtype Footer_Array is Stream_Element_Array (1 .. 8);
+
+   Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)
+     := (16#1f#, 16#8b#,                 --  Magic header
+         16#08#,                         --  Z_DEFLATED
+         16#00#,                         --  Flags
+         16#00#, 16#00#, 16#00#, 16#00#, --  Time
+         16#00#,                         --  XFlags
+         16#03#                          --  OS code
+        );
+   --  The simplest gzip header is not for informational, but just for
+   --  gzip format compatibility.
+   --  Note that some code below is using assumption
+   --  Simple_GZip_Header'Last > Footer_Array'Last, so do not make
+   --  Simple_GZip_Header'Last <= Footer_Array'Last.
+
+   Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum
+     := (0 => OK,
+         1 => STREAM_END,
+         2 => NEED_DICT,
+        -1 => ERRNO,
+        -2 => STREAM_ERROR,
+        -3 => DATA_ERROR,
+        -4 => MEM_ERROR,
+        -5 => BUF_ERROR,
+        -6 => VERSION_ERROR);
+
+   Flate : constant array (Boolean) of Flate_Type
+     := (True  => (Step => Thin.Deflate'Access,
+                   Done => Thin.DeflateEnd'Access),
+         False => (Step => Thin.Inflate'Access,
+                   Done => Thin.InflateEnd'Access));
+
+   Flush_Finish : constant array (Boolean) of Flush_Mode
+     := (True => Finish, False => No_Flush);
+
+   procedure Raise_Error (Stream : Z_Stream);
+   pragma Inline (Raise_Error);
+
+   procedure Raise_Error (Message : String);
+   pragma Inline (Raise_Error);
+
+   procedure Check_Error (Stream : Z_Stream; Code : Thin.Int);
+
+   procedure Free is new Ada.Unchecked_Deallocation
+      (Z_Stream, Z_Stream_Access);
+
+   function To_Thin_Access is new Ada.Unchecked_Conversion
+     (Z_Stream_Access, Thin.Z_Streamp);
+
+   procedure Translate_GZip
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode);
+   --  Separate translate routine for make gzip header.
+
+   procedure Translate_Auto
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode);
+   --  translate routine without additional headers.
+
+   -----------------
+   -- Check_Error --
+   -----------------
+
+   procedure Check_Error (Stream : Z_Stream; Code : Thin.Int) is
+      use type Thin.Int;
+   begin
+      if Code /= Thin.Z_OK then
+         Raise_Error
+            (Return_Code_Enum'Image (Return_Code (Code))
+              & ": " & Last_Error_Message (Stream));
+      end if;
+   end Check_Error;
+
+   -----------
+   -- Close --
+   -----------
+
+   procedure Close
+     (Filter       : in out Filter_Type;
+      Ignore_Error : in     Boolean := False)
+   is
+      Code : Thin.Int;
+   begin
+      Code := Flate (Filter.Compression).Done
+          (To_Thin_Access (Filter.Strm));
+
+      Filter.Opened := False;
+
+      if Ignore_Error or else Code = Thin.Z_OK then
+         Free (Filter.Strm);
+      else
+         declare
+            Error_Message : constant String
+              := Last_Error_Message (Filter.Strm.all);
+         begin
+            Free (Filter.Strm);
+            Ada.Exceptions.Raise_Exception
+               (ZLib_Error'Identity,
+                Return_Code_Enum'Image (Return_Code (Code))
+                & ": " & Error_Message);
+         end;
+      end if;
+   end Close;
+
+   -----------
+   -- CRC32 --
+   -----------
+
+   function CRC32
+     (CRC  : in Unsigned_32;
+      Data : in Ada.Streams.Stream_Element_Array)
+      return Unsigned_32
+   is
+      use Thin;
+   begin
+      return Unsigned_32 (crc32
+        (ULong (CRC),
+         Bytes.To_Pointer (Data'Address),
+         Data'Length));
+   end CRC32;
+
+   procedure CRC32
+     (CRC  : in out Unsigned_32;
+      Data : in     Ada.Streams.Stream_Element_Array) is
+   begin
+      CRC := CRC32 (CRC, Data);
+   end CRC32;
+
+   ------------------
+   -- Deflate_Init --
+   ------------------
+
+   procedure Deflate_Init
+     (Filter       : in out Filter_Type;
+      Level        : in     Compression_Level  := Default_Compression;
+      Strategy     : in     Strategy_Type      := Default_Strategy;
+      Method       : in     Compression_Method := Deflated;
+      Window_Bits  : in     Window_Bits_Type   := 15;
+      Memory_Level : in     Memory_Level_Type  := 8;
+      Header       : in     Header_Type        := Default)
+   is
+      use type Thin.Int;
+      Win_Bits : Thin.Int := Thin.Int (Window_Bits);
+   begin
+      --  We allow ZLib to make header only in case of default header type.
+      --  Otherwise we would either do header by ourselfs, or do not do
+      --  header at all.
+
+      if Header = None or else Header = GZip then
+         Win_Bits := -Win_Bits;
+      end if;
+
+      --  For the GZip CRC calculation and make headers.
+
+      if Header = GZip then
+         Filter.CRC    := 0;
+         Filter.Offset := Simple_GZip_Header'First;
+      else
+         Filter.Offset := Simple_GZip_Header'Last + 1;
+      end if;
+
+      Filter.Strm := new Z_Stream;
+      Filter.Compression := True;
+      Filter.Stream_End  := False;
+      Filter.Opened      := True;
+      Filter.Header      := Header;
+
+      if Thin.Deflate_Init
+           (To_Thin_Access (Filter.Strm),
+            Level      => Thin.Int (Level),
+            method     => Thin.Int (Method),
+            windowBits => Win_Bits,
+            memLevel   => Thin.Int (Memory_Level),
+            strategy   => Thin.Int (Strategy)) /= Thin.Z_OK
+      then
+         Raise_Error (Filter.Strm.all);
+      end if;
+   end Deflate_Init;
+
+   -----------
+   -- Flush --
+   -----------
+
+   procedure Flush
+     (Filter    : in out Filter_Type;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode)
+   is
+      No_Data : Stream_Element_Array := (1 .. 0 => 0);
+      Last    : Stream_Element_Offset;
+   begin
+      Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);
+   end Flush;
+
+   -----------------------
+   -- Generic_Translate --
+   -----------------------
+
+   procedure Generic_Translate
+     (Filter : in out ZLib.Filter_Type;
+      In_Buffer_Size  : Integer := Default_Buffer_Size;
+      Out_Buffer_Size : Integer := Default_Buffer_Size)
+   is
+      In_Buffer : Stream_Element_Array
+         (1 .. Stream_Element_Offset (In_Buffer_Size));
+      Out_Buffer : Stream_Element_Array
+        (1 .. Stream_Element_Offset (Out_Buffer_Size));
+      Last : Stream_Element_Offset;
+      In_Last : Stream_Element_Offset;
+      In_First : Stream_Element_Offset;
+      Out_Last : Stream_Element_Offset;
+   begin
+      Main : loop
+         Data_In (In_Buffer, Last);
+
+         In_First := In_Buffer'First;
+
+         loop
+            Translate
+              (Filter,
+               In_Buffer (In_First .. Last),
+               In_Last,
+               Out_Buffer,
+               Out_Last,
+               Flush_Finish (Last < In_Buffer'First));
+
+            Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
+
+            exit Main when Stream_End (Filter);
+
+            --  The end of in buffer.
+            exit when In_Last = Last;
+
+            In_First := In_Last + 1;
+         end loop;
+      end loop Main;
+
+   end Generic_Translate;
+
+   ------------------
+   -- Inflate_Init --
+   ------------------
+
+   procedure Inflate_Init
+     (Filter      : in out Filter_Type;
+      Window_Bits : in     Window_Bits_Type := 15;
+      Header      : in     Header_Type      := Default)
+   is
+      use type Thin.Int;
+      Win_Bits : Thin.Int := Thin.Int (Window_Bits);
+
+      procedure Check_Version;
+      --  Check the latest header types compatibility.
+
+      procedure Check_Version is
+      begin
+         if Version <= "1.1.4" then
+            Raise_Error
+              ("Inflate header type " & Header_Type'Image (Header)
+               & " incompatible with ZLib version " & Version);
+         end if;
+      end Check_Version;
+
+   begin
+      case Header is
+         when None =>
+            Check_Version;
+
+            --  Inflate data without headers determined
+            --  by negative Win_Bits.
+
+            Win_Bits := -Win_Bits;
+         when GZip =>
+            Check_Version;
+
+            --  Inflate gzip data defined by flag 16.
+
+            Win_Bits := Win_Bits + 16;
+         when Auto =>
+            Check_Version;
+
+            --  Inflate with automatic detection
+            --  of gzip or native header defined by flag 32.
+
+            Win_Bits := Win_Bits + 32;
+         when Default => null;
+      end case;
+
+      Filter.Strm := new Z_Stream;
+      Filter.Compression := False;
+      Filter.Stream_End  := False;
+      Filter.Opened      := True;
+      Filter.Header      := Header;
+
+      if Thin.Inflate_Init
+         (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK
+      then
+         Raise_Error (Filter.Strm.all);
+      end if;
+   end Inflate_Init;
+
+   -----------------
+   -- Raise_Error --
+   -----------------
+
+   procedure Raise_Error (Message : String) is
+   begin
+      Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
+   end Raise_Error;
+
+   procedure Raise_Error (Stream : Z_Stream) is
+   begin
+      Raise_Error (Last_Error_Message (Stream));
+   end Raise_Error;
+
+   ----------
+   -- Read --
+   ----------
+
+   procedure Read
+     (Filter : in out Filter_Type;
+      Item   :    out Ada.Streams.Stream_Element_Array;
+      Last   :    out Ada.Streams.Stream_Element_Offset)
+   is
+      In_Last    : Stream_Element_Offset;
+      Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
+
+   begin
+      pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
+
+      loop
+         if Rest_First > Buffer'Last then
+            Read (Buffer, Rest_Last);
+            Rest_First := Buffer'First;
+         end if;
+
+         pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
+
+         Translate
+           (Filter   => Filter,
+            In_Data  => Buffer (Rest_First .. Rest_Last),
+            In_Last  => In_Last,
+            Out_Data => Item (Item_First .. Item'Last),
+            Out_Last => Last,
+            Flush    => Flush_Finish (Rest_Last < Rest_First));
+
+         Rest_First := In_Last + 1;
+
+         exit when Last = Item'Last or else Stream_End (Filter);
+
+         Item_First := Last + 1;
+      end loop;
+   end Read;
+
+   ----------------
+   -- Stream_End --
+   ----------------
+
+   function Stream_End (Filter : in Filter_Type) return Boolean is
+   begin
+      if Filter.Header = GZip and Filter.Compression then
+         return Filter.Stream_End
+            and then Filter.Offset = Footer_Array'Last + 1;
+      else
+         return Filter.Stream_End;
+      end if;
+   end Stream_End;
+
+   --------------
+   -- Total_In --
+   --------------
+
+   function Total_In (Filter : in Filter_Type) return Count is
+   begin
+      return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));
+   end Total_In;
+
+   ---------------
+   -- Total_Out --
+   ---------------
+
+   function Total_Out (Filter : in Filter_Type) return Count is
+   begin
+      return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));
+   end Total_Out;
+
+   ---------------
+   -- Translate --
+   ---------------
+
+   procedure Translate
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode) is
+   begin
+      if Filter.Header = GZip and then Filter.Compression then
+         Translate_GZip
+           (Filter   => Filter,
+            In_Data  => In_Data,
+            In_Last  => In_Last,
+            Out_Data => Out_Data,
+            Out_Last => Out_Last,
+            Flush    => Flush);
+      else
+         Translate_Auto
+           (Filter   => Filter,
+            In_Data  => In_Data,
+            In_Last  => In_Last,
+            Out_Data => Out_Data,
+            Out_Last => Out_Last,
+            Flush    => Flush);
+      end if;
+   end Translate;
+
+   --------------------
+   -- Translate_Auto --
+   --------------------
+
+   procedure Translate_Auto
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode)
+   is
+      use type Thin.Int;
+      Code : Thin.Int;
+
+   begin
+      if Filter.Opened = False then
+         raise ZLib_Error;
+      end if;
+
+      if Out_Data'Length = 0 then
+         raise Constraint_Error;
+      end if;
+
+      Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);
+      Set_In  (Filter.Strm.all, In_Data'Address, In_Data'Length);
+
+      Code := Flate (Filter.Compression).Step
+        (To_Thin_Access (Filter.Strm),
+         Thin.Int (Flush));
+
+      if Code = Thin.Z_STREAM_END then
+         Filter.Stream_End := True;
+      else
+         Check_Error (Filter.Strm.all, Code);
+      end if;
+
+      In_Last  := In_Data'Last
+         - Stream_Element_Offset (Avail_In (Filter.Strm.all));
+      Out_Last := Out_Data'Last
+         - Stream_Element_Offset (Avail_Out (Filter.Strm.all));
+
+   end Translate_Auto;
+
+   --------------------
+   -- Translate_GZip --
+   --------------------
+
+   procedure Translate_GZip
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode)
+   is
+      Out_First  : Stream_Element_Offset;
+
+      procedure Add_Data (Data : in Stream_Element_Array);
+      --  Add data to stream from the Filter.Offset till necessary,
+      --  used for add gzip headr/footer.
+
+      procedure Put_32
+        (Item : in out Stream_Element_Array;
+         Data : in     Unsigned_32);
+      pragma Inline (Put_32);
+
+      --------------
+      -- Add_Data --
+      --------------
+
+      procedure Add_Data (Data : in Stream_Element_Array) is
+         Data_First : Stream_Element_Offset renames Filter.Offset;
+         Data_Last  : Stream_Element_Offset;
+         Data_Len   : Stream_Element_Offset; --  -1
+         Out_Len    : Stream_Element_Offset; --  -1
+      begin
+         Out_First := Out_Last + 1;
+
+         if Data_First > Data'Last then
+            return;
+         end if;
+
+         Data_Len  := Data'Last     - Data_First;
+         Out_Len   := Out_Data'Last - Out_First;
+
+         if Data_Len <= Out_Len then
+            Out_Last  := Out_First  + Data_Len;
+            Data_Last := Data'Last;
+         else
+            Out_Last  := Out_Data'Last;
+            Data_Last := Data_First + Out_Len;
+         end if;
+
+         Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);
+
+         Data_First := Data_Last + 1;
+         Out_First  := Out_Last + 1;
+      end Add_Data;
+
+      ------------
+      -- Put_32 --
+      ------------
+
+      procedure Put_32
+        (Item : in out Stream_Element_Array;
+         Data : in     Unsigned_32)
+      is
+         D : Unsigned_32 := Data;
+      begin
+         for J in Item'First .. Item'First + 3 loop
+            Item (J) := Stream_Element (D and 16#FF#);
+            D := Shift_Right (D, 8);
+         end loop;
+      end Put_32;
+
+   begin
+      Out_Last := Out_Data'First - 1;
+
+      if not Filter.Stream_End then
+         Add_Data (Simple_GZip_Header);
+
+         Translate_Auto
+           (Filter => Filter,
+            In_Data  => In_Data,
+            In_Last  => In_Last,
+            Out_Data => Out_Data (Out_First .. Out_Data'Last),
+            Out_Last => Out_Last,
+            Flush    => Flush);
+
+         CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
+
+      end if;
+
+      if Filter.Stream_End and then Out_Last <= Out_Data'Last then
+         --  This detection method would work only when
+         --  Simple_GZip_Header'Last > Footer_Array'Last
+
+         if Filter.Offset = Simple_GZip_Header'Last + 1 then
+            Filter.Offset := Footer_Array'First;
+         end if;
+
+         declare
+            Footer : Footer_Array;
+         begin
+            Put_32 (Footer, Filter.CRC);
+            Put_32 (Footer (Footer'First + 4 .. Footer'Last),
+                    Unsigned_32 (Total_In (Filter)));
+            Add_Data (Footer);
+         end;
+      end if;
+   end Translate_GZip;
+
+   -------------
+   -- Version --
+   -------------
+
+   function Version return String is
+   begin
+      return Interfaces.C.Strings.Value (Thin.zlibVersion);
+   end Version;
+
+   -----------
+   -- Write --
+   -----------
+
+   procedure Write
+     (Filter : in out Filter_Type;
+      Item   : in     Ada.Streams.Stream_Element_Array;
+      Flush  : in     Flush_Mode)
+   is
+      Buffer : Stream_Element_Array (1 .. Buffer_Size);
+      In_Last, Out_Last : Stream_Element_Offset;
+      In_First : Stream_Element_Offset := Item'First;
+   begin
+      if Item'Length = 0 and Flush = No_Flush then
+         return;
+      end if;
+
+      loop
+         Translate
+           (Filter => Filter,
+            In_Data  => Item (In_First .. Item'Last),
+            In_Last  => In_Last,
+            Out_Data => Buffer,
+            Out_Last => Out_Last,
+            Flush    => Flush);
+
+         if Out_Last >= Buffer'First then
+            Write (Buffer (1 .. Out_Last));
+         end if;
+
+         exit when In_Last = Item'Last or Stream_End (Filter);
+
+         In_First := In_Last + 1;
+      end loop;
+   end Write;
+
+end ZLib;
diff --git a/contrib/ada/zlib.ads b/contrib/ada/zlib.ads
new file mode 100644
index 0000000..b72e4d2
--- /dev/null
+++ b/contrib/ada/zlib.ads
@@ -0,0 +1,311 @@
+------------------------------------------------------------------------------
+--                      ZLib for Ada thick binding.                         --
+--                                                                          --
+--              Copyright (C) 2002-2003 Dmitriy Anisimkov                   --
+--                                                                          --
+--  This library is free software; you can redistribute it and/or modify    --
+--  it under the terms of the GNU General Public License as published by    --
+--  the Free Software Foundation; either version 2 of the License, or (at   --
+--  your option) any later version.                                         --
+--                                                                          --
+--  This library is distributed in the hope that it will be useful, but     --
+--  WITHOUT ANY WARRANTY; without even the implied warranty of              --
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       --
+--  General Public License for more details.                                --
+--                                                                          --
+--  You should have received a copy of the GNU General Public License       --
+--  along with this library; if not, write to the Free Software Foundation, --
+--  Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.          --
+--                                                                          --
+--  As a special exception, if other files instantiate generics from this   --
+--  unit, or you link this unit with other files to produce an executable,  --
+--  this  unit  does not  by itself cause  the resulting executable to be   --
+--  covered by the GNU General Public License. This exception does not      --
+--  however invalidate any other reasons why the executable file  might be  --
+--  covered by the  GNU Public License.                                     --
+------------------------------------------------------------------------------
+
+--  $Id: zlib.ads,v 1.17 2003/08/12 13:19:07 vagul Exp $
+
+with Ada.Streams;
+
+with Interfaces;
+
+package ZLib is
+
+   ZLib_Error : exception;
+
+   type Compression_Level is new Integer range -1 .. 9;
+
+   type Flush_Mode is private;
+
+   type Compression_Method is private;
+
+   type Window_Bits_Type is new Integer range 8 .. 15;
+
+   type Memory_Level_Type is new Integer range 1 .. 9;
+
+   type Unsigned_32 is new Interfaces.Unsigned_32;
+
+   type Strategy_Type is private;
+
+   type Header_Type is (None, Auto, Default, GZip);
+   --  Header type usage have a some limitation for inflate.
+   --  See comment for Inflate_Init.
+
+   subtype Count is Ada.Streams.Stream_Element_Count;
+
+   ----------------------------------
+   -- Compression method constants --
+   ----------------------------------
+
+   Deflated : constant Compression_Method;
+   --  Only one method allowed in this ZLib version.
+
+   ---------------------------------
+   -- Compression level constants --
+   ---------------------------------
+
+   No_Compression      : constant Compression_Level := 0;
+   Best_Speed          : constant Compression_Level := 1;
+   Best_Compression    : constant Compression_Level := 9;
+   Default_Compression : constant Compression_Level := -1;
+
+   --------------------------
+   -- Flush mode constants --
+   --------------------------
+
+   No_Flush      : constant Flush_Mode;
+   --  Regular way for compression, no flush
+
+   Partial_Flush : constant Flush_Mode;
+   --  will be removed, use Z_SYNC_FLUSH instead
+
+   Sync_Flush    : constant Flush_Mode;
+   --  all pending output is flushed to the output buffer and the output
+   --  is aligned on a byte boundary, so that the decompressor can get all
+   --  input data available so far. (In particular avail_in is zero after the
+   --  call if enough output space has been provided  before the call.)
+   --  Flushing may degrade compression for some compression algorithms and so
+   --  it should be used only when necessary.
+
+   Full_Flush    : constant Flush_Mode;
+   --  all output is flushed as with SYNC_FLUSH, and the compression state
+   --  is reset so that decompression can restart from this point if previous
+   --  compressed data has been damaged or if random access is desired. Using
+   --  FULL_FLUSH too often can seriously degrade the compression.
+
+   Finish        : constant Flush_Mode;
+   --  Just for tell the compressor that input data is complete.
+
+   ------------------------------------
+   -- Compression strategy constants --
+   ------------------------------------
+
+   --  RLE stategy could be used only in version 1.2.0 and later.
+
+   Filtered         : constant Strategy_Type;
+   Huffman_Only     : constant Strategy_Type;
+   RLE              : constant Strategy_Type;
+   Default_Strategy : constant Strategy_Type;
+
+   Default_Buffer_Size : constant := 4096;
+
+   type Filter_Type is limited private;
+   --  The filter is for compression and for decompression.
+   --  The usage of the type is depend of its initialization.
+
+   function Version return String;
+   pragma Inline (Version);
+   --  Return string representation of the ZLib version.
+
+   procedure Deflate_Init
+     (Filter       : in out Filter_Type;
+      Level        : in     Compression_Level  := Default_Compression;
+      Strategy     : in     Strategy_Type      := Default_Strategy;
+      Method       : in     Compression_Method := Deflated;
+      Window_Bits  : in     Window_Bits_Type   := 15;
+      Memory_Level : in     Memory_Level_Type  := 8;
+      Header       : in     Header_Type        := Default);
+   --  Compressor initialization.
+   --  When Header parameter is Auto or Default, then default zlib header
+   --  would be provided for compressed data.
+   --  When Header is GZip, then gzip header would be set instead of
+   --  default header.
+   --  When Header is None, no header would be set for compressed data.
+
+   procedure Inflate_Init
+     (Filter      : in out Filter_Type;
+      Window_Bits : in     Window_Bits_Type := 15;
+      Header      : in     Header_Type      := Default);
+   --  Decompressor initialization.
+   --  Default header type mean that ZLib default header is expecting in the
+   --  input compressed stream.
+   --  Header type None mean that no header is expecting in the input stream.
+   --  GZip header type mean that GZip header is expecting in the
+   --  input compressed stream.
+   --  Auto header type mean that header type (GZip or Native) would be
+   --  detected automatically in the input stream.
+   --  Note that header types parameter values None, GZip and Auto is
+   --  supporting for inflate routine only in ZLib versions 1.2.0.2 and later.
+   --  Deflate_Init is supporting all header types.
+
+   procedure Close
+     (Filter       : in out Filter_Type;
+      Ignore_Error : in     Boolean := False);
+   --  Closing the compression or decompressor.
+   --  If stream is closing before the complete and Ignore_Error is False,
+   --  The exception would be raised.
+
+   generic
+      with procedure Data_In
+        (Item : out Ada.Streams.Stream_Element_Array;
+         Last : out Ada.Streams.Stream_Element_Offset);
+      with procedure Data_Out
+        (Item : in Ada.Streams.Stream_Element_Array);
+   procedure Generic_Translate
+     (Filter          : in out Filter_Type;
+      In_Buffer_Size  : in     Integer := Default_Buffer_Size;
+      Out_Buffer_Size : in     Integer := Default_Buffer_Size);
+   --  Compressing/decompressing data arrived from Data_In routine
+   --  to the Data_Out routine. User should provide Data_In and Data_Out
+   --  for compression/decompression data flow.
+   --  Compression or decompression depend on initialization of Filter.
+
+   function Total_In (Filter : in Filter_Type) return Count;
+   pragma Inline (Total_In);
+   --  Return total number of input bytes read so far.
+
+   function Total_Out (Filter : in Filter_Type) return Count;
+   pragma Inline (Total_Out);
+   --  Return total number of bytes output so far.
+
+   function CRC32
+     (CRC    : in Unsigned_32;
+      Data   : in Ada.Streams.Stream_Element_Array)
+      return Unsigned_32;
+   pragma Inline (CRC32);
+   --  Calculate CRC32, it could be necessary for make gzip format.
+
+   procedure CRC32
+     (CRC  : in out Unsigned_32;
+      Data : in     Ada.Streams.Stream_Element_Array);
+   pragma Inline (CRC32);
+   --  Calculate CRC32, it could be necessary for make gzip format.
+
+   -------------------------------------------------
+   --  Below is more complex low level routines.  --
+   -------------------------------------------------
+
+   procedure Translate
+     (Filter    : in out Filter_Type;
+      In_Data   : in     Ada.Streams.Stream_Element_Array;
+      In_Last   :    out Ada.Streams.Stream_Element_Offset;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode);
+   --  Compressing/decompressing the datas from In_Data buffer to the
+   --  Out_Data buffer.
+   --  In_Data is incoming data portion,
+   --  In_Last is the index of last element from In_Data accepted by the
+   --  Filter.
+   --  Out_Data is the buffer for output data from the filter.
+   --  Out_Last is the last element of the received data from Filter.
+   --  To tell the filter that incoming data is complete put the
+   --  Flush parameter to FINISH.
+
+   function Stream_End (Filter : in Filter_Type) return Boolean;
+   pragma Inline (Stream_End);
+   --  Return the true when the stream is complete.
+
+   procedure Flush
+     (Filter    : in out Filter_Type;
+      Out_Data  :    out Ada.Streams.Stream_Element_Array;
+      Out_Last  :    out Ada.Streams.Stream_Element_Offset;
+      Flush     : in     Flush_Mode);
+   pragma Inline (Flush);
+   --  Flushing the data from the compressor.
+
+   generic
+      with procedure Write
+        (Item : in Ada.Streams.Stream_Element_Array);
+      --  User should provide this routine for accept
+      --  compressed/decompressed data.
+
+      Buffer_Size : in Ada.Streams.Stream_Element_Offset
+         := Default_Buffer_Size;
+      --  Buffer size for Write user routine.
+
+   procedure Write
+     (Filter  : in out Filter_Type;
+      Item    : in     Ada.Streams.Stream_Element_Array;
+      Flush   : in     Flush_Mode);
+   --  Compressing/Decompressing data from Item to the
+   --  generic parameter procedure Write.
+   --  Output buffer size could be set in Buffer_Size generic parameter.
+
+   generic
+      with procedure Read
+        (Item : out Ada.Streams.Stream_Element_Array;
+         Last : out Ada.Streams.Stream_Element_Offset);
+      --  User should provide data for compression/decompression
+      --  thru this routine.
+
+      Buffer : in out Ada.Streams.Stream_Element_Array;
+      --  Buffer for keep remaining data from the previous
+      --  back read.
+
+      Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset;
+      --  Rest_First have to be initialized to Buffer'Last + 1
+      --  before usage.
+
+   procedure Read
+     (Filter : in out Filter_Type;
+      Item   :    out Ada.Streams.Stream_Element_Array;
+      Last   :    out Ada.Streams.Stream_Element_Offset);
+   --  Compressing/Decompressing data from generic parameter
+   --  procedure Read to the Item.
+   --  User should provide Buffer for the operation
+   --  and Rest_First variable first time initialized to the Buffer'Last + 1.
+
+private
+
+   use Ada.Streams;
+
+   type Flush_Mode is new Integer range 0 .. 4;
+
+   type Compression_Method is new Integer range 8 .. 8;
+
+   type Strategy_Type is new Integer range 0 .. 3;
+
+   No_Flush      : constant Flush_Mode := 0;
+   Sync_Flush    : constant Flush_Mode := 2;
+   Full_Flush    : constant Flush_Mode := 3;
+   Finish        : constant Flush_Mode := 4;
+   Partial_Flush : constant Flush_Mode := 1;
+   --  will be removed, use Z_SYNC_FLUSH instead
+
+   Filtered         : constant Strategy_Type := 1;
+   Huffman_Only     : constant Strategy_Type := 2;
+   RLE              : constant Strategy_Type := 3;
+   Default_Strategy : constant Strategy_Type := 0;
+
+   Deflated : constant Compression_Method := 8;
+
+   type Z_Stream;
+
+   type Z_Stream_Access is access all Z_Stream;
+
+   type Filter_Type is record
+      Strm        : Z_Stream_Access;
+      Compression : Boolean;
+      Stream_End  : Boolean;
+      Header      : Header_Type;
+      CRC         : Unsigned_32;
+      Offset      : Stream_Element_Offset;
+      --  Offset for gzip header/footer output.
+
+      Opened      : Boolean := False;
+   end record;
+
+end ZLib;
diff --git a/contrib/ada/zlib.gpr b/contrib/ada/zlib.gpr
new file mode 100644
index 0000000..0f58985
--- /dev/null
+++ b/contrib/ada/zlib.gpr
@@ -0,0 +1,21 @@
+project Zlib is
+
+   for Languages use ("Ada");
+   for Source_Dirs use (".");
+   for Object_Dir use ".";
+   for Main use ("test.adb", "mtest.adb", "read.adb");
+
+   package Compiler is
+      for Default_Switches ("ada") use ("-gnatwbcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
+   end Compiler;
+
+   package Linker is
+      for Default_Switches ("ada") use ("-lz");
+   end Linker;
+
+   package Builder is
+      for Default_Switches ("ada") use ("-s", "-gnatQ");
+   end Builder;
+
+end Zlib;
+
diff --git a/contrib/asm386/gvmat32.asm b/contrib/asm386/gvmat32.asm
deleted file mode 100644
index 28d527f..0000000
--- a/contrib/asm386/gvmat32.asm
+++ /dev/null
@@ -1,559 +0,0 @@
-;
-; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86
-; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
-; File written by Gilles Vollant, by modifiying the longest_match
-;  from Jean-loup Gailly in deflate.c
-; It need wmask == 0x7fff
-;     (assembly code is faster with a fixed wmask)
-;
-; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)
-;   I compile with : "ml /coff /Zi /c gvmat32.asm"
-;
-
-;uInt longest_match_7fff(s, cur_match)
-;    deflate_state *s;
-;    IPos cur_match;                             /* current match */
-
-        NbStack         equ     76
-        cur_match       equ     dword ptr[esp+NbStack-0]
-        str_s           equ     dword ptr[esp+NbStack-4]
-; 5 dword on top (ret,ebp,esi,edi,ebx)
-        adrret          equ     dword ptr[esp+NbStack-8]
-        pushebp         equ     dword ptr[esp+NbStack-12]
-        pushedi         equ     dword ptr[esp+NbStack-16]
-        pushesi         equ     dword ptr[esp+NbStack-20]
-        pushebx         equ     dword ptr[esp+NbStack-24]
-
-        chain_length    equ     dword ptr [esp+NbStack-28]
-        limit           equ     dword ptr [esp+NbStack-32]
-        best_len        equ     dword ptr [esp+NbStack-36]
-        window          equ     dword ptr [esp+NbStack-40]
-        prev            equ     dword ptr [esp+NbStack-44]
-        scan_start      equ      word ptr [esp+NbStack-48]
-        wmask           equ     dword ptr [esp+NbStack-52]
-        match_start_ptr equ     dword ptr [esp+NbStack-56]
-        nice_match      equ     dword ptr [esp+NbStack-60]
-        scan            equ     dword ptr [esp+NbStack-64]
-
-        windowlen       equ     dword ptr [esp+NbStack-68]
-        match_start     equ     dword ptr [esp+NbStack-72]
-        strend          equ     dword ptr [esp+NbStack-76]
-        NbStackAdd      equ     (NbStack-24)
-
-    .386p
-
-    name    gvmatch
-    .MODEL  FLAT
-
-
-
-;  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
-    dep_chain_length    equ     70h+4
-    dep_window          equ     2ch+4
-    dep_strstart        equ     60h+4
-    dep_prev_length     equ     6ch+4
-    dep_nice_match      equ     84h+4
-    dep_w_size          equ     20h+4
-    dep_prev            equ     34h+4
-    dep_w_mask          equ     28h+4
-    dep_good_match      equ     80h+4
-    dep_match_start     equ     64h+4
-    dep_lookahead       equ     68h+4
-
-
-_TEXT                   segment
-
-IFDEF NOUNDERLINE
-                        public  longest_match_7fff
-;                        public  match_init
-ELSE
-                        public  _longest_match_7fff
-;                        public  _match_init
-ENDIF
-
-    MAX_MATCH           equ     258
-    MIN_MATCH           equ     3
-    MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1)
-
-
-
-IFDEF NOUNDERLINE
-;match_init      proc near
-;                ret
-;match_init      endp
-ELSE
-;_match_init     proc near
-;                ret
-;_match_init     endp
-ENDIF
-
-
-IFDEF NOUNDERLINE
-longest_match_7fff   proc near
-ELSE
-_longest_match_7fff  proc near
-ENDIF
-
-        mov     edx,[esp+4]
-
-
-
-        push    ebp
-        push    edi
-        push    esi
-        push    ebx
-
-        sub     esp,NbStackAdd
-
-; initialize or check the variables used in match.asm.
-        mov     ebp,edx
-
-; chain_length = s->max_chain_length
-; if (prev_length>=good_match) chain_length >>= 2
-        mov     edx,[ebp+dep_chain_length]
-        mov     ebx,[ebp+dep_prev_length]
-        cmp     [ebp+dep_good_match],ebx
-        ja      noshr
-        shr     edx,2
-noshr:
-; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop
-        inc     edx
-        mov     edi,[ebp+dep_nice_match]
-        mov     chain_length,edx
-        mov     eax,[ebp+dep_lookahead]
-        cmp     eax,edi
-; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-        jae     nolookaheadnicematch
-        mov     edi,eax
-nolookaheadnicematch:
-; best_len = s->prev_length
-        mov     best_len,ebx
-
-; window = s->window
-        mov     esi,[ebp+dep_window]
-        mov     ecx,[ebp+dep_strstart]
-        mov     window,esi
-
-        mov     nice_match,edi
-; scan = window + strstart
-        add     esi,ecx
-        mov     scan,esi
-; dx = *window
-        mov     dx,word ptr [esi]
-; bx = *(window+best_len-1)
-        mov     bx,word ptr [esi+ebx-1]
-        add     esi,MAX_MATCH-1
-; scan_start = *scan
-        mov     scan_start,dx
-; strend = scan + MAX_MATCH-1
-        mov     strend,esi
-; bx = scan_end = *(window+best_len-1)
-
-;    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
-;        s->strstart - (IPos)MAX_DIST(s) : NIL;
-
-        mov     esi,[ebp+dep_w_size]
-        sub     esi,MIN_LOOKAHEAD
-; here esi = MAX_DIST(s)
-        sub     ecx,esi
-        ja      nodist
-        xor     ecx,ecx
-nodist:
-        mov     limit,ecx
-
-; prev = s->prev
-        mov     edx,[ebp+dep_prev]
-        mov     prev,edx
-
-;
-        mov     edx,dword ptr [ebp+dep_match_start]
-        mov     bp,scan_start
-        mov     eax,cur_match
-        mov     match_start,edx
-
-        mov     edx,window
-        mov     edi,edx
-        add     edi,best_len
-        mov     esi,prev
-        dec     edi
-; windowlen = window + best_len -1
-        mov     windowlen,edi
-
-        jmp     beginloop2
-        align   4
-
-; here, in the loop
-;       eax = ax = cur_match
-;       ecx = limit
-;        bx = scan_end
-;        bp = scan_start
-;       edi = windowlen (window + best_len -1)
-;       esi = prev
-
-
-;// here; chain_length <=16
-normalbeg0add16:
-        add     chain_length,16
-        jz      exitloop
-normalbeg0:
-        cmp     word ptr[edi+eax],bx
-        je      normalbeg2noroll
-rcontlabnoroll:
-; cur_match = prev[cur_match & wmask]
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-; if cur_match > limit, go to exitloop
-        cmp     ecx,eax
-        jnb     exitloop
-; if --chain_length != 0, go to exitloop
-        dec     chain_length
-        jnz     normalbeg0
-        jmp     exitloop
-
-normalbeg2noroll:
-; if (scan_start==*(cur_match+window)) goto normalbeg2
-        cmp     bp,word ptr[edx+eax]
-        jne     rcontlabnoroll
-        jmp     normalbeg2
-
-contloop3:
-        mov     edi,windowlen
-
-; cur_match = prev[cur_match & wmask]
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-; if cur_match > limit, go to exitloop
-        cmp     ecx,eax
-jnbexitloopshort1:
-        jnb     exitloop
-; if --chain_length != 0, go to exitloop
-
-
-; begin the main loop
-beginloop2:
-        sub     chain_length,16+1
-; if chain_length <=16, don't use the unrolled loop
-        jna     normalbeg0add16
-
-do16:
-        cmp     word ptr[edi+eax],bx
-        je      normalbeg2dc0
-
-maccn   MACRO   lab
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-        cmp     ecx,eax
-        jnb     exitloop
-        cmp     word ptr[edi+eax],bx
-        je      lab
-        ENDM
-
-rcontloop0:
-        maccn   normalbeg2dc1
-
-rcontloop1:
-        maccn   normalbeg2dc2
-
-rcontloop2:
-        maccn   normalbeg2dc3
-
-rcontloop3:
-        maccn   normalbeg2dc4
-
-rcontloop4:
-        maccn   normalbeg2dc5
-
-rcontloop5:
-        maccn   normalbeg2dc6
-
-rcontloop6:
-        maccn   normalbeg2dc7
-
-rcontloop7:
-        maccn   normalbeg2dc8
-
-rcontloop8:
-        maccn   normalbeg2dc9
-
-rcontloop9:
-        maccn   normalbeg2dc10
-
-rcontloop10:
-        maccn   short normalbeg2dc11
-
-rcontloop11:
-        maccn   short normalbeg2dc12
-
-rcontloop12:
-        maccn   short normalbeg2dc13
-
-rcontloop13:
-        maccn   short normalbeg2dc14
-
-rcontloop14:
-        maccn   short normalbeg2dc15
-
-rcontloop15:
-        and     eax,7fffh
-        mov     ax,word ptr[esi+eax*2]
-        cmp     ecx,eax
-        jnb     exitloop
-
-        sub     chain_length,16
-        ja      do16
-        jmp     normalbeg0add16
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-normbeg MACRO   rcontlab,valsub
-; if we are here, we know that *(match+best_len-1) == scan_end
-        cmp     bp,word ptr[edx+eax]
-; if (match != scan_start) goto rcontlab
-        jne     rcontlab
-; calculate the good chain_length, and we'll compare scan and match string
-        add     chain_length,16-valsub
-        jmp     iseq
-        ENDM
-
-
-normalbeg2dc11:
-        normbeg rcontloop11,11
-
-normalbeg2dc12:
-        normbeg short rcontloop12,12
-
-normalbeg2dc13:
-        normbeg short rcontloop13,13
-
-normalbeg2dc14:
-        normbeg short rcontloop14,14
-
-normalbeg2dc15:
-        normbeg short rcontloop15,15
-
-normalbeg2dc10:
-        normbeg rcontloop10,10
-
-normalbeg2dc9:
-        normbeg rcontloop9,9
-
-normalbeg2dc8:
-        normbeg rcontloop8,8
-
-normalbeg2dc7:
-        normbeg rcontloop7,7
-
-normalbeg2dc6:
-        normbeg rcontloop6,6
-
-normalbeg2dc5:
-        normbeg rcontloop5,5
-
-normalbeg2dc4:
-        normbeg rcontloop4,4
-
-normalbeg2dc3:
-        normbeg rcontloop3,3
-
-normalbeg2dc2:
-        normbeg rcontloop2,2
-
-normalbeg2dc1:
-        normbeg rcontloop1,1
-
-normalbeg2dc0:
-        normbeg rcontloop0,0
-
-
-; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end
-
-normalbeg2:
-        mov     edi,window
-
-        cmp     bp,word ptr[edi+eax]
-        jne     contloop3                   ; if *(ushf*)match != scan_start, continue
-
-iseq:
-; if we are here, we know that *(match+best_len-1) == scan_end
-; and (match == scan_start)
-
-        mov     edi,edx
-        mov     esi,scan                    ; esi = scan
-        add     edi,eax                     ; edi = window + cur_match = match
-
-        mov     edx,[esi+3]                 ; compare manually dword at match+3
-        xor     edx,[edi+3]                 ; and scan +3
-
-        jz      begincompare                ; if equal, go to long compare
-
-; we will determine the unmatch byte and calculate len (in esi)
-        or      dl,dl
-        je      eq1rr
-        mov     esi,3
-        jmp     trfinval
-eq1rr:
-        or      dx,dx
-        je      eq1
-
-        mov     esi,4
-        jmp     trfinval
-eq1:
-        and     edx,0ffffffh
-        jz      eq11
-        mov     esi,5
-        jmp     trfinval
-eq11:
-        mov     esi,6
-        jmp     trfinval
-
-begincompare:
-        ; here we now scan and match begin same
-        add     edi,6
-        add     esi,6
-        mov     ecx,(MAX_MATCH-(2+4))/4     ; scan for at most MAX_MATCH bytes
-        repe    cmpsd                       ; loop until mismatch
-
-        je      trfin                       ; go to trfin if not unmatch
-; we determine the unmatch byte
-        sub     esi,4
-        mov     edx,[edi-4]
-        xor     edx,[esi]
-
-        or      dl,dl
-        jnz     trfin
-        inc     esi
-
-        or      dx,dx
-        jnz     trfin
-        inc     esi
-
-        and     edx,0ffffffh
-        jnz     trfin
-        inc     esi
-
-trfin:
-        sub     esi,scan          ; esi = len
-trfinval:
-; here we have finised compare, and esi contain len of equal string
-        cmp     esi,best_len        ; if len > best_len, go newbestlen
-        ja      short newbestlen
-; now we restore edx, ecx and esi, for the big loop
-        mov     esi,prev
-        mov     ecx,limit
-        mov     edx,window
-        jmp     contloop3
-
-newbestlen:
-        mov     best_len,esi        ; len become best_len
-
-        mov     match_start,eax     ; save new position as match_start
-        cmp     esi,nice_match      ; if best_len >= nice_match, exit
-        jae     exitloop
-        mov     ecx,scan
-        mov     edx,window          ; restore edx=window
-        add     ecx,esi
-        add     esi,edx
-
-        dec     esi
-        mov     windowlen,esi       ; windowlen = window + best_len-1
-        mov     bx,[ecx-1]          ; bx = *(scan+best_len-1) = scan_end
-
-; now we restore ecx and esi, for the big loop :
-        mov     esi,prev
-        mov     ecx,limit
-        jmp     contloop3
-
-exitloop:
-; exit : s->match_start=match_start
-        mov     ebx,match_start
-        mov     ebp,str_s
-        mov     ecx,best_len
-        mov     dword ptr [ebp+dep_match_start],ebx        
-        mov     eax,dword ptr [ebp+dep_lookahead]
-        cmp     ecx,eax
-        ja      minexlo
-        mov     eax,ecx
-minexlo:
-; return min(best_len,s->lookahead)
-        
-; restore stack and register ebx,esi,edi,ebp
-        add     esp,NbStackAdd
-
-        pop     ebx
-        pop     esi
-        pop     edi
-        pop     ebp
-        ret
-InfoAuthor:
-; please don't remove this string !
-; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!
-        db     0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah
-
-
-
-IFDEF NOUNDERLINE
-longest_match_7fff   endp
-ELSE
-_longest_match_7fff  endp
-ENDIF
-
-
-IFDEF NOUNDERLINE
-cpudetect32     proc near
-ELSE
-_cpudetect32    proc near
-ENDIF
-
-
-	pushfd                  ; push original EFLAGS
-	pop     eax             ; get original EFLAGS
-	mov     ecx, eax        ; save original EFLAGS
-	xor     eax, 40000h     ; flip AC bit in EFLAGS
-	push    eax             ; save new EFLAGS value on stack
-	popfd                   ; replace current EFLAGS value
-	pushfd                  ; get new EFLAGS
-	pop     eax             ; store new EFLAGS in EAX
-	xor     eax, ecx        ; canÂ’t toggle AC bit, processor=80386
-	jz      end_cpu_is_386  ; jump if 80386 processor
-	push    ecx
-	popfd                   ; restore AC bit in EFLAGS first
-
-	pushfd
-	pushfd
-	pop     ecx
-			
-	mov     eax, ecx        ; get original EFLAGS
-	xor     eax, 200000h    ; flip ID bit in EFLAGS
-	push    eax             ; save new EFLAGS value on stack
-	popfd                   ; replace current EFLAGS value
-	pushfd                  ; get new EFLAGS
-	pop		eax	            ; store new EFLAGS in EAX
-	popfd                   ; restore original EFLAGS
-	xor		eax, ecx        ; canÂ’t toggle ID bit,
-	je		is_old_486		; processor=old
-
-	mov     eax,1
-	db      0fh,0a2h        ;CPUID   
-
-exitcpudetect:
-	ret
-
-end_cpu_is_386:
-	mov     eax,0300h
-	jmp     exitcpudetect
-
-is_old_486:
-	mov     eax,0400h
-	jmp     exitcpudetect
-
-IFDEF NOUNDERLINE
-cpudetect32     endp
-ELSE
-_cpudetect32    endp
-ENDIF
-
-_TEXT   ends
-end
diff --git a/contrib/asm386/gvmat32c.c b/contrib/asm386/gvmat32c.c
deleted file mode 100644
index d853bb7..0000000
--- a/contrib/asm386/gvmat32c.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* 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"
-
-#undef FAR
-#include <windows.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
-#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(
-    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==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 */
diff --git a/contrib/asm386/mkgvmt32.bat b/contrib/asm386/mkgvmt32.bat
deleted file mode 100644
index 6c5ffd7..0000000
--- a/contrib/asm386/mkgvmt32.bat
+++ /dev/null
@@ -1 +0,0 @@
-c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm
diff --git a/contrib/asm386/zlibvc.def b/contrib/asm386/zlibvc.def
deleted file mode 100644
index 7e9d60d..0000000
--- a/contrib/asm386/zlibvc.def
+++ /dev/null
@@ -1,74 +0,0 @@
-LIBRARY		"zlib"
-
-DESCRIPTION	'"""zlib data compression library"""'
-
-
-VERSION		1.11
-
-
-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
-
-	unzOpen                       @61
-	unzClose                      @62
-	unzGetGlobalInfo              @63
-	unzGetCurrentFileInfo         @64
-	unzGoToFirstFile              @65
-	unzGoToNextFile               @66
-	unzOpenCurrentFile            @67
-	unzReadCurrentFile            @68
-	unztell                       @70
-	unzeof                        @71
-	unzCloseCurrentFile           @72
-	unzGetGlobalComment           @73
-	unzStringFileNameCompare      @74
-	unzLocateFile                 @75
-	unzGetLocalExtrafield         @76
-
-	zipOpen                       @80
-	zipOpenNewFileInZip           @81
-	zipWriteInFileInZip           @82
-	zipCloseFileInZip             @83
-	zipClose                      @84
diff --git a/contrib/asm386/zlibvc.dsp b/contrib/asm386/zlibvc.dsp
deleted file mode 100644
index a70d4d4..0000000
--- a/contrib/asm386/zlibvc.dsp
+++ /dev/null
@@ -1,651 +0,0 @@
-# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
-
-CFG=zlibvc - Win32 Release
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
- "Win32 (ALPHA) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
- "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir ".\Release"
-# PROP BASE Intermediate_Dir ".\Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir ".\Release"
-# PROP Intermediate_Dir ".\Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir ".\Debug"
-# PROP BASE Intermediate_Dir ".\Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir ".\Debug"
-# PROP Intermediate_Dir ".\Debug"
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "_DEBUG" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "_DEBUG"
-# ADD RSC /l 0x40c /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc__"
-# PROP BASE Intermediate_Dir "zlibvc__"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc__"
-# PROP Intermediate_Dir "zlibvc__"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_0"
-# PROP BASE Intermediate_Dir "zlibvc_0"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_0"
-# PROP Intermediate_Dir "zlibvc_0"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "zlibvc_1"
-# PROP BASE Intermediate_Dir "zlibvc_1"
-# PROP BASE Ignore_Export_Lib 0
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "zlibvc_1"
-# PROP Intermediate_Dir "zlibvc_1"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-CPP=cl.exe
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
-# SUBTRACT CPP /YX
-MTL=midl.exe
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-RSC=rc.exe
-# ADD BASE RSC /l 0x40c /d "NDEBUG"
-# ADD RSC /l 0x40c /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
-# SUBTRACT BASE LINK32 /pdb:none
-# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
-# SUBTRACT LINK32 /pdb:none
-
-!ENDIF 
-
-# Begin Target
-
-# Name "zlibvc - Win32 Release"
-# Name "zlibvc - Win32 Debug"
-# Name "zlibvc - Win32 ReleaseAxp"
-# Name "zlibvc - Win32 ReleaseWithoutAsm"
-# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
-# Begin Source File
-
-SOURCE=.\adler32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ADLER=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\compress.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_COMPR=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\crc32.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_CRC32=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\deflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_DEFLA=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gvmat32c.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\gzio.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_GZIO_=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFBL=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFCO=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFFA=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inffast.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inflate.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFLA=\
-	".\infblock.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFTR=\
-	".\inftrees.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_INFUT=\
-	".\infblock.h"\
-	".\infcodes.h"\
-	".\inftrees.h"\
-	".\infutil.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\trees.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_TREES=\
-	".\deflate.h"\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\uncompr.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_UNCOM=\
-	".\zconf.h"\
-	".\zlib.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\unzip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zip.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.rc
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlibvc.def
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.c
-
-!IF  "$(CFG)" == "zlibvc - Win32 Release"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 Debug"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
-
-DEP_CPP_ZUTIL=\
-	".\zconf.h"\
-	".\zlib.h"\
-	".\zutil.h"\
-	
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
-
-!ELSEIF  "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
-
-!ENDIF 
-
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
-# Begin Source File
-
-SOURCE=.\deflate.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infblock.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infcodes.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inffast.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\inftrees.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\infutil.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zconf.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zlib.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\zutil.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/contrib/asm386/zlibvc.dsw b/contrib/asm386/zlibvc.dsw
deleted file mode 100644
index 493cd87..0000000
--- a/contrib/asm386/zlibvc.dsw
+++ /dev/null
@@ -1,41 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 5.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/contrib/blast/blast.c b/contrib/blast/blast.c
index 67dab4e..4ce697a 100644
--- a/contrib/blast/blast.c
+++ b/contrib/blast/blast.c
@@ -20,36 +20,36 @@
 /*
  * Change history:
  *
- * 1.0	12 Feb 2003	- First version
- * 1.1	16 Feb 2003	- Fixed distance check for > 4 GB uncompressed data
+ * 1.0  12 Feb 2003     - First version
+ * 1.1  16 Feb 2003     - Fixed distance check for > 4 GB uncompressed data
  */
 
-#include <setjmp.h>		/* for setjmp(), longjmp(), and jmp_buf */
-#include "blast.h"		/* prototype for blast() */
+#include <setjmp.h>             /* for setjmp(), longjmp(), and jmp_buf */
+#include "blast.h"              /* prototype for blast() */
 
-#define local static		/* for local function definitions */
-#define MAXBITS 13		/* maximum code length */
-#define MAXWIN 4096		/* maximum window size */
+#define local static            /* for local function definitions */
+#define MAXBITS 13              /* maximum code length */
+#define MAXWIN 4096             /* maximum window size */
 
 /* input and output state */
 struct state {
     /* input state */
-    blast_in infun;		/* input function provided by user */
-    void *inhow;		/* opaque information passed to infun() */
-    unsigned char *in;		/* next input location */
-    unsigned left;		/* available input at in */
-    int bitbuf;			/* bit buffer */
-    int bitcnt;			/* number of bits in bit buffer */
+    blast_in infun;             /* input function provided by user */
+    void *inhow;                /* opaque information passed to infun() */
+    unsigned char *in;          /* next input location */
+    unsigned left;              /* available input at in */
+    int bitbuf;                 /* bit buffer */
+    int bitcnt;                 /* number of bits in bit buffer */
 
     /* input limit error return state for bits() and decode() */
     jmp_buf env;
 
     /* output state */
-    blast_out outfun;		/* output function provided by user */
-    void *outhow;		/* opaque information passed to outfun() */
-    unsigned next;		/* index of next write location in out[] */
-    int first;			/* true to check distances (for first 4K) */
-    unsigned char out[MAXWIN];	/* output buffer and sliding window */
+    blast_out outfun;           /* output function provided by user */
+    void *outhow;               /* opaque information passed to outfun() */
+    unsigned next;              /* index of next write location in out[] */
+    int first;                  /* true to check distances (for first 4K) */
+    unsigned char out[MAXWIN];  /* output buffer and sliding window */
 };
 
 /*
@@ -65,16 +65,16 @@
  */
 local int bits(struct state *s, int need)
 {
-    int val;		/* bit accumulator */
+    int val;            /* bit accumulator */
 
     /* load at least need bits into val */
     val = s->bitbuf;
     while (s->bitcnt < need) {
         if (s->left == 0) {
             s->left = s->infun(s->inhow, &(s->in));
-            if (s->left == 0) longjmp(s->env, 1);	/* out of input */
+            if (s->left == 0) longjmp(s->env, 1);       /* out of input */
         }
-        val |= (int)(*(s->in)++) << s->bitcnt;		/* load eight bits */
+        val |= (int)(*(s->in)++) << s->bitcnt;          /* load eight bits */
         s->left--;
         s->bitcnt += 8;
     }
@@ -95,8 +95,8 @@
  * seen in the function decode() below.
  */
 struct huffman {
-    short *count;	/* number of symbols of each length */
-    short *symbol;	/* canonically ordered symbols */
+    short *count;       /* number of symbols of each length */
+    short *symbol;      /* canonically ordered symbols */
 };
 
 /*
@@ -122,14 +122,14 @@
  */
 local int decode(struct state *s, struct huffman *h)
 {
-    int len;		/* current number of bits in code */
-    int code;		/* len bits being decoded */
-    int first;		/* first code of length len */
-    int count;		/* number of codes of length len */
-    int index;		/* index of first code of length len in symbol table */
-    int bitbuf;		/* bits from stream */
-    int left;		/* bits left in next or left to process */
-    short *next;	/* next number of codes */
+    int len;            /* current number of bits in code */
+    int code;           /* len bits being decoded */
+    int first;          /* first code of length len */
+    int count;          /* number of codes of length len */
+    int index;          /* index of first code of length len in symbol table */
+    int bitbuf;         /* bits from stream */
+    int left;           /* bits left in next or left to process */
+    short *next;        /* next number of codes */
 
     bitbuf = s->bitbuf;
     left = s->bitcnt;
@@ -138,15 +138,15 @@
     next = h->count + 1;
     while (1) {
         while (left--) {
-            code |= (bitbuf & 1) ^ 1;	/* invert code */
+            code |= (bitbuf & 1) ^ 1;   /* invert code */
             bitbuf >>= 1;
             count = *next++;
-            if (code < first + count) {	/* if length len, return symbol */
+            if (code < first + count) { /* if length len, return symbol */
                 s->bitbuf = bitbuf;
                 s->bitcnt = (s->bitcnt - len) & 7;
                 return h->symbol[index + (code - first)];
             }
-            index += count;		/* else update for next length */
+            index += count;             /* else update for next length */
             first += count;
             first <<= 1;
             code <<= 1;
@@ -156,13 +156,13 @@
         if (left == 0) break;
         if (s->left == 0) {
             s->left = s->infun(s->inhow, &(s->in));
-            if (s->left == 0) longjmp(s->env, 1);	/* out of input */
+            if (s->left == 0) longjmp(s->env, 1);       /* out of input */
         }
         bitbuf = *(s->in)++;
         s->left--;
         if (left > 8) left = 8;
     }
-    return -9;				/* ran out of codes */
+    return -9;                          /* ran out of codes */
 }
 
 /*
@@ -184,11 +184,11 @@
  */
 local int construct(struct huffman *h, const unsigned char *rep, int n)
 {
-    int symbol;		/* current symbol when stepping through length[] */
-    int len;		/* current length when stepping through h->count[] */
-    int left;		/* number of possible codes left of current length */
-    short offs[MAXBITS+1];	/* offsets in symbol table for each length */
-    short length[256];	/* code lengths */
+    int symbol;         /* current symbol when stepping through length[] */
+    int len;            /* current length when stepping through h->count[] */
+    int left;           /* number of possible codes left of current length */
+    short offs[MAXBITS+1];      /* offsets in symbol table for each length */
+    short length[256];  /* code lengths */
 
     /* convert compact repeat counts into symbol bit length list */
     symbol = 0;
@@ -206,17 +206,17 @@
     for (len = 0; len <= MAXBITS; len++)
         h->count[len] = 0;
     for (symbol = 0; symbol < n; symbol++)
-        (h->count[length[symbol]])++;	/* assumes lengths are within bounds */
-    if (h->count[0] == n)		/* no codes! */
-        return 0;			/* complete, but decode() will fail */
+        (h->count[length[symbol]])++;   /* assumes lengths are within bounds */
+    if (h->count[0] == n)               /* no codes! */
+        return 0;                       /* complete, but decode() will fail */
 
     /* check for an over-subscribed or incomplete set of lengths */
-    left = 1;				/* one possible code of zero length */
+    left = 1;                           /* one possible code of zero length */
     for (len = 1; len <= MAXBITS; len++) {
-        left <<= 1;			/* one more bit, double codes left */
-        left -= h->count[len];		/* deduct count from possible codes */
-        if (left < 0) return left;	/* over-subscribed--return negative */
-    }					/* left > 0 means incomplete */
+        left <<= 1;                     /* one more bit, double codes left */
+        left -= h->count[len];          /* deduct count from possible codes */
+        if (left < 0) return left;      /* over-subscribed--return negative */
+    }                                   /* left > 0 means incomplete */
 
     /* generate offsets into symbol table for each length for sorting */
     offs[1] = 0;
@@ -275,35 +275,35 @@
  */
 local int decomp(struct state *s)
 {
-    int lit;		/* true if literals are coded */
-    int dict;		/* log2(dictionary size) - 6 */
-    int symbol;		/* decoded symbol, extra bits for distance */
-    int len;		/* length for copy */
-    int dist;		/* distance for copy */
-    int copy;		/* copy counter */
-    unsigned char *from, *to;	/* copy pointers */
-    static int virgin = 1;				/* build tables once */
-    static short litcnt[MAXBITS+1], litsym[256];	/* litcode memory */
-    static short lencnt[MAXBITS+1], lensym[16];		/* lencode memory */
-    static short distcnt[MAXBITS+1], distsym[64];	/* distcode memory */
-    static struct huffman litcode = {litcnt, litsym};	/* length code */
-    static struct huffman lencode = {lencnt, lensym};	/* length code */
+    int lit;            /* true if literals are coded */
+    int dict;           /* log2(dictionary size) - 6 */
+    int symbol;         /* decoded symbol, extra bits for distance */
+    int len;            /* length for copy */
+    int dist;           /* distance for copy */
+    int copy;           /* copy counter */
+    unsigned char *from, *to;   /* copy pointers */
+    static int virgin = 1;                              /* build tables once */
+    static short litcnt[MAXBITS+1], litsym[256];        /* litcode memory */
+    static short lencnt[MAXBITS+1], lensym[16];         /* lencode memory */
+    static short distcnt[MAXBITS+1], distsym[64];       /* distcode memory */
+    static struct huffman litcode = {litcnt, litsym};   /* length code */
+    static struct huffman lencode = {lencnt, lensym};   /* length code */
     static struct huffman distcode = {distcnt, distsym};/* distance code */
         /* bit lengths of literal codes */
     static const unsigned char litlen[] = {
-	11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
-	9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
-	7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
-	8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
-	44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
-	44, 173};
+        11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
+        9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
+        7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
+        8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
+        44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
+        44, 173};
         /* bit lengths of length codes 0..15 */
     static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23};
         /* bit lengths of distance codes 0..63 */
     static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248};
-    static const short base[16] = {	/* base for length codes */
+    static const short base[16] = {     /* base for length codes */
         3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264};
-    static const char extra[16] = {	/* extra bits for length codes */
+    static const char extra[16] = {     /* extra bits for length codes */
         0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
 
     /* set up decoding tables (once--might not be thread-safe) */
@@ -326,7 +326,7 @@
             /* get length */
             symbol = decode(s, &lencode);
             len = base[symbol] + bits(s, extra[symbol]);
-            if (len == 519) break;		/* end code */
+            if (len == 519) break;              /* end code */
 
             /* get distance */
             symbol = len == 2 ? 2 : dict;
@@ -334,7 +334,7 @@
             dist += bits(s, symbol);
             dist++;
             if (s->first && dist > s->next)
-                return -3;		/* distance too far back */
+                return -3;              /* distance too far back */
 
             /* copy length bytes from distance bytes back */
             do {
@@ -376,8 +376,8 @@
 /* See comments in blast.h */
 int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow)
 {
-    struct state s;		/* input/output state */
-    int err;			/* return value */
+    struct state s;             /* input/output state */
+    int err;                    /* return value */
 
     /* initialize input state */
     s.infun = infun;
@@ -393,10 +393,10 @@
     s.first = 1;
 
     /* return if bits() or decode() tries to read past available input */
-    if (setjmp(s.env) != 0)		/* if came back here via longjmp(), */
-        err = 2;			/*  then skip decomp(), return error */
+    if (setjmp(s.env) != 0)             /* if came back here via longjmp(), */
+        err = 2;                        /*  then skip decomp(), return error */
     else
-        err = decomp(&s);		/* decompress */
+        err = decomp(&s);               /* decompress */
 
     /* write any leftover output and update the error code if needed */
     if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0)
diff --git a/contrib/blast/blast.h b/contrib/blast/blast.h
index 2417837..ce9e541 100644
--- a/contrib/blast/blast.h
+++ b/contrib/blast/blast.h
@@ -18,7 +18,7 @@
      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
+  Mark Adler    madler@alumni.caltech.edu
  */
 
 
diff --git a/contrib/delphi2/zlib.pas b/contrib/delphi/ZLib.pas
similarity index 81%
rename from contrib/delphi2/zlib.pas
rename to contrib/delphi/ZLib.pas
index 10ae4ca..ea9a17f 100644
--- a/contrib/delphi2/zlib.pas
+++ b/contrib/delphi/ZLib.pas
@@ -1,33 +1,33 @@
 {*******************************************************}
 {                                                       }
-{       Delphi Supplemental Components                  }
+{       Borland Delphi Supplemental Components          }
 {       ZLIB Data Compression Interface Unit            }
 {                                                       }
-{       Copyright (c) 1997 Borland International        }
+{       Copyright (c) 1997,99 Borland Corporation       }
 {                                                       }
 {*******************************************************}
 
-{ Modified for zlib 1.1.3 by Davide Moretti <dave@rimini.com }
+{ Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
 
-unit zlib;
+unit ZLib;
 
 interface
 
-uses Sysutils, Classes;
+uses SysUtils, Classes;
 
 type
-  TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer;
-  TFree = procedure (AppData, Block: Pointer);
+  TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
+  TFree = procedure (AppData, Block: Pointer); cdecl;
 
   // Internal structure.  Ignore.
   TZStreamRec = packed record
     next_in: PChar;       // next input byte
     avail_in: Integer;    // number of bytes available at next_in
-    total_in: Integer;    // total nb of input bytes read so far
+    total_in: Longint;    // total nb of input bytes read so far
 
     next_out: PChar;      // next output byte should be put here
     avail_out: Integer;   // remaining free space at next_out
-    total_out: Integer;   // total nb of bytes output so far
+    total_out: Longint;   // total nb of bytes output so far
 
     msg: PChar;           // last error message, NULL if no error
     internal: Pointer;    // not visible by applications
@@ -36,9 +36,9 @@
     zfree: TFree;         // used to free the internal state
     AppData: Pointer;     // private data object passed to zalloc and zfree
 
-    data_type: Integer;   //  best guess about the data type: ascii or binary
-    adler: Integer;       // adler32 value of the uncompressed data
-    reserved: Integer;    // reserved for future use
+    data_type: Integer;   // best guess about the data type: ascii or binary
+    adler: Longint;       // adler32 value of the uncompressed data
+    reserved: Longint;    // reserved for future use
   end;
 
   // Abstract ancestor class
@@ -143,18 +143,26 @@
 procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
  OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
 
+{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
+   In: InBuf = ptr to compressed data
+       InBytes = number of bytes in InBuf
+  Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
+       BufSize = number of bytes in OutBuf   }
+procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
+  const OutBuf: Pointer; BufSize: Integer);
+
 const
-  zlib_version = '1.1.3';
+  zlib_version = '1.2.0';
 
 type
   EZlibError = class(Exception);
   ECompressionError = class(EZlibError);
   EDecompressionError = class(EZlibError);
 
-function adler32(adler: Integer; buf: PChar; len: Integer): Integer;
-
 implementation
 
+uses ZLibConst;
+
 const
   Z_NO_FLUSH      = 0;
   Z_PARTIAL_FLUSH = 1;
@@ -179,6 +187,7 @@
 
   Z_FILTERED            = 1;
   Z_HUFFMAN_ONLY        = 2;
+  Z_RLE                 = 3;
   Z_DEFAULT_STRATEGY    = 0;
 
   Z_BINARY   = 0;
@@ -187,56 +196,41 @@
 
   Z_DEFLATED = 8;
 
-  _z_errmsg: array[0..9] of PChar = (
-    'need dictionary',      // Z_NEED_DICT      (2)
-    'stream end',           // Z_STREAM_END     (1)
-    '',                     // Z_OK             (0)
-    'file error',           // Z_ERRNO          (-1)
-    'stream error',         // Z_STREAM_ERROR   (-2)
-    'data error',           // Z_DATA_ERROR     (-3)
-    'insufficient memory',  // Z_MEM_ERROR      (-4)
-    'buffer error',         // Z_BUF_ERROR      (-5)
-    'incompatible version', // Z_VERSION_ERROR  (-6)
-    ''
-  );
 
+{$L adler32.obj}
+{$L compress.obj}
+{$L crc32.obj}
 {$L deflate.obj}
+{$L infback.obj}
+{$L inffast.obj}
 {$L inflate.obj}
 {$L inftrees.obj}
 {$L trees.obj}
-{$L adler32.obj}
-{$L infblock.obj}
-{$L infcodes.obj}
-{$L infutil.obj}
-{$L inffast.obj}
+{$L uncompr.obj}
+{$L zutil.obj}
 
-procedure _tr_init; external;
-procedure _tr_tally; external;
-procedure _tr_flush_block; external;
-procedure _tr_align; external;
-procedure _tr_stored_block; external;
-function adler32; external;
-procedure inflate_blocks_new; external;
-procedure inflate_blocks; external;
-procedure inflate_blocks_reset; external;
-procedure inflate_blocks_free; external;
-procedure inflate_set_dictionary; external;
-procedure inflate_trees_bits; external;
-procedure inflate_trees_dynamic; external;
-procedure inflate_trees_fixed; external;
-procedure inflate_codes_new; external;
-procedure inflate_codes; external;
-procedure inflate_codes_free; external;
-procedure _inflate_mask; external;
-procedure inflate_flush; external;
-procedure inflate_fast; external;
+procedure adler32; external;
+procedure compressBound; external;
+procedure crc32; external;
+procedure deflateInit2_; external;
+procedure deflateParams; external;
 
-procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl;
+function _malloc(Size: Integer): Pointer; cdecl;
+begin
+  Result := AllocMem(Size);
+end;
+
+procedure _free(Block: Pointer); cdecl;
+begin
+  FreeMem(Block);
+end;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
 begin
   FillChar(P^, count, B);
 end;
 
-procedure _memcpy(dest, source: Pointer; count: Integer);cdecl;
+procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
 begin
   Move(source^, dest^, count);
 end;
@@ -257,22 +251,23 @@
 function inflateReset(var strm: TZStreamRec): Integer; external;
 
 
-function zcalloc(AppData: Pointer; Items, Size: Integer): Pointer;
+function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
 begin
-  GetMem(Result, Items*Size);
+//  GetMem(Result, Items*Size);
+  Result := AllocMem(Items * Size);
 end;
 
-procedure zcfree(AppData, Block: Pointer);
+procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
 begin
   FreeMem(Block);
 end;
 
-function zlibCheck(code: Integer): Integer;
+{function zlibCheck(code: Integer): Integer;
 begin
   Result := code;
   if code < 0 then
     raise EZlibError.Create('error');    //!!
-end;
+end;}
 
 function CCheck(code: Integer): Integer;
 begin
@@ -295,6 +290,8 @@
   P: Pointer;
 begin
   FillChar(strm, sizeof(strm), 0);
+  strm.zalloc := zlibAllocMem;
+  strm.zfree := zlibFreeMem;
   OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
   GetMem(OutBuf, OutBytes);
   try
@@ -332,6 +329,8 @@
   BufInc: Integer;
 begin
   FillChar(strm, sizeof(strm), 0);
+  strm.zalloc := zlibAllocMem;
+  strm.zfree := zlibFreeMem;
   BufInc := (InBytes + 255) and not 255;
   if OutEstimate = 0 then
     OutBytes := BufInc
@@ -364,6 +363,26 @@
   end;
 end;
 
+procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
+  const OutBuf: Pointer; BufSize: Integer);
+var
+  strm: TZStreamRec;
+begin
+  FillChar(strm, sizeof(strm), 0);
+  strm.zalloc := zlibAllocMem;
+  strm.zfree := zlibFreeMem;
+  strm.next_in := InBuf;
+  strm.avail_in := InBytes;
+  strm.next_out := OutBuf;
+  strm.avail_out := BufSize;
+  DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
+  try
+    if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
+      raise EZlibError.CreateRes(@sTargetBufferTooSmall);
+  finally
+    DCheck(inflateEnd(strm));
+  end;
+end;
 
 // TCustomZlibStream
 
@@ -372,6 +391,8 @@
   inherited Create;
   FStrm := Strm;
   FStrmPos := Strm.Position;
+  FZRec.zalloc := zlibAllocMem;
+  FZRec.zfree := zlibFreeMem;
 end;
 
 procedure TCustomZLibStream.Progress(Sender: TObject);
@@ -417,7 +438,7 @@
 
 function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
 begin
-  raise ECompressionError.Create('Invalid stream operation');
+  raise ECompressionError.CreateRes(@sInvalidStreamOp);
 end;
 
 function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
@@ -445,7 +466,7 @@
   if (Offset = 0) and (Origin = soFromCurrent) then
     Result := FZRec.total_in
   else
-    raise ECompressionError.Create('Invalid stream operation');
+    raise ECompressionError.CreateRes(@sInvalidStreamOp);
 end;
 
 function TCompressionStream.GetCompressionRate: Single;
@@ -469,6 +490,7 @@
 
 destructor TDecompressionStream.Destroy;
 begin
+  FStrm.Seek(-FZRec.avail_in, 1);
   inflateEnd(FZRec);
   inherited Destroy;
 end;
@@ -484,22 +506,22 @@
     begin
       FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
       if FZRec.avail_in = 0 then
-        begin
-          Result := Count - FZRec.avail_out;
-          Exit;
-        end;
-      FZRec.next_in := FBuffer;
+      begin
+        Result := Count - FZRec.avail_out;
+        Exit;
+      end;
+          FZRec.next_in := FBuffer;
       FStrmPos := FStrm.Position;
       Progress(Self);
     end;
-    DCheck(inflate(FZRec, 0));
+    CCheck(inflate(FZRec, 0));
   end;
   Result := Count;
 end;
 
 function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
 begin
-  raise EDecompressionError.Create('Invalid stream operation');
+  raise EDecompressionError.CreateRes(@sInvalidStreamOp);
 end;
 
 function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
@@ -527,8 +549,9 @@
     end;
   end
   else
-    raise EDecompressionError.Create('Invalid stream operation');
+    raise EDecompressionError.CreateRes(@sInvalidStreamOp);
   Result := FZRec.total_out;
 end;
 
+
 end.
diff --git a/contrib/delphi/ZLibConst.pas b/contrib/delphi/ZLibConst.pas
new file mode 100644
index 0000000..cdfe136
--- /dev/null
+++ b/contrib/delphi/ZLibConst.pas
@@ -0,0 +1,11 @@
+unit ZLibConst;
+
+interface
+
+resourcestring
+  sTargetBufferTooSmall = 'ZLib error: target buffer may be too small';
+  sInvalidStreamOp = 'Invalid stream operation';
+
+implementation
+
+end.
diff --git a/contrib/delphi/readme.txt b/contrib/delphi/readme.txt
new file mode 100644
index 0000000..65e58b3
--- /dev/null
+++ b/contrib/delphi/readme.txt
@@ -0,0 +1,76 @@
+
+Overview
+========
+
+This directory contains an update to the ZLib interface unit,
+distributed by Borland as a Delphi supplemental component.
+
+The original ZLib unit is Copyright (c) 1997,99 Borland Corp.,
+and is based on zlib version 1.0.4.  There are a series of bugs
+and security problems associated with that old zlib version, and
+we recommend the users to update their ZLib unit.
+
+
+Summary of modifications
+========================
+
+- Improved makefile, adapted to zlib version 1.2.0.
+
+- Some field types from TZStreamRec are changed from Integer to
+  Longint, for consistency with the zlib.h header, and for 64-bit
+  readiness.
+
+- The zlib_version constant is updated.
+
+- The new Z_RLE strategy has its corresponding symbolic constant.
+
+- The allocation and deallocation functions and function types
+  (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl,
+  and _malloc and _free are added as C RTL stubs.  As a result,
+  the original C sources of zlib can be compiled out of the box,
+  and linked to the ZLib unit.
+
+
+Suggestions for improvements
+============================
+
+Currently, the ZLib unit provides only a limited wrapper around
+the zlib library, and much of the original zlib functionality is
+missing.  Handling compressed file formats like ZIP/GZIP or PNG
+cannot be implemented without having this functionality.
+Applications that handle these formats are either using their own,
+duplicated code, or not using the ZLib unit at all.
+
+Here are a few suggestions:
+
+- Checksum class wrappers around adler32() and crc32(), similar
+  to the Java classes that implement the java.util.zip.Checksum
+  interface.
+
+- The ability to read and write raw deflate streams, without the
+  zlib stream header and trailer.  Raw deflate streams are used
+  in the ZIP file format.
+
+- The ability to read and write gzip streams, used in the GZIP
+  file format, and normally produced by the gzip program.
+
+- The ability to select a different compression strategy, useful
+  to PNG and MNG image compression, and to multimedia compression
+  in general.  Besides the compression level
+
+    TCompressionLevel = (clNone, clFastest, clDefault, clMax);
+
+  which, in fact, could have used the 'z' prefix and avoided
+  TColor-like symbols
+
+    TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax);
+
+  there could be a compression strategy
+
+    TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle);
+
+- ZIP and GZIP stream handling via TStreams.
+
+
+--
+Cosmin Truta <cosmint@cs.ubbcluj.ro>
diff --git a/contrib/delphi/zlib.mak b/contrib/delphi/zlib.mak
deleted file mode 100644
index ba557e2..0000000
--- a/contrib/delphi/zlib.mak
+++ /dev/null
@@ -1,36 +0,0 @@
-# Makefile for zlib32bd.lib
-# ------------- Borland C++ 4.5 -------------
-
-# The (32-bit) zlib32bd.lib made with this makefile is intended for use 
-# in making the (32-bit) DLL, png32bd.dll. It uses the "stdcall" calling 
-# convention.
-
-CFLAGS= -ps -O2 -C -K -N- -k- -d -3 -r- -w-par -w-aus -WDE
-CC=f:\bc45\bin\bcc32
-LIBFLAGS= /C
-LIB=f:\bc45\bin\tlib
-ZLIB=zlib32bd.lib
-
-.autodepend
-.c.obj:
-        $(CC) -c $(CFLAGS) $<
-
-OBJ1=adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj 
-OBJ2=infcodes.obj inflate.obj inftrees.obj infutil.obj inffast.obj 
-OBJ3=trees.obj uncompr.obj zutil.obj
-pOBJ1=+adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infblock.obj 
-pOBJ2=+infcodes.obj+inflate.obj+inftrees.obj+infutil.obj+inffast.obj 
-pOBJ3=+trees.obj+uncompr.obj+zutil.obj
-
-all: $(ZLIB)
-
-$(ZLIB): $(OBJ1) $(OBJ2) $(OBJ3)
-        @if exist $@ del $@
-        $(LIB) @&&|
-$@ $(LIBFLAGS) &
-$(pOBJ1) &
-$(pOBJ2) &
-$(pOBJ3)
-|
-
-# End of makefile for zlib32bd.lib
diff --git a/contrib/delphi/zlibd32.mak b/contrib/delphi/zlibd32.mak
new file mode 100644
index 0000000..88fafa0
--- /dev/null
+++ b/contrib/delphi/zlibd32.mak
@@ -0,0 +1,93 @@
+# Makefile for zlib
+# For use with Delphi and C++ Builder under Win32
+# Updated for zlib 1.2.x by Cosmin Truta
+
+# ------------ Borland C++ ------------
+
+# This project uses the Delphi (fastcall/register) calling convention:
+LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
+
+CC = bcc32
+LD = bcc32
+AR = tlib
+# do not use "-pr" in CFLAGS
+CFLAGS = -a -d -k- -O2 $(LOC)
+LDFLAGS =
+
+
+# variables
+ZLIB_LIB = zlib.lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
+OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj
+OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+	$(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: example.c zlib.h zconf.h
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+
+
+# For the sake of the old Borland make,
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+	-del $(ZLIB_LIB)
+	$(AR) $(ZLIB_LIB) $(OBJP1)
+	$(AR) $(ZLIB_LIB) $(OBJP2)
+
+
+# testing
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d
+
+example.exe: example.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+
+# cleanup
+clean:
+	-del *.obj
+	-del *.exe
+	-del *.lib
+	-del *.tds
+	-del zlib.bak
+	-del foo.gz
+
diff --git a/contrib/delphi/zlibdef.pas b/contrib/delphi/zlibdef.pas
deleted file mode 100644
index 4f96b7d..0000000
--- a/contrib/delphi/zlibdef.pas
+++ /dev/null
@@ -1,169 +0,0 @@
-unit zlibdef;
-
-interface
-
-uses
-  Windows;
-
-const
-  ZLIB_VERSION = '1.1.3';
-
-type
-  voidpf = Pointer;
-  int    = Integer;
-  uInt   = Cardinal;
-  pBytef = PChar;
-  uLong  = Cardinal;
-
-  alloc_func = function(opaque: voidpf; items, size: uInt): voidpf;
-                    stdcall;
-  free_func  = procedure(opaque, address: voidpf);
-                    stdcall;
-
-  internal_state = Pointer;
-
-  z_streamp = ^z_stream;
-  z_stream = packed record
-    next_in: pBytef;          // next input byte
-    avail_in: uInt;           // number of bytes available at next_in
-    total_in: uLong;          // total nb of input bytes read so far
-
-    next_out: pBytef;         // next output byte should be put there
-    avail_out: uInt;          // remaining free space at next_out
-    total_out: uLong;         // total nb of bytes output so far
-
-    msg: PChar;               // last error message, NULL if no error
-    state: internal_state;    // not visible by applications
-
-    zalloc: alloc_func;       // used to allocate the internal state
-    zfree: free_func;         // used to free the internal state
-    opaque: voidpf;           // private data object passed to zalloc and zfree
-
-    data_type: int;           // best guess about the data type: ascii or binary
-    adler: uLong;             // adler32 value of the uncompressed data
-    reserved: uLong;          // reserved for future use
-    end;
-
-const
-  Z_NO_FLUSH      = 0;
-  Z_SYNC_FLUSH    = 2;
-  Z_FULL_FLUSH    = 3;
-  Z_FINISH        = 4;
-
-  Z_OK            = 0;
-  Z_STREAM_END    = 1;
-
-  Z_NO_COMPRESSION         =  0;
-  Z_BEST_SPEED             =  1;
-  Z_BEST_COMPRESSION       =  9;
-  Z_DEFAULT_COMPRESSION    = -1;
-
-  Z_FILTERED            = 1;
-  Z_HUFFMAN_ONLY        = 2;
-  Z_DEFAULT_STRATEGY    = 0;
-
-  Z_BINARY   = 0;
-  Z_ASCII    = 1;
-  Z_UNKNOWN  = 2;
-
-  Z_DEFLATED    = 8;
-
-  MAX_MEM_LEVEL = 9;
-
-function adler32(adler: uLong; const buf: pBytef; len: uInt): uLong;
-             stdcall;
-function crc32(crc: uLong; const buf: pBytef; len: uInt): uLong;
-             stdcall;
-function deflate(strm: z_streamp; flush: int): int;
-             stdcall;
-function deflateCopy(dest, source: z_streamp): int;
-             stdcall;
-function deflateEnd(strm: z_streamp): int;
-             stdcall;
-function deflateInit2_(strm: z_streamp; level, method,
-                       windowBits, memLevel, strategy: int;
-                       const version: PChar; stream_size: int): int;
-             stdcall;
-function deflateInit_(strm: z_streamp; level: int;
-                      const version: PChar; stream_size: int): int;
-             stdcall;
-function deflateParams(strm: z_streamp; level, strategy: int): int;
-             stdcall;
-function deflateReset(strm: z_streamp): int;
-             stdcall;
-function deflateSetDictionary(strm: z_streamp;
-                              const dictionary: pBytef;
-                              dictLength: uInt): int;
-             stdcall;
-function inflate(strm: z_streamp; flush: int): int;
-             stdcall;
-function inflateEnd(strm: z_streamp): int;
-             stdcall;
-function inflateInit2_(strm: z_streamp; windowBits: int;
-                       const version: PChar; stream_size: int): int;
-             stdcall;
-function inflateInit_(strm: z_streamp; const version: PChar;
-                      stream_size: int): int;
-             stdcall;
-function inflateReset(strm: z_streamp): int;
-             stdcall;
-function inflateSetDictionary(strm: z_streamp;
-                              const dictionary: pBytef;
-                              dictLength: uInt): int;
-             stdcall;
-function inflateSync(strm: z_streamp): int;
-             stdcall;
-
-function deflateInit(strm: z_streamp; level: int): int;
-function deflateInit2(strm: z_streamp; level, method, windowBits,
-                      memLevel, strategy: int): int;
-function inflateInit(strm: z_streamp): int;
-function inflateInit2(strm: z_streamp; windowBits: int): int;
-
-implementation
-
-function deflateInit(strm: z_streamp; level: int): int;
-begin
-  Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function deflateInit2(strm: z_streamp; level, method, windowBits,
-                      memLevel, strategy: int): int;
-begin
-  Result := deflateInit2_(strm, level, method, windowBits, memLevel,
-                          strategy, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function inflateInit(strm: z_streamp): int;
-begin
-  Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
-end;
-
-function inflateInit2(strm: z_streamp; windowBits: int): int;
-begin
-  Result := inflateInit2_(strm, windowBits, ZLIB_VERSION,
-                          sizeof(z_stream));
-end;
-
-const
-  zlibDLL = 'png32bd.dll';
-
-function adler32; external zlibDLL;
-function crc32; external zlibDLL;
-function deflate; external zlibDLL;
-function deflateCopy; external zlibDLL;
-function deflateEnd; external zlibDLL;
-function deflateInit2_; external zlibDLL;
-function deflateInit_; external zlibDLL;
-function deflateParams; external zlibDLL;
-function deflateReset; external zlibDLL;
-function deflateSetDictionary; external zlibDLL;
-function inflate; external zlibDLL;
-function inflateEnd; external zlibDLL;
-function inflateInit2_; external zlibDLL;
-function inflateInit_; external zlibDLL;
-function inflateReset; external zlibDLL;
-function inflateSetDictionary; external zlibDLL;
-function inflateSync; external zlibDLL;
-
-end.
diff --git a/contrib/delphi2/d_zlib.bpr b/contrib/delphi2/d_zlib.bpr
deleted file mode 100644
index 78bb254..0000000
--- a/contrib/delphi2/d_zlib.bpr
+++ /dev/null
@@ -1,224 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = d_zlib.lib
-OBJFILES = d_zlib.obj adler32.obj deflate.obj infblock.obj infcodes.obj inffast.obj \
-  inflate.obj inftrees.obj infutil.obj trees.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = VCL35.lib
-SPARELIBS = VCL35.lib
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -O2 -Ve -d -k- -vi
-CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
-CFLAG3 = -ff -pr -5
-PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
-RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl 
-AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
-LFLAGS =
-IFLAGS = -g -Gn
-# ---------------------------------------------------------------------------
-ALLOBJ = c0w32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
-# ---------------------------------------------------------------------------
-!!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include
-Item1=$(BCB)\include;$(BCB)\include\vcl
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
- ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = TLib
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include;$(BCB)\include\vcl
-Item1=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/contrib/delphi2/d_zlib.cpp b/contrib/delphi2/d_zlib.cpp
deleted file mode 100644
index f5dea59..0000000
--- a/contrib/delphi2/d_zlib.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <condefs.h>
-#pragma hdrstop
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("deflate.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-//---------------------------------------------------------------------------
-#define Library
-
-// To add a file to the library use the Project menu 'Add to Project'.
-
diff --git a/contrib/delphi2/readme.txt b/contrib/delphi2/readme.txt
deleted file mode 100644
index cbd3162..0000000
--- a/contrib/delphi2/readme.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-These are files used to compile zlib under Borland C++ Builder 3.
-
-zlib.bpg is the main project group that can be loaded in the BCB IDE and
-loads all other *.bpr projects
-
-zlib.bpr is a project used to create a static zlib.lib library with C calling
-convention for functions.
-
-zlib32.bpr creates a zlib32.dll dynamic link library with Windows standard
-calling convention.
-
-d_zlib.bpr creates a set of .obj files with register calling convention.
-These files are used by zlib.pas to create a Delphi unit containing zlib.
-The d_zlib.lib file generated isn't useful and can be deleted.
-
-zlib.cpp, zlib32.cpp and d_zlib.cpp are used by the above projects.
-
diff --git a/contrib/delphi2/zlib.bpg b/contrib/delphi2/zlib.bpg
deleted file mode 100644
index b6c9acd..0000000
--- a/contrib/delphi2/zlib.bpg
+++ /dev/null
@@ -1,26 +0,0 @@
-#------------------------------------------------------------------------------
-VERSION = BWS.01
-#------------------------------------------------------------------------------
-!ifndef ROOT
-ROOT = $(MAKEDIR)\..
-!endif
-#------------------------------------------------------------------------------
-MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
-DCC = $(ROOT)\bin\dcc32.exe $**
-BRCC = $(ROOT)\bin\brcc32.exe $**
-#------------------------------------------------------------------------------
-PROJECTS = zlib zlib32 d_zlib
-#------------------------------------------------------------------------------
-default: $(PROJECTS)
-#------------------------------------------------------------------------------
-
-zlib: zlib.bpr
-  $(MAKE)
-
-zlib32: zlib32.bpr
-  $(MAKE)
-
-d_zlib: d_zlib.bpr
-  $(MAKE)
-
-
diff --git a/contrib/delphi2/zlib.bpr b/contrib/delphi2/zlib.bpr
deleted file mode 100644
index cf3945b..0000000
--- a/contrib/delphi2/zlib.bpr
+++ /dev/null
@@ -1,225 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = zlib.lib
-OBJFILES = zlib.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
-  infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
-  uncompr.obj zutil.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = VCL35.lib
-SPARELIBS = VCL35.lib
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -O2 -Ve -d -k- -vi
-CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
-CFLAG3 = -ff -5
-PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
-RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl 
-AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
-LFLAGS =
-IFLAGS = -g -Gn
-# ---------------------------------------------------------------------------
-ALLOBJ = c0w32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
-# ---------------------------------------------------------------------------
-!!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include
-Item1=$(BCB)\include;$(BCB)\include\vcl
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
- ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = TLib
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=0
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=2
-Item0=$(BCB)\include;$(BCB)\include\vcl
-Item1=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib\obj;$(BCB)\lib
-
-[HistoryLists\hlDebugSourcePath]
-Count=1
-Item0=$(BCB)\source\vcl
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/contrib/delphi2/zlib.cpp b/contrib/delphi2/zlib.cpp
deleted file mode 100644
index bf6953b..0000000
--- a/contrib/delphi2/zlib.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <condefs.h>
-#pragma hdrstop
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("compress.c");
-USEUNIT("crc32.c");
-USEUNIT("deflate.c");
-USEUNIT("gzio.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-USEUNIT("uncompr.c");
-USEUNIT("zutil.c");
-//---------------------------------------------------------------------------
-#define Library
-
-// To add a file to the library use the Project menu 'Add to Project'.
-
diff --git a/contrib/delphi2/zlib32.bpr b/contrib/delphi2/zlib32.bpr
deleted file mode 100644
index cabcec4..0000000
--- a/contrib/delphi2/zlib32.bpr
+++ /dev/null
@@ -1,174 +0,0 @@
-# ---------------------------------------------------------------------------
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-# ---------------------------------------------------------------------------
-# IDE SECTION
-# ---------------------------------------------------------------------------
-# The following section of the project makefile is managed by the BCB IDE.
-# It is recommended to use the IDE to change any of the values in this
-# section.
-# ---------------------------------------------------------------------------
-
-VERSION = BCB.03
-# ---------------------------------------------------------------------------
-PROJECT = zlib32.dll
-OBJFILES = zlib32.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
-  infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
-  uncompr.obj zutil.obj
-RESFILES =
-RESDEPEN = $(RESFILES)
-LIBFILES =
-LIBRARIES = 
-SPARELIBS = 
-DEFFILE =
-PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
-  dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
-  NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
-# ---------------------------------------------------------------------------
-PATHCPP = .;
-PATHASM = .;
-PATHPAS = .;
-PATHRC = .;
-DEBUGLIBPATH = $(BCB)\lib\debug
-RELEASELIBPATH = $(BCB)\lib\release
-# ---------------------------------------------------------------------------
-CFLAG1 = -WD -O2 -Ve -d -k- -vi -c -tWD
-CFLAG2 = -D_NO_VCL;ZLIB_DLL -I$(BCB)\include
-CFLAG3 = -ff -5
-PFLAGS = -D_NO_VCL;ZLIB_DLL -U$(BCB)\lib;$(RELEASELIBPATH) -I$(BCB)\include -$I- -v \
-  -JPHN -M
-RFLAGS = -D_NO_VCL;ZLIB_DLL -i$(BCB)\include
-AFLAGS = /i$(BCB)\include /d_NO_VCL /dZLIB_DLL /mx /w2 /zn
-LFLAGS = -L$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gi
-IFLAGS = -Gn -g
-# ---------------------------------------------------------------------------
-ALLOBJ = c0d32.obj $(OBJFILES)
-ALLRES = $(RESFILES)
-ALLLIB = $(LIBFILES)  import32.lib cw32mt.lib
-# ---------------------------------------------------------------------------
-!ifdef IDEOPTIONS
-
-[Version Info]
-IncludeVerInfo=0
-AutoIncBuild=0
-MajorVer=1
-MinorVer=0
-Release=0
-Build=0
-Debug=0
-PreRelease=0
-Special=0
-Private=0
-DLL=1
-Locale=1040
-CodePage=1252
-
-[Version Info Keys]
-CompanyName=
-FileDescription=DLL (GUI)
-FileVersion=1.0.0.0
-InternalName=
-LegalCopyright=
-LegalTrademarks=
-OriginalFilename=
-ProductName=
-ProductVersion=1.0.0.0
-Comments=
-
-[HistoryLists\hlIncludePath]
-Count=1
-Item0=$(BCB)\include
-
-[HistoryLists\hlLibraryPath]
-Count=1
-Item0=$(BCB)\lib
-
-[HistoryLists\hlConditionals]
-Count=1
-Item0=_NO_VCL;ZLIB_DLL
-
-[Debugging]
-DebugSourceDirs=
-
-[Parameters]
-RunParams=
-HostApplication=
-
-!endif
-
-# ---------------------------------------------------------------------------
-# MAKE SECTION
-# ---------------------------------------------------------------------------
-# This section of the project file is not used by the BCB IDE.  It is for
-# the benefit of building from the command-line using the MAKE utility.
-# ---------------------------------------------------------------------------
-
-.autodepend
-# ---------------------------------------------------------------------------
-!if !$d(BCC32)
-BCC32 = bcc32
-!endif
-
-!if !$d(DCC32)
-DCC32 = dcc32
-!endif
-
-!if !$d(TASM32)
-TASM32 = tasm32
-!endif
-
-!if !$d(LINKER)
-LINKER = ilink32
-!endif
-
-!if !$d(BRCC32)
-BRCC32 = brcc32
-!endif
-# ---------------------------------------------------------------------------
-!if $d(PATHCPP)
-.PATH.CPP = $(PATHCPP)
-.PATH.C   = $(PATHCPP)
-!endif
-
-!if $d(PATHPAS)
-.PATH.PAS = $(PATHPAS)
-!endif
-
-!if $d(PATHASM)
-.PATH.ASM = $(PATHASM)
-!endif
-
-!if $d(PATHRC)
-.PATH.RC  = $(PATHRC)
-!endif
-# ---------------------------------------------------------------------------
-$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
-    $(BCB)\BIN\$(LINKER) @&&!
-    $(LFLAGS) $(IFLAGS) +
-    $(ALLOBJ), +
-    $(PROJECT),, +
-    $(ALLLIB), +
-    $(DEFFILE), +
-    $(ALLRES)
-!
-# ---------------------------------------------------------------------------
-.pas.hpp:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.pas.obj:
-    $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
-
-.cpp.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.c.obj:
-    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
-
-.asm.obj:
-    $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
-
-.rc.res:
-    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
-# ---------------------------------------------------------------------------
diff --git a/contrib/delphi2/zlib32.cpp b/contrib/delphi2/zlib32.cpp
deleted file mode 100644
index 7372f6b..0000000
--- a/contrib/delphi2/zlib32.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-
-#include <windows.h>
-#pragma hdrstop
-#include <condefs.h>
-
-
-//---------------------------------------------------------------------------
-//   Important note about DLL memory management in a VCL DLL:
-//
-//
-//
-// If your DLL uses VCL and exports any functions that pass VCL String objects
-// (or structs/classes containing nested Strings) as parameter or function
-// results, you will need to build both your DLL project and any EXE projects
-// that use your DLL with the dynamic RTL (the RTL DLL).  This will change your
-// DLL and its calling EXE's to use BORLNDMM.DLL as their memory manager. In
-// these cases, the file BORLNDMM.DLL should be deployed along with your DLL
-// and the RTL DLL (CP3240MT.DLL). To avoid the requiring BORLNDMM.DLL in
-// these situations, pass string information using "char *" or ShortString
-// parameters and then link with the static RTL.
-//
-//---------------------------------------------------------------------------
-USEUNIT("adler32.c");
-USEUNIT("compress.c");
-USEUNIT("crc32.c");
-USEUNIT("deflate.c");
-USEUNIT("gzio.c");
-USEUNIT("infblock.c");
-USEUNIT("infcodes.c");
-USEUNIT("inffast.c");
-USEUNIT("inflate.c");
-USEUNIT("inftrees.c");
-USEUNIT("infutil.c");
-USEUNIT("trees.c");
-USEUNIT("uncompr.c");
-USEUNIT("zutil.c");
-//---------------------------------------------------------------------------
-#pragma argsused
-int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
-{
-        return 1;
-}
diff --git a/contrib/infback9/README b/contrib/infback9/README
new file mode 100644
index 0000000..e75ed13
--- /dev/null
+++ b/contrib/infback9/README
@@ -0,0 +1 @@
+See infback9.h for what this is and how to use it.
diff --git a/contrib/infback9/infback9.diff b/contrib/infback9/infback9.diff
new file mode 100644
index 0000000..cbe2e49
--- /dev/null
+++ b/contrib/infback9/infback9.diff
@@ -0,0 +1,427 @@
+*** infback.c	Mon Aug 11 16:48:06 2003
+--- infback9.c	Mon Sep  8 21:22:46 2003
+***************
+*** 1,19 ****
+! /* infback.c -- inflate using a call-back interface
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+  
+- /*
+-    This code is largely copied from inflate.c.  Normally either infback.o or
+-    inflate.o would be linked into an application--not both.  The interface
+-    with inffast.c is retained so that optimized assembler-coded versions of
+-    inflate_fast() can be used with either inflate.c or infback.c.
+-  */
+- 
+  #include "zutil.h"
+! #include "inftrees.h"
+  #include "inflate.h"
+- #include "inffast.h"
+  
+  /* function prototypes */
+  local void fixedtables OF((struct inflate_state FAR *state));
+--- 1,12 ----
+! /* infback9.c -- inflate deflate64 data using a call-back interface
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+  
+  #include "zutil.h"
+! #include "infback9.h"
+! #include "inftree9.h"
+  #include "inflate.h"
+  
+  /* function prototypes */
+  local void fixedtables OF((struct inflate_state FAR *state));
+***************
+*** 22,33 ****
+     strm provides memory allocation functions in zalloc and zfree, or
+     Z_NULL to use the library memory allocation functions.
+  
+!    windowBits is in the range 8..15, and window is a user-supplied
+!    window and output buffer that is 2**windowBits bytes.
+   */
+! int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
+  z_stream FAR *strm;
+- int windowBits;
+  unsigned char FAR *window;
+  const char *version;
+  int stream_size;
+--- 15,24 ----
+     strm provides memory allocation functions in zalloc and zfree, or
+     Z_NULL to use the library memory allocation functions.
+  
+!    window is a user-supplied window and output buffer that is 64K bytes.
+   */
+! int ZEXPORT inflateBack9Init_(strm, window, version, stream_size)
+  z_stream FAR *strm;
+  unsigned char FAR *window;
+  const char *version;
+  int stream_size;
+***************
+*** 37,44 ****
+      if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+          stream_size != (int)(sizeof(z_stream)))
+          return Z_VERSION_ERROR;
+!     if (strm == Z_NULL || window == Z_NULL ||
+!         windowBits < 8 || windowBits > 15)
+          return Z_STREAM_ERROR;
+      strm->msg = Z_NULL;                 /* in case we return an error */
+      if (strm->zalloc == (alloc_func)0) {
+--- 28,34 ----
+      if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+          stream_size != (int)(sizeof(z_stream)))
+          return Z_VERSION_ERROR;
+!     if (strm == Z_NULL || window == Z_NULL)
+          return Z_STREAM_ERROR;
+      strm->msg = Z_NULL;                 /* in case we return an error */
+      if (strm->zalloc == (alloc_func)0) {
+***************
+*** 51,58 ****
+      if (state == Z_NULL) return Z_MEM_ERROR;
+      Tracev((stderr, "inflate: allocated\n"));
+      strm->state = (voidpf)state;
+!     state->wbits = windowBits;
+!     state->wsize = 1U << windowBits;
+      state->window = window;
+      state->write = 0;
+      state->whave = 0;
+--- 41,48 ----
+      if (state == Z_NULL) return Z_MEM_ERROR;
+      Tracev((stderr, "inflate: allocated\n"));
+      strm->state = (voidpf)state;
+!     state->wbits = 16;
+!     state->wsize = 1U << 16;
+      state->window = window;
+      state->write = 0;
+      state->whave = 0;
+***************
+*** 91,110 ****
+          next = fixed;
+          lenfix = next;
+          bits = 9;
+!         inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+  
+          /* distance table */
+          sym = 0;
+          while (sym < 32) state->lens[sym++] = 5;
+          distfix = next;
+          bits = 5;
+!         inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+  
+          /* do this just once */
+          virgin = 0;
+      }
+  #else /* !BUILDFIXED */
+! #   include "inffixed.h"
+  #endif /* BUILDFIXED */
+      state->lencode = lenfix;
+      state->lenbits = 9;
+--- 81,100 ----
+          next = fixed;
+          lenfix = next;
+          bits = 9;
+!         inflate_table9(LENS, state->lens, 288, &(next), &(bits), state->work);
+  
+          /* distance table */
+          sym = 0;
+          while (sym < 32) state->lens[sym++] = 5;
+          distfix = next;
+          bits = 5;
+!         inflate_table9(DISTS, state->lens, 32, &(next), &(bits), state->work);
+  
+          /* do this just once */
+          virgin = 0;
+      }
+  #else /* !BUILDFIXED */
+! #   include "inffix9.h"
+  #endif /* BUILDFIXED */
+      state->lencode = lenfix;
+      state->lenbits = 9;
+***************
+*** 114,141 ****
+  
+  /* Macros for inflateBack(): */
+  
+- /* Load returned state from inflate_fast() */
+- #define LOAD() \
+-     do { \
+-         put = strm->next_out; \
+-         left = strm->avail_out; \
+-         next = strm->next_in; \
+-         have = strm->avail_in; \
+-         hold = state->hold; \
+-         bits = state->bits; \
+-     } while (0)
+- 
+- /* Set state from registers for inflate_fast() */
+- #define RESTORE() \
+-     do { \
+-         strm->next_out = put; \
+-         strm->avail_out = left; \
+-         strm->next_in = next; \
+-         strm->avail_in = have; \
+-         state->hold = hold; \
+-         state->bits = bits; \
+-     } while (0)
+- 
+  /* Clear the input bit accumulator */
+  #define INITBITS() \
+      do { \
+--- 104,109 ----
+***************
+*** 237,243 ****
+     inflateBack() can also return Z_STREAM_ERROR if the input parameters
+     are not correct, i.e. strm is Z_NULL or the state was not initialized.
+   */
+! int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
+  z_stream FAR *strm;
+  in_func in;
+  void FAR *in_desc;
+--- 205,211 ----
+     inflateBack() can also return Z_STREAM_ERROR if the input parameters
+     are not correct, i.e. strm is Z_NULL or the state was not initialized.
+   */
+! int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc)
+  z_stream FAR *strm;
+  in_func in;
+  void FAR *in_desc;
+***************
+*** 354,366 ****
+              DROPBITS(5);
+              state->ncode = BITS(4) + 4;
+              DROPBITS(4);
+! #ifndef PKZIP_BUG_WORKAROUND
+!             if (state->nlen > 286 || state->ndist > 30) {
+!                 strm->msg = (char *)"too many length or distance symbols";
+                  state->mode = BAD;
+                  break;
+              }
+- #endif
+              Tracev((stderr, "inflate:       table sizes ok\n"));
+  
+              /* get code length code lengths (not a typo) */
+--- 322,332 ----
+              DROPBITS(5);
+              state->ncode = BITS(4) + 4;
+              DROPBITS(4);
+!             if (state->nlen > 286) {
+!                 strm->msg = (char *)"too many length symbols";
+                  state->mode = BAD;
+                  break;
+              }
+              Tracev((stderr, "inflate:       table sizes ok\n"));
+  
+              /* get code length code lengths (not a typo) */
+***************
+*** 375,381 ****
+              state->next = state->codes;
+              state->lencode = (code const FAR *)(state->next);
+              state->lenbits = 7;
+!             ret = inflate_table(CODES, state->lens, 19, &(state->next),
+                                  &(state->lenbits), state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid code lengths set";
+--- 341,347 ----
+              state->next = state->codes;
+              state->lencode = (code const FAR *)(state->next);
+              state->lenbits = 7;
+!             ret = inflate_table9(CODES, state->lens, 19, &(state->next),
+                                  &(state->lenbits), state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid code lengths set";
+***************
+*** 438,445 ****
+              state->next = state->codes;
+              state->lencode = (code const FAR *)(state->next);
+              state->lenbits = 9;
+!             ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+!                                 &(state->lenbits), state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid literal/lengths set";
+                  state->mode = BAD;
+--- 404,411 ----
+              state->next = state->codes;
+              state->lencode = (code const FAR *)(state->next);
+              state->lenbits = 9;
+!             ret = inflate_table9(LENS, state->lens, state->nlen,
+!                             &(state->next), &(state->lenbits), state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid literal/lengths set";
+                  state->mode = BAD;
+***************
+*** 447,454 ****
+              }
+              state->distcode = (code const FAR *)(state->next);
+              state->distbits = 6;
+!             ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+!                             &(state->next), &(state->distbits), state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid distances set";
+                  state->mode = BAD;
+--- 413,421 ----
+              }
+              state->distcode = (code const FAR *)(state->next);
+              state->distbits = 6;
+!             ret = inflate_table9(DISTS, state->lens + state->nlen,
+!                             state->ndist, &(state->next), &(state->distbits),
+!                             state->work);
+              if (ret) {
+                  strm->msg = (char *)"invalid distances set";
+                  state->mode = BAD;
+***************
+*** 458,473 ****
+              state->mode = LEN;
+  
+          case LEN:
+-             /* use inflate_fast() if we have enough input and output */
+-             if (have >= 6 && left >= 258) {
+-                 RESTORE();
+-                 if (state->whave < state->wsize)
+-                     state->whave = state->wsize - left;
+-                 inflate_fast(strm, state->wsize);
+-                 LOAD();
+-                 break;
+-             }
+- 
+              /* get a literal, length, or end-of-block code */
+              for (;;) {
+                  this = state->lencode[BITS(state->lenbits)];
+--- 425,430 ----
+***************
+*** 607,613 ****
+      return ret;
+  }
+  
+! int ZEXPORT inflateBackEnd(strm)
+  z_stream FAR *strm;
+  {
+      if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+--- 564,570 ----
+      return ret;
+  }
+  
+! int ZEXPORT inflateBack9End(strm)
+  z_stream FAR *strm;
+  {
+      if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+*** inftrees.c	Sun Sep  7 10:59:10 2003
+--- inftree9.c	Mon Sep  8 20:54:36 2003
+***************
+*** 1,15 ****
+! /* inftrees.c -- generate Huffman trees for efficient decoding
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+  
+  #include "zutil.h"
+! #include "inftrees.h"
+  
+  #define MAXBITS 15
+  
+! const char inflate_copyright[] =
+!    " inflate 1.2.0.5 Copyright 1995-2003 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
+--- 1,15 ----
+! /* inftree9.c -- generate Huffman trees for efficient decoding
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+  
+  #include "zutil.h"
+! #include "inftree9.h"
+  
+  #define MAXBITS 15
+  
+! const char inflate9_copyright[] =
+!    " inflate9 1.2.0.5 Copyright 1995-2003 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
+***************
+*** 29,35 ****
+     table index bits.  It will differ if the request is greater than the
+     longest code or if it is less than the shortest code.
+   */
+! int inflate_table(type, lens, codes, table, bits, work)
+  codetype type;
+  unsigned short FAR *lens;
+  unsigned codes;
+--- 29,35 ----
+     table index bits.  It will differ if the request is greater than the
+     longest code or if it is less than the shortest code.
+   */
+! int inflate_table9(type, lens, codes, table, bits, work)
+  codetype type;
+  unsigned short FAR *lens;
+  unsigned codes;
+***************
+*** 59,76 ****
+      unsigned short offs[MAXBITS+1];     /* offsets in table for each length */
+      static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+          3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+!         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+      static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+          16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+!         19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 192, 78};
+!     static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
+          1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+          257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+!         8193, 12289, 16385, 24577, 0, 0};
+!     static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
+          16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+          23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+!         28, 28, 29, 29, 64, 64};
+  
+      /*
+         Process a set of code lengths to create a canonical Huffman code.  The
+--- 59,76 ----
+      unsigned short offs[MAXBITS+1];     /* offsets in table for each length */
+      static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+          3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+!         35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 3, 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, 32, 192, 78};
+!     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, 4097, 6145,
+!         8193, 12289, 16385, 24577, 32769, 49153};
+!     static const unsigned short dext[32] = { /* Distance codes 0..31 extra */
+          16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+          23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+!         28, 28, 29, 29, 30, 30};
+  
+      /*
+         Process a set of code lengths to create a canonical Huffman code.  The
+*** inftrees.h	Sun Aug 10 15:15:50 2003
+--- inftree9.h	Mon Sep  8 20:54:51 2003
+***************
+*** 1,4 ****
+! /* inftrees.h -- header to use inftrees.c
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+--- 1,4 ----
+! /* inftree9.h -- header to use inftree9.c
+   * Copyright (C) 1995-2003 Mark Adler
+   * For conditions of distribution and use, see copyright notice in zlib.h
+   */
+***************
+*** 50,55 ****
+      DISTS
+  } codetype;
+  
+! extern int inflate_table OF((codetype type, unsigned short FAR *lens,
+                               unsigned codes, code FAR * FAR *table,
+                               unsigned FAR *bits, unsigned short FAR *work));
+--- 50,55 ----
+      DISTS
+  } codetype;
+  
+! extern int inflate_table9 OF((codetype type, unsigned short FAR *lens,
+                               unsigned codes, code FAR * FAR *table,
+                               unsigned FAR *bits, unsigned short FAR *work));
diff --git a/contrib/infback9/infback9.h b/contrib/infback9/infback9.h
new file mode 100644
index 0000000..fb7c73e
--- /dev/null
+++ b/contrib/infback9/infback9.h
@@ -0,0 +1,26 @@
+/* infback9.h -- header for using inflateBack9 functions
+ * Copyright (C) 2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * This header file and associated patches provide a decoder for PKWare's
+ * undocumented deflate64 compression method (method 9).  Use with infback9.c,
+ * inftree9.h, inftree9.c, and inffix9.h.  These patches are not supported.
+ * This code will almost certainly not work on 16-bit architectures.  See the
+ * comments in zlib.h for inflateBack() usage.  These functions are used
+ * identically, except that there is no windowBits parameter, and a 64K
+ * window must be provided.  zlib.h must be included before this header file.
+ */
+
+ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm,
+                                    in_func in, void FAR *in_desc,
+                                    out_func out, void FAR *out_desc));
+ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm));
+ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm,
+                                         unsigned char FAR *window,
+                                         const char *version,
+                                         int stream_size));
+#define inflateBack9Init(strm, window) \
+        inflateBack9Init_((strm), (window), \
+        ZLIB_VERSION, sizeof(z_stream))
diff --git a/contrib/infback9/inffix9.h b/contrib/infback9/inffix9.h
new file mode 100644
index 0000000..8476588
--- /dev/null
+++ b/contrib/infback9/inffix9.h
@@ -0,0 +1,94 @@
+    /* inffix9.h -- table for decoding fixed codes
+     * Generated automatically by makefixed().
+     */
+
+    /* WARNING: this file should *not* be used by applications.
+       It is part of the implementation of this library and is
+       subject to change. Applications should only use zlib.h.
+     */
+
+    static const code lenfix[512] = {
+        {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+        {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+        {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+        {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+        {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+        {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+        {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+        {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+        {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+        {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+        {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+        {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+        {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+        {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+        {0,8,22},{192,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+        {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+        {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+        {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+        {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+        {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+        {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+        {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+        {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+        {0,8,85},{0,8,21},{32,8,3},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+        {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+        {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+        {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+        {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+        {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+        {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+        {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+        {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+        {16,7,5},{0,8,87},{0,8,23},{78,8,0},{19,7,51},{0,8,119},{0,8,55},
+        {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+        {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+        {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+        {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+        {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+        {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+        {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+        {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+        {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+        {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+        {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+        {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+        {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+        {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+        {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+        {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+        {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+        {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{192,8,0},{19,7,51},
+        {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+        {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+        {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+        {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+        {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+        {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+        {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+        {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+        {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{32,8,3},
+        {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+        {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+        {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+        {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+        {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+        {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+        {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+        {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+        {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+        {78,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+        {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+        {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+        {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+        {0,9,255}
+    };
+
+    static const code distfix[32] = {
+        {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+        {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+        {18,5,9},{26,5,2049},{22,5,129},{30,5,32769},{16,5,2},{23,5,385},
+        {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+        {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+        {22,5,193},{30,5,49153}
+    };
diff --git a/contrib/inflate86/inffast.S b/contrib/inflate86/inffast.S
index 3602907..f9bffd5 100644
--- a/contrib/inflate86/inffast.S
+++ b/contrib/inflate86/inffast.S
@@ -3,11 +3,11 @@
  *
  * inffast.c -- fast decoding
  * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  *
  * Copyright (C) 2003 Chris Anderson <christop@charm.net>
  * Please use the copyright conditions above.
- * 
+ *
  * This version (Jan-23-2003) of inflate_fast was coded and tested under
  * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution.  On that
  * machine, I found that gzip style archives decompressed about 20% faster than
@@ -61,7 +61,7 @@
  */
 #if ! defined( GAS_COFF ) && ! defined( GAS_ELF )
 
-#if defined( __CYGWIN__ )
+#if defined( WIN32 ) || defined( __CYGWIN__ )
 #define GAS_COFF /* windows object format */
 #else
 #define GAS_ELF
@@ -151,14 +151,14 @@
  */
 #define mode_state     0   /* state->mode */
 #define wsize_state    32  /* state->wsize */
-#define write_state    36  /* state->write */
-#define window_state   40  /* state->window */
-#define hold_state     44  /* state->hold */
-#define bits_state     48  /* state->bits */
-#define lencode_state  64  /* state->lencode */
-#define distcode_state 68  /* state->distcode */
-#define lenbits_state  72  /* state->lenbits */
-#define distbits_state 76  /* state->distbits */
+#define write_state    40  /* state->write */
+#define window_state   44  /* state->window */
+#define hold_state     48  /* state->hold */
+#define bits_state     52  /* state->bits */
+#define lencode_state  68  /* state->lencode */
+#define distcode_state 72  /* state->distcode */
+#define lenbits_state  76  /* state->lenbits */
+#define distbits_state 80  /* state->distbits */
 
 /*
  * inflate_fast's activation record
@@ -387,7 +387,7 @@
                                    * bios may load a cpuid instruction and
                                    * cpuid may be disabled on Cyrix 5-6x86 */
         popf
-        pushf   
+        pushf
         popl    %edx              /* copy new eflags to edx */
         xorl    %eax, %edx        /* test if ID bit is flipped */
         jz      .L_dont_use_mmx   /* not flipped if zero */
@@ -420,7 +420,7 @@
         popl    %eax
         jmp     .L_check_mmx
 #endif
-        
+
 
 /*** Non-MMX code ***/
 
@@ -443,7 +443,7 @@
 .L_do_loop:
         /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
          *
-         * do { 
+         * do {
          *   if (bits < 15) {
          *     hold |= *((unsigned short *)in)++ << bits;
          *     bits += 16
@@ -900,7 +900,7 @@
 #define dmask_mm  %mm5
 #define tmp_mm    %mm6
 
-        movd    lmask(%esp), lmask_mm 
+        movd    lmask(%esp), lmask_mm
         movq    lmask_mm, lmask2_mm
         movd    dmask(%esp), dmask_mm
         movq    dmask_mm, dmask2_mm
@@ -1056,7 +1056,7 @@
         jmp     .L_while_test_mmx
 
 .align 16,0x90
-.L_test_for_second_level_length_mmx: 
+.L_test_for_second_level_length_mmx:
         testb   $64, %al
         jnz     .L_test_for_end_of_block  /* if ((op & 64) != 0) */
 
diff --git a/contrib/iostream/zfstream.cpp b/contrib/iostream/zfstream.cpp
index a690bbe..d0cd85f 100644
--- a/contrib/iostream/zfstream.cpp
+++ b/contrib/iostream/zfstream.cpp
@@ -1,5 +1,4 @@
 
-#include <memory.h>
 #include "zfstream.h"
 
 gzfilebuf::gzfilebuf() :
@@ -17,15 +16,13 @@
 }
 
 gzfilebuf *gzfilebuf::open( const char *name,
-			    int io_mode ) {
+                            int io_mode ) {
 
   if ( is_open() )
     return NULL;
 
   char char_mode[10];
-  char *p;
-  memset(char_mode,'\0',10);
-  p = char_mode;
+  char *p = char_mode;
 
   if ( io_mode & ios::in ) {
     mode = ios::in;
@@ -48,6 +45,9 @@
     *p++ = '9';
   }
 
+  // Put the end-of-string indicator
+  *p = '\0';
+
   if ( (file = gzopen(name, char_mode)) == NULL )
     return NULL;
 
@@ -58,15 +58,13 @@
 }
 
 gzfilebuf *gzfilebuf::attach( int file_descriptor,
-			      int io_mode ) {
+                              int io_mode ) {
 
   if ( is_open() )
     return NULL;
 
   char char_mode[10];
-  char *p;
-  memset(char_mode,'\0',10);
-  p = char_mode;
+  char *p = char_mode;
 
   if ( io_mode & ios::in ) {
     mode = ios::in;
@@ -89,6 +87,9 @@
     *p++ = '9';
   }
 
+  // Put the end-of-string indicator
+  *p = '\0';
+
   if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
     return NULL;
 
@@ -112,13 +113,13 @@
 
 }
 
-int gzfilebuf::setcompressionlevel( short comp_level ) {
+int gzfilebuf::setcompressionlevel( int comp_level ) {
 
   return gzsetparams(file, comp_level, -2);
 
 }
 
-int gzfilebuf::setcompressionstrategy( short comp_strategy ) {
+int gzfilebuf::setcompressionstrategy( int comp_strategy ) {
 
   return gzsetparams(file, -2, comp_strategy);
 
@@ -151,7 +152,7 @@
 
     if ( out_waiting() ) {
       if ( flushbuf() == EOF )
-	return EOF;
+        return EOF;
     }
 
   }
@@ -180,11 +181,11 @@
     setg(0,0,0);
   } else {
     if (in_avail()) {
-	return EOF;
+        return EOF;
     }
     if (out_waiting()) {
       if (flushbuf() == EOF)
-	return EOF;
+        return EOF;
     }
   }
 
@@ -282,12 +283,11 @@
 
 }
 
-gzfilebuf *gzfilestream_common::rdbuf() {
-
+gzfilebuf *gzfilestream_common::rdbuf()
+{
   return &buffer;
-
 }
-     
+
 gzifstream::gzifstream() :
   ios( gzfilestream_common::rdbuf() )
 {
diff --git a/contrib/iostream/zfstream.h b/contrib/iostream/zfstream.h
index c87fa08..ed79098 100644
--- a/contrib/iostream/zfstream.h
+++ b/contrib/iostream/zfstream.h
@@ -1,6 +1,6 @@
 
-#ifndef _zfstream_h
-#define _zfstream_h
+#ifndef zfstream_h
+#define zfstream_h
 
 #include <fstream.h>
 #include "zlib.h"
@@ -16,8 +16,8 @@
   gzfilebuf *attach( int file_descriptor, int io_mode );
   gzfilebuf *close();
 
-  int setcompressionlevel( short comp_level );
-  int setcompressionstrategy( short comp_strategy );
+  int setcompressionlevel( int comp_level );
+  int setcompressionstrategy( int comp_strategy );
 
   inline int is_open() const { return (file !=NULL); }
 
@@ -98,18 +98,19 @@
   T val;
 };
 
-template<class T> gzofstream &operator<<(gzofstream &s,
-					 const gzomanip<T> &m) {
+template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
+{
   return (*m.func)(s, m.val);
-  
 }
 
-inline gzofstream &setcompressionlevel( gzofstream &s, int l ) {
+inline gzofstream &setcompressionlevel( gzofstream &s, int l )
+{
   (s.rdbuf())->setcompressionlevel(l);
   return s;
 }
 
-inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) {
+inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
+{
   (s.rdbuf())->setcompressionstrategy(l);
   return s;
 }
@@ -125,18 +126,3 @@
 }
 
 #endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/contrib/iostream2/zstream_test.cpp b/contrib/iostream2/zstream_test.cpp
index 5bbd56c..6273f62 100644
--- a/contrib/iostream2/zstream_test.cpp
+++ b/contrib/iostream2/zstream_test.cpp
@@ -4,9 +4,9 @@
 #include <iomanip.h>
 
 void main() {
-	char h[256] = "Hello";
-	char* g = "Goodbye";
-	ozstream out("temp.gz");
+    char h[256] = "Hello";
+    char* g = "Goodbye";
+    ozstream out("temp.gz");
     out < "This works well" < h < g;
     out.close();
 
diff --git a/contrib/iostream3/README b/contrib/iostream3/README
index 6f73d58..f7b319a 100644
--- a/contrib/iostream3/README
+++ b/contrib/iostream3/README
@@ -3,19 +3,19 @@
 
   gzofstream outf("blah.gz");
   outf << "These go into the gzip file " << 123 << endl;
-  
+
 It does this by deriving a specialized stream buffer for gzipped files, which is
-the way Stroustrup would have done it. :-> 
+the way Stroustrup would have done it. :->
 
 The gzifstream and gzofstream classes were originally written by Kevin Ruland
 and made available in the zlib contrib/iostream directory. The older version still
-compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of 
+compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of
 this version.
 
-The new classes are as standard-compliant as possible, closely following the 
-approach of the standard library's fstream classes. It compiles under gcc versions 
-3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard 
-library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs 
+The new classes are as standard-compliant as possible, closely following the
+approach of the standard library's fstream classes. It compiles under gcc versions
+3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard
+library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs
 from the previous one in the following respects:
 - added showmanyc
 - added setbuf, with support for unbuffered output via setbuf(0,0)
@@ -23,7 +23,7 @@
 - gzipped output file opened with default compression level instead of maximum level
 - setcompressionlevel()/strategy() members replaced by single setcompression()
 
-The code is provided "as is", with the permission to use, copy, modify, distribute 
+The code is provided "as is", with the permission to use, copy, modify, distribute
 and sell it for any purpose without fee.
 
 Ludwig Schwardt
diff --git a/contrib/iostream3/TODO b/contrib/iostream3/TODO
index 4578326..7032f97 100644
--- a/contrib/iostream3/TODO
+++ b/contrib/iostream3/TODO
@@ -13,5 +13,5 @@
 - Check public interface to see which calls give problems
   (due to dependence on library internals)
 
-- Override operator<<(ostream&, gzfilebuf*) to allow direct copying 
+- Override operator<<(ostream&, gzfilebuf*) to allow direct copying
   of stream buffer to stream ( i.e. os << is.rdbuf(); )
diff --git a/contrib/iostream3/test.cc b/contrib/iostream3/test.cc
index 9ffa8be..9423533 100644
--- a/contrib/iostream3/test.cc
+++ b/contrib/iostream3/test.cc
@@ -1,6 +1,6 @@
 /*
  * Test program for gzifstream and gzofstream
- * 
+ *
  * by Ludwig Schwardt <schwardt@sun.ac.za>
  * original version by Kevin Ruland <kevin@rodin.wustl.edu>
  */
@@ -13,15 +13,15 @@
   gzofstream outf;
   gzifstream inf;
   char buf[80];
-  
+
   outf.open("test1.txt.gz");
-  outf << "The quick brown fox sidestepped the lazy canine\n" 
+  outf << "The quick brown fox sidestepped the lazy canine\n"
        << 1.3 << "\nPlan " << 9 << std::endl;
   outf.close();
   std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n"
             << "The quick brown fox sidestepped the lazy canine\n"
             << 1.3 << "\nPlan " << 9 << std::endl;
-  
+
   std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n";
   inf.open("test1.txt.gz");
   while (inf.getline(buf,80,'\n')) {
diff --git a/contrib/iostream3/zfstream.cc b/contrib/iostream3/zfstream.cc
index 24d15fa..94eb933 100644
--- a/contrib/iostream3/zfstream.cc
+++ b/contrib/iostream3/zfstream.cc
@@ -1,9 +1,9 @@
 /*
  * A C++ I/O streams interface to the zlib gz* functions
- * 
+ *
  * by Ludwig Schwardt <schwardt@sun.ac.za>
  * original version by Kevin Ruland <kevin@rodin.wustl.edu>
- * 
+ *
  * This version is standard-compliant and compatible with gcc 3.x.
  */
 
@@ -18,8 +18,8 @@
 /*****************************************************************************/
 
 // Default constructor
-gzfilebuf::gzfilebuf() 
-: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), 
+gzfilebuf::gzfilebuf()
+: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false),
   buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true)
 {
   // No buffers to start with
@@ -27,12 +27,12 @@
 }
 
 // Destructor
-gzfilebuf::~gzfilebuf() 
+gzfilebuf::~gzfilebuf()
 {
   // Sync output buffer and close only if responsible for file
   // (i.e. attached streams should be left open at this stage)
   this->sync();
-  if (own_fd) 
+  if (own_fd)
     this->close();
   // Make sure internal buffer is deallocated
   this->disable_buffer();
@@ -41,30 +41,30 @@
 // Set compression level and strategy
 int
 gzfilebuf::setcompression(int comp_level,
-			  int comp_strategy)
+                          int comp_strategy)
 {
   return gzsetparams(file, comp_level, comp_strategy);
 }
 
 // Open gzipped file
-gzfilebuf* 
-gzfilebuf::open(const char *name, 
-		std::ios_base::openmode mode)
+gzfilebuf*
+gzfilebuf::open(const char *name,
+                std::ios_base::openmode mode)
 {
   // Fail if file already open
-  if (this->is_open()) 
+  if (this->is_open())
     return NULL;
   // Don't support simultaneous read/write access (yet)
-  if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) 
+  if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
     return NULL;
-  
+
   // Build mode string for gzopen and check it [27.8.1.3.2]
   char char_mode[6] = "\0\0\0\0\0";
   if (!this->open_mode(mode, char_mode))
     return NULL;
-  
+
   // Attempt to open file
-  if ((file = gzopen(name, char_mode)) == NULL) 
+  if ((file = gzopen(name, char_mode)) == NULL)
     return NULL;
 
   // On success, allocate internal buffer and set flags
@@ -77,24 +77,24 @@
 // Attach to gzipped file
 gzfilebuf*
 gzfilebuf::attach(int fd,
-		  std::ios_base::openmode mode) 
+                  std::ios_base::openmode mode)
 {
   // Fail if file already open
-  if (this->is_open()) 
+  if (this->is_open())
     return NULL;
   // Don't support simultaneous read/write access (yet)
-  if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) 
+  if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
     return NULL;
-  
+
   // Build mode string for gzdopen and check it [27.8.1.3.2]
   char char_mode[6] = "\0\0\0\0\0";
   if (!this->open_mode(mode, char_mode))
     return NULL;
-  
+
   // Attempt to attach to file
   if ((file = gzdopen(fd, char_mode)) == NULL)
     return NULL;
-  
+
   // On success, allocate internal buffer and set flags
   this->enable_buffer();
   io_mode = mode;
@@ -104,7 +104,7 @@
 
 // Close gzipped file
 gzfilebuf*
-gzfilebuf::close() 
+gzfilebuf::close()
 {
   // Fail immediately if no file is open
   if (!this->is_open())
@@ -127,16 +127,16 @@
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 // Convert int open mode to mode string
-bool 
-gzfilebuf::open_mode(std::ios_base::openmode mode, 
-		     char* c_mode) const
+bool
+gzfilebuf::open_mode(std::ios_base::openmode mode,
+                     char* c_mode) const
 {
   bool testb = mode & std::ios_base::binary;
   bool testi = mode & std::ios_base::in;
   bool testo = mode & std::ios_base::out;
   bool testt = mode & std::ios_base::trunc;
   bool testa = mode & std::ios_base::app;
-      
+
   // Check for valid flag combinations - see [27.8.1.3.2] (Table 92)
   // Original zfstream hardcoded the compression level to maximum here...
   // Double the time for less than 1% size improvement seems
@@ -156,7 +156,7 @@
 //  if (testi && testo && testt && !testa)
 //    strcpy(c_mode, "w+");
 
-  // Mode string should be empty for invalid combination of flags    
+  // Mode string should be empty for invalid combination of flags
   if (strlen(c_mode) == 0)
     return false;
   if (testb)
@@ -165,7 +165,7 @@
 }
 
 // Determine number of characters in internal get buffer
-std::streamsize 
+std::streamsize
 gzfilebuf::showmanyc()
 {
   // Calls to underflow will fail if file not opened for reading
@@ -180,10 +180,10 @@
 
 // Fill get area from gzipped file
 gzfilebuf::int_type
-gzfilebuf::underflow() 
+gzfilebuf::underflow()
 {
   // If something is left in the get area by chance, return it
-  // (this shouldn't normally happen, as underflow is only supposed 
+  // (this shouldn't normally happen, as underflow is only supposed
   // to be called when gptr >= egptr, but it serves as error check)
   if (this->gptr() && (this->gptr() < this->egptr()))
     return traits_type::to_int_type(*(this->gptr()));
@@ -204,14 +204,14 @@
   }
   // Make all bytes read from file available as get area
   this->setg(buffer, buffer, buffer + bytes_read);
-  
+
   // Return next character in get area
   return traits_type::to_int_type(*(this->gptr()));
 }
 
 // Write put area to gzipped file
 gzfilebuf::int_type
-gzfilebuf::overflow(int_type c) 
+gzfilebuf::overflow(int_type c)
 {
   // Determine whether put area is in use
   if (this->pbase())
@@ -232,10 +232,10 @@
     {
       // If the file hasn't been opened for writing, produce error
       if (!this->is_open() || !(io_mode & std::ios_base::out))
-	return traits_type::eof();
+        return traits_type::eof();
       // If gzipped file won't accept all bytes written to it, fail
       if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write)
-	return traits_type::eof();
+        return traits_type::eof();
       // Reset next pointer to point to pbase on success
       this->pbump(-bytes_to_write);
     }
@@ -250,7 +250,7 @@
     char_type last_char = traits_type::to_char_type(c);
     // If gzipped file won't accept this character, fail
     if (gzwrite(file, &last_char, 1) != 1)
-      return traits_type::eof();      
+      return traits_type::eof();
   }
 
   // If you got here, you have succeeded (even if c was EOF)
@@ -262,9 +262,9 @@
 }
 
 // Assign new buffer
-std::streambuf* 
+std::streambuf*
 gzfilebuf::setbuf(char_type* p,
-		  std::streamsize n)
+                  std::streamsize n)
 {
   // First make sure stuff is sync'ed, for safety
   if (this->sync() == -1)
@@ -295,8 +295,8 @@
 }
 
 // Write put area to gzipped file (i.e. ensures that put area is empty)
-int 
-gzfilebuf::sync() 
+int
+gzfilebuf::sync()
 {
   return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0;
 }
@@ -304,11 +304,11 @@
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 // Allocate internal buffer
-void 
-gzfilebuf::enable_buffer() 
+void
+gzfilebuf::enable_buffer()
 {
   // If internal buffer required, allocate one
-  if (own_buffer && !buffer) 
+  if (own_buffer && !buffer)
   {
     // Check for buffered vs. "unbuffered"
     if (buffer_size > 0)
@@ -335,16 +335,16 @@
   }
   else
   {
-    // If buffer already allocated, reset buffer pointers just to make sure no 
+    // If buffer already allocated, reset buffer pointers just to make sure no
     // stale chars are lying around
     this->setg(buffer, buffer, buffer);
     this->setp(buffer, buffer + buffer_size - 1);
-  }  
+  }
 }
 
 // Destroy internal buffer
-void 
-gzfilebuf::disable_buffer() 
+void
+gzfilebuf::disable_buffer()
 {
   // If internal buffer exists, deallocate it
   if (own_buffer && buffer)
@@ -371,13 +371,13 @@
 /*****************************************************************************/
 
 // Default constructor initializes stream buffer
-gzifstream::gzifstream() 
+gzifstream::gzifstream()
 : std::istream(NULL), sb()
 { this->init(&sb); }
 
 // Initialize stream buffer and open file
 gzifstream::gzifstream(const char* name,
-		       std::ios_base::openmode mode)
+                       std::ios_base::openmode mode)
 : std::istream(NULL), sb()
 {
   this->init(&sb);
@@ -386,7 +386,7 @@
 
 // Initialize stream buffer and attach to file
 gzifstream::gzifstream(int fd,
-		       std::ios_base::openmode mode)
+                       std::ios_base::openmode mode)
 : std::istream(NULL), sb()
 {
   this->init(&sb);
@@ -394,9 +394,9 @@
 }
 
 // Open file and go into fail() state if unsuccessful
-void 
-gzifstream::open(const char* name, 
-		 std::ios_base::openmode mode)
+void
+gzifstream::open(const char* name,
+                 std::ios_base::openmode mode)
 {
   if (!sb.open(name, mode | std::ios_base::in))
     this->setstate(std::ios_base::failbit);
@@ -405,9 +405,9 @@
 }
 
 // Attach to file and go into fail() state if unsuccessful
-void 
-gzifstream::attach(int fd, 
-		   std::ios_base::openmode mode)
+void
+gzifstream::attach(int fd,
+                   std::ios_base::openmode mode)
 {
   if (!sb.attach(fd, mode | std::ios_base::in))
     this->setstate(std::ios_base::failbit);
@@ -416,7 +416,7 @@
 }
 
 // Close file
-void 
+void
 gzifstream::close()
 {
   if (!sb.close())
@@ -426,13 +426,13 @@
 /*****************************************************************************/
 
 // Default constructor initializes stream buffer
-gzofstream::gzofstream() 
+gzofstream::gzofstream()
 : std::ostream(NULL), sb()
 { this->init(&sb); }
 
 // Initialize stream buffer and open file
 gzofstream::gzofstream(const char* name,
-		       std::ios_base::openmode mode)
+                       std::ios_base::openmode mode)
 : std::ostream(NULL), sb()
 {
   this->init(&sb);
@@ -441,7 +441,7 @@
 
 // Initialize stream buffer and attach to file
 gzofstream::gzofstream(int fd,
-		       std::ios_base::openmode mode)
+                       std::ios_base::openmode mode)
 : std::ostream(NULL), sb()
 {
   this->init(&sb);
@@ -449,9 +449,9 @@
 }
 
 // Open file and go into fail() state if unsuccessful
-void 
-gzofstream::open(const char* name, 
-		 std::ios_base::openmode mode)
+void
+gzofstream::open(const char* name,
+                 std::ios_base::openmode mode)
 {
   if (!sb.open(name, mode | std::ios_base::out))
     this->setstate(std::ios_base::failbit);
@@ -460,9 +460,9 @@
 }
 
 // Attach to file and go into fail() state if unsuccessful
-void 
-gzofstream::attach(int fd, 
-		   std::ios_base::openmode mode)
+void
+gzofstream::attach(int fd,
+                   std::ios_base::openmode mode)
 {
   if (!sb.attach(fd, mode | std::ios_base::out))
     this->setstate(std::ios_base::failbit);
@@ -471,7 +471,7 @@
 }
 
 // Close file
-void 
+void
 gzofstream::close()
 {
   if (!sb.close())
diff --git a/contrib/iostream3/zfstream.h b/contrib/iostream3/zfstream.h
index ad76e8b..8574479 100644
--- a/contrib/iostream3/zfstream.h
+++ b/contrib/iostream3/zfstream.h
@@ -1,9 +1,9 @@
 /*
  * A C++ I/O streams interface to the zlib gz* functions
- * 
+ *
  * by Ludwig Schwardt <schwardt@sun.ac.za>
  * original version by Kevin Ruland <kevin@rodin.wustl.edu>
- * 
+ *
  * This version is standard-compliant and compatible with gcc 3.x.
  */
 
@@ -20,204 +20,204 @@
  *  @brief  Gzipped file stream buffer class.
  *
  *  This class implements basic_filebuf for gzipped files. It doesn't yet support
- *  seeking (allowed by zlib but slow/limited), putback and read/write access 
- *  (tricky). Otherwise, it attempts to be a drop-in replacement for the standard 
+ *  seeking (allowed by zlib but slow/limited), putback and read/write access
+ *  (tricky). Otherwise, it attempts to be a drop-in replacement for the standard
  *  file streambuf.
 */
-class gzfilebuf : public std::streambuf 
+class gzfilebuf : public std::streambuf
 {
-public:   
+public:
   //  Default constructor.
   gzfilebuf();
-  
+
   //  Destructor.
-  virtual 
+  virtual
   ~gzfilebuf();
 
   /**
    *  @brief  Set compression level and strategy on the fly.
-   *  @param  comp_level  Compression level (see zlib.h for allowed values) 
-   *  @param  comp_strategy  Compression strategy (see zlib.h for allowed values) 
+   *  @param  comp_level  Compression level (see zlib.h for allowed values)
+   *  @param  comp_strategy  Compression strategy (see zlib.h for allowed values)
    *  @return  Z_OK on success, Z_STREAM_ERROR otherwise.
-   * 
+   *
    *  Unfortunately, these parameters cannot be modified separately, as the
    *  previous zfstream version assumed. Since the strategy is seldom changed,
    *  it can default and setcompression(level) then becomes like the old
    *  setcompressionlevel(level).
   */
-  int 
-  setcompression(int comp_level, 
-		 int comp_strategy = Z_DEFAULT_STRATEGY);
-   
+  int
+  setcompression(int comp_level,
+                 int comp_strategy = Z_DEFAULT_STRATEGY);
+
   /**
    *  @brief  Check if file is open.
    *  @return  True if file is open.
   */
-  bool 
+  bool
   is_open() const { return (file != NULL); }
-   
+
   /**
    *  @brief  Open gzipped file.
    *  @param  name  File name.
    *  @param  mode  Open mode flags.
    *  @return  @c this on success, NULL on failure.
   */
-  gzfilebuf* 
-  open(const char* name, 
+  gzfilebuf*
+  open(const char* name,
        std::ios_base::openmode mode);
-   
+
   /**
    *  @brief  Attach to already open gzipped file.
    *  @param  fd  File descriptor.
    *  @param  mode  Open mode flags.
    *  @return  @c this on success, NULL on failure.
   */
-  gzfilebuf* 
-  attach(int fd, 
-	 std::ios_base::openmode mode);
-   
+  gzfilebuf*
+  attach(int fd,
+         std::ios_base::openmode mode);
+
   /**
    *  @brief  Close gzipped file.
    *  @return  @c this on success, NULL on failure.
   */
-  gzfilebuf* 
+  gzfilebuf*
   close();
-   
+
 protected:
   /**
    *  @brief  Convert ios open mode int to mode string used by zlib.
    *  @return  True if valid mode flag combination.
   */
-  bool 
-  open_mode(std::ios_base::openmode mode, 
-	    char* c_mode) const;
-  
+  bool
+  open_mode(std::ios_base::openmode mode,
+            char* c_mode) const;
+
   /**
    *  @brief  Number of characters available in stream buffer.
    *  @return  Number of characters.
-   * 
+   *
    *  This indicates number of characters in get area of stream buffer.
    *  These characters can be read without accessing the gzipped file.
   */
   virtual std::streamsize
   showmanyc();
-  
+
   /**
    *  @brief  Fill get area from gzipped file.
    *  @return  First character in get area on success, EOF on error.
-   * 
+   *
    *  This actually reads characters from gzipped file to stream
    *  buffer. Always buffered.
   */
   virtual int_type
   underflow();
-   
+
   /**
    *  @brief  Write put area to gzipped file.
    *  @param  c  Extra character to add to buffer contents.
    *  @return  Non-EOF on success, EOF on error.
-   * 
-   *  This actually writes characters in stream buffer to 
-   *  gzipped file. With unbuffered output this is done one 
+   *
+   *  This actually writes characters in stream buffer to
+   *  gzipped file. With unbuffered output this is done one
    *  character at a time.
-  */ 
-  virtual int_type 
+  */
+  virtual int_type
   overflow(int_type c = traits_type::eof());
-    
+
   /**
    *  @brief  Installs external stream buffer.
    *  @param  p  Pointer to char buffer.
    *  @param  n  Size of external buffer.
    *  @return  @c this on success, NULL on failure.
-   * 
+   *
    *  Call setbuf(0,0) to enable unbuffered output.
   */
-  virtual std::streambuf* 
-  setbuf(char_type* p, 
-	 std::streamsize n);
+  virtual std::streambuf*
+  setbuf(char_type* p,
+         std::streamsize n);
 
   /**
    *  @brief  Flush stream buffer to file.
    *  @return  0 on success, -1 on error.
-   * 
+   *
    *  This calls underflow(EOF) to do the job.
   */
-  virtual int 
+  virtual int
   sync();
-   
+
 //
 // Some future enhancements
-// 
+//
 //  virtual int_type uflow();
 //  virtual int_type pbackfail(int_type c = traits_type::eof());
-//  virtual pos_type 
-//  seekoff(off_type off, 
-//	    std::ios_base::seekdir way,
-//	    std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
-//  virtual pos_type 
-//  seekpos(pos_type sp, 
-//	    std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
-   
+//  virtual pos_type
+//  seekoff(off_type off,
+//          std::ios_base::seekdir way,
+//          std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
+//  virtual pos_type
+//  seekpos(pos_type sp,
+//          std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
+
 private:
   /**
    *  @brief  Allocate internal buffer.
-   * 
+   *
    *  This function is safe to call multiple times. It will ensure
    *  that a proper internal buffer exists if it is required. If the
    *  buffer already exists or is external, the buffer pointers will be
    *  reset to their original state.
   */
-  void 
+  void
   enable_buffer();
-   
+
   /**
    *  @brief  Destroy internal buffer.
-   * 
+   *
    *  This function is safe to call multiple times. It will ensure
    *  that the internal buffer is deallocated if it exists. In any
    *  case, it will also reset the buffer pointers.
   */
-  void 
+  void
   disable_buffer();
-   
+
   /**
    *  Underlying file pointer.
   */
   gzFile file;
-  
+
   /**
    *  Mode in which file was opened.
   */
   std::ios_base::openmode io_mode;
-  
+
   /**
    *  @brief  True if this object owns file descriptor.
    *
-   *  This makes the class responsible for closing the file 
+   *  This makes the class responsible for closing the file
    *  upon destruction.
   */
   bool own_fd;
-   
+
   /**
    *  @brief  Stream buffer.
-   * 
-   *  For simplicity this remains allocated on the free store for the 
+   *
+   *  For simplicity this remains allocated on the free store for the
    *  entire life span of the gzfilebuf object, unless replaced by setbuf.
   */
   char_type* buffer;
-   
+
   /**
    *  @brief  Stream buffer size.
-   * 
+   *
    *  Defaults to system default buffer size (typically 8192 bytes).
    *  Modified by setbuf.
   */
   std::streamsize buffer_size;
-  
+
   /**
    *  @brief  True if this object owns stream buffer.
    *
-   *  This makes the class responsible for deleting the buffer 
+   *  This makes the class responsible for deleting the buffer
    *  upon destruction.
   */
   bool own_buffer;
@@ -231,49 +231,49 @@
  *  This class implements ifstream for gzipped files. Seeking and putback
  *  is not supported yet.
 */
-class gzifstream : public std::istream 
+class gzifstream : public std::istream
 {
 public:
   //  Default constructor
   gzifstream();
-   
+
   /**
    *  @brief  Construct stream on gzipped file to be opened.
    *  @param  name  File name.
    *  @param  mode  Open mode flags (forced to contain ios::in).
   */
   explicit
-  gzifstream(const char* name, 
-	     std::ios_base::openmode mode = std::ios_base::in);
-   
+  gzifstream(const char* name,
+             std::ios_base::openmode mode = std::ios_base::in);
+
   /**
    *  @brief  Construct stream on already open gzipped file.
    *  @param  fd    File descriptor.
    *  @param  mode  Open mode flags (forced to contain ios::in).
   */
-  explicit 
-  gzifstream(int fd, 
-	     std::ios_base::openmode mode = std::ios_base::in);
+  explicit
+  gzifstream(int fd,
+             std::ios_base::openmode mode = std::ios_base::in);
 
   /**
    *  Obtain underlying stream buffer.
-  */  
-  gzfilebuf* 
+  */
+  gzfilebuf*
   rdbuf() const
-  { return const_cast<gzfilebuf*>(&sb); }  
+  { return const_cast<gzfilebuf*>(&sb); }
 
   /**
    *  @brief  Check if file is open.
    *  @return  True if file is open.
   */
-  bool 
+  bool
   is_open() { return sb.is_open(); }
-   
+
   /**
    *  @brief  Open gzipped file.
    *  @param  name  File name.
    *  @param  mode  Open mode flags (forced to contain ios::in).
-   *  
+   *
    *  Stream will be in state good() if file opens successfully;
    *  otherwise in state fail(). This differs from the behavior of
    *  ifstream, which never sets the state to good() and therefore
@@ -281,34 +281,34 @@
    *  you manually clear() the state. The choice is a matter of
    *  convenience.
   */
-  void 
-  open(const char* name, 
+  void
+  open(const char* name,
        std::ios_base::openmode mode = std::ios_base::in);
 
   /**
    *  @brief  Attach to already open gzipped file.
    *  @param  fd  File descriptor.
    *  @param  mode  Open mode flags (forced to contain ios::in).
-   *  
+   *
    *  Stream will be in state good() if attach succeeded; otherwise
    *  in state fail().
   */
-  void 
-  attach(int fd, 
-	 std::ios_base::openmode mode = std::ios_base::in);
+  void
+  attach(int fd,
+         std::ios_base::openmode mode = std::ios_base::in);
 
   /**
    *  @brief  Close gzipped file.
-   *  
+   *
    *  Stream will be in state fail() if close failed.
   */
-  void 
+  void
   close();
-   
+
 private:
   /**
    *  Underlying stream buffer.
-  */    
+  */
   gzfilebuf sb;
 };
 
@@ -325,44 +325,44 @@
 public:
   //  Default constructor
   gzofstream();
-   
+
   /**
    *  @brief  Construct stream on gzipped file to be opened.
    *  @param  name  File name.
    *  @param  mode  Open mode flags (forced to contain ios::out).
   */
   explicit
-  gzofstream(const char* name, 
-	     std::ios_base::openmode mode = std::ios_base::out);
-   
+  gzofstream(const char* name,
+             std::ios_base::openmode mode = std::ios_base::out);
+
   /**
    *  @brief  Construct stream on already open gzipped file.
    *  @param  fd    File descriptor.
    *  @param  mode  Open mode flags (forced to contain ios::out).
   */
-  explicit 
-  gzofstream(int fd, 
-	     std::ios_base::openmode mode = std::ios_base::out);
+  explicit
+  gzofstream(int fd,
+             std::ios_base::openmode mode = std::ios_base::out);
 
   /**
    *  Obtain underlying stream buffer.
-  */  
-  gzfilebuf* 
+  */
+  gzfilebuf*
   rdbuf() const
-  { return const_cast<gzfilebuf*>(&sb); }  
+  { return const_cast<gzfilebuf*>(&sb); }
 
   /**
    *  @brief  Check if file is open.
    *  @return  True if file is open.
   */
-  bool 
+  bool
   is_open() { return sb.is_open(); }
-   
+
   /**
    *  @brief  Open gzipped file.
    *  @param  name  File name.
    *  @param  mode  Open mode flags (forced to contain ios::out).
-   *  
+   *
    *  Stream will be in state good() if file opens successfully;
    *  otherwise in state fail(). This differs from the behavior of
    *  ofstream, which never sets the state to good() and therefore
@@ -370,39 +370,39 @@
    *  you manually clear() the state. The choice is a matter of
    *  convenience.
   */
-  void 
-  open(const char* name, 
+  void
+  open(const char* name,
        std::ios_base::openmode mode = std::ios_base::out);
 
   /**
    *  @brief  Attach to already open gzipped file.
    *  @param  fd  File descriptor.
    *  @param  mode  Open mode flags (forced to contain ios::out).
-   *  
+   *
    *  Stream will be in state good() if attach succeeded; otherwise
    *  in state fail().
   */
-  void 
-  attach(int fd, 
-	 std::ios_base::openmode mode = std::ios_base::out);
+  void
+  attach(int fd,
+         std::ios_base::openmode mode = std::ios_base::out);
 
   /**
    *  @brief  Close gzipped file.
-   *  
+   *
    *  Stream will be in state fail() if close failed.
   */
-  void 
+  void
   close();
-   
+
 private:
   /**
    *  Underlying stream buffer.
-  */    
+  */
   gzfilebuf sb;
 };
 
 /*****************************************************************************/
-  
+
 /**
  *  @brief  Gzipped file output stream manipulator class.
  *
@@ -415,28 +415,28 @@
   public:
     // Allows insertor to peek at internals
     template <typename Ta, typename Tb>
-      friend gzofstream& 
-      operator<<(gzofstream&, 
-		 const gzomanip2<Ta,Tb>&);
-     
+      friend gzofstream&
+      operator<<(gzofstream&,
+                 const gzomanip2<Ta,Tb>&);
+
     // Constructor
     gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2),
-	      T1 v1,
-	      T2 v2);
+              T1 v1,
+              T2 v2);
   private:
     // Underlying manipulator function
     gzofstream&
     (*func)(gzofstream&, T1, T2);
-     
-    // Arguments for manipulator function 
+
+    // Arguments for manipulator function
     T1 val1;
     T2 val2;
   };
 
 /*****************************************************************************/
-  
+
 // Manipulator function thunks through to stream buffer
-inline gzofstream& 
+inline gzofstream&
 setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
 {
   (gzs.rdbuf())->setcompression(l, s);
@@ -445,22 +445,22 @@
 
 // Manipulator constructor stores arguments
 template<typename T1, typename T2>
-  inline 
+  inline
   gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2),
-			      T1 v1,
-			      T2 v2) 
+                              T1 v1,
+                              T2 v2)
   : func(f), val1(v1), val2(v2)
   { }
 
 // Insertor applies underlying manipulator function to stream
 template<typename T1, typename T2>
-  inline gzofstream& 
-  operator<<(gzofstream& s, const gzomanip2<T1,T2>& m) 
+  inline gzofstream&
+  operator<<(gzofstream& s, const gzomanip2<T1,T2>& m)
   { return (*m.func)(s, m.val1, m.val2); }
 
 // Insert this onto stream to simplify setting of compression level
-inline gzomanip2<int,int> 
-setcompression(int l, int s = Z_DEFAULT_STRATEGY) 
+inline gzomanip2<int,int>
+setcompression(int l, int s = Z_DEFAULT_STRATEGY)
 { return gzomanip2<int,int>(&setcompression, l, s); }
 
 #endif // ZFSTREAM_H
diff --git a/contrib/masm686/match.asm b/contrib/masm686/match.asm
new file mode 100644
index 0000000..2287804
--- /dev/null
+++ b/contrib/masm686/match.asm
@@ -0,0 +1,408 @@
+
+; 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
diff --git a/contrib/vstudio/vc70_32/gvmat32.asm b/contrib/masmx86/gvmat32.asm
similarity index 64%
rename from contrib/vstudio/vc70_32/gvmat32.asm
rename to contrib/masmx86/gvmat32.asm
index 320348f..ec360e6 100644
--- a/contrib/vstudio/vc70_32/gvmat32.asm
+++ b/contrib/masmx86/gvmat32.asm
@@ -1,905 +1,905 @@
-;

-; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86

-; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.

-; File written by Gilles Vollant, by modifiying the longest_match

-;  from Jean-loup Gailly in deflate.c

-; It need wmask == 0x7fff

-;     (assembly code is faster with a fixed wmask)

-;

-; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)

-;   I compile with : "ml /coff /Zi /c gvmat32.asm"

-;

-

-;uInt longest_match_7fff(s, cur_match)

-;    deflate_state *s;

-;    IPos cur_match;                             /* current match */

-

-        NbStack         equ     76

-        cur_match       equ     dword ptr[esp+NbStack-0]

-        str_s           equ     dword ptr[esp+NbStack-4]

-; 5 dword on top (ret,ebp,esi,edi,ebx)

-        adrret          equ     dword ptr[esp+NbStack-8]

-        pushebp         equ     dword ptr[esp+NbStack-12]

-        pushedi         equ     dword ptr[esp+NbStack-16]

-        pushesi         equ     dword ptr[esp+NbStack-20]

-        pushebx         equ     dword ptr[esp+NbStack-24]

-

-        chain_length    equ     dword ptr [esp+NbStack-28]

-        limit           equ     dword ptr [esp+NbStack-32]

-        best_len        equ     dword ptr [esp+NbStack-36]

-        window          equ     dword ptr [esp+NbStack-40]

-        prev            equ     dword ptr [esp+NbStack-44]

-        scan_start      equ      word ptr [esp+NbStack-48]

-        wmask           equ     dword ptr [esp+NbStack-52]

-        match_start_ptr equ     dword ptr [esp+NbStack-56]

-        nice_match      equ     dword ptr [esp+NbStack-60]

-        scan            equ     dword ptr [esp+NbStack-64]

-

-        windowlen       equ     dword ptr [esp+NbStack-68]

-        match_start     equ     dword ptr [esp+NbStack-72]

-        strend          equ     dword ptr [esp+NbStack-76]

-        NbStackAdd      equ     (NbStack-24)

-

-    .386p

-

-    name    gvmatch

-    .MODEL  FLAT

-

-

-

-;  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

-    dep_chain_length    equ     70h+4

-    dep_window          equ     2ch+4

-    dep_strstart        equ     60h+4

-    dep_prev_length     equ     6ch+4

-    dep_nice_match      equ     84h+4

-    dep_w_size          equ     20h+4

-    dep_prev            equ     34h+4

-    dep_w_mask          equ     28h+4

-    dep_good_match      equ     80h+4

-    dep_match_start     equ     64h+4

-    dep_lookahead       equ     68h+4

-

-

-_TEXT                   segment

-

-IFDEF NOUNDERLINE

-                        public  longest_match_7fff

-                        public  longest_match_686

-;                        public  match_init

-ELSE

-                        public  _longest_match_7fff

-                        public  _longest_match_686

-;                        public  _match_init

-ENDIF

-

-    MAX_MATCH           equ     258

-    MIN_MATCH           equ     3

-    MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1)

-

-

-

-IFDEF NOUNDERLINE

-;match_init      proc near

-;                ret

-;match_init      endp

-ELSE

-;_match_init     proc near

-;                ret

-;_match_init     endp

-ENDIF

-

-

-IFDEF NOUNDERLINE

-longest_match_7fff   proc near

-ELSE

-_longest_match_7fff  proc near

-ENDIF

-

-        mov     edx,[esp+4]

-

-

-

-        push    ebp

-        push    edi

-        push    esi

-        push    ebx

-

-        sub     esp,NbStackAdd

-

-; initialize or check the variables used in match.asm.

-        mov     ebp,edx

-

-; chain_length = s->max_chain_length

-; if (prev_length>=good_match) chain_length >>= 2

-        mov     edx,[ebp+dep_chain_length]

-        mov     ebx,[ebp+dep_prev_length]

-        cmp     [ebp+dep_good_match],ebx

-        ja      noshr

-        shr     edx,2

-noshr:

-; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop

-        inc     edx

-        mov     edi,[ebp+dep_nice_match]

-        mov     chain_length,edx

-        mov     eax,[ebp+dep_lookahead]

-        cmp     eax,edi

-; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;

-        jae     nolookaheadnicematch

-        mov     edi,eax

-nolookaheadnicematch:

-; best_len = s->prev_length

-        mov     best_len,ebx

-

-; window = s->window

-        mov     esi,[ebp+dep_window]

-        mov     ecx,[ebp+dep_strstart]

-        mov     window,esi

-

-        mov     nice_match,edi

-; scan = window + strstart

-        add     esi,ecx

-        mov     scan,esi

-; dx = *window

-        mov     dx,word ptr [esi]

-; bx = *(window+best_len-1)

-        mov     bx,word ptr [esi+ebx-1]

-        add     esi,MAX_MATCH-1

-; scan_start = *scan

-        mov     scan_start,dx

-; strend = scan + MAX_MATCH-1

-        mov     strend,esi

-; bx = scan_end = *(window+best_len-1)

-

-;    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?

-;        s->strstart - (IPos)MAX_DIST(s) : NIL;

-

-        mov     esi,[ebp+dep_w_size]

-        sub     esi,MIN_LOOKAHEAD

-; here esi = MAX_DIST(s)

-        sub     ecx,esi

-        ja      nodist

-        xor     ecx,ecx

-nodist:

-        mov     limit,ecx

-

-; prev = s->prev

-        mov     edx,[ebp+dep_prev]

-        mov     prev,edx

-

-;

-        mov     edx,dword ptr [ebp+dep_match_start]

-        mov     bp,scan_start

-        mov     eax,cur_match

-        mov     match_start,edx

-

-        mov     edx,window

-        mov     edi,edx

-        add     edi,best_len

-        mov     esi,prev

-        dec     edi

-; windowlen = window + best_len -1

-        mov     windowlen,edi

-

-        jmp     beginloop2

-        align   4

-

-; here, in the loop

-;       eax = ax = cur_match

-;       ecx = limit

-;        bx = scan_end

-;        bp = scan_start

-;       edi = windowlen (window + best_len -1)

-;       esi = prev

-

-

-;// here; chain_length <=16

-normalbeg0add16:

-        add     chain_length,16

-        jz      exitloop

-normalbeg0:

-        cmp     word ptr[edi+eax],bx

-        je      normalbeg2noroll

-rcontlabnoroll:

-; cur_match = prev[cur_match & wmask]

-        and     eax,7fffh

-        mov     ax,word ptr[esi+eax*2]

-; if cur_match > limit, go to exitloop

-        cmp     ecx,eax

-        jnb     exitloop

-; if --chain_length != 0, go to exitloop

-        dec     chain_length

-        jnz     normalbeg0

-        jmp     exitloop

-

-normalbeg2noroll:

-; if (scan_start==*(cur_match+window)) goto normalbeg2

-        cmp     bp,word ptr[edx+eax]

-        jne     rcontlabnoroll

-        jmp     normalbeg2

-

-contloop3:

-        mov     edi,windowlen

-

-; cur_match = prev[cur_match & wmask]

-        and     eax,7fffh

-        mov     ax,word ptr[esi+eax*2]

-; if cur_match > limit, go to exitloop

-        cmp     ecx,eax

-jnbexitloopshort1:

-        jnb     exitloop

-; if --chain_length != 0, go to exitloop

-

-

-; begin the main loop

-beginloop2:

-        sub     chain_length,16+1

-; if chain_length <=16, don't use the unrolled loop

-        jna     normalbeg0add16

-

-do16:

-        cmp     word ptr[edi+eax],bx

-        je      normalbeg2dc0

-

-maccn   MACRO   lab

-        and     eax,7fffh

-        mov     ax,word ptr[esi+eax*2]

-        cmp     ecx,eax

-        jnb     exitloop

-        cmp     word ptr[edi+eax],bx

-        je      lab

-        ENDM

-

-rcontloop0:

-        maccn   normalbeg2dc1

-

-rcontloop1:

-        maccn   normalbeg2dc2

-

-rcontloop2:

-        maccn   normalbeg2dc3

-

-rcontloop3:

-        maccn   normalbeg2dc4

-

-rcontloop4:

-        maccn   normalbeg2dc5

-

-rcontloop5:

-        maccn   normalbeg2dc6

-

-rcontloop6:

-        maccn   normalbeg2dc7

-

-rcontloop7:

-        maccn   normalbeg2dc8

-

-rcontloop8:

-        maccn   normalbeg2dc9

-

-rcontloop9:

-        maccn   normalbeg2dc10

-

-rcontloop10:

-        maccn   short normalbeg2dc11

-

-rcontloop11:

-        maccn   short normalbeg2dc12

-

-rcontloop12:

-        maccn   short normalbeg2dc13

-

-rcontloop13:

-        maccn   short normalbeg2dc14

-

-rcontloop14:

-        maccn   short normalbeg2dc15

-

-rcontloop15:

-        and     eax,7fffh

-        mov     ax,word ptr[esi+eax*2]

-        cmp     ecx,eax

-        jnb     exitloop

-

-        sub     chain_length,16

-        ja      do16

-        jmp     normalbeg0add16

-

-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-

-normbeg MACRO   rcontlab,valsub

-; if we are here, we know that *(match+best_len-1) == scan_end

-        cmp     bp,word ptr[edx+eax]

-; if (match != scan_start) goto rcontlab

-        jne     rcontlab

-; calculate the good chain_length, and we'll compare scan and match string

-        add     chain_length,16-valsub

-        jmp     iseq

-        ENDM

-

-

-normalbeg2dc11:

-        normbeg rcontloop11,11

-

-normalbeg2dc12:

-        normbeg short rcontloop12,12

-

-normalbeg2dc13:

-        normbeg short rcontloop13,13

-

-normalbeg2dc14:

-        normbeg short rcontloop14,14

-

-normalbeg2dc15:

-        normbeg short rcontloop15,15

-

-normalbeg2dc10:

-        normbeg rcontloop10,10

-

-normalbeg2dc9:

-        normbeg rcontloop9,9

-

-normalbeg2dc8:

-        normbeg rcontloop8,8

-

-normalbeg2dc7:

-        normbeg rcontloop7,7

-

-normalbeg2dc6:

-        normbeg rcontloop6,6

-

-normalbeg2dc5:

-        normbeg rcontloop5,5

-

-normalbeg2dc4:

-        normbeg rcontloop4,4

-

-normalbeg2dc3:

-        normbeg rcontloop3,3

-

-normalbeg2dc2:

-        normbeg rcontloop2,2

-

-normalbeg2dc1:

-        normbeg rcontloop1,1

-

-normalbeg2dc0:

-        normbeg rcontloop0,0

-

-

-; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end

-

-normalbeg2:

-        mov     edi,window

-

-        cmp     bp,word ptr[edi+eax]

-        jne     contloop3                   ; if *(ushf*)match != scan_start, continue

-

-iseq:

-; if we are here, we know that *(match+best_len-1) == scan_end

-; and (match == scan_start)

-

-        mov     edi,edx

-        mov     esi,scan                    ; esi = scan

-        add     edi,eax                     ; edi = window + cur_match = match

-

-        mov     edx,[esi+3]                 ; compare manually dword at match+3

-        xor     edx,[edi+3]                 ; and scan +3

-

-        jz      begincompare                ; if equal, go to long compare

-

-; we will determine the unmatch byte and calculate len (in esi)

-        or      dl,dl

-        je      eq1rr

-        mov     esi,3

-        jmp     trfinval

-eq1rr:

-        or      dx,dx

-        je      eq1

-

-        mov     esi,4

-        jmp     trfinval

-eq1:

-        and     edx,0ffffffh

-        jz      eq11

-        mov     esi,5

-        jmp     trfinval

-eq11:

-        mov     esi,6

-        jmp     trfinval

-

-begincompare:

-        ; here we now scan and match begin same

-        add     edi,6

-        add     esi,6

-        mov     ecx,(MAX_MATCH-(2+4))/4     ; scan for at most MAX_MATCH bytes

-        repe    cmpsd                       ; loop until mismatch

-

-        je      trfin                       ; go to trfin if not unmatch

-; we determine the unmatch byte

-        sub     esi,4

-        mov     edx,[edi-4]

-        xor     edx,[esi]

-

-        or      dl,dl

-        jnz     trfin

-        inc     esi

-

-        or      dx,dx

-        jnz     trfin

-        inc     esi

-

-        and     edx,0ffffffh

-        jnz     trfin

-        inc     esi

-

-trfin:

-        sub     esi,scan          ; esi = len

-trfinval:

-; here we have finised compare, and esi contain len of equal string

-        cmp     esi,best_len        ; if len > best_len, go newbestlen

-        ja      short newbestlen

-; now we restore edx, ecx and esi, for the big loop

-        mov     esi,prev

-        mov     ecx,limit

-        mov     edx,window

-        jmp     contloop3

-

-newbestlen:

-        mov     best_len,esi        ; len become best_len

-

-        mov     match_start,eax     ; save new position as match_start

-        cmp     esi,nice_match      ; if best_len >= nice_match, exit

-        jae     exitloop

-        mov     ecx,scan

-        mov     edx,window          ; restore edx=window

-        add     ecx,esi

-        add     esi,edx

-

-        dec     esi

-        mov     windowlen,esi       ; windowlen = window + best_len-1

-        mov     bx,[ecx-1]          ; bx = *(scan+best_len-1) = scan_end

-

-; now we restore ecx and esi, for the big loop :

-        mov     esi,prev

-        mov     ecx,limit

-        jmp     contloop3

-

-exitloop:

-; exit : s->match_start=match_start

-        mov     ebx,match_start

-        mov     ebp,str_s

-        mov     ecx,best_len

-        mov     dword ptr [ebp+dep_match_start],ebx        

-        mov     eax,dword ptr [ebp+dep_lookahead]

-        cmp     ecx,eax

-        ja      minexlo

-        mov     eax,ecx

-minexlo:

-; return min(best_len,s->lookahead)

-        

-; restore stack and register ebx,esi,edi,ebp

-        add     esp,NbStackAdd

-

-        pop     ebx

-        pop     esi

-        pop     edi

-        pop     ebp

-        ret

-InfoAuthor:

-; please don't remove this string !

-; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!

-        db     0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah

-

-

-

-IFDEF NOUNDERLINE

-longest_match_7fff   endp

-ELSE

-_longest_match_7fff  endp

-ENDIF

-

-

-IFDEF NOUNDERLINE

-cpudetect32     proc near

-ELSE

-_cpudetect32    proc near

-ENDIF

-

-	push	ebx

-

-	pushfd                  ; push original EFLAGS

-	pop     eax             ; get original EFLAGS

-	mov     ecx, eax        ; save original EFLAGS

-	xor     eax, 40000h     ; flip AC bit in EFLAGS

-	push    eax             ; save new EFLAGS value on stack

-	popfd                   ; replace current EFLAGS value

-	pushfd                  ; get new EFLAGS

-	pop     eax             ; store new EFLAGS in EAX

-	xor     eax, ecx        ; canÂ’t toggle AC bit, processor=80386

-	jz      end_cpu_is_386  ; jump if 80386 processor

-	push    ecx

-	popfd                   ; restore AC bit in EFLAGS first

-

-	pushfd

-	pushfd

-	pop     ecx

-			

-	mov     eax, ecx        ; get original EFLAGS

-	xor     eax, 200000h    ; flip ID bit in EFLAGS

-	push    eax             ; save new EFLAGS value on stack

-	popfd                   ; replace current EFLAGS value

-	pushfd                  ; get new EFLAGS

-	pop		eax	            ; store new EFLAGS in EAX

-	popfd                   ; restore original EFLAGS

-	xor		eax, ecx        ; canÂ’t toggle ID bit,

-	je		is_old_486		; processor=old

-

-	mov     eax,1

-	db      0fh,0a2h        ;CPUID   

-

-exitcpudetect:

-	pop	ebx

-	ret

-

-end_cpu_is_386:

-	mov     eax,0300h

-	jmp     exitcpudetect

-

-is_old_486:

-	mov     eax,0400h

-	jmp     exitcpudetect

-

-IFDEF NOUNDERLINE

-cpudetect32     endp

-ELSE

-_cpudetect32    endp

-ENDIF

-

-

-

-

-MAX_MATCH       equ     258

-MIN_MATCH       equ     3

-MIN_LOOKAHEAD   equ     (MAX_MATCH + MIN_MATCH + 1)

-MAX_MATCH_8_     equ     ((MAX_MATCH + 7) AND 0FFF0h)

-

-

-;;; stack frame offsets

-

-chainlenwmask	equ  esp + 0	; high word: current chain len

-					; low word: s->wmask

-window		equ  esp + 4	; local copy of s->window

-windowbestlen	equ  esp + 8	; s->window + bestlen

-scanstart	equ  esp + 16	; first two bytes of string

-scanend		equ  esp + 12	; last two bytes of string

-scanalign	equ  esp + 20	; dword-misalignment of string

-nicematch	equ  esp + 24	; a good enough match size

-bestlen		equ  esp + 28	; size of best match so far

-scan		equ  esp + 32	; ptr to string wanting match

-

-LocalVarsSize	equ 36

-;	saved ebx	byte esp + 36

-;	saved edi	byte esp + 40

-;	saved esi	byte esp + 44

-;	saved ebp	byte esp + 48

-;	return address	byte esp + 52

-deflatestate	equ  esp + 56	; the function arguments

-curmatch	equ  esp + 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.)

-

-dsWSize		equ 36

-dsWMask		equ 44

-dsWindow	equ 48

-dsPrev		equ 56

-dsMatchLen	equ 88

-dsPrevMatch	equ 92

-dsStrStart	equ 100

-dsMatchStart	equ 104

-dsLookahead	equ 108

-dsPrevLen	equ 112

-dsMaxChainLen	equ 116

-dsGoodMatch	equ 132

-dsNiceMatch	equ 136

-

-

-;;; match.asm -- Pentium-Pro-optimized version of longest_match()

-;;; Written for zlib 1.1.2

-;;; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>

-;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html

-;;;

-;;; This is free software; you can redistribute it and/or modify it

-;;; under the terms of the GNU General Public License.

-

-;GLOBAL	_longest_match, _match_init

-

-

-;SECTION	.text

-

-;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch)

-

-;_longest_match:

-IFDEF NOUNDERLINE

-longest_match_686   proc near

-ELSE

-_longest_match_686  proc near

-ENDIF

-

-

-;;; Save registers that the compiler may be using, and adjust esp to

-;;; make room for our stack frame.

-

-		push	ebp

-		push	edi

-		push	esi

-		push	ebx

-		sub	esp, LocalVarsSize

-

-;;; 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, [deflatestate]

-		mov	ecx, [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 + dsPrevLen]

-		mov	ebx, [edx + dsGoodMatch]

-		cmp	eax, ebx

-		mov	eax, [edx + dsWMask]

-		mov	ebx, [edx + dsMaxChainLen]

-		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

-		mov	[chainlenwmask], ebx

-

-;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;

-

-		mov	eax, [edx + dsNiceMatch]

-		mov	ebx, [edx + dsLookahead]

-		cmp	ebx, eax

-		jl	LookaheadLess

-		mov	ebx, eax

-LookaheadLess:	mov	[nicematch], ebx

-

-;;; register Bytef *scan = s->window + s->strstart;

-

-		mov	esi, [edx + dsWindow]

-		mov	[window], esi

-		mov	ebp, [edx + dsStrStart]

-		lea	edi, [esi + ebp]

-		mov	[scan], edi

-

-;;; Determine how many bytes the scan ptr is off from being

-;;; dword-aligned.

-

-		mov	eax, edi

-		neg	eax

-		and	eax, 3

-		mov	[scanalign], eax

-

-;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?

-;;;     s->strstart - (IPos)MAX_DIST(s) : NIL;

-

-		mov	eax, [edx + dsWSize]

-		sub	eax, MIN_LOOKAHEAD

-		sub	ebp, eax

-		jg	LimitPositive

-		xor	ebp, ebp

-LimitPositive:

-

-;;; int best_len = s->prev_length;

-

-		mov	eax, [edx + dsPrevLen]

-		mov	[bestlen], eax

-

-;;; Store the sum of s->window + best_len in esi locally, and in esi.

-

-		add	esi, eax

-		mov	[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	[scanstart], ebx

-		movzx	ebx, word ptr [edi + eax - 1]

-		mov	[scanend], ebx

-		mov	edi, [edx + dsPrev]

-

-;;; Jump into the main loop.

-

-		mov	edx, [chainlenwmask]

-		jmp	short LoopEntry

-

-align 4

-

-;;; 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

-

-LookupLoop:

-		and	ecx, edx

-		movzx	ecx, word ptr [edi + ecx*2]

-		cmp	ecx, ebp

-		jbe	LeaveNow

-		sub	edx, 00010000h

-		js	LeaveNow

-LoopEntry:	movzx	eax, word ptr [esi + ecx - 1]

-		cmp	eax, ebx

-		jnz	LookupLoop

-		mov	eax, [window]

-		movzx	eax, word ptr [eax + ecx]

-		cmp	eax, [scanstart]

-		jnz	LookupLoop

-

-;;; 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).

-

-		mov	esi, [window]

-		mov	edi, [scan]

-		add	esi, ecx

-		mov	eax, [scanalign]

-		mov	edx, 0fffffef8h; -(MAX_MATCH_8)

-		lea	edi, [edi + eax + 0108h] ;MAX_MATCH_8]

-		lea	esi, [esi + eax + 0108h] ;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, [esi + edx]

-		xor	eax, [edi + edx]

-		jnz	LeaveLoopCmps

-		mov	eax, [esi + edx + 4]

-		xor	eax, [edi + edx + 4]

-		jnz	LeaveLoopCmps4

-		add	edx, 8

-		jnz	LoopCmps

-		jmp	short LenMaximum

-LeaveLoopCmps4:	add	edx, 4

-LeaveLoopCmps:	test	eax, 0000FFFFh

-		jnz	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, [scan]

-		sub	eax, edi

-		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.

-

-		mov	edx, [deflatestate]

-		mov	ebx, [bestlen]

-		cmp	eax, ebx

-		jg	LongerMatch

-		mov	esi, [windowbestlen]

-		mov	edi, [edx + dsPrev]

-		mov	ebx, [scanend]

-		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	ebx, [nicematch]

-		mov	[bestlen], eax

-		mov	[edx + dsMatchStart], ecx

-		cmp	eax, ebx

-		jge	LeaveNow

-		mov	esi, [window]

-		add	esi, eax

-		mov	[windowbestlen], esi

-		movzx	ebx, word ptr [edi + eax - 1]

-		mov	edi, [edx + dsPrev]

-		mov	[scanend], ebx

-		mov	edx, [chainlenwmask]

-		jmp	LookupLoop

-

-;;; Accept the current string, with the maximum possible length.

-

-LenMaximum:	mov	edx, [deflatestate]

-		mov	dword ptr [bestlen], MAX_MATCH

-		mov	[edx + dsMatchStart], ecx

-

-;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;

-;;; return s->lookahead;

-

-LeaveNow:

-		mov	edx, [deflatestate]

-		mov	ebx, [bestlen]

-		mov	eax, [edx + dsLookahead]

-		cmp	ebx, eax

-		jg	LookaheadRet

-		mov	eax, ebx

-LookaheadRet:

-

-;;; Restore the stack and return from whence we came.

-

-		add	esp, LocalVarsSize

-		pop	ebx

-		pop	esi

-		pop	edi

-		pop	ebp

-

-		ret

-; please don't remove this string !

-; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!

-        db     0dh,0ah,"asm686 with masm, code optimised assembly code from Brian Raiter, written 1998",0dh,0ah

-

-IFDEF NOUNDERLINE

-longest_match_686   endp

-ELSE

-_longest_match_686  endp

-ENDIF

-

-_TEXT   ends

-end

+;
+; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86
+; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
+; File written by Gilles Vollant, by modifiying the longest_match
+;  from Jean-loup Gailly in deflate.c
+; It need wmask == 0x7fff
+;     (assembly code is faster with a fixed wmask)
+;
+; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)
+;   I compile with : "ml /coff /Zi /c gvmat32.asm"
+;
+
+;uInt longest_match_7fff(s, cur_match)
+;    deflate_state *s;
+;    IPos cur_match;                             /* current match */
+
+	NbStack         equ     76
+	cur_match       equ     dword ptr[esp+NbStack-0]
+	str_s           equ     dword ptr[esp+NbStack-4]
+; 5 dword on top (ret,ebp,esi,edi,ebx)
+	adrret          equ     dword ptr[esp+NbStack-8]
+	pushebp         equ     dword ptr[esp+NbStack-12]
+	pushedi         equ     dword ptr[esp+NbStack-16]
+	pushesi         equ     dword ptr[esp+NbStack-20]
+	pushebx         equ     dword ptr[esp+NbStack-24]
+
+	chain_length    equ     dword ptr [esp+NbStack-28]
+	limit           equ     dword ptr [esp+NbStack-32]
+	best_len        equ     dword ptr [esp+NbStack-36]
+	window          equ     dword ptr [esp+NbStack-40]
+	prev            equ     dword ptr [esp+NbStack-44]
+	scan_start      equ      word ptr [esp+NbStack-48]
+	wmask           equ     dword ptr [esp+NbStack-52]
+	match_start_ptr equ     dword ptr [esp+NbStack-56]
+	nice_match      equ     dword ptr [esp+NbStack-60]
+	scan            equ     dword ptr [esp+NbStack-64]
+
+	windowlen       equ     dword ptr [esp+NbStack-68]
+	match_start     equ     dword ptr [esp+NbStack-72]
+	strend          equ     dword ptr [esp+NbStack-76]
+	NbStackAdd      equ     (NbStack-24)
+
+    .386p
+
+    name    gvmatch
+    .MODEL  FLAT
+
+
+
+;  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
+    dep_chain_length    equ     70h+4
+    dep_window          equ     2ch+4
+    dep_strstart        equ     60h+4
+    dep_prev_length     equ     6ch+4
+    dep_nice_match      equ     84h+4
+    dep_w_size          equ     20h+4
+    dep_prev            equ     34h+4
+    dep_w_mask          equ     28h+4
+    dep_good_match      equ     80h+4
+    dep_match_start     equ     64h+4
+    dep_lookahead       equ     68h+4
+
+
+_TEXT                   segment
+
+IFDEF NOUNDERLINE
+			public  longest_match_7fff
+			public  longest_match_686
+;                        public  match_init
+ELSE
+			public  _longest_match_7fff
+			public  _longest_match_686
+;                        public  _match_init
+ENDIF
+
+    MAX_MATCH           equ     258
+    MIN_MATCH           equ     3
+    MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1)
+
+
+
+IFDEF NOUNDERLINE
+;match_init      proc near
+;                ret
+;match_init      endp
+ELSE
+;_match_init     proc near
+;                ret
+;_match_init     endp
+ENDIF
+
+
+IFDEF NOUNDERLINE
+longest_match_7fff   proc near
+ELSE
+_longest_match_7fff  proc near
+ENDIF
+
+	mov     edx,[esp+4]
+
+
+
+	push    ebp
+	push    edi
+	push    esi
+	push    ebx
+
+	sub     esp,NbStackAdd
+
+; initialize or check the variables used in match.asm.
+	mov     ebp,edx
+
+; chain_length = s->max_chain_length
+; if (prev_length>=good_match) chain_length >>= 2
+	mov     edx,[ebp+dep_chain_length]
+	mov     ebx,[ebp+dep_prev_length]
+	cmp     [ebp+dep_good_match],ebx
+	ja      noshr
+	shr     edx,2
+noshr:
+; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop
+	inc     edx
+	mov     edi,[ebp+dep_nice_match]
+	mov     chain_length,edx
+	mov     eax,[ebp+dep_lookahead]
+	cmp     eax,edi
+; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+	jae     nolookaheadnicematch
+	mov     edi,eax
+nolookaheadnicematch:
+; best_len = s->prev_length
+	mov     best_len,ebx
+
+; window = s->window
+	mov     esi,[ebp+dep_window]
+	mov     ecx,[ebp+dep_strstart]
+	mov     window,esi
+
+	mov     nice_match,edi
+; scan = window + strstart
+	add     esi,ecx
+	mov     scan,esi
+; dx = *window
+	mov     dx,word ptr [esi]
+; bx = *(window+best_len-1)
+	mov     bx,word ptr [esi+ebx-1]
+	add     esi,MAX_MATCH-1
+; scan_start = *scan
+	mov     scan_start,dx
+; strend = scan + MAX_MATCH-1
+	mov     strend,esi
+; bx = scan_end = *(window+best_len-1)
+
+;    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+;        s->strstart - (IPos)MAX_DIST(s) : NIL;
+
+	mov     esi,[ebp+dep_w_size]
+	sub     esi,MIN_LOOKAHEAD
+; here esi = MAX_DIST(s)
+	sub     ecx,esi
+	ja      nodist
+	xor     ecx,ecx
+nodist:
+	mov     limit,ecx
+
+; prev = s->prev
+	mov     edx,[ebp+dep_prev]
+	mov     prev,edx
+
+;
+	mov     edx,dword ptr [ebp+dep_match_start]
+	mov     bp,scan_start
+	mov     eax,cur_match
+	mov     match_start,edx
+
+	mov     edx,window
+	mov     edi,edx
+	add     edi,best_len
+	mov     esi,prev
+	dec     edi
+; windowlen = window + best_len -1
+	mov     windowlen,edi
+
+	jmp     beginloop2
+	align   4
+
+; here, in the loop
+;       eax = ax = cur_match
+;       ecx = limit
+;        bx = scan_end
+;        bp = scan_start
+;       edi = windowlen (window + best_len -1)
+;       esi = prev
+
+
+;// here; chain_length <=16
+normalbeg0add16:
+	add     chain_length,16
+	jz      exitloop
+normalbeg0:
+	cmp     word ptr[edi+eax],bx
+	je      normalbeg2noroll
+rcontlabnoroll:
+; cur_match = prev[cur_match & wmask]
+	and     eax,7fffh
+	mov     ax,word ptr[esi+eax*2]
+; if cur_match > limit, go to exitloop
+	cmp     ecx,eax
+	jnb     exitloop
+; if --chain_length != 0, go to exitloop
+	dec     chain_length
+	jnz     normalbeg0
+	jmp     exitloop
+
+normalbeg2noroll:
+; if (scan_start==*(cur_match+window)) goto normalbeg2
+	cmp     bp,word ptr[edx+eax]
+	jne     rcontlabnoroll
+	jmp     normalbeg2
+
+contloop3:
+	mov     edi,windowlen
+
+; cur_match = prev[cur_match & wmask]
+	and     eax,7fffh
+	mov     ax,word ptr[esi+eax*2]
+; if cur_match > limit, go to exitloop
+	cmp     ecx,eax
+jnbexitloopshort1:
+	jnb     exitloop
+; if --chain_length != 0, go to exitloop
+
+
+; begin the main loop
+beginloop2:
+	sub     chain_length,16+1
+; if chain_length <=16, don't use the unrolled loop
+	jna     normalbeg0add16
+
+do16:
+	cmp     word ptr[edi+eax],bx
+	je      normalbeg2dc0
+
+maccn   MACRO   lab
+	and     eax,7fffh
+	mov     ax,word ptr[esi+eax*2]
+	cmp     ecx,eax
+	jnb     exitloop
+	cmp     word ptr[edi+eax],bx
+	je      lab
+	ENDM
+
+rcontloop0:
+	maccn   normalbeg2dc1
+
+rcontloop1:
+	maccn   normalbeg2dc2
+
+rcontloop2:
+	maccn   normalbeg2dc3
+
+rcontloop3:
+	maccn   normalbeg2dc4
+
+rcontloop4:
+	maccn   normalbeg2dc5
+
+rcontloop5:
+	maccn   normalbeg2dc6
+
+rcontloop6:
+	maccn   normalbeg2dc7
+
+rcontloop7:
+	maccn   normalbeg2dc8
+
+rcontloop8:
+	maccn   normalbeg2dc9
+
+rcontloop9:
+	maccn   normalbeg2dc10
+
+rcontloop10:
+	maccn   short normalbeg2dc11
+
+rcontloop11:
+	maccn   short normalbeg2dc12
+
+rcontloop12:
+	maccn   short normalbeg2dc13
+
+rcontloop13:
+	maccn   short normalbeg2dc14
+
+rcontloop14:
+	maccn   short normalbeg2dc15
+
+rcontloop15:
+	and     eax,7fffh
+	mov     ax,word ptr[esi+eax*2]
+	cmp     ecx,eax
+	jnb     exitloop
+
+	sub     chain_length,16
+	ja      do16
+	jmp     normalbeg0add16
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+normbeg MACRO   rcontlab,valsub
+; if we are here, we know that *(match+best_len-1) == scan_end
+	cmp     bp,word ptr[edx+eax]
+; if (match != scan_start) goto rcontlab
+	jne     rcontlab
+; calculate the good chain_length, and we'll compare scan and match string
+	add     chain_length,16-valsub
+	jmp     iseq
+	ENDM
+
+
+normalbeg2dc11:
+	normbeg rcontloop11,11
+
+normalbeg2dc12:
+	normbeg short rcontloop12,12
+
+normalbeg2dc13:
+	normbeg short rcontloop13,13
+
+normalbeg2dc14:
+	normbeg short rcontloop14,14
+
+normalbeg2dc15:
+	normbeg short rcontloop15,15
+
+normalbeg2dc10:
+	normbeg rcontloop10,10
+
+normalbeg2dc9:
+	normbeg rcontloop9,9
+
+normalbeg2dc8:
+	normbeg rcontloop8,8
+
+normalbeg2dc7:
+	normbeg rcontloop7,7
+
+normalbeg2dc6:
+	normbeg rcontloop6,6
+
+normalbeg2dc5:
+	normbeg rcontloop5,5
+
+normalbeg2dc4:
+	normbeg rcontloop4,4
+
+normalbeg2dc3:
+	normbeg rcontloop3,3
+
+normalbeg2dc2:
+	normbeg rcontloop2,2
+
+normalbeg2dc1:
+	normbeg rcontloop1,1
+
+normalbeg2dc0:
+	normbeg rcontloop0,0
+
+
+; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end
+
+normalbeg2:
+	mov     edi,window
+
+	cmp     bp,word ptr[edi+eax]
+	jne     contloop3                   ; if *(ushf*)match != scan_start, continue
+
+iseq:
+; if we are here, we know that *(match+best_len-1) == scan_end
+; and (match == scan_start)
+
+	mov     edi,edx
+	mov     esi,scan                    ; esi = scan
+	add     edi,eax                     ; edi = window + cur_match = match
+
+	mov     edx,[esi+3]                 ; compare manually dword at match+3
+	xor     edx,[edi+3]                 ; and scan +3
+
+	jz      begincompare                ; if equal, go to long compare
+
+; we will determine the unmatch byte and calculate len (in esi)
+	or      dl,dl
+	je      eq1rr
+	mov     esi,3
+	jmp     trfinval
+eq1rr:
+	or      dx,dx
+	je      eq1
+
+	mov     esi,4
+	jmp     trfinval
+eq1:
+	and     edx,0ffffffh
+	jz      eq11
+	mov     esi,5
+	jmp     trfinval
+eq11:
+	mov     esi,6
+	jmp     trfinval
+
+begincompare:
+	; here we now scan and match begin same
+	add     edi,6
+	add     esi,6
+	mov     ecx,(MAX_MATCH-(2+4))/4     ; scan for at most MAX_MATCH bytes
+	repe    cmpsd                       ; loop until mismatch
+
+	je      trfin                       ; go to trfin if not unmatch
+; we determine the unmatch byte
+	sub     esi,4
+	mov     edx,[edi-4]
+	xor     edx,[esi]
+
+	or      dl,dl
+	jnz     trfin
+	inc     esi
+
+	or      dx,dx
+	jnz     trfin
+	inc     esi
+
+	and     edx,0ffffffh
+	jnz     trfin
+	inc     esi
+
+trfin:
+	sub     esi,scan          ; esi = len
+trfinval:
+; here we have finised compare, and esi contain len of equal string
+	cmp     esi,best_len        ; if len > best_len, go newbestlen
+	ja      short newbestlen
+; now we restore edx, ecx and esi, for the big loop
+	mov     esi,prev
+	mov     ecx,limit
+	mov     edx,window
+	jmp     contloop3
+
+newbestlen:
+	mov     best_len,esi        ; len become best_len
+
+	mov     match_start,eax     ; save new position as match_start
+	cmp     esi,nice_match      ; if best_len >= nice_match, exit
+	jae     exitloop
+	mov     ecx,scan
+	mov     edx,window          ; restore edx=window
+	add     ecx,esi
+	add     esi,edx
+
+	dec     esi
+	mov     windowlen,esi       ; windowlen = window + best_len-1
+	mov     bx,[ecx-1]          ; bx = *(scan+best_len-1) = scan_end
+
+; now we restore ecx and esi, for the big loop :
+	mov     esi,prev
+	mov     ecx,limit
+	jmp     contloop3
+
+exitloop:
+; exit : s->match_start=match_start
+	mov     ebx,match_start
+	mov     ebp,str_s
+	mov     ecx,best_len
+	mov     dword ptr [ebp+dep_match_start],ebx
+	mov     eax,dword ptr [ebp+dep_lookahead]
+	cmp     ecx,eax
+	ja      minexlo
+	mov     eax,ecx
+minexlo:
+; return min(best_len,s->lookahead)
+
+; restore stack and register ebx,esi,edi,ebp
+	add     esp,NbStackAdd
+
+	pop     ebx
+	pop     esi
+	pop     edi
+	pop     ebp
+	ret
+InfoAuthor:
+; please don't remove this string !
+; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!
+	db     0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah
+
+
+
+IFDEF NOUNDERLINE
+longest_match_7fff   endp
+ELSE
+_longest_match_7fff  endp
+ENDIF
+
+
+IFDEF NOUNDERLINE
+cpudetect32     proc near
+ELSE
+_cpudetect32    proc near
+ENDIF
+
+	push	ebx
+
+	pushfd                  ; push original EFLAGS
+	pop     eax             ; get original EFLAGS
+	mov     ecx, eax        ; save original EFLAGS
+	xor     eax, 40000h     ; flip AC bit in EFLAGS
+	push    eax             ; save new EFLAGS value on stack
+	popfd                   ; replace current EFLAGS value
+	pushfd                  ; get new EFLAGS
+	pop     eax             ; store new EFLAGS in EAX
+	xor     eax, ecx        ; canÂ’t toggle AC bit, processor=80386
+	jz      end_cpu_is_386  ; jump if 80386 processor
+	push    ecx
+	popfd                   ; restore AC bit in EFLAGS first
+
+	pushfd
+	pushfd
+	pop     ecx
+
+	mov     eax, ecx        ; get original EFLAGS
+	xor     eax, 200000h    ; flip ID bit in EFLAGS
+	push    eax             ; save new EFLAGS value on stack
+	popfd                   ; replace current EFLAGS value
+	pushfd                  ; get new EFLAGS
+	pop		eax	            ; store new EFLAGS in EAX
+	popfd                   ; restore original EFLAGS
+	xor		eax, ecx        ; canÂ’t toggle ID bit,
+	je		is_old_486		; processor=old
+
+	mov     eax,1
+	db      0fh,0a2h        ;CPUID
+
+exitcpudetect:
+	pop	ebx
+	ret
+
+end_cpu_is_386:
+	mov     eax,0300h
+	jmp     exitcpudetect
+
+is_old_486:
+	mov     eax,0400h
+	jmp     exitcpudetect
+
+IFDEF NOUNDERLINE
+cpudetect32     endp
+ELSE
+_cpudetect32    endp
+ENDIF
+
+
+
+
+MAX_MATCH       equ     258
+MIN_MATCH       equ     3
+MIN_LOOKAHEAD   equ     (MAX_MATCH + MIN_MATCH + 1)
+MAX_MATCH_8_     equ     ((MAX_MATCH + 7) AND 0FFF0h)
+
+
+;;; stack frame offsets
+
+chainlenwmask	equ  esp + 0	; high word: current chain len
+					; low word: s->wmask
+window		equ  esp + 4	; local copy of s->window
+windowbestlen	equ  esp + 8	; s->window + bestlen
+scanstart	equ  esp + 16	; first two bytes of string
+scanend		equ  esp + 12	; last two bytes of string
+scanalign	equ  esp + 20	; dword-misalignment of string
+nicematch	equ  esp + 24	; a good enough match size
+bestlen		equ  esp + 28	; size of best match so far
+scan		equ  esp + 32	; ptr to string wanting match
+
+LocalVarsSize	equ 36
+;	saved ebx	byte esp + 36
+;	saved edi	byte esp + 40
+;	saved esi	byte esp + 44
+;	saved ebp	byte esp + 48
+;	return address	byte esp + 52
+deflatestate	equ  esp + 56	; the function arguments
+curmatch	equ  esp + 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.)
+
+dsWSize		equ 36
+dsWMask		equ 44
+dsWindow	equ 48
+dsPrev		equ 56
+dsMatchLen	equ 88
+dsPrevMatch	equ 92
+dsStrStart	equ 100
+dsMatchStart	equ 104
+dsLookahead	equ 108
+dsPrevLen	equ 112
+dsMaxChainLen	equ 116
+dsGoodMatch	equ 132
+dsNiceMatch	equ 136
+
+
+;;; match.asm -- Pentium-Pro-optimized version of longest_match()
+;;; Written for zlib 1.1.2
+;;; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
+;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html
+;;;
+;;; This is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License.
+
+;GLOBAL	_longest_match, _match_init
+
+
+;SECTION	.text
+
+;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
+
+;_longest_match:
+IFDEF NOUNDERLINE
+longest_match_686   proc near
+ELSE
+_longest_match_686  proc near
+ENDIF
+
+
+;;; Save registers that the compiler may be using, and adjust esp to
+;;; make room for our stack frame.
+
+		push	ebp
+		push	edi
+		push	esi
+		push	ebx
+		sub	esp, LocalVarsSize
+
+;;; 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, [deflatestate]
+		mov	ecx, [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 + dsPrevLen]
+		mov	ebx, [edx + dsGoodMatch]
+		cmp	eax, ebx
+		mov	eax, [edx + dsWMask]
+		mov	ebx, [edx + dsMaxChainLen]
+		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
+		mov	[chainlenwmask], ebx
+
+;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+		mov	eax, [edx + dsNiceMatch]
+		mov	ebx, [edx + dsLookahead]
+		cmp	ebx, eax
+		jl	LookaheadLess
+		mov	ebx, eax
+LookaheadLess:	mov	[nicematch], ebx
+
+;;; register Bytef *scan = s->window + s->strstart;
+
+		mov	esi, [edx + dsWindow]
+		mov	[window], esi
+		mov	ebp, [edx + dsStrStart]
+		lea	edi, [esi + ebp]
+		mov	[scan], edi
+
+;;; Determine how many bytes the scan ptr is off from being
+;;; dword-aligned.
+
+		mov	eax, edi
+		neg	eax
+		and	eax, 3
+		mov	[scanalign], eax
+
+;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+;;;     s->strstart - (IPos)MAX_DIST(s) : NIL;
+
+		mov	eax, [edx + dsWSize]
+		sub	eax, MIN_LOOKAHEAD
+		sub	ebp, eax
+		jg	LimitPositive
+		xor	ebp, ebp
+LimitPositive:
+
+;;; int best_len = s->prev_length;
+
+		mov	eax, [edx + dsPrevLen]
+		mov	[bestlen], eax
+
+;;; Store the sum of s->window + best_len in esi locally, and in esi.
+
+		add	esi, eax
+		mov	[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	[scanstart], ebx
+		movzx	ebx, word ptr [edi + eax - 1]
+		mov	[scanend], ebx
+		mov	edi, [edx + dsPrev]
+
+;;; Jump into the main loop.
+
+		mov	edx, [chainlenwmask]
+		jmp	short LoopEntry
+
+align 4
+
+;;; 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
+
+LookupLoop:
+		and	ecx, edx
+		movzx	ecx, word ptr [edi + ecx*2]
+		cmp	ecx, ebp
+		jbe	LeaveNow
+		sub	edx, 00010000h
+		js	LeaveNow
+LoopEntry:	movzx	eax, word ptr [esi + ecx - 1]
+		cmp	eax, ebx
+		jnz	LookupLoop
+		mov	eax, [window]
+		movzx	eax, word ptr [eax + ecx]
+		cmp	eax, [scanstart]
+		jnz	LookupLoop
+
+;;; 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).
+
+		mov	esi, [window]
+		mov	edi, [scan]
+		add	esi, ecx
+		mov	eax, [scanalign]
+		mov	edx, 0fffffef8h; -(MAX_MATCH_8)
+		lea	edi, [edi + eax + 0108h] ;MAX_MATCH_8]
+		lea	esi, [esi + eax + 0108h] ;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, [esi + edx]
+		xor	eax, [edi + edx]
+		jnz	LeaveLoopCmps
+		mov	eax, [esi + edx + 4]
+		xor	eax, [edi + edx + 4]
+		jnz	LeaveLoopCmps4
+		add	edx, 8
+		jnz	LoopCmps
+		jmp	short LenMaximum
+LeaveLoopCmps4:	add	edx, 4
+LeaveLoopCmps:	test	eax, 0000FFFFh
+		jnz	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, [scan]
+		sub	eax, edi
+		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.
+
+		mov	edx, [deflatestate]
+		mov	ebx, [bestlen]
+		cmp	eax, ebx
+		jg	LongerMatch
+		mov	esi, [windowbestlen]
+		mov	edi, [edx + dsPrev]
+		mov	ebx, [scanend]
+		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	ebx, [nicematch]
+		mov	[bestlen], eax
+		mov	[edx + dsMatchStart], ecx
+		cmp	eax, ebx
+		jge	LeaveNow
+		mov	esi, [window]
+		add	esi, eax
+		mov	[windowbestlen], esi
+		movzx	ebx, word ptr [edi + eax - 1]
+		mov	edi, [edx + dsPrev]
+		mov	[scanend], ebx
+		mov	edx, [chainlenwmask]
+		jmp	LookupLoop
+
+;;; Accept the current string, with the maximum possible length.
+
+LenMaximum:	mov	edx, [deflatestate]
+		mov	dword ptr [bestlen], MAX_MATCH
+		mov	[edx + dsMatchStart], ecx
+
+;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+;;; return s->lookahead;
+
+LeaveNow:
+		mov	edx, [deflatestate]
+		mov	ebx, [bestlen]
+		mov	eax, [edx + dsLookahead]
+		cmp	ebx, eax
+		jg	LookaheadRet
+		mov	eax, ebx
+LookaheadRet:
+
+;;; Restore the stack and return from whence we came.
+
+		add	esp, LocalVarsSize
+		pop	ebx
+		pop	esi
+		pop	edi
+		pop	ebp
+
+		ret
+; please don't remove this string !
+; Your can freely use gvmat32 in any free or commercial app if you don't remove the string in the binary!
+	db     0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah
+
+IFDEF NOUNDERLINE
+longest_match_686   endp
+ELSE
+_longest_match_686  endp
+ENDIF
+
+_TEXT   ends
+end
diff --git a/contrib/vstudio/vc70_32/gvmat32c.c b/contrib/masmx86/gvmat32c.c
similarity index 99%
rename from contrib/vstudio/vc70_32/gvmat32c.c
rename to contrib/masmx86/gvmat32c.c
index 38be10b..9ed25f3 100644
--- a/contrib/vstudio/vc70_32/gvmat32c.c
+++ b/contrib/masmx86/gvmat32c.c
@@ -1,209 +1,206 @@
-/* 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"

-

-#undef FAR

-//#include <windows.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)
+ *
+ */
+
+#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 */
diff --git a/contrib/masmx86/inffas32.asm b/contrib/masmx86/inffas32.asm
new file mode 100644
index 0000000..7d76e1c
--- /dev/null
+++ b/contrib/masmx86/inffas32.asm
@@ -0,0 +1,1033 @@
+; 75 "inffast.S"
+;FILE "inffast.S"
+
+;;;GLOBAL _inflate_fast
+
+;;;SECTION .text
+
+
+
+	.586p
+	.mmx
+
+	name	inflate_fast_x86
+	.MODEL	FLAT
+
+_DATA			segment
+inflate_fast_use_mmx:
+	dd	1
+
+
+_TEXT			segment
+PUBLIC _inflate_fast
+
+ALIGN 4
+_inflate_fast:
+	jmp inflate_fast_entry
+
+
+
+ALIGN 4
+	db	'Fast decoding Code from Chris Anderson'
+	db	0
+
+ALIGN 4
+invalid_literal_length_code_msg:
+	db	'invalid literal/length code'
+	db	0
+
+ALIGN 4
+invalid_distance_code_msg:
+	db	'invalid distance code'
+	db	0
+
+ALIGN 4
+invalid_distance_too_far_msg:
+	db	'invalid distance too far back'
+	db	0
+
+
+ALIGN 4
+inflate_fast_mask:
+dd	0
+dd	1
+dd	3
+dd	7
+dd	15
+dd	31
+dd	63
+dd	127
+dd	255
+dd	511
+dd	1023
+dd	2047
+dd	4095
+dd	8191
+dd	16383
+dd	32767
+dd	65535
+dd	131071
+dd	262143
+dd	524287
+dd	1048575
+dd	2097151
+dd	4194303
+dd	8388607
+dd	16777215
+dd	33554431
+dd	67108863
+dd	134217727
+dd	268435455
+dd	536870911
+dd	1073741823
+dd	2147483647
+dd	4294967295
+
+
+
+mode_state	 equ	0	;/* state->mode	*/
+wsize_state	 equ	32	;/* state->wsize */
+write_state	 equ	(36+4)	;/* state->write */
+window_state	 equ	(40+4)	;/* state->window */
+hold_state	 equ	(44+4)	;/* state->hold	*/
+bits_state	 equ	(48+4)	;/* state->bits	*/
+lencode_state	 equ	(64+4)	;/* state->lencode */
+distcode_state	 equ	(68+4)	;/* state->distcode */
+lenbits_state	 equ	(72+4)	;/* state->lenbits */
+distbits_state	 equ	(76+4)	;/* state->distbits */
+
+
+;;SECTION .text
+; 205 "inffast.S"
+;GLOBAL	inflate_fast_use_mmx
+
+;SECTION .data
+
+
+; GLOBAL inflate_fast_use_mmx:object
+;.size inflate_fast_use_mmx, 4
+; 226 "inffast.S"
+;SECTION .text
+
+ALIGN 4
+inflate_fast_entry:
+	push  edi
+	push  esi
+	push  ebp
+	push  ebx
+	pushfd
+	sub  esp,64
+	cld
+
+
+
+
+	mov  esi, [esp+88]
+	mov  edi, [esi+28]
+
+
+
+
+
+
+
+	mov  edx, [esi+4]
+	mov  eax, [esi+0]
+
+	add  edx,eax
+	sub  edx,11
+
+	mov  [esp+44],eax
+	mov  [esp+20],edx
+
+	mov  ebp, [esp+92]
+	mov  ecx, [esi+16]
+	mov  ebx, [esi+12]
+
+	sub  ebp,ecx
+	neg  ebp
+	add  ebp,ebx
+
+	sub  ecx,257
+	add  ecx,ebx
+
+	mov  [esp+60],ebx
+	mov  [esp+40],ebp
+	mov  [esp+16],ecx
+; 285 "inffast.S"
+	mov  eax, [edi+lencode_state]
+	mov  ecx, [edi+distcode_state]
+
+	mov  [esp+8],eax
+	mov  [esp+12],ecx
+
+	mov  eax,1
+	mov  ecx, [edi+lenbits_state]
+	shl  eax,cl
+	dec  eax
+	mov  [esp+0],eax
+
+	mov  eax,1
+	mov  ecx, [edi+distbits_state]
+	shl  eax,cl
+	dec  eax
+	mov  [esp+4],eax
+
+	mov  eax, [edi+wsize_state]
+	mov  ecx, [edi+write_state]
+	mov  edx, [edi+window_state]
+
+	mov  [esp+52],eax
+	mov  [esp+48],ecx
+	mov  [esp+56],edx
+
+	mov  ebp, [edi+hold_state]
+	mov  ebx, [edi+bits_state]
+; 321 "inffast.S"
+	mov  esi, [esp+44]
+	mov  ecx, [esp+20]
+	cmp  ecx,esi
+	ja   L_align_long
+
+	add  ecx,11
+	sub  ecx,esi
+	mov  eax,12
+	sub  eax,ecx
+	lea  edi, [esp+28]
+	rep movsb
+	mov  ecx,eax
+	xor  eax,eax
+	rep stosb
+	lea  esi, [esp+28]
+	mov  [esp+20],esi
+	jmp  L_is_aligned
+
+
+L_align_long:
+	test  esi,3
+	jz   L_is_aligned
+	xor  eax,eax
+	mov  al, [esi]
+	inc  esi
+	mov  ecx,ebx
+	add  ebx,8
+	shl  eax,cl
+	or  ebp,eax
+	jmp L_align_long
+
+L_is_aligned:
+	mov  edi, [esp+60]
+; 366 "inffast.S"
+L_check_mmx:
+	cmp  dword ptr [inflate_fast_use_mmx],2
+	je   L_init_mmx
+	ja   L_do_loop
+
+	push  eax
+	push  ebx
+	push  ecx
+	push  edx
+	pushfd
+	mov  eax, [esp]
+	xor  dword ptr [esp],0200000h
+
+
+
+
+	popfd
+	pushfd
+	pop  edx
+	xor  edx,eax
+	jz   L_dont_use_mmx
+	xor  eax,eax
+	cpuid
+	cmp  ebx,0756e6547h
+	jne  L_dont_use_mmx
+	cmp  ecx,06c65746eh
+	jne  L_dont_use_mmx
+	cmp  edx,049656e69h
+	jne  L_dont_use_mmx
+	mov  eax,1
+	cpuid
+	shr  eax,8
+	and  eax,15
+	cmp  eax,6
+	jne  L_dont_use_mmx
+	test  edx,0800000h
+	jnz  L_use_mmx
+	jmp  L_dont_use_mmx
+L_use_mmx:
+	mov  dword ptr [inflate_fast_use_mmx],2
+	jmp  L_check_mmx_pop
+L_dont_use_mmx:
+	mov  dword ptr [inflate_fast_use_mmx],3
+L_check_mmx_pop:
+	pop  edx
+	pop  ecx
+	pop  ebx
+	pop  eax
+	jmp  L_check_mmx
+; 426 "inffast.S"
+ALIGN 4
+L_do_loop:
+; 437 "inffast.S"
+	cmp  bl,15
+	ja   L_get_length_code
+
+	xor  eax,eax
+	lodsw
+	mov  cl,bl
+	add  bl,16
+	shl  eax,cl
+	or  ebp,eax
+
+L_get_length_code:
+	mov  edx, [esp+0]
+	mov  ecx, [esp+8]
+	and  edx,ebp
+	mov  eax, [ecx+edx*4]
+
+L_dolen:
+
+
+
+
+
+
+	mov  cl,ah
+	sub  bl,ah
+	shr  ebp,cl
+
+
+
+
+
+
+	test  al,al
+	jnz   L_test_for_length_base
+
+	shr  eax,16
+	stosb
+
+L_while_test:
+
+
+	cmp  [esp+16],edi
+	jbe  L_break_loop
+
+	cmp  [esp+20],esi
+	ja   L_do_loop
+	jmp  L_break_loop
+
+L_test_for_length_base:
+; 502 "inffast.S"
+	mov  edx,eax
+	shr  edx,16
+	mov  cl,al
+
+	test  al,16
+	jz   L_test_for_second_level_length
+	and  cl,15
+	jz   L_save_len
+	cmp  bl,cl
+	jae  L_add_bits_to_len
+
+	mov  ch,cl
+	xor  eax,eax
+	lodsw
+	mov  cl,bl
+	add  bl,16
+	shl  eax,cl
+	or  ebp,eax
+	mov  cl,ch
+
+L_add_bits_to_len:
+	mov  eax,1
+	shl  eax,cl
+	dec  eax
+	sub  bl,cl
+	and  eax,ebp
+	shr  ebp,cl
+	add  edx,eax
+
+L_save_len:
+	mov  [esp+24],edx
+
+
+L_decode_distance:
+; 549 "inffast.S"
+	cmp  bl,15
+	ja   L_get_distance_code
+
+	xor  eax,eax
+	lodsw
+	mov  cl,bl
+	add  bl,16
+	shl  eax,cl
+	or  ebp,eax
+
+L_get_distance_code:
+	mov  edx, [esp+4]
+	mov  ecx, [esp+12]
+	and  edx,ebp
+	mov  eax, [ecx+edx*4]
+
+
+L_dodist:
+	mov  edx,eax
+	shr  edx,16
+	mov  cl,ah
+	sub  bl,ah
+	shr  ebp,cl
+; 584 "inffast.S"
+	mov  cl,al
+
+	test  al,16
+	jz  L_test_for_second_level_dist
+	and  cl,15
+	jz  L_check_dist_one
+	cmp  bl,cl
+	jae  L_add_bits_to_dist
+
+	mov  ch,cl
+	xor  eax,eax
+	lodsw
+	mov  cl,bl
+	add  bl,16
+	shl  eax,cl
+	or  ebp,eax
+	mov  cl,ch
+
+L_add_bits_to_dist:
+	mov  eax,1
+	shl  eax,cl
+	dec  eax
+	sub  bl,cl
+	and  eax,ebp
+	shr  ebp,cl
+	add  edx,eax
+	jmp  L_check_window
+
+L_check_window:
+; 625 "inffast.S"
+	mov  [esp+44],esi
+	mov  eax,edi
+	sub  eax, [esp+40]
+
+	cmp  eax,edx
+	jb   L_clip_window
+
+	mov  ecx, [esp+24]
+	mov  esi,edi
+	sub  esi,edx
+
+	sub  ecx,3
+	mov  al, [esi]
+	mov  [edi],al
+	mov  al, [esi+1]
+	mov  dl, [esi+2]
+	add  esi,3
+	mov  [edi+1],al
+	mov  [edi+2],dl
+	add  edi,3
+	rep movsb
+
+	mov  esi, [esp+44]
+	jmp  L_while_test
+
+ALIGN 4
+L_check_dist_one:
+	cmp  edx,1
+	jne  L_check_window
+	cmp  [esp+40],edi
+	je  L_check_window
+
+	dec  edi
+	mov  ecx, [esp+24]
+	mov  al, [edi]
+	sub  ecx,3
+
+	mov  [edi+1],al
+	mov  [edi+2],al
+	mov  [edi+3],al
+	add  edi,4
+	rep stosb
+
+	jmp  L_while_test
+
+ALIGN 4
+L_test_for_second_level_length:
+
+
+
+
+	test  al,64
+	jnz   L_test_for_end_of_block
+
+	mov  eax,1
+	shl  eax,cl
+	dec  eax
+	and  eax,ebp
+	add  eax,edx
+	mov  edx, [esp+8]
+	mov  eax, [edx+eax*4]
+	jmp  L_dolen
+
+ALIGN 4
+L_test_for_second_level_dist:
+
+
+
+
+	test  al,64
+	jnz   L_invalid_distance_code
+
+	mov  eax,1
+	shl  eax,cl
+	dec  eax
+	and  eax,ebp
+	add  eax,edx
+	mov  edx, [esp+12]
+	mov  eax, [edx+eax*4]
+	jmp  L_dodist
+
+ALIGN 4
+L_clip_window:
+; 721 "inffast.S"
+	mov  ecx,eax
+	mov  eax, [esp+52]
+	neg  ecx
+	mov  esi, [esp+56]
+
+	cmp  eax,edx
+	jb   L_invalid_distance_too_far
+
+	add  ecx,edx
+	cmp  dword ptr [esp+48],0
+	jne  L_wrap_around_window
+
+	sub  eax,ecx
+	add  esi,eax
+; 749 "inffast.S"
+	mov  eax, [esp+24]
+	cmp  eax,ecx
+	jbe  L_do_copy1
+
+	sub  eax,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,edx
+	jmp  L_do_copy1
+
+	cmp  eax,ecx
+	jbe  L_do_copy1
+
+	sub  eax,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,edx
+	jmp  L_do_copy1
+
+L_wrap_around_window:
+; 793 "inffast.S"
+	mov  eax, [esp+48]
+	cmp  ecx,eax
+	jbe  L_contiguous_in_window
+
+	add  esi, [esp+52]
+	add  esi,eax
+	sub  esi,ecx
+	sub  ecx,eax
+
+
+	mov  eax, [esp+24]
+	cmp  eax,ecx
+	jbe  L_do_copy1
+
+	sub  eax,ecx
+	rep movsb
+	mov  esi, [esp+56]
+	mov  ecx, [esp+48]
+	cmp  eax,ecx
+	jbe  L_do_copy1
+
+	sub  eax,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,edx
+	jmp  L_do_copy1
+
+L_contiguous_in_window:
+; 836 "inffast.S"
+	add  esi,eax
+	sub  esi,ecx
+
+
+	mov  eax, [esp+24]
+	cmp  eax,ecx
+	jbe  L_do_copy1
+
+	sub  eax,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,edx
+
+L_do_copy1:
+; 862 "inffast.S"
+	mov  ecx,eax
+	rep movsb
+
+	mov  esi, [esp+44]
+	jmp  L_while_test
+; 878 "inffast.S"
+ALIGN 4
+L_init_mmx:
+	emms
+
+
+
+
+
+	movd mm0,ebp
+	mov  ebp,ebx
+; 896 "inffast.S"
+	movd mm4,[esp+0]
+	movq mm3,mm4
+	movd mm5,[esp+4]
+	movq mm2,mm5
+	pxor mm1,mm1
+	mov  ebx, [esp+8]
+	jmp  L_do_loop_mmx
+
+ALIGN 4
+L_do_loop_mmx:
+	psrlq mm0,mm1
+
+	cmp  ebp,32
+	ja  L_get_length_code_mmx
+
+	movd mm6,ebp
+	movd mm7,[esi]
+	add  esi,4
+	psllq mm7,mm6
+	add  ebp,32
+	por mm0,mm7
+
+L_get_length_code_mmx:
+	pand mm4,mm0
+	movd eax,mm4
+	movq mm4,mm3
+	mov  eax, [ebx+eax*4]
+
+L_dolen_mmx:
+	movzx  ecx,ah
+	movd mm1,ecx
+	sub  ebp,ecx
+
+	test  al,al
+	jnz L_test_for_length_base_mmx
+
+	shr  eax,16
+	stosb
+
+L_while_test_mmx:
+
+
+	cmp  [esp+16],edi
+	jbe L_break_loop
+
+	cmp  [esp+20],esi
+	ja L_do_loop_mmx
+	jmp L_break_loop
+
+L_test_for_length_base_mmx:
+
+	mov  edx,eax
+	shr  edx,16
+
+	test  al,16
+	jz  L_test_for_second_level_length_mmx
+	and  eax,15
+	jz L_decode_distance_mmx
+
+	psrlq mm0,mm1
+	movd mm1,eax
+	movd ecx,mm0
+	sub  ebp,eax
+	and  ecx, [inflate_fast_mask+eax*4]
+	add  edx,ecx
+
+L_decode_distance_mmx:
+	psrlq mm0,mm1
+
+	cmp  ebp,32
+	ja L_get_dist_code_mmx
+
+	movd mm6,ebp
+	movd mm7,[esi]
+	add  esi,4
+	psllq mm7,mm6
+	add  ebp,32
+	por mm0,mm7
+
+L_get_dist_code_mmx:
+	mov  ebx, [esp+12]
+	pand mm5,mm0
+	movd eax,mm5
+	movq mm5,mm2
+	mov  eax, [ebx+eax*4]
+
+L_dodist_mmx:
+
+	movzx  ecx,ah
+	mov  ebx,eax
+	shr  ebx,16
+	sub  ebp,ecx
+	movd mm1,ecx
+
+	test  al,16
+	jz L_test_for_second_level_dist_mmx
+	and  eax,15
+	jz L_check_dist_one_mmx
+
+L_add_bits_to_dist_mmx:
+	psrlq mm0,mm1
+	movd mm1,eax
+	movd ecx,mm0
+	sub  ebp,eax
+	and  ecx, [inflate_fast_mask+eax*4]
+	add  ebx,ecx
+
+L_check_window_mmx:
+	mov  [esp+44],esi
+	mov  eax,edi
+	sub  eax, [esp+40]
+
+	cmp  eax,ebx
+	jb L_clip_window_mmx
+
+	mov  ecx,edx
+	mov  esi,edi
+	sub  esi,ebx
+
+	sub  ecx,3
+	mov  al, [esi]
+	mov  [edi],al
+	mov  al, [esi+1]
+	mov  dl, [esi+2]
+	add  esi,3
+	mov  [edi+1],al
+	mov  [edi+2],dl
+	add  edi,3
+	rep movsb
+
+	mov  esi, [esp+44]
+	mov  ebx, [esp+8]
+	jmp  L_while_test_mmx
+
+ALIGN 4
+L_check_dist_one_mmx:
+	cmp  ebx,1
+	jne  L_check_window_mmx
+	cmp  [esp+40],edi
+	je   L_check_window_mmx
+
+	dec  edi
+	mov  ecx,edx
+	mov  al, [edi]
+	sub  ecx,3
+
+	mov  [edi+1],al
+	mov  [edi+2],al
+	mov  [edi+3],al
+	add  edi,4
+	rep stosb
+
+	mov  ebx, [esp+8]
+	jmp  L_while_test_mmx
+
+ALIGN 4
+L_test_for_second_level_length_mmx:
+	test  al,64
+	jnz L_test_for_end_of_block
+
+	and  eax,15
+	psrlq mm0,mm1
+	movd ecx,mm0
+	and  ecx, [inflate_fast_mask+eax*4]
+	add  ecx,edx
+	mov  eax, [ebx+ecx*4]
+	jmp L_dolen_mmx
+
+ALIGN 4
+L_test_for_second_level_dist_mmx:
+	test  al,64
+	jnz L_invalid_distance_code
+
+	and  eax,15
+	psrlq mm0,mm1
+	movd ecx,mm0
+	and  ecx, [inflate_fast_mask+eax*4]
+	mov  eax, [esp+12]
+	add  ecx,ebx
+	mov  eax, [eax+ecx*4]
+	jmp  L_dodist_mmx
+
+ALIGN 4
+L_clip_window_mmx:
+
+	mov  ecx,eax
+	mov  eax, [esp+52]
+	neg  ecx
+	mov  esi, [esp+56]
+
+	cmp  eax,ebx
+	jb  L_invalid_distance_too_far
+
+	add  ecx,ebx
+	cmp  dword ptr [esp+48],0
+	jne  L_wrap_around_window_mmx
+
+	sub  eax,ecx
+	add  esi,eax
+
+	cmp  edx,ecx
+	jbe  L_do_copy1_mmx
+
+	sub  edx,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,ebx
+	jmp  L_do_copy1_mmx
+
+	cmp  edx,ecx
+	jbe  L_do_copy1_mmx
+
+	sub  edx,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,ebx
+	jmp  L_do_copy1_mmx
+
+L_wrap_around_window_mmx:
+
+	mov  eax, [esp+48]
+	cmp  ecx,eax
+	jbe  L_contiguous_in_window_mmx
+
+	add  esi, [esp+52]
+	add  esi,eax
+	sub  esi,ecx
+	sub  ecx,eax
+
+
+	cmp  edx,ecx
+	jbe  L_do_copy1_mmx
+
+	sub  edx,ecx
+	rep movsb
+	mov  esi, [esp+56]
+	mov  ecx, [esp+48]
+	cmp  edx,ecx
+	jbe  L_do_copy1_mmx
+
+	sub  edx,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,ebx
+	jmp  L_do_copy1_mmx
+
+L_contiguous_in_window_mmx:
+
+	add  esi,eax
+	sub  esi,ecx
+
+
+	cmp  edx,ecx
+	jbe  L_do_copy1_mmx
+
+	sub  edx,ecx
+	rep movsb
+	mov  esi,edi
+	sub  esi,ebx
+
+L_do_copy1_mmx:
+
+
+	mov  ecx,edx
+	rep movsb
+
+	mov  esi, [esp+44]
+	mov  ebx, [esp+8]
+	jmp  L_while_test_mmx
+; 1174 "inffast.S"
+L_invalid_distance_code:
+
+
+
+
+
+	mov  ecx, invalid_distance_code_msg
+	mov  edx,26
+	jmp  L_update_stream_state
+
+L_test_for_end_of_block:
+
+
+
+
+
+	test  al,32
+	jz  L_invalid_literal_length_code
+
+	mov  ecx,0
+	mov  edx,11
+	jmp  L_update_stream_state
+
+L_invalid_literal_length_code:
+
+
+
+
+
+	mov  ecx, invalid_literal_length_code_msg
+	mov  edx,26
+	jmp  L_update_stream_state
+
+L_invalid_distance_too_far:
+
+
+
+	mov  esi, [esp+44]
+	mov  ecx, invalid_distance_too_far_msg
+	mov  edx,26
+	jmp  L_update_stream_state
+
+L_update_stream_state:
+
+	mov  eax, [esp+88]
+	test  ecx,ecx
+	jz  L_skip_msg
+	mov  [eax+24],ecx
+L_skip_msg:
+	mov  eax, [eax+28]
+	mov  [eax+mode_state],edx
+	jmp  L_break_loop
+
+ALIGN 4
+L_break_loop:
+; 1243 "inffast.S"
+	cmp  dword ptr [inflate_fast_use_mmx],2
+	jne  L_update_next_in
+
+
+
+	mov  ebx,ebp
+
+L_update_next_in:
+; 1266 "inffast.S"
+	mov  eax, [esp+88]
+	mov  ecx,ebx
+	mov  edx, [eax+28]
+	shr  ecx,3
+	sub  esi,ecx
+	shl  ecx,3
+	sub  ebx,ecx
+	mov  [eax+12],edi
+	mov  [edx+bits_state],ebx
+	mov  ecx,ebx
+
+	lea  ebx, [esp+28]
+	cmp  [esp+20],ebx
+	jne  L_buf_not_used
+
+	sub  esi,ebx
+	mov  ebx, [eax+0]
+	mov  [esp+20],ebx
+	add  esi,ebx
+	mov  ebx, [eax+4]
+	sub  ebx,11
+	add  [esp+20],ebx
+
+L_buf_not_used:
+	mov  [eax+0],esi
+
+	mov  ebx,1
+	shl  ebx,cl
+	dec  ebx
+
+
+
+
+
+	cmp  dword ptr [inflate_fast_use_mmx],2
+	jne  L_update_hold
+
+
+
+	psrlq mm0,mm1
+	movd ebp,mm0
+
+	emms
+
+L_update_hold:
+
+
+
+	and  ebp,ebx
+	mov  [edx+hold_state],ebp
+
+
+
+
+	mov  ebx, [esp+20]
+	cmp  ebx,esi
+	jbe  L_last_is_smaller
+
+	sub  ebx,esi
+	add  ebx,11
+	mov  [eax+4],ebx
+	jmp  L_fixup_out
+L_last_is_smaller:
+	sub  esi,ebx
+	neg  esi
+	add  esi,11
+	mov  [eax+4],esi
+
+
+
+
+L_fixup_out:
+
+	mov  ebx, [esp+16]
+	cmp  ebx,edi
+	jbe  L_end_is_smaller
+
+	sub  ebx,edi
+	add  ebx,257
+	mov  [eax+16],ebx
+	jmp  L_done
+L_end_is_smaller:
+	sub  edi,ebx
+	neg  edi
+	add  edi,257
+	mov  [eax+16],edi
+
+
+
+
+
+L_done:
+	add  esp,64
+	popfd
+	pop  ebx
+	pop  ebp
+	pop  esi
+	pop  edi
+	ret
+
+
+
+
+_TEXT	ends
+end
diff --git a/contrib/masmx86/mkasm.bat b/contrib/masmx86/mkasm.bat
new file mode 100755
index 0000000..f3fa0a0
--- /dev/null
+++ b/contrib/masmx86/mkasm.bat
@@ -0,0 +1,3 @@
+cl /I..\.. /O2 /c gvmat32c.c

+ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm

+ml /coff /Zi /c /Flinffas32.lst inffas32.asm

diff --git a/contrib/masmx86/readme.txt b/contrib/masmx86/readme.txt
new file mode 100644
index 0000000..7b57167
--- /dev/null
+++ b/contrib/masmx86/readme.txt
@@ -0,0 +1,21 @@
+
+Summary
+-------
+This directory contains ASM implementations of the functions
+longest_match() and inflate_fast().
+
+
+Use instructions
+----------------
+Copy these files into the zlib source directory, then run the
+appropriate makefile, as suggested below.
+
+
+Build instructions
+------------------
+* With Microsoft C and MASM:
+nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj"
+
+* With Borland C and TASM:
+make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj" OBJPA="+gvmat32c.obj+gvmat32.obj+inffas32.obj"
+
diff --git a/contrib/minizip/ChangeLogUnzip b/contrib/minizip/ChangeLogUnzip
index 45fd099..cfabd61 100644
--- a/contrib/minizip/ChangeLogUnzip
+++ b/contrib/minizip/ChangeLogUnzip
@@ -1,51 +1,51 @@
-Change in 0.22: (19 May 03)

-- crypting support (unless you define NOCRYPT)

-- append file in existing zipfile

-

-Change in 0.21: (10 Mar 03)

-- bug fixes

-

-Change in 0.17: (27 Jan 02)

-- bug fixes

-

-Change in 0.16: (19 Jan 02)

-- Support of ioapi for virtualize zip file access

-

-Change in 0.15: (19 Mar 98)

-- fix memory leak in minizip.c

-

-Change in 0.14: (10 Mar 98)

-- fix bugs in minizip.c sample for zipping big file

-- fix problem in month in date handling

-- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for 

-    comment handling

-

-Change in 0.13: (6 Mar 98)

-- fix bugs in zip.c

-- add real minizip sample

-

-Change in 0.12: (4 Mar 98)

-- add zip.c and zip.h for creates .zip file

-- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)

-- fix miniunz.c for file without specific record for directory

-

-Change in 0.11: (3 Mar 98)

-- fix bug in unzGetCurrentFileInfo for get extra field and comment

-- enhance miniunz sample, remove the bad unztst.c sample

-

-Change in 0.10: (2 Mar 98)

-- fix bug in unzReadCurrentFile

-- rename unzip* to unz* function and structure

-- remove Windows-like hungary notation variable name

-- modify some structure in unzip.h

-- add somes comment in source

-- remove unzipGetcCurrentFile function

-- replace ZUNZEXPORT by ZEXPORT

-- add unzGetLocalExtrafield for get the local extrafield info

-- add a new sample, miniunz.c

-

-Change in 0.4: (25 Feb 98)

-- suppress the type unzipFileInZip. 

-  Only on file in the zipfile can be open at the same time

-- fix somes typo in code

-- added tm_unz structure in unzip_file_info (date/time in readable format)

+Change in 0.22: (19 May 03)
+- crypting support (unless you define NOCRYPT)
+- append file in existing zipfile
+
+Change in 0.21: (10 Mar 03)
+- bug fixes
+
+Change in 0.17: (27 Jan 02)
+- bug fixes
+
+Change in 0.16: (19 Jan 02)
+- Support of ioapi for virtualize zip file access
+
+Change in 0.15: (19 Mar 98)
+- fix memory leak in minizip.c
+
+Change in 0.14: (10 Mar 98)
+- fix bugs in minizip.c sample for zipping big file
+- fix problem in month in date handling
+- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
+    comment handling
+
+Change in 0.13: (6 Mar 98)
+- fix bugs in zip.c
+- add real minizip sample
+
+Change in 0.12: (4 Mar 98)
+- add zip.c and zip.h for creates .zip file
+- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
+- fix miniunz.c for file without specific record for directory
+
+Change in 0.11: (3 Mar 98)
+- fix bug in unzGetCurrentFileInfo for get extra field and comment
+- enhance miniunz sample, remove the bad unztst.c sample
+
+Change in 0.10: (2 Mar 98)
+- fix bug in unzReadCurrentFile
+- rename unzip* to unz* function and structure
+- remove Windows-like hungary notation variable name
+- modify some structure in unzip.h
+- add somes comment in source
+- remove unzipGetcCurrentFile function
+- replace ZUNZEXPORT by ZEXPORT
+- add unzGetLocalExtrafield for get the local extrafield info
+- add a new sample, miniunz.c
+
+Change in 0.4: (25 Feb 98)
+- suppress the type unzipFileInZip.
+  Only on file in the zipfile can be open at the same time
+- fix somes typo in code
+- added tm_unz structure in unzip_file_info (date/time in readable format)
diff --git a/contrib/minizip/Makefile b/contrib/minizip/Makefile
index fbba3ac..84eaad2 100644
--- a/contrib/minizip/Makefile
+++ b/contrib/minizip/Makefile
@@ -1,25 +1,25 @@
-CC=cc

-CFLAGS=-O -I../..

-

-UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a

-ZIP_OBJS = minizip.o zip.o   ioapi.o ../../libz.a

-

-.c.o:

-	$(CC) -c $(CFLAGS) $*.c

-

-all: miniunz minizip

-

-miniunz:  $(UNZ_OBJS)

-	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)

-

-minizip:  $(ZIP_OBJS)

-	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)

-

-test:	miniunz minizip

-	./minizip test readme.txt

-	./miniunz -l test.zip

-	mv readme.txt readme.old

-	./miniunz test.zip

-

-clean:

-	/bin/rm -f *.o *~ minizip miniunz

+CC=cc
+CFLAGS=-O -I../..
+
+UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
+ZIP_OBJS = minizip.o zip.o   ioapi.o ../../libz.a
+
+.c.o:
+	$(CC) -c $(CFLAGS) $*.c
+
+all: miniunz minizip
+
+miniunz:  $(UNZ_OBJS)
+	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
+
+minizip:  $(ZIP_OBJS)
+	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
+
+test:	miniunz minizip
+	./minizip test readme.txt
+	./miniunz -l test.zip
+	mv readme.txt readme.old
+	./miniunz test.zip
+
+clean:
+	/bin/rm -f *.o *~ minizip miniunz
diff --git a/contrib/minizip/crypt.h b/contrib/minizip/crypt.h
index 83e763c..a02bf0b 100644
--- a/contrib/minizip/crypt.h
+++ b/contrib/minizip/crypt.h
@@ -1,104 +1,104 @@
-

-#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))

-

-/***********************************************************************

- * Return the next byte in the pseudo-random sequence

- */

-static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)

-{

-    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an

-                     * unpredictable manner on 16-bit systems; not a problem

-                     * with any known compiler so far, though */

-

-    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;

-    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);

-}

-

-/***********************************************************************

- * Update the encryption keys with the next byte of plain text

- */

-static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)

-{

-    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);

-    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;

-    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;

-    {

-      register int keyshift = (int)((*(pkeys+1)) >> 24);

-      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);

-    }

-    return c;

-}

-

-

-/***********************************************************************

- * Initialize the encryption keys and the random header according to

- * the given password.

- */

-static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)

-{

-    *(pkeys+0) = 305419896L;

-    *(pkeys+1) = 591751049L;

-    *(pkeys+2) = 878082192L;

-    while (*passwd != '\0') {

-        update_keys(pkeys,pcrc_32_tab,(int)*passwd);

-        passwd++;

-    }

-}

-

-#define zdecode(pkeys,pcrc_32_tab,c) \

-    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))

-

-#define zencode(pkeys,pcrc_32_tab,c,t) \

-    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))

-

-#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED

-

-#define RAND_HEAD_LEN  12

-   /* "last resort" source for second part of crypt seed pattern */

-#  ifndef ZCR_SEED2

-#    define ZCR_SEED2 (unsigned long)3141592654L     /* use PI as default pattern */

-#  endif

-

-static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)

-    const char *passwd;         /* password string */

-    unsigned char *buf;         /* where to write header */

-    int bufSize;

-    unsigned long* pkeys;

-    const unsigned long* pcrc_32_tab;

-    unsigned long crcForCrypting;

-{

-    int n;                       /* index in random header */

-    int t;                       /* temporary */

-    int c;                       /* random byte */

-    unsigned char header[RAND_HEAD_LEN-2]; /* random header */

-    static unsigned calls = 0;   /* ensure different random header each time */

-

-    if (bufSize<RAND_HEAD_LEN)

-      return 0;

-

-    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the

-     * output of rand() to get less predictability, since rand() is

-     * often poorly implemented.

-     */

-    if (++calls == 1)

-    {

-        srand((unsigned)(time(NULL) ^ ZCR_SEED2));

-    }

-    init_keys(passwd, pkeys, pcrc_32_tab);

-    for (n = 0; n < RAND_HEAD_LEN-2; n++)

-    {

-        c = (rand() >> 7) & 0xff;

-        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);

-    }

-    /* Encrypt random header (last two bytes is high word of crc) */

-    init_keys(passwd, pkeys, pcrc_32_tab);

-    for (n = 0; n < RAND_HEAD_LEN-2; n++)

-    {

-        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);

-    }

-    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);

-    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);

-    return n;

-}

-

-#endif

+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
+{
+    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
+                     * unpredictable manner on 16-bit systems; not a problem
+                     * with any known compiler so far, though */
+
+    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+    {
+      register int keyshift = (int)((*(pkeys+1)) >> 24);
+      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+    }
+    return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+    *(pkeys+0) = 305419896L;
+    *(pkeys+1) = 591751049L;
+    *(pkeys+2) = 878082192L;
+    while (*passwd != '\0') {
+        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+        passwd++;
+    }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN  12
+   /* "last resort" source for second part of crypt seed pattern */
+#  ifndef ZCR_SEED2
+#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
+#  endif
+
+static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
+    const char *passwd;         /* password string */
+    unsigned char *buf;         /* where to write header */
+    int bufSize;
+    unsigned long* pkeys;
+    const unsigned long* pcrc_32_tab;
+    unsigned long crcForCrypting;
+{
+    int n;                       /* index in random header */
+    int t;                       /* temporary */
+    int c;                       /* random byte */
+    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+    static unsigned calls = 0;   /* ensure different random header each time */
+
+    if (bufSize<RAND_HEAD_LEN)
+      return 0;
+
+    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+     * output of rand() to get less predictability, since rand() is
+     * often poorly implemented.
+     */
+    if (++calls == 1)
+    {
+        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+    }
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        c = (rand() >> 7) & 0xff;
+        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+    }
+    /* Encrypt random header (last two bytes is high word of crc) */
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+    }
+    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+    buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+    return n;
+}
+
+#endif
diff --git a/contrib/minizip/ioapi.c b/contrib/minizip/ioapi.c
index 61c6e2b..ea9ee30 100644
--- a/contrib/minizip/ioapi.c
+++ b/contrib/minizip/ioapi.c
@@ -1,177 +1,177 @@
-/* ioapi.c -- IO base function header for compress/uncompress .zip

-   files using zlib + zip or unzip API

-

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 Gilles Vollant

-*/

-

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-

-#include "zlib.h"

-#include "ioapi.h"

-

-

-

-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */

-

-#ifndef SEEK_CUR

-#define SEEK_CUR    1

-#endif

-

-#ifndef SEEK_END

-#define SEEK_END    2

-#endif

-

-#ifndef SEEK_SET

-#define SEEK_SET    0

-#endif

-

-voidpf ZCALLBACK fopen_file_func OF((

-   voidpf opaque,

-   const char* filename,

-   int mode));

-

-uLong ZCALLBACK fread_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   void* buf,

-   uLong size));

-

-uLong ZCALLBACK fwrite_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   const void* buf,

-   uLong size));

-

-long ZCALLBACK ftell_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-long ZCALLBACK fseek_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   uLong offset,

-   int origin));

-

-int ZCALLBACK fclose_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-int ZCALLBACK ferror_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-

-voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)

-   voidpf opaque;

-   const char* filename;

-   int mode;

-{

-    FILE* file = NULL;

-    const char* mode_fopen = NULL;

-    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)

-        mode_fopen = "rb";

-    else

-    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)

-        mode_fopen = "r+b";

-    else

-    if (mode & ZLIB_FILEFUNC_MODE_CREATE)

-        mode_fopen = "wb";

-

-    if ((filename!=NULL) && (mode_fopen != NULL))

-        file = fopen(filename, mode_fopen);

-    return file;

-}

-

-

-uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)

-   voidpf opaque;

-   voidpf stream;

-   void* buf;

-   uLong size;

-{

-    uLong ret;

-    ret = fread(buf, 1, (size_t)size, (FILE *)stream);

-    return ret;

-}

-

-

-uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)

-   voidpf opaque;

-   voidpf stream;

-   const void* buf;

-   uLong size;

-{

-    uLong ret;

-    ret = fwrite(buf, 1, (size_t)size, (FILE *)stream);

-    return ret;

-}

-

-long ZCALLBACK ftell_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    long ret;

-    ret = ftell((FILE *)stream);

-    return ret;

-}

-

-long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)

-   voidpf opaque;

-   voidpf stream;

-   uLong offset;

-   int origin;

-{

-    int fseek_origin=0;

-    long ret;

-    switch (origin)

-    {

-    case ZLIB_FILEFUNC_SEEK_CUR :

-        fseek_origin = SEEK_CUR;

-        break;

-    case ZLIB_FILEFUNC_SEEK_END :

-        fseek_origin = SEEK_END;

-        break;

-    case ZLIB_FILEFUNC_SEEK_SET :

-        fseek_origin = SEEK_SET;

-        break;

-    default: return -1;

-    }

-    ret = 0;

-    fseek((FILE *)stream, offset, fseek_origin);

-    return ret;

-}

-

-int ZCALLBACK fclose_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    int ret;

-    ret = fclose((FILE *)stream);

-    return ret;

-}

-

-int ZCALLBACK ferror_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    int ret;

-    ret = ferror((FILE *)stream);

-    return ret;

-}

-

-void fill_fopen_filefunc (pzlib_filefunc_def)

-  zlib_filefunc_def* pzlib_filefunc_def;

-{

-    pzlib_filefunc_def->zopen_file = fopen_file_func;

-    pzlib_filefunc_def->zread_file = fread_file_func;

-    pzlib_filefunc_def->zwrite_file = fwrite_file_func;

-    pzlib_filefunc_def->ztell_file = ftell_file_func;

-    pzlib_filefunc_def->zseek_file = fseek_file_func;

-    pzlib_filefunc_def->zclose_file = fclose_file_func;

-    pzlib_filefunc_def->zerror_file = ferror_file_func;

-    pzlib_filefunc_def->opaque = NULL;

-}

+/* ioapi.c -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 Gilles Vollant
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+
+
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR    1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END    2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET    0
+#endif
+
+voidpf ZCALLBACK fopen_file_func OF((
+   voidpf opaque,
+   const char* filename,
+   int mode));
+
+uLong ZCALLBACK fread_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   void* buf,
+   uLong size));
+
+uLong ZCALLBACK fwrite_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   const void* buf,
+   uLong size));
+
+long ZCALLBACK ftell_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+long ZCALLBACK fseek_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   uLong offset,
+   int origin));
+
+int ZCALLBACK fclose_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+int ZCALLBACK ferror_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+
+voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
+   voidpf opaque;
+   const char* filename;
+   int mode;
+{
+    FILE* file = NULL;
+    const char* mode_fopen = NULL;
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+        mode_fopen = "rb";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+        mode_fopen = "r+b";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+        mode_fopen = "wb";
+
+    if ((filename!=NULL) && (mode_fopen != NULL))
+        file = fopen(filename, mode_fopen);
+    return file;
+}
+
+
+uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
+   voidpf opaque;
+   voidpf stream;
+   void* buf;
+   uLong size;
+{
+    uLong ret;
+    ret = fread(buf, 1, (size_t)size, (FILE *)stream);
+    return ret;
+}
+
+
+uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
+   voidpf opaque;
+   voidpf stream;
+   const void* buf;
+   uLong size;
+{
+    uLong ret;
+    ret = fwrite(buf, 1, (size_t)size, (FILE *)stream);
+    return ret;
+}
+
+long ZCALLBACK ftell_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    long ret;
+    ret = ftell((FILE *)stream);
+    return ret;
+}
+
+long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
+   voidpf opaque;
+   voidpf stream;
+   uLong offset;
+   int origin;
+{
+    int fseek_origin=0;
+    long ret;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        fseek_origin = SEEK_CUR;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        fseek_origin = SEEK_END;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        fseek_origin = SEEK_SET;
+        break;
+    default: return -1;
+    }
+    ret = 0;
+    fseek((FILE *)stream, offset, fseek_origin);
+    return ret;
+}
+
+int ZCALLBACK fclose_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    int ret;
+    ret = fclose((FILE *)stream);
+    return ret;
+}
+
+int ZCALLBACK ferror_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    int ret;
+    ret = ferror((FILE *)stream);
+    return ret;
+}
+
+void fill_fopen_filefunc (pzlib_filefunc_def)
+  zlib_filefunc_def* pzlib_filefunc_def;
+{
+    pzlib_filefunc_def->zopen_file = fopen_file_func;
+    pzlib_filefunc_def->zread_file = fread_file_func;
+    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+    pzlib_filefunc_def->ztell_file = ftell_file_func;
+    pzlib_filefunc_def->zseek_file = fseek_file_func;
+    pzlib_filefunc_def->zclose_file = fclose_file_func;
+    pzlib_filefunc_def->zerror_file = ferror_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
diff --git a/contrib/minizip/ioapi.h b/contrib/minizip/ioapi.h
index 6b8f1f1..13f4f21 100644
--- a/contrib/minizip/ioapi.h
+++ b/contrib/minizip/ioapi.h
@@ -1,75 +1,75 @@
-/* ioapi.h -- IO base function header for compress/uncompress .zip

-   files using zlib + zip or unzip API

-

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 Gilles Vollant

-*/

-

-#ifndef _ZLIBIOAPI_H

-#define _ZLIBIOAPI_H

-

-

-#define ZLIB_FILEFUNC_SEEK_CUR (1)

-#define ZLIB_FILEFUNC_SEEK_END (2)

-#define ZLIB_FILEFUNC_SEEK_SET (0)

-

-#define ZLIB_FILEFUNC_MODE_READ      (1)

-#define ZLIB_FILEFUNC_MODE_WRITE     (2)

-#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)

-

-#define ZLIB_FILEFUNC_MODE_EXISTING (4)

-#define ZLIB_FILEFUNC_MODE_CREATE   (8)

-

-

-#ifndef ZCALLBACK

-

-#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)

-#define ZCALLBACK CALLBACK

-#else

-#define ZCALLBACK

-#endif

-#endif

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));

-typedef uLong  (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));

-typedef uLong  (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));

-typedef long   (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));

-typedef long   (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));

-typedef int    (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));

-typedef int    (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));

-

-typedef struct zlib_filefunc_def_s

-{

-    open_file_func      zopen_file;

-    read_file_func      zread_file;

-    write_file_func     zwrite_file;

-    tell_file_func      ztell_file;

-    seek_file_func      zseek_file;

-    close_file_func     zclose_file;

-    testerror_file_func zerror_file;

-    voidpf              opaque;

-} zlib_filefunc_def;

-

-

-

-void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));

-

-#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))

-#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))

-#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))

-#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))

-#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))

-#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))

-

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif

-

+/* ioapi.h -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 Gilles Vollant
+*/
+
+#ifndef _ZLIBIOAPI_H
+#define _ZLIBIOAPI_H
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ      (1)
+#define ZLIB_FILEFUNC_MODE_WRITE     (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE   (8)
+
+
+#ifndef ZCALLBACK
+
+#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+#define ZCALLBACK CALLBACK
+#else
+#define ZCALLBACK
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
+typedef uLong  (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong  (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef long   (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef long   (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+typedef int    (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int    (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef struct zlib_filefunc_def_s
+{
+    open_file_func      zopen_file;
+    read_file_func      zread_file;
+    write_file_func     zwrite_file;
+    tell_file_func      ztell_file;
+    seek_file_func      zseek_file;
+    close_file_func     zclose_file;
+    testerror_file_func zerror_file;
+    voidpf              opaque;
+} zlib_filefunc_def;
+
+
+
+void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
+#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
+#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
+#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
+#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/contrib/minizip/iowin32.c b/contrib/minizip/iowin32.c
index 53198b6..8e6d43d 100644
--- a/contrib/minizip/iowin32.c
+++ b/contrib/minizip/iowin32.c
@@ -1,271 +1,270 @@
-/* iowin32.c -- IO base function header for compress/uncompress .zip

-   files using zlib + zip or unzip API

-   This IO API version uses the Win32 API (for Microsoft Windows)

-

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 Gilles Vollant

-*/

-

-#include <windows.h>

-#include <stdlib.h>

-

-#include "zlib.h"

-#include "ioapi.h"

-#include "iowin32.h"

-

-#ifndef INVALID_HANDLE_VALUE

-#define INVALID_HANDLE_VALUE (0xFFFFFFFF)

-#endif

-

-#ifndef INVALID_SET_FILE_POINTER

-#define INVALID_SET_FILE_POINTER ((DWORD)-1)

-#endif

-

-voidpf ZCALLBACK win32_open_file_func OF((

-   voidpf opaque,

-   const char* filename,

-   int mode));

-

-uLong ZCALLBACK win32_read_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   void* buf,

-   uLong size));

-

-uLong ZCALLBACK win32_write_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   const void* buf,

-   uLong size));

-

-long ZCALLBACK win32_tell_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-long ZCALLBACK win32_seek_file_func OF((

-   voidpf opaque,

-   voidpf stream,

-   uLong offset,

-   int origin));

-

-long ZCALLBACK win32_close_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-int ZCALLBACK win32_error_file_func OF((

-   voidpf opaque,

-   voidpf stream));

-

-typedef struct

-{

-    HANDLE hf;

-    int error;

-} WIN32FILE_IOWIN;

-

-voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)

-   voidpf opaque;

-   const char* filename;

-   int mode;

-{

-    const char* mode_fopen = NULL;

-    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;

-    HANDLE hFile = 0;

-    voidpf ret=NULL;

-

-    dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;

-

-    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)

-    {

-        dwDesiredAccess = GENERIC_READ;

-        dwCreationDisposition = OPEN_EXISTING;

-        dwShareMode = FILE_SHARE_READ;

-    }

-    else

-    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)

-    {

-        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;

-        dwCreationDisposition = OPEN_EXISTING;

-    }

-    else

-    if (mode & ZLIB_FILEFUNC_MODE_CREATE)

-    {

-        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;

-        dwCreationDisposition = CREATE_ALWAYS;

-    }

-

-    if ((filename!=NULL) && (dwDesiredAccess != 0))

-        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,

-                      dwCreationDisposition, dwFlagsAndAttributes, NULL);

-

-    if (hFile == INVALID_HANDLE_VALUE)

-        hFile = NULL;

-

-    if (hFile != NULL)

-    {

-        WIN32FILE_IOWIN w32fiow;

-        w32fiow.hf = hFile;

-        w32fiow.error = 0;

-        ret = malloc(sizeof(WIN32FILE_IOWIN));

-        if (ret==NULL)

-            CloseHandle(hFile);

-        else *((WIN32FILE_IOWIN*)ret) = w32fiow;

-    }

-    return ret;

-}

-

-

-uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)

-   voidpf opaque;

-   voidpf stream;

-   void* buf;

-   uLong size;

-{

-    uLong ret=0;

-    HANDLE hFile = NULL;

-    if (stream!=NULL)

-        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;

-    if (hFile != NULL)

-        if (!ReadFile(hFile, buf, size, &ret, NULL))

-        {

-            DWORD dwErr = GetLastError();

-            if (dwErr == ERROR_HANDLE_EOF)

-                dwErr = 0;

-            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;

-        }

-

-    return ret;

-}

-

-

-uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)

-   voidpf opaque;

-   voidpf stream;

-   const void* buf;

-   uLong size;

-{

-    uLong ret=0;

-    HANDLE hFile = NULL;

-    if (stream!=NULL)

-        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;

-

-    if (hFile !=NULL)

-        if (!WriteFile(hFile, buf, size, &ret, NULL))

-        {

-            DWORD dwErr = GetLastError();

-            if (dwErr == ERROR_HANDLE_EOF)

-                dwErr = 0;

-            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;

-        }

-

-    return ret;

-}

-

-long ZCALLBACK win32_tell_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    long ret=-1;

-    HANDLE hFile = NULL;

-    if (stream!=NULL)

-        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;

-    if (hFile != NULL)

-    {

-        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);

-        if (dwSet == INVALID_SET_FILE_POINTER)

-        {

-            DWORD dwErr = GetLastError();

-            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;

-            ret = -1;

-        }

-        else

-            ret=(long)dwSet;

-    }

-    return ret;

-}

-

-long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)

-   voidpf opaque;

-   voidpf stream;

-   uLong offset;

-   int origin;

-{

-    DWORD dwMoveMethod=0xFFFFFFFF;

-    HANDLE hFile = NULL;

-

-    long ret=-1;

-    if (stream!=NULL)

-        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;

-    switch (origin)

-    {

-    case ZLIB_FILEFUNC_SEEK_CUR :

-        dwMoveMethod = FILE_CURRENT;

-        break;

-    case ZLIB_FILEFUNC_SEEK_END :

-        dwMoveMethod = FILE_END;

-        break;

-    case ZLIB_FILEFUNC_SEEK_SET :

-        dwMoveMethod = FILE_BEGIN;

-        break;

-    default: return -1;

-    }

-

-    if (hFile != NULL)

-    {

-        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);

-        if (dwSet == INVALID_SET_FILE_POINTER)

-        {

-            DWORD dwErr = GetLastError();

-            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;

-            ret = -1;

-        }

-        else

-            ret=0;

-    }

-    return ret;

-}

-

-long ZCALLBACK win32_close_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    long ret=-1;

-

-    if (stream!=NULL)

-    {

-        HANDLE hFile;

-        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;

-        if (hFile != NULL)

-        {

-            CloseHandle(hFile);

-            ret=0;

-        }

-        free(stream);

-    }

-    return ret;

-}

-

-int ZCALLBACK win32_error_file_func (opaque, stream)

-   voidpf opaque;

-   voidpf stream;

-{

-    int ret=-1;

-    if (stream!=NULL)

-    {

-        ret = ((WIN32FILE_IOWIN*)stream) -> error;

-    }

-    return ret;

-}

-

-void fill_win32_filefunc (pzlib_filefunc_def)

-  zlib_filefunc_def* pzlib_filefunc_def;

-{

-    pzlib_filefunc_def->zopen_file = win32_open_file_func;

-    pzlib_filefunc_def->zread_file = win32_read_file_func;

-    pzlib_filefunc_def->zwrite_file = win32_write_file_func;

-    pzlib_filefunc_def->ztell_file = win32_tell_file_func;

-    pzlib_filefunc_def->zseek_file = win32_seek_file_func;

-    pzlib_filefunc_def->zclose_file = win32_close_file_func;

-    pzlib_filefunc_def->zerror_file = win32_error_file_func;

-    pzlib_filefunc_def->opaque=NULL;

-}

+/* iowin32.c -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+   This IO API version uses the Win32 API (for Microsoft Windows)
+
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 Gilles Vollant
+*/
+
+#include <stdlib.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "iowin32.h"
+
+#ifndef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
+#endif
+
+#ifndef INVALID_SET_FILE_POINTER
+#define INVALID_SET_FILE_POINTER ((DWORD)-1)
+#endif
+
+voidpf ZCALLBACK win32_open_file_func OF((
+   voidpf opaque,
+   const char* filename,
+   int mode));
+
+uLong ZCALLBACK win32_read_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   void* buf,
+   uLong size));
+
+uLong ZCALLBACK win32_write_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   const void* buf,
+   uLong size));
+
+long ZCALLBACK win32_tell_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+long ZCALLBACK win32_seek_file_func OF((
+   voidpf opaque,
+   voidpf stream,
+   uLong offset,
+   int origin));
+
+int ZCALLBACK win32_close_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+int ZCALLBACK win32_error_file_func OF((
+   voidpf opaque,
+   voidpf stream));
+
+typedef struct
+{
+    HANDLE hf;
+    int error;
+} WIN32FILE_IOWIN;
+
+voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
+   voidpf opaque;
+   const char* filename;
+   int mode;
+{
+    const char* mode_fopen = NULL;
+    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+    HANDLE hFile = 0;
+    voidpf ret=NULL;
+
+    dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
+
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+    {
+        dwDesiredAccess = GENERIC_READ;
+        dwCreationDisposition = OPEN_EXISTING;
+        dwShareMode = FILE_SHARE_READ;
+    }
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+    {
+        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+        dwCreationDisposition = OPEN_EXISTING;
+    }
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+    {
+        dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+        dwCreationDisposition = CREATE_ALWAYS;
+    }
+
+    if ((filename!=NULL) && (dwDesiredAccess != 0))
+        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
+                      dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+    if (hFile == INVALID_HANDLE_VALUE)
+        hFile = NULL;
+
+    if (hFile != NULL)
+    {
+        WIN32FILE_IOWIN w32fiow;
+        w32fiow.hf = hFile;
+        w32fiow.error = 0;
+        ret = malloc(sizeof(WIN32FILE_IOWIN));
+        if (ret==NULL)
+            CloseHandle(hFile);
+        else *((WIN32FILE_IOWIN*)ret) = w32fiow;
+    }
+    return ret;
+}
+
+
+uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
+   voidpf opaque;
+   voidpf stream;
+   void* buf;
+   uLong size;
+{
+    uLong ret=0;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+    if (hFile != NULL)
+        if (!ReadFile(hFile, buf, size, &ret, NULL))
+        {
+            DWORD dwErr = GetLastError();
+            if (dwErr == ERROR_HANDLE_EOF)
+                dwErr = 0;
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+        }
+
+    return ret;
+}
+
+
+uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
+   voidpf opaque;
+   voidpf stream;
+   const void* buf;
+   uLong size;
+{
+    uLong ret=0;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+    if (hFile !=NULL)
+        if (!WriteFile(hFile, buf, size, &ret, NULL))
+        {
+            DWORD dwErr = GetLastError();
+            if (dwErr == ERROR_HANDLE_EOF)
+                dwErr = 0;
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+        }
+
+    return ret;
+}
+
+long ZCALLBACK win32_tell_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    long ret=-1;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+    if (hFile != NULL)
+    {
+        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
+        if (dwSet == INVALID_SET_FILE_POINTER)
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = -1;
+        }
+        else
+            ret=(long)dwSet;
+    }
+    return ret;
+}
+
+long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
+   voidpf opaque;
+   voidpf stream;
+   uLong offset;
+   int origin;
+{
+    DWORD dwMoveMethod=0xFFFFFFFF;
+    HANDLE hFile = NULL;
+
+    long ret=-1;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        dwMoveMethod = FILE_CURRENT;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        dwMoveMethod = FILE_END;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        dwMoveMethod = FILE_BEGIN;
+        break;
+    default: return -1;
+    }
+
+    if (hFile != NULL)
+    {
+        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
+        if (dwSet == INVALID_SET_FILE_POINTER)
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = -1;
+        }
+        else
+            ret=0;
+    }
+    return ret;
+}
+
+int ZCALLBACK win32_close_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    int ret=-1;
+
+    if (stream!=NULL)
+    {
+        HANDLE hFile;
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+        if (hFile != NULL)
+        {
+            CloseHandle(hFile);
+            ret=0;
+        }
+        free(stream);
+    }
+    return ret;
+}
+
+int ZCALLBACK win32_error_file_func (opaque, stream)
+   voidpf opaque;
+   voidpf stream;
+{
+    int ret=-1;
+    if (stream!=NULL)
+    {
+        ret = ((WIN32FILE_IOWIN*)stream) -> error;
+    }
+    return ret;
+}
+
+void fill_win32_filefunc (pzlib_filefunc_def)
+  zlib_filefunc_def* pzlib_filefunc_def;
+{
+    pzlib_filefunc_def->zopen_file = win32_open_file_func;
+    pzlib_filefunc_def->zread_file = win32_read_file_func;
+    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+    pzlib_filefunc_def->ztell_file = win32_tell_file_func;
+    pzlib_filefunc_def->zseek_file = win32_seek_file_func;
+    pzlib_filefunc_def->zclose_file = win32_close_file_func;
+    pzlib_filefunc_def->zerror_file = win32_error_file_func;
+    pzlib_filefunc_def->opaque=NULL;
+}
diff --git a/contrib/minizip/iowin32.h b/contrib/minizip/iowin32.h
index 713fc02..94aa1aa 100644
--- a/contrib/minizip/iowin32.h
+++ b/contrib/minizip/iowin32.h
@@ -1,19 +1,21 @@
-/* iowin32.h -- IO base function header for compress/uncompress .zip

-   files using zlib + zip or unzip API

-   This IO API version uses the Win32 API (for Microsoft Windows)

-

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 Gilles Vollant

-*/

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));

-

-

-#ifdef __cplusplus

-}

-#endif

+/* iowin32.h -- IO base function header for compress/uncompress .zip
+   files using zlib + zip or unzip API
+   This IO API version uses the Win32 API (for Microsoft Windows)
+
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 Gilles Vollant
+*/
+
+#include <windows.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/contrib/minizip/miniunz.c b/contrib/minizip/miniunz.c
index ea23e40..57601e1 100644
--- a/contrib/minizip/miniunz.c
+++ b/contrib/minizip/miniunz.c
@@ -1,556 +1,556 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <time.h>

-#include <errno.h>

-#include <fcntl.h>

-

-#ifdef unix

-# include <unistd.h>

-# include <utime.h>

-#else

-# include <direct.h>

-# include <io.h>

-#endif

-

-#include "unzip.h"

-

-#define CASESENSITIVITY (0)

-#define WRITEBUFFERSIZE (8192)

-#define MAXFILENAME (256)

-

-#ifdef WIN32

-#define USEWIN32IOAPI

-#include "iowin32.h"

-#endif

-/*

-  mini unzip, demo of unzip package

-

-  usage :

-  Usage : miniunz [-exvlo] file.zip [file_to_extract]

-

-  list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT

-    if it exists

-*/

-

-

-/* change_file_date : change the date/time of a file

-    filename : the filename of the file where date/time must be modified

-    dosdate : the new date at the MSDos format (4 bytes)

-    tmu_date : the SAME new date at the tm_unz format */

-void change_file_date(filename,dosdate,tmu_date)

-    const char *filename;

-    uLong dosdate;

-    tm_unz tmu_date;

-{

-#ifdef WIN32

-  HANDLE hFile;

-  FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;

-

-  hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,

-                      0,NULL,OPEN_EXISTING,0,NULL);

-  GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);

-  DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);

-  LocalFileTimeToFileTime(&ftLocal,&ftm);

-  SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);

-  CloseHandle(hFile);

-#else

-#ifdef unix

-  struct utimbuf ut;

-  struct tm newdate;

-  newdate.tm_sec = tmu_date.tm_sec;

-  newdate.tm_min=tmu_date.tm_min;

-  newdate.tm_hour=tmu_date.tm_hour;

-  newdate.tm_mday=tmu_date.tm_mday;

-  newdate.tm_mon=tmu_date.tm_mon;

-  if (tmu_date.tm_year > 1900)

-      newdate.tm_year=tmu_date.tm_year - 1900;

-  else

-      newdate.tm_year=tmu_date.tm_year ;

-  newdate.tm_isdst=-1;

-

-  ut.actime=ut.modtime=mktime(&newdate);

-  utime(filename,&ut);

-#endif

-#endif

-}

-

-

-/* mymkdir and change_file_date are not 100 % portable

-   As I don't know well Unix, I wait feedback for the unix portion */

-

-int mymkdir(dirname)

-    const char* dirname;

-{

-    int ret=0;

-#ifdef WIN32

-    ret = mkdir(dirname);

-#else

-#ifdef unix

-    ret = mkdir (dirname,0775);

-#endif

-#endif

-    return ret;

-}

-

-int makedir (newdir)

-    char *newdir;

-{

-  char *buffer ;

-  char *p;

-  int  len = (int)strlen(newdir);

-

-  if (len <= 0)

-    return 0;

-

-  buffer = (char*)malloc(len+1);

-  strcpy(buffer,newdir);

-

-  if (buffer[len-1] == '/') {

-    buffer[len-1] = '\0';

-  }

-  if (mymkdir(buffer) == 0)

-    {

-      free(buffer);

-      return 1;

-    }

-

-  p = buffer+1;

-  while (1)

-    {

-      char hold;

-

-      while(*p && *p != '\\' && *p != '/')

-        p++;

-      hold = *p;

-      *p = 0;

-      if ((mymkdir(buffer) == -1) && (errno == ENOENT))

-        {

-          printf("couldn't create directory %s\n",buffer);

-          free(buffer);

-          return 0;

-        }

-      if (hold == 0)

-        break;

-      *p++ = hold;

-    }

-  free(buffer);

-  return 1;

-}

-

-void do_banner()

-{

-    printf("MiniUnz 0.22, demo of zLib + Unz package written by Gilles Vollant\n");

-    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");

-}

-

-void do_help()

-{

-    printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.]\n\n" \

-           "  -e  Extract without pathname (junk paths)\n" \

-           "  -x  Extract with pathname\n" \

-           "  -v  list files\n" \

-           "  -l  list files\n" \

-           "  -o  overwrite files without prompting\n" \

-           "  -p  extract crypted file using password\n\n");

-}

-

-

-int do_list(uf)

-    unzFile uf;

-{

-    uLong i;

-    unz_global_info gi;

-    int err;

-

-    err = unzGetGlobalInfo (uf,&gi);

-    if (err!=UNZ_OK)

-        printf("error %d with zipfile in unzGetGlobalInfo \n",err);

-    printf(" Length  Method   Size  Ratio   Date    Time   CRC-32     Name\n");

-    printf(" ------  ------   ----  -----   ----    ----   ------     ----\n");

-    for (i=0;i<gi.number_entry;i++)

-    {

-        char filename_inzip[256];

-        unz_file_info file_info;

-        uLong ratio=0;

-        const char *string_method;

-        char charCrypt=' ';

-        err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);

-        if (err!=UNZ_OK)

-        {

-            printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);

-            break;

-        }

-        if (file_info.uncompressed_size>0)

-            ratio = (file_info.compressed_size*100)/file_info.uncompressed_size;

-

-        /* display a '*' if the file is crypted */

-        if ((file_info.flag & 1) != 0)

-            charCrypt='*';

-

-        if (file_info.compression_method==0)

-            string_method="Stored";

-        else

-        if (file_info.compression_method==Z_DEFLATED)

-        {

-            uInt iLevel=(uInt)((file_info.flag & 0x6)/2);

-            if (iLevel==0)

-              string_method="Defl:N";

-            else if (iLevel==1)

-              string_method="Defl:X";

-            else if ((iLevel==2) || (iLevel==3))

-              string_method="Defl:F"; /* 2:fast , 3 : extra fast*/

-        }

-        else

-            string_method="Unkn. ";

-

-        printf("%7lu  %6s%c%7lu %3lu%%  %2.2lu-%2.2lu-%2.2lu  %2.2lu:%2.2lu  %8.8lx   %s\n",

-                file_info.uncompressed_size,string_method,

-                charCrypt,

-                file_info.compressed_size,

-                ratio,

-                (uLong)file_info.tmu_date.tm_mon + 1,

-                (uLong)file_info.tmu_date.tm_mday,

-                (uLong)file_info.tmu_date.tm_year % 100,

-                (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,

-                (uLong)file_info.crc,filename_inzip);

-        if ((i+1)<gi.number_entry)

-        {

-            err = unzGoToNextFile(uf);

-            if (err!=UNZ_OK)

-            {

-                printf("error %d with zipfile in unzGoToNextFile\n",err);

-                break;

-            }

-        }

-    }

-

-    return 0;

-}

-

-

-int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)

-    unzFile uf;

-    const int* popt_extract_without_path;

-    int* popt_overwrite;

-    const char* password;

-{

-    char filename_inzip[256];

-    char* filename_withoutpath;

-    char* p;

-    int err=UNZ_OK;

-    FILE *fout=NULL;

-    void* buf;

-    uInt size_buf;

-

-    unz_file_info file_info;

-    uLong ratio=0;

-    err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);

-

-    if (err!=UNZ_OK)

-    {

-        printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);

-        return err;

-    }

-

-    size_buf = WRITEBUFFERSIZE;

-    buf = (void*)malloc(size_buf);

-    if (buf==NULL)

-    {

-        printf("Error allocating memory\n");

-        return UNZ_INTERNALERROR;

-    }

-

-    p = filename_withoutpath = filename_inzip;

-    while ((*p) != '\0')

-    {

-        if (((*p)=='/') || ((*p)=='\\'))

-            filename_withoutpath = p+1;

-        p++;

-    }

-

-    if ((*filename_withoutpath)=='\0')

-    {

-        if ((*popt_extract_without_path)==0)

-        {

-            printf("creating directory: %s\n",filename_inzip);

-            mymkdir(filename_inzip);

-        }

-    }

-    else

-    {

-        const char* write_filename;

-        int skip=0;

-

-        if ((*popt_extract_without_path)==0)

-            write_filename = filename_inzip;

-        else

-            write_filename = filename_withoutpath;

-

-        err = unzOpenCurrentFilePassword(uf,password);

-        if (err!=UNZ_OK)

-        {

-            printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);

-        }

-

-        if (((*popt_overwrite)==0) && (err==UNZ_OK))

-        {

-            char rep=0;

-            FILE* ftestexist;

-            ftestexist = fopen(write_filename,"rb");

-            if (ftestexist!=NULL)

-            {

-                fclose(ftestexist);

-                do

-                {

-                    char answer[128];

-                    printf("The file %s exist. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);

-                    scanf("%1s",answer);

-                    rep = answer[0] ;

-                    if ((rep>='a') && (rep<='z'))

-                        rep -= 0x20;

-                }

-                while ((rep!='Y') && (rep!='N') && (rep!='A'));

-            }

-

-            if (rep == 'N')

-                skip = 1;

-

-            if (rep == 'A')

-                *popt_overwrite=1;

-        }

-

-        if ((skip==0) && (err==UNZ_OK))

-        {

-            fout=fopen(write_filename,"wb");

-

-            /* some zipfile don't contain directory alone before file */

-            if ((fout==NULL) && ((*popt_extract_without_path)==0) &&

-                                (filename_withoutpath!=(char*)filename_inzip))

-            {

-                char c=*(filename_withoutpath-1);

-                *(filename_withoutpath-1)='\0';

-                makedir(write_filename);

-                *(filename_withoutpath-1)=c;

-                fout=fopen(write_filename,"wb");

-            }

-

-            if (fout==NULL)

-            {

-                printf("error opening %s\n",write_filename);

-            }

-        }

-

-        if (fout!=NULL)

-        {

-            printf(" extracting: %s\n",write_filename);

-

-            do

-            {

-                err = unzReadCurrentFile(uf,buf,size_buf);

-                if (err<0)

-                {

-                    printf("error %d with zipfile in unzReadCurrentFile\n",err);

-                    break;

-                }

-                if (err>0)

-                    if (fwrite(buf,err,1,fout)!=1)

-                    {

-                        printf("error in writing extracted file\n");

-                        err=UNZ_ERRNO;

-                        break;

-                    }

-            }

-            while (err>0);

-            if (fout)

-                    fclose(fout);

-

-            if (err==0)

-                change_file_date(write_filename,file_info.dosDate,

-                                 file_info.tmu_date);

-        }

-

-        if (err==UNZ_OK)

-        {

-            err = unzCloseCurrentFile (uf);

-            if (err!=UNZ_OK)

-            {

-                printf("error %d with zipfile in unzCloseCurrentFile\n",err);

-            }

-        }

-        else

-            unzCloseCurrentFile(uf); /* don't lose the error */

-    }

-

-    free(buf);

-    return err;

-}

-

-

-int do_extract(uf,opt_extract_without_path,opt_overwrite,password)

-    unzFile uf;

-    int opt_extract_without_path;

-    int opt_overwrite;

-    const char* password;

-{

-    uLong i;

-    unz_global_info gi;

-    int err;

-    FILE* fout=NULL;

-

-    err = unzGetGlobalInfo (uf,&gi);

-    if (err!=UNZ_OK)

-        printf("error %d with zipfile in unzGetGlobalInfo \n",err);

-

-    for (i=0;i<gi.number_entry;i++)

-    {

-        if (do_extract_currentfile(uf,&opt_extract_without_path,

-                                      &opt_overwrite,

-                                      password) != UNZ_OK)

-            break;

-

-        if ((i+1)<gi.number_entry)

-        {

-            err = unzGoToNextFile(uf);

-            if (err!=UNZ_OK)

-            {

-                printf("error %d with zipfile in unzGoToNextFile\n",err);

-                break;

-            }

-        }

-    }

-

-    return 0;

-}

-

-int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)

-    unzFile uf;

-    const char* filename;

-    int opt_extract_without_path;

-    int opt_overwrite;

-    const char* password;

-{

-    int err = UNZ_OK;

-    if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)

-    {

-        printf("file %s not found in the zipfile\n",filename);

-        return 2;

-    }

-

-    if (do_extract_currentfile(uf,&opt_extract_without_path,

-                                      &opt_overwrite,

-                                      password) == UNZ_OK)

-        return 0;

-    else

-        return 1;

-}

-

-

-int main(argc,argv)

-    int argc;

-    char *argv[];

-{

-    const char *zipfilename=NULL;

-    const char *filename_to_extract=NULL;

-    const char *password=NULL;

-    char filename_try[MAXFILENAME+16] = "";

-    int i;

-    int opt_do_list=0;

-    int opt_do_extract=1;

-    int opt_do_extract_withoutpath=0;

-    int opt_overwrite=0;

-    unzFile uf=NULL;

-

-    do_banner();

-    if (argc==1)

-    {

-        do_help();

-        return 0;

-    }

-    else

-    {

-        for (i=1;i<argc;i++)

-        {

-            if ((*argv[i])=='-')

-            {

-                const char *p=argv[i]+1;

-

-                while ((*p)!='\0')

-                {

-                    char c=*(p++);;

-                    if ((c=='l') || (c=='L'))

-                        opt_do_list = 1;

-                    if ((c=='v') || (c=='V'))

-                        opt_do_list = 1;

-                    if ((c=='x') || (c=='X'))

-                        opt_do_extract = 1;

-                    if ((c=='e') || (c=='E'))

-                        opt_do_extract = opt_do_extract_withoutpath = 1;

-                    if ((c=='o') || (c=='O'))

-                        opt_overwrite=1;

-                    if (((c=='p') || (c=='P')) && (i+1<argc))

-                    {

-                        password=argv[i+1];

-                        i++;

-                    }

-                }

-            }

-            else

-            {

-                if (zipfilename == NULL)

-                    zipfilename = argv[i];

-                else if (filename_to_extract==NULL)

-                        filename_to_extract = argv[i] ;

-            }

-        }

-    }

-

-    if (zipfilename!=NULL)

-    {

-

-        #ifdef USEWIN32IOAPI

-        zlib_filefunc_def ffunc;

-        #endif

-

-        strncpy(filename_try, zipfilename,MAXFILENAME-1);

-        /* strncpy doesnt append the trailing NULL, of the string is too long. */

-        filename_try[ MAXFILENAME ] = '\0';

-

-        #ifdef USEWIN32IOAPI

-        fill_win32_filefunc(&ffunc);

-        uf = unzOpen2(zipfilename,&ffunc);

-        #else

-        uf = unzOpen(zipfilename);

-        #endif

-        if (uf==NULL)

-        {

-            strcat(filename_try,".zip");

-            #ifdef USEWIN32IOAPI

-            uf = unzOpen2(filename_try,&ffunc);

-            #else

-            uf = unzOpen(filename_try);

-            #endif

-        }

-    }

-

-    if (uf==NULL)

-    {

-        printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);

-        return 1;

-    }

-    printf("%s opened\n",filename_try);

-

-    if (opt_do_list==1)

-        return do_list(uf);

-    else if (opt_do_extract==1)

-    {

-        if (filename_to_extract == NULL)

-            return do_extract(uf,opt_do_extract_withoutpath,opt_overwrite,password);

-        else

-            return do_extract_onefile(uf,filename_to_extract,

-                                      opt_do_extract_withoutpath,opt_overwrite,password);

-    }

-    unzCloseCurrentFile(uf);

-

-    return 0;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef unix
+# include <unistd.h>
+# include <utime.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#include "unzip.h"
+
+#define CASESENSITIVITY (0)
+#define WRITEBUFFERSIZE (8192)
+#define MAXFILENAME (256)
+
+#ifdef WIN32
+#define USEWIN32IOAPI
+#include "iowin32.h"
+#endif
+/*
+  mini unzip, demo of unzip package
+
+  usage :
+  Usage : miniunz [-exvlo] file.zip [file_to_extract]
+
+  list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
+    if it exists
+*/
+
+
+/* change_file_date : change the date/time of a file
+    filename : the filename of the file where date/time must be modified
+    dosdate : the new date at the MSDos format (4 bytes)
+    tmu_date : the SAME new date at the tm_unz format */
+void change_file_date(filename,dosdate,tmu_date)
+    const char *filename;
+    uLong dosdate;
+    tm_unz tmu_date;
+{
+#ifdef WIN32
+  HANDLE hFile;
+  FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
+
+  hFile = CreateFile(filename,GENERIC_READ | GENERIC_WRITE,
+                      0,NULL,OPEN_EXISTING,0,NULL);
+  GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
+  DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
+  LocalFileTimeToFileTime(&ftLocal,&ftm);
+  SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
+  CloseHandle(hFile);
+#else
+#ifdef unix
+  struct utimbuf ut;
+  struct tm newdate;
+  newdate.tm_sec = tmu_date.tm_sec;
+  newdate.tm_min=tmu_date.tm_min;
+  newdate.tm_hour=tmu_date.tm_hour;
+  newdate.tm_mday=tmu_date.tm_mday;
+  newdate.tm_mon=tmu_date.tm_mon;
+  if (tmu_date.tm_year > 1900)
+      newdate.tm_year=tmu_date.tm_year - 1900;
+  else
+      newdate.tm_year=tmu_date.tm_year ;
+  newdate.tm_isdst=-1;
+
+  ut.actime=ut.modtime=mktime(&newdate);
+  utime(filename,&ut);
+#endif
+#endif
+}
+
+
+/* mymkdir and change_file_date are not 100 % portable
+   As I don't know well Unix, I wait feedback for the unix portion */
+
+int mymkdir(dirname)
+    const char* dirname;
+{
+    int ret=0;
+#ifdef WIN32
+    ret = mkdir(dirname);
+#else
+#ifdef unix
+    ret = mkdir (dirname,0775);
+#endif
+#endif
+    return ret;
+}
+
+int makedir (newdir)
+    char *newdir;
+{
+  char *buffer ;
+  char *p;
+  int  len = (int)strlen(newdir);
+
+  if (len <= 0)
+    return 0;
+
+  buffer = (char*)malloc(len+1);
+  strcpy(buffer,newdir);
+
+  if (buffer[len-1] == '/') {
+    buffer[len-1] = '\0';
+  }
+  if (mymkdir(buffer) == 0)
+    {
+      free(buffer);
+      return 1;
+    }
+
+  p = buffer+1;
+  while (1)
+    {
+      char hold;
+
+      while(*p && *p != '\\' && *p != '/')
+        p++;
+      hold = *p;
+      *p = 0;
+      if ((mymkdir(buffer) == -1) && (errno == ENOENT))
+        {
+          printf("couldn't create directory %s\n",buffer);
+          free(buffer);
+          return 0;
+        }
+      if (hold == 0)
+        break;
+      *p++ = hold;
+    }
+  free(buffer);
+  return 1;
+}
+
+void do_banner()
+{
+    printf("MiniUnz 0.22, demo of zLib + Unz package written by Gilles Vollant\n");
+    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
+}
+
+void do_help()
+{
+    printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.]\n\n" \
+           "  -e  Extract without pathname (junk paths)\n" \
+           "  -x  Extract with pathname\n" \
+           "  -v  list files\n" \
+           "  -l  list files\n" \
+           "  -o  overwrite files without prompting\n" \
+           "  -p  extract crypted file using password\n\n");
+}
+
+
+int do_list(uf)
+    unzFile uf;
+{
+    uLong i;
+    unz_global_info gi;
+    int err;
+
+    err = unzGetGlobalInfo (uf,&gi);
+    if (err!=UNZ_OK)
+        printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+    printf(" Length  Method   Size  Ratio   Date    Time   CRC-32     Name\n");
+    printf(" ------  ------   ----  -----   ----    ----   ------     ----\n");
+    for (i=0;i<gi.number_entry;i++)
+    {
+        char filename_inzip[256];
+        unz_file_info file_info;
+        uLong ratio=0;
+        const char *string_method;
+        char charCrypt=' ';
+        err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+        if (err!=UNZ_OK)
+        {
+            printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+            break;
+        }
+        if (file_info.uncompressed_size>0)
+            ratio = (file_info.compressed_size*100)/file_info.uncompressed_size;
+
+        /* display a '*' if the file is crypted */
+        if ((file_info.flag & 1) != 0)
+            charCrypt='*';
+
+        if (file_info.compression_method==0)
+            string_method="Stored";
+        else
+        if (file_info.compression_method==Z_DEFLATED)
+        {
+            uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
+            if (iLevel==0)
+              string_method="Defl:N";
+            else if (iLevel==1)
+              string_method="Defl:X";
+            else if ((iLevel==2) || (iLevel==3))
+              string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
+        }
+        else
+            string_method="Unkn. ";
+
+        printf("%7lu  %6s%c%7lu %3lu%%  %2.2lu-%2.2lu-%2.2lu  %2.2lu:%2.2lu  %8.8lx   %s\n",
+                file_info.uncompressed_size,string_method,
+                charCrypt,
+                file_info.compressed_size,
+                ratio,
+                (uLong)file_info.tmu_date.tm_mon + 1,
+                (uLong)file_info.tmu_date.tm_mday,
+                (uLong)file_info.tmu_date.tm_year % 100,
+                (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
+                (uLong)file_info.crc,filename_inzip);
+        if ((i+1)<gi.number_entry)
+        {
+            err = unzGoToNextFile(uf);
+            if (err!=UNZ_OK)
+            {
+                printf("error %d with zipfile in unzGoToNextFile\n",err);
+                break;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
+    unzFile uf;
+    const int* popt_extract_without_path;
+    int* popt_overwrite;
+    const char* password;
+{
+    char filename_inzip[256];
+    char* filename_withoutpath;
+    char* p;
+    int err=UNZ_OK;
+    FILE *fout=NULL;
+    void* buf;
+    uInt size_buf;
+
+    unz_file_info file_info;
+    uLong ratio=0;
+    err = unzGetCurrentFileInfo(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+
+    if (err!=UNZ_OK)
+    {
+        printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+        return err;
+    }
+
+    size_buf = WRITEBUFFERSIZE;
+    buf = (void*)malloc(size_buf);
+    if (buf==NULL)
+    {
+        printf("Error allocating memory\n");
+        return UNZ_INTERNALERROR;
+    }
+
+    p = filename_withoutpath = filename_inzip;
+    while ((*p) != '\0')
+    {
+        if (((*p)=='/') || ((*p)=='\\'))
+            filename_withoutpath = p+1;
+        p++;
+    }
+
+    if ((*filename_withoutpath)=='\0')
+    {
+        if ((*popt_extract_without_path)==0)
+        {
+            printf("creating directory: %s\n",filename_inzip);
+            mymkdir(filename_inzip);
+        }
+    }
+    else
+    {
+        const char* write_filename;
+        int skip=0;
+
+        if ((*popt_extract_without_path)==0)
+            write_filename = filename_inzip;
+        else
+            write_filename = filename_withoutpath;
+
+        err = unzOpenCurrentFilePassword(uf,password);
+        if (err!=UNZ_OK)
+        {
+            printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
+        }
+
+        if (((*popt_overwrite)==0) && (err==UNZ_OK))
+        {
+            char rep=0;
+            FILE* ftestexist;
+            ftestexist = fopen(write_filename,"rb");
+            if (ftestexist!=NULL)
+            {
+                fclose(ftestexist);
+                do
+                {
+                    char answer[128];
+                    printf("The file %s exist. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
+                    scanf("%1s",answer);
+                    rep = answer[0] ;
+                    if ((rep>='a') && (rep<='z'))
+                        rep -= 0x20;
+                }
+                while ((rep!='Y') && (rep!='N') && (rep!='A'));
+            }
+
+            if (rep == 'N')
+                skip = 1;
+
+            if (rep == 'A')
+                *popt_overwrite=1;
+        }
+
+        if ((skip==0) && (err==UNZ_OK))
+        {
+            fout=fopen(write_filename,"wb");
+
+            /* some zipfile don't contain directory alone before file */
+            if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
+                                (filename_withoutpath!=(char*)filename_inzip))
+            {
+                char c=*(filename_withoutpath-1);
+                *(filename_withoutpath-1)='\0';
+                makedir(write_filename);
+                *(filename_withoutpath-1)=c;
+                fout=fopen(write_filename,"wb");
+            }
+
+            if (fout==NULL)
+            {
+                printf("error opening %s\n",write_filename);
+            }
+        }
+
+        if (fout!=NULL)
+        {
+            printf(" extracting: %s\n",write_filename);
+
+            do
+            {
+                err = unzReadCurrentFile(uf,buf,size_buf);
+                if (err<0)
+                {
+                    printf("error %d with zipfile in unzReadCurrentFile\n",err);
+                    break;
+                }
+                if (err>0)
+                    if (fwrite(buf,err,1,fout)!=1)
+                    {
+                        printf("error in writing extracted file\n");
+                        err=UNZ_ERRNO;
+                        break;
+                    }
+            }
+            while (err>0);
+            if (fout)
+                    fclose(fout);
+
+            if (err==0)
+                change_file_date(write_filename,file_info.dosDate,
+                                 file_info.tmu_date);
+        }
+
+        if (err==UNZ_OK)
+        {
+            err = unzCloseCurrentFile (uf);
+            if (err!=UNZ_OK)
+            {
+                printf("error %d with zipfile in unzCloseCurrentFile\n",err);
+            }
+        }
+        else
+            unzCloseCurrentFile(uf); /* don't lose the error */
+    }
+
+    free(buf);
+    return err;
+}
+
+
+int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
+    unzFile uf;
+    int opt_extract_without_path;
+    int opt_overwrite;
+    const char* password;
+{
+    uLong i;
+    unz_global_info gi;
+    int err;
+    FILE* fout=NULL;
+
+    err = unzGetGlobalInfo (uf,&gi);
+    if (err!=UNZ_OK)
+        printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+
+    for (i=0;i<gi.number_entry;i++)
+    {
+        if (do_extract_currentfile(uf,&opt_extract_without_path,
+                                      &opt_overwrite,
+                                      password) != UNZ_OK)
+            break;
+
+        if ((i+1)<gi.number_entry)
+        {
+            err = unzGoToNextFile(uf);
+            if (err!=UNZ_OK)
+            {
+                printf("error %d with zipfile in unzGoToNextFile\n",err);
+                break;
+            }
+        }
+    }
+
+    return 0;
+}
+
+int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
+    unzFile uf;
+    const char* filename;
+    int opt_extract_without_path;
+    int opt_overwrite;
+    const char* password;
+{
+    int err = UNZ_OK;
+    if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
+    {
+        printf("file %s not found in the zipfile\n",filename);
+        return 2;
+    }
+
+    if (do_extract_currentfile(uf,&opt_extract_without_path,
+                                      &opt_overwrite,
+                                      password) == UNZ_OK)
+        return 0;
+    else
+        return 1;
+}
+
+
+int main(argc,argv)
+    int argc;
+    char *argv[];
+{
+    const char *zipfilename=NULL;
+    const char *filename_to_extract=NULL;
+    const char *password=NULL;
+    char filename_try[MAXFILENAME+16] = "";
+    int i;
+    int opt_do_list=0;
+    int opt_do_extract=1;
+    int opt_do_extract_withoutpath=0;
+    int opt_overwrite=0;
+    unzFile uf=NULL;
+
+    do_banner();
+    if (argc==1)
+    {
+        do_help();
+        return 0;
+    }
+    else
+    {
+        for (i=1;i<argc;i++)
+        {
+            if ((*argv[i])=='-')
+            {
+                const char *p=argv[i]+1;
+
+                while ((*p)!='\0')
+                {
+                    char c=*(p++);;
+                    if ((c=='l') || (c=='L'))
+                        opt_do_list = 1;
+                    if ((c=='v') || (c=='V'))
+                        opt_do_list = 1;
+                    if ((c=='x') || (c=='X'))
+                        opt_do_extract = 1;
+                    if ((c=='e') || (c=='E'))
+                        opt_do_extract = opt_do_extract_withoutpath = 1;
+                    if ((c=='o') || (c=='O'))
+                        opt_overwrite=1;
+                    if (((c=='p') || (c=='P')) && (i+1<argc))
+                    {
+                        password=argv[i+1];
+                        i++;
+                    }
+                }
+            }
+            else
+            {
+                if (zipfilename == NULL)
+                    zipfilename = argv[i];
+                else if (filename_to_extract==NULL)
+                        filename_to_extract = argv[i] ;
+            }
+        }
+    }
+
+    if (zipfilename!=NULL)
+    {
+
+#        ifdef USEWIN32IOAPI
+        zlib_filefunc_def ffunc;
+#        endif
+
+        strncpy(filename_try, zipfilename,MAXFILENAME-1);
+        /* strncpy doesnt append the trailing NULL, of the string is too long. */
+        filename_try[ MAXFILENAME ] = '\0';
+
+#        ifdef USEWIN32IOAPI
+        fill_win32_filefunc(&ffunc);
+        uf = unzOpen2(zipfilename,&ffunc);
+#        else
+        uf = unzOpen(zipfilename);
+#        endif
+        if (uf==NULL)
+        {
+            strcat(filename_try,".zip");
+#            ifdef USEWIN32IOAPI
+            uf = unzOpen2(filename_try,&ffunc);
+#            else
+            uf = unzOpen(filename_try);
+#            endif
+        }
+    }
+
+    if (uf==NULL)
+    {
+        printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);
+        return 1;
+    }
+    printf("%s opened\n",filename_try);
+
+    if (opt_do_list==1)
+        return do_list(uf);
+    else if (opt_do_extract==1)
+    {
+        if (filename_to_extract == NULL)
+            return do_extract(uf,opt_do_extract_withoutpath,opt_overwrite,password);
+        else
+            return do_extract_onefile(uf,filename_to_extract,
+                                      opt_do_extract_withoutpath,opt_overwrite,password);
+    }
+    unzCloseCurrentFile(uf);
+
+    return 0;
+}
diff --git a/contrib/minizip/minizip.c b/contrib/minizip/minizip.c
index 79e541d..7e2ce36 100644
--- a/contrib/minizip/minizip.c
+++ b/contrib/minizip/minizip.c
@@ -1,397 +1,397 @@
-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <time.h>

-#include <errno.h>

-#include <fcntl.h>

-

-#ifdef unix

-# include <unistd.h>

-# include <utime.h>

-# include <sys/types.h>

-# include <sys/stat.h>

-#else

-# include <direct.h>

-# include <io.h>

-#endif

-

-#include "zip.h"

-

-#ifdef WIN32

-#define USEWIN32IOAPI

-#include "iowin32.h"

-#endif

-

-

-

-#define WRITEBUFFERSIZE (16384)

-#define MAXFILENAME (256)

-

-#ifdef WIN32

-uLong filetime(f, tmzip, dt)

-    char *f;                /* name of file to get info on */

-    tm_zip *tmzip;             /* return value: access, modific. and creation times */

-    uLong *dt;             /* dostime */

-{

-  int ret = 0;

-  {

-      FILETIME ftLocal;

-      HANDLE hFind;

-      WIN32_FIND_DATA  ff32;

-

-      hFind = FindFirstFile(f,&ff32);

-      if (hFind != INVALID_HANDLE_VALUE)

-      {

-        FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);

-        FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);

-        FindClose(hFind);

-        ret = 1;

-      }

-  }

-  return ret;

-}

-#else

-#ifdef unix

-uLong filetime(f, tmzip, dt)

-    char *f;                /* name of file to get info on */

-    tm_zip *tmzip;             /* return value: access, modific. and creation times */

-    uLong *dt;             /* dostime */

-{

-  int ret=0;

-  struct stat s;        /* results of stat() */

-  struct tm* filedate;

-  time_t tm_t=0;

-

-  if (strcmp(f,"-")!=0)

-  {

-    char name[MAXFILENAME+1];

-    int len = strlen(f);

-

-    strncpy(name, f,MAXFILENAME-1);

-    /* strncpy doesnt append the trailing NULL, of the string is too long. */

-    name[ MAXFILENAME ] = '\0';

-

-    if (name[len - 1] == '/')

-      name[len - 1] = '\0';

-    /* not all systems allow stat'ing a file with / appended */

-    if (stat(name,&s)==0)

-    {

-      tm_t = s.st_mtime;

-      ret = 1;

-    }

-  }

-  filedate = localtime(&tm_t);

-

-  tmzip->tm_sec  = filedate->tm_sec;

-  tmzip->tm_min  = filedate->tm_min;

-  tmzip->tm_hour = filedate->tm_hour;

-  tmzip->tm_mday = filedate->tm_mday;

-  tmzip->tm_mon  = filedate->tm_mon ;

-  tmzip->tm_year = filedate->tm_year;

-

-  return ret;

-}

-#else

-uLong filetime(f, tmzip, dt)

-    char *f;                /* name of file to get info on */

-    tm_zip *tmzip;             /* return value: access, modific. and creation times */

-    uLong *dt;             /* dostime */

-{

-    return 0;

-}

-#endif

-#endif

-

-

-

-

-int check_exist_file(filename)

-    const char* filename;

-{

-    FILE* ftestexist;

-    int ret = 1;

-    ftestexist = fopen(filename,"rb");

-    if (ftestexist==NULL)

-        ret = 0;

-    else

-        fclose(ftestexist);

-    return ret;

-}

-

-void do_banner()

-{

-    printf("MiniZip 0.22, demo of zLib + Zip package written by Gilles Vollant\n");

-    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");

-}

-

-void do_help()

-{

-    printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \

-           "  -o  Overwrite existing file.zip\n" \

-           "  -a  Append to existing file.zip\n" \

-           "  -0  Store only\n" \

-           "  -1  Compress faster\n" \

-           "  -9  Compress better\n\n");

-}

-

-/* calculate the CRC32 of a file,

-   because to encrypt a file, we need known the CRC32 of the file before */

-int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)

-{

-   unsigned long calculate_crc=0;

-   int err=ZIP_OK;

-   FILE * fin = fopen(filenameinzip,"rb");

-   unsigned long size_read = 0;

-   unsigned long total_read = 0;

-   if (fin==NULL)

-   {

-       err = ZIP_ERRNO;

-   }

-

-    if (err == ZIP_OK)

-        do

-        {

-            err = ZIP_OK;

-            size_read = (int)fread(buf,1,size_buf,fin);

-            if (size_read < size_buf)

-                if (feof(fin)==0)

-            {

-                printf("error in reading %s\n",filenameinzip);

-                err = ZIP_ERRNO;

-            }

-

-            if (size_read>0)

-                calculate_crc = crc32(calculate_crc,buf,size_read);

-            total_read += size_read;

-

-        } while ((err == ZIP_OK) && (size_read>0));

-

-    if (fin)

-        fclose(fin);

-

-    *result_crc=calculate_crc;

-    printf("file %s crc %x\n",filenameinzip,calculate_crc);

-    return err;

-}

-

-int main(argc,argv)

-    int argc;

-    char *argv[];

-{

-    int i;

-    int opt_overwrite=0;

-    int opt_compress_level=Z_DEFAULT_COMPRESSION;

-    int zipfilenamearg = 0;

-    char filename_try[MAXFILENAME+16];

-    int zipok;

-    int err=0;

-    int size_buf=0;

-    void* buf=NULL;

-    const char* password=NULL;

-

-

-    do_banner();

-    if (argc==1)

-    {

-        do_help();

-        return 0;

-    }

-    else

-    {

-        for (i=1;i<argc;i++)

-        {

-            if ((*argv[i])=='-')

-            {

-                const char *p=argv[i]+1;

-

-                while ((*p)!='\0')

-                {

-                    char c=*(p++);;

-                    if ((c=='o') || (c=='O'))

-                        opt_overwrite = 1;

-                    if ((c=='a') || (c=='A'))

-                        opt_overwrite = 2;

-                    if ((c>='0') && (c<='9'))

-                        opt_compress_level = c-'0';

-

-                    if (((c=='p') || (c=='P')) && (i+1<argc))

-                    {

-                        password=argv[i+1];

-                        i++;

-                    }

-                }

-            }

-            else

-                if (zipfilenamearg == 0)

-                    zipfilenamearg = i ;

-        }

-    }

-

-    size_buf = WRITEBUFFERSIZE;

-    buf = (void*)malloc(size_buf);

-    if (buf==NULL)

-    {

-        printf("Error allocating memory\n");

-        return ZIP_INTERNALERROR;

-    }

-

-    if (zipfilenamearg==0)

-        zipok=0;

-    else

-    {

-        int i,len;

-        int dot_found=0;

-

-        zipok = 1 ;

-        strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);

-        /* strncpy doesnt append the trailing NULL, of the string is too long. */

-        filename_try[ MAXFILENAME ] = '\0';

-

-        len=(int)strlen(filename_try);

-        for (i=0;i<len;i++)

-            if (filename_try[i]=='.')

-                dot_found=1;

-

-        if (dot_found==0)

-            strcat(filename_try,".zip");

-

-        if (opt_overwrite==2)

-        {

-            /* if the file don't exist, we not append file */

-            if (check_exist_file(filename_try)==0)

-                opt_overwrite=1;

-        }

-        else

-        if (opt_overwrite==0)

-            if (check_exist_file(filename_try)!=0)

-            {

-                char rep=0;

-                do

-                {

-                    char answer[128];

-                    printf("The file %s exist. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try);

-                    scanf("%1s",answer);

-                    rep = answer[0] ;

-                    if ((rep>='a') && (rep<='z'))

-                        rep -= 0x20;

-                }

-                while ((rep!='Y') && (rep!='N') && (rep!='A'));

-                if (rep=='N')

-                    zipok = 0;

-                if (rep=='A')

-                    opt_overwrite = 2;

-            }

-    }

-

-    if (zipok==1)

-    {

-        zipFile zf;

-        int errclose;

-        #ifdef USEWIN32IOAPI

-        zlib_filefunc_def ffunc;

-        fill_win32_filefunc(&ffunc);

-        zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);

-        #else

-        zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0);

-        #endif

-

-        if (zf == NULL)

-        {

-            printf("error opening %s\n",filename_try);

-            err= ZIP_ERRNO;

-        }

-        else

-            printf("creating %s\n",filename_try);

-

-        for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)

-        {

-            if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))

-            {

-                FILE * fin;

-                int size_read;

-                const char* filenameinzip = argv[i];

-                zip_fileinfo zi;

-                unsigned long crcFile=0;

-

-                zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =

-                zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;

-                zi.dosDate = 0;

-                zi.internal_fa = 0;

-                zi.external_fa = 0;

-                filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);

-

-/*

-                err = zipOpenNewFileInZip(zf,filenameinzip,&zi,

-                                 NULL,0,NULL,0,NULL / * comment * /,

-                                 (opt_compress_level != 0) ? Z_DEFLATED : 0,

-                                 opt_compress_level);

-*/

-                if ((password != NULL) && (err==ZIP_OK))

-                    err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);

-

-                err = zipOpenNewFileInZip3(zf,filenameinzip,&zi,

-                                 NULL,0,NULL,0,NULL /* comment*/,

-                                 (opt_compress_level != 0) ? Z_DEFLATED : 0,

-                                 opt_compress_level,0,

-                                 /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */

-                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,

-                                 password,crcFile);

-

-                if (err != ZIP_OK)

-                    printf("error in opening %s in zipfile\n",filenameinzip);

-                else

-                {

-                    fin = fopen(filenameinzip,"rb");

-                    if (fin==NULL)

-                    {

-                        err=ZIP_ERRNO;

-                        printf("error in opening %s for reading\n",filenameinzip);

-                    }

-                }

-

-                if (err == ZIP_OK)

-                    do

-                    {

-                        err = ZIP_OK;

-                        size_read = (int)fread(buf,1,size_buf,fin);

-                        if (size_read < size_buf)

-                            if (feof(fin)==0)

-                        {

-                            printf("error in reading %s\n",filenameinzip);

-                            err = ZIP_ERRNO;

-                        }

-

-                        if (size_read>0)

-                        {

-                            err = zipWriteInFileInZip (zf,buf,size_read);

-                            if (err<0)

-                            {

-                                printf("error in writing %s in the zipfile\n",

-                                                 filenameinzip);

-                            }

-

-                        }

-                    } while ((err == ZIP_OK) && (size_read>0));

-

-                if (fin)

-                    fclose(fin);

-

-                if (err<0)

-                    err=ZIP_ERRNO;

-                else

-                {

-                    err = zipCloseFileInZip(zf);

-                    if (err!=ZIP_OK)

-                        printf("error in closing %s in the zipfile\n",

-                                    filenameinzip);

-                }

-            }

-        }

-        errclose = zipClose(zf,NULL);

-        if (errclose != ZIP_OK)

-            printf("error in closing %s\n",filename_try);

-   }

-

-    free(buf);

-    return 0;

-}

+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef unix
+# include <unistd.h>
+# include <utime.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#include "zip.h"
+
+#ifdef WIN32
+#define USEWIN32IOAPI
+#include "iowin32.h"
+#endif
+
+
+
+#define WRITEBUFFERSIZE (16384)
+#define MAXFILENAME (256)
+
+#ifdef WIN32
+uLong filetime(f, tmzip, dt)
+    char *f;                /* name of file to get info on */
+    tm_zip *tmzip;             /* return value: access, modific. and creation times */
+    uLong *dt;             /* dostime */
+{
+  int ret = 0;
+  {
+      FILETIME ftLocal;
+      HANDLE hFind;
+      WIN32_FIND_DATA  ff32;
+
+      hFind = FindFirstFile(f,&ff32);
+      if (hFind != INVALID_HANDLE_VALUE)
+      {
+        FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
+        FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
+        FindClose(hFind);
+        ret = 1;
+      }
+  }
+  return ret;
+}
+#else
+#ifdef unix
+uLong filetime(f, tmzip, dt)
+    char *f;                /* name of file to get info on */
+    tm_zip *tmzip;             /* return value: access, modific. and creation times */
+    uLong *dt;             /* dostime */
+{
+  int ret=0;
+  struct stat s;        /* results of stat() */
+  struct tm* filedate;
+  time_t tm_t=0;
+
+  if (strcmp(f,"-")!=0)
+  {
+    char name[MAXFILENAME+1];
+    int len = strlen(f);
+
+    strncpy(name, f,MAXFILENAME-1);
+    /* strncpy doesnt append the trailing NULL, of the string is too long. */
+    name[ MAXFILENAME ] = '\0';
+
+    if (name[len - 1] == '/')
+      name[len - 1] = '\0';
+    /* not all systems allow stat'ing a file with / appended */
+    if (stat(name,&s)==0)
+    {
+      tm_t = s.st_mtime;
+      ret = 1;
+    }
+  }
+  filedate = localtime(&tm_t);
+
+  tmzip->tm_sec  = filedate->tm_sec;
+  tmzip->tm_min  = filedate->tm_min;
+  tmzip->tm_hour = filedate->tm_hour;
+  tmzip->tm_mday = filedate->tm_mday;
+  tmzip->tm_mon  = filedate->tm_mon ;
+  tmzip->tm_year = filedate->tm_year;
+
+  return ret;
+}
+#else
+uLong filetime(f, tmzip, dt)
+    char *f;                /* name of file to get info on */
+    tm_zip *tmzip;             /* return value: access, modific. and creation times */
+    uLong *dt;             /* dostime */
+{
+    return 0;
+}
+#endif
+#endif
+
+
+
+
+int check_exist_file(filename)
+    const char* filename;
+{
+    FILE* ftestexist;
+    int ret = 1;
+    ftestexist = fopen(filename,"rb");
+    if (ftestexist==NULL)
+        ret = 0;
+    else
+        fclose(ftestexist);
+    return ret;
+}
+
+void do_banner()
+{
+    printf("MiniZip 0.22, demo of zLib + Zip package written by Gilles Vollant\n");
+    printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
+}
+
+void do_help()
+{
+    printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \
+           "  -o  Overwrite existing file.zip\n" \
+           "  -a  Append to existing file.zip\n" \
+           "  -0  Store only\n" \
+           "  -1  Compress faster\n" \
+           "  -9  Compress better\n\n");
+}
+
+/* calculate the CRC32 of a file,
+   because to encrypt a file, we need known the CRC32 of the file before */
+int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)
+{
+   unsigned long calculate_crc=0;
+   int err=ZIP_OK;
+   FILE * fin = fopen(filenameinzip,"rb");
+   unsigned long size_read = 0;
+   unsigned long total_read = 0;
+   if (fin==NULL)
+   {
+       err = ZIP_ERRNO;
+   }
+
+    if (err == ZIP_OK)
+        do
+        {
+            err = ZIP_OK;
+            size_read = (int)fread(buf,1,size_buf,fin);
+            if (size_read < size_buf)
+                if (feof(fin)==0)
+            {
+                printf("error in reading %s\n",filenameinzip);
+                err = ZIP_ERRNO;
+            }
+
+            if (size_read>0)
+                calculate_crc = crc32(calculate_crc,buf,size_read);
+            total_read += size_read;
+
+        } while ((err == ZIP_OK) && (size_read>0));
+
+    if (fin)
+        fclose(fin);
+
+    *result_crc=calculate_crc;
+    printf("file %s crc %x\n",filenameinzip,calculate_crc);
+    return err;
+}
+
+int main(argc,argv)
+    int argc;
+    char *argv[];
+{
+    int i;
+    int opt_overwrite=0;
+    int opt_compress_level=Z_DEFAULT_COMPRESSION;
+    int zipfilenamearg = 0;
+    char filename_try[MAXFILENAME+16];
+    int zipok;
+    int err=0;
+    int size_buf=0;
+    void* buf=NULL;
+    const char* password=NULL;
+
+
+    do_banner();
+    if (argc==1)
+    {
+        do_help();
+        return 0;
+    }
+    else
+    {
+        for (i=1;i<argc;i++)
+        {
+            if ((*argv[i])=='-')
+            {
+                const char *p=argv[i]+1;
+
+                while ((*p)!='\0')
+                {
+                    char c=*(p++);;
+                    if ((c=='o') || (c=='O'))
+                        opt_overwrite = 1;
+                    if ((c=='a') || (c=='A'))
+                        opt_overwrite = 2;
+                    if ((c>='0') && (c<='9'))
+                        opt_compress_level = c-'0';
+
+                    if (((c=='p') || (c=='P')) && (i+1<argc))
+                    {
+                        password=argv[i+1];
+                        i++;
+                    }
+                }
+            }
+            else
+                if (zipfilenamearg == 0)
+                    zipfilenamearg = i ;
+        }
+    }
+
+    size_buf = WRITEBUFFERSIZE;
+    buf = (void*)malloc(size_buf);
+    if (buf==NULL)
+    {
+        printf("Error allocating memory\n");
+        return ZIP_INTERNALERROR;
+    }
+
+    if (zipfilenamearg==0)
+        zipok=0;
+    else
+    {
+        int i,len;
+        int dot_found=0;
+
+        zipok = 1 ;
+        strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);
+        /* strncpy doesnt append the trailing NULL, of the string is too long. */
+        filename_try[ MAXFILENAME ] = '\0';
+
+        len=(int)strlen(filename_try);
+        for (i=0;i<len;i++)
+            if (filename_try[i]=='.')
+                dot_found=1;
+
+        if (dot_found==0)
+            strcat(filename_try,".zip");
+
+        if (opt_overwrite==2)
+        {
+            /* if the file don't exist, we not append file */
+            if (check_exist_file(filename_try)==0)
+                opt_overwrite=1;
+        }
+        else
+        if (opt_overwrite==0)
+            if (check_exist_file(filename_try)!=0)
+            {
+                char rep=0;
+                do
+                {
+                    char answer[128];
+                    printf("The file %s exist. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try);
+                    scanf("%1s",answer);
+                    rep = answer[0] ;
+                    if ((rep>='a') && (rep<='z'))
+                        rep -= 0x20;
+                }
+                while ((rep!='Y') && (rep!='N') && (rep!='A'));
+                if (rep=='N')
+                    zipok = 0;
+                if (rep=='A')
+                    opt_overwrite = 2;
+            }
+    }
+
+    if (zipok==1)
+    {
+        zipFile zf;
+        int errclose;
+#        ifdef USEWIN32IOAPI
+        zlib_filefunc_def ffunc;
+        fill_win32_filefunc(&ffunc);
+        zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);
+#        else
+        zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0);
+#        endif
+
+        if (zf == NULL)
+        {
+            printf("error opening %s\n",filename_try);
+            err= ZIP_ERRNO;
+        }
+        else
+            printf("creating %s\n",filename_try);
+
+        for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
+        {
+            if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))
+            {
+                FILE * fin;
+                int size_read;
+                const char* filenameinzip = argv[i];
+                zip_fileinfo zi;
+                unsigned long crcFile=0;
+
+                zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
+                zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
+                zi.dosDate = 0;
+                zi.internal_fa = 0;
+                zi.external_fa = 0;
+                filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
+
+/*
+                err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
+                                 NULL,0,NULL,0,NULL / * comment * /,
+                                 (opt_compress_level != 0) ? Z_DEFLATED : 0,
+                                 opt_compress_level);
+*/
+                if ((password != NULL) && (err==ZIP_OK))
+                    err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
+
+                err = zipOpenNewFileInZip3(zf,filenameinzip,&zi,
+                                 NULL,0,NULL,0,NULL /* comment*/,
+                                 (opt_compress_level != 0) ? Z_DEFLATED : 0,
+                                 opt_compress_level,0,
+                                 /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 password,crcFile);
+
+                if (err != ZIP_OK)
+                    printf("error in opening %s in zipfile\n",filenameinzip);
+                else
+                {
+                    fin = fopen(filenameinzip,"rb");
+                    if (fin==NULL)
+                    {
+                        err=ZIP_ERRNO;
+                        printf("error in opening %s for reading\n",filenameinzip);
+                    }
+                }
+
+                if (err == ZIP_OK)
+                    do
+                    {
+                        err = ZIP_OK;
+                        size_read = (int)fread(buf,1,size_buf,fin);
+                        if (size_read < size_buf)
+                            if (feof(fin)==0)
+                        {
+                            printf("error in reading %s\n",filenameinzip);
+                            err = ZIP_ERRNO;
+                        }
+
+                        if (size_read>0)
+                        {
+                            err = zipWriteInFileInZip (zf,buf,size_read);
+                            if (err<0)
+                            {
+                                printf("error in writing %s in the zipfile\n",
+                                                 filenameinzip);
+                            }
+
+                        }
+                    } while ((err == ZIP_OK) && (size_read>0));
+
+                if (fin)
+                    fclose(fin);
+
+                if (err<0)
+                    err=ZIP_ERRNO;
+                else
+                {
+                    err = zipCloseFileInZip(zf);
+                    if (err!=ZIP_OK)
+                        printf("error in closing %s in the zipfile\n",
+                                    filenameinzip);
+                }
+            }
+        }
+        errclose = zipClose(zf,NULL);
+        if (errclose != ZIP_OK)
+            printf("error in closing %s\n",filename_try);
+   }
+
+    free(buf);
+    return 0;
+}
diff --git a/contrib/minizip/unzip.c b/contrib/minizip/unzip.c
index 96f9f33..81c8c28 100644
--- a/contrib/minizip/unzip.c
+++ b/contrib/minizip/unzip.c
@@ -1,1546 +1,1546 @@
-/* unzip.c -- IO for uncompress .zip files using zlib

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 Gilles Vollant

-

-   Read unzip.h for more info

-*/

-

-/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of

-compatibility with older software. The following is from the original crypt.c. Code

-woven in by Terry Thorsen 1/2003.

-*/

-/*

-  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.

-

-  See the accompanying file LICENSE, version 2000-Apr-09 or later

-  (the contents of which are also included in zip.h) for terms of use.

-  If, for some reason, all these files are missing, the Info-ZIP license

-  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html

-*/

-/*

-  crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]

-

-  The encryption/decryption parts of this source code (as opposed to the

-  non-echoing password parts) were originally written in Europe.  The

-  whole source package can be freely distributed, including from the USA.

-  (Prior to January 2000, re-export from the US was a violation of US law.)

- */

-

-/*

-  This encryption code is a direct transcription of the algorithm from

-  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This

-  file (appnote.txt) is distributed with the PKZIP program (even in the

-  version without encryption capabilities).

- */

-

-

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include "zlib.h"

-#include "unzip.h"

-

-#ifdef STDC

-#  include <stddef.h>

-#  include <string.h>

-#  include <stdlib.h>

-#endif

-#ifdef NO_ERRNO_H

-    extern int errno;

-#else

-#   include <errno.h>

-#endif

-

-

-#ifndef local

-#  define local static

-#endif

-/* compile with -Dlocal if your debugger can't find static symbols */

-

-

-

-#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \

-                      !defined(CASESENSITIVITYDEFAULT_NO)

-#define CASESENSITIVITYDEFAULT_NO

-#endif

-

-

-#ifndef UNZ_BUFSIZE

-#define UNZ_BUFSIZE (16384)

-#endif

-

-#ifndef UNZ_MAXFILENAMEINZIP

-#define UNZ_MAXFILENAMEINZIP (256)

-#endif

-

-#ifndef ALLOC

-# define ALLOC(size) (malloc(size))

-#endif

-#ifndef TRYFREE

-# define TRYFREE(p) {if (p) free(p);}

-#endif

-

-#define SIZECENTRALDIRITEM (0x2e)

-#define SIZEZIPLOCALHEADER (0x1e)

-

-

-

-

-const char unz_copyright[] =

-   " unzip 0.22 Copyright 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll";

-

-/* unz_file_info_interntal contain internal info about a file in zipfile*/

-typedef struct unz_file_info_internal_s

-{

-    uLong offset_curfile;/* relative offset of local header 4 bytes */

-} unz_file_info_internal;

-

-

-/* file_in_zip_read_info_s contain internal information about a file in zipfile,

-    when reading and decompress it */

-typedef struct

-{

-    char  *read_buffer;         /* internal buffer for compressed data */

-    z_stream stream;            /* zLib stream structure for inflate */

-

-    uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/

-    uLong stream_initialised;   /* flag set if stream structure is initialised*/

-

-    uLong offset_local_extrafield;/* offset of the local extra field */

-    uInt  size_local_extrafield;/* size of the local extra field */

-    uLong pos_local_extrafield;   /* position in the local extra field in read*/

-

-    uLong crc32;                /* crc32 of all data uncompressed */

-    uLong crc32_wait;           /* crc32 we must obtain after decompress all */

-    uLong rest_read_compressed; /* number of byte to be decompressed */

-    uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/

-    zlib_filefunc_def z_filefunc;

-    voidpf filestream;        /* io structore of the zipfile */

-    uLong compression_method;   /* compression method (0==store) */

-    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/

-    int   raw;

-} file_in_zip_read_info_s;

-

-

-/* unz_s contain internal information about the zipfile

-*/

-typedef struct

-{

-    zlib_filefunc_def z_filefunc;

-    voidpf filestream;        /* io structore of the zipfile */

-    unz_global_info gi;       /* public global information */

-    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/

-    uLong num_file;             /* number of the current file in the zipfile*/

-    uLong pos_in_central_dir;   /* pos of the current file in the central dir*/

-    uLong current_file_ok;      /* flag about the usability of the current file*/

-    uLong central_pos;          /* position of the beginning of the central dir*/

-

-    uLong size_central_dir;     /* size of the central directory  */

-    uLong offset_central_dir;   /* offset of start of central directory with

-                                   respect to the starting disk number */

-

-    unz_file_info cur_file_info; /* public info about the current file in zip*/

-    unz_file_info_internal cur_file_info_internal; /* private info about it*/

-    file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current

-                                        file if we are decompressing it */

-    int encrypted;

-    #ifndef NOUNCRYPT

-    unsigned long keys[3];     /* keys defining the pseudo-random sequence */

-    const unsigned long* pcrc_32_tab;

-    #endif

-} unz_s;

-

-

-#ifndef NOUNCRYPT

-#include "crypt.h"

-#endif

-

-/* ===========================================================================

-     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.

-*/

-

-

-local int unzlocal_getByte OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    int *pi));

-

-local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    int *pi;

-{

-    unsigned char c;

-    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);

-    if (err==1)

-    {

-        *pi = (int)c;

-        return UNZ_OK;

-    }

-    else

-    {

-        if (ZERROR(*pzlib_filefunc_def,filestream))

-            return UNZ_ERRNO;

-        else

-            return UNZ_EOF;

-    }

-}

-

-

-/* ===========================================================================

-   Reads a long in LSB order from the given gz_stream. Sets

-*/

-local int unzlocal_getShort OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    uLong *pX));

-

-local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    uLong *pX;

-{

-    uLong x ;

-    int i;

-    int err;

-

-    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x = (uLong)i;

-

-    if (err==UNZ_OK)

-        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<8;

-

-    if (err==UNZ_OK)

-        *pX = x;

-    else

-        *pX = 0;

-    return err;

-}

-

-local int unzlocal_getLong OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    uLong *pX));

-

-local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    uLong *pX;

-{

-    uLong x ;

-    int i;

-    int err;

-

-    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x = (uLong)i;

-

-    if (err==UNZ_OK)

-        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<8;

-

-    if (err==UNZ_OK)

-        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<16;

-

-    if (err==UNZ_OK)

-        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<24;

-

-    if (err==UNZ_OK)

-        *pX = x;

-    else

-        *pX = 0;

-    return err;

-}

-

-

-/* My own strcmpi / strcasecmp */

-local int strcmpcasenosensitive_internal (fileName1,fileName2)

-    const char* fileName1;

-    const char* fileName2;

-{

-    for (;;)

-    {

-        char c1=*(fileName1++);

-        char c2=*(fileName2++);

-        if ((c1>='a') && (c1<='z'))

-            c1 -= 0x20;

-        if ((c2>='a') && (c2<='z'))

-            c2 -= 0x20;

-        if (c1=='\0')

-            return ((c2=='\0') ? 0 : -1);

-        if (c2=='\0')

-            return 1;

-        if (c1<c2)

-            return -1;

-        if (c1>c2)

-            return 1;

-    }

-}

-

-

-#ifdef  CASESENSITIVITYDEFAULT_NO

-#define CASESENSITIVITYDEFAULTVALUE 2

-#else

-#define CASESENSITIVITYDEFAULTVALUE 1

-#endif

-

-#ifndef STRCMPCASENOSENTIVEFUNCTION

-#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal

-#endif

-

-/*

-   Compare two filename (fileName1,fileName2).

-   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)

-   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi

-                                                                or strcasecmp)

-   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system

-        (like 1 on Unix, 2 on Windows)

-

-*/

-extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)

-    const char* fileName1;

-    const char* fileName2;

-    int iCaseSensitivity;

-{

-    if (iCaseSensitivity==0)

-        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;

-

-    if (iCaseSensitivity==1)

-        return strcmp(fileName1,fileName2);

-

-    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);

-}

-

-#ifndef BUFREADCOMMENT

-#define BUFREADCOMMENT (0x400)

-#endif

-

-/*

-  Locate the Central directory of a zipfile (at the end, just before

-    the global comment)

-*/

-local uLong unzlocal_SearchCentralDir OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream));

-

-local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-{

-    unsigned char* buf;

-    uLong uSizeFile;

-    uLong uBackRead;

-    uLong uMaxBack=0xffff; /* maximum size of global comment */

-    uLong uPosFound=0;

-

-    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)

-        return 0;

-

-

-    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);

-

-    if (uMaxBack>uSizeFile)

-        uMaxBack = uSizeFile;

-

-    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);

-    if (buf==NULL)

-        return 0;

-

-    uBackRead = 4;

-    while (uBackRead<uMaxBack)

-    {

-        uLong uReadSize,uReadPos ;

-        int i;

-        if (uBackRead+BUFREADCOMMENT>uMaxBack)

-            uBackRead = uMaxBack;

-        else

-            uBackRead+=BUFREADCOMMENT;

-        uReadPos = uSizeFile-uBackRead ;

-

-        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?

-                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);

-        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            break;

-

-        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)

-            break;

-

-        for (i=(int)uReadSize-3; (i--)>0;)

-            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&

-                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))

-            {

-                uPosFound = uReadPos+i;

-                break;

-            }

-

-        if (uPosFound!=0)

-            break;

-    }

-    TRYFREE(buf);

-    return uPosFound;

-}

-

-/*

-  Open a Zip file. path contain the full pathname (by example,

-     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer

-     "zlib/zlib114.zip".

-     If the zipfile cannot be opened (file doesn't exist or in not valid), the

-       return value is NULL.

-     Else, the return value is a unzFile Handle, usable with other function

-       of this unzip package.

-*/

-extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)

-    const char *path;

-    zlib_filefunc_def* pzlib_filefunc_def;

-{

-    unz_s us;

-    unz_s *s;

-    uLong central_pos,uL;

-

-    uLong number_disk;          /* number of the current dist, used for

-                                   spaning ZIP, unsupported, always 0*/

-    uLong number_disk_with_CD;  /* number the the disk with central dir, used

-                                   for spaning ZIP, unsupported, always 0*/

-    uLong number_entry_CD;      /* total number of entries in

-                                   the central dir

-                                   (same than number_entry on nospan) */

-

-    int err=UNZ_OK;

-

-    if (unz_copyright[0]!=' ')

-        return NULL;

-

-    if (pzlib_filefunc_def==NULL)

-        fill_fopen_filefunc(&us.z_filefunc);

-    else

-        us.z_filefunc = *pzlib_filefunc_def;

-

-    us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,

-                                                 path,

-                                                 ZLIB_FILEFUNC_MODE_READ |

-                                                 ZLIB_FILEFUNC_MODE_EXISTING);

-    if (us.filestream==NULL)

-        return NULL;

-

-    central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);

-    if (central_pos==0)

-        err=UNZ_ERRNO;

-

-    if (ZSEEK(us.z_filefunc, us.filestream,

-                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)

-        err=UNZ_ERRNO;

-

-    /* the signature, already checked */

-    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* number of this disk */

-    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* number of the disk with the start of the central directory */

-    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* total number of entries in the central dir on this disk */

-    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* total number of entries in the central dir */

-    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if ((number_entry_CD!=us.gi.number_entry) ||

-        (number_disk_with_CD!=0) ||

-        (number_disk!=0))

-        err=UNZ_BADZIPFILE;

-

-    /* size of the central directory */

-    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* offset of start of central directory with respect to the

-          starting disk number */

-    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    /* zipfile comment length */

-    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&

-        (err==UNZ_OK))

-        err=UNZ_BADZIPFILE;

-

-    if (err!=UNZ_OK)

-    {

-        ZCLOSE(us.z_filefunc, us.filestream);

-        return NULL;

-    }

-

-    us.byte_before_the_zipfile = central_pos -

-                            (us.offset_central_dir+us.size_central_dir);

-    us.central_pos = central_pos;

-    us.pfile_in_zip_read = NULL;

-    us.encrypted = 0;

-

-

-    s=(unz_s*)ALLOC(sizeof(unz_s));

-    *s=us;

-    unzGoToFirstFile((unzFile)s);

-    return (unzFile)s;

-}

-

-

-extern unzFile ZEXPORT unzOpen (path)

-    const char *path;

-{

-    return unzOpen2(path, NULL);

-}

-

-/*

-  Close a ZipFile opened with unzipOpen.

-  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),

-    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.

-  return UNZ_OK if there is no problem. */

-extern int ZEXPORT unzClose (file)

-    unzFile file;

-{

-    unz_s* s;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-

-    if (s->pfile_in_zip_read!=NULL)

-        unzCloseCurrentFile(file);

-

-    ZCLOSE(s->z_filefunc, s->filestream);

-    TRYFREE(s);

-    return UNZ_OK;

-}

-

-

-/*

-  Write info about the ZipFile in the *pglobal_info structure.

-  No preparation of the structure is needed

-  return UNZ_OK if there is no problem. */

-extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)

-    unzFile file;

-    unz_global_info *pglobal_info;

-{

-    unz_s* s;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    *pglobal_info=s->gi;

-    return UNZ_OK;

-}

-

-

-/*

-   Translate date/time from Dos format to tm_unz (readable more easilty)

-*/

-local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)

-    uLong ulDosDate;

-    tm_unz* ptm;

-{

-    uLong uDate;

-    uDate = (uLong)(ulDosDate>>16);

-    ptm->tm_mday = (uInt)(uDate&0x1f) ;

-    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;

-    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;

-

-    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);

-    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;

-    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;

-}

-

-/*

-  Get Info about the current file in the zipfile, with internal only info

-*/

-local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,

-                                                  unz_file_info *pfile_info,

-                                                  unz_file_info_internal

-                                                  *pfile_info_internal,

-                                                  char *szFileName,

-                                                  uLong fileNameBufferSize,

-                                                  void *extraField,

-                                                  uLong extraFieldBufferSize,

-                                                  char *szComment,

-                                                  uLong commentBufferSize));

-

-local int unzlocal_GetCurrentFileInfoInternal (file,

-                                              pfile_info,

-                                              pfile_info_internal,

-                                              szFileName, fileNameBufferSize,

-                                              extraField, extraFieldBufferSize,

-                                              szComment,  commentBufferSize)

-    unzFile file;

-    unz_file_info *pfile_info;

-    unz_file_info_internal *pfile_info_internal;

-    char *szFileName;

-    uLong fileNameBufferSize;

-    void *extraField;

-    uLong extraFieldBufferSize;

-    char *szComment;

-    uLong commentBufferSize;

-{

-    unz_s* s;

-    unz_file_info file_info;

-    unz_file_info_internal file_info_internal;

-    int err=UNZ_OK;

-    uLong uMagic;

-    long lSeek=0;

-

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    if (ZSEEK(s->z_filefunc, s->filestream,

-              s->pos_in_central_dir+s->byte_before_the_zipfile,

-              ZLIB_FILEFUNC_SEEK_SET)!=0)

-        err=UNZ_ERRNO;

-

-

-    /* we check the magic */

-    if (err==UNZ_OK)

-        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)

-            err=UNZ_ERRNO;

-        else if (uMagic!=0x02014b50)

-            err=UNZ_BADZIPFILE;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    lSeek+=file_info.size_filename;

-    if ((err==UNZ_OK) && (szFileName!=NULL))

-    {

-        uLong uSizeRead ;

-        if (file_info.size_filename<fileNameBufferSize)

-        {

-            *(szFileName+file_info.size_filename)='\0';

-            uSizeRead = file_info.size_filename;

-        }

-        else

-            uSizeRead = fileNameBufferSize;

-

-        if ((file_info.size_filename>0) && (fileNameBufferSize>0))

-            if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)

-                err=UNZ_ERRNO;

-        lSeek -= uSizeRead;

-    }

-

-

-    if ((err==UNZ_OK) && (extraField!=NULL))

-    {

-        uLong uSizeRead ;

-        if (file_info.size_file_extra<extraFieldBufferSize)

-            uSizeRead = file_info.size_file_extra;

-        else

-            uSizeRead = extraFieldBufferSize;

-

-        if (lSeek!=0)

-            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)

-                lSeek=0;

-            else

-                err=UNZ_ERRNO;

-        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))

-            if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)

-                err=UNZ_ERRNO;

-        lSeek += file_info.size_file_extra - uSizeRead;

-    }

-    else

-        lSeek+=file_info.size_file_extra;

-

-

-    if ((err==UNZ_OK) && (szComment!=NULL))

-    {

-        uLong uSizeRead ;

-        if (file_info.size_file_comment<commentBufferSize)

-        {

-            *(szComment+file_info.size_file_comment)='\0';

-            uSizeRead = file_info.size_file_comment;

-        }

-        else

-            uSizeRead = commentBufferSize;

-

-        if (lSeek!=0)

-            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)

-                lSeek=0;

-            else

-                err=UNZ_ERRNO;

-        if ((file_info.size_file_comment>0) && (commentBufferSize>0))

-            if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)

-                err=UNZ_ERRNO;

-        lSeek+=file_info.size_file_comment - uSizeRead;

-    }

-    else

-        lSeek+=file_info.size_file_comment;

-

-    if ((err==UNZ_OK) && (pfile_info!=NULL))

-        *pfile_info=file_info;

-

-    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))

-        *pfile_info_internal=file_info_internal;

-

-    return err;

-}

-

-

-

-/*

-  Write info about the ZipFile in the *pglobal_info structure.

-  No preparation of the structure is needed

-  return UNZ_OK if there is no problem.

-*/

-extern int ZEXPORT unzGetCurrentFileInfo (file,

-                                          pfile_info,

-                                          szFileName, fileNameBufferSize,

-                                          extraField, extraFieldBufferSize,

-                                          szComment,  commentBufferSize)

-    unzFile file;

-    unz_file_info *pfile_info;

-    char *szFileName;

-    uLong fileNameBufferSize;

-    void *extraField;

-    uLong extraFieldBufferSize;

-    char *szComment;

-    uLong commentBufferSize;

-{

-    return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,

-                                                szFileName,fileNameBufferSize,

-                                                extraField,extraFieldBufferSize,

-                                                szComment,commentBufferSize);

-}

-

-/*

-  Set the current file of the zipfile to the first file.

-  return UNZ_OK if there is no problem

-*/

-extern int ZEXPORT unzGoToFirstFile (file)

-    unzFile file;

-{

-    int err=UNZ_OK;

-    unz_s* s;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    s->pos_in_central_dir=s->offset_central_dir;

-    s->num_file=0;

-    err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,

-                                             &s->cur_file_info_internal,

-                                             NULL,0,NULL,0,NULL,0);

-    s->current_file_ok = (err == UNZ_OK);

-    return err;

-}

-

-/*

-  Set the current file of the zipfile to the next file.

-  return UNZ_OK if there is no problem

-  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.

-*/

-extern int ZEXPORT unzGoToNextFile (file)

-    unzFile file;

-{

-    unz_s* s;

-    int err;

-

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    if (!s->current_file_ok)

-        return UNZ_END_OF_LIST_OF_FILE;

-    if (s->num_file+1==s->gi.number_entry)

-        return UNZ_END_OF_LIST_OF_FILE;

-

-    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +

-            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;

-    s->num_file++;

-    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,

-                                               &s->cur_file_info_internal,

-                                               NULL,0,NULL,0,NULL,0);

-    s->current_file_ok = (err == UNZ_OK);

-    return err;

-}

-

-

-/*

-  Try locate the file szFileName in the zipfile.

-  For the iCaseSensitivity signification, see unzipStringFileNameCompare

-

-  return value :

-  UNZ_OK if the file is found. It becomes the current file.

-  UNZ_END_OF_LIST_OF_FILE if the file is not found

-*/

-extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)

-    unzFile file;

-    const char *szFileName;

-    int iCaseSensitivity;

-{

-    unz_s* s;

-    int err;

-

-    /* We remember the 'current' position in the file so that we can jump

-     * back there if we fail.

-     */

-    unz_file_info cur_file_infoSaved;

-    unz_file_info_internal cur_file_info_internalSaved;

-    uLong num_fileSaved;

-    uLong pos_in_central_dirSaved;

-

-

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-

-    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)

-        return UNZ_PARAMERROR;

-

-    s=(unz_s*)file;

-    if (!s->current_file_ok)

-        return UNZ_END_OF_LIST_OF_FILE;

-

-    /* Save the current state */

-    num_fileSaved = s->num_file;

-    pos_in_central_dirSaved = s->pos_in_central_dir;

-    cur_file_infoSaved = s->cur_file_info;

-    cur_file_info_internalSaved = s->cur_file_info_internal;

-

-    err = unzGoToFirstFile(file);

-

-    while (err == UNZ_OK)

-    {

-        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];

-        err = unzGetCurrentFileInfo(file,NULL,

-                                    szCurrentFileName,sizeof(szCurrentFileName)-1,

-                                    NULL,0,NULL,0);

-        if (err == UNZ_OK)

-        {

-            if (unzStringFileNameCompare(szCurrentFileName,

-                                            szFileName,iCaseSensitivity)==0)

-                return UNZ_OK;

-            err = unzGoToNextFile(file);

-        }

-    }

-

-    /* We failed, so restore the state of the 'current file' to where we

-     * were.

-     */

-    s->num_file = num_fileSaved ;

-    s->pos_in_central_dir = pos_in_central_dirSaved ;

-    s->cur_file_info = cur_file_infoSaved;

-    s->cur_file_info_internal = cur_file_info_internalSaved;

-    return err;

-}

-

-

-/*

-///////////////////////////////////////////

-// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)

-// I need random access

-//

-// Further optimization could be realized by adding an ability

-// to cache the directory in memory. The goal being a single

-// comprehensive file read to put the file I need in a memory.

-*/

-

-/*

-typedef struct unz_file_pos_s

-{

-    uLong pos_in_zip_directory;   // offset in file

-    uLong num_of_file;            // # of file

-} unz_file_pos;

-*/

-

-extern int ZEXPORT unzGetFilePos(file, file_pos)

-    unzFile file;

-    unz_file_pos* file_pos;

-{

-    unz_s* s;

-

-    if (file==NULL || file_pos==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    if (!s->current_file_ok)

-        return UNZ_END_OF_LIST_OF_FILE;

-

-    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;

-    file_pos->num_of_file           = s->num_file;

-

-    return UNZ_OK;

-}

-

-extern int ZEXPORT unzGoToFilePos(file, file_pos)

-    unzFile file;

-    unz_file_pos* file_pos;

-{

-    unz_s* s;

-    int err;

-

-    if (file==NULL || file_pos==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-

-    /* jump to the right spot */

-    s->pos_in_central_dir = file_pos->pos_in_zip_directory;

-    s->num_file           = file_pos->num_of_file;

-

-    /* set the current file */

-    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,

-                                               &s->cur_file_info_internal,

-                                               NULL,0,NULL,0,NULL,0);

-    /* return results */

-    s->current_file_ok = (err == UNZ_OK);

-    return err;

-}

-

-/*

-// Unzip Helper Functions - should be here?

-///////////////////////////////////////////

-*/

-

-/*

-  Read the local header of the current zipfile

-  Check the coherency of the local header and info in the end of central

-        directory about this file

-  store in *piSizeVar the size of extra info in local header

-        (filename and size of extra field data)

-*/

-local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,

-                                                    poffset_local_extrafield,

-                                                    psize_local_extrafield)

-    unz_s* s;

-    uInt* piSizeVar;

-    uLong *poffset_local_extrafield;

-    uInt  *psize_local_extrafield;

-{

-    uLong uMagic,uData,uFlags;

-    uLong size_filename;

-    uLong size_extra_field;

-    int err=UNZ_OK;

-

-    *piSizeVar = 0;

-    *poffset_local_extrafield = 0;

-    *psize_local_extrafield = 0;

-

-    if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +

-                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)

-        return UNZ_ERRNO;

-

-

-    if (err==UNZ_OK)

-        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)

-            err=UNZ_ERRNO;

-        else if (uMagic!=0x04034b50)

-            err=UNZ_BADZIPFILE;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)

-        err=UNZ_ERRNO;

-/*

-    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))

-        err=UNZ_BADZIPFILE;

-*/

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)

-        err=UNZ_ERRNO;

-    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))

-        err=UNZ_BADZIPFILE;

-

-    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&

-                         (s->cur_file_info.compression_method!=Z_DEFLATED))

-        err=UNZ_BADZIPFILE;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */

-        err=UNZ_ERRNO;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */

-        err=UNZ_ERRNO;

-    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&

-                              ((uFlags & 8)==0))

-        err=UNZ_BADZIPFILE;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */

-        err=UNZ_ERRNO;

-    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&

-                              ((uFlags & 8)==0))

-        err=UNZ_BADZIPFILE;

-

-    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */

-        err=UNZ_ERRNO;

-    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&

-                              ((uFlags & 8)==0))

-        err=UNZ_BADZIPFILE;

-

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)

-        err=UNZ_ERRNO;

-    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))

-        err=UNZ_BADZIPFILE;

-

-    *piSizeVar += (uInt)size_filename;

-

-    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)

-        err=UNZ_ERRNO;

-    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +

-                                    SIZEZIPLOCALHEADER + size_filename;

-    *psize_local_extrafield = (uInt)size_extra_field;

-

-    *piSizeVar += (uInt)size_extra_field;

-

-    return err;

-}

-

-/*

-  Open for reading data the current file in the zipfile.

-  If there is no error and the file is opened, the return value is UNZ_OK.

-*/

-extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)

-    unzFile file;

-    int* method;

-    int* level;

-    int raw;

-    const char* password;

-{

-    int err=UNZ_OK;

-    uInt iSizeVar;

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    uLong offset_local_extrafield;  /* offset of the local extra field */

-    uInt  size_local_extrafield;    /* size of the local extra field */

-    #ifndef NOUNCRYPT

-    char source[12];

-    #else

-    if (password != NULL)

-        return UNZ_PARAMERROR;

-    #endif

-

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    if (!s->current_file_ok)

-        return UNZ_PARAMERROR;

-

-    if (s->pfile_in_zip_read != NULL)

-        unzCloseCurrentFile(file);

-

-    if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,

-                &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)

-        return UNZ_BADZIPFILE;

-

-    pfile_in_zip_read_info = (file_in_zip_read_info_s*)

-                                        ALLOC(sizeof(file_in_zip_read_info_s));

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_INTERNALERROR;

-

-    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);

-    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;

-    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;

-    pfile_in_zip_read_info->pos_local_extrafield=0;

-    pfile_in_zip_read_info->raw=raw;

-

-    if (pfile_in_zip_read_info->read_buffer==NULL)

-    {

-        TRYFREE(pfile_in_zip_read_info);

-        return UNZ_INTERNALERROR;

-    }

-

-    pfile_in_zip_read_info->stream_initialised=0;

-

-    if (method!=NULL)

-        *method = (int)s->cur_file_info.compression_method;

-

-    if (level!=NULL)

-    {

-        *level = 6;

-        switch (s->cur_file_info.flag & 0x06)

-        {

-          case 6 : *level = 1; break;

-          case 4 : *level = 2; break;

-          case 2 : *level = 9; break;

-        }

-    }

-

-    if ((s->cur_file_info.compression_method!=0) &&

-        (s->cur_file_info.compression_method!=Z_DEFLATED))

-        err=UNZ_BADZIPFILE;

-

-    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;

-    pfile_in_zip_read_info->crc32=0;

-    pfile_in_zip_read_info->compression_method =

-            s->cur_file_info.compression_method;

-    pfile_in_zip_read_info->filestream=s->filestream;

-    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;

-    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;

-

-    pfile_in_zip_read_info->stream.total_out = 0;

-

-    if ((s->cur_file_info.compression_method==Z_DEFLATED) &&

-        (!raw))

-    {

-      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;

-      pfile_in_zip_read_info->stream.zfree = (free_func)0;

-      pfile_in_zip_read_info->stream.opaque = (voidpf)0;

-      pfile_in_zip_read_info->stream.next_in = (voidpf)0;

-      pfile_in_zip_read_info->stream.avail_in = 0;

-

-      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);

-      if (err == Z_OK)

-        pfile_in_zip_read_info->stream_initialised=1;

-      else

-        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

-         * return Z_STREAM_END.

-         * In unzip, i don't wait absolutely Z_STREAM_END because I known the

-         * size of both compressed and uncompressed data

-         */

-    }

-    pfile_in_zip_read_info->rest_read_compressed =

-            s->cur_file_info.compressed_size ;

-    pfile_in_zip_read_info->rest_read_uncompressed =

-            s->cur_file_info.uncompressed_size ;

-

-

-    pfile_in_zip_read_info->pos_in_zipfile =

-            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +

-              iSizeVar;

-

-    pfile_in_zip_read_info->stream.avail_in = (uInt)0;

-

-    s->pfile_in_zip_read = pfile_in_zip_read_info;

-

-    #ifndef NOUNCRYPT

-    if (password != NULL)

-    {

-        int i;

-        s->pcrc_32_tab = get_crc_table();

-        init_keys(password,s->keys,s->pcrc_32_tab);

-        if (ZSEEK(s->z_filefunc, s->filestream,

-                  s->pfile_in_zip_read->pos_in_zipfile +

-                     s->pfile_in_zip_read->byte_before_the_zipfile,

-                  SEEK_SET)!=0)

-            return UNZ_INTERNALERROR;

-        if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)

-            return UNZ_INTERNALERROR;

-

-        for (i = 0; i<12; i++)

-            zdecode(s->keys,s->pcrc_32_tab,source[i]);

-

-        s->pfile_in_zip_read->pos_in_zipfile+=12;

-        s->encrypted=1;

-    }

-    #endif

-

-

-    return UNZ_OK;

-}

-

-extern int ZEXPORT unzOpenCurrentFile (file)

-    unzFile file;

-{

-    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);

-}

-

-extern int ZEXPORT unzOpenCurrentFilePassword (file, password)

-    unzFile file;

-    const char* password;

-{

-    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);

-}

-

-extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)

-    unzFile file;

-    int* method;

-    int* level;

-    int raw;

-{

-    return unzOpenCurrentFile3(file, method, level, raw, NULL);

-}

-

-/*

-  Read bytes from the current file.

-  buf contain buffer where data must be copied

-  len the size of buf.

-

-  return the number of byte copied if somes bytes are copied

-  return 0 if the end of file was reached

-  return <0 with error code if there is an error

-    (UNZ_ERRNO for IO error, or zLib error for uncompress error)

-*/

-extern int ZEXPORT unzReadCurrentFile  (file, buf, len)

-    unzFile file;

-    voidp buf;

-    unsigned len;

-{

-    int err=UNZ_OK;

-    uInt iRead = 0;

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    pfile_in_zip_read_info=s->pfile_in_zip_read;

-

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_PARAMERROR;

-

-

-    if ((pfile_in_zip_read_info->read_buffer == NULL))

-        return UNZ_END_OF_LIST_OF_FILE;

-    if (len==0)

-        return 0;

-

-    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;

-

-    pfile_in_zip_read_info->stream.avail_out = (uInt)len;

-

-    if (len>pfile_in_zip_read_info->rest_read_uncompressed)

-        pfile_in_zip_read_info->stream.avail_out =

-          (uInt)pfile_in_zip_read_info->rest_read_uncompressed;

-

-    while (pfile_in_zip_read_info->stream.avail_out>0)

-    {

-        if ((pfile_in_zip_read_info->stream.avail_in==0) &&

-            (pfile_in_zip_read_info->rest_read_compressed>0))

-        {

-            uInt uReadThis = UNZ_BUFSIZE;

-            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)

-                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;

-            if (uReadThis == 0)

-                return UNZ_EOF;

-            if (ZSEEK(pfile_in_zip_read_info->z_filefunc,

-                      pfile_in_zip_read_info->filestream,

-                      pfile_in_zip_read_info->pos_in_zipfile +

-                         pfile_in_zip_read_info->byte_before_the_zipfile,

-                         ZLIB_FILEFUNC_SEEK_SET)!=0)

-                return UNZ_ERRNO;

-            if (ZREAD(pfile_in_zip_read_info->z_filefunc,

-                      pfile_in_zip_read_info->filestream,

-                      pfile_in_zip_read_info->read_buffer,

-                      uReadThis)!=uReadThis)

-                return UNZ_ERRNO;

-

-

-            #ifndef NOUNCRYPT

-            if(s->encrypted)

-            {

-                uInt i;

-                for(i=0;i<uReadThis;i++)

-                  pfile_in_zip_read_info->read_buffer[i] =

-                      zdecode(s->keys,s->pcrc_32_tab,

-                              pfile_in_zip_read_info->read_buffer[i]);

-            }

-            #endif

-

-

-            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;

-

-            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;

-

-            pfile_in_zip_read_info->stream.next_in =

-                (Bytef*)pfile_in_zip_read_info->read_buffer;

-            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;

-        }

-

-        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))

-        {

-            uInt uDoCopy,i ;

-

-            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&

-                (pfile_in_zip_read_info->rest_read_compressed == 0))

-                return (iRead==0) ? UNZ_EOF : iRead;

-

-            if (pfile_in_zip_read_info->stream.avail_out <

-                            pfile_in_zip_read_info->stream.avail_in)

-                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;

-            else

-                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;

-

-            for (i=0;i<uDoCopy;i++)

-                *(pfile_in_zip_read_info->stream.next_out+i) =

-                        *(pfile_in_zip_read_info->stream.next_in+i);

-

-            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,

-                                pfile_in_zip_read_info->stream.next_out,

-                                uDoCopy);

-            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;

-            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;

-            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;

-            pfile_in_zip_read_info->stream.next_out += uDoCopy;

-            pfile_in_zip_read_info->stream.next_in += uDoCopy;

-            pfile_in_zip_read_info->stream.total_out += uDoCopy;

-            iRead += uDoCopy;

-        }

-        else

-        {

-            uLong uTotalOutBefore,uTotalOutAfter;

-            const Bytef *bufBefore;

-            uLong uOutThis;

-            int flush=Z_SYNC_FLUSH;

-

-            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;

-            bufBefore = pfile_in_zip_read_info->stream.next_out;

-

-            /*

-            if ((pfile_in_zip_read_info->rest_read_uncompressed ==

-                     pfile_in_zip_read_info->stream.avail_out) &&

-                (pfile_in_zip_read_info->rest_read_compressed == 0))

-                flush = Z_FINISH;

-            */

-            err=inflate(&pfile_in_zip_read_info->stream,flush);

-

-            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;

-            uOutThis = uTotalOutAfter-uTotalOutBefore;

-

-            pfile_in_zip_read_info->crc32 =

-                crc32(pfile_in_zip_read_info->crc32,bufBefore,

-                        (uInt)(uOutThis));

-

-            pfile_in_zip_read_info->rest_read_uncompressed -=

-                uOutThis;

-

-            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);

-

-            if (err==Z_STREAM_END)

-                return (iRead==0) ? UNZ_EOF : iRead;

-            if (err!=Z_OK)

-                break;

-        }

-    }

-

-    if (err==Z_OK)

-        return iRead;

-    return err;

-}

-

-

-/*

-  Give the current position in uncompressed data

-*/

-extern z_off_t ZEXPORT unztell (file)

-    unzFile file;

-{

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    pfile_in_zip_read_info=s->pfile_in_zip_read;

-

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_PARAMERROR;

-

-    return (z_off_t)pfile_in_zip_read_info->stream.total_out;

-}

-

-

-/*

-  return 1 if the end of file was reached, 0 elsewhere

-*/

-extern int ZEXPORT unzeof (file)

-    unzFile file;

-{

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    pfile_in_zip_read_info=s->pfile_in_zip_read;

-

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_PARAMERROR;

-

-    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)

-        return 1;

-    else

-        return 0;

-}

-

-

-

-/*

-  Read extra field from the current file (opened by unzOpenCurrentFile)

-  This is the local-header version of the extra field (sometimes, there is

-    more info in the local-header version than in the central-header)

-

-  if buf==NULL, it return the size of the local extra field that can be read

-

-  if buf!=NULL, len is the size of the buffer, the extra header is copied in

-    buf.

-  the return value is the number of bytes copied in buf, or (if <0)

-    the error code

-*/

-extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)

-    unzFile file;

-    voidp buf;

-    unsigned len;

-{

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    uInt read_now;

-    uLong size_to_read;

-

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    pfile_in_zip_read_info=s->pfile_in_zip_read;

-

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_PARAMERROR;

-

-    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -

-                pfile_in_zip_read_info->pos_local_extrafield);

-

-    if (buf==NULL)

-        return (int)size_to_read;

-

-    if (len>size_to_read)

-        read_now = (uInt)size_to_read;

-    else

-        read_now = (uInt)len ;

-

-    if (read_now==0)

-        return 0;

-

-    if (ZSEEK(pfile_in_zip_read_info->z_filefunc,

-              pfile_in_zip_read_info->filestream,

-              pfile_in_zip_read_info->offset_local_extrafield +

-              pfile_in_zip_read_info->pos_local_extrafield,

-              ZLIB_FILEFUNC_SEEK_SET)!=0)

-        return UNZ_ERRNO;

-

-    if (ZREAD(pfile_in_zip_read_info->z_filefunc,

-              pfile_in_zip_read_info->filestream,

-              buf,size_to_read)!=size_to_read)

-        return UNZ_ERRNO;

-

-    return (int)read_now;

-}

-

-/*

-  Close the file in zip opened with unzipOpenCurrentFile

-  Return UNZ_CRCERROR if all the file was read but the CRC is not good

-*/

-extern int ZEXPORT unzCloseCurrentFile (file)

-    unzFile file;

-{

-    int err=UNZ_OK;

-

-    unz_s* s;

-    file_in_zip_read_info_s* pfile_in_zip_read_info;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-    pfile_in_zip_read_info=s->pfile_in_zip_read;

-

-    if (pfile_in_zip_read_info==NULL)

-        return UNZ_PARAMERROR;

-

-

-    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&

-        (!pfile_in_zip_read_info->raw))

-    {

-        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)

-            err=UNZ_CRCERROR;

-    }

-

-

-    TRYFREE(pfile_in_zip_read_info->read_buffer);

-    pfile_in_zip_read_info->read_buffer = NULL;

-    if (pfile_in_zip_read_info->stream_initialised)

-        inflateEnd(&pfile_in_zip_read_info->stream);

-

-    pfile_in_zip_read_info->stream_initialised = 0;

-    TRYFREE(pfile_in_zip_read_info);

-

-    s->pfile_in_zip_read=NULL;

-

-    return err;

-}

-

-

-/*

-  Get the global comment string of the ZipFile, in the szComment buffer.

-  uSizeBuf is the size of the szComment buffer.

-  return the number of byte copied or an error code <0

-*/

-extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)

-    unzFile file;

-    char *szComment;

-    uLong uSizeBuf;

-{

-    int err=UNZ_OK;

-    unz_s* s;

-    uLong uReadThis ;

-    if (file==NULL)

-        return UNZ_PARAMERROR;

-    s=(unz_s*)file;

-

-    uReadThis = uSizeBuf;

-    if (uReadThis>s->gi.size_comment)

-        uReadThis = s->gi.size_comment;

-

-    if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)

-        return UNZ_ERRNO;

-

-    if (uReadThis>0)

-    {

-      *szComment='\0';

-      if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)

-        return UNZ_ERRNO;

-    }

-

-    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))

-        *(szComment+s->gi.size_comment)='\0';

-    return (int)uReadThis;

-}

+/* unzip.c -- IO for uncompress .zip files using zlib
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 Gilles Vollant
+
+   Read unzip.h for more info
+*/
+
+/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+compatibility with older software. The following is from the original crypt.c. Code
+woven in by Terry Thorsen 1/2003.
+*/
+/*
+  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
+
+  See the accompanying file LICENSE, version 2000-Apr-09 or later
+  (the contents of which are also included in zip.h) for terms of use.
+  If, for some reason, all these files are missing, the Info-ZIP license
+  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
+*/
+/*
+  crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
+
+  The encryption/decryption parts of this source code (as opposed to the
+  non-echoing password parts) were originally written in Europe.  The
+  whole source package can be freely distributed, including from the USA.
+  (Prior to January 2000, re-export from the US was a violation of US law.)
+ */
+
+/*
+  This encryption code is a direct transcription of the algorithm from
+  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
+  file (appnote.txt) is distributed with the PKZIP program (even in the
+  version without encryption capabilities).
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+#    define CASESENSITIVITYDEFAULT_NO
+#  endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+
+
+const char unz_copyright[] =
+   " unzip 0.22 Copyright 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info_internal_s
+{
+    uLong offset_curfile;/* relative offset of local header 4 bytes */
+} unz_file_info_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+    when reading and decompress it */
+typedef struct
+{
+    char  *read_buffer;         /* internal buffer for compressed data */
+    z_stream stream;            /* zLib stream structure for inflate */
+
+    uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
+    uLong stream_initialised;   /* flag set if stream structure is initialised*/
+
+    uLong offset_local_extrafield;/* offset of the local extra field */
+    uInt  size_local_extrafield;/* size of the local extra field */
+    uLong pos_local_extrafield;   /* position in the local extra field in read*/
+
+    uLong crc32;                /* crc32 of all data uncompressed */
+    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
+    uLong rest_read_compressed; /* number of byte to be decompressed */
+    uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    uLong compression_method;   /* compression method (0==store) */
+    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    int   raw;
+} file_in_zip_read_info_s;
+
+
+/* unz_s contain internal information about the zipfile
+*/
+typedef struct
+{
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    unz_global_info gi;       /* public global information */
+    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    uLong num_file;             /* number of the current file in the zipfile*/
+    uLong pos_in_central_dir;   /* pos of the current file in the central dir*/
+    uLong current_file_ok;      /* flag about the usability of the current file*/
+    uLong central_pos;          /* position of the beginning of the central dir*/
+
+    uLong size_central_dir;     /* size of the central directory  */
+    uLong offset_central_dir;   /* offset of start of central directory with
+                                   respect to the starting disk number */
+
+    unz_file_info cur_file_info; /* public info about the current file in zip*/
+    unz_file_info_internal cur_file_info_internal; /* private info about it*/
+    file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+                                        file if we are decompressing it */
+    int encrypted;
+#    ifndef NOUNCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+#    endif
+} unz_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+     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.
+*/
+
+
+local int unzlocal_getByte OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    int *pi));
+
+local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    int *pi;
+{
+    unsigned char c;
+    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return UNZ_OK;
+    }
+    else
+    {
+        if (ZERROR(*pzlib_filefunc_def,filestream))
+            return UNZ_ERRNO;
+        else
+            return UNZ_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unzlocal_getShort OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int unzlocal_getLong OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<16;
+
+    if (err==UNZ_OK)
+        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (fileName1,fileName2)
+    const char* fileName1;
+    const char* fileName2;
+{
+    for (;;)
+    {
+        char c1=*(fileName1++);
+        char c2=*(fileName2++);
+        if ((c1>='a') && (c1<='z'))
+            c1 -= 0x20;
+        if ((c2>='a') && (c2<='z'))
+            c2 -= 0x20;
+        if (c1=='\0')
+            return ((c2=='\0') ? 0 : -1);
+        if (c2=='\0')
+            return 1;
+        if (c1<c2)
+            return -1;
+        if (c1>c2)
+            return 1;
+    }
+}
+
+
+#ifdef  CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+        (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+    const char* fileName1;
+    const char* fileName2;
+    int iCaseSensitivity;
+{
+    if (iCaseSensitivity==0)
+        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+    if (iCaseSensitivity==1)
+        return strcmp(fileName1,fileName2);
+
+    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local uLong unzlocal_SearchCentralDir OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream));
+
+local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+{
+    unsigned char* buf;
+    uLong uSizeFile;
+    uLong uBackRead;
+    uLong uMaxBack=0xffff; /* maximum size of global comment */
+    uLong uPosFound=0;
+
+    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize,uReadPos ;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    return uPosFound;
+}
+
+/*
+  Open a Zip file. path contain the full pathname (by example,
+     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+     "zlib/zlib114.zip".
+     If the zipfile cannot be opened (file doesn't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+*/
+extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
+    const char *path;
+    zlib_filefunc_def* pzlib_filefunc_def;
+{
+    unz_s us;
+    unz_s *s;
+    uLong central_pos,uL;
+
+    uLong number_disk;          /* number of the current dist, used for
+                                   spaning ZIP, unsupported, always 0*/
+    uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                                   for spaning ZIP, unsupported, always 0*/
+    uLong number_entry_CD;      /* total number of entries in
+                                   the central dir
+                                   (same than number_entry on nospan) */
+
+    int err=UNZ_OK;
+
+    if (unz_copyright[0]!=' ')
+        return NULL;
+
+    if (pzlib_filefunc_def==NULL)
+        fill_fopen_filefunc(&us.z_filefunc);
+    else
+        us.z_filefunc = *pzlib_filefunc_def;
+
+    us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
+                                                 path,
+                                                 ZLIB_FILEFUNC_MODE_READ |
+                                                 ZLIB_FILEFUNC_MODE_EXISTING);
+    if (us.filestream==NULL)
+        return NULL;
+
+    central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
+    if (central_pos==0)
+        err=UNZ_ERRNO;
+
+    if (ZSEEK(us.z_filefunc, us.filestream,
+                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+    /* the signature, already checked */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* number of this disk */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* number of the disk with the start of the central directory */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* total number of entries in the central dir on this disk */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* total number of entries in the central dir */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if ((number_entry_CD!=us.gi.number_entry) ||
+        (number_disk_with_CD!=0) ||
+        (number_disk!=0))
+        err=UNZ_BADZIPFILE;
+
+    /* size of the central directory */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* offset of start of central directory with respect to the
+          starting disk number */
+    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    /* zipfile comment length */
+    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+        (err==UNZ_OK))
+        err=UNZ_BADZIPFILE;
+
+    if (err!=UNZ_OK)
+    {
+        ZCLOSE(us.z_filefunc, us.filestream);
+        return NULL;
+    }
+
+    us.byte_before_the_zipfile = central_pos -
+                            (us.offset_central_dir+us.size_central_dir);
+    us.central_pos = central_pos;
+    us.pfile_in_zip_read = NULL;
+    us.encrypted = 0;
+
+
+    s=(unz_s*)ALLOC(sizeof(unz_s));
+    *s=us;
+    unzGoToFirstFile((unzFile)s);
+    return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen (path)
+    const char *path;
+{
+    return unzOpen2(path, NULL);
+}
+
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (file)
+    unzFile file;
+{
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    if (s->pfile_in_zip_read!=NULL)
+        unzCloseCurrentFile(file);
+
+    ZCLOSE(s->z_filefunc, s->filestream);
+    TRYFREE(s);
+    return UNZ_OK;
+}
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+    unzFile file;
+    unz_global_info *pglobal_info;
+{
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    *pglobal_info=s->gi;
+    return UNZ_OK;
+}
+
+
+/*
+   Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)
+    uLong ulDosDate;
+    tm_unz* ptm;
+{
+    uLong uDate;
+    uDate = (uLong)(ulDosDate>>16);
+    ptm->tm_mday = (uInt)(uDate&0x1f) ;
+    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
+    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+  Get Info about the current file in the zipfile, with internal only info
+*/
+local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+                                                  unz_file_info *pfile_info,
+                                                  unz_file_info_internal
+                                                  *pfile_info_internal,
+                                                  char *szFileName,
+                                                  uLong fileNameBufferSize,
+                                                  void *extraField,
+                                                  uLong extraFieldBufferSize,
+                                                  char *szComment,
+                                                  uLong commentBufferSize));
+
+local int unzlocal_GetCurrentFileInfoInternal (file,
+                                              pfile_info,
+                                              pfile_info_internal,
+                                              szFileName, fileNameBufferSize,
+                                              extraField, extraFieldBufferSize,
+                                              szComment,  commentBufferSize)
+    unzFile file;
+    unz_file_info *pfile_info;
+    unz_file_info_internal *pfile_info_internal;
+    char *szFileName;
+    uLong fileNameBufferSize;
+    void *extraField;
+    uLong extraFieldBufferSize;
+    char *szComment;
+    uLong commentBufferSize;
+{
+    unz_s* s;
+    unz_file_info file_info;
+    unz_file_info_internal file_info_internal;
+    int err=UNZ_OK;
+    uLong uMagic;
+    long lSeek=0;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (ZSEEK(s->z_filefunc, s->filestream,
+              s->pos_in_central_dir+s->byte_before_the_zipfile,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+
+    /* we check the magic */
+    if (err==UNZ_OK)
+        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x02014b50)
+            err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    lSeek+=file_info.size_filename;
+    if ((err==UNZ_OK) && (szFileName!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_filename<fileNameBufferSize)
+        {
+            *(szFileName+file_info.size_filename)='\0';
+            uSizeRead = file_info.size_filename;
+        }
+        else
+            uSizeRead = fileNameBufferSize;
+
+        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        lSeek -= uSizeRead;
+    }
+
+
+    if ((err==UNZ_OK) && (extraField!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_file_extra<extraFieldBufferSize)
+            uSizeRead = file_info.size_file_extra;
+        else
+            uSizeRead = extraFieldBufferSize;
+
+        if (lSeek!=0)
+            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                lSeek=0;
+            else
+                err=UNZ_ERRNO;
+        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        lSeek += file_info.size_file_extra - uSizeRead;
+    }
+    else
+        lSeek+=file_info.size_file_extra;
+
+
+    if ((err==UNZ_OK) && (szComment!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_file_comment<commentBufferSize)
+        {
+            *(szComment+file_info.size_file_comment)='\0';
+            uSizeRead = file_info.size_file_comment;
+        }
+        else
+            uSizeRead = commentBufferSize;
+
+        if (lSeek!=0)
+            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                lSeek=0;
+            else
+                err=UNZ_ERRNO;
+        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+            if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        lSeek+=file_info.size_file_comment - uSizeRead;
+    }
+    else
+        lSeek+=file_info.size_file_comment;
+
+    if ((err==UNZ_OK) && (pfile_info!=NULL))
+        *pfile_info=file_info;
+
+    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+        *pfile_info_internal=file_info_internal;
+
+    return err;
+}
+
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo (file,
+                                          pfile_info,
+                                          szFileName, fileNameBufferSize,
+                                          extraField, extraFieldBufferSize,
+                                          szComment,  commentBufferSize)
+    unzFile file;
+    unz_file_info *pfile_info;
+    char *szFileName;
+    uLong fileNameBufferSize;
+    void *extraField;
+    uLong extraFieldBufferSize;
+    char *szComment;
+    uLong commentBufferSize;
+{
+    return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+                                                szFileName,fileNameBufferSize,
+                                                extraField,extraFieldBufferSize,
+                                                szComment,commentBufferSize);
+}
+
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (file)
+    unzFile file;
+{
+    int err=UNZ_OK;
+    unz_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    s->pos_in_central_dir=s->offset_central_dir;
+    s->num_file=0;
+    err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                             &s->cur_file_info_internal,
+                                             NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (file)
+    unzFile file;
+{
+    unz_s* s;
+    int err;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (s->num_file+1==s->gi.number_entry)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+    s->num_file++;
+    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)
+    unzFile file;
+    const char *szFileName;
+    int iCaseSensitivity;
+{
+    unz_s* s;
+    int err;
+
+    /* We remember the 'current' position in the file so that we can jump
+     * back there if we fail.
+     */
+    unz_file_info cur_file_infoSaved;
+    unz_file_info_internal cur_file_info_internalSaved;
+    uLong num_fileSaved;
+    uLong pos_in_central_dirSaved;
+
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+
+    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+        return UNZ_PARAMERROR;
+
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    /* Save the current state */
+    num_fileSaved = s->num_file;
+    pos_in_central_dirSaved = s->pos_in_central_dir;
+    cur_file_infoSaved = s->cur_file_info;
+    cur_file_info_internalSaved = s->cur_file_info_internal;
+
+    err = unzGoToFirstFile(file);
+
+    while (err == UNZ_OK)
+    {
+        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+        err = unzGetCurrentFileInfo(file,NULL,
+                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
+                                    NULL,0,NULL,0);
+        if (err == UNZ_OK)
+        {
+            if (unzStringFileNameCompare(szCurrentFileName,
+                                            szFileName,iCaseSensitivity)==0)
+                return UNZ_OK;
+            err = unzGoToNextFile(file);
+        }
+    }
+
+    /* We failed, so restore the state of the 'current file' to where we
+     * were.
+     */
+    s->num_file = num_fileSaved ;
+    s->pos_in_central_dir = pos_in_central_dirSaved ;
+    s->cur_file_info = cur_file_infoSaved;
+    s->cur_file_info_internal = cur_file_info_internalSaved;
+    return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+    uLong pos_in_zip_directory;   // offset in file
+    uLong num_of_file;            // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos(file, file_pos)
+    unzFile file;
+    unz_file_pos* file_pos;
+{
+    unz_s* s;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
+    file_pos->num_of_file           = s->num_file;
+
+    return UNZ_OK;
+}
+
+extern int ZEXPORT unzGoToFilePos(file, file_pos)
+    unzFile file;
+    unz_file_pos* file_pos;
+{
+    unz_s* s;
+    int err;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    /* jump to the right spot */
+    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+    s->num_file           = file_pos->num_of_file;
+
+    /* set the current file */
+    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    /* return results */
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+  Read the local header of the current zipfile
+  Check the coherency of the local header and info in the end of central
+        directory about this file
+  store in *piSizeVar the size of extra info in local header
+        (filename and size of extra field data)
+*/
+local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,
+                                                    poffset_local_extrafield,
+                                                    psize_local_extrafield)
+    unz_s* s;
+    uInt* piSizeVar;
+    uLong *poffset_local_extrafield;
+    uInt  *psize_local_extrafield;
+{
+    uLong uMagic,uData,uFlags;
+    uLong size_filename;
+    uLong size_extra_field;
+    int err=UNZ_OK;
+
+    *piSizeVar = 0;
+    *poffset_local_extrafield = 0;
+    *psize_local_extrafield = 0;
+
+    if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+
+    if (err==UNZ_OK)
+        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x04034b50)
+            err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+/*
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+        err=UNZ_BADZIPFILE;
+*/
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+        err=UNZ_BADZIPFILE;
+
+    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+                         (s->cur_file_info.compression_method!=Z_DEFLATED))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+        err=UNZ_ERRNO;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&
+                              ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+        err=UNZ_BADZIPFILE;
+
+    *piSizeVar += (uInt)size_filename;
+
+    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+        err=UNZ_ERRNO;
+    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+                                    SIZEZIPLOCALHEADER + size_filename;
+    *psize_local_extrafield = (uInt)size_extra_field;
+
+    *piSizeVar += (uInt)size_extra_field;
+
+    return err;
+}
+
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)
+    unzFile file;
+    int* method;
+    int* level;
+    int raw;
+    const char* password;
+{
+    int err=UNZ_OK;
+    uInt iSizeVar;
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    uLong offset_local_extrafield;  /* offset of the local extra field */
+    uInt  size_local_extrafield;    /* size of the local extra field */
+#    ifndef NOUNCRYPT
+    char source[12];
+#    else
+    if (password != NULL)
+        return UNZ_PARAMERROR;
+#    endif
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_PARAMERROR;
+
+    if (s->pfile_in_zip_read != NULL)
+        unzCloseCurrentFile(file);
+
+    if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,
+                &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+        return UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info = (file_in_zip_read_info_s*)
+                                        ALLOC(sizeof(file_in_zip_read_info_s));
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_INTERNALERROR;
+
+    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+    pfile_in_zip_read_info->pos_local_extrafield=0;
+    pfile_in_zip_read_info->raw=raw;
+
+    if (pfile_in_zip_read_info->read_buffer==NULL)
+    {
+        TRYFREE(pfile_in_zip_read_info);
+        return UNZ_INTERNALERROR;
+    }
+
+    pfile_in_zip_read_info->stream_initialised=0;
+
+    if (method!=NULL)
+        *method = (int)s->cur_file_info.compression_method;
+
+    if (level!=NULL)
+    {
+        *level = 6;
+        switch (s->cur_file_info.flag & 0x06)
+        {
+          case 6 : *level = 1; break;
+          case 4 : *level = 2; break;
+          case 2 : *level = 9; break;
+        }
+    }
+
+    if ((s->cur_file_info.compression_method!=0) &&
+        (s->cur_file_info.compression_method!=Z_DEFLATED))
+        err=UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+    pfile_in_zip_read_info->crc32=0;
+    pfile_in_zip_read_info->compression_method =
+            s->cur_file_info.compression_method;
+    pfile_in_zip_read_info->filestream=s->filestream;
+    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+    pfile_in_zip_read_info->stream.total_out = 0;
+
+    if ((s->cur_file_info.compression_method==Z_DEFLATED) &&
+        (!raw))
+    {
+      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+      pfile_in_zip_read_info->stream.zfree = (free_func)0;
+      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+      pfile_in_zip_read_info->stream.avail_in = 0;
+
+      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+      if (err == Z_OK)
+        pfile_in_zip_read_info->stream_initialised=1;
+      else
+        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
+         * return Z_STREAM_END.
+         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+         * size of both compressed and uncompressed data
+         */
+    }
+    pfile_in_zip_read_info->rest_read_compressed =
+            s->cur_file_info.compressed_size ;
+    pfile_in_zip_read_info->rest_read_uncompressed =
+            s->cur_file_info.uncompressed_size ;
+
+
+    pfile_in_zip_read_info->pos_in_zipfile =
+            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+              iSizeVar;
+
+    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+    s->pfile_in_zip_read = pfile_in_zip_read_info;
+
+#    ifndef NOUNCRYPT
+    if (password != NULL)
+    {
+        int i;
+        s->pcrc_32_tab = get_crc_table();
+        init_keys(password,s->keys,s->pcrc_32_tab);
+        if (ZSEEK(s->z_filefunc, s->filestream,
+                  s->pfile_in_zip_read->pos_in_zipfile +
+                     s->pfile_in_zip_read->byte_before_the_zipfile,
+                  SEEK_SET)!=0)
+            return UNZ_INTERNALERROR;
+        if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)
+            return UNZ_INTERNALERROR;
+
+        for (i = 0; i<12; i++)
+            zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+        s->pfile_in_zip_read->pos_in_zipfile+=12;
+        s->encrypted=1;
+    }
+#    endif
+
+
+    return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (file)
+    unzFile file;
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (file, password)
+    unzFile file;
+    const char* password;
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)
+    unzFile file;
+    int* method;
+    int* level;
+    int raw;
+{
+    return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/*
+  Read bytes from the current file.
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile  (file, buf, len)
+    unzFile file;
+    voidp buf;
+    unsigned len;
+{
+    int err=UNZ_OK;
+    uInt iRead = 0;
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->read_buffer == NULL))
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (len==0)
+        return 0;
+
+    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+    if (len>pfile_in_zip_read_info->rest_read_uncompressed)
+        pfile_in_zip_read_info->stream.avail_out =
+          (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+    while (pfile_in_zip_read_info->stream.avail_out>0)
+    {
+        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+            (pfile_in_zip_read_info->rest_read_compressed>0))
+        {
+            uInt uReadThis = UNZ_BUFSIZE;
+            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+            if (uReadThis == 0)
+                return UNZ_EOF;
+            if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->pos_in_zipfile +
+                         pfile_in_zip_read_info->byte_before_the_zipfile,
+                         ZLIB_FILEFUNC_SEEK_SET)!=0)
+                return UNZ_ERRNO;
+            if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->read_buffer,
+                      uReadThis)!=uReadThis)
+                return UNZ_ERRNO;
+
+
+#            ifndef NOUNCRYPT
+            if(s->encrypted)
+            {
+                uInt i;
+                for(i=0;i<uReadThis;i++)
+                  pfile_in_zip_read_info->read_buffer[i] =
+                      zdecode(s->keys,s->pcrc_32_tab,
+                              pfile_in_zip_read_info->read_buffer[i]);
+            }
+#            endif
+
+
+            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+            pfile_in_zip_read_info->stream.next_in =
+                (Bytef*)pfile_in_zip_read_info->read_buffer;
+            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+        }
+
+        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+        {
+            uInt uDoCopy,i ;
+
+            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                return (iRead==0) ? UNZ_EOF : iRead;
+
+            if (pfile_in_zip_read_info->stream.avail_out <
+                            pfile_in_zip_read_info->stream.avail_in)
+                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+            else
+                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+            for (i=0;i<uDoCopy;i++)
+                *(pfile_in_zip_read_info->stream.next_out+i) =
+                        *(pfile_in_zip_read_info->stream.next_in+i);
+
+            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+                                pfile_in_zip_read_info->stream.next_out,
+                                uDoCopy);
+            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+            pfile_in_zip_read_info->stream.next_out += uDoCopy;
+            pfile_in_zip_read_info->stream.next_in += uDoCopy;
+            pfile_in_zip_read_info->stream.total_out += uDoCopy;
+            iRead += uDoCopy;
+        }
+        else
+        {
+            uLong uTotalOutBefore,uTotalOutAfter;
+            const Bytef *bufBefore;
+            uLong uOutThis;
+            int flush=Z_SYNC_FLUSH;
+
+            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+            bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+            /*
+            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+                     pfile_in_zip_read_info->stream.avail_out) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                flush = Z_FINISH;
+            */
+            err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+            uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+            pfile_in_zip_read_info->crc32 =
+                crc32(pfile_in_zip_read_info->crc32,bufBefore,
+                        (uInt)(uOutThis));
+
+            pfile_in_zip_read_info->rest_read_uncompressed -=
+                uOutThis;
+
+            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+            if (err==Z_STREAM_END)
+                return (iRead==0) ? UNZ_EOF : iRead;
+            if (err!=Z_OK)
+                break;
+        }
+    }
+
+    if (err==Z_OK)
+        return iRead;
+    return err;
+}
+
+
+/*
+  Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (file)
+    unzFile file;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (file)
+    unzFile file;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+        return 1;
+    else
+        return 0;
+}
+
+
+
+/*
+  Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field that can be read
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)
+    unzFile file;
+    voidp buf;
+    unsigned len;
+{
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    uInt read_now;
+    uLong size_to_read;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+                pfile_in_zip_read_info->pos_local_extrafield);
+
+    if (buf==NULL)
+        return (int)size_to_read;
+
+    if (len>size_to_read)
+        read_now = (uInt)size_to_read;
+    else
+        read_now = (uInt)len ;
+
+    if (read_now==0)
+        return 0;
+
+    if (ZSEEK(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              pfile_in_zip_read_info->offset_local_extrafield +
+              pfile_in_zip_read_info->pos_local_extrafield,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (ZREAD(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              buf,size_to_read)!=size_to_read)
+        return UNZ_ERRNO;
+
+    return (int)read_now;
+}
+
+/*
+  Close the file in zip opened with unzipOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (file)
+    unzFile file;
+{
+    int err=UNZ_OK;
+
+    unz_s* s;
+    file_in_zip_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+        (!pfile_in_zip_read_info->raw))
+    {
+        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+            err=UNZ_CRCERROR;
+    }
+
+
+    TRYFREE(pfile_in_zip_read_info->read_buffer);
+    pfile_in_zip_read_info->read_buffer = NULL;
+    if (pfile_in_zip_read_info->stream_initialised)
+        inflateEnd(&pfile_in_zip_read_info->stream);
+
+    pfile_in_zip_read_info->stream_initialised = 0;
+    TRYFREE(pfile_in_zip_read_info);
+
+    s->pfile_in_zip_read=NULL;
+
+    return err;
+}
+
+
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)
+    unzFile file;
+    char *szComment;
+    uLong uSizeBuf;
+{
+    int err=UNZ_OK;
+    unz_s* s;
+    uLong uReadThis ;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz_s*)file;
+
+    uReadThis = uSizeBuf;
+    if (uReadThis>s->gi.size_comment)
+        uReadThis = s->gi.size_comment;
+
+    if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (uReadThis>0)
+    {
+      *szComment='\0';
+      if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+        return UNZ_ERRNO;
+    }
+
+    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+        *(szComment+s->gi.size_comment)='\0';
+    return (int)uReadThis;
+}
diff --git a/contrib/minizip/unzip.h b/contrib/minizip/unzip.h
index 48e6832..4c2f5e1 100644
--- a/contrib/minizip/unzip.h
+++ b/contrib/minizip/unzip.h
@@ -1,342 +1,342 @@
-/* unzip.h -- IO for uncompress .zip files using zlib

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 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.

-   Old compressions used by old PKZip 1.x are not supported

-

-

-   I WAIT FEEDBACK at mail info@winimage.com

-   Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution

-

-   Condition of use and distribution are the same than zlib :

-

-  This software is provided 'as-is', without any express or implied

-  warranty.  In no event will the authors be held liable for any damages

-  arising from the use of this software.

-

-  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.

-

-

-*/

-

-/* for more info about .ZIP format, see

-      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip

-      http://www.info-zip.org/pub/infozip/doc/

-   PkWare has also a specification at :

-      ftp://ftp.pkware.com/probdesc.zip

-*/

-

-#ifndef _unz_H

-#define _unz_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-#ifndef _ZLIB_H

-#include "zlib.h"

-#endif

-

-#ifndef _ZLIBIOAPI_H

-#include "ioapi.h"

-#endif

-

-#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)

-/* like the STRICT of WIN32, we define a pointer that cannot be converted

-    from (void*) without cast */

-typedef struct TagunzFile__ { int unused; } unzFile__;

-typedef unzFile__ *unzFile;

-#else

-typedef voidp unzFile;

-#endif

-

-

-#define UNZ_OK                          (0)

-#define UNZ_END_OF_LIST_OF_FILE         (-100)

-#define UNZ_ERRNO                       (Z_ERRNO)

-#define UNZ_EOF                         (0)

-#define UNZ_PARAMERROR                  (-102)

-#define UNZ_BADZIPFILE                  (-103)

-#define UNZ_INTERNALERROR               (-104)

-#define UNZ_CRCERROR                    (-105)

-

-/* tm_unz contain date/time info */

-typedef struct tm_unz_s

-{

-    uInt tm_sec;            /* seconds after the minute - [0,59] */

-    uInt tm_min;            /* minutes after the hour - [0,59] */

-    uInt tm_hour;           /* hours since midnight - [0,23] */

-    uInt tm_mday;           /* day of the month - [1,31] */

-    uInt tm_mon;            /* months since January - [0,11] */

-    uInt tm_year;           /* years - [1980..2044] */

-} tm_unz;

-

-/* unz_global_info structure contain global data about the ZIPfile

-   These data comes from the end of central dir */

-typedef struct unz_global_info_s

-{

-    uLong number_entry;         /* total number of entries in

-                       the central dir on this disk */

-    uLong size_comment;         /* size of the global comment of the zipfile */

-} unz_global_info;

-

-

-/* unz_file_info contain information about a file in the zipfile */

-typedef struct unz_file_info_s

-{

-    uLong version;              /* version made by                 2 bytes */

-    uLong version_needed;       /* version needed to extract       2 bytes */

-    uLong flag;                 /* general purpose bit flag        2 bytes */

-    uLong compression_method;   /* compression method              2 bytes */

-    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */

-    uLong crc;                  /* crc-32                          4 bytes */

-    uLong compressed_size;      /* compressed size                 4 bytes */

-    uLong uncompressed_size;    /* uncompressed size               4 bytes */

-    uLong size_filename;        /* filename length                 2 bytes */

-    uLong size_file_extra;      /* extra field length              2 bytes */

-    uLong size_file_comment;    /* file comment length             2 bytes */

-

-    uLong disk_num_start;       /* disk number start               2 bytes */

-    uLong internal_fa;          /* internal file attributes        2 bytes */

-    uLong external_fa;          /* external file attributes        4 bytes */

-

-    tm_unz tmu_date;

-} unz_file_info;

-

-extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,

-                                                 const char* fileName2,

-                                                 int iCaseSensitivity));

-/*

-   Compare two filename (fileName1,fileName2).

-   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)

-   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi

-                                or strcasecmp)

-   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system

-    (like 1 on Unix, 2 on Windows)

-*/

-

-

-extern unzFile ZEXPORT unzOpen OF((const char *path));

-/*

-  Open a Zip file. path contain the full pathname (by example,

-     on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer

-     "zlib/zlib113.zip".

-     If the zipfile cannot be opened (file don't exist or in not valid), the

-       return value is NULL.

-     Else, the return value is a unzFile Handle, usable with other function

-       of this unzip package.

-*/

-

-extern unzFile ZEXPORT unzOpen2 OF((const char *path,

-                                    zlib_filefunc_def* pzlib_filefunc_def));

-/*

-   Open a Zip file, like unzOpen, but provide a set of file low level API

-      for read/write the zip file (see ioapi.h)

-*/

-

-extern int ZEXPORT unzClose OF((unzFile file));

-/*

-  Close a ZipFile opened with unzipOpen.

-  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),

-    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.

-  return UNZ_OK if there is no problem. */

-

-extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,

-                                        unz_global_info *pglobal_info));

-/*

-  Write info about the ZipFile in the *pglobal_info structure.

-  No preparation of the structure is needed

-  return UNZ_OK if there is no problem. */

-

-

-extern int ZEXPORT unzGetGlobalComment OF((unzFile file,

-                                           char *szComment,

-                                           uLong uSizeBuf));

-/*

-  Get the global comment string of the ZipFile, in the szComment buffer.

-  uSizeBuf is the size of the szComment buffer.

-  return the number of byte copied or an error code <0

-*/

-

-

-/***************************************************************************/

-/* Unzip package allow you browse the directory of the zipfile */

-

-extern int ZEXPORT unzGoToFirstFile OF((unzFile file));

-/*

-  Set the current file of the zipfile to the first file.

-  return UNZ_OK if there is no problem

-*/

-

-extern int ZEXPORT unzGoToNextFile OF((unzFile file));

-/*

-  Set the current file of the zipfile to the next file.

-  return UNZ_OK if there is no problem

-  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.

-*/

-

-extern int ZEXPORT unzLocateFile OF((unzFile file,

-                     const char *szFileName,

-                     int iCaseSensitivity));

-/*

-  Try locate the file szFileName in the zipfile.

-  For the iCaseSensitivity signification, see unzStringFileNameCompare

-

-  return value :

-  UNZ_OK if the file is found. It becomes the current file.

-  UNZ_END_OF_LIST_OF_FILE if the file is not found

-*/

-

-

-/* ****************************************** */

-/* Ryan supplied functions */

-/* unz_file_info contain information about a file in the zipfile */

-typedef struct unz_file_pos_s

-{

-    uLong pos_in_zip_directory;   /* offset in zip file directory */

-    uLong num_of_file;            /* # of file */

-} unz_file_pos;

-

-extern int ZEXPORT unzGetFilePos(

-    unzFile file,

-    unz_file_pos* file_pos);

-

-extern int ZEXPORT unzGoToFilePos(

-    unzFile file,

-    unz_file_pos* file_pos);

-

-/* ****************************************** */

-

-extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,

-                         unz_file_info *pfile_info,

-                         char *szFileName,

-                         uLong fileNameBufferSize,

-                         void *extraField,

-                         uLong extraFieldBufferSize,

-                         char *szComment,

-                         uLong commentBufferSize));

-/*

-  Get Info about the current file

-  if pfile_info!=NULL, the *pfile_info structure will contain somes info about

-        the current file

-  if szFileName!=NULL, the filemane string will be copied in szFileName

-            (fileNameBufferSize is the size of the buffer)

-  if extraField!=NULL, the extra field information will be copied in extraField

-            (extraFieldBufferSize is the size of the buffer).

-            This is the Central-header version of the extra field

-  if szComment!=NULL, the comment string of the file will be copied in szComment

-            (commentBufferSize is the size of the buffer)

-*/

-

-/***************************************************************************/

-/* for reading the content of the current zipfile, you can open it, read data

-   from it, and close it (you can close it before reading all the file)

-   */

-

-extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));

-/*

-  Open for reading data the current file in the zipfile.

-  If there is no error, the return value is UNZ_OK.

-*/

-

-extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,

-                                                  const char* password));

-/*

-  Open for reading data the current file in the zipfile.

-  password is a crypting password

-  If there is no error, the return value is UNZ_OK.

-*/

-

-extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,

-                                           int* method,

-                                           int* level,

-                                           int raw));

-/*

-  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)

-    if raw==1

-  *method will receive method of compression, *level will receive level of

-     compression

-  note : you can set level parameter as NULL (if you did not want known level,

-         but you CANNOT set method parameter as NULL

-*/

-

-extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,

-                                           int* method,

-                                           int* level,

-                                           int raw,

-                                           const char* password));

-/*

-  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)

-    if raw==1

-  *method will receive method of compression, *level will receive level of

-     compression

-  note : you can set level parameter as NULL (if you did not want known level,

-         but you CANNOT set method parameter as NULL

-*/

-

-

-extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));

-/*

-  Close the file in zip opened with unzOpenCurrentFile

-  Return UNZ_CRCERROR if all the file was read but the CRC is not good

-*/

-

-extern int ZEXPORT unzReadCurrentFile OF((unzFile file,

-                      voidp buf,

-                      unsigned len));

-/*

-  Read bytes from the current file (opened by unzOpenCurrentFile)

-  buf contain buffer where data must be copied

-  len the size of buf.

-

-  return the number of byte copied if somes bytes are copied

-  return 0 if the end of file was reached

-  return <0 with error code if there is an error

-    (UNZ_ERRNO for IO error, or zLib error for uncompress error)

-*/

-

-extern z_off_t ZEXPORT unztell OF((unzFile file));

-/*

-  Give the current position in uncompressed data

-*/

-

-extern int ZEXPORT unzeof OF((unzFile file));

-/*

-  return 1 if the end of file was reached, 0 elsewhere

-*/

-

-extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,

-                                             voidp buf,

-                                             unsigned len));

-/*

-  Read extra field from the current file (opened by unzOpenCurrentFile)

-  This is the local-header version of the extra field (sometimes, there is

-    more info in the local-header version than in the central-header)

-

-  if buf==NULL, it return the size of the local extra field

-

-  if buf!=NULL, len is the size of the buffer, the extra header is copied in

-    buf.

-  the return value is the number of bytes copied in buf, or (if <0)

-    the error code

-*/

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* _unz_H */

+/* unzip.h -- IO for uncompress .zip files using zlib
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 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.
+   Old compressions used by old PKZip 1.x are not supported
+
+
+   I WAIT FEEDBACK at mail info@winimage.com
+   Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
+
+   Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  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.
+
+
+*/
+
+/* for more info about .ZIP format, see
+      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+      http://www.info-zip.org/pub/infozip/doc/
+   PkWare has also a specification at :
+      ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _unz_H
+#define _unz_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK                          (0)
+#define UNZ_END_OF_LIST_OF_FILE         (-100)
+#define UNZ_ERRNO                       (Z_ERRNO)
+#define UNZ_EOF                         (0)
+#define UNZ_PARAMERROR                  (-102)
+#define UNZ_BADZIPFILE                  (-103)
+#define UNZ_INTERNALERROR               (-104)
+#define UNZ_CRCERROR                    (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+   These data comes from the end of central dir */
+typedef struct unz_global_info_s
+{
+    uLong number_entry;         /* total number of entries in
+                       the central dir on this disk */
+    uLong size_comment;         /* size of the global comment of the zipfile */
+} unz_global_info;
+
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info_s
+{
+    uLong version;              /* version made by                 2 bytes */
+    uLong version_needed;       /* version needed to extract       2 bytes */
+    uLong flag;                 /* general purpose bit flag        2 bytes */
+    uLong compression_method;   /* compression method              2 bytes */
+    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */
+    uLong crc;                  /* crc-32                          4 bytes */
+    uLong compressed_size;      /* compressed size                 4 bytes */
+    uLong uncompressed_size;    /* uncompressed size               4 bytes */
+    uLong size_filename;        /* filename length                 2 bytes */
+    uLong size_file_extra;      /* extra field length              2 bytes */
+    uLong size_file_comment;    /* file comment length             2 bytes */
+
+    uLong disk_num_start;       /* disk number start               2 bytes */
+    uLong internal_fa;          /* internal file attributes        2 bytes */
+    uLong external_fa;          /* external file attributes        4 bytes */
+
+    tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+                                                 const char* fileName2,
+                                                 int iCaseSensitivity));
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+    (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((const char *path));
+/*
+  Open a Zip file. path contain the full pathname (by example,
+     on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
+     "zlib/zlib113.zip".
+     If the zipfile cannot be opened (file don't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+*/
+
+extern unzFile ZEXPORT unzOpen2 OF((const char *path,
+                                    zlib_filefunc_def* pzlib_filefunc_def));
+/*
+   Open a Zip file, like unzOpen, but provide a set of file low level API
+      for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+                                        unz_global_info *pglobal_info));
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+                                           char *szComment,
+                                           uLong uSizeBuf));
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+                     const char *szFileName,
+                     int iCaseSensitivity));
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+    uLong pos_in_zip_directory;   /* offset in zip file directory */
+    uLong num_of_file;            /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+                         unz_file_info *pfile_info,
+                         char *szFileName,
+                         uLong fileNameBufferSize,
+                         void *extraField,
+                         uLong extraFieldBufferSize,
+                         char *szComment,
+                         uLong commentBufferSize));
+/*
+  Get Info about the current file
+  if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+        the current file
+  if szFileName!=NULL, the filemane string will be copied in szFileName
+            (fileNameBufferSize is the size of the buffer)
+  if extraField!=NULL, the extra field information will be copied in extraField
+            (extraFieldBufferSize is the size of the buffer).
+            This is the Central-header version of the extra field
+  if szComment!=NULL, the comment string of the file will be copied in szComment
+            (commentBufferSize is the size of the buffer)
+*/
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+   from it, and close it (you can close it before reading all the file)
+   */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+                                                  const char* password));
+/*
+  Open for reading data the current file in the zipfile.
+  password is a crypting password
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw,
+                                           const char* password));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+  Close the file in zip opened with unzOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+                      voidp buf,
+                      unsigned len));
+/*
+  Read bytes from the current file (opened by unzOpenCurrentFile)
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+/*
+  Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+                                             voidp buf,
+                                             unsigned len));
+/*
+  Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz_H */
diff --git a/contrib/minizip/zip.c b/contrib/minizip/zip.c
index 00587fb..193c539 100644
--- a/contrib/minizip/zip.c
+++ b/contrib/minizip/zip.c
@@ -1,1168 +1,1168 @@
-/* zip.c -- IO on .zip files using zlib

-   Version 0.22, May 19th, 2003

-

-   Read zip.h for more info

-*/

-

-

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-#include <time.h>

-#include "zlib.h"

-#include "zip.h"

-

-#ifdef STDC

-#  include <stddef.h>

-#  include <string.h>

-#  include <stdlib.h>

-#endif

-#ifdef NO_ERRNO_H

-    extern int errno;

-#else

-#   include <errno.h>

-#endif

-

-

-#ifndef local

-#  define local static

-#endif

-/* compile with -Dlocal if your debugger can't find static symbols */

-

-#ifndef VERSIONMADEBY

-# define VERSIONMADEBY   (0x0) /* platform depedent */

-#endif

-

-#ifndef Z_BUFSIZE

-#define Z_BUFSIZE (16384)

-#endif

-

-#ifndef Z_MAXFILENAMEINZIP

-#define Z_MAXFILENAMEINZIP (256)

-#endif

-

-#ifndef ALLOC

-# define ALLOC(size) (malloc(size))

-#endif

-#ifndef TRYFREE

-# define TRYFREE(p) {if (p) free(p);}

-#endif

-

-/*

-#define SIZECENTRALDIRITEM (0x2e)

-#define SIZEZIPLOCALHEADER (0x1e)

-*/

-

-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */

-

-#ifndef SEEK_CUR

-#define SEEK_CUR    1

-#endif

-

-#ifndef SEEK_END

-#define SEEK_END    2

-#endif

-

-#ifndef SEEK_SET

-#define SEEK_SET    0

-#endif

-

-#ifndef DEF_MEM_LEVEL

-#if MAX_MEM_LEVEL >= 8

-#  define DEF_MEM_LEVEL 8

-#else

-#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL

-#endif

-#endif

-const char zip_copyright[] =

-   " zip 0.22 Copyright 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll";

-

-

-#define SIZEDATA_INDATABLOCK (4096-(4*4))

-

-#define LOCALHEADERMAGIC    (0x04034b50)

-#define CENTRALHEADERMAGIC  (0x02014b50)

-#define ENDHEADERMAGIC      (0x06054b50)

-

-#define FLAG_LOCALHEADER_OFFSET (0x06)

-#define CRC_LOCALHEADER_OFFSET  (0x0e)

-

-#define SIZECENTRALHEADER (0x2e) /* 46 */

-

-typedef struct linkedlist_datablock_internal_s

-{

-  struct linkedlist_datablock_internal_s* next_datablock;

-  uLong  avail_in_this_block;

-  uLong  filled_in_this_block;

-  uLong  unused; /* for future use and alignement */

-  unsigned char data[SIZEDATA_INDATABLOCK];

-} linkedlist_datablock_internal;

-

-typedef struct linkedlist_data_s

-{

-    linkedlist_datablock_internal* first_block;

-    linkedlist_datablock_internal* last_block;

-} linkedlist_data;

-

-

-typedef struct

-{

-    z_stream stream;            /* zLib stream structure for inflate */

-    int  stream_initialised;    /* 1 is stream is initialised */

-    uInt pos_in_buffered_data;  /* last written byte in buffered_data */

-

-    uLong pos_local_header;     /* offset of the local header of the file

-                                     currenty writing */

-    char* central_header;       /* central header data for the current file */

-    uLong size_centralheader;   /* size of the central header for cur file */

-    uLong flag;                 /* flag of the file currently writing */

-

-    int  method;                /* compression method of file currenty wr.*/

-    int  raw;                   /* 1 for directly writing raw data */

-    Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/

-    uLong dosDate;

-    uLong crc32;

-    int  encrypt;

-#ifndef NOCRYPT

-    unsigned long keys[3];     /* keys defining the pseudo-random sequence */

-    const unsigned long* pcrc_32_tab;

-    int crypt_header_size;

-#endif

-} curfile_info;

-

-typedef struct

-{

-    zlib_filefunc_def z_filefunc;

-    voidpf filestream;        /* io structore of the zipfile */

-    linkedlist_data central_dir;/* datablock with central dir in construction*/

-    int  in_opened_file_inzip;  /* 1 if a file in the zip is currently writ.*/

-    curfile_info ci;            /* info on the file curretly writing */

-

-    uLong begin_pos;            /* position of the beginning of the zipfile */

-    uLong add_position_when_writting_offset;

-    uLong number_entry;

-} zip_internal;

-

-

-

-#ifndef NOCRYPT

-#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED

-#include "crypt.h"

-#endif

-

-local linkedlist_datablock_internal* allocate_new_datablock()

-{

-    linkedlist_datablock_internal* ldi;

-    ldi = (linkedlist_datablock_internal*)

-                 ALLOC(sizeof(linkedlist_datablock_internal));

-    if (ldi!=NULL)

-    {

-        ldi->next_datablock = NULL ;

-        ldi->filled_in_this_block = 0 ;

-        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;

-    }

-    return ldi;

-}

-

-local void free_datablock(ldi)

-    linkedlist_datablock_internal* ldi;

-{

-    while (ldi!=NULL)

-    {

-        linkedlist_datablock_internal* ldinext = ldi->next_datablock;

-        TRYFREE(ldi);

-        ldi = ldinext;

-    }

-}

-

-local void init_linkedlist(ll)

-    linkedlist_data* ll;

-{

-    ll->first_block = ll->last_block = NULL;

-}

-

-local void free_linkedlist(ll)

-    linkedlist_data* ll;

-{

-    free_datablock(ll->first_block);

-    ll->first_block = ll->last_block = NULL;

-}

-

-

-local int add_data_in_datablock(ll,buf,len)

-    linkedlist_data* ll;

-    const void* buf;

-    uLong len;

-{

-    linkedlist_datablock_internal* ldi;

-    const unsigned char* from_copy;

-

-    if (ll==NULL)

-        return ZIP_INTERNALERROR;

-

-    if (ll->last_block == NULL)

-    {

-        ll->first_block = ll->last_block = allocate_new_datablock();

-        if (ll->first_block == NULL)

-            return ZIP_INTERNALERROR;

-    }

-

-    ldi = ll->last_block;

-    from_copy = (unsigned char*)buf;

-

-    while (len>0)

-    {

-        uInt copy_this;

-        uInt i;

-        unsigned char* to_copy;

-

-        if (ldi->avail_in_this_block==0)

-        {

-            ldi->next_datablock = allocate_new_datablock();

-            if (ldi->next_datablock == NULL)

-                return ZIP_INTERNALERROR;

-            ldi = ldi->next_datablock ;

-            ll->last_block = ldi;

-        }

-

-        if (ldi->avail_in_this_block < len)

-            copy_this = (uInt)ldi->avail_in_this_block;

-        else

-            copy_this = (uInt)len;

-

-        to_copy = &(ldi->data[ldi->filled_in_this_block]);

-

-        for (i=0;i<copy_this;i++)

-            *(to_copy+i)=*(from_copy+i);

-

-        ldi->filled_in_this_block += copy_this;

-        ldi->avail_in_this_block -= copy_this;

-        from_copy += copy_this ;

-        len -= copy_this;

-    }

-    return ZIP_OK;

-}

-

-

-

-/****************************************************************************/

-

-#ifndef NO_ADDFILEINEXISTINGZIP

-/* ===========================================================================

-   Inputs a long in LSB order to the given file

-   nbByte == 1, 2 or 4 (byte, short or long)

-*/

-

-local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,

-                                voidpf filestream, uLong x, int nbByte));

-local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    uLong x;

-    int nbByte;

-{

-    unsigned char buf[4];

-    int n;

-    for (n = 0; n < nbByte; n++) {

-        buf[n] = (unsigned char)(x & 0xff);

-        x >>= 8;

-    }

-    if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)

-        return ZIP_ERRNO;

-    else

-        return ZIP_OK;

-}

-

-local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));

-local void ziplocal_putValue_inmemory (dest, x, nbByte)

-    void* dest;

-    uLong x;

-    int nbByte;

-{

-    unsigned char* buf=(unsigned char*)dest;

-    int n;

-    for (n = 0; n < nbByte; n++) {

-        buf[n] = (unsigned char)(x & 0xff);

-        x >>= 8;

-    }

-}

-/****************************************************************************/

-

-

-local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)

-    const tm_zip* ptm;

-    uLong dosDate;

-{

-    uLong year = (uLong)ptm->tm_year;

-    if (year>1980)

-        year-=1980;

-    else if (year>80)

-        year-=80;

-    return

-      (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |

-        ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));

-}

-

-

-/****************************************************************************/

-

-local int ziplocal_getByte OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    int *pi));

-

-local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    int *pi;

-{

-    unsigned char c;

-    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);

-    if (err==1)

-    {

-        *pi = (int)c;

-        return ZIP_OK;

-    }

-    else

-    {

-        if (ZERROR(*pzlib_filefunc_def,filestream))

-            return ZIP_ERRNO;

-        else

-            return ZIP_EOF;

-    }

-}

-

-

-/* ===========================================================================

-   Reads a long in LSB order from the given gz_stream. Sets

-*/

-local int ziplocal_getShort OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    uLong *pX));

-

-local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    uLong *pX;

-{

-    uLong x ;

-    int i;

-    int err;

-

-    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x = (uLong)i;

-

-    if (err==ZIP_OK)

-        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<8;

-

-    if (err==ZIP_OK)

-        *pX = x;

-    else

-        *pX = 0;

-    return err;

-}

-

-local int ziplocal_getLong OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream,

-    uLong *pX));

-

-local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-    uLong *pX;

-{

-    uLong x ;

-    int i;

-    int err;

-

-    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x = (uLong)i;

-

-    if (err==ZIP_OK)

-        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<8;

-

-    if (err==ZIP_OK)

-        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<16;

-

-    if (err==ZIP_OK)

-        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);

-    x += ((uLong)i)<<24;

-

-    if (err==ZIP_OK)

-        *pX = x;

-    else

-        *pX = 0;

-    return err;

-}

-

-#ifndef BUFREADCOMMENT

-#define BUFREADCOMMENT (0x400)

-#endif

-/*

-  Locate the Central directory of a zipfile (at the end, just before

-    the global comment)

-*/

-local uLong ziplocal_SearchCentralDir OF((

-    const zlib_filefunc_def* pzlib_filefunc_def,

-    voidpf filestream));

-

-local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)

-    const zlib_filefunc_def* pzlib_filefunc_def;

-    voidpf filestream;

-{

-    unsigned char* buf;

-    uLong uSizeFile;

-    uLong uBackRead;

-    uLong uMaxBack=0xffff; /* maximum size of global comment */

-    uLong uPosFound=0;

-

-    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)

-        return 0;

-

-

-    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);

-

-    if (uMaxBack>uSizeFile)

-        uMaxBack = uSizeFile;

-

-    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);

-    if (buf==NULL)

-        return 0;

-

-    uBackRead = 4;

-    while (uBackRead<uMaxBack)

-    {

-        uLong uReadSize,uReadPos ;

-        int i;

-        if (uBackRead+BUFREADCOMMENT>uMaxBack)

-            uBackRead = uMaxBack;

-        else

-            uBackRead+=BUFREADCOMMENT;

-        uReadPos = uSizeFile-uBackRead ;

-

-        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?

-                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);

-        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            break;

-

-        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)

-            break;

-

-        for (i=(int)uReadSize-3; (i--)>0;)

-            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&

-                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))

-            {

-                uPosFound = uReadPos+i;

-                break;

-            }

-

-        if (uPosFound!=0)

-            break;

-    }

-    TRYFREE(buf);

-    return uPosFound;

-}

-#endif /* !NO_ADDFILEINEXISTINGZIP*/

-

-/************************************************************/

-extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def)

-    const char *pathname;

-    int append;

-    zipcharpc* globalcomment;

-    zlib_filefunc_def* pzlib_filefunc_def;

-{

-    zip_internal ziinit;

-    zip_internal* zi;

-    int err=ZIP_OK;

-

-

-    if (pzlib_filefunc_def==NULL)

-        fill_fopen_filefunc(&ziinit.z_filefunc);

-    else

-        ziinit.z_filefunc = *pzlib_filefunc_def;

-

-    ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))

-                 (ziinit.z_filefunc.opaque,

-                  pathname,

-                  (append == APPEND_STATUS_CREATE) ?

-                  (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :

-                    (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));

-

-    if (ziinit.filestream == NULL)

-        return NULL;

-    ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);

-    ziinit.in_opened_file_inzip = 0;

-    ziinit.ci.stream_initialised = 0;

-    ziinit.number_entry = 0;

-    ziinit.add_position_when_writting_offset = 0;

-    init_linkedlist(&(ziinit.central_dir));

-

-

-    zi = (zip_internal*)ALLOC(sizeof(zip_internal));

-    if (zi==NULL)

-    {

-        ZCLOSE(ziinit.z_filefunc,ziinit.filestream);

-        return NULL;

-    }

-

-    /* now we add file in a zipfile */

-    #ifndef NO_ADDFILEINEXISTINGZIP

-    if (append == APPEND_STATUS_ADDINZIP)

-    {

-        uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/

-

-        uLong size_central_dir;     /* size of the central directory  */

-        uLong offset_central_dir;   /* offset of start of central directory */

-        uLong central_pos,uL;

-

-        uLong number_disk;          /* number of the current dist, used for

-                                    spaning ZIP, unsupported, always 0*/

-        uLong number_disk_with_CD;  /* number the the disk with central dir, used

-                                    for spaning ZIP, unsupported, always 0*/

-        uLong number_entry;

-        uLong number_entry_CD;      /* total number of entries in

-                                    the central dir

-                                    (same than number_entry on nospan) */

-        uLong size_comment;

-

-        central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);

-        if (central_pos==0)

-            err=ZIP_ERRNO;

-

-        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,

-                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            err=ZIP_ERRNO;

-

-        /* the signature, already checked */

-        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* number of this disk */

-        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* number of the disk with the start of the central directory */

-        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* total number of entries in the central dir on this disk */

-        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* total number of entries in the central dir */

-        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        if ((number_entry_CD!=number_entry) ||

-            (number_disk_with_CD!=0) ||

-            (number_disk!=0))

-            err=ZIP_BADZIPFILE;

-

-        /* size of the central directory */

-        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* offset of start of central directory with respect to the

-            starting disk number */

-        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        /* zipfile comment length */

-        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)

-            err=ZIP_ERRNO;

-

-        if ((central_pos<offset_central_dir+size_central_dir) &&

-            (err==ZIP_OK))

-            err=ZIP_BADZIPFILE;

-

-        if (err!=ZIP_OK)

-        {

-            ZCLOSE(ziinit.z_filefunc, ziinit.filestream);

-            return NULL;

-        }

-

-        byte_before_the_zipfile = central_pos -

-                                (offset_central_dir+size_central_dir);

-        ziinit.add_position_when_writting_offset = byte_before_the_zipfile ;

-

-        {

-            uLong size_central_dir_to_read = size_central_dir;

-            size_t buf_size = SIZEDATA_INDATABLOCK;

-            void* buf_read = (void*)ALLOC(buf_size);

-            if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,

-                  offset_central_dir + byte_before_the_zipfile,

-                  ZLIB_FILEFUNC_SEEK_SET) != 0)

-                  err=ZIP_ERRNO;

-

-            while ((size_central_dir_to_read>0) && (err==ZIP_OK))

-            {

-                uLong read_this = SIZEDATA_INDATABLOCK;

-                if (read_this > size_central_dir_to_read)

-                    read_this = size_central_dir_to_read;

-                if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)

-                    err=ZIP_ERRNO;

-

-                if (err==ZIP_OK)

-                    err = add_data_in_datablock(&ziinit.central_dir,buf_read,

-                                                (uLong)read_this);

-                size_central_dir_to_read-=read_this;

-            }

-            TRYFREE(buf_read);

-        }

-        ziinit.begin_pos = byte_before_the_zipfile;

-        ziinit.number_entry = number_entry_CD;

-

-        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,

-                  offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            err=ZIP_ERRNO;

-    }

-    #endif /* !NO_ADDFILEINEXISTINGZIP*/

-

-    if (err != ZIP_OK)

-    {

-        TRYFREE(zi);

-        return NULL;

-    }

-    else

-    {

-        *zi = ziinit;

-        return (zipFile)zi;

-    }

-}

-

-extern zipFile ZEXPORT zipOpen (pathname, append)

-    const char *pathname;

-    int append;

-{

-    return zipOpen2(pathname,append,NULL,NULL);

-}

-

-extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,

-                                         extrafield_local, size_extrafield_local,

-                                         extrafield_global, size_extrafield_global,

-                                         comment, method, level, raw,

-                                         windowBits, memLevel, strategy,

-                                         password, crcForCrypting)

-    zipFile file;

-    const char* filename;

-    const zip_fileinfo* zipfi;

-    const void* extrafield_local;

-    uInt size_extrafield_local;

-    const void* extrafield_global;

-    uInt size_extrafield_global;

-    const char* comment;

-    int method;

-    int level;

-    int raw;

-    int windowBits;

-    int memLevel;

-    int strategy;

-    const char* password;

-    uLong crcForCrypting;

-{

-    zip_internal* zi;

-    uInt size_filename;

-    uInt size_comment;

-    uInt i;

-    int err = ZIP_OK;

-

-    #ifdef NOCRYPT

-    if (password != NULL)

-        return ZIP_PARAMERROR;

-    #endif

-

-    if (file == NULL)

-        return ZIP_PARAMERROR;

-    if ((method!=0) && (method!=Z_DEFLATED))

-        return ZIP_PARAMERROR;

-

-    zi = (zip_internal*)file;

-

-    if (zi->in_opened_file_inzip == 1)

-    {

-        err = zipCloseFileInZip (file);

-        if (err != ZIP_OK)

-            return err;

-    }

-

-

-    if (filename==NULL)

-        filename="-";

-

-    if (comment==NULL)

-        size_comment = 0;

-    else

-        size_comment = strlen(comment);

-

-    size_filename = strlen(filename);

-

-    if (zipfi == NULL)

-        zi->ci.dosDate = 0;

-    else

-    {

-        if (zipfi->dosDate != 0)

-            zi->ci.dosDate = zipfi->dosDate;

-        else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);

-    }

-

-    zi->ci.flag = 0;

-    if ((level==8) || (level==9))

-      zi->ci.flag |= 2;

-    if ((level==2))

-      zi->ci.flag |= 4;

-    if ((level==1))

-      zi->ci.flag |= 6;

-    if (password != NULL)

-      zi->ci.flag |= 1;

-

-    zi->ci.crc32 = 0;

-    zi->ci.method = method;

-    zi->ci.encrypt = 0;

-    zi->ci.stream_initialised = 0;

-    zi->ci.pos_in_buffered_data = 0;

-    zi->ci.raw = raw;

-    zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;

-    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +

-                                      size_extrafield_global + size_comment;

-    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);

-

-    ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);

-    /* version info */

-    ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);

-    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/

-    ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/

-    ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/

-    ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/

-

-    if (zipfi==NULL)

-        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);

-    else

-        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);

-

-    if (zipfi==NULL)

-        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);

-    else

-        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);

-

-    ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);

-

-    for (i=0;i<size_filename;i++)

-        *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);

-

-    for (i=0;i<size_extrafield_global;i++)

-        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =

-              *(((const char*)extrafield_global)+i);

-

-    for (i=0;i<size_comment;i++)

-        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+

-              size_extrafield_global+i) = *(comment+i);

-    if (zi->ci.central_header == NULL)

-        return ZIP_INTERNALERROR;

-

-    /* write the local header */

-    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);

-

-    if (err==ZIP_OK)

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);

-

-    if ((err==ZIP_OK) && (size_filename>0))

-        if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)

-                err = ZIP_ERRNO;

-

-    if ((err==ZIP_OK) && (size_extrafield_local>0))

-        if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)

-                                                                           !=size_extrafield_local)

-                err = ZIP_ERRNO;

-

-    zi->ci.stream.avail_in = (uInt)0;

-    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;

-    zi->ci.stream.next_out = zi->ci.buffered_data;

-    zi->ci.stream.total_in = 0;

-    zi->ci.stream.total_out = 0;

-

-    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))

-    {

-        zi->ci.stream.zalloc = (alloc_func)0;

-        zi->ci.stream.zfree = (free_func)0;

-        zi->ci.stream.opaque = (voidpf)0;

-

-        if (windowBits>0)

-            windowBits = -windowBits;

-

-        err = deflateInit2(&zi->ci.stream, level,

-               Z_DEFLATED, windowBits, memLevel, strategy);

-

-        if (err==Z_OK)

-            zi->ci.stream_initialised = 1;

-    }

-    #ifndef NOCRYPT

-    zi->ci.crypt_header_size = 0;

-    if ((err==Z_OK) && (password != NULL))

-    {

-        unsigned char bufHead[RAND_HEAD_LEN];

-        unsigned int sizeHead;

-        zi->ci.encrypt = 1;

-        zi->ci.pcrc_32_tab = get_crc_table();

-        /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/

-

-        sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);

-        zi->ci.crypt_header_size = sizeHead;

-

-        if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)

-                err = ZIP_ERRNO;

-    }

-    #endif

-

-    if (err==Z_OK)

-        zi->in_opened_file_inzip = 1;

-    return err;

-}

-

-extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,

-                                        extrafield_local, size_extrafield_local,

-                                        extrafield_global, size_extrafield_global,

-                                        comment, method, level, raw)

-    zipFile file;

-    const char* filename;

-    const zip_fileinfo* zipfi;

-    const void* extrafield_local;

-    uInt size_extrafield_local;

-    const void* extrafield_global;

-    uInt size_extrafield_global;

-    const char* comment;

-    int method;

-    int level;

-    int raw;

-{

-    return zipOpenNewFileInZip3 (file, filename, zipfi,

-                                 extrafield_local, size_extrafield_local,

-                                 extrafield_global, size_extrafield_global,

-                                 comment, method, level, raw,

-                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,

-                                 NULL, 0);

-}

-

-extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,

-                                        extrafield_local, size_extrafield_local,

-                                        extrafield_global, size_extrafield_global,

-                                        comment, method, level)

-    zipFile file;

-    const char* filename;

-    const zip_fileinfo* zipfi;

-    const void* extrafield_local;

-    uInt size_extrafield_local;

-    const void* extrafield_global;

-    uInt size_extrafield_global;

-    const char* comment;

-    int method;

-    int level;

-{

-    return zipOpenNewFileInZip2 (file, filename, zipfi,

-                                 extrafield_local, size_extrafield_local,

-                                 extrafield_global, size_extrafield_global,

-                                 comment, method, level, 0);

-}

-

-local int zipFlushWriteBuffer(zi)

-  zip_internal* zi;

-{

-    int err=ZIP_OK;

-

-    if (zi->ci.encrypt != 0)

-    {

-#ifndef NOCRYPT

-        uInt i;

-        int t;

-        for (i=0;i<zi->ci.pos_in_buffered_data;i++)

-            zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,

-                                       zi->ci.buffered_data[i],t);

-#endif

-    }

-    if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)

-                                                                    !=zi->ci.pos_in_buffered_data)

-      err = ZIP_ERRNO;

-    zi->ci.pos_in_buffered_data = 0;

-    return err;

-}

-

-extern int ZEXPORT zipWriteInFileInZip (file, buf, len)

-    zipFile file;

-    const void* buf;

-    unsigned len;

-{

-    zip_internal* zi;

-    int err=ZIP_OK;

-

-    if (file == NULL)

-        return ZIP_PARAMERROR;

-    zi = (zip_internal*)file;

-

-    if (zi->in_opened_file_inzip == 0)

-        return ZIP_PARAMERROR;

-

-    zi->ci.stream.next_in = (void*)buf;

-    zi->ci.stream.avail_in = len;

-    zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);

-

-    while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))

-    {

-        if (zi->ci.stream.avail_out == 0)

-        {

-            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)

-                err = ZIP_ERRNO;

-            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;

-            zi->ci.stream.next_out = zi->ci.buffered_data;

-        }

-

-

-        if(err != ZIP_OK)

-            break;

-

-        if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))

-        {

-            uLong uTotalOutBefore = zi->ci.stream.total_out;

-            err=deflate(&zi->ci.stream,  Z_NO_FLUSH);

-            zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;

-

-        }

-        else

-        {

-            uInt copy_this,i;

-            if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)

-                copy_this = zi->ci.stream.avail_in;

-            else

-                copy_this = zi->ci.stream.avail_out;

-            for (i=0;i<copy_this;i++)

-                *(((char*)zi->ci.stream.next_out)+i) =

-                    *(((const char*)zi->ci.stream.next_in)+i);

-            {

-                zi->ci.stream.avail_in -= copy_this;

-                zi->ci.stream.avail_out-= copy_this;

-                zi->ci.stream.next_in+= copy_this;

-                zi->ci.stream.next_out+= copy_this;

-                zi->ci.stream.total_in+= copy_this;

-                zi->ci.stream.total_out+= copy_this;

-                zi->ci.pos_in_buffered_data += copy_this;

-            }

-        }

-    }

-

-    return err;

-}

-

-extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)

-    zipFile file;

-    uLong uncompressed_size;

-    uLong crc32;

-{

-    zip_internal* zi;

-    uLong compressed_size;

-    int err=ZIP_OK;

-

-    if (file == NULL)

-        return ZIP_PARAMERROR;

-    zi = (zip_internal*)file;

-

-    if (zi->in_opened_file_inzip == 0)

-        return ZIP_PARAMERROR;

-    zi->ci.stream.avail_in = 0;

-

-    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))

-        while (err==ZIP_OK)

-    {

-        uLong uTotalOutBefore;

-        if (zi->ci.stream.avail_out == 0)

-        {

-            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)

-                err = ZIP_ERRNO;

-            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;

-            zi->ci.stream.next_out = zi->ci.buffered_data;

-        }

-        uTotalOutBefore = zi->ci.stream.total_out;

-        err=deflate(&zi->ci.stream,  Z_FINISH);

-        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;

-    }

-

-    if (err==Z_STREAM_END)

-        err=ZIP_OK; /* this is normal */

-

-    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))

-        if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)

-            err = ZIP_ERRNO;

-

-    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))

-    {

-        err=deflateEnd(&zi->ci.stream);

-        zi->ci.stream_initialised = 0;

-    }

-

-    if (!zi->ci.raw)

-    {

-        crc32 = (uLong)zi->ci.crc32;

-        uncompressed_size = (uLong)zi->ci.stream.total_in;

-    }

-    compressed_size = (uLong)zi->ci.stream.total_out;

-    #ifndef NOCRYPT

-    compressed_size += zi->ci.crypt_header_size;

-    #endif

-

-    ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/

-    ziplocal_putValue_inmemory(zi->ci.central_header+20,

-                                compressed_size,4); /*compr size*/

-    if (zi->ci.stream.data_type == Z_ASCII)

-        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);

-    ziplocal_putValue_inmemory(zi->ci.central_header+24,

-                                uncompressed_size,4); /*uncompr size*/

-

-    if (err==ZIP_OK)

-        err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,

-                                       (uLong)zi->ci.size_centralheader);

-    free(zi->ci.central_header);

-

-    if (err==ZIP_OK)

-    {

-        long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);

-        if (ZSEEK(zi->z_filefunc,zi->filestream,

-                  zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            err = ZIP_ERRNO;

-

-        if (err==ZIP_OK)

-            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */

-

-        if (err==ZIP_OK) /* compressed size, unknown */

-            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);

-

-        if (err==ZIP_OK) /* uncompressed size, unknown */

-            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);

-

-        if (ZSEEK(zi->z_filefunc,zi->filestream,

-                  cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)

-            err = ZIP_ERRNO;

-    }

-

-    zi->number_entry ++;

-    zi->in_opened_file_inzip = 0;

-

-    return err;

-}

-

-extern int ZEXPORT zipCloseFileInZip (file)

-    zipFile file;

-{

-    return zipCloseFileInZipRaw (file,0,0);

-}

-

-extern int ZEXPORT zipClose (file, global_comment)

-    zipFile file;

-    const char* global_comment;

-{

-    zip_internal* zi;

-    int err = 0;

-    uLong size_centraldir = 0;

-    uLong centraldir_pos_inzip ;

-    uInt size_global_comment;

-    if (file == NULL)

-        return ZIP_PARAMERROR;

-    zi = (zip_internal*)file;

-

-    if (zi->in_opened_file_inzip == 1)

-    {

-        err = zipCloseFileInZip (file);

-    }

-

-    if (global_comment==NULL)

-        size_global_comment = 0;

-    else

-        size_global_comment = strlen(global_comment);

-

-

-    centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);

-    if (err==ZIP_OK)

-    {

-        linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;

-        while (ldi!=NULL)

-        {

-            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))

-                if (ZWRITE(zi->z_filefunc,zi->filestream,

-                           ldi->data,ldi->filled_in_this_block)

-                              !=ldi->filled_in_this_block )

-                    err = ZIP_ERRNO;

-

-            size_centraldir += ldi->filled_in_this_block;

-            ldi = ldi->next_datablock;

-        }

-    }

-    free_datablock(zi->central_dir.first_block);

-

-    if (err==ZIP_OK) /* Magic End */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);

-

-    if (err==ZIP_OK) /* number of this disk */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);

-

-    if (err==ZIP_OK) /* number of the disk with the start of the central directory */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);

-

-    if (err==ZIP_OK) /* total number of entries in the central dir on this disk */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);

-

-    if (err==ZIP_OK) /* total number of entries in the central dir */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);

-

-    if (err==ZIP_OK) /* size of the central directory */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);

-

-    if (err==ZIP_OK) /* offset of start of central directory with respect to the

-                            starting disk number */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,

-                                (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);

-

-    if (err==ZIP_OK) /* zipfile comment length */

-        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);

-

-    if ((err==ZIP_OK) && (size_global_comment>0))

-        if (ZWRITE(zi->z_filefunc,zi->filestream,

-                   global_comment,size_global_comment) != size_global_comment)

-                err = ZIP_ERRNO;

-

-    if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)

-        if (err == ZIP_OK)

-            err = ZIP_ERRNO;

-

-    TRYFREE(zi);

-

-    return err;

-}

+/* zip.c -- IO on .zip files using zlib
+   Version 0.22, May 19th, 2003
+
+   Read zip.h for more info
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "zlib.h"
+#include "zip.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY   (0x0) /* platform depedent */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+#ifndef SEEK_CUR
+#define SEEK_CUR    1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END    2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET    0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =
+   " zip 0.22 Copyright 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC    (0x04034b50)
+#define CENTRALHEADERMAGIC  (0x02014b50)
+#define ENDHEADERMAGIC      (0x06054b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET  (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+  struct linkedlist_datablock_internal_s* next_datablock;
+  uLong  avail_in_this_block;
+  uLong  filled_in_this_block;
+  uLong  unused; /* for future use and alignement */
+  unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+    linkedlist_datablock_internal* first_block;
+    linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+    z_stream stream;            /* zLib stream structure for inflate */
+    int  stream_initialised;    /* 1 is stream is initialised */
+    uInt pos_in_buffered_data;  /* last written byte in buffered_data */
+
+    uLong pos_local_header;     /* offset of the local header of the file
+                                     currenty writing */
+    char* central_header;       /* central header data for the current file */
+    uLong size_centralheader;   /* size of the central header for cur file */
+    uLong flag;                 /* flag of the file currently writing */
+
+    int  method;                /* compression method of file currenty wr.*/
+    int  raw;                   /* 1 for directly writing raw data */
+    Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+    uLong dosDate;
+    uLong crc32;
+    int  encrypt;
+#ifndef NOCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+    int crypt_header_size;
+#endif
+} curfile_info;
+
+typedef struct
+{
+    zlib_filefunc_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    linkedlist_data central_dir;/* datablock with central dir in construction*/
+    int  in_opened_file_inzip;  /* 1 if a file in the zip is currently writ.*/
+    curfile_info ci;            /* info on the file curretly writing */
+
+    uLong begin_pos;            /* position of the beginning of the zipfile */
+    uLong add_position_when_writting_offset;
+    uLong number_entry;
+} zip_internal;
+
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+    linkedlist_datablock_internal* ldi;
+    ldi = (linkedlist_datablock_internal*)
+                 ALLOC(sizeof(linkedlist_datablock_internal));
+    if (ldi!=NULL)
+    {
+        ldi->next_datablock = NULL ;
+        ldi->filled_in_this_block = 0 ;
+        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+    }
+    return ldi;
+}
+
+local void free_datablock(ldi)
+    linkedlist_datablock_internal* ldi;
+{
+    while (ldi!=NULL)
+    {
+        linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+        TRYFREE(ldi);
+        ldi = ldinext;
+    }
+}
+
+local void init_linkedlist(ll)
+    linkedlist_data* ll;
+{
+    ll->first_block = ll->last_block = NULL;
+}
+
+local void free_linkedlist(ll)
+    linkedlist_data* ll;
+{
+    free_datablock(ll->first_block);
+    ll->first_block = ll->last_block = NULL;
+}
+
+
+local int add_data_in_datablock(ll,buf,len)
+    linkedlist_data* ll;
+    const void* buf;
+    uLong len;
+{
+    linkedlist_datablock_internal* ldi;
+    const unsigned char* from_copy;
+
+    if (ll==NULL)
+        return ZIP_INTERNALERROR;
+
+    if (ll->last_block == NULL)
+    {
+        ll->first_block = ll->last_block = allocate_new_datablock();
+        if (ll->first_block == NULL)
+            return ZIP_INTERNALERROR;
+    }
+
+    ldi = ll->last_block;
+    from_copy = (unsigned char*)buf;
+
+    while (len>0)
+    {
+        uInt copy_this;
+        uInt i;
+        unsigned char* to_copy;
+
+        if (ldi->avail_in_this_block==0)
+        {
+            ldi->next_datablock = allocate_new_datablock();
+            if (ldi->next_datablock == NULL)
+                return ZIP_INTERNALERROR;
+            ldi = ldi->next_datablock ;
+            ll->last_block = ldi;
+        }
+
+        if (ldi->avail_in_this_block < len)
+            copy_this = (uInt)ldi->avail_in_this_block;
+        else
+            copy_this = (uInt)len;
+
+        to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+        for (i=0;i<copy_this;i++)
+            *(to_copy+i)=*(from_copy+i);
+
+        ldi->filled_in_this_block += copy_this;
+        ldi->avail_in_this_block -= copy_this;
+        from_copy += copy_this ;
+        len -= copy_this;
+    }
+    return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+   Inputs a long in LSB order to the given file
+   nbByte == 1, 2 or 4 (byte, short or long)
+*/
+
+local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def,
+                                voidpf filestream, uLong x, int nbByte));
+local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong x;
+    int nbByte;
+{
+    unsigned char buf[4];
+    int n;
+    for (n = 0; n < nbByte; n++) {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+    if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+        return ZIP_ERRNO;
+    else
+        return ZIP_OK;
+}
+
+local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte));
+local void ziplocal_putValue_inmemory (dest, x, nbByte)
+    void* dest;
+    uLong x;
+    int nbByte;
+{
+    unsigned char* buf=(unsigned char*)dest;
+    int n;
+    for (n = 0; n < nbByte; n++) {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+}
+/****************************************************************************/
+
+
+local uLong ziplocal_TmzDateToDosDate(ptm,dosDate)
+    const tm_zip* ptm;
+    uLong dosDate;
+{
+    uLong year = (uLong)ptm->tm_year;
+    if (year>1980)
+        year-=1980;
+    else if (year>80)
+        year-=80;
+    return
+      (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+        ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int ziplocal_getByte OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    int *pi));
+
+local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    int *pi;
+{
+    unsigned char c;
+    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return ZIP_OK;
+    }
+    else
+    {
+        if (ZERROR(*pzlib_filefunc_def,filestream))
+            return ZIP_ERRNO;
+        else
+            return ZIP_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int ziplocal_getShort OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int ziplocal_getLong OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+    uLong *pX;
+{
+    uLong x ;
+    int i;
+    int err;
+
+    err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<16;
+
+    if (err==ZIP_OK)
+        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local uLong ziplocal_SearchCentralDir OF((
+    const zlib_filefunc_def* pzlib_filefunc_def,
+    voidpf filestream));
+
+local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)
+    const zlib_filefunc_def* pzlib_filefunc_def;
+    voidpf filestream;
+{
+    unsigned char* buf;
+    uLong uSizeFile;
+    uLong uBackRead;
+    uLong uMaxBack=0xffff; /* maximum size of global comment */
+    uLong uPosFound=0;
+
+    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize,uReadPos ;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    return uPosFound;
+}
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+/************************************************************/
+extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def)
+    const char *pathname;
+    int append;
+    zipcharpc* globalcomment;
+    zlib_filefunc_def* pzlib_filefunc_def;
+{
+    zip_internal ziinit;
+    zip_internal* zi;
+    int err=ZIP_OK;
+
+
+    if (pzlib_filefunc_def==NULL)
+        fill_fopen_filefunc(&ziinit.z_filefunc);
+    else
+        ziinit.z_filefunc = *pzlib_filefunc_def;
+
+    ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))
+                 (ziinit.z_filefunc.opaque,
+                  pathname,
+                  (append == APPEND_STATUS_CREATE) ?
+                  (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+                    (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+    if (ziinit.filestream == NULL)
+        return NULL;
+    ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);
+    ziinit.in_opened_file_inzip = 0;
+    ziinit.ci.stream_initialised = 0;
+    ziinit.number_entry = 0;
+    ziinit.add_position_when_writting_offset = 0;
+    init_linkedlist(&(ziinit.central_dir));
+
+
+    zi = (zip_internal*)ALLOC(sizeof(zip_internal));
+    if (zi==NULL)
+    {
+        ZCLOSE(ziinit.z_filefunc,ziinit.filestream);
+        return NULL;
+    }
+
+    /* now we add file in a zipfile */
+#    ifndef NO_ADDFILEINEXISTINGZIP
+    if (append == APPEND_STATUS_ADDINZIP)
+    {
+        uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+        uLong size_central_dir;     /* size of the central directory  */
+        uLong offset_central_dir;   /* offset of start of central directory */
+        uLong central_pos,uL;
+
+        uLong number_disk;          /* number of the current dist, used for
+                                    spaning ZIP, unsupported, always 0*/
+        uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                                    for spaning ZIP, unsupported, always 0*/
+        uLong number_entry;
+        uLong number_entry_CD;      /* total number of entries in
+                                    the central dir
+                                    (same than number_entry on nospan) */
+        uLong size_comment;
+
+        central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);
+        if (central_pos==0)
+            err=ZIP_ERRNO;
+
+        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err=ZIP_ERRNO;
+
+        /* the signature, already checked */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* number of this disk */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* number of the disk with the start of the central directory */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* total number of entries in the central dir on this disk */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* total number of entries in the central dir */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        if ((number_entry_CD!=number_entry) ||
+            (number_disk_with_CD!=0) ||
+            (number_disk!=0))
+            err=ZIP_BADZIPFILE;
+
+        /* size of the central directory */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* offset of start of central directory with respect to the
+            starting disk number */
+        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        /* zipfile comment length */
+        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)
+            err=ZIP_ERRNO;
+
+        if ((central_pos<offset_central_dir+size_central_dir) &&
+            (err==ZIP_OK))
+            err=ZIP_BADZIPFILE;
+
+        if (err!=ZIP_OK)
+        {
+            ZCLOSE(ziinit.z_filefunc, ziinit.filestream);
+            return NULL;
+        }
+
+        byte_before_the_zipfile = central_pos -
+                                (offset_central_dir+size_central_dir);
+        ziinit.add_position_when_writting_offset = byte_before_the_zipfile ;
+
+        {
+            uLong size_central_dir_to_read = size_central_dir;
+            size_t buf_size = SIZEDATA_INDATABLOCK;
+            void* buf_read = (void*)ALLOC(buf_size);
+            if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                  offset_central_dir + byte_before_the_zipfile,
+                  ZLIB_FILEFUNC_SEEK_SET) != 0)
+                  err=ZIP_ERRNO;
+
+            while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+            {
+                uLong read_this = SIZEDATA_INDATABLOCK;
+                if (read_this > size_central_dir_to_read)
+                    read_this = size_central_dir_to_read;
+                if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)
+                    err=ZIP_ERRNO;
+
+                if (err==ZIP_OK)
+                    err = add_data_in_datablock(&ziinit.central_dir,buf_read,
+                                                (uLong)read_this);
+                size_central_dir_to_read-=read_this;
+            }
+            TRYFREE(buf_read);
+        }
+        ziinit.begin_pos = byte_before_the_zipfile;
+        ziinit.number_entry = number_entry_CD;
+
+        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,
+                  offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err=ZIP_ERRNO;
+    }
+#    endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+    if (err != ZIP_OK)
+    {
+        TRYFREE(zi);
+        return NULL;
+    }
+    else
+    {
+        *zi = ziinit;
+        return (zipFile)zi;
+    }
+}
+
+extern zipFile ZEXPORT zipOpen (pathname, append)
+    const char *pathname;
+    int append;
+{
+    return zipOpen2(pathname,append,NULL,NULL);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,
+                                         extrafield_local, size_extrafield_local,
+                                         extrafield_global, size_extrafield_global,
+                                         comment, method, level, raw,
+                                         windowBits, memLevel, strategy,
+                                         password, crcForCrypting)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+    int raw;
+    int windowBits;
+    int memLevel;
+    int strategy;
+    const char* password;
+    uLong crcForCrypting;
+{
+    zip_internal* zi;
+    uInt size_filename;
+    uInt size_comment;
+    uInt i;
+    int err = ZIP_OK;
+
+#    ifdef NOCRYPT
+    if (password != NULL)
+        return ZIP_PARAMERROR;
+#    endif
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    if ((method!=0) && (method!=Z_DEFLATED))
+        return ZIP_PARAMERROR;
+
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+        if (err != ZIP_OK)
+            return err;
+    }
+
+
+    if (filename==NULL)
+        filename="-";
+
+    if (comment==NULL)
+        size_comment = 0;
+    else
+        size_comment = strlen(comment);
+
+    size_filename = strlen(filename);
+
+    if (zipfi == NULL)
+        zi->ci.dosDate = 0;
+    else
+    {
+        if (zipfi->dosDate != 0)
+            zi->ci.dosDate = zipfi->dosDate;
+        else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);
+    }
+
+    zi->ci.flag = 0;
+    if ((level==8) || (level==9))
+      zi->ci.flag |= 2;
+    if ((level==2))
+      zi->ci.flag |= 4;
+    if ((level==1))
+      zi->ci.flag |= 6;
+    if (password != NULL)
+      zi->ci.flag |= 1;
+
+    zi->ci.crc32 = 0;
+    zi->ci.method = method;
+    zi->ci.encrypt = 0;
+    zi->ci.stream_initialised = 0;
+    zi->ci.pos_in_buffered_data = 0;
+    zi->ci.raw = raw;
+    zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;
+    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +
+                                      size_extrafield_global + size_comment;
+    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);
+
+    ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+    /* version info */
+    ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+    if (zipfi==NULL)
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+    else
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+    if (zipfi==NULL)
+        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+    else
+        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+    ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);
+
+    for (i=0;i<size_filename;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+    for (i=0;i<size_extrafield_global;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+              *(((const char*)extrafield_global)+i);
+
+    for (i=0;i<size_comment;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+              size_extrafield_global+i) = *(comment+i);
+    if (zi->ci.central_header == NULL)
+        return ZIP_INTERNALERROR;
+
+    /* write the local header */
+    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+    if (err==ZIP_OK)
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);
+
+    if ((err==ZIP_OK) && (size_filename>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+                err = ZIP_ERRNO;
+
+    if ((err==ZIP_OK) && (size_extrafield_local>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)
+                                                                           !=size_extrafield_local)
+                err = ZIP_ERRNO;
+
+    zi->ci.stream.avail_in = (uInt)0;
+    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+    zi->ci.stream.next_out = zi->ci.buffered_data;
+    zi->ci.stream.total_in = 0;
+    zi->ci.stream.total_out = 0;
+
+    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+    {
+        zi->ci.stream.zalloc = (alloc_func)0;
+        zi->ci.stream.zfree = (free_func)0;
+        zi->ci.stream.opaque = (voidpf)0;
+
+        if (windowBits>0)
+            windowBits = -windowBits;
+
+        err = deflateInit2(&zi->ci.stream, level,
+               Z_DEFLATED, windowBits, memLevel, strategy);
+
+        if (err==Z_OK)
+            zi->ci.stream_initialised = 1;
+    }
+#    ifndef NOCRYPT
+    zi->ci.crypt_header_size = 0;
+    if ((err==Z_OK) && (password != NULL))
+    {
+        unsigned char bufHead[RAND_HEAD_LEN];
+        unsigned int sizeHead;
+        zi->ci.encrypt = 1;
+        zi->ci.pcrc_32_tab = get_crc_table();
+        /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+        sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+        zi->ci.crypt_header_size = sizeHead;
+
+        if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+                err = ZIP_ERRNO;
+    }
+#    endif
+
+    if (err==Z_OK)
+        zi->in_opened_file_inzip = 1;
+    return err;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,
+                                        extrafield_local, size_extrafield_local,
+                                        extrafield_global, size_extrafield_global,
+                                        comment, method, level, raw)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+    int raw;
+{
+    return zipOpenNewFileInZip3 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,
+                                        extrafield_local, size_extrafield_local,
+                                        extrafield_global, size_extrafield_global,
+                                        comment, method, level)
+    zipFile file;
+    const char* filename;
+    const zip_fileinfo* zipfi;
+    const void* extrafield_local;
+    uInt size_extrafield_local;
+    const void* extrafield_global;
+    uInt size_extrafield_global;
+    const char* comment;
+    int method;
+    int level;
+{
+    return zipOpenNewFileInZip2 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, 0);
+}
+
+local int zipFlushWriteBuffer(zi)
+  zip_internal* zi;
+{
+    int err=ZIP_OK;
+
+    if (zi->ci.encrypt != 0)
+    {
+#ifndef NOCRYPT
+        uInt i;
+        int t;
+        for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+            zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,
+                                       zi->ci.buffered_data[i],t);
+#endif
+    }
+    if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)
+                                                                    !=zi->ci.pos_in_buffered_data)
+      err = ZIP_ERRNO;
+    zi->ci.pos_in_buffered_data = 0;
+    return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (file, buf, len)
+    zipFile file;
+    const void* buf;
+    unsigned len;
+{
+    zip_internal* zi;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+
+    zi->ci.stream.next_in = (void*)buf;
+    zi->ci.stream.avail_in = len;
+    zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);
+
+    while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+    {
+        if (zi->ci.stream.avail_out == 0)
+        {
+            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+                err = ZIP_ERRNO;
+            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+            zi->ci.stream.next_out = zi->ci.buffered_data;
+        }
+
+
+        if(err != ZIP_OK)
+            break;
+
+        if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+        {
+            uLong uTotalOutBefore = zi->ci.stream.total_out;
+            err=deflate(&zi->ci.stream,  Z_NO_FLUSH);
+            zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+
+        }
+        else
+        {
+            uInt copy_this,i;
+            if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+                copy_this = zi->ci.stream.avail_in;
+            else
+                copy_this = zi->ci.stream.avail_out;
+            for (i=0;i<copy_this;i++)
+                *(((char*)zi->ci.stream.next_out)+i) =
+                    *(((const char*)zi->ci.stream.next_in)+i);
+            {
+                zi->ci.stream.avail_in -= copy_this;
+                zi->ci.stream.avail_out-= copy_this;
+                zi->ci.stream.next_in+= copy_this;
+                zi->ci.stream.next_out+= copy_this;
+                zi->ci.stream.total_in+= copy_this;
+                zi->ci.stream.total_out+= copy_this;
+                zi->ci.pos_in_buffered_data += copy_this;
+            }
+        }
+    }
+
+    return err;
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)
+    zipFile file;
+    uLong uncompressed_size;
+    uLong crc32;
+{
+    zip_internal* zi;
+    uLong compressed_size;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+    zi->ci.stream.avail_in = 0;
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+        while (err==ZIP_OK)
+    {
+        uLong uTotalOutBefore;
+        if (zi->ci.stream.avail_out == 0)
+        {
+            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)
+                err = ZIP_ERRNO;
+            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+            zi->ci.stream.next_out = zi->ci.buffered_data;
+        }
+        uTotalOutBefore = zi->ci.stream.total_out;
+        err=deflate(&zi->ci.stream,  Z_FINISH);
+        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+    }
+
+    if (err==Z_STREAM_END)
+        err=ZIP_OK; /* this is normal */
+
+    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+        if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)
+            err = ZIP_ERRNO;
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+    {
+        err=deflateEnd(&zi->ci.stream);
+        zi->ci.stream_initialised = 0;
+    }
+
+    if (!zi->ci.raw)
+    {
+        crc32 = (uLong)zi->ci.crc32;
+        uncompressed_size = (uLong)zi->ci.stream.total_in;
+    }
+    compressed_size = (uLong)zi->ci.stream.total_out;
+#    ifndef NOCRYPT
+    compressed_size += zi->ci.crypt_header_size;
+#    endif
+
+    ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+    ziplocal_putValue_inmemory(zi->ci.central_header+20,
+                                compressed_size,4); /*compr size*/
+    if (zi->ci.stream.data_type == Z_ASCII)
+        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+    ziplocal_putValue_inmemory(zi->ci.central_header+24,
+                                uncompressed_size,4); /*uncompr size*/
+
+    if (err==ZIP_OK)
+        err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,
+                                       (uLong)zi->ci.size_centralheader);
+    free(zi->ci.central_header);
+
+    if (err==ZIP_OK)
+    {
+        long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+        if (ZSEEK(zi->z_filefunc,zi->filestream,
+                  zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+
+        if (err==ZIP_OK)
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+        if (err==ZIP_OK) /* compressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+        if (err==ZIP_OK) /* uncompressed size, unknown */
+            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+
+        if (ZSEEK(zi->z_filefunc,zi->filestream,
+                  cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+    }
+
+    zi->number_entry ++;
+    zi->in_opened_file_inzip = 0;
+
+    return err;
+}
+
+extern int ZEXPORT zipCloseFileInZip (file)
+    zipFile file;
+{
+    return zipCloseFileInZipRaw (file,0,0);
+}
+
+extern int ZEXPORT zipClose (file, global_comment)
+    zipFile file;
+    const char* global_comment;
+{
+    zip_internal* zi;
+    int err = 0;
+    uLong size_centraldir = 0;
+    uLong centraldir_pos_inzip ;
+    uInt size_global_comment;
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+    }
+
+    if (global_comment==NULL)
+        size_global_comment = 0;
+    else
+        size_global_comment = strlen(global_comment);
+
+
+    centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);
+    if (err==ZIP_OK)
+    {
+        linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;
+        while (ldi!=NULL)
+        {
+            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+                if (ZWRITE(zi->z_filefunc,zi->filestream,
+                           ldi->data,ldi->filled_in_this_block)
+                              !=ldi->filled_in_this_block )
+                    err = ZIP_ERRNO;
+
+            size_centraldir += ldi->filled_in_this_block;
+            ldi = ldi->next_datablock;
+        }
+    }
+    free_datablock(zi->central_dir.first_block);
+
+    if (err==ZIP_OK) /* Magic End */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+    if (err==ZIP_OK) /* number of this disk */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+    if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+    if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+    if (err==ZIP_OK) /* total number of entries in the central dir */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+
+    if (err==ZIP_OK) /* size of the central directory */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+    if (err==ZIP_OK) /* offset of start of central directory with respect to the
+                            starting disk number */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,
+                                (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
+
+    if (err==ZIP_OK) /* zipfile comment length */
+        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+    if ((err==ZIP_OK) && (size_global_comment>0))
+        if (ZWRITE(zi->z_filefunc,zi->filestream,
+                   global_comment,size_global_comment) != size_global_comment)
+                err = ZIP_ERRNO;
+
+    if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)
+        if (err == ZIP_OK)
+            err = ZIP_ERRNO;
+
+    TRYFREE(zi);
+
+    return err;
+}
diff --git a/contrib/minizip/zip.h b/contrib/minizip/zip.h
index d863e1a..5a75fc6 100644
--- a/contrib/minizip/zip.h
+++ b/contrib/minizip/zip.h
@@ -1,235 +1,235 @@
-/* zip.h -- IO for compress .zip files using zlib

-   Version 0.22, May 19th, 2003

-

-   Copyright (C) 1998-2003 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.

-   Old compressions used by old PKZip 1.x are not supported

-

-  For uncompress .zip file, look at unzip.h

-

-

-   I WAIT FEEDBACK at mail info@winimage.com

-   Visit also http://www.winimage.com/zLibDll/unzip.html for evolution

-

-   Condition of use and distribution are the same than zlib :

-

-  This software is provided 'as-is', without any express or implied

-  warranty.  In no event will the authors be held liable for any damages

-  arising from the use of this software.

-

-  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.

-

-

-*/

-

-/* for more info about .ZIP format, see

-      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip

-      http://www.info-zip.org/pub/infozip/doc/

-   PkWare has also a specification at :

-      ftp://ftp.pkware.com/probdesc.zip

-*/

-

-#ifndef _zip_H

-#define _zip_H

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-#ifndef _ZLIB_H

-#include "zlib.h"

-#endif

-

-#ifndef _ZLIBIOAPI_H

-#include "ioapi.h"

-#endif

-

-#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)

-/* like the STRICT of WIN32, we define a pointer that cannot be converted

-    from (void*) without cast */

-typedef struct TagzipFile__ { int unused; } zipFile__;

-typedef zipFile__ *zipFile;

-#else

-typedef voidp zipFile;

-#endif

-

-#define ZIP_OK                          (0)

-#define ZIP_EOF                         (0)

-#define ZIP_ERRNO                       (Z_ERRNO)

-#define ZIP_PARAMERROR                  (-102)

-#define ZIP_BADZIPFILE                  (-103)

-#define ZIP_INTERNALERROR               (-104)

-

-#ifndef DEF_MEM_LEVEL

-#  if MAX_MEM_LEVEL >= 8

-#    define DEF_MEM_LEVEL 8

-#  else

-#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL

-#  endif

-#endif

-/* default memLevel */

-

-/* tm_zip contain date/time info */

-typedef struct tm_zip_s

-{

-    uInt tm_sec;            /* seconds after the minute - [0,59] */

-    uInt tm_min;            /* minutes after the hour - [0,59] */

-    uInt tm_hour;           /* hours since midnight - [0,23] */

-    uInt tm_mday;           /* day of the month - [1,31] */

-    uInt tm_mon;            /* months since January - [0,11] */

-    uInt tm_year;           /* years - [1980..2044] */

-} tm_zip;

-

-typedef struct

-{

-    tm_zip      tmz_date;       /* date in understandable format           */

-    uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */

-/*    uLong       flag;        */   /* general purpose bit flag        2 bytes */

-

-    uLong       internal_fa;    /* internal file attributes        2 bytes */

-    uLong       external_fa;    /* external file attributes        4 bytes */

-} zip_fileinfo;

-

-typedef const char* zipcharpc;

-

-

-#define APPEND_STATUS_CREATE        (0)

-#define APPEND_STATUS_CREATEAFTER   (1)

-#define APPEND_STATUS_ADDINZIP      (2)

-

-extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));

-/*

-  Create a zipfile.

-     pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on

-       an Unix computer "zlib/zlib113.zip".

-     if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip

-       will be created at the end of the file.

-         (useful if the file contain a self extractor code)

-     if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will

-       add files in existing zip (be sure you don't add file that doesn't exist)

-     If the zipfile cannot be opened, the return value is NULL.

-     Else, the return value is a zipFile Handle, usable with other function

-       of this zip package.

-*/

-

-/* Note : there is no delete function into a zipfile.

-   If you want delete file into a zipfile, you must open a zipfile, and create another

-   Of couse, you can use RAW reading and writing to copy the file you did not want delte

-*/

-

-extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,

-                                   int append,

-                                   zipcharpc* globalcomment,

-                                   zlib_filefunc_def* pzlib_filefunc_def));

-

-extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,

-                       const char* filename,

-                       const zip_fileinfo* zipfi,

-                       const void* extrafield_local,

-                       uInt size_extrafield_local,

-                       const void* extrafield_global,

-                       uInt size_extrafield_global,

-                       const char* comment,

-                       int method,

-                       int level));

-/*

-  Open a file in the ZIP for writing.

-  filename : the filename in zip (if NULL, '-' without quote will be used

-  *zipfi contain supplemental information

-  if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local

-    contains the extrafield data the the local header

-  if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global

-    contains the extrafield data the the local header

-  if comment != NULL, comment contain the comment string

-  method contain the compression method (0 for store, Z_DEFLATED for deflate)

-  level contain the level of compression (can be Z_DEFAULT_COMPRESSION)

-*/

-

-

-extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,

-                                            const char* filename,

-                                            const zip_fileinfo* zipfi,

-                                            const void* extrafield_local,

-                                            uInt size_extrafield_local,

-                                            const void* extrafield_global,

-                                            uInt size_extrafield_global,

-                                            const char* comment,

-                                            int method,

-                                            int level,

-                                            int raw));

-

-/*

-  Same than zipOpenNewFileInZip, except if raw=1, we write raw file

- */

-

-extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,

-                                            const char* filename,

-                                            const zip_fileinfo* zipfi,

-                                            const void* extrafield_local,

-                                            uInt size_extrafield_local,

-                                            const void* extrafield_global,

-                                            uInt size_extrafield_global,

-                                            const char* comment,

-                                            int method,

-                                            int level,

-                                            int raw,

-                                            int windowBits,

-                                            int memLevel,

-                                            int strategy,

-                                            const char* password,

-                                            uLong crcForCtypting));

-

-/*

-  Same than zipOpenNewFileInZip2, except

-    windowBits,memLevel,,strategy : see parameter strategy in deflateInit2

-    password : crypting password (NULL for no crypting)

-    crcForCtypting : crc of file to compress (needed for crypting)

- */

-

-

-extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,

-                       const void* buf,

-                       unsigned len));

-/*

-  Write data in the zipfile

-*/

-

-extern int ZEXPORT zipCloseFileInZip OF((zipFile file));

-/*

-  Close the current file in the zipfile

-*/

-

-

-extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,

-                                            uLong uncompressed_size,

-                                            uLong crc32));

-/*

-  Close the current file in the zipfile, for fiel opened with

-    parameter raw=1 in zipOpenNewFileInZip2

-  uncompressed_size and crc32 are value for the uncompressed size

-*/

-

-extern int ZEXPORT zipClose OF((zipFile file,

-                const char* global_comment));

-/*

-  Close the zipfile

-*/

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif /* _zip_H */

+/* zip.h -- IO for compress .zip files using zlib
+   Version 0.22, May 19th, 2003
+
+   Copyright (C) 1998-2003 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.
+   Old compressions used by old PKZip 1.x are not supported
+
+  For uncompress .zip file, look at unzip.h
+
+
+   I WAIT FEEDBACK at mail info@winimage.com
+   Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
+
+   Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  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.
+
+
+*/
+
+/* for more info about .ZIP format, see
+      http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
+      http://www.info-zip.org/pub/infozip/doc/
+   PkWare has also a specification at :
+      ftp://ftp.pkware.com/probdesc.zip
+*/
+
+#ifndef _zip_H
+#define _zip_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK                          (0)
+#define ZIP_EOF                         (0)
+#define ZIP_ERRNO                       (Z_ERRNO)
+#define ZIP_PARAMERROR                  (-102)
+#define ZIP_BADZIPFILE                  (-103)
+#define ZIP_INTERNALERROR               (-104)
+
+#ifndef DEF_MEM_LEVEL
+#  if MAX_MEM_LEVEL >= 8
+#    define DEF_MEM_LEVEL 8
+#  else
+#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#  endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+    tm_zip      tmz_date;       /* date in understandable format           */
+    uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */
+/*    uLong       flag;        */   /* general purpose bit flag        2 bytes */
+
+    uLong       internal_fa;    /* internal file attributes        2 bytes */
+    uLong       external_fa;    /* external file attributes        4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE        (0)
+#define APPEND_STATUS_CREATEAFTER   (1)
+#define APPEND_STATUS_ADDINZIP      (2)
+
+extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
+/*
+  Create a zipfile.
+     pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
+       an Unix computer "zlib/zlib113.zip".
+     if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+       will be created at the end of the file.
+         (useful if the file contain a self extractor code)
+     if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+       add files in existing zip (be sure you don't add file that doesn't exist)
+     If the zipfile cannot be opened, the return value is NULL.
+     Else, the return value is a zipFile Handle, usable with other function
+       of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+   If you want delete file into a zipfile, you must open a zipfile, and create another
+   Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
+                                   int append,
+                                   zipcharpc* globalcomment,
+                                   zlib_filefunc_def* pzlib_filefunc_def));
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+                       const char* filename,
+                       const zip_fileinfo* zipfi,
+                       const void* extrafield_local,
+                       uInt size_extrafield_local,
+                       const void* extrafield_global,
+                       uInt size_extrafield_global,
+                       const char* comment,
+                       int method,
+                       int level));
+/*
+  Open a file in the ZIP for writing.
+  filename : the filename in zip (if NULL, '-' without quote will be used
+  *zipfi contain supplemental information
+  if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+    contains the extrafield data the the local header
+  if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+    contains the extrafield data the the local header
+  if comment != NULL, comment contain the comment string
+  method contain the compression method (0 for store, Z_DEFLATED for deflate)
+  level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+*/
+
+
+extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw));
+
+/*
+  Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCtypting));
+
+/*
+  Same than zipOpenNewFileInZip2, except
+    windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+    password : crypting password (NULL for no crypting)
+    crcForCtypting : crc of file to compress (needed for crypting)
+ */
+
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+                       const void* buf,
+                       unsigned len));
+/*
+  Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+  Close the current file in the zipfile
+*/
+
+
+extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
+                                            uLong uncompressed_size,
+                                            uLong crc32));
+/*
+  Close the current file in the zipfile, for fiel opened with
+    parameter raw=1 in zipOpenNewFileInZip2
+  uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+                const char* global_comment));
+/*
+  Close the zipfile
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip_H */
diff --git a/contrib/pascal/example.pas b/contrib/pascal/example.pas
new file mode 100644
index 0000000..5518b36
--- /dev/null
+++ b/contrib/pascal/example.pas
@@ -0,0 +1,599 @@
+(* example.c -- usage example of the zlib compression library
+ * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Pascal translation
+ * Copyright (C) 1998 by Jacques Nomssi Nzali.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *
+ * Adaptation to the zlibpas interface
+ * Copyright (C) 2003 by Cosmin Truta.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *)
+
+program example;
+
+{$DEFINE TEST_COMPRESS}
+{DO NOT $DEFINE TEST_GZIO}
+{$DEFINE TEST_DEFLATE}
+{$DEFINE TEST_INFLATE}
+{$DEFINE TEST_FLUSH}
+{$DEFINE TEST_SYNC}
+{$DEFINE TEST_DICT}
+
+uses SysUtils, zlibpas;
+
+const TESTFILE = 'foo.gz';
+
+(* "hello world" would be more standard, but the repeated "hello"
+ * stresses the compression code better, sorry...
+ *)
+const hello: PChar = 'hello, hello!';
+
+const dictionary: PChar = 'hello';
+
+var dictId: LongInt; (* Adler32 value of the dictionary *)
+
+procedure CHECK_ERR(err: Integer; msg: String);
+begin
+  if err <> Z_OK then
+  begin
+    WriteLn(msg, ' error: ', err);
+    Halt(1);
+  end;
+end;
+
+procedure EXIT_ERR(const msg: String);
+begin
+  WriteLn('Error: ', msg);
+  Halt(1);
+end;
+
+(* ===========================================================================
+ * Test compress and uncompress
+ *)
+{$IFDEF TEST_COMPRESS}
+procedure test_compress(compr: Pointer; comprLen: LongInt;
+                        uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+    len: LongInt;
+begin
+  len := StrLen(hello)+1;
+
+  err := compress(compr, comprLen, hello, len);
+  CHECK_ERR(err, 'compress');
+
+  StrCopy(PChar(uncompr), 'garbage');
+
+  err := uncompress(uncompr, uncomprLen, compr, comprLen);
+  CHECK_ERR(err, 'uncompress');
+
+  if StrComp(PChar(uncompr), hello) <> 0 then
+    EXIT_ERR('bad uncompress')
+  else
+    WriteLn('uncompress(): ', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test read/write of .gz files
+ *)
+{$IFDEF TEST_GZIO}
+procedure test_gzio(const fname: PChar; (* compressed file name *)
+                    uncompr: Pointer;
+                    uncomprLen: LongInt);
+var err: Integer;
+    len: Integer;
+    zfile: gzFile;
+    pos: LongInt;
+begin
+  len := StrLen(hello)+1;
+
+  zfile := gzopen(fname, 'wb');
+  if zfile = NIL then
+  begin
+    WriteLn('gzopen error');
+    Halt(1);
+  end;
+  gzputc(zfile, 'h');
+  if gzputs(zfile, 'ello') <> 4 then
+  begin
+    WriteLn('gzputs err: ', gzerror(zfile, err));
+    Halt(1);
+  end;
+  {$IFDEF GZ_FORMAT_STRING}
+  if gzprintf(zfile, ', %s!', 'hello') <> 8 then
+  begin
+    WriteLn('gzprintf err: ', gzerror(zfile, err));
+    Halt(1);
+  end;
+  {$ELSE}
+  if gzputs(zfile, ', hello!') <> 8 then
+  begin
+    WriteLn('gzputs err: ', gzerror(zfile, err));
+    Halt(1);
+  end;
+  {$ENDIF}
+  gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *)
+  gzclose(zfile);
+
+  zfile := gzopen(fname, 'rb');
+  if zfile = NIL then
+  begin
+    WriteLn('gzopen error');
+    Halt(1);
+  end;
+
+  StrCopy(PChar(uncompr), 'garbage');
+
+  if gzread(zfile, uncompr, uncomprLen) <> len then
+  begin
+    WriteLn('gzread err: ', gzerror(zfile, err));
+    Halt(1);
+  end;
+  if StrComp(PChar(uncompr), hello) <> 0 then
+  begin
+    WriteLn('bad gzread: ', PChar(uncompr));
+    Halt(1);
+  end
+  else
+    WriteLn('gzread(): ', PChar(uncompr));
+
+  pos := gzseek(zfile, -8, SEEK_CUR);
+  if (pos <> 6) or (gztell(zfile) <> pos) then
+  begin
+    WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile));
+    Halt(1);
+  end;
+
+  if gzgetc(zfile) <> ' ' then
+  begin
+    WriteLn('gzgetc error');
+    Halt(1);
+  end;
+
+  if gzungetc(' ', zfile) <> ' ' then
+  begin
+    WriteLn('gzungetc error');
+    Halt(1);
+  end;
+
+  gzgets(zfile, PChar(uncompr), uncomprLen);
+  uncomprLen := StrLen(PChar(uncompr));
+  if uncomprLen <> 7 then (* " hello!" *)
+  begin
+    WriteLn('gzgets err after gzseek: ', gzerror(zfile, err));
+    Halt(1);
+  end;
+  if StrComp(PChar(uncompr), hello + 6) <> 0 then
+  begin
+    WriteLn('bad gzgets after gzseek');
+    Halt(1);
+  end
+  else
+    WriteLn('gzgets() after gzseek: ', PChar(uncompr));
+
+  gzclose(zfile);
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with small buffers
+ *)
+{$IFDEF TEST_DEFLATE}
+procedure test_deflate(compr: Pointer; comprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+    err: Integer;
+    len: LongInt;
+begin
+  len := StrLen(hello)+1;
+
+  c_stream.zalloc := NIL;
+  c_stream.zfree := NIL;
+  c_stream.opaque := NIL;
+
+  err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
+  CHECK_ERR(err, 'deflateInit');
+
+  c_stream.next_in := hello;
+  c_stream.next_out := compr;
+
+  while (c_stream.total_in <> len) and
+        (c_stream.total_out < comprLen) do
+  begin
+    c_stream.avail_out := 1; { force small buffers }
+    c_stream.avail_in := 1;
+    err := deflate(c_stream, Z_NO_FLUSH);
+    CHECK_ERR(err, 'deflate');
+  end;
+
+  (* Finish the stream, still forcing small buffers: *)
+  while TRUE do
+  begin
+    c_stream.avail_out := 1;
+    err := deflate(c_stream, Z_FINISH);
+    if err = Z_STREAM_END then
+      break;
+    CHECK_ERR(err, 'deflate');
+  end;
+
+  err := deflateEnd(c_stream);
+  CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with small buffers
+ *)
+{$IFDEF TEST_INFLATE}
+procedure test_inflate(compr: Pointer; comprLen : LongInt;
+                       uncompr: Pointer; uncomprLen : LongInt);
+var err: Integer;
+    d_stream: z_stream; (* decompression stream *)
+begin
+  StrCopy(PChar(uncompr), 'garbage');
+
+  d_stream.zalloc := NIL;
+  d_stream.zfree := NIL;
+  d_stream.opaque := NIL;
+
+  d_stream.next_in := compr;
+  d_stream.avail_in := 0;
+  d_stream.next_out := uncompr;
+
+  err := inflateInit(d_stream);
+  CHECK_ERR(err, 'inflateInit');
+
+  while (d_stream.total_out < uncomprLen) and
+        (d_stream.total_in < comprLen) do
+  begin
+    d_stream.avail_out := 1; (* force small buffers *)
+    d_stream.avail_in := 1;
+    err := inflate(d_stream, Z_NO_FLUSH);
+    if err = Z_STREAM_END then
+      break;
+    CHECK_ERR(err, 'inflate');
+  end;
+
+  err := inflateEnd(d_stream);
+  CHECK_ERR(err, 'inflateEnd');
+
+  if StrComp(PChar(uncompr), hello) <> 0 then
+    EXIT_ERR('bad inflate')
+  else
+    WriteLn('inflate(): ', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with large buffers and dynamic change of compression level
+ *)
+{$IFDEF TEST_DEFLATE}
+procedure test_large_deflate(compr: Pointer; comprLen: LongInt;
+                             uncompr: Pointer; uncomprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+    err: Integer;
+begin
+  c_stream.zalloc := NIL;
+  c_stream.zfree := NIL;
+  c_stream.opaque := NIL;
+
+  err := deflateInit(c_stream, Z_BEST_SPEED);
+  CHECK_ERR(err, 'deflateInit');
+
+  c_stream.next_out := compr;
+  c_stream.avail_out := Integer(comprLen);
+
+  (* At this point, uncompr is still mostly zeroes, so it should compress
+   * very well:
+   *)
+  c_stream.next_in := uncompr;
+  c_stream.avail_in := Integer(uncomprLen);
+  err := deflate(c_stream, Z_NO_FLUSH);
+  CHECK_ERR(err, 'deflate');
+  if c_stream.avail_in <> 0 then
+    EXIT_ERR('deflate not greedy');
+
+  (* Feed in already compressed data and switch to no compression: *)
+  deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
+  c_stream.next_in := compr;
+  c_stream.avail_in := Integer(comprLen div 2);
+  err := deflate(c_stream, Z_NO_FLUSH);
+  CHECK_ERR(err, 'deflate');
+
+  (* Switch back to compressing mode: *)
+  deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
+  c_stream.next_in := uncompr;
+  c_stream.avail_in := Integer(uncomprLen);
+  err := deflate(c_stream, Z_NO_FLUSH);
+  CHECK_ERR(err, 'deflate');
+
+  err := deflate(c_stream, Z_FINISH);
+  if err <> Z_STREAM_END then
+    EXIT_ERR('deflate should report Z_STREAM_END');
+
+  err := deflateEnd(c_stream);
+  CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with large buffers
+ *)
+{$IFDEF TEST_INFLATE}
+procedure test_large_inflate(compr: Pointer; comprLen: LongInt;
+                             uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+    d_stream: z_stream; (* decompression stream *)
+begin
+  StrCopy(PChar(uncompr), 'garbage');
+
+  d_stream.zalloc := NIL;
+  d_stream.zfree := NIL;
+  d_stream.opaque := NIL;
+
+  d_stream.next_in := compr;
+  d_stream.avail_in := Integer(comprLen);
+
+  err := inflateInit(d_stream);
+  CHECK_ERR(err, 'inflateInit');
+
+  while TRUE do
+  begin
+    d_stream.next_out := uncompr;            (* discard the output *)
+    d_stream.avail_out := Integer(uncomprLen);
+    err := inflate(d_stream, Z_NO_FLUSH);
+    if err = Z_STREAM_END then
+      break;
+    CHECK_ERR(err, 'large inflate');
+  end;
+
+  err := inflateEnd(d_stream);
+  CHECK_ERR(err, 'inflateEnd');
+
+  if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then
+  begin
+    WriteLn('bad large inflate: ', d_stream.total_out);
+    Halt(1);
+  end
+  else
+    WriteLn('large_inflate(): OK');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with full flush
+ *)
+{$IFDEF TEST_FLUSH}
+procedure test_flush(compr: Pointer; var comprLen : LongInt);
+var c_stream: z_stream; (* compression stream *)
+    err: Integer;
+    len: Integer;
+begin
+  len := StrLen(hello)+1;
+
+  c_stream.zalloc := NIL;
+  c_stream.zfree := NIL;
+  c_stream.opaque := NIL;
+
+  err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
+  CHECK_ERR(err, 'deflateInit');
+
+  c_stream.next_in := hello;
+  c_stream.next_out := compr;
+  c_stream.avail_in := 3;
+  c_stream.avail_out := Integer(comprLen);
+  err := deflate(c_stream, Z_FULL_FLUSH);
+  CHECK_ERR(err, 'deflate');
+
+  Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *)
+  c_stream.avail_in := len - 3;
+
+  err := deflate(c_stream, Z_FINISH);
+  if err <> Z_STREAM_END then
+    CHECK_ERR(err, 'deflate');
+
+  err := deflateEnd(c_stream);
+  CHECK_ERR(err, 'deflateEnd');
+
+  comprLen := c_stream.total_out;
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflateSync()
+ *)
+{$IFDEF TEST_SYNC}
+procedure test_sync(compr: Pointer; comprLen: LongInt;
+                    uncompr: Pointer; uncomprLen : LongInt);
+var err: Integer;
+    d_stream: z_stream; (* decompression stream *)
+begin
+  StrCopy(PChar(uncompr), 'garbage');
+
+  d_stream.zalloc := NIL;
+  d_stream.zfree := NIL;
+  d_stream.opaque := NIL;
+
+  d_stream.next_in := compr;
+  d_stream.avail_in := 2; (* just read the zlib header *)
+
+  err := inflateInit(d_stream);
+  CHECK_ERR(err, 'inflateInit');
+
+  d_stream.next_out := uncompr;
+  d_stream.avail_out := Integer(uncomprLen);
+
+  inflate(d_stream, Z_NO_FLUSH);
+  CHECK_ERR(err, 'inflate');
+
+  d_stream.avail_in := Integer(comprLen-2);   (* read all compressed data *)
+  err := inflateSync(d_stream);               (* but skip the damaged part *)
+  CHECK_ERR(err, 'inflateSync');
+
+  err := inflate(d_stream, Z_FINISH);
+  if err <> Z_DATA_ERROR then
+    EXIT_ERR('inflate should report DATA_ERROR');
+    (* Because of incorrect adler32 *)
+
+  err := inflateEnd(d_stream);
+  CHECK_ERR(err, 'inflateEnd');
+
+  WriteLn('after inflateSync(): hel', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with preset dictionary
+ *)
+{$IFDEF TEST_DICT}
+procedure test_dict_deflate(compr: Pointer; comprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+    err: Integer;
+begin
+  c_stream.zalloc := NIL;
+  c_stream.zfree := NIL;
+  c_stream.opaque := NIL;
+
+  err := deflateInit(c_stream, Z_BEST_COMPRESSION);
+  CHECK_ERR(err, 'deflateInit');
+
+  err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary));
+  CHECK_ERR(err, 'deflateSetDictionary');
+
+  dictId := c_stream.adler;
+  c_stream.next_out := compr;
+  c_stream.avail_out := Integer(comprLen);
+
+  c_stream.next_in := hello;
+  c_stream.avail_in := StrLen(hello)+1;
+
+  err := deflate(c_stream, Z_FINISH);
+  if err <> Z_STREAM_END then
+    EXIT_ERR('deflate should report Z_STREAM_END');
+
+  err := deflateEnd(c_stream);
+  CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with a preset dictionary
+ *)
+{$IFDEF TEST_DICT}
+procedure test_dict_inflate(compr: Pointer; comprLen: LongInt;
+                            uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+    d_stream: z_stream; (* decompression stream *)
+begin
+  StrCopy(PChar(uncompr), 'garbage');
+
+  d_stream.zalloc := NIL;
+  d_stream.zfree := NIL;
+  d_stream.opaque := NIL;
+
+  d_stream.next_in := compr;
+  d_stream.avail_in := Integer(comprLen);
+
+  err := inflateInit(d_stream);
+  CHECK_ERR(err, 'inflateInit');
+
+  d_stream.next_out := uncompr;
+  d_stream.avail_out := Integer(uncomprLen);
+
+  while TRUE do
+  begin
+    err := inflate(d_stream, Z_NO_FLUSH);
+    if err = Z_STREAM_END then
+      break;
+    if err = Z_NEED_DICT then
+    begin
+      if d_stream.adler <> dictId then
+        EXIT_ERR('unexpected dictionary');
+      err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary));
+    end;
+    CHECK_ERR(err, 'inflate with dict');
+  end;
+
+  err := inflateEnd(d_stream);
+  CHECK_ERR(err, 'inflateEnd');
+
+  if StrComp(PChar(uncompr), hello) <> 0 then
+    EXIT_ERR('bad inflate with dict')
+  else
+    WriteLn('inflate with dictionary: ', PChar(uncompr));
+end;
+{$ENDIF}
+
+var compr, uncompr: Pointer;
+    comprLen, uncomprLen: LongInt;
+
+begin
+  if zlibVersion^ <> ZLIB_VERSION[1] then
+    EXIT_ERR('Incompatible zlib version');
+
+  WriteLn('zlib version: ', zlibVersion);
+  WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags]));
+
+  comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *)
+  uncomprLen := comprLen;
+  GetMem(compr, comprLen);
+  GetMem(uncompr, uncomprLen);
+  if (compr = NIL) or (uncompr = NIL) then
+    EXIT_ERR('Out of memory');
+  (* compr and uncompr are cleared to avoid reading uninitialized
+   * data and to ensure that uncompr compresses well.
+   *)
+  FillChar(compr^, comprLen, 0);
+  FillChar(uncompr^, uncomprLen, 0);
+
+  {$IFDEF TEST_COMPRESS}
+  WriteLn('** Testing compress');
+  test_compress(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+
+  {$IFDEF TEST_GZIO}
+  WriteLn('** Testing gzio');
+  if ParamCount >= 1 then
+    test_gzio(ParamStr(1), uncompr, uncomprLen)
+  else
+    test_gzio(TESTFILE, uncompr, uncomprLen);
+  {$ENDIF}
+
+  {$IFDEF TEST_DEFLATE}
+  WriteLn('** Testing deflate with small buffers');
+  test_deflate(compr, comprLen);
+  {$ENDIF}
+  {$IFDEF TEST_INFLATE}
+  WriteLn('** Testing inflate with small buffers');
+  test_inflate(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+
+  {$IFDEF TEST_DEFLATE}
+  WriteLn('** Testing deflate with large buffers');
+  test_large_deflate(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+  {$IFDEF TEST_INFLATE}
+  WriteLn('** Testing inflate with large buffers');
+  test_large_inflate(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+
+  {$IFDEF TEST_FLUSH}
+  WriteLn('** Testing deflate with full flush');
+  test_flush(compr, comprLen);
+  {$ENDIF}
+  {$IFDEF TEST_SYNC}
+  WriteLn('** Testing inflateSync');
+  test_sync(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+  comprLen := uncomprLen;
+
+  {$IFDEF TEST_DICT}
+  WriteLn('** Testing deflate and inflate with preset dictionary');
+  test_dict_deflate(compr, comprLen);
+  test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
+  {$ENDIF}
+
+  FreeMem(compr, comprLen);
+  FreeMem(uncompr, uncomprLen);
+end.
diff --git a/contrib/pascal/readme.txt b/contrib/pascal/readme.txt
new file mode 100644
index 0000000..60e87c8
--- /dev/null
+++ b/contrib/pascal/readme.txt
@@ -0,0 +1,76 @@
+
+This directory contains a Pascal (Delphi, Kylix) interface to the
+zlib data compression library.
+
+
+Directory listing
+=================
+
+zlibd32.mak     makefile for Borland C++
+example.pas     usage example of zlib
+zlibpas.pas     the Pascal interface to zlib
+readme.txt      this file
+
+
+Compatibility notes
+===================
+
+- Although the name "zlib" would have been more normal for the
+  zlibpas unit, this name is already taken by Borland's ZLib unit.
+  This is somehow unfortunate, because that unit is not a genuine
+  interface to the full-fledged zlib functionality, but a suite of
+  class wrappers around zlib streams.  Other essential features,
+  such as checksums, are missing.
+  It would have been more appropriate for that unit to have a name
+  like "ZStreams", or something similar.
+
+- The C and zlib-supplied types int, uInt, long, uLong, etc. are
+  translated directly into Pascal types of similar sizes (Integer,
+  LongInt, etc.), to avoid namespace pollution.  In particular,
+  there is no conversion of unsigned int into a Pascal unsigned
+  integer.  The Word type is non-portable and has the same size
+  (16 bits) both in a 16-bit and in a 32-bit environment, unlike
+  Integer.  Even if there is a 32-bit Cardinal type, there is no
+  real need for unsigned int in zlib under a 32-bit environment.
+
+- Except for the callbacks, the zlib function interfaces are
+  assuming the calling convention normally used in Pascal
+  (__pascal for DOS and Windows16, __fastcall for Windows32).
+  Since the cdecl keyword is used, the old Turbo Pascal does
+  not work with this interface.
+
+- The gz* function interfaces are not translated, to avoid
+  interfacing problems with the C runtime library.  Besides,
+    gzprintf(gzFile file, const char *format, ...)
+  cannot be translated into Pascal.
+
+
+Legal issues
+============
+
+The zlibpas interface is:
+  Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler.
+  Copyright (C) 1998 by Bob Dellaca.
+  Copyright (C) 2003 by Cosmin Truta.
+
+The example program is:
+  Copyright (C) 1995-2003 by Jean-loup Gailly.
+  Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali.
+  Copyright (C) 2003 by Cosmin Truta.
+
+  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.
+
diff --git a/contrib/pascal/zlibd32.mak b/contrib/pascal/zlibd32.mak
new file mode 100644
index 0000000..88fafa0
--- /dev/null
+++ b/contrib/pascal/zlibd32.mak
@@ -0,0 +1,93 @@
+# Makefile for zlib
+# For use with Delphi and C++ Builder under Win32
+# Updated for zlib 1.2.x by Cosmin Truta
+
+# ------------ Borland C++ ------------
+
+# This project uses the Delphi (fastcall/register) calling convention:
+LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
+
+CC = bcc32
+LD = bcc32
+AR = tlib
+# do not use "-pr" in CFLAGS
+CFLAGS = -a -d -k- -O2 $(LOC)
+LDFLAGS =
+
+
+# variables
+ZLIB_LIB = zlib.lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
+OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj
+OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+	$(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: example.c zlib.h zconf.h
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+
+
+# For the sake of the old Borland make,
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+	-del $(ZLIB_LIB)
+	$(AR) $(ZLIB_LIB) $(OBJP1)
+	$(AR) $(ZLIB_LIB) $(OBJP2)
+
+
+# testing
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d
+
+example.exe: example.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+
+# cleanup
+clean:
+	-del *.obj
+	-del *.exe
+	-del *.lib
+	-del *.tds
+	-del zlib.bak
+	-del foo.gz
+
diff --git a/contrib/pascal/zlibpas.pas b/contrib/pascal/zlibpas.pas
new file mode 100644
index 0000000..f81893f
--- /dev/null
+++ b/contrib/pascal/zlibpas.pas
@@ -0,0 +1,234 @@
+(* zlibpas -- Pascal interface to the zlib data compression library
+ *
+ * Copyright (C) 2003 Cosmin Truta.
+ * Derived from original sources by Bob Dellaca.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *)
+
+unit zlibpas;
+
+interface
+
+const
+  ZLIB_VERSION = '1.2.0';
+
+type
+  alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
+                 cdecl;
+  free_func  = procedure(opaque, address: Pointer);
+                 cdecl;
+
+  in_func    = function(opaque: Pointer; var buf: PByte): Integer;
+                 cdecl;
+  out_func   = function(opaque: Pointer; buf: PByte; size: Integer): Integer;
+                 cdecl;
+
+  z_streamp = ^z_stream;
+  z_stream = packed record
+    next_in: PChar;       (* next input byte *)
+    avail_in: Integer;    (* number of bytes available at next_in *)
+    total_in: LongInt;    (* total nb of input bytes read so far *)
+
+    next_out: PChar;      (* next output byte should be put there *)
+    avail_out: Integer;   (* remaining free space at next_out *)
+    total_out: LongInt;   (* total nb of bytes output so far *)
+
+    msg: PChar;           (* last error message, NULL if no error *)
+    state: Pointer;       (* not visible by applications *)
+
+    zalloc: alloc_func;   (* used to allocate the internal state *)
+    zfree: free_func;     (* used to free the internal state *)
+    opaque: Pointer;      (* private data object passed to zalloc and zfree *)
+
+    data_type: Integer;   (* best guess about the data type: ascii or binary *)
+    adler: LongInt;       (* adler32 value of the uncompressed data *)
+    reserved: LongInt;    (* reserved for future use *)
+  end;
+
+(* constants *)
+const
+  Z_NO_FLUSH      = 0;
+  Z_PARTIAL_FLUSH = 1;
+  Z_SYNC_FLUSH    = 2;
+  Z_FULL_FLUSH    = 3;
+  Z_FINISH        = 4;
+
+  Z_OK            =  0;
+  Z_STREAM_END    =  1;
+  Z_NEED_DICT     =  2;
+  Z_ERRNO         = -1;
+  Z_STREAM_ERROR  = -2;
+  Z_DATA_ERROR    = -3;
+  Z_MEM_ERROR     = -4;
+  Z_BUF_ERROR     = -5;
+  Z_VERSION_ERROR = -6;
+
+  Z_NO_COMPRESSION       =  0;
+  Z_BEST_SPEED           =  1;
+  Z_BEST_COMPRESSION     =  9;
+  Z_DEFAULT_COMPRESSION  = -1;
+
+  Z_FILTERED            = 1;
+  Z_HUFFMAN_ONLY        = 2;
+  Z_RLE                 = 3;
+  Z_DEFAULT_STRATEGY    = 0;
+
+  Z_BINARY   = 0;
+  Z_ASCII    = 1;
+  Z_UNKNOWN  = 2;
+
+  Z_DEFLATED = 8;
+
+(* basic functions *)
+function zlibVersion: PChar;
+function deflateInit(var strm: z_stream; level: Integer): Integer;
+function deflate(var strm: z_stream; flush: Integer): Integer;
+function deflateEnd(var strm: z_stream): Integer;
+function inflateInit(var strm: z_stream): Integer;
+function inflate(var strm: z_stream; flush: Integer): Integer;
+function inflateEnd(var strm: z_stream): Integer;
+
+(* advanced functions *)
+function deflateInit2(var strm: z_stream; level, method, windowBits,
+                      memLevel, strategy: Integer): Integer;
+function deflateSetDictionary(var strm: z_stream; const dictionary: PChar;
+                              dictLength: Integer): Integer;
+function deflateCopy(var dest, source: z_stream): Integer;
+function deflateReset(var strm: z_stream): Integer;
+function deflateParams(var strm: z_stream; level, strategy: Integer): Integer;
+function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt;
+function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
+function inflateSetDictionary(var strm: z_stream; const dictionary: PChar;
+                              dictLength: Integer): Integer;
+function inflateSync(var strm: z_stream): Integer;
+function inflateCopy(var dest, source: z_stream): Integer;
+function inflateReset(var strm: z_stream): Integer;
+function inflateBackInit(var strm: z_stream;
+                         windowBits: Integer; window: PChar): Integer;
+function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer;
+                     out_fn: out_func; out_desc: Pointer): Integer;
+function inflateBackEnd(var strm: z_stream): Integer;
+function zlibCompileFlags: LongInt;
+
+(* utility functions *)
+function compress(dest: PChar; var destLen: LongInt;
+                  const source: PChar; sourceLen: LongInt): Integer;
+function compress2(dest: PChar; var destLen: LongInt;
+                  const source: PChar; sourceLen: LongInt;
+                  level: Integer): Integer;
+function compressBound(sourceLen: LongInt): LongInt;
+function uncompress(dest: PChar; var destLen: LongInt;
+                    const source: PChar; sourceLen: LongInt): Integer;
+
+(* checksum functions *)
+function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt;
+function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt;
+
+(* various hacks, don't look :) *)
+function deflateInit_(var strm: z_stream; level: Integer;
+                      const version: PChar; stream_size: Integer): Integer;
+function inflateInit_(var strm: z_stream; const version: PChar;
+                      stream_size: Integer): Integer;
+function deflateInit2_(var strm: z_stream;
+                       level, method, windowBits, memLevel, strategy: Integer;
+                       const version: PChar; stream_size: Integer): Integer;
+function inflateInit2_(var strm: z_stream; windowBits: Integer;
+                       const version: PChar; stream_size: Integer): Integer;
+function inflateBackInit_(var strm: z_stream;
+                          windowBits: Integer; window: PChar;
+                          const version: PChar; stream_size: Integer): Integer;
+
+
+implementation
+
+{$L adler32.obj}
+{$L compress.obj}
+{$L crc32.obj}
+{$L deflate.obj}
+{$L infback.obj}
+{$L inffast.obj}
+{$L inflate.obj}
+{$L inftrees.obj}
+{$L trees.obj}
+{$L uncompr.obj}
+{$L zutil.obj}
+
+function adler32; external;
+function compress; external;
+function compress2; external;
+function compressBound; external;
+function crc32; external;
+function deflate; external;
+function deflateBound; external;
+function deflateCopy; external;
+function deflateEnd; external;
+function deflateInit_; external;
+function deflateInit2_; external;
+function deflateParams; external;
+function deflateReset; external;
+function deflateSetDictionary; external;
+function inflate; external;
+function inflateBack; external;
+function inflateBackEnd; external;
+function inflateBackInit_; external;
+function inflateCopy; external;
+function inflateEnd; external;
+function inflateInit_; external;
+function inflateInit2_; external;
+function inflateReset; external;
+function inflateSetDictionary; external;
+function inflateSync; external;
+function uncompress; external;
+function zlibCompileFlags; external;
+function zlibVersion; external;
+
+function deflateInit(var strm: z_stream; level: Integer): Integer;
+begin
+  Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel,
+                      strategy: Integer): Integer;
+begin
+  Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+                          ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit(var strm: z_stream): Integer;
+begin
+  Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
+begin
+  Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateBackInit(var strm: z_stream;
+                         windowBits: Integer; window: PChar): Integer;
+begin
+  Result := inflateBackInit_(strm, windowBits, window,
+                             ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function _malloc(Size: Integer): Pointer; cdecl;
+begin
+  GetMem(Result, Size);
+end;
+
+procedure _free(Block: Pointer); cdecl;
+begin
+  FreeMem(Block);
+end;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
+begin
+  FillChar(P^, count, B);
+end;
+
+procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
+begin
+  Move(source^, dest^, count);
+end;
+
+end.
diff --git a/contrib/puff/README b/contrib/puff/README
index 59b3533..bbc4cb5 100644
--- a/contrib/puff/README
+++ b/contrib/puff/README
@@ -14,7 +14,7 @@
 puff.c was written to document the deflate format unambiguously, by virtue of
 being working C code.  It is meant to supplement RFC 1951, which formally
 describes the deflate format.  I have received many questions on details of the
-deflate format, and I hope that reading this code will answer those questions. 
+deflate format, and I hope that reading this code will answer those questions.
 puff.c is heavily commented with details of the deflate format, especially
 those little nooks and cranies of the format that might not be obvious from a
 specification.
@@ -29,10 +29,10 @@
 
 Include puff.h in your code, which provides this prototype:
 
-int puff(unsigned char *dest,		/* pointer to destination pointer */
-         unsigned long *destlen,	/* amount of output space */
-         unsigned char *source,		/* pointer to source data pointer */
-         unsigned long *sourcelen);	/* amount of input available */
+int puff(unsigned char *dest,           /* pointer to destination pointer */
+         unsigned long *destlen,        /* amount of output space */
+         unsigned char *source,         /* pointer to source data pointer */
+         unsigned long *sourcelen);     /* amount of input available */
 
 Then you can call puff() to decompress a deflate stream that is in memory in
 its entirety at source, to a sufficiently sized block of memory for the
diff --git a/contrib/puff/puff.c b/contrib/puff/puff.c
index b6039dd..a30fb17 100644
--- a/contrib/puff/puff.c
+++ b/contrib/puff/puff.c
@@ -805,7 +805,7 @@
         buf = NULL;
     }
     fclose(in);
-    *len = size;    
+    *len = size;
     return buf;
 }
 
diff --git a/contrib/puff/puff.h b/contrib/puff/puff.h
index 41ea7e1..ef61252 100644
--- a/contrib/puff/puff.h
+++ b/contrib/puff/puff.h
@@ -18,7 +18,7 @@
      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
+  Mark Adler    madler@alumni.caltech.edu
  */
 
 
diff --git a/contrib/testzlib/testzlib.c b/contrib/testzlib/testzlib.c
index caae4ef..fdabc5c 100644
--- a/contrib/testzlib/testzlib.c
+++ b/contrib/testzlib/testzlib.c
@@ -1,149 +1,149 @@
-

-#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"
+
+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;
+
+}
diff --git a/contrib/testzlib/testzlib.vcproj b/contrib/testzlib/testzlib.vcproj
index 5165301..bd9b39b 100644
--- a/contrib/testzlib/testzlib.vcproj
+++ b/contrib/testzlib/testzlib.vcproj
@@ -19,7 +19,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				Optimization="0"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;_DEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"

 				MinimalRebuild="TRUE"

 				BasicRuntimeChecks="3"

 				RuntimeLibrary="5"

@@ -63,7 +63,7 @@
 				Optimization="2"

 				InlineFunctionExpansion="1"

 				OmitFramePointers="TRUE"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;NDEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"

 				StringPooling="TRUE"

 				RuntimeLibrary="4"

 				EnableFunctionLevelLinking="TRUE"

@@ -116,7 +116,7 @@
 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">

 		</Filter>

 		<File

-			RelativePath="zlib.lib">

+			RelativePath="zlibwapi.lib">

 		</File>

 	</Files>

 	<Globals>

diff --git a/contrib/untgz/Makefile b/contrib/untgz/Makefile
index 409b4bd..b54266f 100644
--- a/contrib/untgz/Makefile
+++ b/contrib/untgz/Makefile
@@ -1,14 +1,14 @@
 CC=cc
 CFLAGS=-g
 
-untgz: untgz.o  ../../libz.a
-	$(CC) $(CFLAGS) -o untgz  untgz.o -L../.. -lz
+untgz: untgz.o ../../libz.a
+	$(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
 
 untgz.o: untgz.c ../../zlib.h
 	$(CC) $(CFLAGS) -c -I../.. untgz.c
 
 ../../libz.a:
-	cd ../..; make
+	cd ../..; ./configure; make
 
 clean:
 	rm -f untgz untgz.o *~
diff --git a/contrib/untgz/Makefile.msc b/contrib/untgz/Makefile.msc
new file mode 100644
index 0000000..77b8602
--- /dev/null
+++ b/contrib/untgz/Makefile.msc
@@ -0,0 +1,17 @@
+CC=cl
+CFLAGS=-MD
+
+untgz.exe: untgz.obj ..\..\zlib.lib
+	$(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib
+
+untgz.obj: untgz.c ..\..\zlib.h
+	$(CC) $(CFLAGS) -c -I..\.. untgz.c
+
+..\..\zlib.lib:
+	cd ..\..
+	$(MAKE) -f win32\makefile.msc
+	cd contrib\untgz
+
+clean:
+	-del untgz.obj
+	-del untgz.exe
diff --git a/contrib/untgz/makefile.w32 b/contrib/untgz/makefile.w32
deleted file mode 100644
index c99dc28..0000000
--- a/contrib/untgz/makefile.w32
+++ /dev/null
@@ -1,63 +0,0 @@
-# Makefile for zlib.  Modified for mingw32
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, 
-# 
-#   make -fmakefile.w32
-# 
-
-CC=gcc
-
-# Generate dependencies (see end of the file)
-
-CPPFLAGS=-MMD 
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is not found, replace with copy /Y .
-CP=cp -f
-
-# The default value of RM is "rm -f."  
-# If "rm.exe" is not found, uncomment:
-# RM=del
-
-LD=gcc
-LDLIBS=-L. -lz
-LDFLAGS=-s
-
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o \
-       inffast.o
-
-TEST_OBJS = minigzip.o untgz.o
-
-all: minigzip.exe untgz.exe
-
-rebuild:	clean	all
-
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d *.o *.exe libz.a foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
-
diff --git a/contrib/untgz/untgz.c b/contrib/untgz/untgz.c
index 4a431ff..478d744 100644
--- a/contrib/untgz/untgz.c
+++ b/contrib/untgz/untgz.c
@@ -21,6 +21,7 @@
 #include "zlib.h"
 
 #ifdef WIN32
+#include <windows.h>
 #  ifndef F_OK
 #    define F_OK (0)
 #  endif
@@ -39,37 +40,37 @@
 
 /* Values used in typeflag field.  */
 
-#define REGTYPE	 '0'		/* regular file */
-#define AREGTYPE '\0'		/* regular file */
-#define LNKTYPE  '1'		/* link */
-#define SYMTYPE  '2'		/* reserved */
-#define CHRTYPE  '3'		/* character special */
-#define BLKTYPE  '4'		/* block special */
-#define DIRTYPE  '5'		/* directory */
-#define FIFOTYPE '6'		/* FIFO special */
-#define CONTTYPE '7'		/* reserved */
+#define REGTYPE  '0'            /* regular file */
+#define AREGTYPE '\0'           /* regular file */
+#define LNKTYPE  '1'            /* link */
+#define SYMTYPE  '2'            /* reserved */
+#define CHRTYPE  '3'            /* character special */
+#define BLKTYPE  '4'            /* block special */
+#define DIRTYPE  '5'            /* directory */
+#define FIFOTYPE '6'            /* FIFO special */
+#define CONTTYPE '7'            /* reserved */
 
 #define BLOCKSIZE 512
 
 struct tar_header
-{				/* byte offset */
-  char name[100];		/*   0 */
-  char mode[8];			/* 100 */
-  char uid[8];			/* 108 */
-  char gid[8];			/* 116 */
-  char size[12];		/* 124 */
-  char mtime[12];		/* 136 */
-  char chksum[8];		/* 148 */
-  char typeflag;		/* 156 */
-  char linkname[100];		/* 157 */
-  char magic[6];		/* 257 */
-  char version[2];		/* 263 */
-  char uname[32];		/* 265 */
-  char gname[32];		/* 297 */
-  char devmajor[8];		/* 329 */
-  char devminor[8];		/* 337 */
-  char prefix[155];		/* 345 */
-				/* 500 */
+{                               /* byte offset */
+  char name[100];               /*   0 */
+  char mode[8];                 /* 100 */
+  char uid[8];                  /* 108 */
+  char gid[8];                  /* 116 */
+  char size[12];                /* 124 */
+  char mtime[12];               /* 136 */
+  char chksum[8];               /* 148 */
+  char typeflag;                /* 156 */
+  char linkname[100];           /* 157 */
+  char magic[6];                /* 257 */
+  char version[2];              /* 263 */
+  char uname[32];               /* 265 */
+  char gname[32];               /* 297 */
+  char devmajor[8];             /* 329 */
+  char devminor[8];             /* 337 */
+  char prefix[155];             /* 345 */
+                                /* 500 */
 };
 
 union tar_buffer {
@@ -79,42 +80,43 @@
 
 enum { TGZ_EXTRACT = 0, TGZ_LIST };
 
-static char *TGZfname	OF((const char *));
-void TGZnotfound	OF((const char *));
+static char *TGZfname   OF((const char *));
+void TGZnotfound        OF((const char *));
 
-int getoct		OF((char *, int));
-char *strtime		OF((time_t *));
-int ExprMatch		OF((char *,char *));
+int getoct              OF((char *, int));
+char *strtime           OF((time_t *));
+int setftime            OF((char *, time_t));
+int ExprMatch           OF((char *, char *));
 
-int makedir		OF((char *));
-int matchname		OF((int,int,char **,char *));
+int makedir             OF((char *));
+int matchname           OF((int, int, char **, char *));
 
-void error		OF((const char *));
-int  tar		OF((gzFile, int, int, int, char **));
+void error              OF((const char *));
+int  tar                OF((gzFile, int, int, int, char **));
 
-void help		OF((int));
-int main		OF((int, char **));
+void help               OF((int));
+int main                OF((int, char **));
 
 char *prog;
 
 /* This will give a benign warning */
 
-static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", ".tar", NULL };
+static char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL };
 
 /* Return the real name of the TGZ archive */
 /* or NULL if it does not exist. */
 
-static char *TGZfname OF((const char *fname))
+static char *TGZfname (const char *fname)
 {
   static char buffer[1024];
   int origlen,i;
-  
+
   strcpy(buffer,fname);
   origlen = strlen(buffer);
 
-  for (i=0; TGZprefix[i]; i++)
+  for (i=0; TGZsuffix[i]; i++)
     {
-       strcpy(buffer+origlen,TGZprefix[i]);
+       strcpy(buffer+origlen,TGZsuffix[i]);
        if (access(buffer,F_OK) == 0)
          return buffer;
     }
@@ -123,33 +125,33 @@
 
 /* error message for the filename */
 
-void TGZnotfound OF((const char *fname))
+void TGZnotfound (const char *fname)
 {
   int i;
 
   fprintf(stderr,"%s : couldn't find ",prog);
-  for (i=0;TGZprefix[i];i++)
-    fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n",
+  for (i=0;TGZsuffix[i];i++)
+    fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n",
             fname,
-            TGZprefix[i]);
+            TGZsuffix[i]);
   exit(1);
 }
 
 
 /* help functions */
 
-int getoct(char *p,int width)
+int getoct (char *p,int width)
 {
   int result = 0;
   char c;
-  
+
   while (width --)
     {
       c = *p++;
       if (c == ' ')
-	continue;
+        continue;
       if (c == 0)
-	break;
+        break;
       result = result * 8 + (c - '0');
     }
   return result;
@@ -162,45 +164,85 @@
 
   local = localtime(t);
   sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d",
-	  local->tm_mday, local->tm_mon+1, local->tm_year+1900,
-	  local->tm_hour, local->tm_min,   local->tm_sec);
+          local->tm_mday, local->tm_mon+1, local->tm_year+1900,
+          local->tm_hour, local->tm_min,   local->tm_sec);
   return result;
 }
 
+int setftime (char *fname,time_t ftime)
+{
+#ifdef WIN32
+  SYSTEMTIME st;
+  FILETIME locft, modft;
+  struct tm *loctm;
+  HANDLE hFile;
+  int result;
+
+  loctm = localtime(&ftime);
+  if (loctm == NULL)
+    return -1;
+
+  st.wYear         = (WORD)loctm->tm_year + 1900;
+  st.wMonth        = (WORD)loctm->tm_mon + 1;
+  st.wDayOfWeek    = (WORD)loctm->tm_wday;
+  st.wDay          = (WORD)loctm->tm_mday;
+  st.wHour         = (WORD)loctm->tm_hour;
+  st.wMinute       = (WORD)loctm->tm_min;
+  st.wSecond       = (WORD)loctm->tm_sec;
+  st.wMilliseconds = 0;
+  if (!SystemTimeToFileTime(&st, &locft) ||
+      !LocalFileTimeToFileTime(&locft, &modft))
+    return -1;
+
+  hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
+                     0, NULL, OPEN_EXISTING, 0, 0);
+  if (hFile == INVALID_HANDLE_VALUE)
+    return -1;
+  result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1;
+  CloseHandle(hFile);
+  return result;
+#else
+  struct utimbuf settime;
+
+  settime.actime = settime.modtime = ftime;
+  return utime(fname,&settime);
+#endif
+}
+
 
 /* regular expression matching */
 
 #define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
 
-int ExprMatch(char *string,char *expr)
+int ExprMatch (char *string,char *expr)
 {
   while (1)
     {
       if (ISSPECIAL(*expr))
-	{
-	  if (*expr == '/')
-	    {
-	      if (*string != '\\' && *string != '/')
-		return 0;
-	      string ++; expr++;
-	    }
-	  else if (*expr == '*')
-	    {
-	      if (*expr ++ == 0)
-		return 1;
-	      while (*++string != *expr)
-		if (*string == 0)
-		  return 0;
-	    }
-	}
+        {
+          if (*expr == '/')
+            {
+              if (*string != '\\' && *string != '/')
+                return 0;
+              string ++; expr++;
+            }
+          else if (*expr == '*')
+            {
+              if (*expr ++ == 0)
+                return 1;
+              while (*++string != *expr)
+                if (*string == 0)
+                  return 0;
+            }
+        }
       else
-	{
-	  if (*string != *expr)
-	    return 0;
-	  if (*expr++ == 0)
-	    return 1;
-	  string++;
-	}
+        {
+          if (*string != *expr)
+            return 0;
+          if (*expr++ == 0)
+            return 1;
+          string++;
+        }
     }
 }
 
@@ -216,7 +258,7 @@
   char *buffer = strdup(newdir);
   char *p;
   int  len = strlen(buffer);
-  
+
   if (len <= 0) {
     free(buffer);
     return 0;
@@ -234,19 +276,19 @@
   while (1)
     {
       char hold;
-      
+
       while(*p && *p != '\\' && *p != '/')
-	p++;
+        p++;
       hold = *p;
       *p = 0;
       if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT))
-	{
-	  fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
-	  free(buffer);
-	  return 0;
-	}
+        {
+          fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
+          free(buffer);
+          return 0;
+        }
       if (hold == 0)
-	break;
+        break;
       *p++ = hold;
     }
   free(buffer);
@@ -255,7 +297,7 @@
 
 int matchname (int arg,int argc,char **argv,char *fname)
 {
-  if (arg == argc)		/* no arguments given (untgz tgzarchive) */
+  if (arg == argc)              /* no arguments given (untgz tgzarchive) */
     return 1;
 
   while (arg < argc)
@@ -278,144 +320,111 @@
   FILE   *outfile = NULL;
   char   fname[BLOCKSIZE];
   time_t tartime;
-  
+
   if (action == TGZ_LIST)
     printf("     day      time     size                       file\n"
-	   " ---------- -------- --------- -------------------------------------\n");
+           " ---------- -------- --------- -------------------------------------\n");
   while (1)
     {
       len = gzread(in, &buffer, BLOCKSIZE);
       if (len < 0)
-	error (gzerror(in, &err));
+        error (gzerror(in, &err));
       /*
        * Always expect complete blocks to process
        * the tar information.
        */
       if (len != BLOCKSIZE)
-	error("gzread: incomplete block read");
-      
+        error("gzread: incomplete block read");
+
       /*
        * If we have to get a tar header
        */
       if (getheader == 1)
-	{
-	  /*
-	   * if we met the end of the tar
-	   * or the end-of-tar block,
-	   * we are done
-	   */
-	  if ((len == 0)  || (buffer.header.name[0]== 0)) break;
+        {
+          /*
+           * if we met the end of the tar
+           * or the end-of-tar block,
+           * we are done
+           */
+          if ((len == 0)  || (buffer.header.name[0]== 0)) break;
 
-	  tartime = (time_t)getoct(buffer.header.mtime,12);
-	  strcpy(fname,buffer.header.name);
-	  
-	  switch (buffer.header.typeflag)
-	    {
-	    case DIRTYPE:
-	      if (action == TGZ_LIST)
-		printf(" %s     <dir> %s\n",strtime(&tartime),fname);
-	      if (action == TGZ_EXTRACT)
-		makedir(fname);
-	      break;
-	    case REGTYPE:
-	    case AREGTYPE:
-	      remaining = getoct(buffer.header.size,12);
-	      if (action == TGZ_LIST)
-		printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
-	      if (action == TGZ_EXTRACT)
-		{
-		  if ((remaining) && (matchname(arg,argc,argv,fname)))
-		    {
-		      outfile = fopen(fname,"wb");
-		      if (outfile == NULL) {
-			/* try creating directory */
-			char *p = strrchr(fname, '/');
-			if (p != NULL) {
-			  *p = '\0';
-			  makedir(fname);
-			  *p = '/';
-			  outfile = fopen(fname,"wb");
-			}
-		      }
-		      fprintf(stderr,
-			      "%s %s\n",
-			      (outfile) ? "Extracting" : "Couldn't create",
-			      fname);
-		    }
-		  else
-		    outfile = NULL;
-		}
-	      /*
-	       * could have no contents
-	       */
-	      getheader = (remaining) ? 0 : 1;
-	      break;
-	    default:
-	      if (action == TGZ_LIST)
-		printf(" %s     <---> %s\n",strtime(&tartime),fname);
-	      break;
-	    }
-	}
+          tartime = (time_t)getoct(buffer.header.mtime,12);
+          strcpy(fname,buffer.header.name);
+
+          switch (buffer.header.typeflag)
+            {
+            case DIRTYPE:
+              if (action == TGZ_LIST)
+                printf(" %s     <dir> %s\n",strtime(&tartime),fname);
+              if (action == TGZ_EXTRACT)
+                makedir(fname);
+              break;
+            case REGTYPE:
+            case AREGTYPE:
+              remaining = getoct(buffer.header.size,12);
+              if (action == TGZ_LIST)
+                printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
+              if (action == TGZ_EXTRACT)
+                {
+                  if ((remaining) && (matchname(arg,argc,argv,fname)))
+                    {
+                      outfile = fopen(fname,"wb");
+                      if (outfile == NULL) {
+                        /* try creating directory */
+                        char *p = strrchr(fname, '/');
+                        if (p != NULL) {
+                          *p = '\0';
+                          makedir(fname);
+                          *p = '/';
+                          outfile = fopen(fname,"wb");
+                        }
+                      }
+                      fprintf(stderr,
+                              "%s %s\n",
+                              (outfile) ? "Extracting" : "Couldn't create",
+                              fname);
+                    }
+                  else
+                    outfile = NULL;
+                }
+              /*
+               * could have no contents
+               */
+              getheader = (remaining) ? 0 : 1;
+              break;
+            default:
+              if (action == TGZ_LIST)
+                printf(" %s     <---> %s\n",strtime(&tartime),fname);
+              break;
+            }
+        }
       else
-	{
-	  unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
+        {
+          unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
 
-	  if ((action == TGZ_EXTRACT) && (outfile != NULL))
-	    {
-	      if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
-		{
-		  fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
-		  fclose(outfile);
-		  unlink(fname);
-		}
-	    }
-	  remaining -= bytes;
-	  if (remaining == 0)
-	    {
-	      getheader = 1;
-	      if ((action == TGZ_EXTRACT) && (outfile != NULL))
-		{
-#ifdef WIN32
-		  HANDLE hFile;
-		  FILETIME ftm,ftLocal;
-		  SYSTEMTIME st;
-		  struct tm localt;
- 
-		  fclose(outfile);
-
-		  localt = *localtime(&tartime);
-
-		  hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
-				     0, NULL, OPEN_EXISTING, 0, NULL);
-		  
-		  st.wYear = (WORD)localt.tm_year+1900;
-		  st.wMonth = (WORD)localt.tm_mon;
-		  st.wDayOfWeek = (WORD)localt.tm_wday;
-		  st.wDay = (WORD)localt.tm_mday;
-		  st.wHour = (WORD)localt.tm_hour;
-		  st.wMinute = (WORD)localt.tm_min;
-		  st.wSecond = (WORD)localt.tm_sec;
-		  st.wMilliseconds = 0;
-		  SystemTimeToFileTime(&st,&ftLocal);
-		  LocalFileTimeToFileTime(&ftLocal,&ftm);
-		  SetFileTime(hFile,&ftm,NULL,&ftm);
-		  CloseHandle(hFile);
-
-		  outfile = NULL;
-#else
-		  struct utimbuf settime;
-
-		  settime.actime = settime.modtime = tartime;
-
-		  fclose(outfile);
-		  outfile = NULL;
-		  utime(fname,&settime);
-#endif
-		}
-	    }
-	}
+          if ((action == TGZ_EXTRACT) && (outfile != NULL))
+            {
+              if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
+                {
+                  fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
+                  fclose(outfile);
+                  unlink(fname);
+                }
+            }
+          remaining -= bytes;
+          if (remaining == 0)
+            {
+              getheader = 1;
+              if ((action == TGZ_EXTRACT) && (outfile != NULL))
+                {
+                  fclose(outfile);
+                  outfile = NULL;
+                  setftime(fname,tartime);
+                }
+            }
+        }
     }
-  
+
   if (gzclose(in) != Z_OK)
     error("failed gzclose");
 
@@ -428,12 +437,12 @@
 void help(int exitval)
 {
   fprintf(stderr,
-	  "untgz v 0.1\n"
-	  " an sample application of zlib 1.0.4\n\n"
-          "Usage : untgz TGZfile            to extract all files\n"
-          "        untgz TGZfile fname ...  to extract selected files\n"
-          "        untgz -l TGZfile         to list archive contents\n"
-          "        untgz -h                 to display this help\n\n");
+          "untgz version 0.1\n"
+          " a sample application of zlib\n\n"
+          "Usage : untgz file.tgz            to extract all files\n"
+          "        untgz file.tgz fname ...  to extract selected files\n"
+          "        untgz -l file.tgz         to list archive contents\n"
+          "        untgz -h                  to display this help\n\n");
   exit(exitval);
 }
 
@@ -446,50 +455,50 @@
 
 /* ====================================================================== */
 
-int _CRT_glob = 0;	/* disable globbing of the arguments */
+int _CRT_glob = 0;      /* disable globbing of the arguments */
 
 int main(int argc,char **argv)
 {
-    int 	action = TGZ_EXTRACT;
-    int 	arg = 1;
-    char	*TGZfile;
-    gzFile	*f;
-    
+    int         action = TGZ_EXTRACT;
+    int         arg = 1;
+    char        *TGZfile;
+    gzFile      *f;
+
 
     prog = strrchr(argv[0],'\\');
     if (prog == NULL)
       {
-	prog = strrchr(argv[0],'/');
-	if (prog == NULL)
-	  {
-	    prog = strrchr(argv[0],':');
-	    if (prog == NULL)
-	      prog = argv[0];
-	    else
-	      prog++;
-	  }
-	else
-	  prog++;
+        prog = strrchr(argv[0],'/');
+        if (prog == NULL)
+          {
+            prog = strrchr(argv[0],':');
+            if (prog == NULL)
+              prog = argv[0];
+            else
+              prog++;
+          }
+        else
+          prog++;
       }
     else
       prog++;
-    
+
     if (argc == 1)
       help(0);
 
     if (strcmp(argv[arg],"-l") == 0)
       {
-	action = TGZ_LIST;
-	if (argc == ++arg)
-	  help(0);
+        action = TGZ_LIST;
+        if (argc == ++arg)
+          help(0);
       }
     else if (strcmp(argv[arg],"-h") == 0)
       {
-	help(0);
+        help(0);
       }
 
     if ((TGZfile = TGZfname(argv[arg])) == NULL)
-      TGZnotfound(argv[arg]);            
+      TGZnotfound(argv[arg]);
 
     ++arg;
     if ((action == TGZ_LIST) && (arg != argc))
@@ -502,20 +511,20 @@
       {
       case TGZ_LIST:
       case TGZ_EXTRACT:
-	f = gzopen(TGZfile,"rb");
-	if (f == NULL)
-	  {
-	    fprintf(stderr,"%s: Couldn't gzopen %s\n",
-		    prog,
-		    TGZfile);
-	    return 1;
-	  }
-	exit(tar(f, action, arg, argc, argv));
+        f = gzopen(TGZfile,"rb");
+        if (f == NULL)
+          {
+            fprintf(stderr,"%s: Couldn't gzopen %s\n",
+                    prog,
+                    TGZfile);
+            return 1;
+          }
+        exit(tar(f, action, arg, argc, argv));
       break;
-	
+
       default:
-	error("Unknown option!");
-	exit(1);
+        error("Unknown option!");
+        exit(1);
       }
 
     return 0;
diff --git a/contrib/vstudio/readme.txt b/contrib/vstudio/readme.txt
index c22ec34..3a4b85c 100644
--- a/contrib/vstudio/readme.txt
+++ b/contrib/vstudio/readme.txt
@@ -1,22 +1,55 @@
-For create the 16 and 32 bits DLL of Zlib 1.20

+Building instructions for the DLL versions of Zlib 1.21

+=======================================================

 

-For the 16 bits :

-unzip zlib120.zip and copy file from contrib\vstudio\vc15_16 and from contrib\minizip in the same directory

-open zlib16.mak with Microsoft Visual C++ 1.52

+This directory contains projects that build zlib and minizip using

+Microsoft Visual C++ 7.0/7.1.

+

+You don't need to build these projects yourself. You can download the

+binaries from:

+  http://www.winimage.com/zLibDll

+

+More information can be found at this site.

 

 

-For the 32 bits :

-unzip zlib120.zip and copy file from contrib\vstudio\vc70_32 and from contrib\minizip in the same directory

-You can also need unzip http://www.winimage.com/zLibDll/crtdll.zip

-

-If you are using x86, use target Release

-open zlibvc.sln with Microsoft Visual C++ 7.0 (Visual Studio .net)

+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.

+- 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

+  (Visual Studio .Net 2002 or 2003).

 

 

-Note : You don't need recompile yourself. There is compiled .LIB in

-  http://www.winimage.com/zLibDll . See this page for more information

+Important

+---------

+- To use zlibwapi.dll in your application, you must define the

+  macro ZLIB_WINAPI when compiling your application's source files.

 

 

+Additional notes

+----------------

+- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built

+  by Gilles Vollant from the zlib 1.1.x sources, and distributed at

+    http://www.winimage.com/zLibDll

+  It uses the WINAPI calling convention for the exported functions, and

+  includes the minizip functionality. If your application needs that

+  particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll.

+

+- The new DLL was renamed because there exist several incompatible

+  versions of zlib.dll on the Internet.

+

+- There is also an official DLL build of zlib, named zlib1.dll. This one

+  is exporting the functions using the CDECL convention. See the file

+  win32\DLL_FAQ.txt found in this zlib distribution.

+

+- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol

+  has a slightly different effect. To avoid compatibility problems, do

+  not define it here.

+

 

 Gilles Vollant

 info@winimage.com

diff --git a/contrib/vstudio/vc15_16/zlib16.def b/contrib/vstudio/vc15_16/zlib16.def
deleted file mode 100644
index fdae3d4..0000000
--- a/contrib/vstudio/vc15_16/zlib16.def
+++ /dev/null
@@ -1,94 +0,0 @@
-LIBRARY		"zlib"

-

-DESCRIPTION	'"""zlib data compression library"""'

-

-EXETYPE		WINDOWS

-

-VERSION		1.21

-

-CODE    PRELOAD MOVEABLE DISCARDABLE

-DATA    PRELOAD MOVEABLE SINGLE

-

-

-HEAPSIZE	32768,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

-

-        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

diff --git a/contrib/vstudio/vc15_16/zlib16.mak b/contrib/vstudio/vc15_16/zlib16.mak
deleted file mode 100644
index cb65885..0000000
--- a/contrib/vstudio/vc15_16/zlib16.mak
+++ /dev/null
@@ -1,259 +0,0 @@
-# Microsoft Visual C++ generated build script - Do not modify

-

-PROJ = ZLIB16

-DEBUG = 0

-PROGTYPE = 1

-CALLER = 

-ARGS = 

-DLLS = 

-D_RCDEFINES = -d_DEBUG

-R_RCDEFINES = -dNDEBUG

-ORIGIN = MSVC

-ORIGIN_VER = 1.00

-PROJPATH = c:\zlib\

-USEMFC = 0

-CC = cl

-CPP = cl

-CXX = cl

-CCREATEPCHFLAG = 

-CPPCREATEPCHFLAG = 

-CUSEPCHFLAG = 

-CPPUSEPCHFLAG = 

-FIRSTC = ADLER32.C   

-FIRSTCPP =             

-RC = rc

-CFLAGS_D_WDLL = /nologo /G2 /W3 /Zi /ALw /Od /D "_DEBUG" /D "WINDOWS" /D "ZLIB_DLL" /D "ZLIB_INTERNAL" /FR /GD /Fd"ZLIB.PDB"

-CFLAGS_R_WDLL = /nologo /W3 /ALw /O1 /D "NDEBUG" /D "WINDOWS" /D "ZLIB_DLL" /D "ZLIB_INTERNAL" /FR /GD 

-LFLAGS_D_WDLL = /NOLOGO /ONERROR:NOEXE /NOD /PACKC:61440 /CO /NOE /ALIGN:16 /MAP:FULL

-LFLAGS_R_WDLL = /NOLOGO /ONERROR:NOEXE /NOD /PACKC:61440 /NOE /ALIGN:16 /MAP:FULL

-LIBS_D_WDLL = oldnames libw commdlg shell olecli olesvr ldllcew

-LIBS_R_WDLL = oldnames libw commdlg shell olecli olesvr ldllcew

-RCFLAGS = /nologo

-RESFLAGS = /nologo

-RUNFLAGS = 

-DEFFILE = ZLIB16.DEF

-OBJS_EXT = 

-LIBS_EXT = 

-!if "$(DEBUG)" == "1"

-CFLAGS = $(CFLAGS_D_WDLL)

-LFLAGS = $(LFLAGS_D_WDLL)

-LIBS = $(LIBS_D_WDLL)

-MAPFILE = nul

-RCDEFINES = $(D_RCDEFINES)

-!else

-CFLAGS = $(CFLAGS_R_WDLL)

-LFLAGS = $(LFLAGS_R_WDLL)

-LIBS = $(LIBS_R_WDLL)

-MAPFILE = nul

-RCDEFINES = $(R_RCDEFINES)

-!endif

-!if [if exist MSVC.BND del MSVC.BND]

-!endif

-SBRS = ADLER32.SBR \

-		COMPRESS.SBR \

-		CRC32.SBR \

-		DEFLATE.SBR \

-		GZIO.SBR \

-		INFFAST.SBR \

-		INFLATE.SBR \

-		TREES.SBR \

-		UNCOMPR.SBR \

-		ZUTIL.SBR \

-		ZIP.SBR \

-		UNZIP.SBR \

-		INFBACK.SBR \

-		IOAPI.SBR \

-		INFTREES.SBR

-

-

-ADLER32_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-COMPRESS_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-CRC32_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\crc32.h

-

-

-DEFLATE_DEP = c:\zlib\deflate.h \

-	c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-GZIO_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-INFFAST_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\inftrees.h \

-	c:\zlib\inflate.h \

-	c:\zlib\inffast.h

-

-

-INFLATE_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\inftrees.h \

-	c:\zlib\inflate.h \

-	c:\zlib\inffast.h \

-	c:\zlib\inffixed.h

-

-

-TREES_DEP = c:\zlib\deflate.h \

-	c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\trees.h

-

-

-UNCOMPR_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-ZUTIL_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h

-

-

-ZLIB16_RCDEP = 

-

-ZIP_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\zip.h \

-	c:\zlib\ioapi.h \

-	c:\zlib\crypt.h

-

-

-UNZIP_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\unzip.h \

-	c:\zlib\ioapi.h \

-	c:\zlib\crypt.h

-

-

-INFBACK_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\inftrees.h \

-	c:\zlib\inflate.h \

-	c:\zlib\inffast.h \

-	c:\zlib\inffixed.h

-

-

-IOAPI_DEP = c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\ioapi.h

-

-

-INFTREES_DEP = c:\zlib\zutil.h \

-	c:\zlib\zlib.h \

-	c:\zlib\zconf.h \

-	c:\zlib\inftrees.h

-

-

-all:	$(PROJ).DLL $(PROJ).BSC

-

-ADLER32.OBJ:	ADLER32.C $(ADLER32_DEP)

-	$(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c ADLER32.C

-

-COMPRESS.OBJ:	COMPRESS.C $(COMPRESS_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c COMPRESS.C

-

-CRC32.OBJ:	CRC32.C $(CRC32_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c CRC32.C

-

-DEFLATE.OBJ:	DEFLATE.C $(DEFLATE_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c DEFLATE.C

-

-GZIO.OBJ:	GZIO.C $(GZIO_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c GZIO.C

-

-INFFAST.OBJ:	INFFAST.C $(INFFAST_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c INFFAST.C

-

-INFLATE.OBJ:	INFLATE.C $(INFLATE_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c INFLATE.C

-

-TREES.OBJ:	TREES.C $(TREES_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c TREES.C

-

-UNCOMPR.OBJ:	UNCOMPR.C $(UNCOMPR_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c UNCOMPR.C

-

-ZUTIL.OBJ:	ZUTIL.C $(ZUTIL_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c ZUTIL.C

-

-ZLIB16.RES:	ZLIB16.RC $(ZLIB16_RCDEP)

-	$(RC) $(RCFLAGS) $(RCDEFINES) -r ZLIB16.RC

-

-ZIP.OBJ:	ZIP.C $(ZIP_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c ZIP.C

-

-UNZIP.OBJ:	UNZIP.C $(UNZIP_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c UNZIP.C

-

-INFBACK.OBJ:	INFBACK.C $(INFBACK_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c INFBACK.C

-

-IOAPI.OBJ:	IOAPI.C $(IOAPI_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c IOAPI.C

-

-INFTREES.OBJ:	INFTREES.C $(INFTREES_DEP)

-	$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c INFTREES.C

-

-

-$(PROJ).DLL::	ZLIB16.RES

-

-$(PROJ).DLL::	ADLER32.OBJ COMPRESS.OBJ CRC32.OBJ DEFLATE.OBJ GZIO.OBJ INFFAST.OBJ \

-	INFLATE.OBJ TREES.OBJ UNCOMPR.OBJ ZUTIL.OBJ ZIP.OBJ UNZIP.OBJ INFBACK.OBJ IOAPI.OBJ \

-	INFTREES.OBJ $(OBJS_EXT) $(DEFFILE)

-	echo >NUL @<<$(PROJ).CRF

-ADLER32.OBJ +

-COMPRESS.OBJ +

-CRC32.OBJ +

-DEFLATE.OBJ +

-GZIO.OBJ +

-INFFAST.OBJ +

-INFLATE.OBJ +

-TREES.OBJ +

-UNCOMPR.OBJ +

-ZUTIL.OBJ +

-ZIP.OBJ +

-UNZIP.OBJ +

-INFBACK.OBJ +

-IOAPI.OBJ +

-INFTREES.OBJ +

-$(OBJS_EXT)

-$(PROJ).DLL

-$(MAPFILE)

-C:\MSVC\LIB\+

-C:\MSVC\MFC\LIB\+

-E:\PROGRAMFILES\MICROSOFTVISUALSTUDIO.NET\FRAMEWORKSDK\LIB\+

-$(LIBS)

-$(DEFFILE);

-<<

-	link $(LFLAGS) @$(PROJ).CRF

-	$(RC) $(RESFLAGS) ZLIB16.RES $@

-	@copy $(PROJ).CRF MSVC.BND

-	implib /nowep $(PROJ).LIB $(PROJ).DLL

-

-$(PROJ).DLL::	ZLIB16.RES

-	if not exist MSVC.BND 	$(RC) $(RESFLAGS) ZLIB16.RES $@

-

-run: $(PROJ).DLL

-	$(PROJ) $(RUNFLAGS)

-

-

-$(PROJ).BSC: $(SBRS)

-	bscmake @<<

-/o$@ $(SBRS)

-<<

diff --git a/contrib/vstudio/vc15_16/zlib16.rc b/contrib/vstudio/vc15_16/zlib16.rc
deleted file mode 100644
index 514585c..0000000
--- a/contrib/vstudio/vc15_16/zlib16.rc
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <windows.h>

-#include <ver.h>

-

-#define IDR_VERSION1  1

-IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE

-  FILEVERSION	 1,2,1,0

-  PRODUCTVERSION 1,2,1,0

-  FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK

-  FILEFLAGS	0

-  FILEOS	VOS_DOS_WINDOWS16

-  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.1\0"

-      VALUE "InternalName",	"zlib16\0"

-      VALUE "OriginalFilename",	"zlib16.dll\0"

-      VALUE "ProductName",	"ZLib16.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

diff --git a/contrib/vstudio/vc70_32/gvmat32.obj b/contrib/vstudio/vc7/gvmat32.obj
similarity index 100%
rename from contrib/vstudio/vc70_32/gvmat32.obj
rename to contrib/vstudio/vc7/gvmat32.obj
Binary files differ
diff --git a/contrib/vstudio/vc7/inffas32.obj b/contrib/vstudio/vc7/inffas32.obj
new file mode 100644
index 0000000..a541a5a
--- /dev/null
+++ b/contrib/vstudio/vc7/inffas32.obj
Binary files differ
diff --git a/contrib/vstudio/vc70_32/miniunz.vcproj b/contrib/vstudio/vc7/miniunz.vcproj
similarity index 94%
rename from contrib/vstudio/vc70_32/miniunz.vcproj
rename to contrib/vstudio/vc7/miniunz.vcproj
index 1c6967f..935c250 100644
--- a/contrib/vstudio/vc70_32/miniunz.vcproj
+++ b/contrib/vstudio/vc7/miniunz.vcproj
@@ -19,7 +19,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				Optimization="0"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;_DEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"

 				MinimalRebuild="TRUE"

 				BasicRuntimeChecks="3"

 				RuntimeLibrary="5"

@@ -63,7 +63,7 @@
 				Optimization="2"

 				InlineFunctionExpansion="1"

 				OmitFramePointers="TRUE"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;NDEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"

 				StringPooling="TRUE"

 				RuntimeLibrary="4"

 				EnableFunctionLevelLinking="TRUE"

@@ -116,7 +116,7 @@
 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">

 		</Filter>

 		<File

-			RelativePath="zlib.lib">

+			RelativePath="zlibwapi.lib">

 		</File>

 	</Files>

 	<Globals>

diff --git a/contrib/vstudio/vc70_32/minizip.vcproj b/contrib/vstudio/vc7/minizip.vcproj
similarity index 94%
rename from contrib/vstudio/vc70_32/minizip.vcproj
rename to contrib/vstudio/vc7/minizip.vcproj
index 93e2a41..e6f9107 100644
--- a/contrib/vstudio/vc70_32/minizip.vcproj
+++ b/contrib/vstudio/vc7/minizip.vcproj
@@ -19,7 +19,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				Optimization="0"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;_DEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"

 				MinimalRebuild="TRUE"

 				BasicRuntimeChecks="3"

 				RuntimeLibrary="5"

@@ -63,7 +63,7 @@
 				Optimization="2"

 				InlineFunctionExpansion="1"

 				OmitFramePointers="TRUE"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL;NDEBUG;_CONSOLE"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"

 				StringPooling="TRUE"

 				RuntimeLibrary="4"

 				EnableFunctionLevelLinking="TRUE"

@@ -116,7 +116,7 @@
 			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">

 		</Filter>

 		<File

-			RelativePath="zlib.lib">

+			RelativePath="zlibwapi.lib">

 		</File>

 	</Files>

 	<Globals>

diff --git a/contrib/vstudio/vc70_32/zlib.rc b/contrib/vstudio/vc7/zlib.rc
similarity index 100%
rename from contrib/vstudio/vc70_32/zlib.rc
rename to contrib/vstudio/vc7/zlib.rc
diff --git a/contrib/vstudio/vc70_32/zlibstat.vcproj b/contrib/vstudio/vc7/zlibstat.vcproj
similarity index 91%
rename from contrib/vstudio/vc70_32/zlibstat.vcproj
rename to contrib/vstudio/vc7/zlibstat.vcproj
index 7470b58..eb182f7 100644
--- a/contrib/vstudio/vc70_32/zlibstat.vcproj
+++ b/contrib/vstudio/vc7/zlibstat.vcproj
@@ -20,7 +20,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				Optimization="0"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="5"

 				PrecompiledHeaderFile=".\zlibstatDebug/zlibstat.pch"

@@ -61,7 +61,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="4"

@@ -102,7 +102,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL,ASMV"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI;ASMV;ASMINF"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="4"

@@ -117,7 +117,7 @@
 				Name="VCCustomBuildTool"/>

 			<Tool

 				Name="VCLibrarianTool"

-				AdditionalOptions="gvmat32.obj  inffastAsm.obj /NODEFAULTLIB "

+				AdditionalOptions="gvmat32.obj inffas32.obj /NODEFAULTLIB "

 				OutputFile=".\zlibstat\zlibstat.lib"

 				SuppressStartupBanner="TRUE"/>

 			<Tool

@@ -144,7 +144,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32;ZLIB_DLL"

+				PreprocessorDefinitions="WIN32;ZLIB_WINAPI"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="4"

@@ -204,17 +204,6 @@
 			</File>

 			<File

 				RelativePath=".\inffast.c">

-				<FileConfiguration

-					Name="Release|Win32"

-					ExcludedFromBuild="TRUE">

-					<Tool

-						Name="VCCLCompilerTool"/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="ReleaseWithoutAsm|Win32">

-					<Tool

-						Name="VCCLCompilerTool"/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath=".\inflate.c">

diff --git a/contrib/vstudio/vc70_32/zlibvc.def b/contrib/vstudio/vc7/zlibvc.def
similarity index 94%
rename from contrib/vstudio/vc70_32/zlibvc.def
rename to contrib/vstudio/vc7/zlibvc.def
index c2804a8..63b3e6d 100644
--- a/contrib/vstudio/vc70_32/zlibvc.def
+++ b/contrib/vstudio/vc7/zlibvc.def
@@ -1,4 +1,3 @@
-LIBRARY		"zlib"

 

 VERSION		1.21

 

@@ -51,6 +50,10 @@
         inflateBack                              @44

         inflateBackEnd                           @45

         compressBound                            @46

+        deflateBound                             @47

+        gzclearerr                               @48

+        gzungetc                                 @49

+        zlibCompileFlags                         @50

 

         unzOpen                                  @61

         unzClose                                 @62

diff --git a/contrib/vstudio/vc70_32/zlibvc.sln b/contrib/vstudio/vc7/zlibvc.sln
similarity index 100%
rename from contrib/vstudio/vc70_32/zlibvc.sln
rename to contrib/vstudio/vc7/zlibvc.sln
diff --git a/contrib/vstudio/vc70_32/zlibvc.vcproj b/contrib/vstudio/vc7/zlibvc.vcproj
similarity index 86%
rename from contrib/vstudio/vc70_32/zlibvc.vcproj
rename to contrib/vstudio/vc7/zlibvc.vcproj
index 7a9e83a..4e57bcd 100644
--- a/contrib/vstudio/vc70_32/zlibvc.vcproj
+++ b/contrib/vstudio/vc7/zlibvc.vcproj
@@ -20,7 +20,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				Optimization="0"

-				PreprocessorDefinitions="WIN32,ZLIB_DLL,ASMV"

+				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="1"

 				PrecompiledHeaderFile=".\DebugDll/zlibvc.pch"

@@ -35,15 +35,15 @@
 			<Tool

 				Name="VCLinkerTool"

 				AdditionalOptions="/MACHINE:I386"

-				AdditionalDependencies="gvmat32.obj "

-				OutputFile=".\DebugDll\zlib.dll"

+				AdditionalDependencies="gvmat32.obj inffas32.obj"

+				OutputFile=".\DebugDll\zlibwapi.dll"

 				LinkIncremental="2"

 				SuppressStartupBanner="TRUE"

 				ModuleDefinitionFile=".\zlibvc.def"

 				GenerateDebugInformation="TRUE"

-				ProgramDatabaseFile=".\DebugDll/zlib.pdb"

+				ProgramDatabaseFile=".\DebugDll/zlibwapi.pdb"

 				SubSystem="2"

-				ImportLibrary=".\DebugDll/zlib.lib"/>

+				ImportLibrary=".\DebugDll/zlibwapi.lib"/>

 			<Tool

 				Name="VCMIDLTool"

 				PreprocessorDefinitions="_DEBUG"

@@ -76,7 +76,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32,ZLIB_DLL"

+				PreprocessorDefinitions="WIN32,ZLIB_WINAPI"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="0"

@@ -95,17 +95,17 @@
 				Name="VCLinkerTool"

 				AdditionalOptions="/MACHINE:I386"

 				AdditionalDependencies="crtdll.lib"

-				OutputFile=".\zlibDllWithoutAsm\zlib.dll"

+				OutputFile=".\zlibDllWithoutAsm\zlibwapi.dll"

 				LinkIncremental="1"

 				SuppressStartupBanner="TRUE"

 				IgnoreAllDefaultLibraries="TRUE"

 				ModuleDefinitionFile=".\zlibvc.def"

-				ProgramDatabaseFile=".\zlibDllWithoutAsm/zlib.pdb"

+				ProgramDatabaseFile=".\zlibDllWithoutAsm/zlibwapi.pdb"

 				GenerateMapFile="TRUE"

-				MapFileName=".\zlibDllWithoutAsm/zlib.map"

+				MapFileName=".\zlibDllWithoutAsm/zlibwapi.map"

 				SubSystem="2"

 				OptimizeForWindows98="1"

-				ImportLibrary=".\zlibDllWithoutAsm/zlib.lib"/>

+				ImportLibrary=".\zlibDllWithoutAsm/zlibwapi.lib"/>

 			<Tool

 				Name="VCMIDLTool"

 				PreprocessorDefinitions="NDEBUG"

@@ -138,7 +138,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32,ZLIB_DLL,ASMV"

+				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="0"

@@ -156,18 +156,18 @@
 			<Tool

 				Name="VCLinkerTool"

 				AdditionalOptions="/MACHINE:I386"

-				AdditionalDependencies="gvmat32.obj inffastAsm.obj "

-				OutputFile=".\zlibDllWithoutCrtDll\zlib.dll"

+				AdditionalDependencies="gvmat32.obj inffas32.obj "

+				OutputFile=".\zlibDllWithoutCrtDll\zlibwapi.dll"

 				LinkIncremental="1"

 				SuppressStartupBanner="TRUE"

 				IgnoreAllDefaultLibraries="FALSE"

 				ModuleDefinitionFile=".\zlibvc.def"

-				ProgramDatabaseFile=".\zlibDllWithoutCrtDll/zlib.pdb"

+				ProgramDatabaseFile=".\zlibDllWithoutCrtDll/zlibwapi.pdb"

 				GenerateMapFile="TRUE"

-				MapFileName=".\zlibDllWithoutCrtDll/zlib.map"

+				MapFileName=".\zlibDllWithoutCrtDll/zlibwapi.map"

 				SubSystem="2"

 				OptimizeForWindows98="1"

-				ImportLibrary=".\zlibDllWithoutCrtDll/zlib.lib"/>

+				ImportLibrary=".\zlibDllWithoutCrtDll/zlibwapi.lib"/>

 			<Tool

 				Name="VCMIDLTool"

 				PreprocessorDefinitions="NDEBUG"

@@ -200,7 +200,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32,ZLIB_DLL"

+				PreprocessorDefinitions="WIN32,ZLIB_WINAPI"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="0"

@@ -218,16 +218,16 @@
 			<Tool

 				Name="VCLinkerTool"

 				AdditionalDependencies="crtdll.lib"

-				OutputFile="zlibvc__\zlib.dll"

+				OutputFile="zlibvc__\zlibwapi.dll"

 				LinkIncremental="1"

 				SuppressStartupBanner="TRUE"

 				IgnoreAllDefaultLibraries="TRUE"

 				ModuleDefinitionFile=".\zlibvc.def"

-				ProgramDatabaseFile=".\zlibvc__/zlib.pdb"

+				ProgramDatabaseFile=".\zlibvc__/zlibwapi.pdb"

 				GenerateMapFile="TRUE"

-				MapFileName=".\zlibvc__/zlib.map"

+				MapFileName=".\zlibvc__/zlibwapi.map"

 				SubSystem="2"

-				ImportLibrary=".\zlibvc__/zlib.lib"/>

+				ImportLibrary=".\zlibvc__/zlibwapi.lib"/>

 			<Tool

 				Name="VCMIDLTool"

 				PreprocessorDefinitions="NDEBUG"

@@ -260,7 +260,7 @@
 			<Tool

 				Name="VCCLCompilerTool"

 				InlineFunctionExpansion="1"

-				PreprocessorDefinitions="WIN32,ZLIB_DLL,ASMV"

+				PreprocessorDefinitions="WIN32,ZLIB_WINAPI,ASMV,ASMINF"

 				StringPooling="TRUE"

 				ExceptionHandling="FALSE"

 				RuntimeLibrary="0"

@@ -278,18 +278,18 @@
 			<Tool

 				Name="VCLinkerTool"

 				AdditionalOptions="/MACHINE:I386"

-				AdditionalDependencies="gvmat32.obj inffastAsm.obj crtdll.lib"

-				OutputFile=".\ReleaseDll\zlib.dll"

+				AdditionalDependencies="gvmat32.obj inffas32.obj crtdll.lib"

+				OutputFile=".\ReleaseDll\zlibwapi.dll"

 				LinkIncremental="1"

 				SuppressStartupBanner="TRUE"

 				IgnoreAllDefaultLibraries="TRUE"

 				ModuleDefinitionFile=".\zlibvc.def"

-				ProgramDatabaseFile=".\ReleaseDll/zlib.pdb"

+				ProgramDatabaseFile=".\ReleaseDll/zlibwapi.pdb"

 				GenerateMapFile="TRUE"

-				MapFileName=".\ReleaseDll/zlib.map"

+				MapFileName=".\ReleaseDll/zlibwapi.map"

 				SubSystem="2"

 				OptimizeForWindows98="1"

-				ImportLibrary=".\ReleaseDll/zlib.lib"/>

+				ImportLibrary=".\ReleaseDll/zlibwapi.lib"/>

 			<Tool

 				Name="VCMIDLTool"

 				PreprocessorDefinitions="NDEBUG"

@@ -346,18 +346,6 @@
 			</File>

 			<File

 				RelativePath=".\inffast.c">

-				<FileConfiguration

-					Name="ReleaseWithoutCrtdll|Win32"

-					ExcludedFromBuild="TRUE">

-					<Tool

-						Name="VCCLCompilerTool"/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					ExcludedFromBuild="TRUE">

-					<Tool

-						Name="VCCLCompilerTool"/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath=".\inflate.c">

diff --git a/contrib/vstudio/vc70_32/inffastAsm.asm b/contrib/vstudio/vc70_32/inffastAsm.asm
deleted file mode 100644
index f4b6a56..0000000
--- a/contrib/vstudio/vc70_32/inffastAsm.asm
+++ /dev/null
@@ -1,1020 +0,0 @@
-; 75 "inffast.S"

-;FILE "inffast.S"

-

-;;;GLOBAL _inflate_fast

-

-;;;SECTION .text

-

-

-

-    .586p

-    .mmx

-

-    name    inflate_fast_x86

-    .MODEL  FLAT

-

-_DATA                   segment

-inflate_fast_use_mmx: 

-dd    1

-

-

-_TEXT                   segment

-PUBLIC _inflate_fast

-

-ALIGN 4

-_inflate_fast: 

-        jmp inflate_fast_entry

-

-

-

-ALIGN 4

-        db     'Fast decoding Code from Chris Anderson'

-        db      0

-

-ALIGN 4

-invalid_literal_length_code_msg: 

-        db      'invalid literal/length code'

-        db      0

-

-ALIGN 4

-invalid_distance_code_msg: 

-        db      'invalid distance code'

-        db      0

-

-ALIGN 4

-invalid_distance_too_far_msg: 

-        db      'invalid distance too far back'

-        db      0

-

-

-ALIGN 4

-inflate_fast_mask: 

-dd    0

-dd    1

-dd    3

-dd    7

-dd    15

-dd    31

-dd    63

-dd    127

-dd    255

-dd    511

-dd    1023

-dd    2047

-dd    4095

-dd    8191

-dd    16383

-dd    32767

-dd    65535

-dd    131071

-dd    262143

-dd    524287

-dd    1048575

-dd    2097151

-dd    4194303

-dd    8388607

-dd    16777215

-dd    33554431

-dd    67108863

-dd    134217727

-dd    268435455

-dd    536870911

-dd    1073741823

-dd    2147483647

-dd    4294967295

-

-

-;;SECTION .text

-; 205 "inffast.S"

-;GLOBAL inflate_fast_use_mmx

-

-;SECTION .data

-

-

-; GLOBAL inflate_fast_use_mmx:object

-;.size inflate_fast_use_mmx, 4

-; 226 "inffast.S"

-;SECTION .text

-

-ALIGN 4 

-inflate_fast_entry: 

-        push  edi

-        push  esi

-        push  ebp

-        push  ebx

-        pushfd

-        sub  esp,64

-        cld

-

-

-

-

-        mov  esi, [esp+88]

-        mov  edi, [esi+28]

-

-

-

-

-

-

-

-        mov  edx, [esi+4]

-        mov  eax, [esi+0]

-

-        add  edx,eax

-        sub  edx,11

-

-        mov  [esp+44],eax

-        mov  [esp+20],edx

-

-        mov  ebp, [esp+92]

-        mov  ecx, [esi+16]

-        mov  ebx, [esi+12]

-

-        sub  ebp,ecx

-        neg  ebp

-        add  ebp,ebx

-

-        sub  ecx,257

-        add  ecx,ebx

-

-        mov  [esp+60],ebx

-        mov  [esp+40],ebp

-        mov  [esp+16],ecx

-; 285 "inffast.S"

-        mov  eax, [edi+64]

-        mov  ecx, [edi+68]

-

-        mov  [esp+8],eax

-        mov  [esp+12],ecx

-

-        mov  eax,1

-        mov  ecx, [edi+72]

-        shl  eax,cl

-        dec  eax

-        mov  [esp+0],eax

-

-        mov  eax,1

-        mov  ecx, [edi+76]

-        shl  eax,cl

-        dec  eax

-        mov  [esp+4],eax

-

-        mov  eax, [edi+32]

-        mov  ecx, [edi+36]

-        mov  edx, [edi+40]

-

-        mov  [esp+52],eax

-        mov  [esp+48],ecx

-        mov  [esp+56],edx

-

-        mov  ebp, [edi+44]

-        mov  ebx, [edi+48]

-; 321 "inffast.S"

-        mov  esi, [esp+44]

-        mov  ecx, [esp+20]

-        cmp  ecx,esi

-        ja   L_align_long

-

-        add  ecx,11

-        sub  ecx,esi

-        mov  eax,12

-        sub  eax,ecx

-        lea  edi, [esp+28]

-        rep movsb

-        mov  ecx,eax

-        xor  eax,eax

-        rep stosb

-        lea  esi, [esp+28]

-        mov  [esp+20],esi

-        jmp  L_is_aligned

-

-

-L_align_long: 

-        test  esi,3

-        jz   L_is_aligned

-        xor  eax,eax

-        mov  al, [esi]

-        inc  esi

-        mov  ecx,ebx

-        add  ebx,8

-        shl  eax,cl

-        or  ebp,eax

-        jmp L_align_long

-

-L_is_aligned: 

-        mov  edi, [esp+60]

-; 366 "inffast.S"

-L_check_mmx: 

-        cmp  dword ptr [inflate_fast_use_mmx],2

-        je   L_init_mmx

-        ja   L_do_loop

-

-        push  eax

-        push  ebx

-        push  ecx

-        push  edx

-        pushfd

-        mov  eax, [esp]

-        xor  dword ptr [esp],0200000h

-

-

-

-

-        popfd

-        pushfd

-        pop  edx

-        xor  edx,eax

-        jz   L_dont_use_mmx

-        xor  eax,eax

-        cpuid

-        cmp  ebx,0756e6547h

-        jne  L_dont_use_mmx

-        cmp  ecx,06c65746eh

-        jne  L_dont_use_mmx

-        cmp  edx,049656e69h

-        jne  L_dont_use_mmx

-        mov  eax,1

-        cpuid

-        shr  eax,8

-        and  eax,15

-        cmp  eax,6

-        jne  L_dont_use_mmx

-        test  edx,0800000h

-        jnz  L_use_mmx

-        jmp  L_dont_use_mmx

-L_use_mmx: 

-        mov  dword ptr [inflate_fast_use_mmx],2

-        jmp  L_check_mmx_pop

-L_dont_use_mmx: 

-        mov  dword ptr [inflate_fast_use_mmx],3

-L_check_mmx_pop: 

-        pop  edx

-        pop  ecx

-        pop  ebx

-        pop  eax

-        jmp  L_check_mmx

-; 426 "inffast.S"

-ALIGN 4

-L_do_loop: 

-; 437 "inffast.S"

-        cmp  bl,15

-        ja   L_get_length_code

-

-        xor  eax,eax

-        lodsw

-        mov  cl,bl

-        add  bl,16

-        shl  eax,cl

-        or  ebp,eax

-

-L_get_length_code: 

-        mov  edx, [esp+0]

-        mov  ecx, [esp+8]

-        and  edx,ebp

-        mov  eax, [ecx+edx*4]

-

-L_dolen: 

-

-

-

-

-

-

-        mov  cl,ah

-        sub  bl,ah

-        shr  ebp,cl

-

-

-

-

-

-

-        test  al,al

-        jnz   L_test_for_length_base

-

-        shr  eax,16

-        stosb

-

-L_while_test: 

-

-

-        cmp  [esp+16],edi

-        jbe  L_break_loop

-

-        cmp  [esp+20],esi

-        ja   L_do_loop

-        jmp  L_break_loop

-

-L_test_for_length_base: 

-; 502 "inffast.S"

-        mov  edx,eax

-        shr  edx,16

-        mov  cl,al

-

-        test  al,16

-        jz   L_test_for_second_level_length

-        and  cl,15

-        jz   L_save_len

-        cmp  bl,cl

-        jae  L_add_bits_to_len

-

-        mov  ch,cl

-        xor  eax,eax

-        lodsw

-        mov  cl,bl

-        add  bl,16

-        shl  eax,cl

-        or  ebp,eax

-        mov  cl,ch

-

-L_add_bits_to_len: 

-        mov  eax,1

-        shl  eax,cl

-        dec  eax

-        sub  bl,cl

-        and  eax,ebp

-        shr  ebp,cl

-        add  edx,eax

-

-L_save_len: 

-        mov  [esp+24],edx

-

-

-L_decode_distance: 

-; 549 "inffast.S"

-        cmp  bl,15

-        ja   L_get_distance_code

-

-        xor  eax,eax

-        lodsw

-        mov  cl,bl

-        add  bl,16

-        shl  eax,cl

-        or  ebp,eax

-

-L_get_distance_code: 

-        mov  edx, [esp+4]

-        mov  ecx, [esp+12]

-        and  edx,ebp

-        mov  eax, [ecx+edx*4]

-

-

-L_dodist: 

-        mov  edx,eax

-        shr  edx,16

-        mov  cl,ah

-        sub  bl,ah

-        shr  ebp,cl

-; 584 "inffast.S"

-        mov  cl,al

-

-        test  al,16

-        jz  L_test_for_second_level_dist

-        and  cl,15

-        jz  L_check_dist_one

-        cmp  bl,cl

-        jae  L_add_bits_to_dist

-

-        mov  ch,cl

-        xor  eax,eax

-        lodsw

-        mov  cl,bl

-        add  bl,16

-        shl  eax,cl

-        or  ebp,eax

-        mov  cl,ch

-

-L_add_bits_to_dist: 

-        mov  eax,1

-        shl  eax,cl

-        dec  eax

-        sub  bl,cl

-        and  eax,ebp

-        shr  ebp,cl

-        add  edx,eax

-        jmp  L_check_window

-

-L_check_window: 

-; 625 "inffast.S"

-        mov  [esp+44],esi

-        mov  eax,edi

-        sub  eax, [esp+40]

-

-        cmp  eax,edx

-        jb   L_clip_window

-

-        mov  ecx, [esp+24]

-        mov  esi,edi

-        sub  esi,edx

-

-        sub  ecx,3

-        mov  al, [esi]

-        mov  [edi],al

-        mov  al, [esi+1]

-        mov  dl, [esi+2]

-        add  esi,3

-        mov  [edi+1],al

-        mov  [edi+2],dl

-        add  edi,3

-        rep movsb

-

-        mov  esi, [esp+44]

-        jmp  L_while_test

-

-ALIGN 4

-L_check_dist_one: 

-        cmp  edx,1

-        jne  L_check_window

-        cmp  [esp+40],edi

-        je  L_check_window

-

-        dec  edi

-        mov  ecx, [esp+24]

-        mov  al, [edi]

-        sub  ecx,3

-

-        mov  [edi+1],al

-        mov  [edi+2],al

-        mov  [edi+3],al

-        add  edi,4

-        rep stosb

-

-        jmp  L_while_test

-

-ALIGN 4

-L_test_for_second_level_length: 

-

-

-

-

-        test  al,64

-        jnz   L_test_for_end_of_block

-

-        mov  eax,1

-        shl  eax,cl

-        dec  eax

-        and  eax,ebp

-        add  eax,edx

-        mov  edx, [esp+8]

-        mov  eax, [edx+eax*4]

-        jmp  L_dolen

-

-ALIGN 4

-L_test_for_second_level_dist: 

-

-

-

-

-        test  al,64

-        jnz   L_invalid_distance_code

-

-        mov  eax,1

-        shl  eax,cl

-        dec  eax

-        and  eax,ebp

-        add  eax,edx

-        mov  edx, [esp+12]

-        mov  eax, [edx+eax*4]

-        jmp  L_dodist

-

-ALIGN 4 

-L_clip_window: 

-; 721 "inffast.S"

-        mov  ecx,eax

-        mov  eax, [esp+52]

-        neg  ecx

-        mov  esi, [esp+56]

-

-        cmp  eax,edx

-        jb   L_invalid_distance_too_far

-

-        add  ecx,edx

-        cmp  dword ptr [esp+48],0

-        jne  L_wrap_around_window

-

-        sub  eax,ecx

-        add  esi,eax

-; 749 "inffast.S"

-        mov  eax, [esp+24]

-        cmp  eax,ecx

-        jbe  L_do_copy1

-

-        sub  eax,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,edx

-        jmp  L_do_copy1

-

-        cmp  eax,ecx

-        jbe  L_do_copy1

-

-        sub  eax,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,edx

-        jmp  L_do_copy1

-

-L_wrap_around_window: 

-; 793 "inffast.S"

-        mov  eax, [esp+48]

-        cmp  ecx,eax

-        jbe  L_contiguous_in_window

-

-        add  esi, [esp+52]

-        add  esi,eax

-        sub  esi,ecx

-        sub  ecx,eax

-

-

-        mov  eax, [esp+24]

-        cmp  eax,ecx

-        jbe  L_do_copy1

-

-        sub  eax,ecx

-        rep movsb

-        mov  esi, [esp+56]

-        mov  ecx, [esp+48]

-        cmp  eax,ecx

-        jbe  L_do_copy1

-

-        sub  eax,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,edx

-        jmp  L_do_copy1

-

-L_contiguous_in_window: 

-; 836 "inffast.S"

-        add  esi,eax

-        sub  esi,ecx

-

-

-        mov  eax, [esp+24]

-        cmp  eax,ecx

-        jbe  L_do_copy1

-

-        sub  eax,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,edx

-

-L_do_copy1: 

-; 862 "inffast.S"

-        mov  ecx,eax

-        rep movsb

-

-        mov  esi, [esp+44]

-        jmp  L_while_test

-; 878 "inffast.S"

-ALIGN 4

-L_init_mmx: 

-        emms

-

-

-

-

-

-        movd mm0,ebp

-        mov  ebp,ebx

-; 896 "inffast.S"

-        movd mm4,[esp+0]

-        movq mm3,mm4

-        movd mm5,[esp+4]

-        movq mm2,mm5

-        pxor mm1,mm1

-        mov  ebx, [esp+8]

-        jmp  L_do_loop_mmx

-

-ALIGN 4

-L_do_loop_mmx: 

-        psrlq mm0,mm1

-

-        cmp  ebp,32

-        ja  L_get_length_code_mmx

-

-        movd mm6,ebp

-        movd mm7,[esi]

-        add  esi,4

-        psllq mm7,mm6

-        add  ebp,32

-        por mm0,mm7

-

-L_get_length_code_mmx: 

-        pand mm4,mm0

-        movd eax,mm4

-        movq mm4,mm3

-        mov  eax, [ebx+eax*4]

-

-L_dolen_mmx: 

-        movzx  ecx,ah

-        movd mm1,ecx

-        sub  ebp,ecx

-

-        test  al,al

-        jnz L_test_for_length_base_mmx

-

-        shr  eax,16

-        stosb

-

-L_while_test_mmx: 

-

-

-        cmp  [esp+16],edi

-        jbe L_break_loop

-

-        cmp  [esp+20],esi

-        ja L_do_loop_mmx

-        jmp L_break_loop

-

-L_test_for_length_base_mmx: 

-

-        mov  edx,eax

-        shr  edx,16

-

-        test  al,16

-        jz  L_test_for_second_level_length_mmx

-        and  eax,15

-        jz L_decode_distance_mmx

-

-        psrlq mm0,mm1

-        movd mm1,eax

-        movd ecx,mm0

-        sub  ebp,eax

-        and  ecx, [inflate_fast_mask+eax*4]

-        add  edx,ecx

-

-L_decode_distance_mmx: 

-        psrlq mm0,mm1

-

-        cmp  ebp,32

-        ja L_get_dist_code_mmx

-

-        movd mm6,ebp

-        movd mm7,[esi]

-        add  esi,4

-        psllq mm7,mm6

-        add  ebp,32

-        por mm0,mm7

-

-L_get_dist_code_mmx: 

-        mov  ebx, [esp+12]

-        pand mm5,mm0

-        movd eax,mm5

-        movq mm5,mm2

-        mov  eax, [ebx+eax*4]

-

-L_dodist_mmx: 

-

-        movzx  ecx,ah

-        mov  ebx,eax

-        shr  ebx,16

-        sub  ebp,ecx

-        movd mm1,ecx

-

-        test  al,16

-        jz L_test_for_second_level_dist_mmx

-        and  eax,15

-        jz L_check_dist_one_mmx

-

-L_add_bits_to_dist_mmx: 

-        psrlq mm0,mm1

-        movd mm1,eax

-        movd ecx,mm0

-        sub  ebp,eax

-        and  ecx, [inflate_fast_mask+eax*4]

-        add  ebx,ecx

-

-L_check_window_mmx: 

-        mov  [esp+44],esi

-        mov  eax,edi

-        sub  eax, [esp+40]

-

-        cmp  eax,ebx

-        jb L_clip_window_mmx

-

-        mov  ecx,edx

-        mov  esi,edi

-        sub  esi,ebx

-

-        sub  ecx,3

-        mov  al, [esi]

-        mov  [edi],al

-        mov  al, [esi+1]

-        mov  dl, [esi+2]

-        add  esi,3

-        mov  [edi+1],al

-        mov  [edi+2],dl

-        add  edi,3

-        rep movsb

-

-        mov  esi, [esp+44]

-        mov  ebx, [esp+8]

-        jmp  L_while_test_mmx

-

-ALIGN 4

-L_check_dist_one_mmx: 

-        cmp  ebx,1

-        jne  L_check_window_mmx

-        cmp  [esp+40],edi

-        je   L_check_window_mmx

-

-        dec  edi

-        mov  ecx,edx

-        mov  al, [edi]

-        sub  ecx,3

-

-        mov  [edi+1],al

-        mov  [edi+2],al

-        mov  [edi+3],al

-        add  edi,4

-        rep stosb

-

-        mov  ebx, [esp+8]

-        jmp  L_while_test_mmx

-

-ALIGN 4

-L_test_for_second_level_length_mmx: 

-        test  al,64

-        jnz L_test_for_end_of_block

-

-        and  eax,15

-        psrlq mm0,mm1

-        movd ecx,mm0

-        and  ecx, [inflate_fast_mask+eax*4]

-        add  ecx,edx

-        mov  eax, [ebx+ecx*4]

-        jmp L_dolen_mmx

-

-ALIGN 4

-L_test_for_second_level_dist_mmx: 

-        test  al,64

-        jnz L_invalid_distance_code

-

-        and  eax,15

-        psrlq mm0,mm1

-        movd ecx,mm0

-        and  ecx, [inflate_fast_mask+eax*4]

-        mov  eax, [esp+12]

-        add  ecx,ebx

-        mov  eax, [eax+ecx*4]

-        jmp  L_dodist_mmx

-

-ALIGN 4

-L_clip_window_mmx: 

-

-        mov  ecx,eax

-        mov  eax, [esp+52]

-        neg  ecx

-        mov  esi, [esp+56]

-

-        cmp  eax,ebx

-        jb  L_invalid_distance_too_far

-

-        add  ecx,ebx

-        cmp  dword ptr [esp+48],0

-        jne  L_wrap_around_window_mmx

-

-        sub  eax,ecx

-        add  esi,eax

-

-        cmp  edx,ecx

-        jbe  L_do_copy1_mmx

-

-        sub  edx,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,ebx

-        jmp  L_do_copy1_mmx

-

-        cmp  edx,ecx

-        jbe  L_do_copy1_mmx

-

-        sub  edx,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,ebx

-        jmp  L_do_copy1_mmx

-

-L_wrap_around_window_mmx: 

-

-        mov  eax, [esp+48]

-        cmp  ecx,eax

-        jbe  L_contiguous_in_window_mmx

-

-        add  esi, [esp+52]

-        add  esi,eax

-        sub  esi,ecx

-        sub  ecx,eax

-

-

-        cmp  edx,ecx

-        jbe  L_do_copy1_mmx

-

-        sub  edx,ecx

-        rep movsb

-        mov  esi, [esp+56]

-        mov  ecx, [esp+48]

-        cmp  edx,ecx

-        jbe  L_do_copy1_mmx

-

-        sub  edx,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,ebx

-        jmp  L_do_copy1_mmx

-

-L_contiguous_in_window_mmx: 

-

-        add  esi,eax

-        sub  esi,ecx

-

-

-        cmp  edx,ecx

-        jbe  L_do_copy1_mmx

-

-        sub  edx,ecx

-        rep movsb

-        mov  esi,edi

-        sub  esi,ebx

-

-L_do_copy1_mmx: 

-

-

-        mov  ecx,edx

-        rep movsb

-

-        mov  esi, [esp+44]

-        mov  ebx, [esp+8]

-        jmp  L_while_test_mmx

-; 1174 "inffast.S"

-L_invalid_distance_code: 

-

-

-

-

-

-        mov  ecx, invalid_distance_code_msg

-        mov  edx,26

-        jmp  L_update_stream_state

-

-L_test_for_end_of_block: 

-

-

-

-

-

-        test  al,32

-        jz  L_invalid_literal_length_code

-

-        mov  ecx,0

-        mov  edx,11

-        jmp  L_update_stream_state

-

-L_invalid_literal_length_code: 

-

-

-

-

-

-        mov  ecx, invalid_literal_length_code_msg

-        mov  edx,26

-        jmp  L_update_stream_state

-

-L_invalid_distance_too_far: 

-

-

-

-        mov  esi, [esp+44]

-        mov  ecx, invalid_distance_too_far_msg

-        mov  edx,26

-        jmp  L_update_stream_state

-

-L_update_stream_state: 

-

-        mov  eax, [esp+88]

-        test  ecx,ecx

-        jz  L_skip_msg

-        mov  [eax+24],ecx

-L_skip_msg: 

-        mov  eax, [eax+28]

-        mov  [eax+0],edx

-        jmp  L_break_loop

-

-ALIGN 4

-L_break_loop: 

-; 1243 "inffast.S"

-        cmp  dword ptr [inflate_fast_use_mmx],2

-        jne  L_update_next_in

-

-

-

-        mov  ebx,ebp

-

-L_update_next_in: 

-; 1266 "inffast.S"

-        mov  eax, [esp+88]

-        mov  ecx,ebx

-        mov  edx, [eax+28]

-        shr  ecx,3

-        sub  esi,ecx

-        shl  ecx,3

-        sub  ebx,ecx

-        mov  [eax+12],edi

-        mov  [edx+48],ebx

-        mov  ecx,ebx

-

-        lea  ebx, [esp+28]

-        cmp  [esp+20],ebx

-        jne  L_buf_not_used

-

-        sub  esi,ebx

-        mov  ebx, [eax+0]

-        mov  [esp+20],ebx

-        add  esi,ebx

-        mov  ebx, [eax+4]

-        sub  ebx,11

-        add  [esp+20],ebx

-

-L_buf_not_used: 

-        mov  [eax+0],esi

-

-        mov  ebx,1

-        shl  ebx,cl

-        dec  ebx

-

-

-

-

-

-        cmp  dword ptr [inflate_fast_use_mmx],2

-        jne  L_update_hold

-

-

-

-        psrlq mm0,mm1

-        movd ebp,mm0

-

-        emms

-

-L_update_hold: 

-

-

-

-        and  ebp,ebx

-        mov  [edx+44],ebp

-

-

-

-

-        mov  ebx, [esp+20]

-        cmp  ebx,esi

-        jbe  L_last_is_smaller

-

-        sub  ebx,esi

-        add  ebx,11

-        mov  [eax+4],ebx

-        jmp  L_fixup_out

-L_last_is_smaller: 

-        sub  esi,ebx

-        neg  esi

-        add  esi,11

-        mov  [eax+4],esi

-

-

-

-

-L_fixup_out: 

-

-        mov  ebx, [esp+16]

-        cmp  ebx,edi

-        jbe  L_end_is_smaller

-

-        sub  ebx,edi

-        add  ebx,257

-        mov  [eax+16],ebx

-        jmp  L_done

-L_end_is_smaller: 

-        sub  edi,ebx

-        neg  edi

-        add  edi,257

-        mov  [eax+16],edi

-

-

-

-

-

-L_done: 

-        add  esp,64

-        popfd

-        pop  ebx

-        pop  ebp

-        pop  esi

-        pop  edi

-        ret

-

-

-

-

-_TEXT   ends

-end

diff --git a/contrib/vstudio/vc70_32/inffastAsm.obj b/contrib/vstudio/vc70_32/inffastAsm.obj
deleted file mode 100644
index 3855400..0000000
--- a/contrib/vstudio/vc70_32/inffastAsm.obj
+++ /dev/null
Binary files differ
diff --git a/contrib/vstudio/vc70_32/mkgvmt32.bat b/contrib/vstudio/vc70_32/mkgvmt32.bat
deleted file mode 100644
index 9c54db7..0000000
--- a/contrib/vstudio/vc70_32/mkgvmt32.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm

-c:\masm611\bin\ml /coff /Zi /c /FlinffastAsm.lst inffastAsm.asm

diff --git a/contrib/zlib_dll_FAQ.txt b/contrib/zlib_dll_FAQ.txt
deleted file mode 100644
index bc1fd59..0000000
--- a/contrib/zlib_dll_FAQ.txt
+++ /dev/null
@@ -1,257 +0,0 @@
-
-            Frequently Asked Questions about ZLIB.DLL
-
-
-This FAQ is about the design, the rationale, and the use of
-ZLIB.DLL. If you have general questions about zlib, you should
-check the file "FAQ" found in the zlib distribution, or at the
-location http://www.gzip.org/zlib/zlib_faq.html
-
-
- 1. Why am I having problems using ZLIB.DLL? My application works
-    with the static build of zlib just fine, and I didn't make any
-    modification when recompiling it for ZLIB.DLL.
-
-  - Make sure you define ZLIB_DLL before including "zlib.h".
-    Applications that link to ZLIB.DLL will work properly if
-    the source files are compiled in this (or in a compatible)
-    way, and the executables are linked to MSVCRT.DLL.
-
-
- 2. Why do I have to do this? When I use other libraries, I can
-    link my code to their static or dynamic versions, without
-    needing any source code modification or recompilation.
-
-  - In order to preserve the backwards compatibility with the
-    older versions of ZLIB.DLL, and give the ability to use zlib
-    to the non-C programmers at the same time, we had to do this
-    compromise.
-
-
- 3. What exactly is this mess about, and why is it happening?
-
-  - It's about the calling convention used for the zlib functions.
-    If linked in statically, zlib uses the C (CDECL) convention.
-    If linked in dynamically (via ZLIB.DLL), it uses the STDCALL
-    convention. The ZLIB_DLL macro switches on the use of STDCALL.
-
-    It happens because we need to preserve compatibility with the
-    old releases of ZLIB.DLL that use STDCALL, and, at the same
-    time, we must provide support for programmers who use other
-    programming languages with bindings that require CDECL.
-
-
- 4. Why not use the STDCALL convention all the time?
-    It's the standard convention in Win32, and I need it in my
-    Visual Basic project!
-
-  - Most of the Win32 API functions (without varargs) use indeed
-    the STDCALL (WINAPI) convention, but the standard C functions
-    use the default CDECL. If one calls Win32 functions such as
-    CreateFile(), sometimes it makes sense to decorate one's own
-    functions with STDCALL. But if one is aiming at ANSI C or
-    POSIX portability, and calls functions such as fopen(), it is
-    not a sound decision to include <windows.h> or to use non-ANSI
-    constructs only to make one's functions STDCALL-able. This is
-    not the biggest problem, however.
-
-    Technically, STDCALL is not bad; it is even a little faster
-    than CDECL. The problem of using STDCALL is actually a problem
-    of using any explicit calling convention. FASTCALL falls into
-    the same category.
-
-    Explicit specification of calling conventions, whether it's
-    direct or indirect via a macro, happens commonly in Windows,
-    but it is regarded as a noisy, non-standard C quirk on other
-    platforms. It isn't possible to write an ANSI C -conforming
-    program, for example, if it is necessary to specify calling
-    conventions. Libraries can hide the dirty stuff in header
-    files, under macros, but callbacks will still remain exposed.
-    This is why the zlib callbacks will not be decorated.
-    (The old Windows callbacks, such as WndProc, are decorated,
-    but the newer ones are not.)
-
-    There is one more problem with explicit, non-default calling
-    conventions: the ability to use zlib in other programming
-    languages. Some of them, like Ada (GNAT) and Fortran (GNU G77)
-    have C bindings implemented initially on Unix, hence relying
-    on the C calling convention.
-
-    So we are decorating the functions using STDCALL in ZLIB.DLL
-    to maintain compatibility with the old versions, but we are
-    using the default CDECL in the static library, to allow other
-    programming languages to use zlib in a portable fashion, via
-    C bindings.
-
-
- 5. Why not use the default (CDECL) convention all the time?
-    It's the standard convention in C, and I need it in my Ada
-    project!
-
-  - Originally, ZLIB.DLL was intended to run under Visual Basic,
-    and VB6 and earlier need STDCALL.
-
-    We admit that cluttering the main zlib sources, for the sake
-    of interfacing with Visual Basic and at the expense of other
-    programming languages, is not fair. It would have been better
-    to maintain a "VB-only" project in the contrib/ directory, and
-    to build a custom ZLIBVB.DLL, for example -- as we did with
-    the Delphi projects. Another possible solution would have been
-    to build STDCALL wrappers around the CDECL-exported functions.
-
-    But this was the accident that we have to live with, in order
-    to maintain binary compatibility with the older versions of
-    ZLIB.DLL.
-
-
- 6. If my application uses ZLIB.DLL, do I have to link it to
-    MSVCRT.DLL? Why?
-
-  - The executables (.EXE, .DLL, etc.) that are involved in the
-    same process and are using the C run-time library (i.e. they
-    are calling any standard C function), must link to the same
-    library. There are several libraries in the Win32 system:
-    CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc.
-    Since ZLIB.DLL is linked to MSVCRT.DLL, the executables that
-    depend on it must also link to MSVCRT.DLL.
-
-
- 7. Why are you saying that ZLIB.DLL and my application must be
-    linked to the same C run-time library (CRT)? I linked my
-    application and my DLLs to different C libraries (e.g. my
-    application to a static library, and my DLLs to MSVCRT.DLL),
-    and everything works fine.
-
-  - If a library invokes only pure Win32 API (i.e. accessible
-    via <windows.h>), its DLL build will work in any context.
-    But if a library invokes standard C functions, things get
-    more complicated.
-
-    There is a single Win32 library in a Win32 system. Every
-    function in this library resides in a single DLL module, that
-    is safe to call from anywhere. On the other hand, there are
-    multiple versions of the C library that are all at the same
-    time in the system, and all of them have internal states,
-    therefore it is dangerous to intermix them with each other.
-
-    Intermixing multiple C libraries is possible, as long as their
-    internal states are kept intact. The Microsoft Knowledge Base
-    article Q140584 "HOWTO: Link with the Correct C Run-Time (CRT)
-    Library" enumerates some of the potential problems raised by
-    intermixing, but does not offer a complete description of how
-    to avoid them, except by advising not to mix the C libraries.
-    If you can send us more information about this issue, we will
-    highly appreciate it. (But please do NOT send us source code
-    from Microsoft, even if it comes with your legitimate copy of
-    Visual C++!)
-
-    If this kind of intermixing works for you, it's because your
-    application and DLLs are avoiding the corruption of the CRT's
-    internal states, due to a fortunate accident. It's not because
-    those libraries really work together.
-
-    Also note that linking ZLIB.DLL to non-Microsoft C libraries
-    (such as Borland's) raises similar problems.
-
-
- 8. Why are you linking ZLIB.DLL to MSVCRT.DLL?
-
-  - MSVCRT.DLL exists on every Windows 95 with a new service pack
-    installed, or with Microsoft Internet Explorer 4 or later, and
-    on all other Windows 4.x or later (Windows 98, Windows NT 4,
-    or later). It is freely distributable; if not present in the
-    system, it can be downloaded from Microsoft or from other
-    software provider for free.
-
-    The fact that MSVCRT.DLL does not exist on a virgin Windows 95
-    is not so problematic. The number of Windows 95 installations
-    is rapidly decreasing, Microsoft stopped supporting it a long
-    time ago, and many recent applications from various vendors
-    including Microsoft, do not even run on it. Even without these
-    arguments, no serious user should run Windows 95 without a
-    proper update installed.
-
-    There is also the fact that the mainstream C compilers for
-    Windows are Microsoft Visual C++ 6.0, and gcc/MinGW. Both
-    are producing executables that link to MSVCRT.DLL by default,
-    without offering other dynamic CRTs as alternatives easy to
-    select by users.
-
-
- 9. Why are you not linking ZLIB.DLL to
-    <<my favorite C run-time library>> ?
-
-  - We considered and abandoned the following alternatives:
-
-    * Linking ZLIB.DLL to a static C library (LIBC.LIB, or
-      LIBCMT.LIB) is not a good option. People are using ZLIB.DLL
-      mainly to save disk space. If you are linking your program
-      to a static C library, you may as well consider linking zlib
-      in statically, too.
-
-    * Linking ZLIB.DLL to CRTDLL.DLL looks very appealing,
-      because CRTDLL.DLL is present on every Win32 installation.
-      Unfortunately, it has a series of problems: it raises
-      difficulties when linking to the Microsoft C++ libraries,
-      it is not thread-safe, and Microsoft has discontinued its
-      support a long time ago.
-
-    * Linking ZLIB.DLL to MSVCRT70.DLL, supplied with the
-      Microsoft .NET platform and Visual C++ 7.0, is not a good
-      option. Although it can be downloaded and distributed
-      freely, it is hardly present on today's Win32 installations.
-      If it will become more popular than MSVCRT.DLL, and will be
-      pre-installed on the future Win32 systems, we will probably
-      think again about it.
-
-    * Linking ZLIB.DLL to NTDLL.DLL is not possible.
-      NTDLL.DLL exports only a part of the C library, and only
-      on Windows NT systems.
-
-
-10. I understand your reasons. However, my project needs ZLIB.DLL
-    linked to something different than MSVCRT.DLL. What can I do?
-
-    Feel free to rebuild this DLL from the zlib sources, and link
-    it the way you want. It is required, however, to clearly
-    state that your build is unofficial. Another thing that is not
-    required, but highly recommended, is to name that custom DLL
-    differently, and/or to install it in a private directory that
-    can be accessed by your application, but is not visible to the
-    others (e.g. it's not the SYSTEM or the SYSTEM32 directory,
-    and it's not in the PATH). Otherwise, your build may clash
-    with applications that link to the official build.
-
-    For example, in Cygwin, zlib is linked to their runtime
-    CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL.
-
-
-11. My I include additional pieces of code that I find useful,
-    link them in ZLIB.DLL, and export them?
-
-    No. A legitimate build of ZLIB.DLL must not include code that
-    does not originate from the official zlib sources. But you can
-    make your own private build, and give it a different name, as
-    suggested in the previous answer.
-
-    For example, in Borland Delphi and C++ Builder, zlib is part
-    of the standard VCL library. If an application links to VCL
-    dynamically, the name of the distributable binary (VCLxx.DLL)
-    does not posess any danger of clashing with a legitimate but
-    incompatible ZLIB.DLL.
-
-
-12. I see that I may have all kinds of problems if I use ZLIB.DLL.
-    Do you recommend to link zlib in statically? Do I get rid of
-    problems?
-
-  - Yes, definitely. In fact, unless you are distributing a large
-    number of executables, each of them linking to zlib, you will
-    save space by linking zlib in statically (assuming that you
-    would otherwise distribute ZLIB.DLL with your application).
-    zlib is not a big library, and the space saved by ZLIB.DLL is
-    little. Much of the actual size of the DLL is due to the 4KB
-    alignment in the binary.
-
-    But you may have reasons, other than size, to use the DLL.
-    That is entirely up to you.
diff --git a/crc32.c b/crc32.c
index 1622569..689b288 100644
--- a/crc32.c
+++ b/crc32.c
@@ -5,8 +5,8 @@
  * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
  * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
  * tables for updating the shift register in one step with three exclusive-ors
- * instead of four steps with four exclusive-ors.  This results about a 50%
- * increase in speed on a Power PC using gcc -O3.
+ * instead of four steps with four exclusive-ors.  This results about a factor
+ * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
  */
 
 /* @(#) $Id$ */
@@ -18,7 +18,7 @@
 #  endif /* !DYNAMIC_CRC_TABLE */
 #endif /* MAKECRCH */
 
-#include "zutil.h"	/* for STDC and FAR definitions */
+#include "zutil.h"      /* for STDC and FAR definitions */
 
 #define local static
 
@@ -203,7 +203,7 @@
 #endif /* DYNAMIC_CRC_TABLE */
 
 #ifdef BYFOUR
-    {
+    if (sizeof(void *) == sizeof(ptrdiff_t)) {
         u4 endian;
 
         endian = 1;
@@ -212,7 +212,7 @@
         else
             return crc32_big(crc, buf, len);
     }
-#else /* !BYFOUR */
+#endif /* BYFOUR */
     crc = crc ^ 0xffffffffUL;
     while (len >= 8) {
         DO8;
@@ -222,7 +222,6 @@
         DO1;
     } while (--len);
     return crc ^ 0xffffffffUL;
-#endif /* BYFOUR */
 }
 
 #ifdef BYFOUR
@@ -244,7 +243,7 @@
 
     c = (u4)crc;
     c = ~c;
-    while (len && ((size_t)buf & 3)) {
+    while (len && ((ptrdiff_t)buf & 3)) {
         c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
         len--;
     }
@@ -284,7 +283,7 @@
 
     c = REV((u4)crc);
     c = ~c;
-    while (len && ((size_t)buf & 3)) {
+    while (len && ((ptrdiff_t)buf & 3)) {
         c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
         len--;
     }
diff --git a/deflate.c b/deflate.c
index 4b38251..5f9b5c0 100644
--- a/deflate.c
+++ b/deflate.c
@@ -52,7 +52,7 @@
 #include "deflate.h"
 
 const char deflate_copyright[] =
-   " deflate 1.2.0.4 Copyright 1995-2003 Jean-loup Gailly ";
+   " deflate 1.2.0.5 Copyright 1995-2003 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
@@ -188,7 +188,7 @@
 #else
 #define INSERT_STRING(s, str, match_head) \
    (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
-    s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
+    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
     s->head[s->ins_h] = (Pos)(str))
 #endif
 
@@ -240,11 +240,11 @@
     if (strm == Z_NULL) return Z_STREAM_ERROR;
 
     strm->msg = Z_NULL;
-    if (strm->zalloc == Z_NULL) {
+    if (strm->zalloc == (alloc_func)0) {
         strm->zalloc = zcalloc;
         strm->opaque = (voidpf)0;
     }
-    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
+    if (strm->zfree == (free_func)0) strm->zfree = zcfree;
 
 #ifdef FASTEST
     if (level != 0) level = 1;
@@ -258,7 +258,7 @@
     }
 #ifdef GZIP
     else if (windowBits > 15) {
-        wrap = 2;	/* write gzip wrapper instead */
+        wrap = 2;       /* write gzip wrapper instead */
         windowBits -= 16;
     }
 #endif
@@ -361,7 +361,9 @@
     deflate_state *s;
 
     if (strm == Z_NULL || strm->state == Z_NULL ||
-        strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
+        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
+        return Z_STREAM_ERROR;
+    }
 
     strm->total_in = strm->total_out = 0;
     strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
@@ -554,7 +556,7 @@
         {
             uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
             uInt level_flags;
-    
+
             if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
                 level_flags = 0;
             else if (s->level < 6)
@@ -566,10 +568,10 @@
             header |= (level_flags << 6);
             if (s->strstart != 0) header |= PRESET_DICT;
             header += 31 - (header % 31);
-    
+
             s->status = BUSY_STATE;
             putShortMSB(s, header);
-    
+
             /* Save the adler32 of the preset dictionary: */
             if (s->strstart != 0) {
                 putShortMSB(s, (uInt)(strm->adler >> 16));
@@ -1092,7 +1094,7 @@
         if (sizeof(int) <= 2) {
             if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
                 more = wsize;
-    
+
             } else if (more == (unsigned)(-1)) {
                 /* Very unlikely, but possible on 16 bit machine if
                  * strstart == 0 && lookahead == 1 (input done a byte at time)
@@ -1412,7 +1414,7 @@
             /* longest_match() or longest_match_fast() sets match_start */
 
             if (s->match_length <= 5 && (s->strategy == Z_FILTERED
-#if TOO_FAR < 32768
+#if TOO_FAR <= 32767
                 || (s->match_length == MIN_MATCH &&
                     s->strstart - s->match_start > TOO_FAR)
 #endif
diff --git a/deflate.h b/deflate.h
index de3e6ce..e31f66b 100644
--- a/deflate.h
+++ b/deflate.h
@@ -1,6 +1,6 @@
 /* deflate.h -- internal compression state
  * Copyright (C) 1995-2002 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* WARNING: this file should *not* be used by applications. It is
@@ -320,7 +320,7 @@
 #else
 # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
 # define _tr_tally_dist(s, distance, length, flush) \
-              flush = _tr_tally(s, distance, length) 
+              flush = _tr_tally(s, distance, length)
 #endif
 
 #endif /* DEFLATE_H */
diff --git a/example.c b/example.c
index 622c9e6..2acc099 100644
--- a/example.c
+++ b/example.c
@@ -38,8 +38,8 @@
 
 void test_compress      OF((Byte *compr, uLong comprLen,
                             Byte *uncompr, uLong uncomprLen));
-void test_gzio          OF((const char *out, const char *in,
-                            Byte *uncompr, int uncomprLen));
+void test_gzio          OF((const char *fname,
+                            Byte *uncompr, uLong uncomprLen));
 void test_deflate       OF((Byte *compr, uLong comprLen));
 void test_inflate       OF((Byte *compr, uLong comprLen,
                             Byte *uncompr, uLong uncomprLen));
@@ -63,7 +63,7 @@
     uLong comprLen, uncomprLen;
 {
     int err;
-    uLong len = strlen(hello)+1;
+    uLong len = (uLong)strlen(hello)+1;
 
     err = compress(compr, &comprLen, (const Bytef*)hello, len);
     CHECK_ERR(err, "compress");
@@ -84,18 +84,17 @@
 /* ===========================================================================
  * Test read/write of .gz files
  */
-void test_gzio(out, in, uncompr, uncomprLen)
-    const char *out; /* compressed output file */
-    const char *in;  /* compressed input file */
+void test_gzio(fname, uncompr, uncomprLen)
+    const char *fname; /* compressed file name */
     Byte *uncompr;
-    int  uncomprLen;
+    uLong uncomprLen;
 {
     int err;
-    int len = strlen(hello)+1;
+    int len = (int)strlen(hello)+1;
     gzFile file;
     z_off_t pos;
 
-    file = gzopen(out, "wb");
+    file = gzopen(fname, "wb");
     if (file == NULL) {
         fprintf(stderr, "gzopen error\n");
         exit(1);
@@ -112,14 +111,14 @@
     gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
     gzclose(file);
 
-    file = gzopen(in, "rb");
+    file = gzopen(fname, "rb");
     if (file == NULL) {
         fprintf(stderr, "gzopen error\n");
+        exit(1);
     }
     strcpy((char*)uncompr, "garbage");
 
-    uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen);
-    if (uncomprLen != len) {
+    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
         fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
         exit(1);
     }
@@ -127,7 +126,7 @@
         fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
         exit(1);
     } else {
-        printf("gzread(): %s\n", (char *)uncompr);
+        printf("gzread(): %s\n", (char*)uncompr);
     }
 
     pos = gzseek(file, -8L, SEEK_CUR);
@@ -147,17 +146,16 @@
         exit(1);
     }
 
-    gzgets(file, (char*)uncompr, uncomprLen);
-    uncomprLen = strlen((char*)uncompr);
-    if (uncomprLen != 7) { /* " hello!" */
+    gzgets(file, (char*)uncompr, (int)uncomprLen);
+    if (strlen((char*)uncompr) != 7) { /* " hello!" */
         fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
         exit(1);
     }
-    if (strcmp((char*)uncompr, hello+6)) {
+    if (strcmp((char*)uncompr, hello + 6)) {
         fprintf(stderr, "bad gzgets after gzseek\n");
         exit(1);
     } else {
-        printf("gzgets() after gzseek: %s\n", (char *)uncompr);
+        printf("gzgets() after gzseek: %s\n", (char*)uncompr);
     }
 
     gzclose(file);
@@ -172,7 +170,7 @@
 {
     z_stream c_stream; /* compression stream */
     int err;
-    int len = strlen(hello)+1;
+    uLong len = (uLong)strlen(hello)+1;
 
     c_stream.zalloc = (alloc_func)0;
     c_stream.zfree = (free_func)0;
@@ -184,7 +182,7 @@
     c_stream.next_in  = (Bytef*)hello;
     c_stream.next_out = compr;
 
-    while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) {
+    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
         c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
         err = deflate(&c_stream, Z_NO_FLUSH);
         CHECK_ERR(err, "deflate");
@@ -347,7 +345,7 @@
 {
     z_stream c_stream; /* compression stream */
     int err;
-    int len = strlen(hello)+1;
+    uInt len = (uInt)strlen(hello)+1;
 
     c_stream.zalloc = (alloc_func)0;
     c_stream.zfree = (free_func)0;
@@ -543,8 +541,7 @@
     test_compress(compr, comprLen, uncompr, uncomprLen);
 
     test_gzio((argc > 1 ? argv[1] : TESTFILE),
-              (argc > 2 ? argv[2] : TESTFILE),
-              uncompr, (int)uncomprLen);
+              uncompr, uncomprLen);
 
     test_deflate(compr, comprLen);
     test_inflate(compr, comprLen, uncompr, uncomprLen);
diff --git a/gzio.c b/gzio.c
index f10ade3..fc5eb50 100644
--- a/gzio.c
+++ b/gzio.c
@@ -2,7 +2,7 @@
  * Copyright (C) 1995-2003 Jean-loup Gailly.
  * For conditions of distribution and use, see copyright notice in zlib.h
  *
- * Compile this file with -DNO_DEFLATE to avoid the compression code.
+ * Compile this file with -DNO_GZCOMPRESS to avoid the compression code.
  */
 
 /* @(#) $Id$ */
@@ -11,6 +11,10 @@
 
 #include "zutil.h"
 
+#ifdef NO_DEFLATE       /* for compatiblity with old definition */
+#  define NO_GZCOMPRESS
+#endif
+
 #ifndef NO_DUMMY_DECL
 struct internal_state {int dummy;}; /* for buggy compilers */
 #endif
@@ -56,7 +60,9 @@
     char     *path;   /* path name for debugging only */
     int      transparent; /* 1 if input file is not a .gz file */
     char     mode;    /* 'w' or 'r' */
-    long     startpos; /* start of compressed data in file (header skipped) */
+    z_off_t  start;   /* start of compressed data in file (header skipped) */
+    z_off_t  in;      /* bytes into deflate or inflate */
+    z_off_t  out;     /* bytes out of deflate or inflate */
     int      back;    /* one character push-back */
     int      last;    /* true if push-back is last character */
 } gz_stream;
@@ -74,7 +80,7 @@
      Opens a gzip (.gz) file for reading or writing. The mode parameter
    is as in fopen ("rb" or "wb"). The file is given either by file descriptor
    or path name (if fd == -1).
-     gz_open return NULL if the file could not be opened or if there was
+     gz_open returns NULL if the file could not be opened or if there was
    insufficient memory to allocate the (de)compression state; errno
    can be checked to distinguish the two cases (if errno is zero, the
    zlib error is Z_MEM_ERROR).
@@ -106,6 +112,8 @@
     s->file = NULL;
     s->z_err = Z_OK;
     s->z_eof = 0;
+    s->in = 0;
+    s->out = 0;
     s->back = EOF;
     s->crc = crc32(0L, Z_NULL, 0);
     s->msg = NULL;
@@ -136,7 +144,7 @@
     if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
 
     if (s->mode == 'w') {
-#ifdef NO_DEFLATE
+#ifdef NO_GZCOMPRESS
         err = Z_STREAM_ERROR;
 #else
         err = deflateInit2(&(s->stream), level,
@@ -175,15 +183,15 @@
          */
         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);
-        s->startpos = 10L;
+        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
-         * startpos anyway in write mode, so this initialization is not
+         * start anyway in write mode, so this initialization is not
          * necessary.
          */
     } else {
         check_header(s); /* skip the .gz header */
-        s->startpos = (ftell(s->file) - s->stream.avail_in);
+        s->start = ftell(s->file) - s->stream.avail_in;
     }
 
     return (gzFile)s;
@@ -350,7 +358,7 @@
 
     if (s->stream.state != NULL) {
         if (s->mode == 'w') {
-#ifdef NO_DEFLATE
+#ifdef NO_GZCOMPRESS
             err = Z_STREAM_ERROR;
 #else
             err = deflateEnd(&(s->stream));
@@ -401,7 +409,7 @@
         s->stream.next_out++;
         s->stream.avail_out--;
         s->back = EOF;
-        s->stream.total_out++;
+        s->out++;
         if (s->last) {
             s->z_err = Z_STREAM_END;
             return 1;
@@ -427,8 +435,8 @@
                                              s->file);
             }
             len -= s->stream.avail_out;
-            s->stream.total_in  += (uLong)len;
-            s->stream.total_out += (uLong)len;
+            s->in  += len;
+            s->out += len;
             if (len == 0) s->z_eof = 1;
             return (int)len;
         }
@@ -445,7 +453,11 @@
             }
             s->stream.next_in = s->inbuf;
         }
+        s->in += s->stream.avail_in;
+        s->out += s->stream.avail_out;
         s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
+        s->in -= s->stream.avail_in;
+        s->out -= s->stream.avail_out;
 
         if (s->z_err == Z_STREAM_END) {
             /* Check CRC and original size */
@@ -456,18 +468,13 @@
                 s->z_err = Z_DATA_ERROR;
             } else {
                 (void)getLong(s);
-                /* The uncompressed length returned by above getlong() may
-                 * be different from s->stream.total_out) in case of
-                 * concatenated .gz files. Check for such files:
+                /* The uncompressed length returned by above getlong() may be
+                 * different from s->out in case of concatenated .gz files.
+                 * Check for such files:
                  */
                 check_header(s);
                 if (s->z_err == Z_OK) {
-                    uLong total_in = s->stream.total_in;
-                    uLong total_out = s->stream.total_out;
-
                     inflateReset(&(s->stream));
-                    s->stream.total_in = total_in;
-                    s->stream.total_out = total_out;
                     s->crc = crc32(0L, Z_NULL, 0);
                 }
             }
@@ -504,7 +511,7 @@
 
     if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF;
     s->back = c;
-    s->stream.total_out--;
+    s->out--;
     s->last = (s->z_err == Z_STREAM_END);
     if (s->last) s->z_err = Z_OK;
     s->z_eof = 0;
@@ -535,7 +542,7 @@
 }
 
 
-#ifndef NO_DEFLATE
+#ifndef NO_GZCOMPRESS
 /* ===========================================================================
      Writes the given number of uncompressed bytes into the compressed file.
    gzwrite returns the number of bytes actually written (0 in case of error).
@@ -563,7 +570,11 @@
             }
             s->stream.avail_out = Z_BUFSIZE;
         }
+        s->in += s->stream.avail_in;
+        s->out += s->stream.avail_out;
         s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
+        s->in -= s->stream.avail_in;
+        s->out -= s->stream.avail_out;
         if (s->z_err != Z_OK) break;
     }
     s->crc = crc32(s->crc, (const Bytef *)buf, len);
@@ -706,7 +717,9 @@
             s->stream.avail_out = Z_BUFSIZE;
         }
         if (done) break;
+        s->out += s->stream.avail_out;
         s->z_err = deflate(&(s->stream), flush);
+        s->out -= s->stream.avail_out;
 
         /* Ignore the second of two consecutive flushes: */
         if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
@@ -732,7 +745,7 @@
     fflush(s->file);
     return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
 }
-#endif /* NO_DEFLATE */
+#endif /* NO_GZCOMPRESS */
 
 /* ===========================================================================
       Sets the starting position for the next gzread or gzwrite on the given
@@ -755,11 +768,11 @@
     }
 
     if (s->mode == 'w') {
-#ifdef NO_DEFLATE
+#ifdef NO_GZCOMPRESS
         return -1L;
 #else
         if (whence == SEEK_SET) {
-            offset -= s->stream.total_in;
+            offset -= s->in;
         }
         if (offset < 0) return -1L;
 
@@ -778,14 +791,14 @@
 
             offset -= size;
         }
-        return (z_off_t)s->stream.total_in;
+        return s->in;
 #endif
     }
     /* Rest of function is for reading only */
 
     /* compute absolute position */
     if (whence == SEEK_CUR) {
-        offset += s->stream.total_out;
+        offset += s->out;
     }
     if (offset < 0) return -1L;
 
@@ -796,13 +809,13 @@
         s->stream.next_in = s->inbuf;
         if (fseek(s->file, offset, SEEK_SET) < 0) return -1L;
 
-        s->stream.total_in = s->stream.total_out = (uLong)offset;
+        s->in = s->out = offset;
         return offset;
     }
 
     /* For a negative seek, rewind and use positive seek */
-    if ((uLong)offset >= s->stream.total_out) {
-        offset -= s->stream.total_out;
+    if (offset >= s->out) {
+        offset -= s->out;
     } else if (gzrewind(file) < 0) {
         return -1L;
     }
@@ -814,7 +827,7 @@
     }
     if (offset && s->back != EOF) {
         s->back = EOF;
-        s->stream.total_out++;
+        s->out++;
         offset--;
         if (s->last) s->z_err = Z_STREAM_END;
     }
@@ -826,7 +839,7 @@
         if (size <= 0) return -1L;
         offset -= size;
     }
-    return (z_off_t)s->stream.total_out;
+    return s->out;
 }
 
 /* ===========================================================================
@@ -845,14 +858,10 @@
     s->stream.avail_in = 0;
     s->stream.next_in = s->inbuf;
     s->crc = crc32(0L, Z_NULL, 0);
-
-    if (s->startpos == 0) { /* not a compressed file */
-        fseek(s->file, 0L, SEEK_SET);   /* rewind() is not always available */
-        return 0;
-    }
-
-    (void) inflateReset(&s->stream);
-    return fseek(s->file, s->startpos, SEEK_SET);
+    if (!s->transparent) (void)inflateReset(&s->stream);
+    s->in = 0;
+    s->out = 0;
+    return fseek(s->file, s->start, SEEK_SET);
 }
 
 /* ===========================================================================
@@ -923,14 +932,14 @@
     if (s == NULL) return Z_STREAM_ERROR;
 
     if (s->mode == 'w') {
-#ifdef NO_DEFLATE
+#ifdef NO_GZCOMPRESS
         return Z_STREAM_ERROR;
 #else
         err = do_flush (file, Z_FINISH);
         if (err != Z_OK) return destroy((gz_stream*)file);
 
         putLong (s->file, s->crc);
-        putLong (s->file, s->stream.total_in);
+        putLong (s->file, (uLong)(s->in & 0xffffffff));
 #endif
     }
     return destroy((gz_stream*)file);
diff --git a/infback.c b/infback.c
index 287624c..110b03b 100644
--- a/infback.c
+++ b/infback.c
@@ -41,11 +41,11 @@
         windowBits < 8 || windowBits > 15)
         return Z_STREAM_ERROR;
     strm->msg = Z_NULL;                 /* in case we return an error */
-    if (strm->zalloc == Z_NULL) {
+    if (strm->zalloc == (alloc_func)0) {
         strm->zalloc = zcalloc;
         strm->opaque = (voidpf)0;
     }
-    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
+    if (strm->zfree == (free_func)0) strm->zfree = zcfree;
     state = (struct inflate_state FAR *)ZALLOC(strm, 1,
                                                sizeof(struct inflate_state));
     if (state == Z_NULL) return Z_MEM_ERROR;
@@ -610,7 +610,7 @@
 int ZEXPORT inflateBackEnd(strm)
 z_stream FAR *strm;
 {
-    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == Z_NULL)
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
         return Z_STREAM_ERROR;
     ZFREE(strm, strm->state);
     strm->state = Z_NULL;
diff --git a/inffast.c b/inffast.c
index 59a8af8..513b1af 100644
--- a/inffast.c
+++ b/inffast.c
@@ -8,6 +8,8 @@
 #include "inflate.h"
 #include "inffast.h"
 
+#ifndef ASMINF
+
 /* Allow machine dependent optimization for post-increment or pre-increment.
    Based on testing to date,
    Pre-increment preferred for:
@@ -72,6 +74,7 @@
     unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */
     unsigned char FAR *end;     /* while out < end, enough space available */
     unsigned wsize;             /* window size or zero if not using window */
+    unsigned whave;             /* valid bytes in the window */
     unsigned write;             /* window write index */
     unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */
     unsigned long hold;         /* local strm->hold */
@@ -95,6 +98,7 @@
     beg = out - (start - strm->avail_out);
     end = out + (strm->avail_out - 257);
     wsize = state->wsize;
+    whave = state->whave;
     write = state->write;
     window = state->window;
     hold = state->hold;
@@ -167,13 +171,13 @@
                 Tracevv((stderr, "inflate:         distance %u\n", dist));
                 op = (unsigned)(out - beg);     /* max distance in output */
                 if (dist > op) {                /* see if copy from window */
-                    if (dist > wsize) {
+                    op = dist - op;             /* distance back in window */
+                    if (op > whave) {
                         strm->msg = (char *)"invalid distance too far back";
                         state->mode = BAD;
                         break;
                     }
                     from = window - OFF;
-                    op = dist - op;             /* distance back in window */
                     if (write == 0) {           /* very common case */
                         from += wsize - op;
                         if (op < len) {         /* some from window */
@@ -296,3 +300,5 @@
    - Larger unrolled copy loops (three is about right)
    - Moving len -= 3 statement into middle of loop
  */
+
+#endif /* !ASMINF */
diff --git a/inffast.h b/inffast.h
index 977101b..1e88d2d 100644
--- a/inffast.h
+++ b/inffast.h
@@ -1,6 +1,6 @@
 /* inffast.h -- header to use inffast.c
  * Copyright (C) 1995-2003 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* WARNING: this file should *not* be used by applications. It is
diff --git a/inflate.c b/inflate.c
index da2bb59..287efda 100644
--- a/inflate.c
+++ b/inflate.c
@@ -97,7 +97,7 @@
 #ifdef BUILDFIXED
    void makefixed OF((void));
 #endif
-local unsigned syncsearch OF((unsigned *have, unsigned char FAR *buf,
+local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
                               unsigned len));
 
 int ZEXPORT inflateReset(strm)
@@ -134,11 +134,11 @@
         return Z_VERSION_ERROR;
     if (strm == Z_NULL) return Z_STREAM_ERROR;
     strm->msg = Z_NULL;                 /* in case we return an error */
-    if (strm->zalloc == Z_NULL) {
+    if (strm->zalloc == (alloc_func)0) {
         strm->zalloc = zcalloc;
         strm->opaque = (voidpf)0;
     }
-    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
+    if (strm->zfree == (free_func)0) strm->zfree = zcfree;
     state = (struct inflate_state FAR *)
             ZALLOC(strm, 1, sizeof(struct inflate_state));
     if (state == Z_NULL) return Z_MEM_ERROR;
@@ -559,6 +559,7 @@
         return Z_STREAM_ERROR;
 
     state = (struct inflate_state FAR *)strm->state;
+    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */
     LOAD();
     in = have;
     out = left;
@@ -709,6 +710,8 @@
             strm->adler = state->check = adler32(0L, Z_NULL, 0);
             state->mode = TYPE;
         case TYPE:
+            if (flush == Z_BLOCK) goto inf_leave;
+        case TYPEDO:
             if (state->last) {
                 BYTEBITS();
                 state->mode = CHECK;
@@ -1071,6 +1074,8 @@
     if (state->wrap && out)
         strm->adler = state->check =
             UPDATE(state->check, strm->next_out - out, out);
+    strm->data_type = state->bits + (state->last ? 8 : 0) +
+                      (state->mode == TYPE ? 16 : 0);
     if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
         ret = Z_BUF_ERROR;
     return ret;
@@ -1080,7 +1085,7 @@
 z_streamp strm;
 {
     struct inflate_state FAR *state;
-    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == Z_NULL)
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
         return Z_STREAM_ERROR;
     state = (struct inflate_state FAR *)strm->state;
     if (state->window != Z_NULL) ZFREE(strm, state->window);
@@ -1233,7 +1238,7 @@
 
     /* check input */
     if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
-        source->zalloc == Z_NULL || source->zfree == Z_NULL)
+        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
         return Z_STREAM_ERROR;
     state = (struct inflate_state FAR *)source->state;
 
diff --git a/inflate.h b/inflate.h
index 8bd40a5..9a12c8f 100644
--- a/inflate.h
+++ b/inflate.h
@@ -32,6 +32,7 @@
     DICTID,     /* i: waiting for dictionary check value */
     DICT,       /* waiting for inflateSetDictionary() call */
         TYPE,       /* i: waiting for type bits, including last-flag bit */
+        TYPEDO,     /* i: same, but skip check to exit inflate on new block */
         STORED,     /* i: waiting for stored size (length and complement) */
         COPY,       /* i/o: waiting for input or output to copy stored block */
         TABLE,      /* i: waiting for dynamic block table lengths */
@@ -88,7 +89,7 @@
         /* sliding window */
     unsigned wbits;             /* log base 2 of requested window size */
     unsigned wsize;             /* window size or zero if not using window */
-    unsigned whave;		/* valid bytes in the window */
+    unsigned whave;             /* valid bytes in the window */
     unsigned write;             /* window write index */
     unsigned char FAR *window;  /* allocated sliding window, if needed */
         /* bit accumulator */
diff --git a/inftrees.c b/inftrees.c
index f99f14e..d339ad5 100644
--- a/inftrees.c
+++ b/inftrees.c
@@ -9,7 +9,7 @@
 #define MAXBITS 15
 
 const char inflate_copyright[] =
-   " inflate 1.2.0.4 Copyright 1995-2003 Mark Adler ";
+   " inflate 1.2.0.5 Copyright 1995-2003 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 @@
         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, 72, 192};
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 192, 78};
     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,
diff --git a/minigzip.c b/minigzip.c
index 68e20c2..167f745 100644
--- a/minigzip.c
+++ b/minigzip.c
@@ -1,6 +1,5 @@
 /* minigzip.c -- simulate gzip using the zlib compression library
  * Copyright (C) 1995-2002 Jean-loup Gailly.
- * Adapted for Z_RLE by Cosmin Truta, 2003.
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
@@ -60,7 +59,7 @@
 #ifndef GZ_SUFFIX
 #  define GZ_SUFFIX ".gz"
 #endif
-#define SUFFIX_LEN ((int)sizeof(GZ_SUFFIX)-1)
+#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
 
 #define BUFLEN      16384
 #define MAX_NAME_LEN 1024
@@ -230,7 +229,7 @@
     char *infile, *outfile;
     FILE  *out;
     gzFile in;
-    int len = (int)strlen(file);
+    uInt len = (uInt)strlen(file);
 
     strcpy(buf, file);
 
diff --git a/msdos/Makefile.bor b/msdos/Makefile.bor
index 4ad4061..8f8132d 100644
--- a/msdos/Makefile.bor
+++ b/msdos/Makefile.bor
@@ -1,6 +1,6 @@
 # Makefile for zlib
 # Borland C++
-# Updated for zlib-1.2.x by Cosmin Truta, 15-Mar-2003.
+# Last updated: 15-Mar-2003
 
 # To use, do "make -fmakefile.bor"
 # To compile in small model, set below: MODEL=s
@@ -103,7 +103,7 @@
 
 clean:
 	-del *.obj
-	-del *.exe
 	-del *.lib
-	-del zlib_$(MODEL).bak
+	-del *.exe
+	-del zlib_*.bak
 	-del foo.gz
diff --git a/old/msdos/Makefile.dj2 b/msdos/Makefile.dj2
similarity index 90%
rename from old/msdos/Makefile.dj2
rename to msdos/Makefile.dj2
index 0ab431c..283d1d9 100644
--- a/old/msdos/Makefile.dj2
+++ b/msdos/Makefile.dj2
@@ -1,15 +1,15 @@
 # Makefile for zlib.  Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96.
 # Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile, or to compile and test, type:
-# 
+#
 #   make -fmakefile.dj2;  make test -fmakefile.dj2
-# 
+#
 # To install libz.a, zconf.h and zlib.h in the djgpp directories, type:
-# 
+#
 #    make install -fmakefile.dj2
-# 
+#
 # after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
 # in the sample below if the pattern of the DJGPP distribution is to
 # be followed.  Remember that, while <sp>'es around <=> are ignored in
@@ -52,21 +52,25 @@
 exec_prefix = $(prefix)
 
 OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+       zutil.o inflate.o infback.o inftrees.o inffast.o
+
+OBJA =
+# to use the asm code: make OBJA=match.o
 
 TEST_OBJS = example.o minigzip.o
 
 all: example.exe minigzip.exe
 
+check: test
 test: all
 	./example
-	echo hello world | .\minigzip | .\minigzip -d 
+	echo hello world | .\minigzip | .\minigzip -d
 
 %.o : %.c
 	$(CC) $(CFLAGS) -c $< -o $@
 
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
+libz.a: $(OBJS) $(OBJA)
+	$(AR) $@ $(OBJS) $(OBJA)
 
 %.exe : %.o $(LIBS)
 	$(LD) $@ $< $(LDLIBS)
diff --git a/old/msdos/Makefile.emx b/msdos/Makefile.emx
similarity index 89%
rename from old/msdos/Makefile.emx
rename to msdos/Makefile.emx
index 0e5e5cc..ed4c31f 100644
--- a/old/msdos/Makefile.emx
+++ b/msdos/Makefile.emx
@@ -1,11 +1,11 @@
 # Makefile for zlib.  Modified for emx 0.9c by Chr. Spieler, 6/17/98.
 # Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile, or to compile and test, type:
-# 
+#
 #   make -fmakefile.emx;  make test -fmakefile.emx
-# 
+#
 
 CC=gcc
 
@@ -34,7 +34,7 @@
 exec_prefix = $(prefix)
 
 OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+       zutil.o inflate.o infback.o inftrees.o inffast.o
 
 TEST_OBJS = example.o minigzip.o
 
@@ -42,7 +42,7 @@
 
 test: all
 	./example
-	echo hello world | .\minigzip | .\minigzip -d 
+	echo hello world | .\minigzip | .\minigzip -d
 
 %.o : %.c
 	$(CC) $(CFLAGS) -c $< -o $@
diff --git a/msdos/Makefile.msc b/msdos/Makefile.msc
new file mode 100644
index 0000000..b8fc665
--- /dev/null
+++ b/msdos/Makefile.msc
@@ -0,0 +1,106 @@
+# Makefile for zlib
+# Microsoft C 5.1 or later
+# Last updated: 19-Mar-2003
+
+# To use, do "make makefile.msc"
+# To compile in small model, set below: MODEL=S
+
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to the LOC macro below:
+#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Microsoft C 5.1 and later -------------
+
+#    Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+#    should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
+#    to the declaration of LOC here:
+LOC = $(LOCAL_ZLIB)
+
+# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
+CPU_TYP = 0
+
+# Memory model: one of S, M, C, L (small, medium, compact, large)
+MODEL=L
+
+CC=cl
+CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC)
+#-Ox generates bad code with MSC 5.1
+LIB_CFLAGS=-Zl $(CFLAGS)
+
+LD=link
+LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode
+# "/farcall/packcode" are only useful for `large code' memory models
+# but should be a "no-op" for small code models.
+
+
+# variables
+ZLIB_LIB = zlib_$(MODEL).lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
+OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+
+
+# targets
+all:  $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+	$(CC) -c $(LIB_CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: example.c zlib.h zconf.h
+	$(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+	$(CC) -c $(CFLAGS) $*.c
+
+
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+	if exist $(ZLIB_LIB) del $(ZLIB_LIB)
+	lib $(ZLIB_LIB) $(OBJ1);
+	lib $(ZLIB_LIB) $(OBJ2);
+
+example.exe: example.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB);
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+	$(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB);
+
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d
+
+clean:
+	-del *.obj
+	-del *.lib
+	-del *.exe
+	-del *.map
+	-del zlib_*.bak
+	-del foo.gz
diff --git a/msdos/Makefile.tc b/msdos/Makefile.tc
index d0a7864..480750a 100644
--- a/msdos/Makefile.tc
+++ b/msdos/Makefile.tc
@@ -1,6 +1,6 @@
 # Makefile for zlib
 # Turbo C 2.01, Turbo C++ 1.01
-# Updated for zlib-1.2.x by Cosmin Truta, 15-Mar-2003.
+# Last updated: 15-Mar-2003
 
 # To use, do "make -fmakefile.tc"
 # To compile in small model, set below: MODEL=s
@@ -88,7 +88,7 @@
 
 clean:
 	-del *.obj
-	-del *.exe
 	-del *.lib
-	-del zlib_$(MODEL).bak
+	-del *.exe
+	-del zlib_*.bak
 	-del foo.gz
diff --git a/old/Make_vms.com b/old/Make_vms.com
old mode 100644
new mode 100755
index 1c57e8f..4fe3013
--- a/old/Make_vms.com
+++ b/old/Make_vms.com
@@ -64,8 +64,8 @@
 $   write sys$output "Building minigzip..."
 $   CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" -
                 minigzip.c zlib.h zconf.h
-$   call make minigzip.exe - 
-                "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - 
+$   call make minigzip.exe -
+                "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" -
                 minigzip.obj libz.olb
 $  else
 $   mms/macro=('comp')
diff --git a/old/descrip.mms b/old/descrip.mms
index 9d36459..7066da5 100644
--- a/old/descrip.mms
+++ b/old/descrip.mms
@@ -1,8 +1,8 @@
 # descrip.mms: MMS description file for building zlib on VMS
 # written by Martin P.J. Zinser <m.zinser@gsi.de>
 
-cc_defs = 
-c_deb = 
+cc_defs =
+c_deb =
 
 .ifdef __DECC__
 pref = /prefix=all
@@ -25,7 +25,7 @@
 minigzip.exe : minigzip.obj libz.olb
               link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib
 
-clean : 
+clean :
 	delete *.obj;*,libz.olb;*
 
 
diff --git a/old/msdos/Makefile.b32 b/old/msdos/Makefile.b32
index f476da9..3802ea4 100644
--- a/old/msdos/Makefile.b32
+++ b/old/msdos/Makefile.b32
@@ -1,5 +1,5 @@
 # Makefile for zlib
-# Borland C++   
+# Borland C++
 
 # This version of the zlib makefile was adapted by Chris Young for use
 # with Borland C 4.5x with the Dos Power Pack for a 32-bit protected mode
@@ -13,7 +13,7 @@
 # See zconf.h for details about the memory requirements.
 
 # ------------- Borland C++ -------------
-MODEL=-WX 
+MODEL=-WX
 CFLAGS= $(MODEL) -P-C -K -N- -k- -d -3 -r- -v- -f -DMSDOS
 CC=bcc32
 LD=bcc32
@@ -97,7 +97,7 @@
 
 test: example.exe minigzip.exe
 	example
-	echo hello world | minigzip | minigzip -d 
+	echo hello world | minigzip | minigzip -d
 
 #clean:
 #	del *.obj
diff --git a/old/msdos/Makefile.msc b/old/msdos/Makefile.msc
deleted file mode 100644
index 562201d..0000000
--- a/old/msdos/Makefile.msc
+++ /dev/null
@@ -1,121 +0,0 @@
-# Makefile for zlib
-# Microsoft C 5.1 or later
-
-# To use, do "make makefile.msc"
-# To compile in small model, set below: MODEL=S
-
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to the LOC macro below:
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Microsoft C 5.1 and later -------------
-
-#    Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
-#    should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
-#    to the declaration of LOC here:
-LOC = $(LOCAL_ZLIB)
-
-# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
-CPU_TYP = 0
-
-# Memory model: one of S, M, C, L (small, medium, compact, large)
-MODEL=L
-
-CC=cl
-CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC)
-#-Ox generates bad code with MSC 5.1
-LIB_CFLAGS=-Zl $(CFLAGS)
-
-LD=link
-LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode
-# "/farcall/packcode" are only useful for `large code' memory models
-# but should be a "no-op" for small code models.
-
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-ZLIB_H = zlib.h zconf.h
-ZUTIL_H = zutil.h $(ZLIB_H)
-
-ZLIB_LIB = zlib_$(MODEL).lib
-
-all:  $(ZLIB_LIB) example.exe minigzip.exe
-
-# individual dependencies and action rules:
-adler32.obj: adler32.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-compress.obj: compress.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-crc32.obj: crc32.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-gzio.obj: gzio.c $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infblock.obj: infblock.c $(ZUTIL_H) infblock.h inftrees.h infcodes.h infutil.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infcodes.obj: infcodes.c $(ZUTIL_H) inftrees.h infutil.h infcodes.h inffast.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inflate.obj: inflate.c $(ZUTIL_H) infblock.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inftrees.obj: inftrees.c $(ZUTIL_H) inftrees.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-infutil.obj: infutil.c $(ZUTIL_H) inftrees.h infutil.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-inffast.obj: inffast.c $(ZUTIL_H) inftrees.h infutil.h inffast.h
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-uncompr.obj: uncompr.c $(ZLIB_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-zutil.obj: zutil.c $(ZUTIL_H)
-	$(CC) -c $(LIB_CFLAGS) $*.c
-
-example.obj: example.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c $(ZLIB_H)
-	$(CC) -c $(CFLAGS) $*.c
-
-# we must cut the command line to fit in the MS/DOS 128 byte limit:
-$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-	if exist $(ZLIB_LIB) del $(ZLIB_LIB)
-	lib $(ZLIB_LIB) $(OBJ1);
-	lib $(ZLIB_LIB) $(OBJ2);
-
-example.exe: example.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB);
-
-minigzip.exe: minigzip.obj $(ZLIB_LIB)
-	$(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB);
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-#clean:
-#	del *.obj
-#	del *.exe
diff --git a/old/msdos/Makefile.w32 b/old/msdos/Makefile.w32
deleted file mode 100644
index 0a05fa9..0000000
--- a/old/msdos/Makefile.w32
+++ /dev/null
@@ -1,97 +0,0 @@
-# Makefile for zlib
-# Microsoft 32-bit Visual C++ 4.0 or later (may work on earlier versions)
-
-# To use, do "nmake /f makefile.w32"
-
-# If you wish to reduce the memory requirements (default 256K for big
-# objects plus a few K), you can add to CFLAGS below: 
-#   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
-# See zconf.h for details about the memory requirements.
-
-# ------------- Microsoft Visual C++ 4.0 and later -------------
-MODEL=
-CFLAGS=-Ox -GA3s -nologo -W3
-CC=cl
-LD=link
-LDFLAGS=
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
-  infutil$(O)+inffast$(O)
-
-all:  zlib.lib example.exe minigzip.exe
-
-adler32.obj: adler32.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
-   infcodes.h infutil.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
-   infcodes.h inffast.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-  $(CC) -c $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-  $(CC) -c $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-  $(CC) -c $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-  $(CC) -c $(CFLAGS) $*.c
-
-zlib.lib: $(OBJ1) $(OBJ2)
-  if exist zlib.lib del zlib.lib
-  lib /OUT:zlib.lib $(OBJ1) $(OBJ2)
-
-example.exe: example.obj zlib.lib
-  $(LD) $(LDFLAGS) example.obj zlib.lib /OUT:example.exe /SUBSYSTEM:CONSOLE
-
-minigzip.exe: minigzip.obj zlib.lib
-  $(LD) $(LDFLAGS) minigzip.obj zlib.lib /OUT:minigzip.exe /SUBSYSTEM:CONSOLE
-
-test: example.exe minigzip.exe
-  example
-  echo hello world | minigzip | minigzip -d 
-
-#clean:
-#  del *.obj
-#  del *.exe
diff --git a/old/msdos/Makefile.wat b/old/msdos/Makefile.wat
index 44bf860..065fe4c 100644
--- a/old/msdos/Makefile.wat
+++ b/old/msdos/Makefile.wat
@@ -2,8 +2,8 @@
 # Watcom 10a
 
 # This version of the zlib makefile was adapted by Chris Young for use
-# with Watcom 10a 32-bit protected mode flat memory model.  It was created 
-# for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to 
+# with Watcom 10a 32-bit protected mode flat memory model.  It was created
+# for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to
 # suit your needs but the -DMSDOS is required.
 # -- Chris Young 76702.1655@compuserve.com
 
@@ -12,17 +12,17 @@
 # See zconf.h for details about the memory requirements.
 
 # ------------- Watcom 10a -------------
-MODEL=-mf 
+MODEL=-mf
 CFLAGS= $(MODEL) -fpi87 -fp5 -zp4 -5r -w5 -oneatx -DMSDOS
 CC=wcc386
 LD=wcl386
-LIB=wlib -b -c 
-LDFLAGS= 
+LIB=wlib -b -c
+LDFLAGS=
 O=.obj
 
 # variables
-OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) 
-OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) 
+OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O)
+OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O)
 OBJ3=infutil$(O) inffast$(O)
 OBJP1=adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)
 OBJP2=trees$(O)+zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)
@@ -81,7 +81,7 @@
 	$(CC) $(CFLAGS) $*.c
 
 # we must cut the command line to fit in the MS/DOS 128 byte limit:
-zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3) 
+zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3)
 	del zlib.lib
 	$(LIB) zlib.lib +$(OBJP1)
 	$(LIB) zlib.lib +$(OBJP2)
diff --git a/old/msdos/zlib.def b/old/msdos/zlib.def
deleted file mode 100644
index 6c04412..0000000
--- a/old/msdos/zlib.def
+++ /dev/null
@@ -1,60 +0,0 @@
-LIBRARY		"zlib"
-
-DESCRIPTION	'"""zlib data compression library"""'
-
-EXETYPE		NT
-
-SUBSYSTEM	WINDOWS
-
-STUB		'WINSTUB.EXE'
-
-VERSION		1.13
-
-CODE		 EXECUTE READ
-
-DATA		 READ WRITE
-
-HEAPSIZE	1048576,4096
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
diff --git a/old/msdos/zlib.rc b/old/msdos/zlib.rc
deleted file mode 100644
index 556d4ff..0000000
--- a/old/msdos/zlib.rc
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <windows.h>
-
-#define IDR_VERSION1  1
-IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE
-  FILEVERSION	 1,1,3,0
-  PRODUCTVERSION 1,1,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.1.3\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-1998 Jean-loup Gailly & Mark Adler\0"
-    END
-  END
-  BLOCK "VarFileInfo"
-  BEGIN
-    VALUE "Translation", 0x0409, 1252
-  END
-END
diff --git a/old/nt/Makefile.emx b/old/nt/Makefile.emx
deleted file mode 100644
index 2d475b1..0000000
--- a/old/nt/Makefile.emx
+++ /dev/null
@@ -1,138 +0,0 @@
-# Makefile for zlib.  Modified for emx/rsxnt by Chr. Spieler, 6/16/98.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.emx;  make test -fmakefile.emx
-# 
-
-CC=gcc -Zwin32
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lzlib
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=zlib.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-zlib.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) zlib.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
-# Makefile for zlib.  Modified for emx 0.9c by Chr. Spieler, 6/17/98.
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.emx;  make test -fmakefile.emx
-# 
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lzlib
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=zlib.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-zlib.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-
-.PHONY : clean
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) zlib.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/old/nt/Makefile.gcc b/old/nt/Makefile.gcc
deleted file mode 100644
index cdd652f..0000000
--- a/old/nt/Makefile.gcc
+++ /dev/null
@@ -1,87 +0,0 @@
-# Makefile for zlib.  Modified for mingw32 by C. Spieler, 6/16/98.
-# (This Makefile is directly derived from Makefile.dj2)
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
-
-# To compile, or to compile and test, type:
-# 
-#   make -fmakefile.gcc;  make test -fmakefile.gcc
-# 
-# To install libz.a, zconf.h and zlib.h in the mingw32 directories, type:
-# 
-#    make install -fmakefile.gcc
-# 
-
-CC=gcc
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-             -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is available, replace "copy /Y" with "cp -fp" .
-CP=copy /Y
-# If gnu install.exe is available, replace $(CP) with ginstall.
-INSTALL=$(CP)
-# The default value of RM is "rm -f."  If "rm.exe" is found, comment out:
-RM=del
-LDLIBS=-L. -lz
-LD=$(CC) -s -o
-LDSHARED=$(CC)
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-prefix=/usr/local
-exec_prefix = $(prefix)
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-TEST_OBJS = example.o minigzip.o
-
-all: example.exe minigzip.exe
-
-test: all
-	./example
-	echo hello world | .\minigzip | .\minigzip -d 
-
-%.o : %.c
-	$(CC) $(CFLAGS) -c $< -o $@
-
-libz.a: $(OBJS)
-	$(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
-	$(LD) $@ $< $(LDLIBS)
-
-# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
-
-.PHONY : uninstall clean
-
-install: $(INCL) $(LIBS)
-	-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
-	-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
-	$(INSTALL) zlib.h $(INCLUDE_PATH)
-	$(INSTALL) zconf.h $(INCLUDE_PATH)
-	$(INSTALL) libz.a $(LIBRARY_PATH)
-
-uninstall:
-	$(RM) $(INCLUDE_PATH)\zlib.h
-	$(RM) $(INCLUDE_PATH)\zconf.h
-	$(RM) $(LIBRARY_PATH)\libz.a
-
-clean:
-	$(RM) *.d
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) libz.a
-	$(RM) foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
diff --git a/old/nt/Makefile.nt b/old/nt/Makefile.nt
deleted file mode 100644
index b250f2a..0000000
--- a/old/nt/Makefile.nt
+++ /dev/null
@@ -1,88 +0,0 @@
-# Makefile for zlib
-
-!include <ntwin32.mak>
-
-CC=cl
-LD=link
-CFLAGS=-O -nologo
-LDFLAGS=
-O=.obj
-
-# variables
-OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
-  trees$(O)
-OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
-  infutil$(O) inffast$(O)
-
-all:  zlib.dll example.exe minigzip.exe
-
-adler32.obj: adler32.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-compress.obj: compress.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-crc32.obj: crc32.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-gzio.obj: gzio.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
-   infcodes.h infutil.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
-   infcodes.h inffast.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-uncompr.obj: uncompr.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-zutil.obj: zutil.c zutil.h zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-example.obj: example.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-minigzip.obj: minigzip.c zlib.h zconf.h
-	$(CC) -c $(cvarsdll) $(CFLAGS) $*.c
-
-zlib.dll: $(OBJ1) $(OBJ2) zlib.dnt
-	link $(dlllflags) -out:$@ -def:zlib.dnt $(OBJ1) $(OBJ2) $(guilibsdll)
-
-zlib.lib: zlib.dll
-
-example.exe: example.obj zlib.lib
-	$(LD) $(LDFLAGS) example.obj zlib.lib
-
-minigzip.exe: minigzip.obj zlib.lib
-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib
-
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
-
-clean:
-	del *.obj
-	del *.exe
-	del *.dll
-	del *.lib
diff --git a/old/nt/zlib.dnt b/old/nt/zlib.dnt
deleted file mode 100644
index 7f9475c..0000000
--- a/old/nt/zlib.dnt
+++ /dev/null
@@ -1,47 +0,0 @@
-LIBRARY		zlib.dll
-EXETYPE WINDOWS
-CODE		 PRELOAD MOVEABLE DISCARDABLE
-DATA		 PRELOAD MOVEABLE MULTIPLE
-
-EXPORTS
-    adler32                        @1
-    compress                       @2
-    crc32                          @3
-    deflate                        @4
-    deflateCopy                    @5
-    deflateEnd                     @6
-    deflateInit2_                  @7
-    deflateInit_                   @8
-    deflateParams                  @9
-    deflateReset                   @10
-    deflateSetDictionary           @11
-    gzclose                        @12
-    gzdopen                        @13
-    gzerror                        @14
-    gzflush                        @15
-    gzopen                         @16
-    gzread                         @17
-    gzwrite                        @18
-    inflate                        @19
-    inflateEnd                     @20
-    inflateInit2_                  @21
-    inflateInit_                   @22
-    inflateReset                   @23
-    inflateSetDictionary           @24
-    inflateSync                    @25
-    uncompress                     @26
-    zlibVersion                    @27
-    gzprintf                       @28
-    gzputc                         @29
-    gzgetc                         @30
-    gzseek                         @31
-    gzrewind                       @32
-    gztell                         @33
-    gzeof                          @34
-    gzsetparams                    @35
-    zError                         @36
-    inflateSyncPoint               @37
-    get_crc_table                  @38
-    compress2                      @39
-    gzputs                         @40
-    gzgets                         @41
diff --git a/old/os2/Makefile.os2 b/old/os2/Makefile.os2
index 4f56947..a105aaa 100644
--- a/old/os2/Makefile.os2
+++ b/old/os2/Makefile.os2
@@ -1,5 +1,5 @@
 # Makefile for zlib under OS/2 using GCC (PGCC)
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile and test, type:
 #   cp Makefile.os2 ..
@@ -108,7 +108,7 @@
 	if test ! -d $$d; then rm -f $$d; fi
 	mv Makefile~ Makefile
 
-tags:	
+tags:
 	etags *.[ch]
 
 depend:
@@ -130,7 +130,7 @@
 inflate.o: zutil.h zlib.h zconf.h infblock.h
 inftrees.o: zutil.h zlib.h zconf.h inftrees.h
 infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o:  zlib.h zconf.h 
+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  
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/old/zlib.html b/old/zlib.html
index c343703..8c1b190 100644
--- a/old/zlib.html
+++ b/old/zlib.html
@@ -45,7 +45,7 @@
   </ol>
 
   <dl>
-  <dt>Jean-loup Gailly        
+  <dt>Jean-loup Gailly
   <dd><a href="mailto:jloup@gzip.org">jloup@gzip.org</a>
   <dt>Mark Adler
   <dd><a href="mailto:madler@alumni.caltech.edu">madler@alumni.caltech.edu</a>
@@ -55,19 +55,19 @@
   Comments) 1950 to 1952 in the files
   <a href="ftp://ds.internic.net/rfc/rfc1950.txt">
   ftp://ds.internic.net/rfc/rfc1950.txt </a>
-  (zlib format), 
+  (zlib format),
   <a href="ftp://ds.internic.net/rfc/rfc1951.txt">
   rfc1951.txt </a>
-  (<a href="#deflate">deflate</a> format) and 
+  (<a href="#deflate">deflate</a> format) and
   <a href="ftp://ds.internic.net/rfc/rfc1952.txt">
   rfc1952.txt </a>
   (gzip format).
   <p>
-  This manual is converted from zlib.h by 
+  This manual is converted from zlib.h by
   <a href="mailto:piaip@csie.ntu.edu.tw"> piaip </a>
   <p>
   Visit <a href="http://ftp.cdrom.com/pub/infozip/zlib/">
-  http://ftp.cdrom.com/pub/infozip/zlib/</a> 
+  http://ftp.cdrom.com/pub/infozip/zlib/</a>
   for the official zlib web page.
   <p>
 
@@ -99,7 +99,7 @@
 <hr>
 <a name="Utility functions"><h2> Utility functions </h2>
      The following utility functions are implemented on top of the
-   <a href="#Basic functions">basic stream-oriented functions</a>. 
+   <a href="#Basic functions">basic stream-oriented functions</a>.
    To simplify the interface, some
    default options are assumed (compression level and memory usage,
    standard memory allocation functions). The source code of these
@@ -406,7 +406,7 @@
     enough room in the output buffer), <a href="#next_in">next_in</a> and <a href="#avail_in">avail_in</a> are updated and
     processing will resume at this point for the next call of <a href="#deflate">deflate</a>().
 
-  <li> 
+  <li>
     Provide more output starting at <a href="#next_out">next_out</a> and update <a href="#next_out">next_out</a> and <a href="#avail_out">avail_out</a>
     accordingly. This action is forced if the parameter flush is non zero.
     Forcing flush frequently degrades the compression ratio, so this parameter
@@ -453,7 +453,7 @@
   <a href="#deflate">deflate</a> has returned <a href="#Z_STREAM_END">Z_STREAM_END</a>, the only possible operations on the
   stream are <a href="#deflateReset">deflateReset</a> or <a href="#deflateEnd">deflateEnd</a>.
   <p>
-  
+
     <a href="#Z_FINISH">Z_FINISH</a> can be used immediately after <a href="#deflateInit">deflateInit</a> if all the compression
   is to be done in a single step. In this case, <a href="#avail_out">avail_out</a> must be at least
   0.1% larger than <a href="#avail_in">avail_in</a> plus 12 bytes.  If <a href="#deflate">deflate</a> does not return
@@ -493,7 +493,7 @@
    <p>
 
 <font color="Blue"><dt>  int  <a name="inflateInit">inflateInit</a> (<a href="#z_streamp">z_streamp</a> strm);</font>
-<dd>     
+<dd>
 	Initializes the internal stream <a href="#state">state</a> for decompression. The fields
    <a href="#next_in">next_in</a>, <a href="#avail_in">avail_in</a>, <a href="#zalloc">zalloc</a>, <a href="#zfree">zfree</a> and <a href="#opaque">opaque</a> must be initialized before by
    the caller. If <a href="#next_in">next_in</a> is not <a href="#Z_NULL">Z_NULL</a> and <a href="#avail_in">avail_in</a> is large enough (the exact
@@ -529,9 +529,9 @@
     enough room in the output buffer), <a href="#next_in">next_in</a> is updated and processing
     will resume at this point for the next call of <a href="#inflate">inflate</a>().
 
-  <li> Provide more output starting at <a href="#next_out">next_out</a> and update <a href="#next_out">next_out</a> and 
-    <a href="#avail_out">avail_out</a> accordingly.  <a href="#inflate">inflate</a>() provides as much output as possible, 
-    until there is no more input data or no more space in the output buffer 
+  <li> Provide more output starting at <a href="#next_out">next_out</a> and update <a href="#next_out">next_out</a> and
+    <a href="#avail_out">avail_out</a> accordingly.  <a href="#inflate">inflate</a>() provides as much output as possible,
+    until there is no more input data or no more space in the output buffer
     (see below about the flush parameter).
   </ul> <p>
 
@@ -566,7 +566,7 @@
 
      If a preset dictionary is needed at this point (see <a href="#inflateSetDictionary">inflateSetDictionary</a>
   below), <a href="#inflate">inflate</a> sets strm-<a href="#adler">adler</a> to the <a href="#adler32">adler32</a> checksum of the
-  dictionary chosen by the compressor and returns <a href="#Z_NEED_DICT">Z_NEED_DICT</a> ; otherwise 
+  dictionary chosen by the compressor and returns <a href="#Z_NEED_DICT">Z_NEED_DICT</a> ; otherwise
   it sets strm-&gt <a href="#adler">adler</a> to the <a href="#adler32">adler32</a> checksum of all output produced
   so far (that is, <a href="#total_out">total_out</a> bytes) and returns <a href="#Z_OK">Z_OK</a>, <a href="#Z_STREAM_END">Z_STREAM_END</a> or
   an error code as described below. At the end of the stream, <a href="#inflate">inflate</a>()
@@ -652,7 +652,7 @@
    memory, <a href="#Z_STREAM_ERROR">Z_STREAM_ERROR</a> if a parameter is invalid (such as an invalid
    method). <a href="#msg">msg</a> is set to null if there is no error message.  <a href="#deflateInit2">deflateInit2</a> does
    not perform any compression: this will be done by <a href="#deflate">deflate</a>().<p>
-                            
+
 <font color="Blue"><dt> int  <a name="deflateSetDictionary">deflateSetDictionary</a> (<a href="#z_streamp">z_streamp</a> strm, const Bytef *dictionary, uInt  dictLength);</font>
 <dd>
      Initializes the compression dictionary from the given byte sequence
@@ -723,7 +723,7 @@
 
      Before the call of <a href="#deflateParams">deflateParams</a>, the stream <a href="#state">state</a> must be set as for
    a call of <a href="#deflate">deflate</a>(), since the currently available input may have to
-   be compressed and flushed. In particular, strm-&gt <a href="#avail_out">avail_out</a> must be 
+   be compressed and flushed. In particular, strm-&gt <a href="#avail_out">avail_out</a> must be
    non-zero.<p>
 
      <a href="#deflateParams">deflateParams</a> returns <a href="#Z_OK">Z_OK</a> if success, <a href="#Z_STREAM_ERROR">Z_STREAM_ERROR</a> if the source
@@ -865,7 +865,7 @@
     uLong   <a name="reserved">reserved</a>;   /* <a href="#reserved">reserved</a> for future use */
 } <a href="#z_stream_s">z_stream</a> ;
 
-typedef <a href="#z_stream_s">z_stream</a> FAR * <a name="z_streamp">z_streamp</a>;  ÿ 
+typedef <a href="#z_stream_s">z_stream</a> FAR * <a name="z_streamp">z_streamp</a>;  ÿ
 </pre>
 </font>
    The application must update <a href="#next_in">next_in</a> and <a href="#avail_in">avail_in</a> when <a href="#avail_in">avail_in</a> has
@@ -904,7 +904,7 @@
 <font color="Blue">
 <pre>
 #define <a name="Z_NO_FLUSH">Z_NO_FLUSH</a>      0
-#define <a name="Z_PARTIAL_FLUSH">Z_PARTIAL_FLUSH</a> 1 
+#define <a name="Z_PARTIAL_FLUSH">Z_PARTIAL_FLUSH</a> 1
 	/* will be removed, use <a href="#Z_SYNC_FLUSH">Z_SYNC_FLUSH</a> instead */
 #define <a name="Z_SYNC_FLUSH">Z_SYNC_FLUSH</a>    2
 #define <a name="Z_FULL_FLUSH">Z_FULL_FLUSH</a>    3
diff --git a/qnx/package.qpg b/qnx/package.qpg
index 951f6fa..26c42c3 100644
--- a/qnx/package.qpg
+++ b/qnx/package.qpg
@@ -25,10 +25,10 @@
       <QPG:Files>
          <QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
          <QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
-         <QPG:Add file="../libz.so.1.2.0.4" install="/opt/lib/" user="root:bin" permission="644"/>
-         <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.0.4"/>
-         <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.0.4"/>
-         <QPG:Add file="../libz.so.1.2.0.4" install="/opt/lib/" component="slib"/>
+         <QPG:Add file="../libz.so.1.2.0.5" install="/opt/lib/" user="root:bin" permission="644"/>
+         <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.0.5"/>
+         <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.0.5"/>
+         <QPG:Add file="../libz.so.1.2.0.5" install="/opt/lib/" component="slib"/>
       </QPG:Files>
 
       <QPG:PackageFilter>
@@ -63,7 +63,7 @@
             </QPM:ProductDescription>
 
             <QPM:ReleaseDescription>
-               <QPM:ReleaseVersion>1.2.0.4</QPM:ReleaseVersion>
+               <QPM:ReleaseVersion>1.2.0.5</QPM:ReleaseVersion>
                <QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
                <QPM:ReleaseStability>Stable</QPM:ReleaseStability>
                <QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
diff --git a/uncompr.c b/uncompr.c
index 5200ebd..b59e3d0 100644
--- a/uncompr.c
+++ b/uncompr.c
@@ -1,6 +1,6 @@
 /* uncompr.c -- decompress a memory buffer
  * Copyright (C) 1995-2003 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* @(#) $Id$ */
diff --git a/win32/DLL_FAQ.txt b/win32/DLL_FAQ.txt
new file mode 100644
index 0000000..c44bce5
--- /dev/null
+++ b/win32/DLL_FAQ.txt
@@ -0,0 +1,358 @@
+
+            Frequently Asked Questions about ZLIB1.DLL
+
+
+This document describes the design, the rationale, and the usage
+of the official DLL build of zlib, named ZLIB1.DLL.  If you have
+general questions about zlib, you should see the file "FAQ" found
+in the zlib distribution, or at the following location:
+  http://www.gzip.org/zlib/zlib_faq.html
+
+
+ 1. What is ZLIB1.DLL, and how can I get it?
+
+  - ZLIB1.DLL is the official build of zlib as a DLL.
+    (Please remark the symbol '1' in the name.)
+
+    Pointers to a precompiled ZLIB1.DLL can be found in the zlib
+    web site at:
+      http://www.zlib.org/
+
+    Applications that link to ZLIB1.DLL can rely on the following
+    specification:
+
+    * The exported symbols are exclusively defined in the source
+      files "zlib.h" and "zlib.def", found in an official zlib
+      source distribution.
+    * The symbols are exported by name, not by ordinal.
+    * The exported names are undecorated.
+    * The calling convention of functions is "C" (CDECL).
+    * The ZLIB1.DLL binary is linked to MSVCRT.DLL.
+
+    The archive in which ZLIB1.DLL is bundled contains compiled
+    test programs that must run with a valid build of ZLIB1.DLL.
+    It is recommended to download the prebuilt DLL from the zlib
+    web site, instead of building it yourself, to avoid potential
+    incompatibilities that could be introduced by your compiler
+    and build settings.  If you do build the DLL yourself, please
+    make sure that it complies with all the above requirements,
+    and it runs with the precompiled test programs, bundled with
+    the original ZLIB1.DLL distribution and available at the zlib
+    web site.
+
+    If, for any reason, you need to build an incompatible DLL,
+    please use a different name.
+
+
+ 2. Why did you change the name of the DLL to ZLIB1.DLL?
+    What happened to the old ZLIB.DLL?
+
+  - The old ZLIB.DLL, built from zlib-1.1.x and earlier, required
+    compilation settings that were incompatible to those used by a
+    static build.  The DLL settings were supposed to be enabled by
+    defining the macro ZLIB_DLL, before including "zlib.h".
+    Incorrect handling of this macro was silently accepted at
+    build time, resulting in two major problems:
+
+    * ZLIB_DLL was missing from the old makefile.  When building
+      the DLL, not all people added it to the build options.  In
+      consequence, incompatible incarnations of ZLIB.DLL started
+      to circulate around the net.
+
+    * When switching from using the static library to using the
+      DLL, applications had to define the ZLIB_DLL macro and
+      to recompile all the sources that contained calls to zlib
+      functions.  Failure to do so resulted in creating binaries
+      that were unable to run with the official ZLIB.DLL build.
+
+    The only possible solution that we could foresee was to make a
+    binary-incompatible change in the DLL interfacing, in order to
+    remove the dependency on the ZLIB_DLL macro, and to release
+    the new DLL under a different name.
+
+    We chose the name ZLIB1.DLL, where '1' indicates the major
+    zlib version number.  We hope that we will not have to break
+    the binary compatibility again, at least not as long as the
+    zlib-1.x series will last.
+
+    There is still a ZLIB_DLL macro, that can trigger a more
+    efficient build and use of the DLL, but compatibility no
+    longer dependents on it.
+
+
+ 3. Can I build ZLIB.DLL from the new zlib sources, and replace
+    an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier?
+
+  - In principle, you can do it by assigning calling convention
+    keywords to the macros ZEXPORT and ZEXPORTVA.  In practice,
+    it depends on what you mean by "an old ZLIB.DLL", because
+    the old DLL exists in several mutually-incompatible versions.
+
+    If you have a compiled application that works with a certain
+    ZLIB.DLL without any known security issues, there is hardly
+    a need to rebuild the DLL from new sources only to link it to
+    the old app binary.  But if you really want to do it, you have
+    to find out first what kind of calling convention uses your
+    particular ZLIB.DLL build, and to use the same one in the new
+    build.  If you don't know what this is all about, you might be
+    better off if you would just forget it.
+
+
+ 4. Can I compile my application using the new zlib interface, and
+    link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or
+    earlier?
+
+  - The official answer is "no"; the real answer depends again on
+    what kind of ZLIB.DLL you have.  Even if you are lucky, this
+    course of action is unreliable.
+
+    If you rebuild your application and you intend to use a newer
+    version of zlib (post- 1.1.4), it is strongly recommended to
+    link it to the new ZLIB1.DLL.
+
+
+ 5. Why are the zlib symbols exported by name, and not by ordinal?
+
+  - Although exporting symbols by ordinal is a little faster, it
+    is risky.  Any single glitch in the maintenance or use of the
+    DEF file that contains the ordinals can result in incompatible
+    builds and frustrating crashes.  Simply put, the benefits of
+    exporting symbols by ordinal do not justify the risks.
+
+    Technically, it should be possible to maintain ordinals in
+    the DEF file, and still export the symbols by name.  Ordinals
+    exist in every DLL, and even if the dynamic linking performed
+    at the DLL startup is searching for names, ordinals serve as
+    hints, for a faster name lookup.  However, if the DEF file
+    contains ordinals, the Microsoft linker automatically builds
+    an implib that will cause the executables linked to it to use
+    those ordinals, and not the names.  It is interesting to
+    notice that the GNU linker for Win32 does not suffer from this
+    problem.
+
+    It is possible to avoid the DEF file if the exported symbols
+    are accompanied by a "__declspec(dllexport)" attribute in the
+    source files.  You can do this in zlib by predefining the
+    ZLIB_DLL macro.
+
+
+ 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling
+    convention.  Why not use the STDCALL convention?
+    STDCALL is the standard convention in Win32, and I need it in
+    my Visual Basic project!
+
+    (For readability, we use CDECL to refer to the convention
+     triggered by the "__cdecl" keyword, STDCALL to refer to
+     the convention triggered by "__stdcall", and FASTCALL to
+     refer to the convention triggered by "__fastcall".)
+
+  - Most of the native Windows API functions (without varargs) use
+    indeed the WINAPI convention (which translates to STDCALL in
+    Win32), but the standard C functions use CDECL.  If a user
+    application is intrinsically tied to the Windows API (e.g.
+    it calls native Windows API functions such as CreateFile()),
+    sometimes it makes sense to decorate its own functions with
+    WINAPI.  But if ANSI C or POSIX portability is a goal (e.g.
+    it calls standard C functions such as fopen()), it is not a
+    sound decision to request the inclusion of <windows.h>, or to
+    use non-ANSI constructs, for the sole purpose to make the user
+    functions STDCALL-able.
+
+    The functionality offered by zlib is not in the category of
+    "Windows functionality", but is more like "C functionality".
+
+    Technically, STDCALL is not bad; in fact, it is slightly
+    faster than CDECL, and it works with variable-argument
+    functions, just like CDECL.  It is unfortunate that, in spite
+    of using STDCALL in the Windows API, it is not the default
+    convention used by the C compilers that run under Windows.
+    The roots of the problem reside deep inside the unsafety of
+    the K&R-style function prototypes, where the argument types
+    are not specified; but that is another story for another day.
+
+    The fact that remains is that CDECL is the default convention.
+    Even if an explicit convention (such as STDCALL or FASTCALL)
+    is hard-coded into the function prototypes inside C headers,
+    problems may appear.  One problem, for example, deals with the
+    necessity to expose the convention in users' callbacks.
+
+    The calling convention issues are also important when using
+    zlib in other programming languages.  Some of them, like Ada
+    (GNAT) and Fortran (GNU G77), have C bindings implemented
+    initially on Unix, and relying on the C calling convention.
+    On the other hand, the pre- .NET versions of Microsoft Visual
+    Basic require STDCALL, while Borland Delphi prefers (although
+    it does not require) FASTCALL.
+
+    In fairness to all possible uses of zlib outside the C
+    programming language, we choose the default "C" convention.
+    Anyone interested in different bindings or conventions is
+    encouraged to maintain specialized projects.  The "contrib/"
+    directory from the zlib distribution already holds a couple
+    of foreign bindings, such as Ada, C++, and Delphi.
+
+
+ 7. I need a DLL for my Visual Basic project.  What can I do?
+
+  - Define the ZLIB_WINAPI macro before including "zlib.h", when
+    building both the DLL and the user application (except that
+    you don't need to define anything when using the DLL in Visual
+    Basic).  The ZLIB_WINAPI macro will switch on the WINAPI
+    (STDCALL) convention.  The name of this DLL must be different
+    than the official ZLIB1.DLL.
+
+    Gilles Vollant has contributed a build named ZLIBWAPI.DLL,
+    with the ZLIB_WINAPI macro turned on, and with the minizip
+    functionality built in.  For more information, please read
+    the notes inside "contrib/vstudio/readme.txt", found in the
+    zlib distribution.
+
+
+ 8. If my application uses ZLIB1.DLL, should I link it to
+    MSVCRT.DLL?  Why?
+
+  - It is not required, but it is recommended to link your
+    application to MSVCRT.DLL, if it uses ZLIB1.DLL.
+
+    The executables (.EXE, .DLL, etc.) that are involved in the
+    same process and are using the C run-time library (i.e. they
+    are calling standard C functions), must link to the same
+    library.  There are several libraries in the Win32 system:
+    CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc.
+    Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that
+    depend on it should also be linked to MSVCRT.DLL.
+
+
+ 9. Why are you saying that ZLIB1.DLL and my application must be
+    linked to the same C run-time (CRT) library?  I linked my
+    application and my DLLs to different C libraries (e.g. my
+    application to a static library, and my DLLs to MSVCRT.DLL),
+    and everything works fine.
+
+  - If a user library invokes only pure Win32 API (accessible via
+    <windows.h> and the related headers), its DLL build will work
+    in any context.  But if this library invokes standard C API,
+    things get more complicated.
+
+    There is a single Win32 library in a Win32 system.  Every
+    function in this library resides in a single DLL module, that
+    is safe to call from anywhere.  On the other hand, there are
+    multiple versions of the C library, and each of them has its
+    own separate internal state.  Standalone executables and user
+    DLLs that call standard C functions must link to a C run-time
+    (CRT) library, be it static or shared (DLL).  Intermixing
+    occurs when an executable (not necessarily standalone) and a
+    DLL are linked to different CRTs, and both are running in the
+    same process.
+
+    Intermixing multiple CRTs is possible, as long as their
+    internal states are kept intact.  The Microsoft Knowledge Base
+    articles KB94248 "HOWTO: Use the C Run-Time" and KB140584
+    "HOWTO: Link with the Correct C Run-Time (CRT) Library"
+    mention the potential problems raised by intermixing.
+
+    If intermixing works for you, it's because your application
+    and DLLs are avoiding the corruption of each of the CRTs'
+    internal states, maybe by careful design, or maybe by fortune.
+
+    Also note that linking ZLIB1.DLL to non-Microsoft CRTs (such
+    as those provided by Borland) raises similar problems.
+
+
+10. Why are you linking ZLIB1.DLL to MSVCRT.DLL?
+
+  - MSVCRT.DLL exists on every Windows 95 with a new service pack
+    installed, or with Microsoft Internet Explorer 4 or later, and
+    on all other Windows 4.x or later (Windows 98, Windows NT 4,
+    or later).  It is freely distributable; if not present in the
+    system, it can be downloaded from Microsoft or from other
+    software provider for free.
+
+    The fact that MSVCRT.DLL does not exist on a virgin Windows 95
+    is not so problematic.  The number of Windows 95 installations
+    is rapidly decreasing, Microsoft stopped supporting it a long
+    time ago, and many recent applications from various vendors,
+    including Microsoft, do not even run on it.  Furthermore, no
+    serious user should run Windows 95 without a proper update
+    installed.
+
+    There is also the fact that the mainstream C compilers for
+    Windows are Microsoft Visual C++ 6.0, and gcc/MinGW.  Both
+    are producing executables that link to MSVCRT.DLL by default,
+    without offering other dynamic CRTs as alternatives easy to
+    select by users.
+
+
+11. Why are you not linking ZLIB1.DLL to
+    <<my favorite C run-time library>> ?
+
+  - We considered and abandoned the following alternatives:
+
+    * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or
+      LIBCMT.LIB) is not a good option.  People are using the DLL
+      mainly to save disk space.  If you are linking your program
+      to a static C library, you may as well consider linking zlib
+      in statically, too.
+
+    * Linking ZLIB1.DLL to CRTDLL.DLL looks very appealing,
+      because CRTDLL.DLL is present on every Win32 installation.
+      Unfortunately, it has a series of problems: it raises
+      difficulties when using it with C++ code, it does not work
+      with 64-bit file offsets, (and so on...), and Microsoft
+      discontinued its support a long time ago.
+
+    * Linking ZLIB1.DLL to MSVCR70.DLL, supplied with the
+      Microsoft .NET platform and Visual C++ 7.0 or newer, is not
+      a good option.  Although it is available for free download
+      and distribution, its presence is scarce on today's Win32
+      installations.  If it will ever become more popular than
+      MSVCRT.DLL and will be pre-installed on the future Win32
+      systems, we will probably think again about it.
+
+    * Linking ZLIB1.DLL to NTDLL.DLL is not possible.
+      NTDLL.DLL exports only a part of the C library, and only on
+      Windows NT systems.
+
+
+12. I need to link my own DLL build to a CRT different than
+    MSVCRT.DLL.  What can I do?
+
+  - Feel free to rebuild the DLL from the zlib sources, and link
+    it the way you want.  You should, however, clearly state that
+    your build is unofficial.  You should give it a different file
+    name, and/or install it in a private directory that can be
+    accessed by your application only, and is not visible to the
+    others (e.g. it's not in the SYSTEM or the SYSTEM32 directory,
+    and it's not in the PATH).  Otherwise, your build may clash
+    with applications that link to the official build.
+
+    For example, in Cygwin, zlib is linked to the Cygwin runtime
+    CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL.
+
+
+13. May I include additional pieces of code that I find useful,
+    link them in ZLIB1.DLL, and export them?
+
+  - No.  A legitimate build of ZLIB1.DLL must not include code
+    that does not originate from the official zlib sources.  But
+    you can make your own private build, and give it a different
+    name, as suggested in the previous answer.
+
+    For example, in Borland Delphi and C++ Builder, zlib is a part
+    of the standard VCL library.  If an application links to VCL
+    dynamically, the name of the distributable binary (VCLxx.DLL)
+    does not posess any danger of clashing with a legitimate but
+    incompatible ZLIB1.DLL.
+
+
+14. I made my own ZLIB1.DLL build.  Can I test it for compliance?
+
+  - We prefer that you download the official DLL from the zlib
+    web site.  If you need something peculiar from this DLL, you
+    can send your suggestion to the zlib mailing list.
+
+    However, in case you do rebuild the DLL yourself, you can run
+    it with the test programs found in the DLL distribution.
+    Running these test programs is not a guarantee of compliance,
+    but a failure can imply a detected problem.
+
diff --git a/win32/Makefile-dll.msc b/win32/Makefile-dll.msc
deleted file mode 100644
index 516f4cf..0000000
--- a/win32/Makefile-dll.msc
+++ /dev/null
@@ -1,76 +0,0 @@
-# Makefile for zlib.dll -- Microsoft (Visual) C.

-# Author: Cosmin Truta, 11-Mar-2003.

-#

-# Usage: nmake -f win32/Makefile-dll.msc

-

-CC = cl

-LD = cl

-CFLAGS = -nologo -MD -O2

-LDFLAGS = -nologo

-

-OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj \

-       inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj

-

-# targets

-all: zlib.dll zlib.lib example.exe minigzip.exe

-

-zlib.lib: $(OBJS)

-	lib -out:$@ $(OBJS)

-

-zlib.dll: $(OBJS) win32/zlib.def

-	link -release -def:win32/zlib.def -dll -out:$@ $(OBJS)

-

-zlib.lib: zlib.dll

-

-example.exe: example.obj zlib.lib

-	$(LD) $(LDFLAGS) example.obj zlib.lib

-

-minigzip.exe: minigzip.obj zlib.lib

-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib

-

-.c.obj:

-	$(CC) -c $(CFLAGS) $*.c

-

-adler32.obj: adler32.c zlib.h zconf.h

-

-compress.obj: compress.c zlib.h zconf.h

-

-crc32.obj: crc32.c zlib.h zconf.h crc32.h

-

-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h

-

-gzio.obj: gzio.c zutil.h zlib.h zconf.h

-

-infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h inffixed.h

-

-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h

-

-inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h inffixed.h

-

-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h

-

-trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h

-

-uncompr.obj: uncompr.c zlib.h zconf.h

-

-zutil.obj: zutil.c zutil.h zlib.h zconf.h

-

-example.obj: example.c zlib.h zconf.h

-

-minigzip.obj: minigzip.c zlib.h zconf.h

-

-# testing

-test: example.exe minigzip.exe

-	example

-	echo hello world | minigzip | minigzip -d 

-

-# cleanup

-clean:

-	del *.obj

-	del *.dll

-	del *.lib

-	del *.exp

-	del *.exe

diff --git a/win32/Makefile.bor b/win32/Makefile.bor
index f1a1c46..b802519 100644
--- a/win32/Makefile.bor
+++ b/win32/Makefile.bor
@@ -1,37 +1,48 @@
 # Makefile for zlib
 # Borland C++ for Win32
-# Updated for zlib-1.2.x by Cosmin Truta, 11-Mar-2003.
+#
+# Updated for zlib 1.2.x by Cosmin Truta, 11-Mar-2003
+# Last updated: 28-Aug-2003
+#
+# Usage:
+#  make -f win32/Makefile.bor
+#  make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj
 
-# Usage: "make -f win32/makefile.bor"
+# ------------ Borland C++ ------------
 
-# ------------ Borland C++ for Win32 ------------
-
-#    Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
-#    should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
-#    to the declaration of LOC here:
+# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or
+# added to the declaration of LOC here:
 LOC = $(LOCAL_ZLIB)
 
 CC = bcc32
+AS = bcc32
 LD = bcc32
 AR = tlib
-CFLAGS = -O2 -d -k- $(LOC)
+CFLAGS  = -a -d -k- -O2 $(LOC)
+ASFLAGS = $(LOC)
 LDFLAGS = $(LOC)
 
 
 # variables
 ZLIB_LIB = zlib.lib
 
-OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
-OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJ1  = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
+OBJ2  = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+#OBJA =
 OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj
 OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+#OBJPA=
 
 
 # targets
 all: $(ZLIB_LIB) example.exe minigzip.exe
 
 .c.obj:
-	$(CC) -c $(CFLAGS) $*.c
+	$(CC) -c $(CFLAGS) $<
+
+.asm.obj:
+	$(AS) -c $(ASFLAGS) $<
 
 adler32.obj: adler32.c zlib.h zconf.h
 
@@ -67,10 +78,17 @@
 
 # For the sake of the old Borland make,
 # the command line is cut to fit in the MS-DOS 128 byte limit:
-$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA)
 	-del $(ZLIB_LIB)
 	$(AR) $(ZLIB_LIB) $(OBJP1)
 	$(AR) $(ZLIB_LIB) $(OBJP2)
+	$(AR) $(ZLIB_LIB) $(OBJPA)
+
+
+# testing
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d
 
 example.exe: example.obj $(ZLIB_LIB)
 	$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
@@ -78,14 +96,12 @@
 minigzip.exe: minigzip.obj $(ZLIB_LIB)
 	$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
 
-test: example.exe minigzip.exe
-	example
-	echo hello world | minigzip | minigzip -d 
 
+# cleanup
 clean:
 	-del *.obj
-	-del *.exe
 	-del *.lib
+	-del *.exe
 	-del *.tds
 	-del zlib.bak
 	-del foo.gz
diff --git a/old/msdos/Makefile.emx b/win32/Makefile.emx
similarity index 84%
copy from old/msdos/Makefile.emx
copy to win32/Makefile.emx
index 0e5e5cc..7b08424 100644
--- a/old/msdos/Makefile.emx
+++ b/win32/Makefile.emx
@@ -1,13 +1,13 @@
-# Makefile for zlib.  Modified for emx 0.9c by Chr. Spieler, 6/17/98.
+# Makefile for zlib.  Modified for emx/rsxnt by Chr. Spieler, 6/16/98.
 # Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile, or to compile and test, type:
-# 
+#
 #   make -fmakefile.emx;  make test -fmakefile.emx
-# 
+#
 
-CC=gcc
+CC=gcc -Zwin32
 
 #CFLAGS=-MMD -O
 #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
@@ -34,7 +34,7 @@
 exec_prefix = $(prefix)
 
 OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
-       zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+       zutil.o inflate.o infback.o inftrees.o inffast.o
 
 TEST_OBJS = example.o minigzip.o
 
@@ -42,7 +42,7 @@
 
 test: all
 	./example
-	echo hello world | .\minigzip | .\minigzip -d 
+	echo hello world | .\minigzip | .\minigzip -d
 
 %.o : %.c
 	$(CC) $(CFLAGS) -c $< -o $@
diff --git a/win32/Makefile.gcc b/win32/Makefile.gcc
index da32859..62a8430 100644
--- a/win32/Makefile.gcc
+++ b/win32/Makefile.gcc
@@ -1,26 +1,36 @@
 # Makefile for zlib, derived from Makefile.dj2.
 # Modified for mingw32 by C. Spieler, 6/16/98.
-# Updated for zlib-1.2.x by Cosmin Truta, 11-Mar-2003.
+# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003.
+# Last updated: 1-Aug-2003.
 # Tested under Cygwin and MinGW.
 
-# Copyright (C) 1995-1998 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h 
+# Copyright (C) 1995-2003 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
 
 # To compile, or to compile and test, type:
-# 
-#   make -fmakefile.gcc;  make test -fmakefile.gcc
-# 
+#
+#   make -fmakefile.gcc;  make test testdll -fmakefile.gcc
+#
+# To use the asm code, type:
+#   cp contrib/asm?86/match.S ./match.S
+#   make LOC=-DASMV OBJA=match.o -fmakefile.gcc
+#
 # To install libz.a, zconf.h and zlib.h in the system directories, type:
-# 
-#    make install -fmakefile.gcc
-# 
+#
+#   make install -fmakefile.gcc
 
-LIB = libz.a
-SHAREDLIB = zlib.dll
-VER = 1.2.0
+# Note:
+# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN),
+# the DLL name should be changed from "zlib1.dll".
+
+STATICLIB = libz.a
+SHAREDLIB = zlib1.dll
+IMPLIB    = libzdll.a
+
+#LOC = -DASMV
+#LOC = -DDEBUG -g
 
 CC = gcc
-#CFLAGS = -DDEBUG -MMD -g
 CFLAGS = $(LOC) -O3 -Wall
 
 AS = $(CC)
@@ -33,6 +43,7 @@
 ARFLAGS = rcs
 
 RC = windres
+RCFLAGS = --define GCC_WINDRES
 
 CP = cp -fp
 # If GNU install is available, replace $(CP) with install.
@@ -44,61 +55,75 @@
 
 OBJS = adler32.o compress.o crc32.o deflate.o gzio.o infback.o \
        inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
-
-DLLDEF = win32/zlibgcc.def
-
-# to use the asm code: make OBJA=match.o
 OBJA =
 
-TEST_OBJS = example.o minigzip.o
+all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example minigzip example_d minigzip_d
 
-all: $(LIB) $(SHAREDLIB) example minigzip
-
-test: all
+test: example minigzip
 	./example
-	echo hello world | ./minigzip | ./minigzip -d 
+	echo hello world | ./minigzip | ./minigzip -d
+
+testdll: example_d minigzip_d
+	./example_d
+	echo hello world | ./minigzip_d | ./minigzip_d -d
 
 .c.o:
 	$(CC) $(CFLAGS) -c -o $@ $<
 
-libz.a: $(OBJS)
-	$(AR) $(ARFLAGS) $@ $(OBJS)
+.S.o:
+	$(AS) $(ASFLAGS) -c -o $@ $<
 
-$(SHAREDLIB): $(OBJS) $(DLLDEF) zlibrc.o
-	dllwrap --driver-name $(CC) --def $(DLLDEF) -o $@ $(OBJS) zlibrc.o
+$(STATICLIB): $(OBJS) $(OBJA)
+	$(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA)
 
-example: example.o $(LIB)
-	$(LD) -o $@ $< $(LIB)
+$(IMPLIB): $(SHAREDLIB)
 
-minigzip: minigzip.o $(LIB)
-	$(LD) -o $@ $< $(LIB)
+$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o
+	dllwrap --driver-name $(CC) --def win32/zlib.def \
+	  --implib $(IMPLIB) -o $@ $(OBJS) $(OBJA) zlibrc.o
+	strip $@
 
-zlibrc.o: win32/zlib.rc
-	-$(RC) -o $@ --define GCC_WINDRES win32/zlib.rc
+example: example.o $(STATICLIB)
+	$(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB)
+
+minigzip: minigzip.o $(STATICLIB)
+	$(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB)
+
+example_d: example.o $(IMPLIB)
+	$(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB)
+
+minigzip_d: minigzip.o $(IMPLIB)
+	$(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB)
+
+zlibrc.o: win32/zlib1.rc
+	$(RC) $(RCFLAGS) -o $@ win32/zlib1.rc
 
 
-# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
+# INCLUDE_PATH and LIBRARY_PATH must be set.
 
-.PHONY : uninstall clean
+.PHONY: install uninstall clean
 
 install: zlib.h zconf.h $(LIB)
 	-@if not exist $(INCLUDE_PATH)/nul mkdir $(INCLUDE_PATH)
 	-@if not exist $(LIBRARY_PATH)/nul mkdir $(LIBRARY_PATH)
-	$(INSTALL) zlib.h $(INCLUDE_PATH)
-	$(INSTALL) zconf.h $(INCLUDE_PATH)
-	$(INSTALL) $(LIB) $(LIBRARY_PATH)
+	-$(INSTALL) zlib.h $(INCLUDE_PATH)
+	-$(INSTALL) zconf.h $(INCLUDE_PATH)
+	-$(INSTALL) $(STATICLIB) $(LIBRARY_PATH)
+	-$(INSTALL) $(IMPLIB) $(LIBRARY_PATH)
 
 uninstall:
-	$(RM) $(INCLUDE_PATH)/zlib.h
-	$(RM) $(INCLUDE_PATH)/zconf.h
-	$(RM) $(LIBRARY_PATH)/libz.a
+	-$(RM) $(INCLUDE_PATH)/zlib.h
+	-$(RM) $(INCLUDE_PATH)/zconf.h
+	-$(RM) $(LIBRARY_PATH)/$(STATICLIB)
+	-$(RM) $(LIBRARY_PATH)/$(IMPLIB)
 
 clean:
-	$(RM) *.o
-	$(RM) *.exe
-	$(RM) libz.a
-	$(RM) zlib.dll
-	$(RM) foo.gz
+	-$(RM) $(STATICLIB)
+	-$(RM) $(SHAREDLIB)
+	-$(RM) $(IMPLIB)
+	-$(RM) *.o
+	-$(RM) *.exe
+	-$(RM) foo.gz
 
 adler32.o: zlib.h zconf.h
 compress.o: zlib.h zconf.h
@@ -110,7 +135,7 @@
 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 
+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  
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/win32/Makefile.msc b/win32/Makefile.msc
index 4dc8819..528ecaa 100644
--- a/win32/Makefile.msc
+++ b/win32/Makefile.msc
@@ -1,92 +1,126 @@
-# Makefile for Win32 zlib.dll and the static library zlibstat.lib

-# -- Microsoft (Visual) C.

-# Author: Cosmin Truta, 11-Mar-2003

-#         Christian Spieler, 19-Mar-2003

-#

-# Usage: nmake -f win32/Makefile.msc

-

-CC = cl

-LD = cl

-RC = rc

-CFLAGS = -nologo -MD -O2

-LDFLAGS = -nologo

-

-OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj \

-       inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj

-

-# targets

-all: zlib.dll zlibstat.lib example.exe minigzip.exe exampl_s.exe minigz_s.exe

-

-zlibstat.lib: $(OBJS)

-	lib -out:$@ $(OBJS)

-

-zlib.dll: $(OBJS) zlib.res win32/zlib.def

-	link -release -def:win32/zlib.def -dll -out:$@ $(OBJS) zlib.res

-

-zlib.lib: zlib.dll

-

-example.exe: example.obj zlib.lib

-	$(LD) $(LDFLAGS) example.obj zlib.lib

-

-minigzip.exe: minigzip.obj zlib.lib

-	$(LD) $(LDFLAGS) minigzip.obj zlib.lib

-

-exampl_s.exe: example.obj zlibstat.lib

-	$(LD) $(LDFLAGS) -o $@ example.obj zlibstat.lib

-

-minigz_s.exe: minigzip.obj zlibstat.lib

-	$(LD) $(LDFLAGS) -o $@ minigzip.obj zlibstat.lib

-

-.c.obj:

-	$(CC) -c $(CFLAGS) $<

-

-zlib.res: win32/zlib.rc

-	$(RC) /l 0x409 /fo$@ /d WIN32 win32/zlib.rc

-

-adler32.obj: adler32.c zlib.h zconf.h

-

-compress.obj: compress.c zlib.h zconf.h

-

-crc32.obj: crc32.c zlib.h zconf.h crc32.h

-

-deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h

-

-gzio.obj: gzio.c zutil.h zlib.h zconf.h

-

-infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h inffixed.h

-

-inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h

-

-inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \

-             inffast.h inffixed.h

-

-inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h

-

-trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h

-

-uncompr.obj: uncompr.c zlib.h zconf.h

-

-zutil.obj: zutil.c zutil.h zlib.h zconf.h

-

-example.obj: example.c zlib.h zconf.h

-

-minigzip.obj: minigzip.c zlib.h zconf.h

-

-# testing

-test: example.exe minigzip.exe

-	example

-	echo hello world | minigzip | minigzip -d 

-

-teststat: exampl_s.exe minigz_s.exe

-	exampl_s

-	echo hello world | minigz_s | minigz_s -d 

-

-# cleanup

-clean:

-	del *.obj

-	del *.dll

-	del *.lib

-	del *.exp

-	del *.exe

+# Makefile for zlib -- Microsoft (Visual) C
+#
+# Authors:
+#   Cosmin Truta, 11-Mar-2003
+#   Christian Spieler, 19-Mar-2003
+#
+# Last updated:
+#   Cosmin Truta, 27-Aug-2003
+#
+# Usage:
+#   nmake -f win32/Makefile.msc            (standard build)
+#   nmake -f win32/Makefile.msc LOC=-DFOO  (nonstandard build)
+#   nmake -f win32/Makefile.msc LOC=-DASMV OBJA=match.obj  (use ASM code)
+
+
+# optional build flags
+LOC =
+
+
+# variables
+STATICLIB = zlib.lib
+SHAREDLIB = zlib1.dll
+IMPLIB    = zdll.lib
+
+CC = cl
+AS = ml
+LD = link
+AR = lib
+RC = rc
+CFLAGS  = -nologo -MD -O2 $(LOC)
+ASFLAGS = -coff
+LDFLAGS = -nologo -release
+ARFLAGS = -nologo
+RCFLAGS = /dWIN32 /r
+
+OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj \
+       inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJA =
+
+
+# targets
+all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \
+     example.exe minigzip.exe example_d.exe minigzip_d.exe
+
+$(STATICLIB): $(OBJS) $(OBJA)
+	$(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA)
+
+$(IMPLIB): $(SHAREDLIB)
+
+$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlib1.res
+	$(LD) $(LDFLAGS) -def:win32/zlib.def -dll -implib:$(IMPLIB) \
+	  -out:$@ $(OBJS) $(OBJA) zlib1.res
+
+example.exe: example.obj $(STATICLIB)
+	$(LD) $(LDFLAGS) example.obj $(STATICLIB)
+
+minigzip.exe: minigzip.obj $(STATICLIB)
+	$(LD) $(LDFLAGS) minigzip.obj $(STATICLIB)
+
+example_d.exe: example.obj $(IMPLIB)
+	$(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB)
+
+minigzip_d.exe: minigzip.obj $(IMPLIB)
+	$(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB)
+
+.c.obj:
+	$(CC) -c $(CFLAGS) $<
+
+.asm.obj:
+	$(AS) -c $(ASFLAGS) $<
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzio.obj: gzio.c zutil.h zlib.h zconf.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+             inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+             inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+             inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: example.c zlib.h zconf.h
+
+minigzip.obj: minigzip.c zlib.h zconf.h
+
+zlib1.res: win32/zlib1.rc
+	$(RC) $(RCFLAGS) /fo$@ win32/zlib1.rc
+
+
+# testing
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d
+
+testdll: example_d.exe minigzip_d.exe
+	example_d
+	echo hello world | minigzip_d | minigzip_d -d
+
+
+# cleanup
+clean:
+	-del $(STATICLIB)
+	-del $(SHAREDLIB)
+	-del $(IMPLIB)
+	-del *.obj
+	-del *.res
+	-del *.exp
+	-del *.exe
+	-del foo.gz
diff --git a/win32/zlib.def b/win32/zlib.def
index d299ed5..5688a1c 100644
--- a/win32/zlib.def
+++ b/win32/zlib.def
@@ -1,52 +1,59 @@
-LIBRARY		zlib.dll
-DESCRIPTION	"zlib data compression library"
+LIBRARY
+; zlib data compression library
 
 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
-; since zlib-1.2.0:
-    inflateCopy                    @42
-    inflateBackInit_               @43
-    inflateBack                    @44
-    inflateBackEnd                 @45
-    compressBound                  @46
-    deflateBound                   @47
+; basic functions
+    zlibVersion
+    deflate
+    deflateEnd
+    inflate
+    inflateEnd
+; advanced functions
+    deflateSetDictionary
+    deflateCopy
+    deflateReset
+    deflateParams
+    deflateBound
+    inflateSetDictionary
+    inflateSync
+    inflateCopy
+    inflateReset
+    inflateBack
+    inflateBackEnd
+    zlibCompileFlags
+; utility functions
+    compress
+    compress2
+    compressBound
+    uncompress
+    gzopen
+    gzdopen
+    gzsetparams
+    gzread
+    gzwrite
+    gzprintf
+    gzputs
+    gzgets
+    gzputc
+    gzgetc
+    gzungetc
+    gzflush
+    gzseek
+    gzrewind
+    gztell
+    gzeof
+    gzclose
+    gzerror
+    gzclearerr
+; checksum functions
+    adler32
+    crc32
+; various hacks, don't look :)
+    deflateInit_
+    deflateInit2_
+    inflateInit_
+    inflateInit2_
+    inflateBackInit_
+    inflateSyncPoint
+    get_crc_table
+    zError
diff --git a/win32/zlib1.rc b/win32/zlib1.rc
new file mode 100644
index 0000000..138d30c
--- /dev/null
+++ b/win32/zlib1.rc
@@ -0,0 +1,39 @@
+#include <windows.h>
+
+#ifdef GCC_WINDRES
+VS_VERSION_INFO		VERSIONINFO
+#else
+VS_VERSION_INFO		VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE
+#endif
+  FILEVERSION		1,2,0,5
+  PRODUCTVERSION	1,2,0,5
+  FILEFLAGSMASK		VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+  FILEFLAGS		1
+#else
+  FILEFLAGS		0
+#endif
+  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.0.5\0"
+      VALUE "InternalName",	"zlib1.dll\0"
+      VALUE "LegalCopyright",	"(C) 1995-2003 Jean-loup Gailly & Mark Adler\0"
+      VALUE "OriginalFilename",	"zlib1.dll\0"
+      VALUE "ProductName",	"zlib\0"
+      VALUE "ProductVersion",	"1.2.0.5\0"
+      VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+    END
+  END
+  BLOCK "VarFileInfo"
+  BEGIN
+    VALUE "Translation", 0x0409, 1252
+  END
+END
diff --git a/zconf.h b/zconf.h
index 28e9235..7ef861c 100644
--- a/zconf.h
+++ b/zconf.h
@@ -51,42 +51,58 @@
 #  define voidp         z_voidp
 #endif
 
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+#  define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+#  define WINDOWS
+#endif
 #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
 #  define WIN32
 #endif
-#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
-#  ifndef __32BIT__
-#    define __32BIT__
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+#    ifndef SYS16BIT
+#      define SYS16BIT
+#    endif
 #  endif
 #endif
-#if defined(__MSDOS__) && !defined(MSDOS)
-#  define MSDOS
-#endif
 
 /*
  * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
  * than 64k bytes at a time (needed on systems with 16-bit int).
  */
-#if defined(MSDOS) && !defined(__32BIT__)
+#ifdef SYS16BIT
 #  define MAXSEG_64K
 #endif
 #ifdef MSDOS
 #  define UNALIGNED_OK
 #endif
 
-#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
+#ifdef __STDC_VERSION__
+#  ifndef STDC
+#    define STDC
+#  endif
+#  if __STDC_VERSION__ >= 199901L
+#    ifndef STDC99
+#      define STDC99
+#    endif
+#  endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
 #  define STDC
 #endif
-#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
-#  ifndef STDC
-#    define STDC
-#  endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+#  define STDC
 #endif
-
-#if defined __HOS_AIX__
-#  ifndef STDC
-#    define STDC
-#  endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+#  define STDC
 #endif
 
 #ifndef STDC
@@ -96,7 +112,7 @@
 #endif
 
 /* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
 #  define NO_DUMMY_DECL
 #endif
 
@@ -147,58 +163,56 @@
  * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
  * just define FAR to be empty.
  */
-#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
-   /* MSC small or medium model */
-#  define SMALL_MEDIUM
-#  ifdef _MSC_VER
-#    define FAR _far
-#  else
-#    define FAR far
-#  endif
-#endif
-#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
-#  ifndef __32BIT__
+#ifdef SYS16BIT
+#  if defined(M_I86SM) || defined(M_I86MM)
+     /* MSC small or medium model */
 #    define SMALL_MEDIUM
-#    define FAR _far
+#    ifdef _MSC_VER
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#  if (defined(__SMALL__) || defined(__MEDIUM__))
+     /* Turbo C small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef __BORLANDC__
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
 #  endif
 #endif
 
-/* If building or using a Windows DLL, compile with -DZLIB_DLL.
- * The calls to ZEXTERN functions will be more efficient this way.
- */
-#if defined(_WINDOWS) || defined(WINDOWS) || defined(WIN32)
-#  ifdef FAR
-#    undef FAR
-#  endif
-   /* For zlib, the basic Win32 API declarations are sufficient.  Whenever
-    * a program that uses zlib requires the full Win32 API set, it has
-    * to include <windows.h> prior to "zlib.h".
+#if defined(WINDOWS) || defined(WIN32)
+   /* If building or using zlib as a DLL, define ZLIB_DLL.
+    * This is not mandatory, but it offers a little performance increase.
     */
-#  if defined(WIN32) && (!defined(WIN32_LEAN_AND_MEAN))
-#    define WIN32_LEAN_AND_MEAN
-#  endif
-#  include <windows.h>
-#  if !defined(WIN32) || (defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
-#    if defined(ZLIB_DLL) && defined(ZLIB_INTERNAL)
-#      define ZEXPORT   WINAPI _export
-#      define ZEXPORTVA FAR _cdecl _export
-#    else
-#      define ZEXPORT   FAR _cdecl
-#      define ZEXPORTVA FAR _cdecl
-#    endif
-#  else
-     /* a fully Win32-compliant compiler */
-#    define ZEXPORTVA CDECL
-#    ifdef ZLIB_DLL
-#      define ZEXPORT WINAPI
+#  ifdef ZLIB_DLL
+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
 #      ifdef ZLIB_INTERNAL
 #        define ZEXTERN extern __declspec(dllexport)
 #      else
 #        define ZEXTERN extern __declspec(dllimport)
 #      endif
+#    endif
+#  endif  /* ZLIB_DLL */
+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+    * define ZLIB_WINAPI.
+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+    */
+#  ifdef ZLIB_WINAPI
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+     /* No need for _export, use ZLIB.DEF instead. */
+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+#    define ZEXPORT WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA WINAPIV
 #    else
-#      define ZEXPORT CDECL
-#      define ZEXTERN extern
+#      define ZEXPORTVA FAR CDECL
 #    endif
 #  endif
 #endif
@@ -215,15 +229,15 @@
 #  endif
 #endif
 
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
 #ifndef ZEXPORT
 #  define ZEXPORT
 #endif
 #ifndef ZEXPORTVA
 #  define ZEXPORTVA
 #endif
-#ifndef ZEXTERN
-#  define ZEXTERN extern
-#endif
 
 #ifndef FAR
 #  define FAR
@@ -248,12 +262,12 @@
 
 #ifdef STDC
    typedef void const *voidpc;
-   typedef void FAR *voidpf;
-   typedef void     *voidp;
+   typedef void FAR   *voidpf;
+   typedef void       *voidp;
 #else
    typedef Byte const *voidpc;
-   typedef Byte FAR *voidpf;
-   typedef Byte     *voidp;
+   typedef Byte FAR   *voidpf;
+   typedef Byte       *voidp;
 #endif
 
 #if 0           /* HAVE_UNISTD_H -- this line is updated by ./configure */
diff --git a/zconf.in.h b/zconf.in.h
index 28e9235..7ef861c 100644
--- a/zconf.in.h
+++ b/zconf.in.h
@@ -51,42 +51,58 @@
 #  define voidp         z_voidp
 #endif
 
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+#  define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+#  define WINDOWS
+#endif
 #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
 #  define WIN32
 #endif
-#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
-#  ifndef __32BIT__
-#    define __32BIT__
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+#    ifndef SYS16BIT
+#      define SYS16BIT
+#    endif
 #  endif
 #endif
-#if defined(__MSDOS__) && !defined(MSDOS)
-#  define MSDOS
-#endif
 
 /*
  * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
  * than 64k bytes at a time (needed on systems with 16-bit int).
  */
-#if defined(MSDOS) && !defined(__32BIT__)
+#ifdef SYS16BIT
 #  define MAXSEG_64K
 #endif
 #ifdef MSDOS
 #  define UNALIGNED_OK
 #endif
 
-#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
+#ifdef __STDC_VERSION__
+#  ifndef STDC
+#    define STDC
+#  endif
+#  if __STDC_VERSION__ >= 199901L
+#    ifndef STDC99
+#      define STDC99
+#    endif
+#  endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
 #  define STDC
 #endif
-#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
-#  ifndef STDC
-#    define STDC
-#  endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+#  define STDC
 #endif
-
-#if defined __HOS_AIX__
-#  ifndef STDC
-#    define STDC
-#  endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+#  define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+#  define STDC
 #endif
 
 #ifndef STDC
@@ -96,7 +112,7 @@
 #endif
 
 /* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
 #  define NO_DUMMY_DECL
 #endif
 
@@ -147,58 +163,56 @@
  * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
  * just define FAR to be empty.
  */
-#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
-   /* MSC small or medium model */
-#  define SMALL_MEDIUM
-#  ifdef _MSC_VER
-#    define FAR _far
-#  else
-#    define FAR far
-#  endif
-#endif
-#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
-#  ifndef __32BIT__
+#ifdef SYS16BIT
+#  if defined(M_I86SM) || defined(M_I86MM)
+     /* MSC small or medium model */
 #    define SMALL_MEDIUM
-#    define FAR _far
+#    ifdef _MSC_VER
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
+#  endif
+#  if (defined(__SMALL__) || defined(__MEDIUM__))
+     /* Turbo C small or medium model */
+#    define SMALL_MEDIUM
+#    ifdef __BORLANDC__
+#      define FAR _far
+#    else
+#      define FAR far
+#    endif
 #  endif
 #endif
 
-/* If building or using a Windows DLL, compile with -DZLIB_DLL.
- * The calls to ZEXTERN functions will be more efficient this way.
- */
-#if defined(_WINDOWS) || defined(WINDOWS) || defined(WIN32)
-#  ifdef FAR
-#    undef FAR
-#  endif
-   /* For zlib, the basic Win32 API declarations are sufficient.  Whenever
-    * a program that uses zlib requires the full Win32 API set, it has
-    * to include <windows.h> prior to "zlib.h".
+#if defined(WINDOWS) || defined(WIN32)
+   /* If building or using zlib as a DLL, define ZLIB_DLL.
+    * This is not mandatory, but it offers a little performance increase.
     */
-#  if defined(WIN32) && (!defined(WIN32_LEAN_AND_MEAN))
-#    define WIN32_LEAN_AND_MEAN
-#  endif
-#  include <windows.h>
-#  if !defined(WIN32) || (defined(__BORLANDC__) && (__BORLANDC__ < 0x500))
-#    if defined(ZLIB_DLL) && defined(ZLIB_INTERNAL)
-#      define ZEXPORT   WINAPI _export
-#      define ZEXPORTVA FAR _cdecl _export
-#    else
-#      define ZEXPORT   FAR _cdecl
-#      define ZEXPORTVA FAR _cdecl
-#    endif
-#  else
-     /* a fully Win32-compliant compiler */
-#    define ZEXPORTVA CDECL
-#    ifdef ZLIB_DLL
-#      define ZEXPORT WINAPI
+#  ifdef ZLIB_DLL
+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
 #      ifdef ZLIB_INTERNAL
 #        define ZEXTERN extern __declspec(dllexport)
 #      else
 #        define ZEXTERN extern __declspec(dllimport)
 #      endif
+#    endif
+#  endif  /* ZLIB_DLL */
+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+    * define ZLIB_WINAPI.
+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+    */
+#  ifdef ZLIB_WINAPI
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+     /* No need for _export, use ZLIB.DEF instead. */
+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+#    define ZEXPORT WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA WINAPIV
 #    else
-#      define ZEXPORT CDECL
-#      define ZEXTERN extern
+#      define ZEXPORTVA FAR CDECL
 #    endif
 #  endif
 #endif
@@ -215,15 +229,15 @@
 #  endif
 #endif
 
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
 #ifndef ZEXPORT
 #  define ZEXPORT
 #endif
 #ifndef ZEXPORTVA
 #  define ZEXPORTVA
 #endif
-#ifndef ZEXTERN
-#  define ZEXTERN extern
-#endif
 
 #ifndef FAR
 #  define FAR
@@ -248,12 +262,12 @@
 
 #ifdef STDC
    typedef void const *voidpc;
-   typedef void FAR *voidpf;
-   typedef void     *voidp;
+   typedef void FAR   *voidpf;
+   typedef void       *voidp;
 #else
    typedef Byte const *voidpc;
-   typedef Byte FAR *voidpf;
-   typedef Byte     *voidp;
+   typedef Byte FAR   *voidpf;
+   typedef Byte       *voidp;
 #endif
 
 #if 0           /* HAVE_UNISTD_H -- this line is updated by ./configure */
diff --git a/zlib.3 b/zlib.3
index f5bdb8d..2601aea 100644
--- a/zlib.3
+++ b/zlib.3
@@ -1,4 +1,4 @@
-.TH ZLIB 3 "xx July 2003"
+.TH ZLIB 3 "8 September 2003"
 .SH NAME
 zlib \- compression/decompression library
 .SH SYNOPSIS
@@ -97,7 +97,7 @@
 http://www.gzip.org/zlib/
 .LP
 The data format used by the zlib library is described by RFC
-(Request for Comments) 1950 to 1952 in the files: 
+(Request for Comments) 1950 to 1952 in the files:
 .IP
 http://www.ietf.org/rfc/rfc1950.txt (concerning zlib format)
 .br
@@ -133,7 +133,7 @@
 Send questions and/or comments to zlib@gzip.org,
 or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
 .SH AUTHORS
-Version 1.2.0.4
+Version 1.2.0.5
 Copyright (C) 1995-2003 Jean-loup Gailly (jloup@gzip.org)
 and Mark Adler (madler@alumni.caltech.edu).
 .LP
diff --git a/zlib.h b/zlib.h
index 3c4218a..45f1bef 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.2.0.4, August 10th, 2003
+  version 1.2.0.5, September 8th, 2003
 
   Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler
 
@@ -37,10 +37,10 @@
 extern "C" {
 #endif
 
-#define ZLIB_VERSION "1.2.0.4"
-#define ZLIB_VERNUM 0x1204
+#define ZLIB_VERSION "1.2.0.5"
+#define ZLIB_VERNUM 0x1205
 
-/* 
+/*
      The 'zlib' compression library provides in-memory compression and
   decompression functions, including integrity checks of the uncompressed
   data.  This version of the library supports only one compression method
@@ -143,7 +143,8 @@
 #define Z_SYNC_FLUSH    2
 #define Z_FULL_FLUSH    3
 #define Z_FINISH        4
-/* Allowed flush values; see deflate() below for details */
+#define Z_BLOCK         5
+/* Allowed flush values; see deflate() and inflate() below for details */
 
 #define Z_OK            0
 #define Z_STREAM_END    1
@@ -192,7 +193,7 @@
    This check is automatically made by deflateInit and inflateInit.
  */
 
-/* 
+/*
 ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
 
      Initializes the internal stream state for compression. The fields
@@ -272,7 +273,7 @@
   more input data, until it returns with Z_STREAM_END or an error. After
   deflate has returned Z_STREAM_END, the only possible operations on the
   stream are deflateReset or deflateEnd.
-  
+
     Z_FINISH can be used immediately after deflateInit if all the compression
   is to be done in a single step. In this case, avail_out must be at least
   the value returned by deflateBound (see below). If deflate does not return
@@ -311,7 +312,7 @@
 */
 
 
-/* 
+/*
 ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
 
      Initializes the internal stream state for decompression. The fields
@@ -361,9 +362,23 @@
   must be called again after making room in the output buffer because there
   might be more output pending.
 
-    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, or
-  Z_FINISH. Z_SYNC_FLUSH requests that inflate() flush as much output as
-  possible to the output buffer.
+    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+  Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+  output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+  if and when it get to the next deflate block boundary. When decoding the zlib
+  or gzip format, this will cause inflate() to return immediately after the
+  header and before the first block. When doing a raw inflate, inflate() will
+  go ahead and process the first block, and will return when it gets to the end
+  of that block, or when it runs out of data.
+
+    The Z_BLOCK option assists in appending to or combining deflate streams.
+  Also to assist in this, on return inflate() will set strm->data_type to the
+  number of unused bits in the last byte taken from strm->next_in, plus eight
+  if inflate() is currently decoding the last block in the deflate stream,
+  plus 16 if inflate() returned immediately after decoding an end-of-block
+  code or decoding the complete header up just before the first byte of the
+  deflate stream. The end-of-block will not be indicated until all of the
+  uncompressed data from that block has been written to strm->next_out.
 
     inflate() should normally be called until it returns Z_STREAM_END or an
   error. However if all decompression is to be performed in a single step
@@ -379,7 +394,8 @@
      In this implementation, inflate() always flushes as much output as
   possible to the output buffer, and always uses the faster approach on the
   first call. So the only effect of the flush parameter in this implementation
-  is on the return value of inflate(), as noted below.
+  is on the return value of inflate(), as noted below, or when it returns early
+  because Z_BLOCK is used.
 
      If a preset dictionary is needed after this call (see inflateSetDictionary
   below), inflate sets strm-adler to the adler32 checksum of the dictionary
@@ -430,7 +446,7 @@
     The following functions are needed only in some special applications.
 */
 
-/*   
+/*
 ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
                                      int  level,
                                      int  method,
@@ -485,7 +501,7 @@
    method). msg is set to null if there is no error message.  deflateInit2 does
    not perform any compression: this will be done by deflate().
 */
-                            
+
 ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
                                              const Bytef *dictionary,
                                              uInt  dictLength));
@@ -582,7 +598,7 @@
    for deflation in a single pass, and so would be called before deflate().
 */
 
-/*   
+/*
 ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
                                      int  windowBits));
 
@@ -644,7 +660,7 @@
 */
 
 ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/* 
+/*
     Skips invalid compressed data until a full flush point (see above the
   description of deflate with Z_FULL_FLUSH) can be found, or until all
   available input is skipped. No output is provided.
@@ -778,7 +794,7 @@
    that inflateBack() cannot return Z_OK.
 */
 
-ZEXTERN int ZEXPORT inflateBackEnd(z_stream FAR *strm);
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm));
 /*
      All memory allocated by inflateBackInit() is freed.
 
@@ -792,12 +808,14 @@
     Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
      1.0: size of uInt
      3.2: size of uLong
-     5.4: size of voidpf (pointers)
+     5.4: size of voidpf (pointer)
      7.6: size of z_off_t
 
-    Debug options:
+    Compiler, assembler, and debug options:
      8: DEBUG
-     9-11: 0 (reserved)
+     9: ASMV or ASMINF -- use ASM code
+     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+     11: 0 (reserved)
 
     One-time table building (smaller code, but not thread-safe if true):
      12: BUILDFIXED -- build static block decoding tables when needed
@@ -805,8 +823,8 @@
      14,15: 0 (reserved)
 
     Library content (indicates missing functionality):
-     16: NO_DEFLATE -- gz* functions cannot compress (to avoid linking deflate
-                       code when not needed)
+     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+                          deflate code when not needed)
      17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
                     and decode gzip streams (to avoid linking crc code)
      18-19: 0 (reserved)
@@ -941,7 +959,7 @@
      gzread returns the number of uncompressed bytes actually read (0 for
    end of file, -1 for error). */
 
-ZEXTERN int ZEXPORT    gzwrite OF((gzFile file, 
+ZEXTERN int ZEXPORT    gzwrite OF((gzFile file,
                                    voidpc buf, unsigned len));
 /*
      Writes the given number of uncompressed bytes into the compressed file.
@@ -1012,7 +1030,7 @@
 
 ZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,
                                       z_off_t offset, int whence));
-/* 
+/*
       Sets the starting position for the next gzread or gzwrite on the
    given compressed file. The offset represents a number of bytes in the
    uncompressed data stream. The whence parameter is defined as in lseek(2);
diff --git a/zutil.c b/zutil.c
index c85e1d5..0ef4f99 100644
--- a/zutil.c
+++ b/zutil.c
@@ -1,6 +1,6 @@
 /* zutil.c -- target dependent utility functions for the compression library
  * Copyright (C) 1995-2003 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h 
+ * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
 /* @(#) $Id$ */
@@ -65,13 +65,19 @@
 #ifdef DEBUG
     flags += 1 << 8;
 #endif
+#if defined(ASMV) || defined(ASMINF)
+    flags += 1 << 9;
+#endif
+#ifdef ZLIB_WINAPI
+    flags += 1 << 10;
+#endif
 #ifdef BUILDFIXED
     flags += 1 << 12;
 #endif
 #ifdef DYNAMIC_CRC_TABLE
     flags += 1 << 13;
 #endif
-#ifdef NO_DEFLATE
+#ifdef NO_GZCOMPRESS
     flags += 1 << 16;
 #endif
 #ifdef NO_GZIP
@@ -176,12 +182,12 @@
 }
 #endif
 
+
+#ifdef SYS16BIT
+
 #ifdef __TURBOC__
-#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
-#if !defined(__linux)
-/* Small and medium model in Turbo C are for now limited to near allocation
- * with reduced MAX_WBITS and MAX_MEM_LEVEL
- */
+/* Turbo C in 16-bit mode */
+
 #  define MY_ZCALLOC
 
 /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
@@ -253,12 +259,11 @@
     ptr = opaque; /* just to make some compilers happy */
     Assert(0, "zcfree: ptr not found");
 }
-#endif
-#endif
+
 #endif /* __TURBOC__ */
 
 
-#if defined(M_I86) && !defined(__32BIT__)
+#ifdef M_I86
 /* Microsoft C in 16-bit mode */
 
 #  define MY_ZCALLOC
@@ -280,7 +285,9 @@
     _hfree(ptr);
 }
 
-#endif /* MSC */
+#endif /* M_I86 */
+
+#endif /* SYS16BIT */
 
 
 #ifndef MY_ZCALLOC /* Any system without a special alloc function */
diff --git a/zutil.h b/zutil.h
index 0eda40c..db678b0 100644
--- a/zutil.h
+++ b/zutil.h
@@ -74,7 +74,7 @@
 
         /* target dependencies */
 
-#ifdef MSDOS
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
 #  define OS_CODE  0x00
 #  if defined(__TURBOC__) || defined(__BORLANDC__)
 #    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
@@ -82,19 +82,15 @@
        void _Cdecl farfree( void *block );
        void *_Cdecl farmalloc( unsigned long nbytes );
 #    else
-#     include <alloc.h>
+#      include <alloc.h>
 #    endif
 #  else /* MSC or DJGPP */
 #    include <malloc.h>
 #  endif
 #endif
 
-#ifdef OS2
-#  define OS_CODE  0x06
-#endif
-
-#ifdef WIN32 /* Window 95 & Windows NT */
-#  define OS_CODE  0x0b
+#ifdef AMIGA
+#  define OS_CODE  0x01
 #endif
 
 #if defined(VAXC) || defined(VMS)
@@ -103,14 +99,14 @@
      fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
 #endif
 
-#ifdef AMIGA
-#  define OS_CODE  0x01
-#endif
-
 #if defined(ATARI) || defined(atarist)
 #  define OS_CODE  0x05
 #endif
 
+#ifdef OS2
+#  define OS_CODE  0x06
+#endif
+
 #if defined(MACOS) || defined(TARGET_OS_MAC)
 #  define OS_CODE  0x07
 #  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
@@ -122,14 +118,20 @@
 #  endif
 #endif
 
-#ifdef __50SERIES /* Prime/PRIMOS */
-#  define OS_CODE  0x0F
-#endif
-
 #ifdef TOPS20
 #  define OS_CODE  0x0a
 #endif
 
+#ifdef WIN32
+#  ifndef __CYGWIN__  /* Cygwin is Unix, not Win32 */
+#    define OS_CODE  0x0b
+#  endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+#  define OS_CODE  0x0f
+#endif
+
 #if defined(_BEOS_) || defined(RISCOS)
 #  define fdopen(fd,mode) NULL /* No fdopen() */
 #endif
@@ -142,8 +144,7 @@
 #  endif
 #endif
 
-
-        /* Common defaults */
+        /* common defaults */
 
 #ifndef OS_CODE
 #  define OS_CODE  0x03  /* assume Unix */
@@ -155,28 +156,31 @@
 
          /* functions */
 
-#ifdef __STDC_VERSION__
-#  if __STDC_VERSION__ >= 199901L
-#    ifndef STDC99
-#      define STDC99
-#    endif
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+#  ifndef HAVE_VSNPRINTF
+#    define HAVE_VSNPRINTF
 #  endif
 #endif
-#if !defined(STDC99) && !(defined(__TURBOC__) && __TURBOC__ >= 0x550) && !defined(HAVE_VSNPRINTF)
+#if defined(__CYGWIN__)
+#  ifndef HAVE_VSNPRINTF
+#    define HAVE_VSNPRINTF
+#  endif
+#endif
+#ifndef HAVE_VSNPRINTF
 #  ifdef MSDOS
      /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
         but for now we just assume it doesn't. */
 #    define NO_vsnprintf
 #  endif
-#  ifdef WIN32
-     /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-#    if !defined(vsnprintf) && !defined(__TURBOC__)
-#      define vsnprintf _vsnprintf
-#    endif
-#  endif
 #  ifdef __TURBOC__
 #    define NO_vsnprintf
 #  endif
+#  ifdef WIN32
+     /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+#    if !defined(vsnprintf) && !defined(NO_vsnprintf)
+#      define vsnprintf _vsnprintf
+#    endif
+#  endif
 #endif
 
 #ifdef HAVE_STRERROR