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