zlib 0.95
diff --git a/ChangeLog b/ChangeLog
index d6733c5..4c69f88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,16 @@
 
 		ChangeLog file for zlib
 
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+  not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+  (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+  typedefs and because voidnp was not near in large model).
+
 Changes in 0.94 (13 Aug 95)
 - support MSDOS medium model
 - fix deflate with flush (could sometimes generate bad output)
@@ -10,6 +20,7 @@
 - gzflush now calls fflush
 - For deflate with flush, flush even if no more input is provided.
 - rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
 - work around a problem with gcc on Alpha (in INSERT_STRING)
 - don't use inline functions (problem with some gcc versions)
 - allow renaming of Byte, uInt, etc... with #define.
diff --git a/Makefile.bor b/Makefile.bor
index 3a823d0..536b76d 100644
--- a/Makefile.bor
+++ b/Makefile.bor
@@ -2,6 +2,7 @@
 # Borland C++   ************ UNTESTED ***********
 
 # To use, do "make -fmakefile.bor"
+# To compile in small model, set below: MODEL=-ms
 
 # WARNING: the small model is supported but only for small values of
 # MAX_WBITS and MAX_MEM_LEVEL. For example:
diff --git a/Makefile.msc b/Makefile.msc
index 335a4e1..3b7aabd 100644
--- a/Makefile.msc
+++ b/Makefile.msc
@@ -2,6 +2,7 @@
 # Microsoft C 5.1 or later
 
 # To use, do "make makefile.msc"
+# To compile in small model, set below: MODEL=-AS
 
 # If you wish to reduce the memory requirements (default 256K for big
 # objects plus a few K), you can add to CFLAGS below: 
diff --git a/Makefile.tc b/Makefile.tc
index ceed87d..a46ce73 100644
--- a/Makefile.tc
+++ b/Makefile.tc
@@ -2,10 +2,11 @@
 # TurboC 2.0
 
 # To use, do "make -fmakefile.tc"
+# To compile in small model, set below: MODEL=-ms
 
 # WARNING: the small model is supported but only for small values of
 # MAX_WBITS and MAX_MEM_LEVEL. For example:
-#    -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3
+#    -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
 # If you wish to reduce the memory requirements (default 256K for big
 # objects plus a few K), you can add to CFLAGS below: 
 #   -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
@@ -13,6 +14,7 @@
 
 # ------------- Turbo C 2.0 -------------
 MODEL=-ml
+# CFLAGS=-O2 -G -Z $(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
 CFLAGS=-O2 -G -Z $(MODEL)
 CC=tcc -I\tc\include
 LD=tcc -L\tc\lib
diff --git a/README b/README
index 1cbd6be..1810978 100644
--- a/README
+++ b/README
@@ -1,6 +1,7 @@
-zlib 0.94 is a beta version of a general purpose compression library.
-Unless new bugs are found it will be released again as the first official
-version (1.0). This version has no known bugs.
+zlib 0.95 is a beta version of a general purpose compression library.
+This should be the last version before the first official
+version (1.0), so please test it now. (At least compile and run it with
+"make test"). This version has no known bugs.
 
 The data format used by the zlib library is described in the
 files zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available
@@ -8,31 +9,29 @@
 
 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
-which also tests that the library is working correctly.
+which also tests that the library is working correctly. Another
+example is given in the file minigzip.c.
 
 To compile all files and run the test program, just type: make test
-(For MSDOS, use one of the special makefiles such as Makefile.msc.)
+(For MSDOS, use one of the special makefiles such as Makefile.msc;
+for VMS, use Make_vms.com or descrip.mms.)
 To install the zlib library (libz.a) in /usr/local/lib, type: make install
 To install in a different directory, use for example:
   make install prefix=$HOME
 This will install in $HOME/lib instead of /usr/local/lib.
 
-The changes made in version 0.94 are documented in the file ChangeLog.
-The main changes since 0.93 are:
-- support MSDOS small and medium model
-- fix deflate with flush (could sometimes generate bad output)
-- fix deflateReset (zlib header was incorrectly suppressed)
-- added support for VMS
-- allow a compression level in gzopen()
-- gzflush now calls fflush
-- For deflate with flush, flush even if no more input is provided.
-- rename libgz.a as libz.a
+The changes made in version 0.95 are documented in the file ChangeLog.
+The main changes since 0.94 are:
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+  not completely flushed in rare occasions).
 
