zlib 0.8
diff --git a/ChangeLog b/ChangeLog
index c0536d2..668d036 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,14 @@
 		ChangeLog file for zlib
 
-Changes in 0.79 (28 April 95)
-- add fast inflate (inffast.c)
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+  is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+- gzread no longer reads one extra byte in certain cases
 - In gzio destroy(), don't reference a freed structure
 - avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
 
 Changes in 0.71 (14 April 95)
 - Fixed more MSDOS compilation problems :( There is still a bug with
diff --git a/README b/README
index 5705062..a8d5788 100644
--- a/README
+++ b/README
@@ -1,4 +1,6 @@
-zlib 0.79 is a beta version of a general purpose compression library.
+zlib 0.8 is a beta version of a general purpose compression library.
+This is the first version with no known bugs. (There may still be
+problem on SGI, to be checked.)
 
 The data format used by the zlib library is described in the
 file zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available
@@ -9,15 +11,18 @@
 which also tests that the library is working correctly.
 To compile all files and run the test program, just type: make test
 
-The changes made in version 0.79 are documented in the file ChangeLog.
+The changes made in version 0.8 are documented in the file ChangeLog.
 The main changes since 0.71 are:
-- add fast inflate (inffast.c)
-- In gzio destroy(), don't reference a freed structure
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+  is incompatible with previous versions of zlib which returned Z_OK.
+- work around a nasty TurboC compiler bug
 
-On MSDOS, this version works in large and small model with MSC; in
-small model only with TurboC (bug being investigated). For both
-compilers, small model compression works only for small values of
-MEM_LEVEL and WBITS (see zutil.h), and requires -DUSE_CALLOC.
+On MSDOS, this version works in both large and small model. However
+small model compression works only for small values of MEM_LEVEL and
+WBITS (see zutil.h). Small model decompression should work up to WBITS=15.
+This version of zlib does not yet support small or medium model with
+far allocation of big objects.
 
 
   Copyright (C) 1995 Jean-loup Gailly and Mark Adler
diff --git a/compress.c b/compress.c
index 8edcb2a..762a9df 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.4 1995/04/10 15:52:04 jloup Exp $ */
+/* $Id: compress.c,v 1.5 1995/04/29 17:18:43 jloup Exp $ */
 
 #include "zlib.h"
 
@@ -44,9 +44,9 @@
     if (err != Z_OK) return err;
 
     err = deflate(&stream, Z_FINISH);
-    if (err != Z_OK) {
+    if (err != Z_STREAM_END) {
 	deflateEnd(&stream);
-	return err;
+	return err == Z_OK ? Z_BUF_ERROR : err;
     }
     *destLen = stream.total_out;
 
diff --git a/deflate.c b/deflate.c
index 7d44627..e7e52af 100644
--- a/deflate.c
+++ b/deflate.c
@@ -47,7 +47,7 @@
  *
  */
 
-/* $Id: deflate.c,v 1.4 1995/04/14 19:49:46 jloup Exp $ */
+/* $Id: deflate.c,v 1.5 1995/04/29 16:52:05 jloup Exp $ */
 
 #include "deflate.h"
 
@@ -117,8 +117,10 @@
 local int  deflate_fast  __P((deflate_state *s, int flush));
 local int  deflate_slow  __P((deflate_state *s, int flush));
 local void lm_init       __P((deflate_state *s));
-
 local int  longest_match __P((deflate_state *s, IPos cur_match));
+local void putShortMSB   __P((deflate_state *s, uInt b));
+local void flush_pending __P((z_stream *strm));
+local int read_buf       __P((z_stream *strm, char *buf, unsigned size));
 #ifdef ASMV
       void match_init __P((void)); /* asm code initialization */
 #endif
@@ -225,7 +227,7 @@
 
     s->level = level;
     s->strategy = strategy;
-    s->method = method;
+    s->method = (Byte)method;
 
     return deflateReset(strm);
 }
@@ -265,8 +267,8 @@
     deflate_state *s;
     uInt b;
 {
-    put_byte(s, b >> 8);
-    put_byte(s, b & 0xff);
+    put_byte(s, (Byte)(b >> 8));
+    put_byte(s, (Byte)(b & 0xff));
 }   
 
 /* =========================================================================
@@ -346,17 +348,18 @@
     }
     Assert(strm->avail_out > 0, "bug2");
 
-    if (flush != Z_FINISH || strm->state->noheader) return Z_OK;
+    if (flush != Z_FINISH) return Z_OK;
+    if (strm->state->noheader) return Z_STREAM_END;
 
     /* Write the zlib trailer (adler32) */
-    putShortMSB(strm->state, strm->state->adler >> 16);
-    putShortMSB(strm->state, strm->state->adler & 0xffff);
+    putShortMSB(strm->state, (uInt)(strm->state->adler >> 16));
+    putShortMSB(strm->state, (uInt)(strm->state->adler & 0xffff));
     flush_pending(strm);
     /* If avail_out is zero, the application will call deflate again
      * to flush the rest.
      */
     strm->state->noheader = 1; /* write the trailer only once! */
-    return Z_OK;
+    return strm->state->pending != 0 ? Z_OK : Z_STREAM_END;
 }
 
 /* ========================================================================= */
