Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ca984fb44 | ||
|
|
913afb9174 |
10
ChangeLog
10
ChangeLog
@@ -1,5 +1,15 @@
|
||||
ChangeLog file for zlib
|
||||
|
||||
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
|
||||
TurboC large model.
|
||||
|
||||
5
Makefile
5
Makefile
@@ -6,7 +6,7 @@ LDFLAGS=-L. -lgz
|
||||
RANLIB=ranlib
|
||||
|
||||
OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
|
||||
zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o
|
||||
zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
|
||||
|
||||
TEST_OBJS = example.o minigzip.o inftest.o
|
||||
|
||||
@@ -48,7 +48,8 @@ deflate.o: deflate.h zutil.h zlib.h zconf.h
|
||||
example.o: zlib.h zconf.h
|
||||
gzio.o: zutil.h zlib.h zconf.h
|
||||
infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
|
||||
infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h
|
||||
infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
|
||||
inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
|
||||
inflate.o: zutil.h zlib.h zconf.h infblock.h
|
||||
inftest.o: zutil.h zlib.h zconf.h
|
||||
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
|
||||
|
||||
29
README
29
README
@@ -1,4 +1,6 @@
|
||||
zlib 0.71 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,21 +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.
|
||||
To compile all files and run the test program, just type: make test
|
||||
|
||||
The changes made in version 0.71 are documented in the file ChangeLog.
|
||||
The main changes since 0.5 are:
|
||||
- added full inflate support
|
||||
- added minigzip.c
|
||||
- added gzdopen to reopen a file descriptor as gzFile
|
||||
- added transparent reading of non-gziped files in gzread.
|
||||
- fix some MSDOS problems. example and minigzip now work on MSDOS.
|
||||
- Simplified the crc32() interface. The pre- and post-conditioning
|
||||
(one's complement) is now done inside crc32(). WARNING: this is
|
||||
incompatible with previous versions; see zlib.h for the new usage.
|
||||
The changes made in version 0.8 are documented in the file ChangeLog.
|
||||
The main changes since 0.71 are:
|
||||
- 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
|
||||
|
||||
@@ -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 @@ int compress (dest, destLen, source, sourceLen)
|
||||
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;
|
||||
|
||||
|
||||
23
deflate.c
23
deflate.c
@@ -47,7 +47,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/* $Id: deflate.c,v 1.3 1995/04/10 16:03:45 jloup Exp $ */
|
||||
/* $Id: deflate.c,v 1.5 1995/04/29 16:52:05 jloup Exp $ */
|
||||
|
||||
#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_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
|
||||
@@ -195,9 +197,11 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy)
|
||||
s->noheader = noheader;
|
||||
s->w_bits = windowBits;
|
||||
s->w_size = 1 << s->w_bits;
|
||||
s->w_mask = s->w_size - 1;
|
||||
|
||||
s->hash_bits = memLevel + 7;
|
||||
s->hash_size = 1 << s->hash_bits;
|
||||
s->hash_mask = s->hash_size - 1;
|
||||
s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
|
||||
|
||||
s->window = (Byte*) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
|
||||
@@ -223,7 +227,7 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy)
|
||||
|
||||
s->level = level;
|
||||
s->strategy = strategy;
|
||||
s->method = method;
|
||||
s->method = (Byte)method;
|
||||
|
||||
return deflateReset(strm);
|
||||
}
|
||||
@@ -263,8 +267,8 @@ local void putShortMSB (s, b)
|
||||
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));
|
||||
}
|
||||
|
||||
/* =========================================================================
|
||||
@@ -344,17 +348,18 @@ int deflate (strm, flush)
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
46
example.c
46
example.c
@@ -3,11 +3,17 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* $Id: example.c,v 1.4 1995/04/14 13:32:49 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 @@ void test_compress()
|
||||
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);
|
||||
@@ -60,7 +72,7 @@ void test_gzio(out, in)
|
||||
char *in; /* input file */
|
||||
{
|
||||
local Byte uncompr[BUFLEN];
|
||||
uLong uncomprLen = sizeof(uncompr);
|
||||
int uncomprLen = sizeof(uncompr);
|
||||
int err;
|
||||
int len = strlen(hello)+1;
|
||||
gzFile file;
|
||||
@@ -80,7 +92,7 @@ void test_gzio(out, in)
|
||||
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 @@ void test_gzio(out, in)
|
||||
}
|
||||
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 @@ 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[];
|
||||
{
|
||||
z_stream c_stream; /* compression stream */
|
||||
@@ -114,22 +126,21 @@ uLong test_deflate(compr)
|
||||
c_stream.next_in = (Byte*)hello;
|
||||
c_stream.next_out = compr;
|
||||
|
||||
while (c_stream.total_in != len) {
|
||||
while (c_stream.total_in != (uLong)len) {
|
||||
c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
|
||||
err = deflate(&c_stream, Z_NO_FLUSH);
|
||||
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 @@ void test_inflate(compr)
|
||||
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 @@ void test_inflate(compr)
|
||||
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 @@ void main(argc, argv)
|
||||
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 @@ void main(argc, argv)
|
||||
test_gzio((argc > 1 ? argv[1] : "foo.gz"),
|
||||
(argc > 2 ? argv[2] : "foo.gz"));
|
||||
|
||||
comprLen = test_deflate(compr);
|
||||
test_deflate(compr);
|
||||
|
||||
test_inflate(compr);
|
||||
|
||||
|
||||
34
gzio.c
34
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 @@ typedef struct 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.
|
||||
*/
|
||||
local int destroy (s)
|
||||
@@ -71,8 +76,9 @@ local int destroy (s)
|
||||
if (s->file != NULL && fclose(s->file)) {
|
||||
err = Z_ERRNO;
|
||||
}
|
||||
if (s->z_err < 0) err = s->z_err;
|
||||
zcfree((voidp)0, s);
|
||||
return s->z_err < 0 ? s->z_err : err;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
@@ -235,9 +241,10 @@ int gzread (file, buf, len)
|
||||
|
||||
if (s->transparent) {
|
||||
unsigned n = 0;
|
||||
Byte *b = (Byte*)buf;
|
||||
/* Copy the first two (non-magic) bytes if not done already */
|
||||
while (s->stream.avail_in > 0 && len > 0) {
|
||||
*((Byte*)buf)++ = *s->stream.next_in++;
|
||||
*b++ = *s->stream.next_in++;
|
||||
s->stream.avail_in--;
|
||||
len--; n++;
|
||||
}
|
||||
@@ -337,7 +344,7 @@ int gzflush (file, flush)
|
||||
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;
|
||||
@@ -345,14 +352,14 @@ int gzflush (file, flush)
|
||||
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;
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
@@ -364,7 +371,7 @@ local void putLong (file, x)
|
||||
{
|
||||
int n;
|
||||
for (n = 0; n < 4; n++) {
|
||||
fputc(x & 0xff, file);
|
||||
fputc((int)(x & 0xff), file);
|
||||
x >>= 8;
|
||||
}
|
||||
}
|
||||
@@ -393,12 +400,15 @@ int gzclose (file)
|
||||
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);
|
||||
|
||||
|
||||
47
infblock.c
47
infblock.c
@@ -60,16 +60,17 @@ local uInt border[] = { /* Order of the bit length code lengths */
|
||||
the two sets of lengths.
|
||||
*/
|
||||
|
||||
struct inflate_blocks_state *inflate_blocks_new(z,wsize)
|
||||
struct inflate_blocks_state *inflate_blocks_new(z, c, w)
|
||||
z_stream *z;
|
||||
uInt wsize;
|
||||
check_func c;
|
||||
uInt w;
|
||||
{
|
||||
struct inflate_blocks_state *s;
|
||||
|
||||
if ((s = (struct inflate_blocks_state *)ZALLOC
|
||||
(z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
|
||||
return s;
|
||||
if ((s->window = (Byte *)ZALLOC(z,1,wsize)) == Z_NULL)
|
||||
if ((s->window = (Byte *)ZALLOC(z, 1, w)) == Z_NULL)
|
||||
{
|
||||
ZFREE(z, s);
|
||||
return Z_NULL;
|
||||
@@ -77,8 +78,10 @@ uInt wsize;
|
||||
s->mode = TYPE;
|
||||
s->bitk = 0;
|
||||
s->read = s->write = s->window;
|
||||
s->end = s->window + wsize;
|
||||
s->check = 1;
|
||||
s->end = s->window + w;
|
||||
s->checkfn = c;
|
||||
if (s->checkfn != Z_NULL)
|
||||
s->check = (*s->checkfn)(0L, Z_NULL, 0);
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -136,7 +139,7 @@ int r;
|
||||
break;
|
||||
case 3: /* illegal */
|
||||
DUMPBITS(3)
|
||||
s->mode = ERROR;
|
||||
s->mode = INF_ERROR;
|
||||
z->msg = "invalid block type";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
@@ -146,7 +149,7 @@ int r;
|
||||
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
|
||||
@@ -169,7 +172,7 @@ int r;
|
||||
#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
|
||||
@@ -202,7 +205,7 @@ int r;
|
||||
{
|
||||
r = t;
|
||||
if (r == Z_DATA_ERROR)
|
||||
s->mode = ERROR;
|
||||
s->mode = INF_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
s->sub.trees.index = 0;
|
||||
@@ -237,7 +240,7 @@ int r;
|
||||
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
|
||||
@@ -264,7 +267,7 @@ int r;
|
||||
if (t != Z_OK)
|
||||
{
|
||||
if (t == (uInt)Z_DATA_ERROR)
|
||||
s->mode = ERROR;
|
||||
s->mode = INF_ERROR;
|
||||
r = t;
|
||||
LEAVE
|
||||
}
|
||||
@@ -286,8 +289,19 @@ int r;
|
||||
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)
|
||||
@@ -296,7 +310,7 @@ int r;
|
||||
case DONE:
|
||||
r = Z_STREAM_END;
|
||||
LEAVE
|
||||
case ERROR:
|
||||
case INF_ERROR:
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
default:
|
||||
@@ -306,14 +320,13 @@ int r;
|
||||
}
|
||||
|
||||
|
||||
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 = s->bitk > 7 ? (s->bitb >> (s->bitk & 7)) & 0xff : -1;
|
||||
*c = s->check;
|
||||
if (s->checkfn != Z_NULL)
|
||||
*c = s->check;
|
||||
if (s->mode == BTREE || s->mode == DTREE)
|
||||
ZFREE(z, s->sub.trees.blens);
|
||||
if (s->mode == CODES)
|
||||
|
||||
@@ -11,8 +11,9 @@
|
||||
struct inflate_blocks_state;
|
||||
|
||||
extern struct inflate_blocks_state * inflate_blocks_new __P((
|
||||
z_stream *,
|
||||
uInt)); /* window size */
|
||||
z_stream *z,
|
||||
check_func c, /* check function */
|
||||
uInt w)); /* window size */
|
||||
|
||||
extern int inflate_blocks __P((
|
||||
struct inflate_blocks_state *,
|
||||
@@ -22,5 +23,4 @@ extern int inflate_blocks __P((
|
||||
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 */
|
||||
|
||||
23
infcodes.c
23
infcodes.c
@@ -6,6 +6,7 @@
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#include "infutil.h"
|
||||
#include "inffast.h"
|
||||
#include "infcodes.h"
|
||||
|
||||
/* simplify the use of the inflate_huft type with some defines */
|
||||
@@ -98,7 +99,19 @@ int r;
|
||||
while (1) switch (c->mode)
|
||||
{ /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
|
||||
case START: /* x: set up for LEN */
|
||||
/* %%% check for avail in and out to do fast loop %%% */
|
||||
#ifndef SLOW
|
||||
if (m >= 258 && n >= 10)
|
||||
{
|
||||
UPDATE
|
||||
r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
|
||||
LOAD
|
||||
if (r != Z_OK)
|
||||
{
|
||||
c->mode = r == Z_STREAM_END ? WASH : BAD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* !SLOW */
|
||||
c->sub.code.need = c->lbits;
|
||||
c->sub.code.tree = c->ltree;
|
||||
c->mode = LEN;
|
||||
@@ -112,14 +125,14 @@ int r;
|
||||
if (e == -128) /* invalid code */
|
||||
{
|
||||
c->mode = BAD;
|
||||
z->msg = "invalid huffman code";
|
||||
z->msg = "invalid literal/length code";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
e = -e;
|
||||
if (e & 64) /* end of block */
|
||||
{
|
||||
c->mode = END;
|
||||
c->mode = WASH;
|
||||
break;
|
||||
}
|
||||
c->sub.code.need = e;
|
||||
@@ -153,7 +166,7 @@ int r;
|
||||
if (e == -128)
|
||||
{
|
||||
c->mode = BAD;
|
||||
z->msg = "invalid huffman code";
|
||||
z->msg = "invalid distance code";
|
||||
r = Z_DATA_ERROR;
|
||||
LEAVE
|
||||
}
|
||||
@@ -171,7 +184,7 @@ int r;
|
||||
DUMPBITS(j)
|
||||
c->mode = COPY;
|
||||
case COPY: /* o: copying bytes in window, waiting for space */
|
||||
f = q - s->window < c->sub.copy.dist ?
|
||||
f = (uInt)(q - s->window) < c->sub.copy.dist ?
|
||||
s->end - (c->sub.copy.dist - (q - s->window)) :
|
||||
q - c->sub.copy.dist;
|
||||
while (c->len)
|
||||
|
||||
150
inffast.c
Normal file
150
inffast.c
Normal file
@@ -0,0 +1,150 @@
|
||||
/* inffast.c -- process literals and length/distance pairs fast
|
||||
* Copyright (C) 1995 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
#include "zutil.h"
|
||||
#include "inftrees.h"
|
||||
#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
|
||||
#define exop word.what.Exop
|
||||
#define bits word.what.Bits
|
||||
|
||||
/* macros for bit input with no checking and for returning unused bytes */
|
||||
#ifdef DEBUG
|
||||
# undef NEXTBYTE
|
||||
# define NEXTBYTE (n--?0:fprintf(stderr,"inffast underrun\n"),*p++)
|
||||
#endif
|
||||
#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
|
||||
#define UNGRAB {n+=(c=k>>3);p-=c;k&=7;}
|
||||
|
||||
/* Called with number of bytes left to write in window at least 258
|
||||
(the maximum string length) and number of input bytes available
|
||||
at least ten. The ten bytes are six bytes for the longest length/
|
||||
distance pair plus four bytes for overloading the bit buffer. */
|
||||
|
||||
int inflate_fast(bl, bd, tl, td, s, z)
|
||||
uInt bl, bd;
|
||||
inflate_huft *tl, *td;
|
||||
struct inflate_blocks_state *s;
|
||||
z_stream *z;
|
||||
{
|
||||
inflate_huft *t; /* temporary pointer */
|
||||
int e; /* extra bits or operation */
|
||||
uLong b; /* bit buffer */
|
||||
uInt k; /* bits in bit buffer */
|
||||
Byte *p; /* input data pointer */
|
||||
uInt n; /* bytes available there */
|
||||
Byte *q; /* output window write pointer */
|
||||
uInt m; /* bytes to end of window or read pointer */
|
||||
uInt ml; /* mask for literal/length tree */
|
||||
uInt md; /* mask for distance tree */
|
||||
uInt c; /* bytes to copy */
|
||||
uInt d; /* distance back to copy from */
|
||||
Byte *r; /* copy source pointer */
|
||||
|
||||
/* load input, output, bit values */
|
||||
LOAD
|
||||
|
||||
/* initialize masks in registers */
|
||||
ml = inflate_mask[bl];
|
||||
md = inflate_mask[bd];
|
||||
|
||||
/* do until not enough input or output space for fast loop */
|
||||
do { /* assume called with m >= 258 && n >= 10 */
|
||||
/* get literal/length code */
|
||||
GRABBITS(20) /* max bits for literal/length code */
|
||||
if ((e = (t = tl + ((uInt)b & ml))->exop) < 0)
|
||||
do {
|
||||
if (e == -128)
|
||||
{
|
||||
z->msg = "invalid literal/length code";
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
DUMPBITS(t->bits)
|
||||
e = -e;
|
||||
if (e & 64) /* end of block */
|
||||
{
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_STREAM_END;
|
||||
}
|
||||
} while ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) < 0);
|
||||
DUMPBITS(t->bits)
|
||||
|
||||
/* process literal or length (end of block already trapped) */
|
||||
if (e & 16) /* then it's a literal */
|
||||
{
|
||||
*q++ = (Byte)t->base;
|
||||
m--;
|
||||
}
|
||||
else /* it's a length */
|
||||
{
|
||||
/* get length of block to copy (already have extra bits) */
|
||||
c = t->base + ((uInt)b & inflate_mask[e]);
|
||||
DUMPBITS(e);
|
||||
|
||||
/* decode distance base of block to copy */
|
||||
GRABBITS(15); /* max bits for distance code */
|
||||
if ((e = (t = td + ((uInt)b & md))->exop) < 0)
|
||||
do {
|
||||
if (e == -128)
|
||||
{
|
||||
z->msg = "invalid distance code";
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
DUMPBITS(t->bits)
|
||||
e = -e;
|
||||
} while ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) < 0);
|
||||
DUMPBITS(t->bits)
|
||||
|
||||
/* get extra bits to add to distance base */
|
||||
GRABBITS(e) /* get extra bits (up to 13) */
|
||||
d = t->base + ((uInt)b & inflate_mask[e]);
|
||||
DUMPBITS(e)
|
||||
|
||||
/* do the copy */
|
||||
m -= c;
|
||||
if (q - s->window >= d) /* if offset before destination, */
|
||||
{ /* just copy */
|
||||
r = q - d;
|
||||
*q++ = *r++; c--; /* minimum count is three, */
|
||||
*q++ = *r++; c--; /* so unroll loop a little */
|
||||
do {
|
||||
*q++ = *r++;
|
||||
} while (--c);
|
||||
}
|
||||
else /* else offset after destination */
|
||||
{
|
||||
e = d - (q - s->window); /* bytes from offset to end */
|
||||
r = s->end - e; /* pointer to offset */
|
||||
if (c > e) /* if source crosses, */
|
||||
{
|
||||
c -= e; /* copy to end of window */
|
||||
do {
|
||||
*q++ = *r++;
|
||||
} while (--e);
|
||||
r = s->window; /* copy rest from start of window */
|
||||
}
|
||||
do { /* copy all or what's left */
|
||||
*q++ = *r++;
|
||||
} while (--c);
|
||||
}
|
||||
}
|
||||
} while (m >= 258 && n >= 10);
|
||||
|
||||
/* not enough input or output--restore pointers and return */
|
||||
UNGRAB
|
||||
UPDATE
|
||||
return Z_OK;
|
||||
}
|
||||
17
inffast.h
Normal file
17
inffast.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/* inffast.h -- header to use inffast.c
|
||||
* Copyright (C) 1995 Mark Adler
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* WARNING: this file should *not* be used by applications. It is
|
||||
part of the implementation of the compression library and is
|
||||
subject to change. Applications should only use zlib.h.
|
||||
*/
|
||||
|
||||
extern int inflate_fast __P((
|
||||
uInt,
|
||||
uInt,
|
||||
inflate_huft *,
|
||||
inflate_huft *,
|
||||
struct inflate_blocks_state *,
|
||||
z_stream *));
|
||||
81
inflate.c
81
inflate.c
@@ -22,13 +22,9 @@ struct internal_state {
|
||||
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 */
|
||||
|
||||
int no_header;
|
||||
uInt w_size; /* LZ77 window size (32K by default) */
|
||||
uInt w_bits; /* log2(w_size) (8..16) */
|
||||
|
||||
/* mode dependent information */
|
||||
union {
|
||||
uInt method; /* if FLAGS, method byte */
|
||||
@@ -39,19 +35,26 @@ struct internal_state {
|
||||
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 (strm)
|
||||
z_stream *strm;
|
||||
int inflateInit(z)
|
||||
z_stream *z;
|
||||
{
|
||||
return inflateInit2(strm, WBITS);
|
||||
return inflateInit2(z, WBITS);
|
||||
}
|
||||
|
||||
int inflateInit2(z, windowBits)
|
||||
|
||||
int inflateInit2(z, w)
|
||||
z_stream *z;
|
||||
int windowBits;
|
||||
int w;
|
||||
{
|
||||
/* initialize state */
|
||||
if (z == Z_NULL)
|
||||
return Z_STREAM_ERROR;
|
||||
if (z->zalloc == Z_NULL) z->zalloc = zcalloc;
|
||||
@@ -63,19 +66,22 @@ int windowBits;
|
||||
return Z_MEM_ERROR;
|
||||
z->state->mode = METHOD;
|
||||
|
||||
z->state->no_header = 0;
|
||||
if (windowBits < 0) { /* undocumented feature: no zlib header */
|
||||
windowBits = - windowBits;
|
||||
z->state->no_header = 1;
|
||||
z->state->sub.method = DEFLATED;
|
||||
/* 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;
|
||||
}
|
||||
if (windowBits < 8 || windowBits > 15) {
|
||||
|
||||
/* set window size */
|
||||
if (w < 8 || w > 15)
|
||||
{
|
||||
inflateEnd(z);
|
||||
return Z_STREAM_ERROR;
|
||||
}
|
||||
z->state->w_bits = windowBits;
|
||||
z->state->w_size = 1<<windowBits;
|
||||
z->state->wbits = w;
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
@@ -86,7 +92,7 @@ int inflate(z, f)
|
||||
z_stream *z;
|
||||
int f;
|
||||
{
|
||||
int r;
|
||||
int r = f; /* to avoid warning about unused f */
|
||||
uInt b;
|
||||
uLong c;
|
||||
|
||||
@@ -99,13 +105,13 @@ int f;
|
||||
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) > z->state->w_bits)
|
||||
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;
|
||||
}
|
||||
@@ -114,39 +120,33 @@ int f;
|
||||
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;
|
||||
}
|
||||
z->state->mode = START;
|
||||
case START:
|
||||
if ((z->state->sub.blocks = inflate_blocks_new(z,z->state->w_size))
|
||||
== Z_NULL)
|
||||
if ((z->state->sub.blocks = inflate_blocks_new(z,
|
||||
z->state->nowrap ? Z_NULL : adler32,
|
||||
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->no_header) {
|
||||
z->state->mode = DONE;
|
||||
return Z_STREAM_END;
|
||||
}
|
||||
z->state->sub.check.was = c;
|
||||
if (r != -1)
|
||||
inflate_blocks_free(z->state->sub.blocks, z, &c);
|
||||
if (z->state->nowrap)
|
||||
{
|
||||
z->state->sub.check.need = (uLong)r << 24;
|
||||
z->state->mode = CHECK3;
|
||||
r = Z_OK;
|
||||
z->state->mode = DONE;
|
||||
break;
|
||||
}
|
||||
r = Z_OK;
|
||||
z->state->sub.check.was = c;
|
||||
z->state->mode = CHECK4;
|
||||
case CHECK4:
|
||||
if (z->avail_in == 0) return r; r = Z_OK;
|
||||
@@ -165,14 +165,14 @@ int f;
|
||||
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;
|
||||
@@ -184,12 +184,11 @@ 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);
|
||||
inflate_blocks_free(z->state->sub.blocks, z, &c);
|
||||
ZFREE(z, z->state);
|
||||
z->state = Z_NULL;
|
||||
return Z_OK;
|
||||
|
||||
22
inflate.h
22
inflate.h
@@ -1,22 +0,0 @@
|
||||
/* temporary kludge assuming single pass decompression */
|
||||
|
||||
/* $Id: inflate.h,v 1.2 1995/04/11 14:47:32 jloup Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define NEXTBYTE \
|
||||
(istrm->total_in++, istrm->avail_in-- == 0 ? \
|
||||
(z_error("too small"), 0) : *istrm->next_in++)
|
||||
|
||||
#define FLUSH(n) { \
|
||||
if (istrm->avail_out < n) z_error("too big"); \
|
||||
istrm->avail_out -= n; \
|
||||
memcpy(istrm->next_out, slide, n); \
|
||||
istrm->next_out += n; \
|
||||
istrm->total_out += n; \
|
||||
}
|
||||
#define WSIZE istrm->state->w_size
|
||||
#define slide istrm->state->window
|
||||
#define memzero(a,s) memset((a),0,(s))
|
||||
#define inflate z_inflate
|
||||
#define qflag 1
|
||||
@@ -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 @@ void main()
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -246,7 +246,7 @@ z_stream *zs; /* for zalloc function */
|
||||
{
|
||||
x[h] = i; /* save pattern for backing up */
|
||||
r.bits = (char)l; /* bits to dump before this table */
|
||||
r.exop = (char)(-j); /* bits in this table */
|
||||
r.exop = -(char)j; /* bits in this table */
|
||||
r.next = q; /* pointer to this table */
|
||||
j = i >> (w - l); /* (get around Turbo C bug) */
|
||||
u[h-1][j] = r; /* connect to last table */
|
||||
@@ -383,6 +383,7 @@ uInt s; /* size of item */
|
||||
{
|
||||
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 q;
|
||||
voidp p;
|
||||
{
|
||||
Assert(0, "inflate_trees ffree called!");
|
||||
if (q) q = p; /* to make some compilers happy */
|
||||
}
|
||||
|
||||
|
||||
|
||||
14
infutil.c
14
infutil.c
@@ -31,7 +31,7 @@ int r;
|
||||
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;
|
||||
|
||||
@@ -40,7 +40,8 @@ int r;
|
||||
z->total_out += n;
|
||||
|
||||
/* update check information */
|
||||
s->check = adler32(s->check, q, n);
|
||||
if (s->checkfn != Z_NULL)
|
||||
s->check = (*s->checkfn)(s->check, q, n);
|
||||
|
||||
/* copy as far as end of window */
|
||||
while (n--) *p++ = *q++;
|
||||
@@ -48,11 +49,13 @@ int r;
|
||||
/* see if more to copy at beginning of window */
|
||||
if (q == s->end)
|
||||
{
|
||||
/* wrap source pointer */
|
||||
/* wrap pointers */
|
||||
q = s->window;
|
||||
if (s->write == s->end)
|
||||
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;
|
||||
|
||||
@@ -61,7 +64,8 @@ int r;
|
||||
z->total_out += n;
|
||||
|
||||
/* update check information */
|
||||
s->check = adler32(s->check, q, n);
|
||||
if (s->checkfn != Z_NULL)
|
||||
s->check = (*s->checkfn)(s->check, q, n);
|
||||
|
||||
/* copy */
|
||||
while (n--) *p++ = *q++;
|
||||
|
||||
11
infutil.h
11
infutil.h
@@ -22,7 +22,7 @@ struct inflate_blocks_state {
|
||||
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 */
|
||||
@@ -47,6 +47,7 @@ struct inflate_blocks_state {
|
||||
Byte *end; /* one byte after sliding window */
|
||||
Byte *read; /* window read pointer */
|
||||
Byte *write; /* window write pointer */
|
||||
check_func checkfn; /* check function */
|
||||
uLong check; /* check on output */
|
||||
|
||||
};
|
||||
@@ -62,7 +63,13 @@ struct inflate_blocks_state {
|
||||
#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)
|
||||
|
||||
19
minigzip.c
19
minigzip.c
@@ -13,13 +13,21 @@
|
||||
* or in pipe mode.
|
||||
*/
|
||||
|
||||
/* $Id: minigzip.c,v 1.1 1995/04/14 13:35:59 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 int unlink __P((const char *));
|
||||
|
||||
#ifdef STDC
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef MSDOS
|
||||
# include <fcntl.h>
|
||||
# include <io.h>
|
||||
# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
|
||||
#else
|
||||
# define SET_BINARY_MODE(file)
|
||||
@@ -36,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
|
||||
*/
|
||||
@@ -87,7 +102,7 @@ void gz_uncompress(in, out)
|
||||
if (len < 0) error (gzerror(in, &err));
|
||||
if (len == 0) break;
|
||||
|
||||
if (fwrite(buf, 1, len, out) != len) error("failed fwrite");
|
||||
if (fwrite(buf, 1, len, out) != (uInt)len) error("failed fwrite");
|
||||
}
|
||||
if (fclose(out)) error("failed fclose");
|
||||
|
||||
|
||||
6
trees.c
6
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 @@ local void set_data_type(s)
|
||||
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);
|
||||
}
|
||||
|
||||
/* ===========================================================================
|
||||
@@ -1011,7 +1011,7 @@ local void bi_windup(s)
|
||||
if (s->bi_valid > 8) {
|
||||
put_short(s, s->bi_buf);
|
||||
} else if (s->bi_valid > 0) {
|
||||
put_byte(s, s->bi_buf);
|
||||
put_byte(s, (Byte)s->bi_buf);
|
||||
}
|
||||
s->bi_buf = 0;
|
||||
s->bi_valid = 0;
|
||||
|
||||
9
zconf.h
9
zconf.h
@@ -3,7 +3,7 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* $Id: zconf.h,v 1.7 1995/04/12 20:42:28 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;
|
||||
|
||||
122
zlib.h
122
zlib.h
@@ -1,5 +1,5 @@
|
||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 0.7 April 14th, 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.7"
|
||||
#define ZLIB_VERSION "0.8"
|
||||
|
||||
/*
|
||||
The 'zlib' compression library provides in-memory compression and
|
||||
@@ -88,7 +88,7 @@ typedef struct z_stream_s {
|
||||
|
||||
zalloc must return Z_NULL if there is not enough memory for the object.
|
||||
On 16-bit systems, the functions zalloc and zfree must be able to allocate
|
||||
exactly 65536 bytes, but will not be require to allocate more than this
|
||||
exactly 65536 bytes, but will not be required to allocate more than this
|
||||
if the symbol MAXSEG_64K is defined (see zconf.h).
|
||||
|
||||
The fields total_in and total_out can be used for statistics or
|
||||
@@ -152,10 +152,10 @@ extern int deflateInit __P((z_stream *strm, int level));
|
||||
to level 6).
|
||||
|
||||
deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
|
||||
enough memory, Z_STREAM_ERROR if the stream state was inconsistent (such
|
||||
as zalloc being NULL). msg is set to null if there is no error message.
|
||||
deflateInit does not perform any compression: this will be done by
|
||||
deflate(). */
|
||||
enough memory, Z_STREAM_ERROR if level is not a valid compression level.
|
||||
msg is set to null if there is no error message. deflateInit does not
|
||||
perform any compression: this will be done by deflate().
|
||||
*/
|
||||
|
||||
|
||||
extern int deflate __P((z_stream *strm, int flush));
|
||||
@@ -164,8 +164,8 @@ extern int deflate __P((z_stream *strm, int flush));
|
||||
|
||||
- Compress more input starting at next_in and update next_in and avail_in
|
||||
accordingly. If not all input can be processed (because there is not
|
||||
enough room in the output buffer), next_in is updated and processing
|
||||
will resume at this point for the next call of deflate().
|
||||
enough room in the output buffer), next_in and avail_in are updated and
|
||||
processing will resume at this point for the next call of deflate().
|
||||
|
||||
- Provide more output starting at next_out and update next_out and avail_out
|
||||
accordingly. This action is forced if the parameter flush is non zero.
|
||||
@@ -175,40 +175,45 @@ extern int deflate __P((z_stream *strm, int flush));
|
||||
|
||||
Before the call of deflate(), the application should ensure that at least
|
||||
one of the actions is possible, by providing more input and/or consuming
|
||||
more output, and updating avail_in or avail_out accordingly.
|
||||
The application can consume the compressed output when the output
|
||||
buffer is full (avail_out == 0), or after each call of deflate().
|
||||
more output, and updating avail_in or avail_out accordingly; avail_out
|
||||
should never be zero before the call. The application can consume the
|
||||
compressed output when it wants, for example when the output buffer is full
|
||||
(avail_out == 0), or after each call of deflate().
|
||||
|
||||
If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression
|
||||
block is byte aligned and flushed to the output buffer so that the
|
||||
decompressor can get all input data available so far; if the compression
|
||||
method is 8 (deflate without partial flush capability), the current block
|
||||
is terminated. If flush is set to Z_FULL_FLUSH, the compression block is
|
||||
terminated, a special marker is output and the compression dictionary is
|
||||
discarded; this is useful to allow the decompressor to synchronize if one
|
||||
compressed block has been damaged.
|
||||
Flushing degrades compression and so should be used only when necessary.
|
||||
Using Z_FULL_FLUSH too often can seriously degrade the compression.
|
||||
block is terminated and flushed to the output buffer so that the
|
||||
decompressor can get all input data available so far. For method 9, a future
|
||||
variant on method 8, the current block will be flushed but not terminated.
|
||||
If flush is set to Z_FULL_FLUSH, the compression block is terminated, a
|
||||
special marker is output and the compression dictionary is discarded; this
|
||||
is useful to allow the decompressor to synchronize if one compressed block
|
||||
has been damaged (see inflateSync below). Flushing degrades compression and
|
||||
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 8 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 strm->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
|
||||
binary. This field is only for information purposes and does not affect
|
||||
the compression algorithm in any manner.
|
||||
|
||||
deflate() return 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.
|
||||
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.
|
||||
*/
|
||||
|
||||
|
||||
@@ -232,8 +237,7 @@ extern int inflateInit __P((z_stream *strm));
|
||||
functions.
|
||||
|
||||
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
|
||||
enough memory, Z_STREAM_ERROR if the stream state was inconsistent (such
|
||||
as zalloc being NULL). msg is set to null if there is no error message.
|
||||
enough memory. msg is set to null if there is no error message.
|
||||
inflateInit does not perform any decompression: this will be done by
|
||||
inflate().
|
||||
*/
|
||||
@@ -255,8 +259,9 @@ extern int inflate __P((z_stream *strm, int flush));
|
||||
Before the call of inflate(), the application should ensure that at least
|
||||
one of the actions is possible, by providing more input and/or consuming
|
||||
more output, and updating the next_* and avail_* values accordingly.
|
||||
The application can consume the uncompressed output when the output
|
||||
buffer is full (avail_out == 0), or after each call of inflate().
|
||||
The application can consume the uncompressed output when it wants, for
|
||||
example when the output buffer is full (avail_out == 0), or after each
|
||||
call of inflate().
|
||||
|
||||
If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much
|
||||
output as possible to the output buffer. The flushing behavior of inflate is
|
||||
@@ -275,13 +280,13 @@ extern int inflate __P((z_stream *strm, int flush));
|
||||
|
||||
inflate() returns Z_OK if some progress has been made (more input
|
||||
processed or more output produced), Z_STREAM_END if the end of the
|
||||
compressed data has been reached, Z_DATA_ERROR if the input data was
|
||||
corrupted, Z_STREAM_ERROR if the stream structure was inconsistent (for
|
||||
example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough
|
||||
memory, Z_BUF_ERROR if no progress is possible or if there was not enough
|
||||
room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR case,
|
||||
the application may then call inflateSync to look for a good compression
|
||||
block.
|
||||
compressed data has been reached and all uncompressed output has been
|
||||
produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if
|
||||
the stream structure was inconsistent (for example if next_in or next_out
|
||||
was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no
|
||||
progress is possible or if there was not enough room in the output buffer
|
||||
when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then
|
||||
call inflateSync to look for a good compression block.
|
||||
*/
|
||||
|
||||
|
||||
@@ -318,9 +323,9 @@ extern int deflateInit2 __P((z_stream *strm,
|
||||
|
||||
The windowBits parameter is the base two logarithm of the window size
|
||||
(the size of the history buffer). It should be in the range 8..15 for this
|
||||
version of the library (the value 16 will be allowed soon). Larger values
|
||||
of this parameter result in better compression at the expense of memory
|
||||
usage. The default value is 15 if deflateInit is used instead.
|
||||
version of the library (the value 16 will be allowed for method 9). Larger
|
||||
values of this parameter result in better compression at the expense of
|
||||
memory usage. The default value is 15 if deflateInit is used instead.
|
||||
|
||||
The memLevel parameter specifies how much memory should be allocated
|
||||
for the internal compression state. memLevel=1 uses minimum memory but
|
||||
@@ -338,8 +343,8 @@ extern int deflateInit2 __P((z_stream *strm,
|
||||
|
||||
If next_in is not null, the library will use this buffer to hold also
|
||||
some history information; the buffer must either hold the entire input
|
||||
data, or have at least (1<<windowBits) bytes and be writable. If next_in is
|
||||
null, the library will allocate its own history buffer (and leave next_in
|
||||
data, or have at least 1<<(windowBits+1) bytes and be writable. If next_in
|
||||
is null, the library will allocate its own history buffer (and leave next_in
|
||||
null). next_out need not be provided here but must be provided by the
|
||||
application for the next call of deflate().
|
||||
|
||||
@@ -350,8 +355,7 @@ extern int deflateInit2 __P((z_stream *strm,
|
||||
reset by the library in this case.
|
||||
|
||||
deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
|
||||
not enough memory, Z_STREAM_ERROR if the stream state was inconsistent
|
||||
(such as zalloc being NULL) or the parameters are invalid (such as
|
||||
not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
|
||||
an invalid method). msg is set to null if there is no error message.
|
||||
deflateInit2 does not perform any compression: this will be done by
|
||||
deflate().
|
||||
@@ -406,7 +410,7 @@ extern int inflateInit2 __P((z_stream *strm,
|
||||
|
||||
If next_out is not null, the library will use this buffer for the history
|
||||
buffer; the buffer must either be large enough to hold the entire output
|
||||
data, or have at least 1<<(windowBits-1) bytes. If next_out is null, the
|
||||
data, or have at least 1<<windowBits bytes. If next_out is null, the
|
||||
library will allocate its own buffer (and leave next_out null). next_in
|
||||
need not be provided here but must be provided by the application for the
|
||||
next call of inflate().
|
||||
@@ -418,9 +422,8 @@ extern int inflateInit2 __P((z_stream *strm,
|
||||
avail_out is zero and all output has been consumed.
|
||||
|
||||
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was
|
||||
not enough memory, Z_STREAM_ERROR if the stream state was inconsistent
|
||||
(such as zalloc being NULL) or the parameters are invalid (such as
|
||||
windowBits < 9). msg is set to null if there is no error message.
|
||||
not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as
|
||||
windowBits < 8). msg is set to null if there is no error message.
|
||||
inflateInit2 does not perform any compression: this will be done by
|
||||
inflate().
|
||||
*/
|
||||
@@ -536,7 +539,8 @@ extern int gzflush __P((gzFile file, int flush));
|
||||
/*
|
||||
Flushes all pending output into the compressed file. The parameter
|
||||
flush is as in the deflate() function. The return value is the zlib
|
||||
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.
|
||||
*/
|
||||
@@ -585,7 +589,7 @@ extern uLong crc32 __P((uLong crc, Byte *buf, uInt len));
|
||||
/*
|
||||
Update a running crc with the bytes buf[0..len-1] and return the updated
|
||||
crc. If buf is NULL, this function returns the required initial value
|
||||
for the crc (0). Pre- and post-conditioning (one's complement) is performed
|
||||
for the crc. Pre- and post-conditioning (one's complement) is performed
|
||||
within this function so it shouldn't be done by the application.
|
||||
Usage example:
|
||||
|
||||
|
||||
13
zutil.c
13
zutil.c
@@ -3,12 +3,14 @@
|
||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||
*/
|
||||
|
||||
/* $Id: zutil.c,v 1.3 1995/04/10 09:52:26 jloup Exp $ */
|
||||
/* $Id: zutil.c,v 1.6 1995/04/29 14:54:02 jloup Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "zutil.h"
|
||||
|
||||
extern void exit __P((int));
|
||||
|
||||
char *zlib_version = ZLIB_VERSION;
|
||||
|
||||
char *z_errmsg[] = {
|
||||
@@ -53,7 +55,7 @@ void zmemzero(dest, len)
|
||||
}
|
||||
#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
|
||||
@@ -82,7 +84,7 @@ local ptr_table table[MAX_PTR];
|
||||
|
||||
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) {
|
||||
@@ -119,6 +121,7 @@ void zcfree (voidp opaque, voidp ptr)
|
||||
next_ptr--;
|
||||
return;
|
||||
}
|
||||
ptr = opaque; /* just to make some compilers happy */
|
||||
z_error("zcfree: ptr not found");
|
||||
}
|
||||
|
||||
@@ -131,12 +134,14 @@ void zcfree (voidp opaque, voidp ptr)
|
||||
|
||||
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)
|
||||
{
|
||||
return _hfree(ptr);
|
||||
if (opaque) opaque = 0; /* to make compiler happy */
|
||||
_hfree(ptr);
|
||||
}
|
||||
|
||||
# endif /* __TURBOC__ ? */
|
||||
|
||||
15
zutil.h
15
zutil.h
@@ -8,7 +8,7 @@
|
||||
subject to change. Applications should only use zlib.h.
|
||||
*/
|
||||
|
||||
/* $Id: zutil.h,v 1.4 1995/04/14 10:22:17 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,6 +20,9 @@
|
||||
#else
|
||||
extern int errno;
|
||||
#endif
|
||||
#ifdef STDC
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#ifndef local
|
||||
# define local static
|
||||
@@ -62,7 +65,6 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
|
||||
# define OS_CODE 0x00
|
||||
# ifdef __TURBOC__
|
||||
# include <alloc.h>
|
||||
# define exit(n) _exit(n)
|
||||
# else /* MSC */
|
||||
# include <malloc.h>
|
||||
# endif
|
||||
@@ -121,7 +123,7 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
|
||||
# define zstrerror(errnum) ""
|
||||
#endif
|
||||
|
||||
#if defined(__STDC__) && !defined(HAVE_MEMCPY)
|
||||
#if defined(STDC) && !defined(HAVE_MEMCPY)
|
||||
# define HAVE_MEMCPY
|
||||
#endif
|
||||
#ifdef HAVE_MEMCPY
|
||||
@@ -154,13 +156,16 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
|
||||
#endif
|
||||
|
||||
|
||||
typedef uLong (*check_func) __P((uLong check, Byte *buf, uInt len));
|
||||
|
||||
extern void z_error __P((char *m));
|
||||
|
||||
voidp zcalloc __P((voidp opaque, unsigned items, unsigned size));
|
||||
void zcfree __P((voidp opaque, voidp ptr));
|
||||
|
||||
#define ZALLOC(strm, items, size) (*strm->zalloc)(strm->opaque, items, size)
|
||||
#define ZFREE(strm, addr) (*strm->zfree) (strm->opaque, (voidp)addr)
|
||||
#define ZALLOC(strm, items, size) \
|
||||
(*((strm)->zalloc))((strm)->opaque, (items), (size))
|
||||
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidp)(addr))
|
||||
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
|
||||
|
||||
#endif /* _Z_UTIL_H */
|
||||
|
||||
Reference in New Issue
Block a user