-For MSDOS, the small and medium models are supported only for Microsoft C.
-(It should be easy to support them for Borland C also, but I don't have
-a recent Borland compiler to test with.) The small model currently works
-for Turbo/Borland C but only with reduced performance to avoid any far
-allocation (tested with -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3).
+For MSDOS, the small and medium models have been tested only with Microsoft C.
+(This should now work for Borland C also, but I don't have a recent Borland
+compiler to test with.) The small model was tested with Turbo C but only with
+reduced performance to avoid any far allocation; it was tested with
+ -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
 
 
  (C) 1995 Jean-loup Gailly and Mark Adler
diff --git a/deflate.c b/deflate.c
index 70095e6..c531856 100644
--- a/deflate.c
+++ b/deflate.c
@@ -524,8 +524,8 @@
      * Try with and without -DUNALIGNED_OK to check.
      */
     register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
-    register ush scan_start = *(ush*)scan;
-    register ush scan_end   = *(ush*)(scan+best_len-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];
@@ -554,8 +554,8 @@
         /* This code assumes sizeof(unsigned short) == 2. Do not use
          * UNALIGNED_OK if your compiler uses a different size.
          */
-        if (*(ush*)(match+best_len-1) != scan_end ||
-            *(ush*)match != scan_start) continue;
+        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
@@ -569,10 +569,10 @@
         Assert(scan[2] == match[2], "scan[2]?");
         scan++, match++;
         do {
-        } while (*(ush*)(scan+=2) == *(ush*)(match+=2) &&
-                 *(ush*)(scan+=2) == *(ush*)(match+=2) &&
-                 *(ush*)(scan+=2) == *(ush*)(match+=2) &&
-                 *(ush*)(scan+=2) == *(ush*)(match+=2) &&
+        } 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 */
 
@@ -621,7 +621,7 @@
             best_len = len;
             if (len >= s->nice_match) break;
 #ifdef UNALIGNED_OK
-            scan_end = *(ush*)(scan+best_len-1);
+            scan_end = *(ushf*)(scan+best_len-1);
 #else
             scan_end1  = scan[best_len-1];
             scan_end   = scan[best_len];
diff --git a/deflate.h b/deflate.h
index eada3ba..f3b4c38 100644
--- a/deflate.h
+++ b/deflate.h
@@ -233,6 +233,7 @@
     ulg static_len;     /* bit length of current block with static trees */
     ulg compressed_len; /* total bit length of compressed file */
     uInt matches;       /* number of string matches in current block */
+    int last_eob_len;   /* bit length of EOB code for last block */
 
 #ifdef DEBUG
     ulg bits_sent;      /* bit length of the compressed data */
diff --git a/example.c b/example.c
index d362c7a..c18a583 100644
--- a/example.c
+++ b/example.c
@@ -277,7 +277,7 @@
         fprintf(stderr, "incompatible zlib version\n");
         exit(1);
 
-    } else if (zstrcmp(zlib_version, ZLIB_VERSION) != 0) {
+    } else if (strcmp(zlib_version, ZLIB_VERSION) != 0) {
         fprintf(stderr, "warning: different zlib version\n");
     }
     test_compress();
diff --git a/gzio.c b/gzio.c
index 1f0f9fc..cd932d3 100644
--- a/gzio.c
+++ b/gzio.c
@@ -234,7 +234,7 @@
 */
 int gzread (file, buf, len)
     gzFile file;
-    voidnp buf;
+    voidp buf;
     unsigned len;
 {
     gz_stream *s = (gz_stream*)file;
@@ -292,7 +292,7 @@
 */
 int gzwrite (file, buf, len)
     gzFile file;
-    voidnp buf;
+    voidp buf;
     unsigned len;
 {
     gz_stream *s = (gz_stream*)file;
diff --git a/inftrees.c b/inftrees.c
index 7a45e92..ab9d74f 100644
--- a/inftrees.c
+++ b/inftrees.c
@@ -25,14 +25,14 @@
     uIntf *,            /* maximum lookup bits (returns actual) */
     z_stream *));       /* for zalloc function */
 