diff --git a/example.c b/example.c
index 86541a7..5b482b8 100644
--- a/example.c
+++ b/example.c
@@ -3,11 +3,17 @@
  * For conditions of distribution and use, see copyright notice in zlib.h 
  */
 
-/* $Id: example.c,v 1.5 1995/04/14 20:35:56 jloup Exp $ */
+/* $Id: example.c,v 1.6 1995/04/29 16:53:46 jloup Exp $ */
 
 #include <stdio.h>
 #include "zlib.h"
 
+#ifdef STDC
+#  include <string.h>
+#endif
+
+extern void exit  __P((int));
+
 #define BUFLEN 4096
 
 #define local static
@@ -25,6 +31,12 @@
 
 char *hello = "hello world";
 
+void test_compress __P((void));
+void test_gzio     __P((char *out, char *in));
+void test_deflate  __P((Byte compr[]));
+void test_inflate  __P((Byte compr[]));
+void main          __P((int argc, char *argv[]));
+
 /* ===========================================================================
  * Test compress() and uncompress()
  */
@@ -37,15 +49,15 @@
     int err;
     uLong len = strlen(hello)+1;
 
-    err = compress(compr, &comprLen, hello, len);
+    err = compress(compr, &comprLen, (Byte*)hello, len);
     CHECK_ERR(err, "compress");
 
-    strcpy(uncompr, "garbage");
+    strcpy((char*)uncompr, "garbage");
 
     err = uncompress(uncompr, &uncomprLen, compr, comprLen);
     CHECK_ERR(err, "uncompress");
 
