zlib 1.0.2
diff --git a/ChangeLog b/ChangeLog
index 36e05dc..ffbe1c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,16 @@
 
 		ChangeLog file for zlib
 
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
 Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
 - fix array overlay in deflate.c which sometimes caused bad compressed data
 - fix inflate bug with empty stored block
diff --git a/INDEX b/INDEX
index c4a3ede..dc13753 100644
--- a/INDEX
+++ b/INDEX
@@ -11,8 +11,12 @@
 Makefile.tc	makefile for Turbo C
 Makefile.wat	makefile for Watcom C
 README		guess what
+algorithm.doc	description of the compression & decompression algorithms
 configure	configure script for Unix
 descrip.mms	makefile for Vax/VMS
+zlib.def        definition file for Windows DLL
+zlib.rc         definition file for Windows DLL
+
 
 		zlib public header files (must be kept):
 zconf.h
diff --git a/Makefile b/Makefile
index 3b41059..f2ff262 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@
 LDFLAGS=-L. -lz
 LDSHARED=$(CC)
 
-VER=1.0.1
+VER=1.0.2
 LIBS=libz.a
 
 AR=ar rc
@@ -37,7 +37,8 @@
 
 TEST_OBJS = example.o minigzip.o
 
-DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms *.[ch]
+DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms \
+	    zlib.def zlib.rc algorithm.doc  *.[ch]
 
 all: example minigzip
 
@@ -85,8 +86,8 @@
 
 zip:
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
-	v=`sed -n -e 's/\./-/g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
-	zip -ul9 zlib-$$v $(DISTFILES)
+	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+	zip -ul9 zlib$$v $(DISTFILES)
 	mv Makefile~ Makefile
 
 dist:
diff --git a/Makefile.dj2 b/Makefile.dj2
index 82f55ea..07a9bb1 100644
--- a/Makefile.dj2
+++ b/Makefile.dj2
@@ -2,32 +2,51 @@
 # Copyright (C) 1995-1996 Jean-loup Gailly.
 # For conditions of distribution and use, see copyright notice in zlib.h 
 
-# To compile and test, type:
+# 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 for [make].
-# Alternately these variables may be defined below.
+# 
+# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
+# in the sample below if the pattern of the DJGPP distribution is to
+# be followed.  Remember that, while <sp>'es around <=> are ignored in
+# makefiles, they are *not* in batch files or in djgpp.env.
+# - - - - -
+# [make]
+# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include
+# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib
+# BUTT=-m486
+# - - - - -
+# Alternately, these variables may be defined below, overriding the values
+# in djgpp.env, as
+INCLUDE_PATH=c:\usr\include
 
 CC=gcc
 
 #CFLAGS=-MMD -O
 #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
 #CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-MMD -O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-           -Wstrict-prototypes -Wmissing-prototypes
+CFLAGS=-MMD -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
+# If install.exe is not found, replace with $(CP).
 INSTALL=install
+# The default value of RM is "rm -f."  If "rm.exe" is not found, uncomment:
+# RM=del
 LDLIBS=-L. -lz
 LD=$(CC) -s -o
 LDSHARED=$(CC)
 
-VER=1.0
+VER=1.0.2
+INCL=zlib.h zconf.h
 LIBS=libz.a
 
 AR=ar rcs
-# The default value of RM is "rm -f."  If "rm.exe" is not found, uncomment:
-# RM=del
 
 prefix=/usr/local
 exec_prefix = $(prefix)
@@ -37,10 +56,6 @@
 
 TEST_OBJS = example.o minigzip.o
 
-DISTFILES = README Change.Log configur Makefile.in Makefile Makefile.msc \
-	    Makefile.bor Makefile.tc Make_vms.com descrip.mms zlib099.pat \
-	    *.bak *.old *.[ch]
-
 all: example.exe minigzip.exe
 
 test: all
@@ -55,23 +70,27 @@
 
 libz.so.$(VER): $(OBJS)
 	$(LDSHARED) -o $@ $(OBJS)
-	rm -f libz.so; ln -s $@ libz.so
+	$(RM) libz.so; ln -s $@ libz.so
 
 %.exe : %.o $(LIBS)
 	$(LD) $@ $< $(LDLIBS)
 
-# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env
+# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
 
-install: $(LIBS)
-	$(INSTALL) zlib.h zconf.h $(INCLUDE_PATH)
-	$(INSTALL) $(LIBS) $(LIBRARY_PATH)
+.PHONY : uninstall clean
+
+install: $(INCL) $(LIBS)
+	-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
+	-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
+	for %%f in ($(INCL)) do $(INSTALL) %%f $(INCLUDE_PATH)
+	for %%p in ($(LIBS)) do $(INSTALL) %%p $(LIBRARY_PATH)
 
 uninstall:
-	$(RM) $(LIBRARY_PATH)/$(LIBS)
-	$(RM) $(INCLUDE_PATH)/zlib.h $(INCLUDE_PATH)/zconf.h
+	for %%f in ($(INCL)) do $(RM) $(INCLUDE_PATH)\%%f
+	for %%p in ($(LIBS)) do $(RM) $(LIBRARY_PATH)\%%p
 
 clean:
-	$(RM) *.d *.o *.~ *.exe libz.a libz.so* foo.gz
+	for %%p in (*.d *.o *.exe libz.a libz.so*) do $(RM) %%p
 
 DEPS := $(wildcard *.d)
 ifneq ($(DEPS),)
diff --git a/Makefile.in b/Makefile.in
index 3b41059..f2ff262 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -22,7 +22,7 @@
 LDFLAGS=-L. -lz
 LDSHARED=$(CC)
 
-VER=1.0.1
+VER=1.0.2
 LIBS=libz.a
 
 AR=ar rc
@@ -37,7 +37,8 @@
 
 TEST_OBJS = example.o minigzip.o
 
-DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms *.[ch]
+DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms \
+	    zlib.def zlib.rc algorithm.doc  *.[ch]
 
 all: example minigzip
 
@@ -85,8 +86,8 @@
 
 zip:
 	mv Makefile Makefile~; cp -p Makefile.in Makefile
-	v=`sed -n -e 's/\./-/g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
-	zip -ul9 zlib-$$v $(DISTFILES)
+	v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+	zip -ul9 zlib$$v $(DISTFILES)
 	mv Makefile~ Makefile
 
 dist:
diff --git a/README b/README
index dd72d94..217f3b1 100644
--- a/README
+++ b/README
@@ -1,8 +1,9 @@
-zlib 1.0.1 is a general purpose data compression library.  All the code
+zlib 1.0.2 is a general purpose data compression library.  All the code
 is reentrant (thread safe).  The data format used by the zlib library
-is described in the files zlib-3.3.doc, deflate-1.3.doc and
-gzip-4.3.doc, available in various formats from
-ftp://swrinde.nde.swri.edu/pub/png/documents/zlib/
+is described by RFCs (Request for Comments) 1950 to 1952 in the files 
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
+format) and rfc1952.txt (gzip format). These documents are also available in
+other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
 
 All functions of the compression library are documented in the file
 zlib.h. A usage example of the library is given in the file example.c
@@ -18,9 +19,8 @@
 Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or,
 if this fails, to the addresses given below in the Copyright section.
 
-The changes made in version 1.0.1 are documented in the file ChangeLog.
-Version number 1.0 was skipped to avoid confusion with version 0.99
-which had some references to 1.0 already. The main changes since 0.99 are:
+The changes made in version 1.0.2 are documented in the file ChangeLog.
+The main changes since 0.99 are:
 
 - fix array overlay in deflate.c which sometimes caused bad compressed data
 - fix inflate bug with empty stored block
@@ -30,6 +30,14 @@
 - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
   Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
 - several portability improvements
+- added algorithm.doc
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+
+A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
+is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+
 
 Notes for some targets:
 
@@ -46,9 +54,10 @@
 - zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not
   accepting the -O option). It works with the other cc compiler.
 
-A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
-is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
-ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
+  and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
+  For help on building a zlib DLL, contact Alessandro Iacopetti
+  <iaco@cicladi.unial.it>
 
 
 Acknowledgments:
diff --git a/adler32.c b/adler32.c
index b6b5519..c9dcf93 100644
--- a/adler32.c
+++ b/adler32.c
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: adler32.c,v 1.9 1996/01/30 21:59:09 me Exp $ */
+/* $Id: adler32.c,v 1.10 1996/05/22 11:52:18 me Exp $ */
 
 #include "zlib.h"
 