-local voidp falloc OF((
-    voidp,              /* opaque pointer (not used) */
+local voidpf falloc OF((
+    voidpf,             /* opaque pointer (not used) */
     uInt,               /* number of items */
     uInt));             /* size of item */
 
 local void ffree OF((
-    voidp q,            /* opaque pointer (not used) */
-    voidp p));          /* what to free (not used) */
+    voidpf q,            /* opaque pointer (not used) */
+    voidpf p));          /* what to free (not used) */
 
 /* Tables for deflate from PKZIP's appnote.txt. */
 local uInt cplens[] = { /* Copy lengths for literal codes 257..285 */
@@ -377,8 +377,8 @@
 local inflate_huft *fixed_td;
 
 
-local voidp falloc(q, n, s)
-voidp q;        /* opaque pointer (not used) */
+local voidpf falloc(q, n, s)
+voidpf q;        /* opaque pointer (not used) */
 uInt n;         /* number of items */
 uInt s;         /* size of item */
 {
@@ -386,13 +386,13 @@
          "inflate_trees falloc overflow");
   if (q) s++; /* to make some compilers happy */
   fixed_left -= n;
-  return (voidp)(fixed_mem + fixed_left);
+  return (voidpf)(fixed_mem + fixed_left);
 }
 
 
 local void ffree(q, p)
-voidp q;
-voidp p;
+voidpf q;
+voidpf p;
 {
   Assert(0, "inflate_trees ffree called!");
   if (q) q = p; /* to make some compilers happy */
diff --git a/trees.c b/trees.c
index f6b97ff..4cb5454 100644
--- a/trees.c
+++ b/trees.c
@@ -143,9 +143,9 @@
 local void compress_block OF((deflate_state *s, ct_data *ltree,
                               ct_data *dtree));
 local void set_data_type  OF((deflate_state *s));
-local void send_bits      OF((deflate_state *s, int value, int length));
 local unsigned bi_reverse OF((unsigned value, int length));
 local void bi_windup      OF((deflate_state *s));
+local void bi_flush       OF((deflate_state *s));
 local void copy_block     OF((deflate_state *s, charf *buf, unsigned len,
                               int header));
 
@@ -166,6 +166,63 @@
  * used.
  */
 
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+    put_byte(s, (uch)((w) & 0xff)); \
+    put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits      OF((deflate_state *s, int value, int length));
+
+local void send_bits(s, value, length)
+    deflate_state *s;
+    int value;  /* value to send */
+    int length; /* number of bits */
+{
+    Tracev((stderr," l %2d v %4x ", length, value));
+    Assert(length > 0 && length <= 15, "invalid length");
+    s->bits_sent += (ulg)length;
+
+    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+     * unused bits in value.
+     */
+    if (s->bi_valid > (int)Buf_size - length) {
+        s->bi_buf |= (value << s->bi_valid);
+        put_short(s, s->bi_buf);
+        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+        s->bi_valid += length - Buf_size;
+    } else {
+        s->bi_buf |= value << s->bi_valid;
+        s->bi_valid += length;
+    }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+  if (s->bi_valid > (int)Buf_size - len) {\
+    int val = value;\
+    s->bi_buf |= (val << s->bi_valid);\
+    put_short(s, s->bi_buf);\
+    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+    s->bi_valid += len - Buf_size;\
+  } else {\
+    s->bi_buf |= (value) << s->bi_valid;\
+    s->bi_valid += len;\
+  }\
+}
+#endif /* DEBUG */
+
+
 #define MAX(a,b) (a >= b ? a : b)
 /* the arguments must not have side effects */
 
@@ -259,6 +316,7 @@
 
     s->bi_buf = 0;
     s->bi_valid = 0;
+    s->last_eob_len = 8; /* enough lookahead for inflate */
 #ifdef DEBUG
     s->bits_sent = 0L;
 #endif
@@ -739,7 +797,12 @@
 }
 
 /* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ * The current inflate code requires 9 bits of lookahead. If the EOB
+ * code for the previous block was coded on 5 bits or less, inflate
+ * may have only 5+3 bits of lookahead to decode this EOB.
+ * (There are no problems if the previous block is stored or fixed.)
  */
 void ct_align(s)
     deflate_state *s;