-    if (strcmp(uncompr, hello)) {
+    if (strcmp((char*)uncompr, hello)) {
 	fprintf(stderr, "bad uncompress\n");
     } else {
 	printf("uncompress(): %s\n", uncompr);
@@ -80,7 +92,7 @@
     if (file == NULL) {
 	fprintf(stderr, "gzopen error\n");
     }
-    strcpy(uncompr, "garbage");
+    strcpy((char*)uncompr, "garbage");
 
     uncomprLen = gzread(file, uncompr, uncomprLen);
     if (uncomprLen != len) {
@@ -88,7 +100,7 @@
     }
     gzclose(file);
 
-    if (strcmp(uncompr, hello)) {
+    if (strcmp((char*)uncompr, hello)) {
 	fprintf(stderr, "bad gzread\n");
     } else {
 	printf("gzread(): %s\n", uncompr);
@@ -96,9 +108,9 @@
 }
 
 /* ===========================================================================
- * Test deflate() with small buffers, return the compressed length.
+ * Test deflate() with small buffers
  */
-uLong test_deflate(compr)
+void test_deflate(compr)
     Byte compr[];
 {
     z_stream c_stream; /* compression stream */
@@ -120,16 +132,15 @@
 	CHECK_ERR(err, "deflate");
     }
     /* Finish the stream, still forcing small buffers: */
-    do {
+    for (;;) {
 	c_stream.avail_out = 1;
 	err = deflate(&c_stream, Z_FINISH);
+	if (err == Z_STREAM_END) break;
 	CHECK_ERR(err, "deflate");
-    } while (c_stream.avail_out == 0);
+    }
 
     err = deflateEnd(&c_stream);
     CHECK_ERR(err, "deflateEnd");
-
-    return c_stream.total_out;
 }
 
 /* ===========================================================================
@@ -142,7 +153,7 @@
     int err;
     z_stream d_stream; /* decompression stream */
 
-    strcpy(uncompr, "garbage");
+    strcpy((char*)uncompr, "garbage");
 
     d_stream.zalloc = (alloc_func)0;
     d_stream.zfree = (free_func)0;
@@ -163,7 +174,7 @@
     err = inflateEnd(&d_stream);
     CHECK_ERR(err, "inflateEnd");
 
-    if (strcmp(uncompr, hello)) {
+    if (strcmp((char*)uncompr, hello)) {
 	fprintf(stderr, "bad inflate\n");
     } else {
 	printf("inflate(): %s\n", uncompr);
@@ -179,7 +190,6 @@
     char *argv[];
 {
     local Byte compr[BUFLEN];
-    uLong comprLen;
 
     if (zlib_version[0] != ZLIB_VERSION[0]) {
 	fprintf(stderr, "incompatible zlib version\n");
@@ -193,7 +203,7 @@
     test_gzio((argc > 1 ? argv[1] : "foo.gz"),
 	      (argc > 2 ? argv[2] : "foo.gz"));
 
-    comprLen = test_deflate(compr);
+    test_deflate(compr);
 
     test_inflate(compr);
 
diff --git a/gzio.c b/gzio.c
index 365b6f5..6c3211a 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.4 1995/04/14 14:50:52 jloup Exp $ */
+/* $Id: gzio.c,v 1.5 1995/04/29 17:13:56 jloup Exp $ */
 
 #include <stdio.h>
 
@@ -46,7 +46,12 @@
 } gz_stream;
 
 
-/* ===========================================================================
+local int    destroy __P((gz_stream *s));
+local gzFile gz_open __P((char *path, char *mode, int  fd));
+local void   putLong __P((FILE *file, uLong x));
+local uLong  getLong __P((Byte *buf));
+
+ /* ===========================================================================
  * Cleanup then free the given gz_stream. Return a zlib error code.
  */
 local int destroy (s)
@@ -339,7 +344,7 @@
 	if (len != 0) {
 	    if (fwrite(s->outbuf, 1, len, s->file) != len) {
 		s->z_err = Z_ERRNO;
-		break;
+		return Z_ERRNO;
 	    }
 	    s->stream.next_out = s->outbuf;
 	    s->stream.avail_out = Z_BUFSIZE;
@@ -347,14 +352,14 @@
 	if (done) break;
 	s->z_err = deflate(&(s->stream), flush);
 
-	if (s->z_err != Z_OK) break;
-
-	/* deflate has finished flushing only when it hasn't used up
+        /* deflate has finished flushing only when it hasn't used up
          * all the available space in the output buffer: 
          */
-	done = (s->stream.avail_out != 0);
+        done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);
+ 
+	if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
     }
-    return s->z_err;
+    return  s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
 }
 
 /* ===========================================================================
@@ -395,12 +400,15 @@
     gzFile file;
 {
     uInt n;
+    int err;
     gz_stream *s = (gz_stream*)file;
 
     if (s == NULL) return Z_STREAM_ERROR;
 
     if (s->mode == 'w') {
-	gzflush (file, Z_FINISH);
+	err = gzflush (file, Z_FINISH);
+	if (err != Z_OK) return destroy(file);
+
 	putLong (s->file, s->crc);
 	putLong (s->file, s->stream.total_in);
 
diff --git a/infblock.c b/infblock.c
index 4d8bd48..2c2f8dd 100644
--- a/infblock.c
+++ b/infblock.c
@@ -139,7 +139,7 @@
 	  break;
 	case 3:				/* illegal */
 	  DUMPBITS(3)
-	  s->mode = ERROR;
+	  s->mode = INF_ERROR;
 	  z->msg = "invalid block type";
 	  r = Z_DATA_ERROR;
 	  LEAVE
@@ -149,7 +149,7 @@
       NEEDBITS(32)
       if ((~b) >> 16 != (b & 0xffff))
       {
-        s->mode = ERROR;
+        s->mode = INF_ERROR;
 	z->msg = "invalid stored block lengths";
 	r = Z_DATA_ERROR;
 	LEAVE
@@ -172,7 +172,7 @@
 #ifndef PKZIP_BUG_WORKAROUND
       if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
       {
-        s->mode = ERROR;
+        s->mode = INF_ERROR;
         z->msg = "too many length or distance symbols";
 	r = Z_DATA_ERROR;
 	LEAVE
@@ -205,7 +205,7 @@
       {
         r = t;
 	if (r == Z_DATA_ERROR)
-	  s->mode = ERROR;
+	  s->mode = INF_ERROR;
 	LEAVE
       }
       s->sub.trees.index = 0;
@@ -240,7 +240,7 @@
 	  if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
 	      (c == 16 && i < 1))
 	  {
-	    s->mode = ERROR;
+	    s->mode = INF_ERROR;
 	    z->msg = "invalid bit length repeat";
 	    r = Z_DATA_ERROR;
 	    LEAVE
@@ -267,7 +267,7 @@
 	if (t != Z_OK)
 	{
 	  if (t == (uInt)Z_DATA_ERROR)
-	    s->mode = ERROR;
+	    s->mode = INF_ERROR;
 	  r = t;
 	  LEAVE
 	}
@@ -289,8 +289,19 @@
       r = Z_OK;
       inflate_codes_free(s->sub.codes, z);
       LOAD
-      s->mode = s->last ? DRY : TYPE;
+      if (!s->last)
+      {
+        s->mode = TYPE;
       break;
+      }
+      if (k > 7)              /* return unused byte, if any */
+      {
+        Assert(k < 16, "inflate_codes grabbed too many bytes")
+        k -= 8;
+      n++;
+      p--;                    /* can always return one */
+      }
+      s->mode = DRY;
     case DRY:
       FLUSH
       if (s->read != s->write)
@@ -299,7 +310,7 @@
     case DONE:
       r = Z_STREAM_END;
       LEAVE
-    case ERROR:
+    case INF_ERROR:
       r = Z_DATA_ERROR;
       LEAVE
     default:
@@ -309,13 +320,11 @@
 }
 
 
-int inflate_blocks_free(s, z, c, e)
+int inflate_blocks_free(s, z, c)
 struct inflate_blocks_state *s;
 z_stream *z;
 uLong *c;
-int *e;
 {
-  *e = (int)(s->bitk > 7 ? (s->bitb >> (s->bitk & 7)) & 0xff : -1);
   if (s->checkfn != Z_NULL)
     *c = s->check;
   if (s->mode == BTREE || s->mode == DTREE)
diff --git a/infblock.h b/infblock.h
index a21d730..4a9e0e2 100644
--- a/infblock.h
+++ b/infblock.h
@@ -11,9 +11,9 @@
 struct inflate_blocks_state;
 
 extern struct inflate_blocks_state * inflate_blocks_new __P((
-    z_stream *,
-    check_func checkfn,               /* check function */
-    uInt));                     /* window size */
+    z_stream *z,
+    check_func c,               /* check function */
+    uInt w));                   /* window size */
 
 extern int inflate_blocks __P((
     struct inflate_blocks_state *,
@@ -23,5 +23,4 @@
 extern int inflate_blocks_free __P((
     struct inflate_blocks_state *,
     z_stream *,
-    uLong *,			/* check value on output */
-    int *));			/* possible leftover byte to return */
+    uLong *));                        /* check value on output */
diff --git a/inffast.c b/inffast.c
index 8c3e4ce..29c97e2 100644
--- a/inffast.c
+++ b/inffast.c
@@ -8,6 +8,8 @@
 #include "infutil.h"
 #include "inffast.h"
 
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
 /* simplify the use of the inflate_huft type with some defines */
 #define base more.Base
 #define next more.Next
diff --git a/inflate-0.72.c b/inflate-0.72.c
deleted file mode 100644
index 56b0665..0000000
--- a/inflate-0.72.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* inflate.c -- zlib interface to inflate modules
- * Copyright (C) 1995 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h 
- */
-
-#include "zutil.h"
-#include "infblock.h"
-
-struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
-
-/* inflate private state */
-struct internal_state {
-
-  /* mode */
-  enum {
-      METHOD,	/* waiting for method byte */
-      FLAG,	/* waiting for flag byte */
-      START,	/* make new blocks state */
-      BLOCKS,	/* decompressing blocks */
-      CHECK4,	/* four check bytes to go */
-      CHECK3,	/* three check bytes to go */
-      CHECK2,	/* two check bytes to go */
-      CHECK1,	/* one check byte to go */
-      DONE,	/* finished check, done */
-      ERROR}	/* got an error--stay here */
-    mode;		/* current inflate mode */
-
-  /* mode dependent information */
-  union {
-    uInt method;	/* if FLAGS, method byte */
-    struct inflate_blocks_state
-      *blocks;		/* if BLOCKS, current state */
-    struct {
-      uLong was;		/* computed check value */
-      uLong need;		/* stream check value */
-    } check;		/* if CHECK, check values to compare */
-  } sub;	/* submode */
-
-  /* mode independent information */
-  int  nowrap;		/* flag for no wrapper */
-  uInt wbits;  		/* log2(window size)  (8..15, defaults to 15) */
-
-};
-
-
-int inflateInit(z)
-z_stream *z;
-{
-    return inflateInit2(z, WBITS);
-}
-
-
-int inflateInit2(z, w)
-z_stream *z;
-int w;
-{
-  /* initialize state */
-  if (z == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->zalloc == Z_NULL) z->zalloc = zcalloc;
-  if (z->zfree == Z_NULL) z->zfree = zcfree;
-  z->total_in = z->total_out = 0;
-  z->msg = Z_NULL;
-  if ((z->state = (struct internal_state *)
-       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
-    return Z_MEM_ERROR;
-  z->state->mode = METHOD;
-
-  /* handle undocumented nowrap option (no zlib header or check) */
-  z->state->nowrap = 0;
-  if (w < 0)
-  {
-    w = - w;
-    z->state->nowrap = 1;
-    z->state->mode = START;
-  }
-
-  /* set window size */
-  if (w < 8 || w > 15)
-  {
-    inflateEnd(z);
-    return Z_STREAM_ERROR;
-  }
-  z->state->wbits = w;
-  return Z_OK;
-}
-
-
-#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
-
-int inflate(z, f)
-z_stream *z;
-int f;
-{
-  int r;
-  uInt b;
-  uLong c;
-
-  if (z == Z_NULL || z->next_in == Z_NULL)
-    return Z_STREAM_ERROR;
-  r = Z_BUF_ERROR;
-  while (1) switch (z->state->mode)
-  {
-    case METHOD:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED))
-      {
-        z->state->mode = ERROR;
-	z->msg = "unknown compression method";
-	return Z_DATA_ERROR;
-      }
-      if ((z->state->sub.method >> 4) > z->state->wbits)
-      {
-        z->state->mode = ERROR;
-	z->msg = "invalid window size";
-	return Z_DATA_ERROR;
-      }
-      z->state->mode = FLAG;
-    case FLAG:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      if ((b = NEXTBYTE) & 0x20)
-      {
-        z->state->mode = ERROR;
-	z->msg = "invalid reserved bit";
-	return Z_DATA_ERROR;
-      }
-      if (((z->state->sub.method << 8) + b) % 31)
-      {
-        z->state->mode = ERROR;
-	z->msg = "incorrect header check";
-	return Z_DATA_ERROR;
-      }
-      z->state->mode = START;
-    case START:
-      if ((z->state->sub.blocks =
-           inflate_blocks_new(z,1<< z->state->wbits)) == Z_NULL)
-        return Z_MEM_ERROR;
-      z->state->mode = BLOCKS;
-    case BLOCKS:
-      if ((r = inflate_blocks(z->state->sub.blocks, z, r)) != Z_STREAM_END)
-        return r;
-      inflate_blocks_free(z->state->sub.blocks, z, &c, &r);
-      if (z->state->nowrap)
-      {
-        if (r != -1)
-	  z->msg = "inflate bug--took one too many bytes";
-	z->state->mode = r == -1 ? DONE : ERROR;
-	break;
-      }
-      z->state->sub.check.was = c;
-      if (r != -1)
-      {
-	z->state->sub.check.need = (uLong)r << 24;
-        z->state->mode = CHECK3;
-        r = Z_OK;
-	break;
-      }
-      r = Z_OK;
-      z->state->mode = CHECK4;
-    case CHECK4:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
-      z->state->mode = CHECK3;
-    case CHECK3:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
-      z->state->mode = CHECK2;
-    case CHECK2:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
-      z->state->mode = CHECK1;
-    case CHECK1:
-      if (z->avail_in == 0) return r;  r = Z_OK;
-      z->state->sub.check.need += (uLong)NEXTBYTE;
-      if (z->state->sub.check.was != z->state->sub.check.need)
-      {
-        z->state->mode = ERROR;
-        z->msg = "incorrect data check";
-	return Z_DATA_ERROR;
-      }
-      z->state->mode = DONE;
-    case DONE:
-      return Z_STREAM_END;
-    case ERROR:
-      return Z_DATA_ERROR;
-    default:
-      return Z_STREAM_ERROR;
-  }
-}
-
-
-int inflateEnd(z)
-z_stream *z;
-{
-  uLong c;
-  int e;
-
-  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
-    return Z_STREAM_ERROR;
-  if (z->state->mode == BLOCKS)
-    inflate_blocks_free(z->state->sub.blocks, z, &c, &e);
-  ZFREE(z, z->state);
-  z->state = Z_NULL;
-  return Z_OK;
-}
-
-
-/* inflateSync not implemented yet--this just consumes input */
-int inflateSync(z)
-z_stream *z;
-{
-  if (z == Z_NULL) return Z_STREAM_ERROR;
-  if (z->avail_in == 0) return Z_BUF_ERROR;
-  do {
-    z->total_in++;
-  } while (--z->avail_in);
-  return Z_DATA_ERROR;
-}
-
-
-/* inflateReset not fully implemented yet--this frees and reallocates */
-int inflateReset(z)
-z_stream *z;
-{
-  int r;
-
-  if ((r = inflateEnd(z)) != Z_OK)
-    return r;
-  return inflateInit(z);
-}
diff --git a/inflate.c b/inflate.c
index 38d70cc..b76e246 100644
--- a/inflate.c
+++ b/inflate.c
@@ -22,7 +22,7 @@
       CHECK2,	/* two check bytes to go */
       CHECK1,	/* one check byte to go */
       DONE,	/* finished check, done */
-      ERROR}	/* got an error--stay here */
+      INF_ERROR}/* got an error--stay here */
     mode;		/* current inflate mode */
 
   /* mode dependent information */
@@ -92,7 +92,7 @@
 z_stream *z;
 int f;
 {
-  int r;
+  int r = f; /* to avoid warning about unused f */
   uInt b;
   uLong c;
 
@@ -105,13 +105,13 @@
       if (z->avail_in == 0) return r;  r = Z_OK;
       if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED))
       {
-        z->state->mode = ERROR;
+        z->state->mode = INF_ERROR;
 	z->msg = "unknown compression method";
 	return Z_DATA_ERROR;
       }
       if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
       {
-        z->state->mode = ERROR;
+        z->state->mode = INF_ERROR;
 	z->msg = "invalid window size";
 	return Z_DATA_ERROR;
       }