diff --git a/algorithm.doc b/algorithm.doc
new file mode 100644
index 0000000..156058a
--- /dev/null
+++ b/algorithm.doc
@@ -0,0 +1,105 @@
+1. Compression algorithm (deflate)
+
+The deflation algorithm used by zlib (also zip and gzip) is a variation of
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data.  The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length).  Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes.  (In this
+description, 'string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when deflate() determines that
+it would be useful to start another block with fresh trees. (This is
+somewhat similar to compress.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (level
+parameter of deflateInit). So deflate() does not always find the longest
+possible match but generally finds a match which is long enough.
+
+deflate() also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, deflate() searches for a
+longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the longer match is emitted afterwards.  Otherwise,
+the original match is kept, and the next match search is attempted only
+N steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, deflate() reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, deflate() attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (level parameter 1 to 3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. Decompression algorithm (inflate)
+
+The real question is given a Huffman tree, how to decode fast.  The most
+important realization is that shorter codes are much more common than
+longer codes, so pay attention to decoding the short codes fast, and let
+the long codes take longer to decode.
+
+inflate() sets up a first level table that covers some number of bits of
+input less than the length of longest code.  It gets that many bits from the
+stream, and looks it up in the table.  The table will tell if the next
+code is that many bits or less and how many, and if it is, it will tell
+the value, else it will point to the next level table for which inflate()
+grabs more bits and tries to decode a longer code.
+
+How many bits to make the first lookup is a tradeoff between the time it
+takes to decode and the time it takes to build the table.  If building the
+table took no time (and if you had infinite memory), then there would only
+be a first level table to cover all the way to the longest code.  However,
+building the table ends up taking a lot longer for more bits since short
+codes are replicated many times in such a table.  What inflate() does is
+simply to make the number of bits in the first table a variable, and set it
+for the maximum speed.
+
+inflate() sends new trees relatively often, so it is possibly set for a
+smaller first level table than an application that has only one tree for
+all the data.  For inflate, which has 286 possible codes for the
+literal/length tree, the size of the first table is nine bits.  Also the
+distance trees have 30 possible values, and the size of the first table is
+six bits.  Note that for each of those cases, the table ended up one bit
+longer than the "average" code length, i.e. the code length of an
+approximately flat code which would be a little more than eight bits for
+286 symbols and a little less than five bits for 30 symbols.  It would be
+interesting to see if optimizing the first level table for other
+applications gave values within a bit or two of the flat code size.
+
+
+Jean-loup Gailly        Mark Adler
+gzip@prep.ai.mit.edu    madler@alumni.caltech.edu
+
+
+References:
+
+[LZ77] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
+Compression", IEEE Transactions on Information Theory", Vol. 23, No. 3,
+pp. 337-343.
+
+"DEFLATE Compressed Data Format Specification" available in
+ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/compress.c b/compress.c
index 1c58400..590c451 100644
--- a/compress.c
+++ b/compress.c
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: compress.c,v 1.9 1996/01/30 21:59:09 me Exp $ */
+/* $Id: compress.c,v 1.10 1996/05/23 16:51:12 me Exp $ */
 
 #include "zlib.h"
 
@@ -30,9 +30,10 @@
 
     stream.next_in = (Bytef*)source;
     stream.avail_in = (uInt)sourceLen;
+#ifdef MAXSEG_64K
     /* Check for source > 64K on 16-bit machine: */
     if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
+#endif
     stream.next_out = dest;
     stream.avail_out = (uInt)*destLen;
     if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
diff --git a/deflate.c b/deflate.c
index 64710e6..f882a87 100644
--- a/deflate.c
+++ b/deflate.c
@@ -47,11 +47,11 @@
  *
  */
 
-/* $Id: deflate.c,v 1.12 1996/01/30 21:59:11 me Exp $ */
+/* $Id: deflate.c,v 1.13 1996/05/22 11:52:21 me Exp $ */
 
 #include "deflate.h"
 
-char deflate_copyright[] = " deflate 1.0.1 Copyright 1995-1996 Jean-loup Gailly ";
+char deflate_copyright[] = " deflate 1.0.2 Copyright 1995-1996 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
diff --git a/example.c b/example.c
index 175fa81..5e4dc6d 100644
--- a/example.c
+++ b/example.c
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: example.c,v 1.13 1996/01/30 21:59:13 me Exp $ */
+/* $Id: example.c,v 1.16 1996/05/23 17:11:28 me Exp $ */
 
 #include <stdio.h>
 #include "zlib.h"
@@ -462,16 +462,19 @@
     uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
     uLong uncomprLen = comprLen;
 
-    if (zlib_version[0] != ZLIB_VERSION[0]) {
+    if (zlibVersion()[0] != ZLIB_VERSION[0]) {
         fprintf(stderr, "incompatible zlib version\n");
         exit(1);
 
-    } else if (strcmp(zlib_version, ZLIB_VERSION) != 0) {
+    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
         fprintf(stderr, "warning: different zlib version\n");
     }
 
-    compr    = (Byte*)malloc((uInt)comprLen);
-    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1); /* must be cleared */
+    compr    = (Byte*)calloc((uInt)comprLen, 1);
+    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);
+    /* compr and uncompr are cleared to avoid reading uninitialized
+     * data and to ensure that uncompr compresses well.
+     */
     if (compr == Z_NULL || uncompr == Z_NULL) {
         printf("out of memory\n");
 	exit(1);
diff --git a/gzio.c b/gzio.c
index 6f6832b..44ca9e8 100644
--- a/gzio.c
+++ b/gzio.c
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
-/* $Id: gzio.c,v 1.12 1996/01/30 21:59:14 me Exp $ */
+/* $Id: gzio.c,v 1.13 1996/05/22 11:52:24 me Exp $ */
 
 #include <stdio.h>
 
diff --git a/inftrees.c b/inftrees.c
index 3bf39a6..ebeac0d 100644
--- a/inftrees.c
+++ b/inftrees.c
@@ -6,7 +6,7 @@
 #include "zutil.h"
 #include "inftrees.h"
 
-char inflate_copyright[] = " inflate 1.0.1 Copyright 1995-1996 Mark Adler ";
+char inflate_copyright[] = " inflate 1.0.2 Copyright 1995-1996 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
diff --git a/infutil.c b/infutil.c
index 7099b6d..b56f8cd 100644
--- a/infutil.c
+++ b/infutil.c
@@ -26,7 +26,8 @@
 int r;
 {
   uInt n;
-  Bytef *p, *q;
+  Bytef *p;
+  Bytef *q;
 
   /* local copies of source and destination pointers */
   p = z->next_out;
diff --git a/minigzip.c b/minigzip.c
index eee52a5..bd0735b 100644
--- a/minigzip.c
+++ b/minigzip.c
@@ -13,7 +13,7 @@
  * or in pipe mode.
  */
 
-/* $Id: minigzip.c,v 1.8 1996/01/30 21:59:23 me Exp $ */
+/* $Id: minigzip.c,v 1.9 1996/05/22 11:52:32 me Exp $ */
 
 #include <stdio.h>
 #include "zlib.h"
diff --git a/trees.c b/trees.c
index fcfe68b..f943d06 100644
--- a/trees.c
+++ b/trees.c
@@ -29,7 +29,7 @@
  *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
  */
 
-/* $Id: trees.c,v 1.5 1995/05/03 17:27:12 jloup Exp $ */
+/* $Id: trees.c,v 1.10 1996/05/22 11:52:34 me Exp $ */
 
 #include "deflate.h"
 
diff --git a/zconf.h b/zconf.h
index 6ab1e4f..69aa21b 100644
--- a/zconf.h
+++ b/zconf.h
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: zconf.h,v 1.12 1995/05/03 17:27:12 jloup Exp $ */
+/* $Id: zconf.h,v 1.18 1996/05/23 16:51:18 me Exp $ */
 
 #ifndef _ZCONF_H
 #define _ZCONF_H
@@ -37,7 +37,7 @@
 #  define Byte		z_Byte
 #  define uInt		z_uInt
 #  define uLong		z_uLong
-/* #  define Bytef	z_Bytef */
+#  define Bytef	        z_Bytef
 #  define charf		z_charf
 #  define intf		z_intf
 #  define uIntf		z_uIntf
@@ -128,7 +128,8 @@
  * 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) /* MSC small or medium model */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+   /* MSC small or medium model */
 #  define SMALL_MEDIUM
 #  ifdef _MSC_VER
 #    define FAR __far
@@ -137,14 +138,16 @@
 #  endif
 #endif
 #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+#  ifndef __32BIT__
 #    define SMALL_MEDIUM
 #    define FAR __far
+#  endif
 #endif
 #ifndef FAR
 #   define FAR
 #endif
 /* The Watcom compiler defines M_I86SM and __SMALL__ even in 32 bit mode */
-#if defined(__WATCOMC__) && defined(__386__)
+#if defined(__WATCOMC__) && defined(__386__) && defined(SMALL_MEDIUM)
 #  undef FAR
 #  define FAR
 #  undef SMALL_MEDIUM
@@ -154,8 +157,12 @@
 typedef unsigned int   uInt;  /* 16 bits or more */
 typedef unsigned long  uLong; /* 32 bits or more */
 
-/* "typedef Byte  FAR Bytef;" doesn't work with Borland C/C++ */
-#define Bytef Byte  FAR 
+#if defined(__BORLANDC__) && defined(SMALL_MEDIUM)
+   /* Borland C/C++ ignores FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
 typedef char  FAR charf;
 typedef int   FAR intf;
 typedef uInt  FAR uIntf;
@@ -169,4 +176,13 @@
    typedef Byte     *voidp;
 #endif
 
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if (defined(_WINDOWS) || defined(WINDOWS)) && defined(ZLIB_DLL)
+#  include <windows.h>
+#  define EXPORT  WINAPI
+#else
+#  define EXPORT
+#endif
+
 #endif /* _ZCONF_H */
diff --git a/zlib.def b/zlib.def
new file mode 100644
index 0000000..0f5049f
--- /dev/null
+++ b/zlib.def
@@ -0,0 +1,46 @@
+LIBRARY		"zlib"
+
+DESCRIPTION	'"""zlib data compression library"""'
+
+EXETYPE		NT
+
+SUBSYSTEM	WINDOWS
+
+STUB		'WINSTUB.EXE'
+
+VERSION		1.0.2
+
+CODE		 EXECUTE READ
+
+DATA		 READ WRITE
+
+HEAPSIZE	1048576,4096
+
+EXPORTS
+		zlibVersion
+		deflate
+		deflateEnd
+		inflate
+		inflateEnd
+		deflateSetDictionary
+		deflateCopy
+		deflateReset
+		deflateParams
+		inflateSetDictionary
+		inflateSync
+		inflateReset
+		compress
+		uncompress
+		gzopen
+		gzdopen
+		gzread
+		gzwrite
+		gzflush
+		gzclose
+		gzerror
+		adler32
+		crc32
+		deflateInit_
+		inflateInit_
+		deflateInit2_
+		inflateInit2_
diff --git a/zlib.h b/zlib.h
index 47960c2..1e61491 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 1.0.1, May 20th, 1996.
+  version 1.0.2, May 23rd, 1996.
 
   Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler
 
@@ -21,7 +21,12 @@
 
   Jean-loup Gailly        Mark Adler
   gzip@prep.ai.mit.edu    madler@alumni.caltech.edu
- */
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
 
 #ifndef _ZLIB_H
 #define _ZLIB_H
@@ -32,7 +37,7 @@
 
 #include "zconf.h"
 
-#define ZLIB_VERSION "1.0.1"
+#define ZLIB_VERSION "1.0.2"
 
 /* 
      The 'zlib' compression library provides in-memory compression and
@@ -156,16 +161,20 @@
 
 #define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
 
-extern const char *zlib_version;
-/* The application can compare zlib_version and ZLIB_VERSION for consistency.
-   If the first character differs, the library code actually used is
-   not compatible with the zlib.h header file used by the application.
- */
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
 
                         /* basic functions */
 
+extern char EXPORT *zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is
+   not compatible with the zlib.h header file used by the application.
+   This check is automatically made by deflateInit and inflateInit.
+ */
+
 /* 
-extern int deflateInit OF((z_stream *strm, int level));
+extern int EXPORT deflateInit OF((z_stream *strm, int level));
 
      Initializes the internal stream state for compression. The fields
    zalloc, zfree and opaque must be initialized before by the caller.
@@ -187,7 +196,7 @@
 */
 
 
-extern int deflate OF((z_stream *strm, int flush));
+extern int EXPORT deflate OF((z_stream *strm, int flush));
 /*
   Performs one or both of the following actions:
 
@@ -256,7 +265,7 @@
 */
 
 
-extern int deflateEnd OF((z_stream *strm));
+extern int EXPORT deflateEnd OF((z_stream *strm));
 /*
      All dynamically allocated data structures for this stream are freed.
    This function discards any unprocessed input and does not flush any
@@ -271,7 +280,7 @@
 
 
 /* 
-extern int inflateInit OF((z_stream *strm));
+extern int EXPORT inflateInit OF((z_stream *strm));
 
      Initializes the internal stream state for decompression. The fields
    zalloc, zfree and opaque must be initialized before by the caller.  If
@@ -286,7 +295,7 @@
 */
 
 
-extern int inflate OF((z_stream *strm, int flush));
+extern int EXPORT inflate OF((z_stream *strm, int flush));
 /*
   Performs one or both of the following actions:
 
@@ -341,7 +350,7 @@
 */
 
 
-extern int inflateEnd OF((z_stream *strm));
+extern int EXPORT inflateEnd OF((z_stream *strm));
 /*
      All dynamically allocated data structures for this stream are freed.
    This function discards any unprocessed input and does not flush any
@@ -359,12 +368,12 @@
 */
 
 /*   
-extern int deflateInit2 OF((z_stream *strm,
-                            int  level,
-                            int  method,
-                            int  windowBits,
-                            int  memLevel,
-                            int  strategy));
+extern int EXPORT deflateInit2 OF((z_stream *strm,
+                                   int  level,
+                                   int  method,
+                                   int  windowBits,
+                                   int  memLevel,
+                                   int  strategy));
 
      This is another version of deflateInit with more compression options. The
    fields next_in, zalloc, zfree and opaque must be initialized before by
@@ -417,9 +426,9 @@
    deflate(). 
 */
                             
-extern int deflateSetDictionary OF((z_stream *strm,
-				    const Bytef *dictionary,
-				    uInt  dictLength));
+extern int EXPORT deflateSetDictionary OF((z_stream *strm,
+                                           const Bytef *dictionary,
+				           uInt  dictLength));
 /*
      Initializes the compression dictionary (history buffer) from the given
    byte sequence without producing any compressed output. This function must
@@ -446,8 +455,8 @@
    be done by deflate(). 
 */
 
-extern int deflateCopy OF((z_stream *dest,
-                           z_stream *source));
+extern int EXPORT deflateCopy OF((z_stream *dest,
+                                  z_stream *source));
 /*
      Sets the destination stream as a complete copy of the source stream.  If
    the source stream is using an application-supplied history buffer, a new
@@ -469,7 +478,7 @@
    destination.
 */
 
-extern int deflateReset OF((z_stream *strm));
+extern int EXPORT deflateReset OF((z_stream *strm));
 /*
      This function is equivalent to deflateEnd followed by deflateInit,
    but does not free and reallocate all the internal compression state.
@@ -480,7 +489,7 @@
    stream state was inconsistent (such as zalloc or state being NULL).
 */
 
-extern int deflateParams OF((z_stream *strm, int level, int strategy));
+extern int EXPORT deflateParams OF((z_stream *strm, int level, int strategy));
 /*
      Dynamically update the compression level and compression strategy.
    This can be used to switch between compression and straight copy of
@@ -499,8 +508,8 @@
 */
 
 /*   
-extern int inflateInit2 OF((z_stream *strm,
-                            int  windowBits));
+extern int EXPORT inflateInit2 OF((z_stream *strm,
+                                   int  windowBits));
 
      This is another version of inflateInit with more compression options. The
    fields next_out, zalloc, zfree and opaque must be initialized before by
@@ -533,9 +542,9 @@
    inflate().
 */
 
-extern int inflateSetDictionary OF((z_stream *strm,
-				    const Bytef *dictionary,
-				    uInt  dictLength));
+extern int EXPORT inflateSetDictionary OF((z_stream *strm,
+				           const Bytef *dictionary,
+					   uInt  dictLength));
 /*
      Initializes the decompression dictionary (history buffer) from the given
    uncompressed byte sequence. This function must be called immediately after
@@ -552,7 +561,7 @@
    inflate().
 */
 
-extern int inflateSync OF((z_stream *strm));
+extern int EXPORT inflateSync OF((z_stream *strm));
 /* 
     Skips invalid compressed data until the special marker (see deflate()
   above) can be found, or until all available input is skipped. No output
@@ -567,7 +576,7 @@
   until success or end of the input data.
 */
 
-extern int inflateReset OF((z_stream *strm));
+extern int EXPORT inflateReset OF((z_stream *strm));
 /*
      This function is equivalent to inflateEnd followed by inflateInit,
    but does not free and reallocate all the internal decompression state.
@@ -588,8 +597,8 @@
    utility functions can easily be modified if you need special options.
 */
 
-extern int compress OF((Bytef *dest,   uLongf *destLen,
-                        const Bytef *source, uLong sourceLen));
+extern int EXPORT compress OF((Bytef *dest,   uLongf *destLen,
+			       const Bytef *source, uLong sourceLen));
 /*
      Compresses the source buffer into the destination buffer.  sourceLen is
    the byte length of the source buffer. Upon entry, destLen is the total
@@ -603,8 +612,8 @@
    buffer.
 */
 
-extern int uncompress OF((Bytef *dest,   uLongf *destLen,
-                          const Bytef *source, uLong sourceLen));
+extern int EXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
+				 const Bytef *source, uLong sourceLen));
 /*
      Decompresses the source buffer into the destination buffer.  sourceLen is
    the byte length of the source buffer. Upon entry, destLen is the total
@@ -624,7 +633,7 @@
 
 typedef voidp gzFile;
 
-extern gzFile gzopen  OF((const char *path, const char *mode));
+extern gzFile EXPORT gzopen  OF((const char *path, const char *mode));
 /*
      Opens a gzip (.gz) file for reading or writing. The mode parameter
    is as in fopen ("rb" or "wb") but can also include a compression level
@@ -636,7 +645,7 @@
    zlib error is Z_MEM_ERROR).
 */
 
-extern gzFile gzdopen  OF((int fd, const char *mode));
+extern gzFile EXPORT gzdopen  OF((int fd, const char *mode));
 /*
      gzdopen() associates a gzFile with the file descriptor fd.  File
    descriptors are obtained from calls like open, dup, creat, pipe or
@@ -649,7 +658,7 @@
    the (de)compression state.
 */
 
-extern int    gzread  OF((gzFile file, voidp buf, unsigned len));
+extern int EXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
 /*
      Reads the given number of uncompressed bytes from the compressed file.
    If the input file was not in gzip format, gzread copies the given number
@@ -657,14 +666,14 @@
      gzread returns the number of uncompressed bytes actually read (0 for
    end of file, -1 for error). */
 
-extern int    gzwrite OF((gzFile file, const voidp buf, unsigned len));
+extern int EXPORT    gzwrite OF((gzFile file, const voidp buf, unsigned len));
 /*
      Writes the given number of uncompressed bytes into the compressed file.
    gzwrite returns the number of uncompressed bytes actually written
    (0 in case of error).
 */
 
-extern int    gzflush OF((gzFile file, int flush));
+extern int EXPORT    gzflush OF((gzFile file, int flush));
 /*
      Flushes all pending output into the compressed file. The parameter
    flush is as in the deflate() function. The return value is the zlib
@@ -674,14 +683,14 @@
    degrade compression.
 */
 
-extern int    gzclose OF((gzFile file));
+extern int EXPORT    gzclose OF((gzFile file));
 /*
      Flushes all pending output if necessary, closes the compressed file
    and deallocates all the (de)compression state. The return value is the zlib
    error number (see function gzerror below).
 */
 
-extern char*   gzerror OF((gzFile file, int *errnum));
+extern char EXPORT  *gzerror OF((gzFile file, int *errnum));
 /*
      Returns the error message for the last error which occurred on the
    given compressed file. errnum is set to zlib error number. If an
@@ -698,7 +707,7 @@
    compression library.
 */
 
-extern uLong adler32 OF((uLong adler, const Bytef *buf, uInt len));
+extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
 
 /*
      Update a running Adler-32 checksum with the bytes buf[0..len-1] and
@@ -715,7 +724,7 @@
      if (adler != original_adler) error();
 */
 
-extern uLong crc32   OF((uLong crc, const Bytef *buf, uInt len));
+extern uLong EXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
 /*
      Update a running crc with the bytes buf[0..len-1] and return the updated
    crc. If buf is NULL, this function returns the required initial value
@@ -737,15 +746,15 @@
 /* deflateInit and inflateInit are macros to allow checking the zlib version
  * and the compiler's view of z_stream:
  */
-extern int deflateInit_ OF((z_stream *strm, int level,
-			    const char *version, int stream_size));
-extern int inflateInit_ OF((z_stream *strm,
-			    const char *version, int stream_size));
-extern int deflateInit2_ OF((z_stream *strm, int  level, int  method,
-                             int  windowBits, int  memLevel, int  strategy,
-			     const char *version, int stream_size));
-extern int inflateInit2_ OF((z_stream *strm, int  windowBits,
-			     const char *version, int stream_size));
+extern int EXPORT deflateInit_ OF((z_stream *strm, int level,
+			           const char *version, int stream_size));
+extern int EXPORT inflateInit_ OF((z_stream *strm,
+				   const char *version, int stream_size));
+extern int EXPORT deflateInit2_ OF((z_stream *strm, int  level, int  method,
+				    int windowBits, int memLevel, int strategy,
+				    const char *version, int stream_size));
+extern int EXPORT inflateInit2_ OF((z_stream *strm, int  windowBits,
+				    const char *version, int stream_size));
 #define deflateInit(strm, level) \
         deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
 #define inflateInit(strm) \
diff --git a/zlib.rc b/zlib.rc
new file mode 100644
index 0000000..5e1d0f7
--- /dev/null
+++ b/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1  1
+IDR_VERSION1	VERSIONINFO	MOVEABLE IMPURE LOADONCALL DISCARDABLE
+  FILEVERSION	 1,0,2,0
+  PRODUCTVERSION 1,0,2,0
+  FILEFLAGSMASK	VS_FFI_FILEFLAGSMASK
+  FILEFLAGS	0
+  FILEOS	VOS_DOS_WINDOWS32
+  FILETYPE	VFT_DLL
+  FILESUBTYPE	0	// not used
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    //language ID = U.S. English, char set = Windows, Multilingual
+
+    BEGIN
+      VALUE "FileDescription", "zlib data compression library\0"
+      VALUE "FileVersion",	"1.0.2\0"
+      VALUE "InternalName",	"zlib\0"
+      VALUE "OriginalFilename",	"zlib.lib\0"
+      VALUE "ProductName",	"ZLib.DLL\0"
+      VALUE "Comments",	"DLL support by Alessandro Iacopetti\0"
+      VALUE "LegalCopyright", "(C) 1995-1996 Jean-loup Gailly & Mark Adler\0"
+    END
+  END
+  BLOCK "VarFileInfo"
+  BEGIN
+    VALUE "Translation", 0x0409, 1252
+  END
+END
diff --git a/zutil.c b/zutil.c
index 66ddae4..f32fda5 100644
--- a/zutil.c
+++ b/zutil.c
@@ -3,7 +3,7 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: zutil.c,v 1.12 1996/01/30 21:59:29 me Exp $ */
+/* $Id: zutil.c,v 1.15 1996/05/23 17:11:36 me Exp $ */
 
 #include <stdio.h>
 
@@ -15,8 +15,6 @@
 extern void exit OF((int));
 #endif
 
-const char *zlib_version = ZLIB_VERSION;
-
 const char *z_errmsg[10] = {
 "need dictionary",     /* Z_NEED_DICT       2  */
 "stream end",          /* Z_STREAM_END      1  */
@@ -30,6 +28,11 @@
 ""};
 
 
+char *zlibVersion()
+{
+    return ZLIB_VERSION;
+}
+
 void z_error (m)
     char *m;
 {
diff --git a/zutil.h b/zutil.h
index 3abd8c4..5a53321 100644
--- a/zutil.h
+++ b/zutil.h
@@ -8,7 +8,7 @@
    subject to change. Applications should only use zlib.h.
  */
 
-/* $Id: zutil.h,v 1.13 1996/01/30 21:59:29 me Exp $ */
+/* $Id: zutil.h,v 1.14 1996/05/22 11:52:40 me Exp $ */
 
 #ifndef _Z_UTIL_H
 #define _Z_UTIL_H