@@ -747,6 +810,18 @@
     send_bits(s, STATIC_TREES<<1, 3);
     send_code(s, END_BLOCK, static_ltree);
     s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+    bi_flush(s);
+    /* Of the 10 bits for the empty block, we have already sent
+     * (10 - bi_valid) bits. The lookahead for the EOB of the previous
+     * block was thus its length plus what we have just sent.
+     */
+    if (s->last_eob_len + 10 - s->bi_valid < 9) {
+        send_bits(s, STATIC_TREES<<1, 3);
+        send_code(s, END_BLOCK, static_ltree);
+        s->compressed_len += 10L;
+        bi_flush(s);
+    }
+    s->last_eob_len = 7;
 }
 
 /* ===========================================================================
@@ -950,6 +1025,7 @@
     } while (lx < s->last_lit);
 
     send_code(s, END_BLOCK, ltree);
+    s->last_eob_len = ltree[END_BLOCK].Len;
 }
 
 /* ===========================================================================
@@ -971,44 +1047,6 @@
 }
 
 /* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
-    put_byte(s, (uch)((w) & 0xff)); \
-    put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-local void send_bits(s, value, length)
-    deflate_state *s;
-    int value;  /* value to send */
-    int length; /* number of bits */
-{
-#ifdef DEBUG
-    Tracev((stderr," l %2d v %4x ", length, value));
-    Assert(length > 0 && length <= 15, "invalid length");
-    s->bits_sent += (ulg)length;
-#endif
-    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
-     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
-     * unused bits in value.
-     */
-    if (s->bi_valid > (int)Buf_size - length) {
-        s->bi_buf |= (value << s->bi_valid);
-        put_short(s, s->bi_buf);
-        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
-        s->bi_valid += length - Buf_size;
-    } else {
-        s->bi_buf |= value << s->bi_valid;
-        s->bi_valid += length;
-    }
-}
-
-/* ===========================================================================
  * Reverse the first len bits of a code, using straightforward code (a faster
  * method would use a table)
  * IN assertion: 1 <= len <= 15
@@ -1026,7 +1064,24 @@
 }
 
 /* ===========================================================================
- * Write out any remaining bits in an incomplete byte.
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(s)
+    deflate_state *s;
+{
+    if (s->bi_valid == 16) {
+        put_short(s, s->bi_buf);
+        s->bi_buf = 0;
+        s->bi_valid = 0;
+    } else if (s->bi_valid >= 8) {
+        put_byte(s, (Byte)s->bi_buf);
+        s->bi_buf >>= 8;
+        s->bi_valid -= 8;
+    }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
  */
 local void bi_windup(s)
     deflate_state *s;