@@ -120,13 +120,13 @@
       if (z->avail_in == 0) return r;  r = Z_OK;
       if ((b = NEXTBYTE) & 0x20)
       {
-        z->state->mode = ERROR;
+        z->state->mode = INF_ERROR;
 	z->msg = "invalid reserved bit";
 	return Z_DATA_ERROR;
       }
       if (((z->state->sub.method << 8) + b) % 31)
       {
-        z->state->mode = ERROR;
+        z->state->mode = INF_ERROR;
 	z->msg = "incorrect header check";
 	return Z_DATA_ERROR;
       }
@@ -140,23 +140,13 @@
     case BLOCKS:
       if ((r = inflate_blocks(z->state->sub.blocks, z, r)) != Z_STREAM_END)
         return r;
-      inflate_blocks_free(z->state->sub.blocks, z, &c, &r);
+      inflate_blocks_free(z->state->sub.blocks, z, &c);
       if (z->state->nowrap)
       {
-        if (r != -1)
-	  z->msg = "inflate bug--took one too many bytes";
-	z->state->mode = r == -1 ? DONE : ERROR;
+      z->state->mode = DONE;
 	break;
       }
       z->state->sub.check.was = c;
-      if (r != -1)
-      {
-	z->state->sub.check.need = (uLong)r << 24;
-        z->state->mode = CHECK3;
-        r = Z_OK;
-	break;
-      }
-      r = Z_OK;
       z->state->mode = CHECK4;
     case CHECK4:
       if (z->avail_in == 0) return r;  r = Z_OK;
