mirror of https://github.com/madler/zlib
zlib 0.8
This commit is contained in:
parent
913afb9174
commit
4ca984fb44
|
@ -1,9 +1,14 @@
|
||||||
ChangeLog file for zlib
|
ChangeLog file for zlib
|
||||||
|
|
||||||
Changes in 0.79 (28 April 95)
|
Changes in 0.8 (29 April 95)
|
||||||
- add fast inflate (inffast.c)
|
- 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
|
- In gzio destroy(), don't reference a freed structure
|
||||||
- avoid many warnings for MSDOS
|
- avoid many warnings for MSDOS
|
||||||
|
- avoid the ERROR symbol which is used by MS Windows
|
||||||
|
|
||||||
Changes in 0.71 (14 April 95)
|
Changes in 0.71 (14 April 95)
|
||||||
- Fixed more MSDOS compilation problems :( There is still a bug with
|
- Fixed more MSDOS compilation problems :( There is still a bug with
|
||||||
|
|
21
README
21
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
|
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
|
file zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available
|
||||||
|
@ -9,15 +11,18 @@ 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.
|
||||||
To compile all files and run the test program, just type: make test
|
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:
|
The main changes since 0.71 are:
|
||||||
- add fast inflate (inffast.c)
|
- added fast inflate (inffast.c)
|
||||||
- In gzio destroy(), don't reference a freed structure
|
- 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
|
On MSDOS, this version works in both large and small model. However
|
||||||
small model only with TurboC (bug being investigated). For both
|
small model compression works only for small values of MEM_LEVEL and
|
||||||
compilers, small model compression works only for small values of
|
WBITS (see zutil.h). Small model decompression should work up to WBITS=15.
|
||||||
MEM_LEVEL and WBITS (see zutil.h), and requires -DUSE_CALLOC.
|
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
|
Copyright (C) 1995 Jean-loup Gailly and Mark Adler
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: 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"
|
#include "zlib.h"
|
||||||
|
|
||||||
|
@ -44,9 +44,9 @@ int compress (dest, destLen, source, sourceLen)
|
||||||
if (err != Z_OK) return err;
|
if (err != Z_OK) return err;
|
||||||
|
|
||||||
err = deflate(&stream, Z_FINISH);
|
err = deflate(&stream, Z_FINISH);
|
||||||
if (err != Z_OK) {
|
if (err != Z_STREAM_END) {
|
||||||
deflateEnd(&stream);
|
deflateEnd(&stream);
|
||||||
return err;
|
return err == Z_OK ? Z_BUF_ERROR : err;
|
||||||
}
|
}
|
||||||
*destLen = stream.total_out;
|
*destLen = stream.total_out;
|
||||||
|
|
||||||
|
|
21
deflate.c
21
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"
|
#include "deflate.h"
|
||||||
|
|
||||||
|
@ -117,8 +117,10 @@ local void fill_window __P((deflate_state *s));
|
||||||
local int deflate_fast __P((deflate_state *s, int flush));
|
local int deflate_fast __P((deflate_state *s, int flush));
|
||||||
local int deflate_slow __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 void lm_init __P((deflate_state *s));
|
||||||
|
|
||||||
local int longest_match __P((deflate_state *s, IPos cur_match));
|
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
|
#ifdef ASMV
|
||||||
void match_init __P((void)); /* asm code initialization */
|
void match_init __P((void)); /* asm code initialization */
|
||||||
#endif
|
#endif
|
||||||
|
@ -225,7 +227,7 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy)
|
||||||
|
|
||||||
s->level = level;
|
s->level = level;
|
||||||
s->strategy = strategy;
|
s->strategy = strategy;
|
||||||
s->method = method;
|
s->method = (Byte)method;
|
||||||
|
|
||||||
return deflateReset(strm);
|
return deflateReset(strm);
|
||||||
}
|
}
|
||||||
|
@ -265,8 +267,8 @@ local void putShortMSB (s, b)
|
||||||
deflate_state *s;
|
deflate_state *s;
|
||||||
uInt b;
|
uInt b;
|
||||||
{
|
{
|
||||||
put_byte(s, b >> 8);
|
put_byte(s, (Byte)(b >> 8));
|
||||||
put_byte(s, b & 0xff);
|
put_byte(s, (Byte)(b & 0xff));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =========================================================================
|
/* =========================================================================
|
||||||
|
@ -346,17 +348,18 @@ int deflate (strm, flush)
|
||||||
}
|
}
|
||||||
Assert(strm->avail_out > 0, "bug2");
|
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) */
|
/* Write the zlib trailer (adler32) */
|
||||||
putShortMSB(strm->state, strm->state->adler >> 16);
|
putShortMSB(strm->state, (uInt)(strm->state->adler >> 16));
|
||||||
putShortMSB(strm->state, strm->state->adler & 0xffff);
|
putShortMSB(strm->state, (uInt)(strm->state->adler & 0xffff));
|
||||||
flush_pending(strm);
|
flush_pending(strm);
|
||||||
/* If avail_out is zero, the application will call deflate again
|
/* If avail_out is zero, the application will call deflate again
|
||||||
* to flush the rest.
|
* to flush the rest.
|
||||||
*/
|
*/
|
||||||
strm->state->noheader = 1; /* write the trailer only once! */
|
strm->state->noheader = 1; /* write the trailer only once! */
|
||||||
return Z_OK;
|
return strm->state->pending != 0 ? Z_OK : Z_STREAM_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
42
example.c
42
example.c
|
@ -3,11 +3,17 @@
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: 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 <stdio.h>
|
||||||
#include "zlib.h"
|
#include "zlib.h"
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
# include <string.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void exit __P((int));
|
||||||
|
|
||||||
#define BUFLEN 4096
|
#define BUFLEN 4096
|
||||||
|
|
||||||
#define local static
|
#define local static
|
||||||
|
@ -25,6 +31,12 @@
|
||||||
|
|
||||||
char *hello = "hello world";
|
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()
|
* Test compress() and uncompress()
|
||||||
*/
|
*/
|
||||||
|
@ -37,15 +49,15 @@ void test_compress()
|
||||||
int err;
|
int err;
|
||||||
uLong len = strlen(hello)+1;
|
uLong len = strlen(hello)+1;
|
||||||
|
|
||||||
err = compress(compr, &comprLen, hello, len);
|
err = compress(compr, &comprLen, (Byte*)hello, len);
|
||||||
CHECK_ERR(err, "compress");
|
CHECK_ERR(err, "compress");
|
||||||
|
|
||||||
strcpy(uncompr, "garbage");
|
strcpy((char*)uncompr, "garbage");
|
||||||
|
|
||||||
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
|
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
|
||||||
CHECK_ERR(err, "uncompress");
|
CHECK_ERR(err, "uncompress");
|
||||||
|
|
||||||
if (strcmp(uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad uncompress\n");
|
fprintf(stderr, "bad uncompress\n");
|
||||||
} else {
|
} else {
|
||||||
printf("uncompress(): %s\n", uncompr);
|
printf("uncompress(): %s\n", uncompr);
|
||||||
|
@ -80,7 +92,7 @@ void test_gzio(out, in)
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
fprintf(stderr, "gzopen error\n");
|
fprintf(stderr, "gzopen error\n");
|
||||||
}
|
}
|
||||||
strcpy(uncompr, "garbage");
|
strcpy((char*)uncompr, "garbage");
|
||||||
|
|
||||||
uncomprLen = gzread(file, uncompr, uncomprLen);
|
uncomprLen = gzread(file, uncompr, uncomprLen);
|
||||||
if (uncomprLen != len) {
|
if (uncomprLen != len) {
|
||||||
|
@ -88,7 +100,7 @@ void test_gzio(out, in)
|
||||||
}
|
}
|
||||||
gzclose(file);
|
gzclose(file);
|
||||||
|
|
||||||
if (strcmp(uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad gzread\n");
|
fprintf(stderr, "bad gzread\n");
|
||||||
} else {
|
} else {
|
||||||
printf("gzread(): %s\n", uncompr);
|
printf("gzread(): %s\n", uncompr);
|
||||||
|
@ -96,9 +108,9 @@ void test_gzio(out, in)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
* Test deflate() with small buffers, return the compressed length.
|
* Test deflate() with small buffers
|
||||||
*/
|
*/
|
||||||
uLong test_deflate(compr)
|
void test_deflate(compr)
|
||||||
Byte compr[];
|
Byte compr[];
|
||||||
{
|
{
|
||||||
z_stream c_stream; /* compression stream */
|
z_stream c_stream; /* compression stream */
|
||||||
|
@ -120,16 +132,15 @@ uLong test_deflate(compr)
|
||||||
CHECK_ERR(err, "deflate");
|
CHECK_ERR(err, "deflate");
|
||||||
}
|
}
|
||||||
/* Finish the stream, still forcing small buffers: */
|
/* Finish the stream, still forcing small buffers: */
|
||||||
do {
|
for (;;) {
|
||||||
c_stream.avail_out = 1;
|
c_stream.avail_out = 1;
|
||||||
err = deflate(&c_stream, Z_FINISH);
|
err = deflate(&c_stream, Z_FINISH);
|
||||||
|
if (err == Z_STREAM_END) break;
|
||||||
CHECK_ERR(err, "deflate");
|
CHECK_ERR(err, "deflate");
|
||||||
} while (c_stream.avail_out == 0);
|
}
|
||||||
|
|
||||||
err = deflateEnd(&c_stream);
|
err = deflateEnd(&c_stream);
|
||||||
CHECK_ERR(err, "deflateEnd");
|
CHECK_ERR(err, "deflateEnd");
|
||||||
|
|
||||||
return c_stream.total_out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
|
@ -142,7 +153,7 @@ void test_inflate(compr)
|
||||||
int err;
|
int err;
|
||||||
z_stream d_stream; /* decompression stream */
|
z_stream d_stream; /* decompression stream */
|
||||||
|
|
||||||
strcpy(uncompr, "garbage");
|
strcpy((char*)uncompr, "garbage");
|
||||||
|
|
||||||
d_stream.zalloc = (alloc_func)0;
|
d_stream.zalloc = (alloc_func)0;
|
||||||
d_stream.zfree = (free_func)0;
|
d_stream.zfree = (free_func)0;
|
||||||
|
@ -163,7 +174,7 @@ void test_inflate(compr)
|
||||||
err = inflateEnd(&d_stream);
|
err = inflateEnd(&d_stream);
|
||||||
CHECK_ERR(err, "inflateEnd");
|
CHECK_ERR(err, "inflateEnd");
|
||||||
|
|
||||||
if (strcmp(uncompr, hello)) {
|
if (strcmp((char*)uncompr, hello)) {
|
||||||
fprintf(stderr, "bad inflate\n");
|
fprintf(stderr, "bad inflate\n");
|
||||||
} else {
|
} else {
|
||||||
printf("inflate(): %s\n", uncompr);
|
printf("inflate(): %s\n", uncompr);
|
||||||
|
@ -179,7 +190,6 @@ void main(argc, argv)
|
||||||
char *argv[];
|
char *argv[];
|
||||||
{
|
{
|
||||||
local Byte compr[BUFLEN];
|
local Byte compr[BUFLEN];
|
||||||
uLong comprLen;
|
|
||||||
|
|
||||||
if (zlib_version[0] != ZLIB_VERSION[0]) {
|
if (zlib_version[0] != ZLIB_VERSION[0]) {
|
||||||
fprintf(stderr, "incompatible zlib version\n");
|
fprintf(stderr, "incompatible zlib version\n");
|
||||||
|
@ -193,7 +203,7 @@ void main(argc, argv)
|
||||||
test_gzio((argc > 1 ? argv[1] : "foo.gz"),
|
test_gzio((argc > 1 ? argv[1] : "foo.gz"),
|
||||||
(argc > 2 ? argv[2] : "foo.gz"));
|
(argc > 2 ? argv[2] : "foo.gz"));
|
||||||
|
|
||||||
comprLen = test_deflate(compr);
|
test_deflate(compr);
|
||||||
|
|
||||||
test_inflate(compr);
|
test_inflate(compr);
|
||||||
|
|
||||||
|
|
26
gzio.c
26
gzio.c
|
@ -3,7 +3,7 @@
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: 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>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -46,7 +46,12 @@ typedef struct gz_stream {
|
||||||
} gz_stream;
|
} 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.
|
* Cleanup then free the given gz_stream. Return a zlib error code.
|
||||||
*/
|
*/
|
||||||
local int destroy (s)
|
local int destroy (s)
|
||||||
|
@ -339,7 +344,7 @@ int gzflush (file, flush)
|
||||||
if (len != 0) {
|
if (len != 0) {
|
||||||
if (fwrite(s->outbuf, 1, len, s->file) != len) {
|
if (fwrite(s->outbuf, 1, len, s->file) != len) {
|
||||||
s->z_err = Z_ERRNO;
|
s->z_err = Z_ERRNO;
|
||||||
break;
|
return Z_ERRNO;
|
||||||
}
|
}
|
||||||
s->stream.next_out = s->outbuf;
|
s->stream.next_out = s->outbuf;
|
||||||
s->stream.avail_out = Z_BUFSIZE;
|
s->stream.avail_out = Z_BUFSIZE;
|
||||||
|
@ -347,14 +352,14 @@ int gzflush (file, flush)
|
||||||
if (done) break;
|
if (done) break;
|
||||||
s->z_err = deflate(&(s->stream), flush);
|
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:
|
* 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 @@ int gzclose (file)
|
||||||
gzFile file;
|
gzFile file;
|
||||||
{
|
{
|
||||||
uInt n;
|
uInt n;
|
||||||
|
int err;
|
||||||
gz_stream *s = (gz_stream*)file;
|
gz_stream *s = (gz_stream*)file;
|
||||||
|
|
||||||
if (s == NULL) return Z_STREAM_ERROR;
|
if (s == NULL) return Z_STREAM_ERROR;
|
||||||
|
|
||||||
if (s->mode == 'w') {
|
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->crc);
|
||||||
putLong (s->file, s->stream.total_in);
|
putLong (s->file, s->stream.total_in);
|
||||||
|
|
||||||
|
|
31
infblock.c
31
infblock.c
|
@ -139,7 +139,7 @@ int r;
|
||||||
break;
|
break;
|
||||||
case 3: /* illegal */
|
case 3: /* illegal */
|
||||||
DUMPBITS(3)
|
DUMPBITS(3)
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
z->msg = "invalid block type";
|
z->msg = "invalid block type";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
|
@ -149,7 +149,7 @@ int r;
|
||||||
NEEDBITS(32)
|
NEEDBITS(32)
|
||||||
if ((~b) >> 16 != (b & 0xffff))
|
if ((~b) >> 16 != (b & 0xffff))
|
||||||
{
|
{
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
z->msg = "invalid stored block lengths";
|
z->msg = "invalid stored block lengths";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
|
@ -172,7 +172,7 @@ int r;
|
||||||
#ifndef PKZIP_BUG_WORKAROUND
|
#ifndef PKZIP_BUG_WORKAROUND
|
||||||
if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
|
if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
|
||||||
{
|
{
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
z->msg = "too many length or distance symbols";
|
z->msg = "too many length or distance symbols";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
|
@ -205,7 +205,7 @@ int r;
|
||||||
{
|
{
|
||||||
r = t;
|
r = t;
|
||||||
if (r == Z_DATA_ERROR)
|
if (r == Z_DATA_ERROR)
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
s->sub.trees.index = 0;
|
s->sub.trees.index = 0;
|
||||||
|
@ -240,7 +240,7 @@ int r;
|
||||||
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
|
if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
|
||||||
(c == 16 && i < 1))
|
(c == 16 && i < 1))
|
||||||
{
|
{
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
z->msg = "invalid bit length repeat";
|
z->msg = "invalid bit length repeat";
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
|
@ -267,7 +267,7 @@ int r;
|
||||||
if (t != Z_OK)
|
if (t != Z_OK)
|
||||||
{
|
{
|
||||||
if (t == (uInt)Z_DATA_ERROR)
|
if (t == (uInt)Z_DATA_ERROR)
|
||||||
s->mode = ERROR;
|
s->mode = INF_ERROR;
|
||||||
r = t;
|
r = t;
|
||||||
LEAVE
|
LEAVE
|
||||||
}
|
}
|
||||||
|
@ -289,8 +289,19 @@ int r;
|
||||||
r = Z_OK;
|
r = Z_OK;
|
||||||
inflate_codes_free(s->sub.codes, z);
|
inflate_codes_free(s->sub.codes, z);
|
||||||
LOAD
|
LOAD
|
||||||
s->mode = s->last ? DRY : TYPE;
|
if (!s->last)
|
||||||
|
{
|
||||||
|
s->mode = TYPE;
|
||||||
break;
|
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:
|
case DRY:
|
||||||
FLUSH
|
FLUSH
|
||||||
if (s->read != s->write)
|
if (s->read != s->write)
|
||||||
|
@ -299,7 +310,7 @@ int r;
|
||||||
case DONE:
|
case DONE:
|
||||||
r = Z_STREAM_END;
|
r = Z_STREAM_END;
|
||||||
LEAVE
|
LEAVE
|
||||||
case ERROR:
|
case INF_ERROR:
|
||||||
r = Z_DATA_ERROR;
|
r = Z_DATA_ERROR;
|
||||||
LEAVE
|
LEAVE
|
||||||
default:
|
default:
|
||||||
|
@ -309,13 +320,11 @@ int r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int inflate_blocks_free(s, z, c, e)
|
int inflate_blocks_free(s, z, c)
|
||||||
struct inflate_blocks_state *s;
|
struct inflate_blocks_state *s;
|
||||||
z_stream *z;
|
z_stream *z;
|
||||||
uLong *c;
|
uLong *c;
|
||||||
int *e;
|
|
||||||
{
|
{
|
||||||
*e = (int)(s->bitk > 7 ? (s->bitb >> (s->bitk & 7)) & 0xff : -1);
|
|
||||||
if (s->checkfn != Z_NULL)
|
if (s->checkfn != Z_NULL)
|
||||||
*c = s->check;
|
*c = s->check;
|
||||||
if (s->mode == BTREE || s->mode == DTREE)
|
if (s->mode == BTREE || s->mode == DTREE)
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
struct inflate_blocks_state;
|
struct inflate_blocks_state;
|
||||||
|
|
||||||
extern struct inflate_blocks_state * inflate_blocks_new __P((
|
extern struct inflate_blocks_state * inflate_blocks_new __P((
|
||||||
z_stream *,
|
z_stream *z,
|
||||||
check_func checkfn, /* check function */
|
check_func c, /* check function */
|
||||||
uInt)); /* window size */
|
uInt w)); /* window size */
|
||||||
|
|
||||||
extern int inflate_blocks __P((
|
extern int inflate_blocks __P((
|
||||||
struct inflate_blocks_state *,
|
struct inflate_blocks_state *,
|
||||||
|
@ -23,5 +23,4 @@ extern int inflate_blocks __P((
|
||||||
extern int inflate_blocks_free __P((
|
extern int inflate_blocks_free __P((
|
||||||
struct inflate_blocks_state *,
|
struct inflate_blocks_state *,
|
||||||
z_stream *,
|
z_stream *,
|
||||||
uLong *, /* check value on output */
|
uLong *)); /* check value on output */
|
||||||
int *)); /* possible leftover byte to return */
|
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include "infutil.h"
|
#include "infutil.h"
|
||||||
#include "inffast.h"
|
#include "inffast.h"
|
||||||
|
|
||||||
|
struct inflate_codes_state {int dummy;}; /* for buggy compilers */
|
||||||
|
|
||||||
/* simplify the use of the inflate_huft type with some defines */
|
/* simplify the use of the inflate_huft type with some defines */
|
||||||
#define base more.Base
|
#define base more.Base
|
||||||
#define next more.Next
|
#define next more.Next
|
||||||
|
|
230
inflate-0.72.c
230
inflate-0.72.c
|
@ -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);
|
|
||||||
}
|
|
33
inflate.c
33
inflate.c
|
@ -22,7 +22,7 @@ struct internal_state {
|
||||||
CHECK2, /* two check bytes to go */
|
CHECK2, /* two check bytes to go */
|
||||||
CHECK1, /* one check byte to go */
|
CHECK1, /* one check byte to go */
|
||||||
DONE, /* finished check, done */
|
DONE, /* finished check, done */
|
||||||
ERROR} /* got an error--stay here */
|
INF_ERROR}/* got an error--stay here */
|
||||||
mode; /* current inflate mode */
|
mode; /* current inflate mode */
|
||||||
|
|
||||||
/* mode dependent information */
|
/* mode dependent information */
|
||||||
|
@ -92,7 +92,7 @@ int inflate(z, f)
|
||||||
z_stream *z;
|
z_stream *z;
|
||||||
int f;
|
int f;
|
||||||
{
|
{
|
||||||
int r;
|
int r = f; /* to avoid warning about unused f */
|
||||||
uInt b;
|
uInt b;
|
||||||
uLong c;
|
uLong c;
|
||||||
|
|
||||||
|
@ -105,13 +105,13 @@ int f;
|
||||||
if (z->avail_in == 0) return r; r = Z_OK;
|
if (z->avail_in == 0) return r; r = Z_OK;
|
||||||
if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED))
|
if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED))
|
||||||
{
|
{
|
||||||
z->state->mode = ERROR;
|
z->state->mode = INF_ERROR;
|
||||||
z->msg = "unknown compression method";
|
z->msg = "unknown compression method";
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
|
if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
|
||||||
{
|
{
|
||||||
z->state->mode = ERROR;
|
z->state->mode = INF_ERROR;
|
||||||
z->msg = "invalid window size";
|
z->msg = "invalid window size";
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -120,13 +120,13 @@ int f;
|
||||||
if (z->avail_in == 0) return r; r = Z_OK;
|
if (z->avail_in == 0) return r; r = Z_OK;
|
||||||
if ((b = NEXTBYTE) & 0x20)
|
if ((b = NEXTBYTE) & 0x20)
|
||||||
{
|
{
|
||||||
z->state->mode = ERROR;
|
z->state->mode = INF_ERROR;
|
||||||
z->msg = "invalid reserved bit";
|
z->msg = "invalid reserved bit";
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
if (((z->state->sub.method << 8) + b) % 31)
|
if (((z->state->sub.method << 8) + b) % 31)
|
||||||
{
|
{
|
||||||
z->state->mode = ERROR;
|
z->state->mode = INF_ERROR;
|
||||||
z->msg = "incorrect header check";
|
z->msg = "incorrect header check";
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -140,23 +140,13 @@ int f;
|
||||||
case BLOCKS:
|
case BLOCKS:
|
||||||
if ((r = inflate_blocks(z->state->sub.blocks, z, r)) != Z_STREAM_END)
|
if ((r = inflate_blocks(z->state->sub.blocks, z, r)) != Z_STREAM_END)
|
||||||
return r;
|
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 (z->state->nowrap)
|
||||||
{
|
{
|
||||||
if (r != -1)
|
z->state->mode = DONE;
|
||||||
z->msg = "inflate bug--took one too many bytes";
|
|
||||||
z->state->mode = r == -1 ? DONE : ERROR;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
z->state->sub.check.was = c;
|
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;
|
z->state->mode = CHECK4;
|
||||||
case CHECK4:
|
case CHECK4:
|
||||||
if (z->avail_in == 0) return r; r = Z_OK;
|
if (z->avail_in == 0) return r; r = Z_OK;
|
||||||
|
@ -175,14 +165,14 @@ int f;
|
||||||
z->state->sub.check.need += (uLong)NEXTBYTE;
|
z->state->sub.check.need += (uLong)NEXTBYTE;
|
||||||
if (z->state->sub.check.was != z->state->sub.check.need)
|
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";
|
z->msg = "incorrect data check";
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
}
|
}
|
||||||
z->state->mode = DONE;
|
z->state->mode = DONE;
|
||||||
case DONE:
|
case DONE:
|
||||||
return Z_STREAM_END;
|
return Z_STREAM_END;
|
||||||
case ERROR:
|
case INF_ERROR:
|
||||||
return Z_DATA_ERROR;
|
return Z_DATA_ERROR;
|
||||||
default:
|
default:
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
|
@ -194,12 +184,11 @@ int inflateEnd(z)
|
||||||
z_stream *z;
|
z_stream *z;
|
||||||
{
|
{
|
||||||
uLong c;
|
uLong c;
|
||||||
int e;
|
|
||||||
|
|
||||||
if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
|
if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
|
||||||
return Z_STREAM_ERROR;
|
return Z_STREAM_ERROR;
|
||||||
if (z->state->mode == BLOCKS)
|
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);
|
ZFREE(z, z->state);
|
||||||
z->state = Z_NULL;
|
z->state = Z_NULL;
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "zutil.h"
|
#include "zutil.h"
|
||||||
|
|
||||||
|
void main __P((void));
|
||||||
|
|
||||||
/* This test is in honor of Ed Hamrick who suggested that the interface
|
/* 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,
|
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
|
monumentally slow. It has the virtue though of stressing the push-pull
|
||||||
|
@ -61,7 +63,7 @@ void main()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
inflateEnd(&z);
|
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)
|
if (z.msg != NULL)
|
||||||
fprintf(stderr, "msg is <%s>\n", z.msg);
|
fprintf(stderr, "msg is <%s>\n", z.msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -383,6 +383,7 @@ uInt s; /* size of item */
|
||||||
{
|
{
|
||||||
Assert(s == sizeof(inflate_huft) && n <= fixed_left,
|
Assert(s == sizeof(inflate_huft) && n <= fixed_left,
|
||||||
"inflate_trees falloc overflow");
|
"inflate_trees falloc overflow");
|
||||||
|
if (q) s++; /* to make some compilers happy */
|
||||||
fixed_left -= n;
|
fixed_left -= n;
|
||||||
return (voidp)(fixed_mem + fixed_left);
|
return (voidp)(fixed_mem + fixed_left);
|
||||||
}
|
}
|
||||||
|
@ -393,6 +394,7 @@ voidp q;
|
||||||
voidp p;
|
voidp p;
|
||||||
{
|
{
|
||||||
Assert(0, "inflate_trees ffree called!");
|
Assert(0, "inflate_trees ffree called!");
|
||||||
|
if (q) q = p; /* to make some compilers happy */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ int r;
|
||||||
q = s->read;
|
q = s->read;
|
||||||
|
|
||||||
/* compute number of bytes to copy as far as end of window */
|
/* 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 > z->avail_out) n = z->avail_out;
|
||||||
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ int r;
|
||||||
s->write = s->window;
|
s->write = s->window;
|
||||||
|
|
||||||
/* compute bytes to copy */
|
/* compute bytes to copy */
|
||||||
n = s->write - q;
|
n = (uInt)(s->write - q);
|
||||||
if (n > z->avail_out) n = z->avail_out;
|
if (n > z->avail_out) n = z->avail_out;
|
||||||
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
if (n && r == Z_BUF_ERROR) r = Z_OK;
|
||||||
|
|
||||||
|
|
10
infutil.h
10
infutil.h
|
@ -22,7 +22,7 @@ struct inflate_blocks_state {
|
||||||
CODES, /* processing fixed or dynamic block */
|
CODES, /* processing fixed or dynamic block */
|
||||||
DRY, /* output remaining window bytes */
|
DRY, /* output remaining window bytes */
|
||||||
DONE, /* finished last block, done */
|
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; /* current inflate_block mode */
|
||||||
|
|
||||||
/* mode dependent information */
|
/* mode dependent information */
|
||||||
|
@ -63,7 +63,13 @@ struct inflate_blocks_state {
|
||||||
#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
|
#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 NEEDBYTE {if(n)r=Z_OK;else LEAVE}
|
||||||
#define NEXTBYTE (n--,*p++)
|
#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);}
|
#define DUMPBITS(j) {b>>=(j);k-=(j);}
|
||||||
/* output bytes */
|
/* output bytes */
|
||||||
#define WAVAIL (q<s->read?s->read-q-1:s->end-q)
|
#define WAVAIL (q<s->read?s->read-q-1:s->end-q)
|
||||||
|
|
19
minigzip.c
19
minigzip.c
|
@ -13,15 +13,21 @@
|
||||||
* or in pipe mode.
|
* 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 <stdio.h>
|
||||||
#include "zlib.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
|
#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)
|
# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
|
||||||
#else
|
#else
|
||||||
# define SET_BINARY_MODE(file)
|
# define SET_BINARY_MODE(file)
|
||||||
|
@ -38,6 +44,13 @@ extern void exit __P((int));
|
||||||
|
|
||||||
char *prog;
|
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
|
* Display error message and exit
|
||||||
*/
|
*/
|
||||||
|
|
4
trees.c
4
trees.c
|
@ -29,7 +29,7 @@
|
||||||
* Addison-Wesley, 1983. ISBN 0-201-06672-6.
|
* 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"
|
#include "deflate.h"
|
||||||
|
|
||||||
|
@ -944,7 +944,7 @@ local void set_data_type(s)
|
||||||
while (n < 7) bin_freq += s->dyn_ltree[n++].Freq;
|
while (n < 7) bin_freq += s->dyn_ltree[n++].Freq;
|
||||||
while (n < 128) ascii_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;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ===========================================================================
|
/* ===========================================================================
|
||||||
|
|
9
zconf.h
9
zconf.h
|
@ -3,7 +3,7 @@
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: 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
|
#ifndef _ZCONF_H
|
||||||
#define _ZCONF_H
|
#define _ZCONF_H
|
||||||
|
@ -28,6 +28,9 @@
|
||||||
#if defined(MSDOS) && !defined(__32BIT__)
|
#if defined(MSDOS) && !defined(__32BIT__)
|
||||||
# define MAXSEG_64K
|
# define MAXSEG_64K
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(MSDOS) || defined(__STDC__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MAXSEG_64K
|
#ifdef MAXSEG_64K
|
||||||
# define MAX_MEM_LEVEL 8
|
# define MAX_MEM_LEVEL 8
|
||||||
|
@ -38,7 +41,7 @@
|
||||||
/* Type declarations */
|
/* Type declarations */
|
||||||
|
|
||||||
#ifndef __P /* function prototypes */
|
#ifndef __P /* function prototypes */
|
||||||
# if defined(__STDC__) || defined(MSDOS)
|
# ifdef STDC
|
||||||
# define __P(args) args
|
# define __P(args) args
|
||||||
# else
|
# else
|
||||||
# define __P(args) ()
|
# define __P(args) ()
|
||||||
|
@ -55,7 +58,7 @@
|
||||||
typedef unsigned long uLong; /* 32 bits or more */
|
typedef unsigned long uLong; /* 32 bits or more */
|
||||||
#endif
|
#endif
|
||||||
#ifndef voidp
|
#ifndef voidp
|
||||||
# if defined(__STDC__) || defined(MSDOS)
|
# ifdef STDC
|
||||||
typedef void *voidp;
|
typedef void *voidp;
|
||||||
# else
|
# else
|
||||||
typedef Byte *voidp;
|
typedef Byte *voidp;
|
||||||
|
|
38
zlib.h
38
zlib.h
|
@ -1,5 +1,5 @@
|
||||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
/* 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
|
Copyright (C) 1995 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#include "zconf.h"
|
#include "zconf.h"
|
||||||
|
|
||||||
#define ZLIB_VERSION "0.79"
|
#define ZLIB_VERSION "0.8"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The 'zlib' compression library provides in-memory compression and
|
The 'zlib' compression library provides in-memory compression and
|
||||||
|
@ -191,25 +191,30 @@ extern int deflate __P((z_stream *strm, int flush));
|
||||||
so should be used only when necessary. Using Z_FULL_FLUSH too often can
|
so should be used only when necessary. Using Z_FULL_FLUSH too often can
|
||||||
seriously degrade the compression.
|
seriously degrade the compression.
|
||||||
|
|
||||||
If the parameter flush is set to Z_FINISH, all pending input is
|
If the parameter flush is set to Z_FINISH, all pending input is processed,
|
||||||
processed and all pending output is flushed. The next operation on this
|
all pending output is flushed and deflate returns with Z_STREAM_END if there
|
||||||
stream must be another call of deflate with Z_FINISH but no more input data
|
was enough output space; if deflate returns with Z_OK, this function must be
|
||||||
(unchanged avail_in) if this call returned with avail_out equal to zero,
|
called again with Z_FINISH and more output space (updated avail_out) but no
|
||||||
or a call of deflateEnd to deallocate the compression state. Z_FINISH can
|
more input data, until it returns with Z_STREAM_END or an error. After
|
||||||
be used immediately after deflateInit if all the compression is to be
|
deflate has returned Z_STREAM_END, the only possible operations on the
|
||||||
done in a single step. In this case, avail_out must be at least 0.1%
|
stream are deflateReset or deflateEnd.
|
||||||
larger than avail_in plus 12 bytes.
|
|
||||||
|
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
|
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
|
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
|
binary. This field is only for information purposes and does not affect
|
||||||
the compression algorithm in any manner.
|
the compression algorithm in any manner.
|
||||||
|
|
||||||
deflate() returns Z_OK if some progress has been made (more input processed
|
deflate() returns Z_OK if some progress has been made (more input
|
||||||
or more output produced), Z_STREAM_ERROR if the stream state was
|
processed or more output produced), Z_STREAM_END if all input has been
|
||||||
inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if
|
consumed and all output has been produced (only when flush is set to
|
||||||
no progress is possible or if there was not enough room in the output buffer
|
Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
|
||||||
when Z_FINISH is used. ??? to be changed (use Z_STEAM_END) */
|
if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
extern int deflateEnd __P((z_stream *strm));
|
extern int deflateEnd __P((z_stream *strm));
|
||||||
|
@ -534,7 +539,8 @@ extern int gzflush __P((gzFile file, int flush));
|
||||||
/*
|
/*
|
||||||
Flushes all pending output into the compressed file. The parameter
|
Flushes all pending output into the compressed file. The parameter
|
||||||
flush is as in the deflate() function. The return value is the zlib
|
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
|
gzflush should be called only when strictly necessary because it can
|
||||||
degrade compression.
|
degrade compression.
|
||||||
*/
|
*/
|
||||||
|
|
9
zutil.c
9
zutil.c
|
@ -3,7 +3,7 @@
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: 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>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ void zmemzero(dest, len)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MSDOS) && !defined(USE_CALLOC)
|
#if defined(MSDOS) && !defined(__SMALL__) && !defined(M_I86SM)
|
||||||
# ifdef __TURBOC__
|
# ifdef __TURBOC__
|
||||||
|
|
||||||
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
|
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
|
||||||
|
@ -84,7 +84,7 @@ local ptr_table table[MAX_PTR];
|
||||||
|
|
||||||
voidp zcalloc (voidp opaque, unsigned items, unsigned size)
|
voidp zcalloc (voidp opaque, unsigned items, unsigned size)
|
||||||
{
|
{
|
||||||
voidp buf;
|
voidp buf = opaque; /* just to make some compilers happy */
|
||||||
ulg bsize = (ulg)items*size;
|
ulg bsize = (ulg)items*size;
|
||||||
|
|
||||||
if (bsize < 65536L) {
|
if (bsize < 65536L) {
|
||||||
|
@ -121,6 +121,7 @@ void zcfree (voidp opaque, voidp ptr)
|
||||||
next_ptr--;
|
next_ptr--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ptr = opaque; /* just to make some compilers happy */
|
||||||
z_error("zcfree: ptr not found");
|
z_error("zcfree: ptr not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,11 +134,13 @@ void zcfree (voidp opaque, voidp ptr)
|
||||||
|
|
||||||
voidp zcalloc (voidp opaque, unsigned items, unsigned size)
|
voidp zcalloc (voidp opaque, unsigned items, unsigned size)
|
||||||
{
|
{
|
||||||
|
if (opaque) opaque = 0; /* to make compiler happy */
|
||||||
return _halloc((long)items, size);
|
return _halloc((long)items, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void zcfree (voidp opaque, voidp ptr)
|
void zcfree (voidp opaque, voidp ptr)
|
||||||
{
|
{
|
||||||
|
if (opaque) opaque = 0; /* to make compiler happy */
|
||||||
_hfree(ptr);
|
_hfree(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
zutil.h
8
zutil.h
|
@ -8,7 +8,7 @@
|
||||||
subject to change. Applications should only use zlib.h.
|
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
|
#ifndef _Z_UTIL_H
|
||||||
#define _Z_UTIL_H
|
#define _Z_UTIL_H
|
||||||
|
@ -20,9 +20,8 @@
|
||||||
#else
|
#else
|
||||||
extern int errno;
|
extern int errno;
|
||||||
#endif
|
#endif
|
||||||
#ifdef __STDC__
|
#ifdef STDC
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
# include <memory.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef local
|
#ifndef local
|
||||||
|
@ -66,7 +65,6 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
|
||||||
# define OS_CODE 0x00
|
# define OS_CODE 0x00
|
||||||
# ifdef __TURBOC__
|
# ifdef __TURBOC__
|
||||||
# include <alloc.h>
|
# include <alloc.h>
|
||||||
# define exit(n) _exit(n)
|
|
||||||
# else /* MSC */
|
# else /* MSC */
|
||||||
# include <malloc.h>
|
# include <malloc.h>
|
||||||
# endif
|
# endif
|
||||||
|
@ -125,7 +123,7 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
|
||||||
# define zstrerror(errnum) ""
|
# define zstrerror(errnum) ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__STDC__) && !defined(HAVE_MEMCPY)
|
#if defined(STDC) && !defined(HAVE_MEMCPY)
|
||||||
# define HAVE_MEMCPY
|
# define HAVE_MEMCPY
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_MEMCPY
|
#ifdef HAVE_MEMCPY
|
||||||
|
|
Loading…
Reference in New Issue