@@ -1053,7 +1108,8 @@
     unsigned len;     /* its length */
     int      header;  /* true if block header must be written */
 {
-    bi_windup(s);              /* align on byte boundary */
+    bi_windup(s);        /* align on byte boundary */
+    s->last_eob_len = 8; /* enough lookahead for inflate */
 
     if (header) {
         put_short(s, (ush)len);   
diff --git a/zconf.h b/zconf.h
index 92fdbbc..3898094 100644
--- a/zconf.h
+++ b/zconf.h
@@ -85,37 +85,42 @@
 #  endif
 #endif
 
-#if defined(M_I86SM) || defined(M_I86MM) /* model independent MSC functions */
-#   define zstrcpy _fstrcpy
-#   define zstrcat _fstrcat
-#   define zstrlen _fstrlen
-#   define zstrcmp _fstrcmp
-#   define FAR __far
-#else
-#   define zstrcpy strcpy
-#   define zstrcat strcat
-#   define zstrlen strlen
-#   define zstrcmp strcmp
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * 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 */
+#  ifdef _MSC_VER
+#    define FAR __far
+#  else
+#    define FAR far
+#  endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+#    define FAR __far /* completely untested, just a best guess */
+#endif
+#ifndef FAR
 #   define FAR
 #endif
- 
+
 typedef unsigned char  Byte;  /* 8 bits */
 typedef unsigned int   uInt;  /* 16 bits or more */
 typedef unsigned long  uLong; /* 32 bits or more */
 
-typedef Byte FAR Bytef;  
-typedef char FAR charf;  
+typedef Byte FAR Bytef;
+typedef char FAR charf;
 typedef int FAR intf;
 typedef uInt FAR uIntf;
 typedef uLong FAR uLongf;
 
 #ifdef STDC
-   typedef void FAR *voidp;
-   typedef void     *voidnp;
+   typedef void FAR *voidpf;
+   typedef void     *voidp;
 #else
-   typedef Byte FAR *voidp;
-   typedef Byte     *voidnp;
+   typedef Byte FAR *voidpf;
+   typedef Byte     *voidp;
 #endif
 
 #endif /* _ZCONF_H */
-
diff --git a/zlib.h b/zlib.h
index 56ad7f7..73185ec 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 0.94, Aug 13th, 1995.
+  version 0.95, Aug 16th, 1995.
 
   Copyright (C) 1995 Jean-loup Gailly and Mark Adler
 
@@ -28,7 +28,7 @@
 
 #include "zconf.h"
 
-#define ZLIB_VERSION "0.94"
+#define ZLIB_VERSION "0.95"
 
 /* 
      The 'zlib' compression library provides in-memory compression and
@@ -49,8 +49,8 @@
   (providing more output space) before each call.
 */
 
-typedef voidp (*alloc_func) OF((voidp opaque, uInt items, uInt size));
-typedef void  (*free_func)  OF((voidp opaque, voidp address));
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
 
 struct internal_state;
 
@@ -510,7 +510,7 @@
 */
 
 
-typedef voidnp gzFile;
+typedef voidp gzFile;
 
 extern gzFile gzopen  OF((char *path, char *mode));
 /*
@@ -533,7 +533,7 @@
    the (de)compression state.
 */
 
-extern int    gzread  OF((gzFile file, voidnp buf, unsigned len));
+extern int    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
@@ -541,7 +541,7 @@
      gzread returns the number of uncompressed bytes actually read (0 for
    end of file, -1 for error). */
 
-extern int    gzwrite OF((gzFile file, voidnp buf, unsigned len));
+extern int    gzwrite OF((gzFile file, voidp buf, unsigned len));
 /*
      Writes the given number of uncompressed bytes into the compressed file.
    gzwrite returns the number of uncompressed bytes actually written
diff --git a/zutil.c b/zutil.c
index 1dce6fb..67c4e54 100644
--- a/zutil.c
+++ b/zutil.c
@@ -38,8 +38,8 @@
 #ifndef HAVE_MEMCPY
 
 void zmemcpy(dest, source, len)
-    Byte* dest;
-    Byte* source;
+    Bytef* dest;
+    Bytef* source;
     uInt  len;
 {
     if (len == 0) return;
@@ -49,7 +49,7 @@
 }
 
 void zmemzero(dest, len)
-    Byte* dest;
+    Bytef* dest;
     uInt  len;
 {
     if (len == 0) return;
@@ -59,8 +59,10 @@
 }
 #endif
 
-#if defined(__TURBOC__) && !defined(__SMALL__)
-
+#if defined( __TURBOC__) && !defined(__SMALL__) && !defined(__MEDIUM__)
+/* Small and medium model are for now limited to near allocation with
+ * reduced MAX_WBITS and MAX_MEM_LEVEL
+ */
 #  define MY_ZCALLOC
 
 /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
@@ -75,8 +77,8 @@
 local int next_ptr = 0;
 
 typedef struct ptr_table_s {
-    voidp org_ptr;
-    voidp new_ptr;
+    voidpf org_ptr;
+    voidpf new_ptr;
 } ptr_table;
 
 local ptr_table table[MAX_PTR];
@@ -87,9 +89,9 @@
  * a protected system like OS/2. Use Microsoft C instead.
  */
 
-voidp zcalloc (voidp opaque, unsigned items, unsigned size)
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
 {
-    voidp buf = opaque; /* just to make some compilers happy */
+    voidpf buf = opaque; /* just to make some compilers happy */
     ulg bsize = (ulg)items*size;
 
     if (bsize < 65536L) {
@@ -108,7 +110,7 @@
     return buf;
 }
 
-void  zcfree (voidp opaque, voidp ptr)
+void  zcfree (voidpf opaque, voidpf ptr)
 {
     int n;
     if (*(ush*)&ptr != 0) { /* object < 64K */
@@ -131,7 +133,8 @@
 }
 #endif /* __TURBOC__ */
 
-#if defined(MSDOS) && !defined(__TURBOC__)  /* MSC */
+#if defined(M_I86SM)||defined(M_I86MM)||defined(M_I86CM)||defined(M_I86LM)
+/* Microsoft C */
 
 #  define MY_ZCALLOC
 
@@ -140,13 +143,13 @@
 #  define _hfree   hfree
 #endif
 
-voidp zcalloc (voidp opaque, unsigned items, unsigned size)
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
 {
     if (opaque) opaque = 0; /* to make compiler happy */
     return _halloc((long)items, size);
 }
 
-void  zcfree (voidp opaque, voidp ptr)
+void  zcfree (voidpf opaque, voidpf ptr)
 {
     if (opaque) opaque = 0; /* to make compiler happy */
     _hfree(ptr);
@@ -158,21 +161,21 @@
 #ifndef MY_ZCALLOC /* Any system without a special alloc function */
 
 #ifndef __GO32__
-extern voidp calloc OF((uInt items, uInt size));
-extern void  free   OF((voidp ptr));
+extern voidp  calloc OF((uInt items, uInt size));
+extern void   free   OF((voidpf ptr));
 #endif
 
-voidp zcalloc (opaque, items, size)
-    voidp opaque;
+voidpf zcalloc (opaque, items, size)
+    voidpf opaque;
     unsigned items;
     unsigned size;
 {
-    return calloc(items, size);
+    return (voidpf)calloc(items, size);
 }
 
 void  zcfree (opaque, ptr)
-    voidp opaque;
-    voidp ptr;
+    voidpf opaque;
+    voidpf ptr;
 {
     free(ptr);
 }
diff --git a/zutil.h b/zutil.h
index 053eb8c..4d1b59e 100644
--- a/zutil.h
+++ b/zutil.h
@@ -46,7 +46,7 @@
 #define DEFLATED   8
 
 #ifndef DEF_WBITS
-#  define DEF_WBITS 15
+#  define DEF_WBITS MAX_WBITS
 #endif
 /* default windowBits for decompression. MAX_WBITS is for compression only */
 
@@ -72,7 +72,7 @@
 #  define OS_CODE  0x00
 #  ifdef __TURBOC__
 #    include <alloc.h>
-#  else /* MSC */
+#  else /* MSC or DJGPP */
 #    include <malloc.h>
 #  endif
 #endif
@@ -130,23 +130,29 @@
 #  define zstrerror(errnum) ""
 #endif
 
-#if defined(pyr) && !defined(NO_MEMCPY)
+#if defined(pyr)
+#  define NO_MEMCPY
+#endif
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(_MSC_VER)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+  * You may have to use the same strategy for Borland C (untested).
+  */
 #  define NO_MEMCPY
 #endif
 #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
 #  define HAVE_MEMCPY
 #endif
 #ifdef HAVE_MEMCPY
-#  ifdef M_I86MM /* MSC medium model */
+#  if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */
 #    define zmemcpy _fmemcpy
 #    define zmemzero(dest, len) _fmemset(dest, 0, len)
-#  else 
+#  else
 #    define zmemcpy memcpy
 #    define zmemzero(dest, len) memset(dest, 0, len)
 #  endif
 #else
-   extern void zmemcpy  OF((Byte* dest, Byte* source, uInt len));
-   extern void zmemzero OF((Byte* dest, uInt len));
+   extern void zmemcpy  OF((Bytef* dest, Bytef* source, uInt len));
+   extern void zmemzero OF((Bytef* dest, uInt len));
 #endif
 
 /* Diagnostic functions */
@@ -175,12 +181,12 @@
 
 extern void z_error    OF((char *m));
 
-voidp zcalloc OF((voidp opaque, unsigned items, unsigned size));
-void  zcfree  OF((voidp opaque, voidp ptr));
+voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
+void   zcfree  OF((voidpf opaque, voidpf ptr));
 
 #define ZALLOC(strm, items, size) \
            (*((strm)->zalloc))((strm)->opaque, (items), (size))
-#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidp)(addr))
+#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
 #define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
 
 #endif /* _Z_UTIL_H */