@@ -175,14 +165,14 @@
       z->state->sub.check.need += (uLong)NEXTBYTE;
       if (z->state->sub.check.was != z->state->sub.check.need)
       {
-        z->state->mode = ERROR;
+        z->state->mode = INF_ERROR;
         z->msg = "incorrect data check";
 	return Z_DATA_ERROR;
       }
       z->state->mode = DONE;
     case DONE:
       return Z_STREAM_END;
-    case ERROR:
+    case INF_ERROR:
       return Z_DATA_ERROR;
     default:
       return Z_STREAM_ERROR;
@@ -194,12 +184,11 @@
 z_stream *z;
 {
   uLong c;
-  int e;
 
   if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
     return Z_STREAM_ERROR;
   if (z->state->mode == BLOCKS)
-    inflate_blocks_free(z->state->sub.blocks, z, &c, &e);
+    inflate_blocks_free(z->state->sub.blocks, z, &c);
   ZFREE(z, z->state);
   z->state = Z_NULL;
   return Z_OK;
diff --git a/inftest.c b/inftest.c
index 7dc2907..d711bfa 100644
--- a/inftest.c
+++ b/inftest.c
@@ -2,6 +2,8 @@
 #include <stdlib.h>
 #include "zutil.h"
 
+void main __P((void));
+
 /* This test is in honor of Ed Hamrick who suggested that the interface
    to inflate be a byte at a time--this implements that, and is, of course,
    monumentally slow.  It has the virtue though of stressing the push-pull
@@ -61,7 +63,7 @@
       break;
   }
   inflateEnd(&z);
-  fprintf(stderr, "%d bytes in, %d bytes out\n", z.total_in, z.total_out);
+  fprintf(stderr, "%ld bytes in, %ld bytes out\n", z.total_in, z.total_out);
   if (z.msg != NULL)
     fprintf(stderr, "msg is <%s>\n", z.msg);
 }
diff --git a/inftrees.c b/inftrees.c
index 54c7c8e..ab0ed2c 100644
--- a/inftrees.c
+++ b/inftrees.c
@@ -383,6 +383,7 @@
 {
   Assert(s == sizeof(inflate_huft) && n <= fixed_left,
          "inflate_trees falloc overflow");
+  if (q) s++; /* to make some compilers happy */
   fixed_left -= n;
   return (voidp)(fixed_mem + fixed_left);
 }
@@ -393,6 +394,7 @@
 voidp p;
 {
   Assert(0, "inflate_trees ffree called!");
+  if (q) q = p; /* to make some compilers happy */
 }
 
 
diff --git a/infutil.c b/infutil.c
index 1adadbf..3f687e6 100644
--- a/infutil.c
+++ b/infutil.c
@@ -31,7 +31,7 @@
   q = s->read;
 
   /* compute number of bytes to copy as far as end of window */
-  n = (q <= s->write ? s->write : s->end) - q;
+  n = (uInt)((q <= s->write ? s->write : s->end) - q);
   if (n > z->avail_out) n = z->avail_out;
   if (n && r == Z_BUF_ERROR) r = Z_OK;
 
@@ -55,7 +55,7 @@
       s->write = s->window;
 
     /* compute bytes to copy */
-    n = s->write - q;
+    n = (uInt)(s->write - q);
     if (n > z->avail_out) n = z->avail_out;
     if (n && r == Z_BUF_ERROR) r = Z_OK;
 
diff --git a/infutil.h b/infutil.h
index 30b230d..2aabf3c 100644
--- a/infutil.h
+++ b/infutil.h
@@ -22,7 +22,7 @@
       CODES,	/* processing fixed or dynamic block */
       DRY,	/* output remaining window bytes */
       DONE,	/* finished last block, done */
-      ERROR}	/* got a data error--stuck here */
+      INF_ERROR}/* got a data error--stuck here */
     mode;		/* current inflate_block mode */
 
   /* mode dependent information */
@@ -63,7 +63,13 @@
 #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
 #define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
 #define NEXTBYTE (n--,*p++)
-#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#ifdef __TURBOC__ /* bug in TurboC compiler, bad code for b << 0 */
+#  define NEEDBITS(j) {\
+  while(k<(j)){NEEDBYTE;b=k?b|(((uLong)NEXTBYTE)<<k):NEXTBYTE;k+=8;}\
+}
+#else
+#  define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#endif
 #define DUMPBITS(j) {b>>=(j);k-=(j);}
 /*   output bytes */
 #define WAVAIL (q<s->read?s->read-q-1:s->end-q)
diff --git a/minigzip.c b/minigzip.c
index 4936d64..d3d2fe9 100644
--- a/minigzip.c
+++ b/minigzip.c
@@ -13,15 +13,21 @@
  * or in pipe mode.
  */
 
-/* $Id: minigzip.c,v 1.2 1995/04/14 20:03:12 jloup Exp $ */
+/* $Id: minigzip.c,v 1.3 1995/04/29 14:27:21 jloup Exp $ */
 
 #include <stdio.h>
 #include "zlib.h"
 
-extern void exit __P((int));
+extern void exit  __P((int));
+extern int unlink __P((const char *));
+
+#ifdef STDC
+#  include <string.h>
+#endif
 
 #ifdef MSDOS
-#  include <fcntl.h> /* ??? find where setmode declared */
+#  include <fcntl.h>
+#  include <io.h>
 #  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
 #else
 #  define SET_BINARY_MODE(file)
@@ -38,6 +44,13 @@
 
 char *prog;
 
+void error           __P((char *msg));
+void gz_compress     __P((FILE   *in, gzFile out));
+void gz_uncompress   __P((gzFile in, FILE   *out));
+void file_compress   __P((char  *file));
+void file_uncompress __P((char  *file));
+void main            __P((int argc, char *argv[]));
+
 /* ===========================================================================
  * Display error message and exit
  */
diff --git a/trees.c b/trees.c
index 62411a7..9234add 100644
--- a/trees.c
+++ b/trees.c
@@ -29,7 +29,7 @@
  *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
  */
 
-/* $Id: trees.c,v 1.2 1995/04/10 16:21:44 jloup Exp $ */
+/* $Id: trees.c,v 1.3 1995/04/29 13:49:46 jloup Exp $ */
 
 #include "deflate.h"
 
@@ -944,7 +944,7 @@
     while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq;
     while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq;
     while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
-    s->data_type = bin_freq > (ascii_freq >> 2) ? BINARY : ASCII;
+    s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? BINARY : ASCII);
 }
 
 /* ===========================================================================
diff --git a/zconf.h b/zconf.h
index f08793b..bcd8510 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.8 1995/04/14 20:59:22 jloup Exp $ */
+/* $Id: zconf.h,v 1.9 1995/04/29 12:02:14 jloup Exp $ */
 
 #ifndef _ZCONF_H
 #define _ZCONF_H
@@ -28,6 +28,9 @@
 #if defined(MSDOS) && !defined(__32BIT__)
 #  define MAXSEG_64K
 #endif
+#if !defined(STDC) && (defined(MSDOS) || defined(__STDC__))
+#  define STDC
+#endif
 
 #ifdef MAXSEG_64K
 #  define MAX_MEM_LEVEL 8
@@ -38,7 +41,7 @@
 			/* Type declarations */
 
 #ifndef __P /* function prototypes */
-#  if defined(__STDC__) || defined(MSDOS)
+#  ifdef STDC
 #    define __P(args)  args
 #  else
 #    define __P(args)  ()
@@ -55,7 +58,7 @@
   typedef unsigned long  uLong; /* 32 bits or more */
 #endif
 #ifndef voidp
-#  if defined(__STDC__) || defined(MSDOS)
+#  ifdef STDC
      typedef void *voidp;
 #  else
      typedef Byte *voidp;
diff --git a/zlib.h b/zlib.h
index 6983fb7..f72fff8 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
 /* zlib.h -- interface of the 'zlib' general purpose compression library
-  version 0.79  April 28th, 1995.
+  version 0.8 April 29th, 1995.
 
   Copyright (C) 1995 Jean-loup Gailly and Mark Adler
 
@@ -28,7 +28,7 @@
 
 #include "zconf.h"
 
-#define ZLIB_VERSION "0.79"
+#define ZLIB_VERSION "0.8"
 
 /* 
      The 'zlib' compression library provides in-memory compression and
@@ -191,25 +191,30 @@
   so should be used only when necessary.  Using Z_FULL_FLUSH too often can
   seriously degrade the compression.
 
-    If the parameter flush is set to Z_FINISH, all pending input is
-  processed and all pending output is flushed. The next operation on this
-  stream must be another call of deflate with Z_FINISH but no more input data
-  (unchanged avail_in) if this call returned with avail_out equal to zero,
-  or a call of deflateEnd to deallocate the compression state. 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 0.1%
-  larger than avail_in plus 12 bytes.
+    If the parameter flush is set to Z_FINISH, all pending input is processed,
+  all pending output is flushed and deflate returns with Z_STREAM_END if there
+  was enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error. After
+  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
+  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
+  Z_STREAM_END, then it must be called again as described above.
 
     deflate() may update data_type if it can make a good guess about
   the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
   binary. This field is only for information purposes and does not affect
   the compression algorithm in any manner.
 
-    deflate() returns Z_OK if some progress has been made (more input processed
-  or more output produced), Z_STREAM_ERROR if the stream state was
-  inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if
-  no progress is possible or if there was not enough room in the output buffer
-  when Z_FINISH is used. ??? to be changed (use Z_STEAM_END) */
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible.
+*/
 
 
 extern int deflateEnd __P((z_stream *strm));
@@ -534,7 +539,8 @@
 /*
      Flushes all pending output into the compressed file. The parameter
    flush is as in the deflate() function. The return value is the zlib
-   error number (see function gzerror below).
+   error number (see function gzerror below). gzflush returns Z_OK if
+   the flush parameter is Z_FINISH and all output could be flushed.
      gzflush should be called only when strictly necessary because it can
    degrade compression.
 */
diff --git a/zutil.c b/zutil.c
index 9fd4ecc..4ceb89f 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.5 1995/04/14 21:30:23 jloup Exp $ */
+/* $Id: zutil.c,v 1.6 1995/04/29 14:54:02 jloup Exp $ */
 
 #include <stdio.h>
 
@@ -55,7 +55,7 @@
 }
 #endif
 
-#if defined(MSDOS) && !defined(USE_CALLOC)
+#if defined(MSDOS) && !defined(__SMALL__) && !defined(M_I86SM)
 #  ifdef __TURBOC__
 
 /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
@@ -84,7 +84,7 @@
 
 voidp zcalloc (voidp opaque, unsigned items, unsigned size)
 {
-    voidp buf;
+    voidp buf = opaque; /* just to make some compilers happy */
     ulg bsize = (ulg)items*size;
 
     if (bsize < 65536L) {
@@ -121,6 +121,7 @@
 	next_ptr--;
 	return;
     }
+    ptr = opaque; /* just to make some compilers happy */
     z_error("zcfree: ptr not found");
 }
 
@@ -133,11 +134,13 @@
 
 voidp zcalloc (voidp opaque, unsigned items, unsigned size)
 {
+    if (opaque) opaque = 0; /* to make compiler happy */
     return _halloc((long)items, size);
 }
 
 void  zcfree (voidp opaque, voidp ptr)
 {
+    if (opaque) opaque = 0; /* to make compiler happy */
     _hfree(ptr);
 }
 
diff --git a/zutil.h b/zutil.h
index 20b20f5..88f5961 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.5 1995/04/14 21:22:38 jloup Exp $ */
+/* $Id: zutil.h,v 1.6 1995/04/29 15:52:16 jloup Exp $ */
 
 #ifndef _Z_UTIL_H
 #define _Z_UTIL_H
@@ -20,9 +20,8 @@
 #else
     extern int errno;
 #endif
-#ifdef __STDC__
+#ifdef STDC
 #  include <string.h>
-#  include <memory.h>
 #endif
 
 #ifndef local
@@ -66,7 +65,6 @@
 #  define OS_CODE  0x00
 #  ifdef __TURBOC__
 #    include <alloc.h>
-#    define exit(n) _exit(n)
 #  else /* MSC */
 #    include <malloc.h>
 #  endif
@@ -125,7 +123,7 @@
 #  define zstrerror(errnum) ""
 #endif
 
-#if defined(__STDC__) && !defined(HAVE_MEMCPY)
+#if defined(STDC) && !defined(HAVE_MEMCPY)
 #  define HAVE_MEMCPY
 #endif
 #ifdef HAVE_MEMCPY