Compare commits

..

5 Commits

Author SHA1 Message Date
Mark Adler
ebd3c2c0e7 zlib 1.0.5 2011-09-09 23:17:17 -07:00
Mark Adler
ff11b0a61f zlib 1.0.4 2011-09-09 23:17:02 -07:00
Mark Adler
e26a448e96 zlib 1.0.2 2011-09-09 23:15:17 -07:00
Mark Adler
423eb40306 zlib 1.0.1 2011-09-09 23:14:39 -07:00
Mark Adler
8a2acbffc8 zlib 1.0-pre 2011-09-09 23:13:27 -07:00
40 changed files with 1200 additions and 371 deletions

View File

@@ -1,7 +1,64 @@
ChangeLog file for zlib ChangeLog file for zlib
Changes in 1.0 (15 Jan 96) Changes in 1.0.5 (3 Jan 98)
- Fix inflate to terminate gracefully when fed corrupted or invalid data
- Use const for rommable constants in inflate
- Eliminate memory leaks on error conditions in inflate
- Removed some vestigial code in inflate
- Update web address in README
Changes in 1.0.4 (24 Jul 96)
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
bit, so the decompressor could decompress all the correct data but went
on to attempt decompressing extra garbage data. This affected minigzip too.
- zlibVersion and gzerror return const char* (needed for DLL)
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
- use z_error only for DEBUG (avoid problem with DLLs)
Changes in 1.0.3 (2 Jul 96)
- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
small and medium models; this makes the library incompatible with previous
versions for these models. (No effect in large model or on other systems.)
- return OK instead of BUF_ERROR if previous deflate call returned with
avail_out as zero but there is nothing to do
- added memcmp for non STDC compilers
- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
- better check for 16-bit mode MSC (avoids problem with Symantec)
Changes in 1.0.2 (23 May 96)
- added Windows DLL support
- added a function zlibVersion (for the DLL support)
- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
- Bytef is define's instead of typedef'd only for Borland C
- avoid reading uninitialized memory in example.c
- mention in README that the zlib format is now RFC1950
- updated Makefile.dj2
- added algorithm.doc
Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
- fix array overlay in deflate.c which sometimes caused bad compressed data
- fix inflate bug with empty stored block
- fix MSDOS medium model which was broken in 0.99
- fix deflateParams() which could generated bad compressed data.
- Bytef is define'd instead of typedef'ed (work around Borland bug)
- added an INDEX file
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
- speed up adler32 for modern machines without auto-increment
- added -ansi for IRIX in configure
- static_init_done in trees.c is an int
- define unlink as delete for VMS
- fix configure for QNX
- add configure branch for SCO and HPUX
- avoid many warnings (unused variables, dead assignments, etc...)
- no fdopen for BeOS
- fix the Watcom fix for 32 bit mode (define FAR as empty)
- removed redefinition of Byte for MKWERKS
- work around an MWKERKS bug (incorrect merge of all .h files)
Changes in 0.99 (27 Jan 96)
- allow preset dictionary shared between compressor and decompressor - allow preset dictionary shared between compressor and decompressor
- allow compression level 0 (no compression) - allow compression level 0 (no compression)
- add deflateParams in zlib.h: allow dynamic change of compression level - add deflateParams in zlib.h: allow dynamic change of compression level

51
INDEX Normal file
View File

@@ -0,0 +1,51 @@
ChangeLog history of changes
INDEX this file
Make_vms.com script for Vax/VMS
Makefile makefile for Unix (generated by configure)
Makefile.b32 makefile for Borland C++ 32-bit
Makefile.bor makefile for Borland C/C++ 16-bit
Makefile.dj2 makefile for DJGPP 2.x
Makefile.in makefile for Unix (template for configure)
Makefile.msc makefile for Microsoft C 16-bit
Makefile.riscos makefile for RISCOS
Makefile.sas makefile for Amiga SAS/C
Makefile.tc makefile for Turbo C
Makefile.wat makefile for Watcom C
README guess what
algorithm.doc description of the compression & decompression algorithms
configure configure script for Unix
descrip.mms makefile for Vax/VMS
zlib.def definition file for Windows DLL
zlib.rc definition file for Windows DLL
zlib public header files (must be kept):
zconf.h
zlib.h
private source files used to build the zlib library:
adler32.c
compress.c
crc32.c
deflate.c
deflate.h
gzio.c
infblock.c
infblock.h
infcodes.c
infcodes.h
inffast.c
inffast.h
inflate.c
inftrees.c
inftrees.h
infutil.c
infutil.h
trees.c
uncompr.c
zutil.c
zutil.h
source files for sample programs:
example.c
minigzip.c

View File

@@ -1,5 +1,5 @@
# Makefile for zlib # Makefile for zlib
# Copyright (C) 1995-1996 Jean-loup Gailly. # Copyright (C) 1995-1998 Jean-loup Gailly.
# For conditions of distribution and use, see copyright notice in zlib.h # For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type: # To compile and test, type:
@@ -22,7 +22,7 @@ CFLAGS=-O
LDFLAGS=-L. -lz LDFLAGS=-L. -lz
LDSHARED=$(CC) LDSHARED=$(CC)
VER=1.0 VER=1.0.5
LIBS=libz.a LIBS=libz.a
AR=ar rc AR=ar rc
@@ -37,8 +37,8 @@ OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
TEST_OBJS = example.o minigzip.o TEST_OBJS = example.o minigzip.o
DISTFILES = README ChangeLog configure Makefile.in Makefile Makefile.msc \ DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms \
Makefile.bor Makefile.tc Make_vms.com descrip.mms *.[ch] zlib.def zlib.rc algorithm.doc *.[ch]
all: example minigzip all: example minigzip
@@ -86,8 +86,8 @@ clean:
zip: zip:
mv Makefile Makefile~; cp -p Makefile.in Makefile mv Makefile Makefile~; cp -p Makefile.in Makefile
v=`sed -n -e 's/\./-/' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
zip -ul9 zlib-$$v $(DISTFILES) zip -ul9 zlib$$v $(DISTFILES)
mv Makefile~ Makefile mv Makefile~ Makefile
dist: dist:

104
Makefile.b32 Normal file
View File

@@ -0,0 +1,104 @@
# Makefile for zlib
# Borland C++
# This version of the zlib makefile was adapted by Chris Young for use
# with Borland C 4.5x with the Dos Power Pack for a 32-bit protected mode
# flat memory model. It was created for use with POV-Ray ray tracer and
# you may choose to edit the CFLAGS to suit your needs but the
# switches -WX and -DMSDOS are required.
# -- Chris Young 76702.1655@compuserve.com
# To use, do "make -fmakefile.b32"
# See zconf.h for details about the memory requirements.
# ------------- Borland C++ -------------
MODEL=-WX
CFLAGS= $(MODEL) -P-C -K -N- -k- -d -3 -r- -v- -f -DMSDOS
CC=bcc32
LD=bcc32
LIB=tlib
LDFLAGS= $(MODEL)
O=.obj
# variables
OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
trees$(O)
OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
trees$(O)
OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
infutil$(O) inffast$(O)
OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
infutil$(O)+inffast$(O)
all: test
adler32.obj: adler32.c zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
compress.obj: compress.c zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
crc32.obj: crc32.c zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
gzio.obj: gzio.c zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
infcodes.h infutil.h
$(CC) -c $(CFLAGS) $*.c
infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
infcodes.h inffast.h
$(CC) -c $(CFLAGS) $*.c
inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
$(CC) -c $(CFLAGS) $*.c
inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
$(CC) -c $(CFLAGS) $*.c
infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
$(CC) -c $(CFLAGS) $*.c
inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
$(CC) -c $(CFLAGS) $*.c
trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
uncompr.obj: uncompr.c zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
zutil.obj: zutil.c zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
example.obj: example.c zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
minigzip.obj: minigzip.c zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c
# we must cut the command line to fit in the MS/DOS 128 byte limit:
zlib.lib: $(OBJ1) $(OBJ2)
del zlib.lib
$(LIB) zlib +$(OBJP1)
$(LIB) zlib +$(OBJP2)
example.exe: example.obj zlib.lib
$(LD) $(LDFLAGS) example.obj zlib.lib
minigzip.exe: minigzip.obj zlib.lib
$(LD) $(LDFLAGS) minigzip.obj zlib.lib
test: example.exe minigzip.exe
example
echo hello world | minigzip | minigzip -d
#clean:
# del *.obj
# del *.exe

93
Makefile.dj2 Normal file
View File

@@ -0,0 +1,93 @@
# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96.
# Copyright (C) 1995-1996 Jean-loup Gailly.
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile, or to compile and test, type:
#
# make -fmakefile.dj2; make test -fmakefile.dj2
#
# To install libz.a, zconf.h and zlib.h in the djgpp directories, type:
#
# make install -fmakefile.dj2
#
# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
# in the sample below if the pattern of the DJGPP distribution is to
# be followed. Remember that, while <sp>'es around <=> are ignored in
# makefiles, they are *not* in batch files or in djgpp.env.
# - - - - -
# [make]
# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include
# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib
# BUTT=-m486
# - - - - -
# Alternately, these variables may be defined below, overriding the values
# in djgpp.env, as
INCLUDE_PATH=c:\usr\include
CC=gcc
#CFLAGS=-MMD -O
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
#CFLAGS=-MMD -g -DDEBUG
CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-Wstrict-prototypes -Wmissing-prototypes
# If cp.exe is not found, replace with copy /Y .
CP=cp -f
# If install.exe is not found, replace with $(CP).
INSTALL=install
# The default value of RM is "rm -f." If "rm.exe" is not found, uncomment:
# RM=del
LDLIBS=-L. -lz
LD=$(CC) -s -o
LDSHARED=$(CC)
INCL=zlib.h zconf.h
LIBS=libz.a
AR=ar rcs
prefix=/usr/local
exec_prefix = $(prefix)
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 inffast.o
TEST_OBJS = example.o minigzip.o
all: example.exe minigzip.exe
test: all
./example
echo hello world | .\minigzip | .\minigzip -d
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
libz.a: $(OBJS)
$(AR) $@ $(OBJS)
%.exe : %.o $(LIBS)
$(LD) $@ $< $(LDLIBS)
# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
.PHONY : uninstall clean
install: $(INCL) $(LIBS)
-@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
-@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
for %%f in ($(INCL)) do $(INSTALL) %%f $(INCLUDE_PATH)
for %%p in ($(LIBS)) do $(INSTALL) %%p $(LIBRARY_PATH)
uninstall:
for %%f in ($(INCL)) do $(RM) $(INCLUDE_PATH)\%%f
for %%p in ($(LIBS)) do $(RM) $(LIBRARY_PATH)\%%p
clean:
for %%p in (*.d *.o *.exe libz.a libz.so* foo.gz) do $(RM) %%p
DEPS := $(wildcard *.d)
ifneq ($(DEPS),)
include $(DEPS)
endif

View File

@@ -1,5 +1,5 @@
# Makefile for zlib # Makefile for zlib
# Copyright (C) 1995-1996 Jean-loup Gailly. # Copyright (C) 1995-1998 Jean-loup Gailly.
# For conditions of distribution and use, see copyright notice in zlib.h # For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type: # To compile and test, type:
@@ -22,7 +22,7 @@ CFLAGS=-O
LDFLAGS=-L. -lz LDFLAGS=-L. -lz
LDSHARED=$(CC) LDSHARED=$(CC)
VER=1.0 VER=1.0.5
LIBS=libz.a LIBS=libz.a
AR=ar rc AR=ar rc
@@ -37,8 +37,8 @@ OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
TEST_OBJS = example.o minigzip.o TEST_OBJS = example.o minigzip.o
DISTFILES = README ChangeLog configure Makefile.in Makefile Makefile.msc \ DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] descrip.mms \
Makefile.bor Makefile.tc Make_vms.com descrip.mms *.[ch] zlib.def zlib.rc algorithm.doc *.[ch]
all: example minigzip all: example minigzip
@@ -86,8 +86,8 @@ clean:
zip: zip:
mv Makefile Makefile~; cp -p Makefile.in Makefile mv Makefile Makefile~; cp -p Makefile.in Makefile
v=`sed -n -e 's/\./-/' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
zip -ul9 zlib-$$v $(DISTFILES) zip -ul9 zlib$$v $(DISTFILES)
mv Makefile~ Makefile mv Makefile~ Makefile
dist: dist:

View File

@@ -28,6 +28,8 @@ OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\ OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
infutil$(O)+inffast$(O) infutil$(O)+inffast$(O)
all: zlib.lib example.exe minigzip.exe
adler32.obj: adler32.c zutil.h zlib.h zconf.h adler32.obj: adler32.c zutil.h zlib.h zconf.h
$(CC) -c $(CFLAGS) $*.c $(CC) -c $(CFLAGS) $*.c
@@ -80,7 +82,7 @@ minigzip.obj: minigzip.c zlib.h zconf.h
# we must cut the command line to fit in the MS/DOS 128 byte limit: # we must cut the command line to fit in the MS/DOS 128 byte limit:
zlib.lib: $(OBJ1) $(OBJ2) zlib.lib: $(OBJ1) $(OBJ2)
del zlib.lib if exist zlib.lib del zlib.lib
lib zlib $(OBJ1); lib zlib $(OBJ1);
lib zlib $(OBJ2); lib zlib $(OBJ2);

46
Makefile.riscos Normal file
View File

@@ -0,0 +1,46 @@
# Project: zlib_1_03
# Toolflags:
CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fnah
C++flags = -c -depend !Depend -IC: -throwback
Linkflags = -aif -c++ -o $@
ObjAsmflags = -throwback -NoCache -depend !Depend
CMHGflags =
LibFileflags = -c -l -o $@
Squeezeflags = -o $@
# Final targets:
@.zlib_lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \
@.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \
@.o.uncompress @.o.zutil
LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \
@.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \
@.o.trees @.o.uncompress @.o.zutil
@.test: @.tests.minigzip @.tests.example
echo Please run "Test" in directory tests
@.tests.minigzip: @.o.minigzip @.zlib_lib C:o.Stubs
Link $(Linkflags) @.o.minigzip @.zlib_lib C:o.Stubs
@.tests.example: @.o.example @.zlib_lib C:o.Stubs
Link $(Linkflags) @.o.example @.zlib_lib C:o.Stubs
# User-editable dependencies:
.c.o:
cc $(ccflags) -o $@ $<
# Static dependencies:
@.o.example: @.tests.c.example
cc $(ccflags) -o @.o.example @.tests.c.example
@.o.minigzip: @.tests.c.minigzip
cc $(ccflags) -o @.o.minigzip @.tests.c.minigzip
# Dynamic dependencies:
o.minigzip: tests.c.minigzip
o.minigzip: h.zlib
o.minigzip: h.zconf
o.example: tests.c.example
o.example: h.zlib
o.example: h.zconf

64
Makefile.sas Normal file
View File

@@ -0,0 +1,64 @@
# SMakefile for zlib
# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly
# Osma Ahvenlampi <Osma.Ahvenlampi@hut.fi>
# Amiga, SAS/C 6.56 & Smake
CC=sc
CFLAGS=OPT
#CFLAGS=OPT CPU=68030
#CFLAGS=DEBUG=LINE
LDFLAGS=LIB z.lib
SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX
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 inffast.o
TEST_OBJS = example.o minigzip.o
all: SCOPTIONS example minigzip
test: all
`cd`/example
echo hello world | minigzip | minigzip -d
install: z.lib
copy zlib.h zconf.h INCLUDE: clone
copy z.lib LIB: clone
z.lib: $(OBJS)
oml z.lib r $(OBJS)
example: example.o z.lib
$(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS)
minigzip: minigzip.o z.lib
$(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
clean:
-delete force quiet *.o example minigzip z.lib foo.gz *.lnk SCOPTIONS
SCOPTIONS: Smakefile
copy to $@ <from <
$(SCOPTIONS)
<
# DO NOT DELETE THIS LINE -- make depend depends on it.
adler32.o: zutil.h zlib.h zconf.h
compress.o: zlib.h zconf.h
crc32.o: zutil.h zlib.h zconf.h
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 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
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h
minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h
uncompr.o: zlib.h zconf.h
zutil.o: zutil.h zlib.h zconf.h

103
Makefile.wat Normal file
View File

@@ -0,0 +1,103 @@
# Makefile for zlib
# Watcom 10a
# This version of the zlib makefile was adapted by Chris Young for use
# with Watcom 10a 32-bit protected mode flat memory model. It was created
# for use with POV-Ray ray tracer and you may choose to edit the CFLAGS to
# suit your needs but the -DMSDOS is required.
# -- Chris Young 76702.1655@compuserve.com
# To use, do "wmake -f makefile.wat"
# See zconf.h for details about the memory requirements.
# ------------- Watcom 10a -------------
MODEL=-mf
CFLAGS= $(MODEL) -fpi87 -fp5 -zp4 -5r -w5 -oneatx -DMSDOS
CC=wcc386
LD=wcl386
LIB=wlib -b -c
LDFLAGS=
O=.obj
# variables
OBJ1=adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O)
OBJ2=trees$(O) zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O)
OBJ3=infutil$(O) inffast$(O)
OBJP1=adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)
OBJP2=trees$(O)+zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)
OBJP3=infutil$(O)+inffast$(O)
all: test
adler32.obj: adler32.c zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
compress.obj: compress.c zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
crc32.obj: crc32.c zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
gzio.obj: gzio.c zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h &
infcodes.h infutil.h
$(CC) $(CFLAGS) $*.c
infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h &
infcodes.h inffast.h
$(CC) $(CFLAGS) $*.c
inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
$(CC) $(CFLAGS) $*.c
inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
$(CC) $(CFLAGS) $*.c
infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
$(CC) $(CFLAGS) $*.c
inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
$(CC) $(CFLAGS) $*.c
trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
uncompr.obj: uncompr.c zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
zutil.obj: zutil.c zutil.h zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
example.obj: example.c zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
minigzip.obj: minigzip.c zlib.h zconf.h
$(CC) $(CFLAGS) $*.c
# we must cut the command line to fit in the MS/DOS 128 byte limit:
zlib.lib: $(OBJ1) $(OBJ2) $(OBJ3)
del zlib.lib
$(LIB) zlib.lib +$(OBJP1)
$(LIB) zlib.lib +$(OBJP2)
$(LIB) zlib.lib +$(OBJP3)
example.exe: example.obj zlib.lib
$(LD) $(LDFLAGS) example.obj zlib.lib
minigzip.exe: minigzip.obj zlib.lib
$(LD) $(LDFLAGS) minigzip.obj zlib.lib
test: minigzip.exe example.exe
example
echo hello world | minigzip | minigzip -d >test
type test
#clean:
# del *.obj
# del *.exe

60
README
View File

@@ -1,7 +1,9 @@
zlib 1.0 is a general purpose data compression library. All the code zlib 1.0.5 is a general purpose data compression library. All the code
is reentrant (thread safe). The data format used by the zlib library is reentrant (thread safe). The data format used by the zlib library
is described in the files zlib-3.3.doc, deflate-1.3.doc and is described by RFCs (Request for Comments) 1950 to 1952 in the files
gzip-4.3.doc, available in ftp://ftp.uu.net/pub/archiving/zip/doc/ ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
format) and rfc1952.txt (gzip format). These documents are also available in
other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
All functions of the compression library are documented in the file All functions of the compression library are documented in the file
zlib.h. A usage example of the library is given in the file example.c zlib.h. A usage example of the library is given in the file example.c
@@ -16,30 +18,19 @@ makefiles such as Makefile.msc; for VMS, use Make_vms.com or descrip.mms.
Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or, Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or,
if this fails, to the addresses given below in the Copyright section. if this fails, to the addresses given below in the Copyright section.
The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
The changes made in version 1.0.5 are documented in the file ChangeLog.
The main changes since 1.0.4 are:
- Fix inflate to terminate gracefully when fed corrupted or invalid data
- Use const for rommable constants in inflate
A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
The changes made in version 1.0 are documented in the file ChangeLog.
The main changes since 0.95 are:
- allow preset dictionary shared between compressor and decompressor
- allow compression level 0 (no compression)
- add deflateParams in zlib.h: allow dynamic change of compression level
and compression strategy.
- test large buffers and deflateParams in example.c
- add optional "configure" to build zlib as a shared library
- suppress Makefile.qnx, use configure instead
- fixes for 64-bit systems (needed for Alpha and Cray)
- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
- always return Z_BUF_ERROR when deflate() has nothing to do
- deflateInit and inflateInit are now macros to allow version checking
- prefix all global functions and types with z_ with -DZ_PREFIX
- fix some very unlikely race conditions in multi-threaded environment
- several minor fixes for better portability
- free in reverse order of allocation to help memory manager
- use zlib-1.0/* instead of zlib/* inside the tar.gz
- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
-Wconversion -Wstrict-prototypes -Wmissing-prototypes"
- allow gzread on concatenated .gz files
- deflateEnd now returns Z_DATA_ERROR if it was premature
- deflate is finally (?) fully deterministic
Notes for some targets: Notes for some targets:
@@ -47,8 +38,8 @@ Notes for some targets:
avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
- For 64-bit Iris, deflate.c must be compiled without any optimization. - For 64-bit Iris, deflate.c must be compiled without any optimization.
With -O, one libpng test fails. The test works in 32 bit mode (with the With -O, one libpng test fails. The test works in 32 bit mode (with
-32 compiler flag). the -32 compiler flag). The compiler bug has been reported to SGI.
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
it works when compiled with cc. it works when compiled with cc.
@@ -56,9 +47,14 @@ Notes for some targets:
- zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not - zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not
accepting the -O option). It works with the other cc compiler. accepting the -O option). It works with the other cc compiler.
A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk> - To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
is in the CPAN (Comprehensive Perl Archive Network) sites, such as: and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* For help on building a zlib DLL, contact Alessandro Iacopetti
<iaco@email.alessandria.alpcom.it> http://lisa.unial.it/iaco ,
or contact Brad Clarke <bclarke@cyberus.ca>.
- gzdopen is not supported on RISCOS
Acknowledgments: Acknowledgments:
@@ -69,7 +65,7 @@ Acknowledgments:
Copyright notice: Copyright notice:
(C) 1995-1996 Jean-loup Gailly and Mark Adler (C) 1995-1998 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages

View File

@@ -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: adler32.c,v 1.6 1995/05/03 17:27:08 jloup Exp $ */ /* $Id: adler32.c,v 1.10 1996/05/22 11:52:18 me Exp $ */
#include "zlib.h" #include "zlib.h"
@@ -11,11 +11,11 @@
#define NMAX 5552 #define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
#define DO1(buf) {s1 += *buf++; s2 += s1;} #define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
#define DO2(buf) DO1(buf); DO1(buf); #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
#define DO4(buf) DO2(buf); DO2(buf); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
#define DO8(buf) DO4(buf); DO4(buf); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf); DO8(buf); #define DO16(buf) DO8(buf,0); DO8(buf,8);
/* ========================================================================= */ /* ========================================================================= */
uLong adler32(adler, buf, len) uLong adler32(adler, buf, len)
@@ -34,10 +34,12 @@ uLong adler32(adler, buf, len)
len -= k; len -= k;
while (k >= 16) { while (k >= 16) {
DO16(buf); DO16(buf);
buf += 16;
k -= 16; k -= 16;
} }
if (k != 0) do { if (k != 0) do {
DO1(buf); s1 += *buf++;
s2 += s1;
} while (--k); } while (--k);
s1 %= BASE; s1 %= BASE;
s2 %= BASE; s2 %= BASE;

105
algorithm.doc Normal file
View File

@@ -0,0 +1,105 @@
1. Compression algorithm (deflate)
The deflation algorithm used by zlib (also zip and gzip) is a variation of
LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
the input data. The second occurrence of a string is replaced by a
pointer to the previous string, in the form of a pair (distance,
length). Distances are limited to 32K bytes, and lengths are limited
to 258 bytes. When a string does not occur anywhere in the previous
32K bytes, it is emitted as a sequence of literal bytes. (In this
description, `string' must be taken as an arbitrary sequence of bytes,
and is not restricted to printable characters.)
Literals or match lengths are compressed with one Huffman tree, and
match distances are compressed with another tree. The trees are stored
in a compact form at the start of each block. The blocks can have any
size (except that the compressed data for one block must fit in
available memory). A block is terminated when deflate() determines that
it would be useful to start another block with fresh trees. (This is
somewhat similar to the behavior of LZW-based _compress_.)
Duplicated strings are found using a hash table. All input strings of
length 3 are inserted in the hash table. A hash index is computed for
the next 3 bytes. If the hash chain for this index is not empty, all
strings in the chain are compared with the current input string, and
the longest match is selected.
The hash chains are searched starting with the most recent strings, to
favor small distances and thus take advantage of the Huffman encoding.
The hash chains are singly linked. There are no deletions from the
hash chains, the algorithm simply discards matches that are too old.
To avoid a worst-case situation, very long hash chains are arbitrarily
truncated at a certain length, determined by a runtime option (level
parameter of deflateInit). So deflate() does not always find the longest
possible match but generally finds a match which is long enough.
deflate() also defers the selection of matches with a lazy evaluation
mechanism. After a match of length N has been found, deflate() searches for a
longer match at the next input byte. If a longer match is found, the
previous match is truncated to a length of one (thus producing a single
literal byte) and the longer match is emitted afterwards. Otherwise,
the original match is kept, and the next match search is attempted only
N steps later.
The lazy match evaluation is also subject to a runtime parameter. If
the current match is long enough, deflate() reduces the search for a longer
match, thus speeding up the whole process. If compression ratio is more
important than speed, deflate() attempts a complete second search even if
the first match is already long enough.
The lazy match evaluation is not performed for the fastest compression
modes (level parameter 1 to 3). For these fast modes, new strings
are inserted in the hash table only when no match was found, or
when the match is not too long. This degrades the compression ratio
but saves time since there are both fewer insertions and fewer searches.
2. Decompression algorithm (inflate)
The real question is, given a Huffman tree, how to decode fast. The most
important realization is that shorter codes are much more common than
longer codes, so pay attention to decoding the short codes fast, and let
the long codes take longer to decode.
inflate() sets up a first level table that covers some number of bits of
input less than the length of longest code. It gets that many bits from the
stream, and looks it up in the table. The table will tell if the next
code is that many bits or less and how many, and if it is, it will tell
the value, else it will point to the next level table for which inflate()
grabs more bits and tries to decode a longer code.
How many bits to make the first lookup is a tradeoff between the time it
takes to decode and the time it takes to build the table. If building the
table took no time (and if you had infinite memory), then there would only
be a first level table to cover all the way to the longest code. However,
building the table ends up taking a lot longer for more bits since short
codes are replicated many times in such a table. What inflate() does is
simply to make the number of bits in the first table a variable, and set it
for the maximum speed.
inflate() sends new trees relatively often, so it is possibly set for a
smaller first level table than an application that has only one tree for
all the data. For inflate, which has 286 possible codes for the
literal/length tree, the size of the first table is nine bits. Also the
distance trees have 30 possible values, and the size of the first table is
six bits. Note that for each of those cases, the table ended up one bit
longer than the ``average'' code length, i.e. the code length of an
approximately flat code which would be a little more than eight bits for
286 symbols and a little less than five bits for 30 symbols. It would be
interesting to see if optimizing the first level table for other
applications gave values within a bit or two of the flat code size.
Jean-loup Gailly Mark Adler
gzip@prep.ai.mit.edu madler@alumni.caltech.edu
References:
[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
pp. 337-343.
``DEFLATE Compressed Data Format Specification'' available in
ftp://ds.internic.net/rfc/rfc1951.txt

View File

@@ -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.6 1995/05/03 17:27:08 jloup Exp $ */ /* $Id: compress.c,v 1.10 1996/05/23 16:51:12 me Exp $ */
#include "zlib.h" #include "zlib.h"
@@ -30,9 +30,10 @@ int compress (dest, destLen, source, sourceLen)
stream.next_in = (Bytef*)source; stream.next_in = (Bytef*)source;
stream.avail_in = (uInt)sourceLen; stream.avail_in = (uInt)sourceLen;
#ifdef MAXSEG_64K
/* Check for source > 64K on 16-bit machine: */ /* Check for source > 64K on 16-bit machine: */
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
#endif
stream.next_out = dest; stream.next_out = dest;
stream.avail_out = (uInt)*destLen; stream.avail_out = (uInt)*destLen;
if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;

29
configure vendored
View File

@@ -13,6 +13,7 @@
LIBS=libz.a LIBS=libz.a
VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
AR=${AR-"ar rc"} AR=${AR-"ar rc"}
RANLIB=${RANLIB-"ranlib"}
prefix=${prefix-/usr/local} prefix=${prefix-/usr/local}
exec_prefix=${exec_prefix-$prefix} exec_prefix=${exec_prefix-$prefix}
@@ -36,25 +37,32 @@ else
SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
CFLAGS=${CFLAGS-"-O2"} CFLAGS=${CFLAGS-"-O2"}
LDSHARED=${LDSHARED-"ld"};; LDSHARED=${LDSHARED-"ld"};;
IRIX*) SFLAGS=${CFLAGS-"-O2 -rpath ."} IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
CFLAGS=${CFLAGS-"-O2"} CFLAGS=${CFLAGS-"-ansi -O2"}
LDSHARED=${LDSHARED-"cc -shared"};; LDSHARED=${LDSHARED-"cc -shared"};;
QNX*) SFLAGS=${CFLAGS-"-4 -O -Q"} QNX*) SFLAGS=${CFLAGS-"-4 -O"}
CFLAGS=${CFLAGS-"-4 -O -Q"} CFLAGS=${CFLAGS-"-4 -O"}
LDSHARED=${LDSHARED-"cc"} LDSHARED=${LDSHARED-"cc"}
LIBS=zlib.lib RANLIB=${RANLIB-"true"}
AR="cc -A";; AR="cc -A";;
SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
CFLAGS=${CFLAGS-"-O3"}
LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"ld -b"}
SHAREDLIBS='libz.sl';;
# send working options for other systems to gzip@prep.ai.mit.edu # send working options for other systems to gzip@prep.ai.mit.edu
*) SFLAGS=${CFLAGS-"-O"} *) SFLAGS=${CFLAGS-"-O"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"-shared"};; LDSHARED=${LDSHARED-"cc -shared"};;
esac esac
fi fi
echo Checking for shared library support... echo Checking for shared library support...
# we must test in two steps (cc then ld), required at least on SunOS 4.x # we must test in two steps (cc then ld), required at least on SunOS 4.x
if test "`$CC -c $SFLAGS $test.c 2>&1`" = "" && if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" &&
test "`$LDSHARED -o $test.so $test.o 2>&1`" = ""; then test "`($LDSHARED -o $test.so $test.o) 2>&1`" = ""; then
CFLAGS="$SFLAGS" CFLAGS="$SFLAGS"
LIBS='libz.so.$(VER)' LIBS='libz.so.$(VER)'
echo Building shared library libz.so.$VER with $CC. echo Building shared library libz.so.$VER with $CC.
@@ -65,17 +73,14 @@ fi
rm -f $test.[co] $test.so rm -f $test.[co] $test.so
# udpate Makefile # udpate Makefile
# ed -s Makefile <<EOF
sed < Makefile.in " sed < Makefile.in "
/^CC *=/s/=.*/=$CC/ /^CC *=/s/=.*/=$CC/
/^CFLAGS *=/s/=.*/=$CFLAGS/ /^CFLAGS *=/s/=.*/=$CFLAGS/
/^LDSHARED *=/s/=.*/=$LDSHARED/ /^LDSHARED *=/s/=.*/=$LDSHARED/
/^LIBS *=/s,=.*,=$LIBS, /^LIBS *=/s,=.*,=$LIBS,
/^AR *=/s/=.*/=$AR/ /^AR *=/s/=.*/=$AR/
/^RANLIB *=/s,=.*,=$RANLIB,
/^VER *=/s/=.*/=$VER/ /^VER *=/s/=.*/=$VER/
/^prefix *=/s,=.*,=$prefix, /^prefix *=/s,=.*,=$prefix,
/^exec_prefix *=/s,=.*,=$exec_prefix, /^exec_prefix *=/s,=.*,=$exec_prefix,
" > Makefile " > Makefile
#w
#q
#EOF

View File

@@ -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: crc32.c,v 1.4 1995/04/14 14:55:12 jloup Exp $ */ /* $Id: crc32.c,v 1.8 1996/01/30 21:59:10 me Exp $ */
#include "zlib.h" #include "zlib.h"

172
deflate.c
View File

@@ -1,5 +1,5 @@
/* deflate.c -- compress data using the deflation algorithm /* deflate.c -- compress data using the deflation algorithm
* Copyright (C) 1995-1996 Jean-loup Gailly. * Copyright (C) 1995-1998 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@@ -47,11 +47,10 @@
* *
*/ */
/* $Id: deflate.c,v 1.8 1995/05/03 17:27:08 jloup Exp $ */
#include "deflate.h" #include "deflate.h"
char deflate_copyright[] = " deflate 1.0 Copyright 1995-1996 Jean-loup Gailly "; char deflate_copyright[] = " deflate 1.0.5 Copyright 1995-1998 Jean-loup Gailly ";
/* /*
If you use the zlib library in a product, an acknowledgment is welcome If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot in the documentation of your product. If for some reason you cannot
@@ -62,15 +61,25 @@ char deflate_copyright[] = " deflate 1.0 Copyright 1995-1996 Jean-loup Gailly ";
/* =========================================================================== /* ===========================================================================
* Function prototypes. * Function prototypes.
*/ */
typedef enum {
need_more, /* block not completed, need more input or more output */
block_done, /* block flush performed */
finish_started, /* finish started, need only more output at next deflate */
finish_done /* finish done, accept no more input or output */
} block_state;
typedef block_state (*compress_func) OF((deflate_state *s, int flush));
/* Compression function. Returns the block state after the call. */
local void fill_window OF((deflate_state *s)); local void fill_window OF((deflate_state *s));
local int deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_stored OF((deflate_state *s, int flush));
local int deflate_fast OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush));
local int deflate_slow OF((deflate_state *s, int flush)); local block_state deflate_slow OF((deflate_state *s, int flush));
local void lm_init OF((deflate_state *s)); local void lm_init OF((deflate_state *s));
local int longest_match OF((deflate_state *s, IPos cur_match)); local uInt longest_match OF((deflate_state *s, IPos cur_match));
local void putShortMSB OF((deflate_state *s, uInt b)); local void putShortMSB OF((deflate_state *s, uInt b));
local void flush_pending OF((z_stream *strm)); local void flush_pending OF((z_streamp strm));
local int read_buf OF((z_stream *strm, charf *buf, unsigned size)); local int read_buf OF((z_streamp strm, charf *buf, unsigned size));
#ifdef ASMV #ifdef ASMV
void match_init OF((void)); /* asm code initialization */ void match_init OF((void)); /* asm code initialization */
#endif #endif
@@ -97,9 +106,6 @@ local void check_match OF((deflate_state *s, IPos start, IPos match,
* See deflate.c for comments about the MIN_MATCH+1. * See deflate.c for comments about the MIN_MATCH+1.
*/ */
typedef int (*compress_func) OF((deflate_state *s, int flush));
/* Compressing function */
/* Values for max_lazy_match, good_match and max_chain_length, depending on /* Values for max_lazy_match, good_match and max_chain_length, depending on
* the desired pack level (0..9). The values given below have been tuned to * the desired pack level (0..9). The values given below have been tuned to
* exclude worst case performance for pathological files. Better values may be * exclude worst case performance for pathological files. Better values may be
@@ -157,7 +163,7 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
#define INSERT_STRING(s, str, match_head) \ #define INSERT_STRING(s, str, match_head) \
(UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
s->head[s->ins_h] = (str)) s->head[s->ins_h] = (Pos)(str))
/* =========================================================================== /* ===========================================================================
* Initialize the hash table (avoiding 64K overflow for 16 bit systems). * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
@@ -169,7 +175,7 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
/* ========================================================================= */ /* ========================================================================= */
int deflateInit_(strm, level, version, stream_size) int deflateInit_(strm, level, version, stream_size)
z_stream *strm; z_streamp strm;
int level; int level;
const char *version; const char *version;
int stream_size; int stream_size;
@@ -182,7 +188,7 @@ int deflateInit_(strm, level, version, stream_size)
/* ========================================================================= */ /* ========================================================================= */
int deflateInit2_(strm, level, method, windowBits, memLevel, strategy, int deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
version, stream_size) version, stream_size)
z_stream *strm; z_streamp strm;
int level; int level;
int method; int method;
int windowBits; int windowBits;
@@ -194,6 +200,11 @@ int deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
deflate_state *s; deflate_state *s;
int noheader = 0; int noheader = 0;
ushf *overlay;
/* We overlay pending_buf and d_buf+l_buf. This works since the average
* output size for (length,distance) codes is <= 24 bits.
*/
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
stream_size != sizeof(z_stream)) { stream_size != sizeof(z_stream)) {
return Z_VERSION_ERROR; return Z_VERSION_ERROR;
@@ -239,20 +250,17 @@ int deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 2*sizeof(ush)); overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
s->pending_buf = (uchf *) overlay;
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
s->pending_buf == Z_NULL) { s->pending_buf == Z_NULL) {
strm->msg = ERR_MSG(Z_MEM_ERROR); strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
deflateEnd (strm); deflateEnd (strm);
return Z_MEM_ERROR; return Z_MEM_ERROR;
} }
s->l_buf = (uchf *) &(s->pending_buf[s->lit_bufsize]); s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
s->d_buf = (ushf *) &(s->pending_buf[2*s->lit_bufsize]); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
/* We overlay pending_buf and d_buf+l_buf. This works since the average
* output size for (length,distance) codes is <= 32 bits (worst case
* is 15+15+13=33). d_buf is put last in case sizeof(short)>2.
*/
s->level = level; s->level = level;
s->strategy = strategy; s->strategy = strategy;
@@ -263,14 +271,14 @@ int deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
/* ========================================================================= */ /* ========================================================================= */
int deflateSetDictionary (strm, dictionary, dictLength) int deflateSetDictionary (strm, dictionary, dictLength)
z_stream *strm; z_streamp strm;
const Bytef *dictionary; const Bytef *dictionary;
uInt dictLength; uInt dictLength;
{ {
deflate_state *s; deflate_state *s;
uInt length = dictLength; uInt length = dictLength;
uInt n; uInt n;
IPos hash_head; IPos hash_head = 0;
if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
strm->state->status != INIT_STATE) return Z_STREAM_ERROR; strm->state->status != INIT_STATE) return Z_STREAM_ERROR;
@@ -296,12 +304,13 @@ int deflateSetDictionary (strm, dictionary, dictLength)
for (n = 0; n <= length - MIN_MATCH; n++) { for (n = 0; n <= length - MIN_MATCH; n++) {
INSERT_STRING(s, n, hash_head); INSERT_STRING(s, n, hash_head);
} }
if (hash_head) hash_head = 0; /* to make compiler happy */
return Z_OK; return Z_OK;
} }
/* ========================================================================= */ /* ========================================================================= */
int deflateReset (strm) int deflateReset (strm)
z_stream *strm; z_streamp strm;
{ {
deflate_state *s; deflate_state *s;
@@ -331,12 +340,13 @@ int deflateReset (strm)
/* ========================================================================= */ /* ========================================================================= */
int deflateParams(strm, level, strategy) int deflateParams(strm, level, strategy)
z_stream *strm; z_streamp strm;
int level; int level;
int strategy; int strategy;
{ {
deflate_state *s; deflate_state *s;
compress_func func; compress_func func;
int err = Z_OK;
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
s = strm->state; s = strm->state;
@@ -349,11 +359,9 @@ int deflateParams(strm, level, strategy)
} }
func = configuration_table[s->level].func; func = configuration_table[s->level].func;
if (func != configuration_table[level].func if (func != configuration_table[level].func && strm->total_in != 0) {
&& strm->state->lookahead != 0) {
/* Flush the last buffer: */ /* Flush the last buffer: */
(void)(*func)(strm->state, Z_PARTIAL_FLUSH); err = deflate(strm, Z_PARTIAL_FLUSH);
} }
if (s->level != level) { if (s->level != level) {
s->level = level; s->level = level;
@@ -363,7 +371,7 @@ int deflateParams(strm, level, strategy)
s->max_chain_length = configuration_table[level].max_chain; s->max_chain_length = configuration_table[level].max_chain;
} }
s->strategy = strategy; s->strategy = strategy;
return Z_OK; return err;
} }
/* ========================================================================= /* =========================================================================
@@ -386,7 +394,7 @@ local void putShortMSB (s, b)
* (See also read_buf()). * (See also read_buf()).
*/ */
local void flush_pending(strm) local void flush_pending(strm)
z_stream *strm; z_streamp strm;
{ {
unsigned len = strm->state->pending; unsigned len = strm->state->pending;
@@ -406,14 +414,16 @@ local void flush_pending(strm)
/* ========================================================================= */ /* ========================================================================= */
int deflate (strm, flush) int deflate (strm, flush)
z_stream *strm; z_streamp strm;
int flush; int flush;
{ {
int old_flush; /* value of flush param for previous deflate call */ int old_flush; /* value of flush param for previous deflate call */
deflate_state *s; deflate_state *s;
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm == Z_NULL || strm->state == Z_NULL ||
flush > Z_FINISH || flush < 0) {
return Z_STREAM_ERROR;
}
s = strm->state; s = strm->state;
if (strm->next_out == Z_NULL || if (strm->next_out == Z_NULL ||
@@ -445,14 +455,23 @@ int deflate (strm, flush)
if (s->strstart != 0) { if (s->strstart != 0) {
putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler >> 16));
putShortMSB(s, (uInt)(strm->adler & 0xffff)); putShortMSB(s, (uInt)(strm->adler & 0xffff));
strm->adler = 1L;
} }
strm->adler = 1L;
} }
/* Flush as much pending output as possible */ /* Flush as much pending output as possible */
if (s->pending != 0) { if (s->pending != 0) {
flush_pending(strm); flush_pending(strm);
if (strm->avail_out == 0) return Z_OK; if (strm->avail_out == 0) {
/* Since avail_out is 0, deflate will be called again with
* more output space, but possibly with both pending and
* avail_in equal to zero. There won't be anything to do,
* but this is not an error situation so make sure we
* return OK instead of BUF_ERROR at next call of deflate:
*/
s->last_flush = -1;
return Z_OK;
}
/* Make sure there is something to do and avoid duplicate consecutive /* Make sure there is something to do and avoid duplicate consecutive
* flushes. For repeated and useless calls with Z_FINISH, we keep * flushes. For repeated and useless calls with Z_FINISH, we keep
@@ -472,14 +491,18 @@ int deflate (strm, flush)
*/ */
if (strm->avail_in != 0 || s->lookahead != 0 || if (strm->avail_in != 0 || s->lookahead != 0 ||
(flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
int quit; block_state bstate;
if (flush == Z_FINISH) { bstate = (*(configuration_table[s->level].func))(s, flush);
if (bstate == finish_started || bstate == finish_done) {
s->status = FINISH_STATE; s->status = FINISH_STATE;
} }
quit = (*(configuration_table[s->level].func))(s, flush); if (bstate == need_more || bstate == finish_started) {
if (strm->avail_out == 0) {
if (quit || strm->avail_out == 0) return Z_OK; s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
}
return Z_OK;
/* If flush != Z_NO_FLUSH && avail_out == 0, the next call /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
* of deflate should use the same flush parameter to make sure * of deflate should use the same flush parameter to make sure
* that the flush is complete. So we don't have to output an * that the flush is complete. So we don't have to output an
@@ -487,7 +510,8 @@ int deflate (strm, flush)
* ensures that for a very small output buffer, we emit at most * ensures that for a very small output buffer, we emit at most
* one empty block. * one empty block.
*/ */
if (flush != Z_NO_FLUSH && flush != Z_FINISH) { }
if (bstate == block_done) {
if (flush == Z_PARTIAL_FLUSH) { if (flush == Z_PARTIAL_FLUSH) {
_tr_align(s); _tr_align(s);
} else { /* FULL_FLUSH or SYNC_FLUSH */ } else { /* FULL_FLUSH or SYNC_FLUSH */
@@ -500,7 +524,10 @@ int deflate (strm, flush)
} }
} }
flush_pending(strm); flush_pending(strm);
if (strm->avail_out == 0) return Z_OK; if (strm->avail_out == 0) {
s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
return Z_OK;
}
} }
} }
Assert(strm->avail_out > 0, "bug2"); Assert(strm->avail_out > 0, "bug2");
@@ -521,7 +548,7 @@ int deflate (strm, flush)
/* ========================================================================= */ /* ========================================================================= */
int deflateEnd (strm) int deflateEnd (strm)
z_stream *strm; z_streamp strm;
{ {
int status; int status;
@@ -542,8 +569,8 @@ int deflateEnd (strm)
/* ========================================================================= */ /* ========================================================================= */
int deflateCopy (dest, source) int deflateCopy (dest, source)
z_stream *dest; z_streamp dest;
z_stream *source; z_streamp source;
{ {
if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
return Z_STREAM_ERROR; return Z_STREAM_ERROR;
@@ -568,7 +595,7 @@ int deflateCopy (dest, source)
* (See also flush_pending()). * (See also flush_pending()).
*/ */
local int read_buf(strm, buf, size) local int read_buf(strm, buf, size)
z_stream *strm; z_streamp strm;
charf *buf; charf *buf;
unsigned size; unsigned size;
{ {
@@ -630,7 +657,7 @@ local void lm_init (s)
/* For 80x86 and 680x0, an optimized version will be provided in match.asm or /* For 80x86 and 680x0, an optimized version will be provided in match.asm or
* match.S. The code will be functionally equivalent. * match.S. The code will be functionally equivalent.
*/ */
local int longest_match(s, cur_match) local uInt longest_match(s, cur_match)
deflate_state *s; deflate_state *s;
IPos cur_match; /* current match */ IPos cur_match; /* current match */
{ {
@@ -673,7 +700,7 @@ local int longest_match(s, cur_match)
/* Do not look for matches beyond the end of the input. This is necessary /* Do not look for matches beyond the end of the input. This is necessary
* to make deflate deterministic. * to make deflate deterministic.
*/ */
if (nice_match > s->lookahead) nice_match = s->lookahead; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
@@ -764,7 +791,7 @@ local int longest_match(s, cur_match)
} while ((cur_match = prev[cur_match & wmask]) > limit } while ((cur_match = prev[cur_match & wmask]) > limit
&& --chain_length != 0); && --chain_length != 0);
if (best_len <= s->lookahead) return best_len; if ((uInt)best_len <= s->lookahead) return best_len;
return s->lookahead; return s->lookahead;
} }
#endif /* ASMV */ #endif /* ASMV */
@@ -914,18 +941,18 @@ local void fill_window(s)
/* Same but force premature exit if necessary. */ /* Same but force premature exit if necessary. */
#define FLUSH_BLOCK(s, eof) { \ #define FLUSH_BLOCK(s, eof) { \
FLUSH_BLOCK_ONLY(s, eof); \ FLUSH_BLOCK_ONLY(s, eof); \
if (s->strm->avail_out == 0) return 1; \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
} }
/* =========================================================================== /* ===========================================================================
* Copy without compression as much as possible from the input stream, return * Copy without compression as much as possible from the input stream, return
* true if processing was terminated prematurely (no more input or output * the current block state.
* space). This function does not insert new strings in the dictionary * This function does not insert new strings in the dictionary since
* since uncompressible data is probably not useful. This function is used * uncompressible data is probably not useful. This function is used
* only for the level=0 compression option. * only for the level=0 compression option.
* NOTE: this function should be optimized to avoid extra copying. * NOTE: this function should be optimized to avoid extra copying.
*/ */
local int deflate_stored(s, flush) local block_state deflate_stored(s, flush)
deflate_state *s; deflate_state *s;
int flush; int flush;
{ {
@@ -937,7 +964,7 @@ local int deflate_stored(s, flush)
s->block_start >= (long)s->w_size, "slide too late"); s->block_start >= (long)s->w_size, "slide too late");
fill_window(s); fill_window(s);
if (s->lookahead == 0 && flush == Z_NO_FLUSH) return 1; if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
if (s->lookahead == 0) break; /* flush the current block */ if (s->lookahead == 0) break; /* flush the current block */
} }
@@ -947,7 +974,7 @@ local int deflate_stored(s, flush)
s->lookahead = 0; s->lookahead = 0;
/* Stored blocks are limited to 0xffff bytes: */ /* Stored blocks are limited to 0xffff bytes: */
if (s->strstart == 0 || s->strstart > 0xffff) { if (s->strstart == 0 || s->strstart > 0xfffe) {
/* strstart == 0 is possible when wraparound on 16-bit machine */ /* strstart == 0 is possible when wraparound on 16-bit machine */
s->lookahead = s->strstart - 0xffff; s->lookahead = s->strstart - 0xffff;
s->strstart = 0xffff; s->strstart = 0xffff;
@@ -959,17 +986,17 @@ local int deflate_stored(s, flush)
} }
} }
FLUSH_BLOCK(s, flush == Z_FINISH); FLUSH_BLOCK(s, flush == Z_FINISH);
return 0; /* normal exit */ return flush == Z_FINISH ? finish_done : block_done;
} }
/* =========================================================================== /* ===========================================================================
* Compress as much as possible from the input stream, return true if * Compress as much as possible from the input stream, return the current
* processing was terminated prematurely (no more input or output space). * block state.
* This function does not perform lazy evaluation of matches and inserts * This function does not perform lazy evaluation of matches and inserts
* new strings in the dictionary only for unmatched strings or for short * new strings in the dictionary only for unmatched strings or for short
* matches. It is used only for the fast compression options. * matches. It is used only for the fast compression options.
*/ */
local int deflate_fast(s, flush) local block_state deflate_fast(s, flush)
deflate_state *s; deflate_state *s;
int flush; int flush;
{ {
@@ -984,8 +1011,9 @@ local int deflate_fast(s, flush)
*/ */
if (s->lookahead < MIN_LOOKAHEAD) { if (s->lookahead < MIN_LOOKAHEAD) {
fill_window(s); fill_window(s);
if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) return 1; if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
return need_more;
}
if (s->lookahead == 0) break; /* flush the current block */ if (s->lookahead == 0) break; /* flush the current block */
} }
@@ -1053,7 +1081,7 @@ local int deflate_fast(s, flush)
if (bflush) FLUSH_BLOCK(s, 0); if (bflush) FLUSH_BLOCK(s, 0);
} }
FLUSH_BLOCK(s, flush == Z_FINISH); FLUSH_BLOCK(s, flush == Z_FINISH);
return 0; /* normal exit */ return flush == Z_FINISH ? finish_done : block_done;
} }
/* =========================================================================== /* ===========================================================================
@@ -1061,7 +1089,7 @@ local int deflate_fast(s, flush)
* evaluation for matches: a match is finally adopted only if there is * evaluation for matches: a match is finally adopted only if there is
* no better match at the next window position. * no better match at the next window position.
*/ */
local int deflate_slow(s, flush) local block_state deflate_slow(s, flush)
deflate_state *s; deflate_state *s;
int flush; int flush;
{ {
@@ -1077,8 +1105,9 @@ local int deflate_slow(s, flush)
*/ */
if (s->lookahead < MIN_LOOKAHEAD) { if (s->lookahead < MIN_LOOKAHEAD) {
fill_window(s); fill_window(s);
if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) return 1; if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
return need_more;
}
if (s->lookahead == 0) break; /* flush the current block */ if (s->lookahead == 0) break; /* flush the current block */
} }
@@ -1156,7 +1185,7 @@ local int deflate_slow(s, flush)
} }
s->strstart++; s->strstart++;
s->lookahead--; s->lookahead--;
if (s->strm->avail_out == 0) return 1; if (s->strm->avail_out == 0) return need_more;
} else { } else {
/* There is no previous match to compare with, wait for /* There is no previous match to compare with, wait for
* the next step to decide. * the next step to decide.
@@ -1173,6 +1202,5 @@ local int deflate_slow(s, flush)
s->match_available = 0; s->match_available = 0;
} }
FLUSH_BLOCK(s, flush == Z_FINISH); FLUSH_BLOCK(s, flush == Z_FINISH);
return 0; return flush == Z_FINISH ? finish_done : block_done;
} }

View File

@@ -8,7 +8,7 @@
subject to change. Applications should only use zlib.h. subject to change. Applications should only use zlib.h.
*/ */
/* $Id: deflate.h,v 1.5 1995/05/03 17:27:09 jloup Exp $ */ /* $Id: deflate.h,v 1.10 1996/07/02 12:41:00 me Exp $ */
#ifndef _DEFLATE_H #ifndef _DEFLATE_H
#define _DEFLATE_H #define _DEFLATE_H
@@ -80,7 +80,7 @@ typedef unsigned IPos;
*/ */
typedef struct internal_state { typedef struct internal_state {
z_stream *strm; /* pointer back to this zlib stream */ z_streamp strm; /* pointer back to this zlib stream */
int status; /* as the name implies */ int status; /* as the name implies */
Bytef *pending_buf; /* output still pending */ Bytef *pending_buf; /* output still pending */
Bytef *pending_out; /* next pending byte to output to the stream */ Bytef *pending_out; /* next pending byte to output to the stream */

View File

@@ -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: example.c,v 1.9 1995/05/03 17:27:09 jloup Exp $ */ /* $Id: example.c,v 1.16 1996/05/23 17:11:28 me Exp $ */
#include <stdio.h> #include <stdio.h>
#include "zlib.h" #include "zlib.h"
@@ -30,30 +30,30 @@ const char hello[] = "hello, hello!";
const char dictionary[] = "hello"; const char dictionary[] = "hello";
uLong dictId; /* Adler32 value of the dictionary */ uLong dictId; /* Adler32 value of the dictionary */
void test_compress OF((Bytef *compr, uLong comprLen, void test_compress OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
void test_gzio OF((const char *out, const char *in, void test_gzio OF((const char *out, const char *in,
Bytef *uncompr, int uncomprLen)); Byte *uncompr, int uncomprLen));
void test_deflate OF((Bytef *compr, uLong comprLen)); void test_deflate OF((Byte *compr, uLong comprLen));
void test_inflate OF((Bytef *compr, uLong comprLen, void test_inflate OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
void test_large_deflate OF((Bytef *compr, uLong comprLen, void test_large_deflate OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
void test_large_inflate OF((Bytef *compr, uLong comprLen, void test_large_inflate OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
void test_flush OF((Bytef *compr, uLong comprLen)); void test_flush OF((Byte *compr, uLong comprLen));
void test_sync OF((Bytef *compr, uLong comprLen, void test_sync OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
void test_dict_deflate OF((Bytef *compr, uLong comprLen)); void test_dict_deflate OF((Byte *compr, uLong comprLen));
void test_dict_inflate OF((Bytef *compr, uLong comprLen, void test_dict_inflate OF((Byte *compr, uLong comprLen,
Bytef *uncompr, uLong uncomprLen)); Byte *uncompr, uLong uncomprLen));
int main OF((int argc, char *argv[])); int main OF((int argc, char *argv[]));
/* =========================================================================== /* ===========================================================================
* Test compress() and uncompress() * Test compress() and uncompress()
*/ */
void test_compress(compr, comprLen, uncompr, uncomprLen) void test_compress(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
int err; int err;
@@ -80,7 +80,7 @@ void test_compress(compr, comprLen, uncompr, uncomprLen)
void test_gzio(out, in, uncompr, uncomprLen) void test_gzio(out, in, uncompr, uncomprLen)
const char *out; /* output file */ const char *out; /* output file */
const char *in; /* input file */ const char *in; /* input file */
Bytef *uncompr; Byte *uncompr;
int uncomprLen; int uncomprLen;
{ {
int err; int err;
@@ -121,7 +121,7 @@ void test_gzio(out, in, uncompr, uncomprLen)
* Test deflate() with small buffers * Test deflate() with small buffers
*/ */
void test_deflate(compr, comprLen) void test_deflate(compr, comprLen)
Bytef *compr; Byte *compr;
uLong comprLen; uLong comprLen;
{ {
z_stream c_stream; /* compression stream */ z_stream c_stream; /* compression stream */
@@ -159,7 +159,7 @@ void test_deflate(compr, comprLen)
* Test inflate() with small buffers * Test inflate() with small buffers
*/ */
void test_inflate(compr, comprLen, uncompr, uncomprLen) void test_inflate(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
int err; int err;
@@ -198,7 +198,7 @@ void test_inflate(compr, comprLen, uncompr, uncomprLen)
* Test deflate() with large buffers and dynamic change of compression level * Test deflate() with large buffers and dynamic change of compression level
*/ */
void test_large_deflate(compr, comprLen, uncompr, uncomprLen) void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
z_stream c_stream; /* compression stream */ z_stream c_stream; /* compression stream */
@@ -251,7 +251,7 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
* Test inflate() with large buffers * Test inflate() with large buffers
*/ */
void test_large_inflate(compr, comprLen, uncompr, uncomprLen) void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
int err; int err;
@@ -291,7 +291,7 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
* Test deflate() with full flush * Test deflate() with full flush
*/ */
void test_flush(compr, comprLen) void test_flush(compr, comprLen)
Bytef *compr; Byte *compr;
uLong comprLen; uLong comprLen;
{ {
z_stream c_stream; /* compression stream */ z_stream c_stream; /* compression stream */
@@ -327,7 +327,7 @@ void test_flush(compr, comprLen)
* Test inflateSync() * Test inflateSync()
*/ */
void test_sync(compr, comprLen, uncompr, uncomprLen) void test_sync(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
int err; int err;
@@ -369,7 +369,7 @@ void test_sync(compr, comprLen, uncompr, uncomprLen)
* Test deflate() with preset dictionary * Test deflate() with preset dictionary
*/ */
void test_dict_deflate(compr, comprLen) void test_dict_deflate(compr, comprLen)
Bytef *compr; Byte *compr;
uLong comprLen; uLong comprLen;
{ {
z_stream c_stream; /* compression stream */ z_stream c_stream; /* compression stream */
@@ -405,7 +405,7 @@ void test_dict_deflate(compr, comprLen)
* Test inflate() with a preset dictionary * Test inflate() with a preset dictionary
*/ */
void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen, uncomprLen; uLong comprLen, uncomprLen;
{ {
int err; int err;
@@ -458,20 +458,23 @@ int main(argc, argv)
int argc; int argc;
char *argv[]; char *argv[];
{ {
Bytef *compr, *uncompr; Byte *compr, *uncompr;
uLong comprLen = 32750*sizeof(int); /* don't overflow on MSDOS */ uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
uLong uncomprLen = comprLen; uLong uncomprLen = comprLen;
if (zlib_version[0] != ZLIB_VERSION[0]) { if (zlibVersion()[0] != ZLIB_VERSION[0]) {
fprintf(stderr, "incompatible zlib version\n"); fprintf(stderr, "incompatible zlib version\n");
exit(1); exit(1);
} else if (strcmp(zlib_version, ZLIB_VERSION) != 0) { } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
fprintf(stderr, "warning: different zlib version\n"); fprintf(stderr, "warning: different zlib version\n");
} }
compr = (Bytef*)malloc((uInt)comprLen); compr = (Byte*)calloc((uInt)comprLen, 1);
uncompr = (Bytef*)calloc((uInt)uncomprLen, 1); /* must be cleared */ uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
/* compr and uncompr are cleared to avoid reading uninitialized
* data and to ensure that uncompr compresses well.
*/
if (compr == Z_NULL || uncompr == Z_NULL) { if (compr == Z_NULL || uncompr == Z_NULL) {
printf("out of memory\n"); printf("out of memory\n");
exit(1); exit(1);

28
gzio.c
View File

@@ -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.8 1995/05/03 17:27:09 jloup Exp $ */ /* $Id: gzio.c,v 1.14 1996/07/24 13:41:01 me Exp $ */
#include <stdio.h> #include <stdio.h>
@@ -203,8 +203,8 @@ local int get_byte(s)
local void check_header(s) local void check_header(s)
gz_stream *s; gz_stream *s;
{ {
int method = 0; int method; /* method byte */
int flags = 0; int flags; /* flags byte */
uInt len; uInt len;
int c; int c;
@@ -288,14 +288,15 @@ int gzread (file, buf, len)
unsigned len; unsigned len;
{ {
gz_stream *s = (gz_stream*)file; gz_stream *s = (gz_stream*)file;
Byte *start = buf; /* starting point for crc computation */ Bytef *start = buf; /* starting point for crc computation */
Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
if (s->z_err == Z_STREAM_END) return 0; /* EOF */ if (s->z_err == Z_STREAM_END) return 0; /* EOF */
s->stream.next_out = buf; s->stream.next_out = next_out = buf;
s->stream.avail_out = len; s->stream.avail_out = len;
while (s->stream.avail_out != 0) { while (s->stream.avail_out != 0) {
@@ -306,14 +307,15 @@ int gzread (file, buf, len)
if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > s->stream.avail_out) n = s->stream.avail_out;
if (n > 0) { if (n > 0) {
zmemcpy(s->stream.next_out, s->stream.next_in, n); zmemcpy(s->stream.next_out, s->stream.next_in, n);
s->stream.next_out += n; next_out += n;
s->stream.next_out = next_out;
s->stream.next_in += n; s->stream.next_in += n;
s->stream.avail_out -= n; s->stream.avail_out -= n;
s->stream.avail_in -= n; s->stream.avail_in -= n;
} }
if (s->stream.avail_out > 0) { if (s->stream.avail_out > 0) {
s->stream.avail_out -= fread(s->stream.next_out, s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
1, s->stream.avail_out, s->file); s->file);
} }
return (int)(len - s->stream.avail_out); return (int)(len - s->stream.avail_out);
} }
@@ -494,7 +496,7 @@ int gzclose (file)
errnum is set to Z_ERRNO and the application may consult errno errnum is set to Z_ERRNO and the application may consult errno
to get the exact error code. to get the exact error code.
*/ */
char* gzerror (file, errnum) const char* gzerror (file, errnum)
gzFile file; gzFile file;
int *errnum; int *errnum;
{ {
@@ -503,19 +505,19 @@ char* gzerror (file, errnum)
if (s == NULL) { if (s == NULL) {
*errnum = Z_STREAM_ERROR; *errnum = Z_STREAM_ERROR;
return ERR_MSG(Z_STREAM_ERROR); return (const char*)ERR_MSG(Z_STREAM_ERROR);
} }
*errnum = s->z_err; *errnum = s->z_err;
if (*errnum == Z_OK) return (char*)""; if (*errnum == Z_OK) return (const char*)"";
m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
if (m == NULL || *m == '\0') m = (char*)z_errmsg[1-s->z_err]; if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
TRYFREE(s->msg); TRYFREE(s->msg);
s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
strcpy(s->msg, s->path); strcpy(s->msg, s->path);
strcat(s->msg, ": "); strcat(s->msg, ": ");
strcat(s->msg, m); strcat(s->msg, m);
return s->msg; return (const char*)s->msg;
} }

View File

@@ -1,5 +1,5 @@
/* infblock.c -- interpret and process block types to last block /* infblock.c -- interpret and process block types to last block
* Copyright (C) 1995-1996 Mark Adler * Copyright (C) 1995-1998 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
@@ -12,7 +12,7 @@
struct inflate_codes_state {int dummy;}; /* for buggy compilers */ struct inflate_codes_state {int dummy;}; /* for buggy compilers */
/* Table for deflate from PKZIP's appnote.txt. */ /* Table for deflate from PKZIP's appnote.txt. */
local uInt border[] = { /* Order of the bit length code lengths */ local const uInt border[] = { /* Order of the bit length code lengths */
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
/* /*
@@ -63,7 +63,7 @@ local uInt border[] = { /* Order of the bit length code lengths */
void inflate_blocks_reset(s, z, c) void inflate_blocks_reset(s, z, c)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
uLongf *c; uLongf *c;
{ {
if (s->checkfn != Z_NULL) if (s->checkfn != Z_NULL)
@@ -87,7 +87,7 @@ uLongf *c;
inflate_blocks_statef *inflate_blocks_new(z, c, w) inflate_blocks_statef *inflate_blocks_new(z, c, w)
z_stream *z; z_streamp z;
check_func c; check_func c;
uInt w; uInt w;
{ {
@@ -110,9 +110,12 @@ uInt w;
} }
#ifdef DEBUG
extern uInt inflate_hufts;
#endif
int inflate_blocks(s, z, r) int inflate_blocks(s, z, r)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
int r; int r;
{ {
uInt t; /* temporary storage */ uInt t; /* temporary storage */
@@ -189,7 +192,7 @@ int r;
s->sub.left = (uInt)b & 0xffff; s->sub.left = (uInt)b & 0xffff;
b = k = 0; /* dump bits */ b = k = 0; /* dump bits */
Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
s->mode = s->sub.left ? STORED : TYPE; s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
break; break;
case STORED: case STORED:
if (n == 0) if (n == 0)
@@ -221,8 +224,6 @@ int r;
} }
#endif #endif
t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
if (t < 19)
t = 19;
if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
{ {
r = Z_MEM_ERROR; r = Z_MEM_ERROR;
@@ -246,6 +247,7 @@ int r;
&s->sub.trees.tb, z); &s->sub.trees.tb, z);
if (t != Z_OK) if (t != Z_OK)
{ {
ZFREE(z, s->sub.trees.blens);
r = t; r = t;
if (r == Z_DATA_ERROR) if (r == Z_DATA_ERROR)
s->mode = BAD; s->mode = BAD;
@@ -284,6 +286,8 @@ 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))
{ {
inflate_trees_free(s->sub.trees.tb, z);
ZFREE(z, s->sub.trees.blens);
s->mode = BAD; s->mode = BAD;
z->msg = (char*)"invalid bit length repeat"; z->msg = (char*)"invalid bit length repeat";
r = Z_DATA_ERROR; r = Z_DATA_ERROR;
@@ -306,8 +310,12 @@ int r;
bl = 9; /* must be <= 9 for lookahead assumptions */ bl = 9; /* must be <= 9 for lookahead assumptions */
bd = 6; /* must be <= 9 for lookahead assumptions */ bd = 6; /* must be <= 9 for lookahead assumptions */
t = s->sub.trees.table; t = s->sub.trees.table;
#ifdef DEBUG
inflate_hufts = 0;
#endif
t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
s->sub.trees.blens, &bl, &bd, &tl, &td, z); s->sub.trees.blens, &bl, &bd, &tl, &td, z);
ZFREE(z, s->sub.trees.blens);
if (t != Z_OK) if (t != Z_OK)
{ {
if (t == (uInt)Z_DATA_ERROR) if (t == (uInt)Z_DATA_ERROR)
@@ -315,7 +323,8 @@ int r;
r = t; r = t;
LEAVE LEAVE
} }
Tracev((stderr, "inflate: trees ok\n")); Tracev((stderr, "inflate: trees ok, %d * %d bytes used\n",
inflate_hufts, sizeof(inflate_huft)));
if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
{ {
inflate_trees_free(td, z); inflate_trees_free(td, z);
@@ -323,7 +332,6 @@ int r;
r = Z_MEM_ERROR; r = Z_MEM_ERROR;
LEAVE LEAVE
} }
ZFREE(z, s->sub.trees.blens);
s->sub.decode.codes = c; s->sub.decode.codes = c;
s->sub.decode.tl = tl; s->sub.decode.tl = tl;
s->sub.decode.td = td; s->sub.decode.td = td;
@@ -374,7 +382,7 @@ int r;
int inflate_blocks_free(s, z, c) int inflate_blocks_free(s, z, c)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
uLongf *c; uLongf *c;
{ {
inflate_blocks_reset(s, z, c); inflate_blocks_reset(s, z, c);
@@ -385,9 +393,8 @@ uLongf *c;
} }
void inflate_set_dictionary(s, z, d, n) void inflate_set_dictionary(s, d, n)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z;
const Bytef *d; const Bytef *d;
uInt n; uInt n;
{ {

View File

@@ -12,27 +12,26 @@ struct inflate_blocks_state;
typedef struct inflate_blocks_state FAR inflate_blocks_statef; typedef struct inflate_blocks_state FAR inflate_blocks_statef;
extern inflate_blocks_statef * inflate_blocks_new OF(( extern inflate_blocks_statef * inflate_blocks_new OF((
z_stream *z, z_streamp z,
check_func c, /* check function */ check_func c, /* check function */
uInt w)); /* window size */ uInt w)); /* window size */
extern int inflate_blocks OF(( extern int inflate_blocks OF((
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *, z_streamp ,
int)); /* initial return code */ int)); /* initial return code */
extern void inflate_blocks_reset OF(( extern void inflate_blocks_reset OF((
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *, z_streamp ,
uLongf *)); /* check value on output */ uLongf *)); /* check value on output */
extern int inflate_blocks_free OF(( extern int inflate_blocks_free OF((
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *, z_streamp ,
uLongf *)); /* check value on output */ uLongf *)); /* check value on output */
extern void inflate_set_dictionary OF(( extern void inflate_set_dictionary OF((
inflate_blocks_statef *s, inflate_blocks_statef *s,
z_stream *z,
const Bytef *d, /* dictionary */ const Bytef *d, /* dictionary */
uInt n)); /* dictionary length */ uInt n)); /* dictionary length */

View File

@@ -60,7 +60,7 @@ inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
uInt bl, bd; uInt bl, bd;
inflate_huft *tl; inflate_huft *tl;
inflate_huft *td; /* need separate declaration for Borland C++ */ inflate_huft *td; /* need separate declaration for Borland C++ */
z_stream *z; z_streamp z;
{ {
inflate_codes_statef *c; inflate_codes_statef *c;
@@ -80,7 +80,7 @@ z_stream *z;
int inflate_codes(s, z, r) int inflate_codes(s, z, r)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
int r; int r;
{ {
uInt j; /* temporary storage */ uInt j; /* temporary storage */
@@ -240,7 +240,7 @@ int r;
void inflate_codes_free(c, z) void inflate_codes_free(c, z)
inflate_codes_statef *c; inflate_codes_statef *c;
z_stream *z; z_streamp z;
{ {
ZFREE(z, c); ZFREE(z, c);
Tracev((stderr, "inflate: codes free\n")); Tracev((stderr, "inflate: codes free\n"));

View File

@@ -14,14 +14,14 @@ typedef struct inflate_codes_state FAR inflate_codes_statef;
extern inflate_codes_statef *inflate_codes_new OF(( extern inflate_codes_statef *inflate_codes_new OF((
uInt, uInt, uInt, uInt,
inflate_huft *, inflate_huft *, inflate_huft *, inflate_huft *,
z_stream *)); z_streamp ));
extern int inflate_codes OF(( extern int inflate_codes OF((
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *, z_streamp ,
int)); int));
extern void inflate_codes_free OF(( extern void inflate_codes_free OF((
inflate_codes_statef *, inflate_codes_statef *,
z_stream *)); z_streamp ));

View File

@@ -32,7 +32,7 @@ uInt bl, bd;
inflate_huft *tl; inflate_huft *tl;
inflate_huft *td; /* need separate declaration for Borland C++ */ inflate_huft *td; /* need separate declaration for Borland C++ */
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
{ {
inflate_huft *t; /* temporary pointer */ inflate_huft *t; /* temporary pointer */
uInt e; /* extra bits or operation */ uInt e; /* extra bits or operation */

View File

@@ -14,4 +14,4 @@ extern int inflate_fast OF((
inflate_huft *, inflate_huft *,
inflate_huft *, inflate_huft *,
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *)); z_streamp ));

View File

@@ -49,7 +49,7 @@ struct internal_state {
int inflateReset(z) int inflateReset(z)
z_stream *z; z_streamp z;
{ {
uLong c; uLong c;
@@ -65,7 +65,7 @@ z_stream *z;
int inflateEnd(z) int inflateEnd(z)
z_stream *z; z_streamp z;
{ {
uLong c; uLong c;
@@ -81,7 +81,7 @@ z_stream *z;
int inflateInit2_(z, w, version, stream_size) int inflateInit2_(z, w, version, stream_size)
z_stream *z; z_streamp z;
int w; int w;
const char *version; const char *version;
int stream_size; int stream_size;
@@ -138,7 +138,7 @@ int stream_size;
int inflateInit_(z, version, stream_size) int inflateInit_(z, version, stream_size)
z_stream *z; z_streamp z;
const char *version; const char *version;
int stream_size; int stream_size;
{ {
@@ -150,13 +150,13 @@ int stream_size;
#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
int inflate(z, f) int inflate(z, f)
z_stream *z; z_streamp z;
int f; int f;
{ {
int r = f; /* to avoid warning about unused f */ int r;
uInt b; uInt b;
if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL || f < 0)
return Z_STREAM_ERROR; return Z_STREAM_ERROR;
r = Z_BUF_ERROR; r = Z_BUF_ERROR;
while (1) switch (z->state->mode) while (1) switch (z->state->mode)
@@ -272,7 +272,7 @@ int f;
int inflateSetDictionary(z, dictionary, dictLength) int inflateSetDictionary(z, dictionary, dictLength)
z_stream *z; z_streamp z;
const Bytef *dictionary; const Bytef *dictionary;
uInt dictLength; uInt dictLength;
{ {
@@ -280,22 +280,23 @@ uInt dictLength;
if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
return Z_STREAM_ERROR; return Z_STREAM_ERROR;
if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
z->adler = 1L; z->adler = 1L;
if (length >= (1<<z->state->wbits)) if (length >= ((uInt)1<<z->state->wbits))
{ {
length = (1<<z->state->wbits)-1; length = (1<<z->state->wbits)-1;
dictionary += dictLength - length; dictionary += dictLength - length;
} }
inflate_set_dictionary(z->state->blocks, z, dictionary, length); inflate_set_dictionary(z->state->blocks, dictionary, length);
z->state->mode = BLOCKS; z->state->mode = BLOCKS;
return Z_OK; return Z_OK;
} }
int inflateSync(z) int inflateSync(z)
z_stream *z; z_streamp z;
{ {
uInt n; /* number of bytes to look at */ uInt n; /* number of bytes to look at */
Bytef *p; /* pointer to bytes */ Bytef *p; /* pointer to bytes */

View File

@@ -1,12 +1,12 @@
/* inftrees.c -- generate Huffman trees for efficient decoding /* inftrees.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-1996 Mark Adler * Copyright (C) 1995-1998 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h * For conditions of distribution and use, see copyright notice in zlib.h
*/ */
#include "zutil.h" #include "zutil.h"
#include "inftrees.h" #include "inftrees.h"
char inflate_copyright[] = " inflate 1.0 Copyright 1995-1996 Mark Adler "; char inflate_copyright[] = " inflate 1.0.5 Copyright 1995-1998 Mark Adler ";
/* /*
If you use the zlib library in a product, an acknowledgment is welcome If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot in the documentation of your product. If for some reason you cannot
@@ -26,11 +26,11 @@ local int huft_build OF((
uIntf *, /* code lengths in bits */ uIntf *, /* code lengths in bits */
uInt, /* number of codes */ uInt, /* number of codes */
uInt, /* number of "simple" codes */ uInt, /* number of "simple" codes */
uIntf *, /* list of base values for non-simple codes */ const uIntf *, /* list of base values for non-simple codes */
uIntf *, /* list of extra bits for non-simple codes */ const uIntf *, /* list of extra bits for non-simple codes */
inflate_huft * FAR*,/* result: starting table */ inflate_huft * FAR*,/* result: starting table */
uIntf *, /* maximum lookup bits (returns actual) */ uIntf *, /* maximum lookup bits (returns actual) */
z_stream *)); /* for zalloc function */ z_streamp )); /* for zalloc function */
local voidpf falloc OF(( local voidpf falloc OF((
voidpf, /* opaque pointer (not used) */ voidpf, /* opaque pointer (not used) */
@@ -38,18 +38,18 @@ local voidpf falloc OF((
uInt)); /* size of item */ uInt)); /* size of item */
/* Tables for deflate from PKZIP's appnote.txt. */ /* Tables for deflate from PKZIP's appnote.txt. */
local uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
/* actually lengths - 2; also see note #13 above about 258 */ /* see note #13 above about 258 */
local uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
local uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
8193, 12289, 16385, 24577}; 8193, 12289, 16385, 24577};
local uInt cpdext[30] = { /* Extra bits for distance codes */ local const uInt cpdext[30] = { /* Extra bits for distance codes */
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
12, 12, 13, 13}; 12, 12, 13, 13};
@@ -99,16 +99,16 @@ local int huft_build(b, n, s, d, e, t, m, zs)
uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ uIntf *b; /* code lengths in bits (all assumed <= BMAX) */
uInt n; /* number of codes (assumed <= N_MAX) */ uInt n; /* number of codes (assumed <= N_MAX) */
uInt s; /* number of simple-valued codes (0..s-1) */ uInt s; /* number of simple-valued codes (0..s-1) */
uIntf *d; /* list of base values for non-simple codes */ const uIntf *d; /* list of base values for non-simple codes */
uIntf *e; /* list of extra bits for non-simple codes */ const uIntf *e; /* list of extra bits for non-simple codes */
inflate_huft * FAR *t; /* result: starting table */ inflate_huft * FAR *t; /* result: starting table */
uIntf *m; /* maximum lookup bits, returns actual */ uIntf *m; /* maximum lookup bits, returns actual */
z_stream *zs; /* for zalloc function */ z_streamp zs; /* for zalloc function */
/* Given a list of code lengths and a maximum table size, make a set of /* Given a list of code lengths and a maximum table size, make a set of
tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
if the given code set is incomplete (the tables are still built in this if the given code set is incomplete (the tables are still built in this
case), Z_DATA_ERROR if the input is invalid (all zero length codes or an case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
over-subscribed set of lengths), or Z_MEM_ERROR if not enough memory. */ lengths), or Z_MEM_ERROR if not enough memory. */
{ {
uInt a; /* counter for codes of length k */ uInt a; /* counter for codes of length k */
@@ -190,6 +190,7 @@ z_stream *zs; /* for zalloc function */
if ((j = *p++) != 0) if ((j = *p++) != 0)
v[x[j]++] = i; v[x[j]++] = i;
} while (++i < n); } while (++i < n);
n = x[g]; /* set n to length of v */
/* Generate the Huffman codes and for each, make the table entries */ /* Generate the Huffman codes and for each, make the table entries */
@@ -215,7 +216,8 @@ z_stream *zs; /* for zalloc function */
w += l; /* previous table always l bits */ w += l; /* previous table always l bits */
/* compute minimum size table less than or equal to l bits */ /* compute minimum size table less than or equal to l bits */
z = (z = g - w) > (uInt)l ? l : z; /* table size upper limit */ z = g - w;
z = z > (uInt)l ? l : z; /* table size upper limit */
if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
{ /* too few codes for k-w bit table */ { /* too few codes for k-w bit table */
f -= a + 1; /* deduct codes from patterns left */ f -= a + 1; /* deduct codes from patterns left */
@@ -268,7 +270,7 @@ z_stream *zs; /* for zalloc function */
} }
else else
{ {
r.exop = (Byte)e[*p - s] + 16 + 64; /* non-simple--look up in lists */ r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
r.base = d[*p++ - s]; r.base = d[*p++ - s];
} }
@@ -301,14 +303,14 @@ int inflate_trees_bits(c, bb, tb, z)
uIntf *c; /* 19 code lengths */ uIntf *c; /* 19 code lengths */
uIntf *bb; /* bits tree desired/actual depth */ uIntf *bb; /* bits tree desired/actual depth */
inflate_huft * FAR *tb; /* bits tree result */ inflate_huft * FAR *tb; /* bits tree result */
z_stream *z; /* for zfree function */ z_streamp z; /* for zfree function */
{ {
int r; int r;
r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z);
if (r == Z_DATA_ERROR) if (r == Z_DATA_ERROR)
z->msg = (char*)"oversubscribed dynamic bit lengths tree"; z->msg = (char*)"oversubscribed dynamic bit lengths tree";
else if (r == Z_BUF_ERROR) else if (r == Z_BUF_ERROR || *bb == 0)
{ {
inflate_trees_free(*tb, z); inflate_trees_free(*tb, z);
z->msg = (char*)"incomplete dynamic bit lengths tree"; z->msg = (char*)"incomplete dynamic bit lengths tree";
@@ -326,16 +328,17 @@ uIntf *bl; /* literal desired/actual bit depth */
uIntf *bd; /* distance desired/actual bit depth */ uIntf *bd; /* distance desired/actual bit depth */
inflate_huft * FAR *tl; /* literal/length tree result */ inflate_huft * FAR *tl; /* literal/length tree result */
inflate_huft * FAR *td; /* distance tree result */ inflate_huft * FAR *td; /* distance tree result */
z_stream *z; /* for zfree function */ z_streamp z; /* for zfree function */
{ {
int r; int r;
/* build literal/length tree */ /* build literal/length tree */
if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK) r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z);
if (r != Z_OK || *bl == 0)
{ {
if (r == Z_DATA_ERROR) if (r == Z_DATA_ERROR)
z->msg = (char*)"oversubscribed literal/length tree"; z->msg = (char*)"oversubscribed literal/length tree";
else if (r == Z_BUF_ERROR) else if (r != Z_MEM_ERROR)
{ {
inflate_trees_free(*tl, z); inflate_trees_free(*tl, z);
z->msg = (char*)"incomplete literal/length tree"; z->msg = (char*)"incomplete literal/length tree";
@@ -345,17 +348,23 @@ z_stream *z; /* for zfree function */
} }
/* build distance tree */ /* build distance tree */
if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK) r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z);
if (r != Z_OK || (*bd == 0 && nl > 257))
{ {
if (r == Z_DATA_ERROR) if (r == Z_DATA_ERROR)
z->msg = (char*)"oversubscribed literal/length tree"; z->msg = (char*)"oversubscribed distance tree";
else if (r == Z_BUF_ERROR) { else if (r == Z_BUF_ERROR) {
#ifdef PKZIP_BUG_WORKAROUND #ifdef PKZIP_BUG_WORKAROUND
r = Z_OK; r = Z_OK;
} }
#else #else
inflate_trees_free(*td, z); inflate_trees_free(*td, z);
z->msg = (char*)"incomplete literal/length tree"; z->msg = (char*)"incomplete distance tree";
r = Z_DATA_ERROR;
}
else if (r != Z_MEM_ERROR)
{
z->msg = (char*)"empty distance tree with lengths";
r = Z_DATA_ERROR; r = Z_DATA_ERROR;
} }
inflate_trees_free(*tl, z); inflate_trees_free(*tl, z);
@@ -441,7 +450,7 @@ inflate_huft * FAR *td; /* distance tree result */
int inflate_trees_free(t, z) int inflate_trees_free(t, z)
inflate_huft *t; /* table to free */ inflate_huft *t; /* table to free */
z_stream *z; /* for zfree function */ z_streamp z; /* for zfree function */
/* Free the malloc'ed tables built by huft_build(), which makes a linked /* Free the malloc'ed tables built by huft_build(), which makes a linked
list of the tables it made, with the links in a dummy first entry of list of the tables it made, with the links in a dummy first entry of
each table. */ each table. */

View File

@@ -35,7 +35,7 @@ extern int inflate_trees_bits OF((
uIntf *, /* 19 code lengths */ uIntf *, /* 19 code lengths */
uIntf *, /* bits tree desired/actual depth */ uIntf *, /* bits tree desired/actual depth */
inflate_huft * FAR *, /* bits tree result */ inflate_huft * FAR *, /* bits tree result */
z_stream *)); /* for zalloc, zfree functions */ z_streamp )); /* for zalloc, zfree functions */
extern int inflate_trees_dynamic OF(( extern int inflate_trees_dynamic OF((
uInt, /* number of literal/length codes */ uInt, /* number of literal/length codes */
@@ -45,7 +45,7 @@ extern int inflate_trees_dynamic OF((
uIntf *, /* distance desired/actual bit depth */ uIntf *, /* distance desired/actual bit depth */
inflate_huft * FAR *, /* literal/length tree result */ inflate_huft * FAR *, /* literal/length tree result */
inflate_huft * FAR *, /* distance tree result */ inflate_huft * FAR *, /* distance tree result */
z_stream *)); /* for zalloc, zfree functions */ z_streamp )); /* for zalloc, zfree functions */
extern int inflate_trees_fixed OF(( extern int inflate_trees_fixed OF((
uIntf *, /* literal desired/actual bit depth */ uIntf *, /* literal desired/actual bit depth */
@@ -55,5 +55,5 @@ extern int inflate_trees_fixed OF((
extern int inflate_trees_free OF(( extern int inflate_trees_free OF((
inflate_huft *, /* tables to free */ inflate_huft *, /* tables to free */
z_stream *)); /* for zfree function */ z_streamp )); /* for zfree function */

View File

@@ -22,11 +22,12 @@ uInt inflate_mask[17] = {
/* copy as much as possible from the sliding window to the output area */ /* copy as much as possible from the sliding window to the output area */
int inflate_flush(s, z, r) int inflate_flush(s, z, r)
inflate_blocks_statef *s; inflate_blocks_statef *s;
z_stream *z; z_streamp z;
int r; int r;
{ {
uInt n; uInt n;
Bytef *p, *q; Bytef *p;
Bytef *q;
/* local copies of source and destination pointers */ /* local copies of source and destination pointers */
p = z->next_out; p = z->next_out;

View File

@@ -41,7 +41,8 @@ struct inflate_blocks_state {
inflate_huft *tb; /* bit length decoding tree */ inflate_huft *tb; /* bit length decoding tree */
} trees; /* if DTREE, decoding info for trees */ } trees; /* if DTREE, decoding info for trees */
struct { struct {
inflate_huft *tl, *td; /* trees to free */ inflate_huft *tl;
inflate_huft *td; /* trees to free */
inflate_codes_statef inflate_codes_statef
*codes; *codes;
} decode; /* if CODES, current state */ } decode; /* if CODES, current state */
@@ -90,7 +91,7 @@ extern uInt inflate_mask[17];
/* copy as much as possible from the sliding window to the output area */ /* copy as much as possible from the sliding window to the output area */
extern int inflate_flush OF(( extern int inflate_flush OF((
inflate_blocks_statef *, inflate_blocks_statef *,
z_stream *, z_streamp ,
int)); int));
struct internal_state {int dummy;}; /* for buggy compilers */ struct internal_state {int dummy;}; /* for buggy compilers */

View File

@@ -13,7 +13,7 @@
* or in pipe mode. * or in pipe mode.
*/ */
/* $Id: minigzip.c,v 1.5 1995/05/03 17:27:11 jloup Exp $ */ /* $Id: minigzip.c,v 1.10 1996/07/24 13:41:04 me Exp $ */
#include <stdio.h> #include <stdio.h>
#include "zlib.h" #include "zlib.h"
@@ -24,7 +24,7 @@
#else #else
extern void exit OF((int)); extern void exit OF((int));
#endif #endif
extern int unlink OF((const char *));
#if defined(MSDOS) || defined(OS2) || defined(WIN32) #if defined(MSDOS) || defined(OS2) || defined(WIN32)
# include <fcntl.h> # include <fcntl.h>
@@ -35,12 +35,22 @@ extern int unlink OF((const char *));
#endif #endif
#ifdef VMS #ifdef VMS
# define unlink delete
# define GZ_SUFFIX "-gz" # define GZ_SUFFIX "-gz"
#else #endif
#ifdef RISCOS
# define unlink remove
# define GZ_SUFFIX "-gz"
# define fileno(file) file->__file
#endif
#ifndef GZ_SUFFIX
# define GZ_SUFFIX ".gz" # define GZ_SUFFIX ".gz"
#endif #endif
#define SUFFIX_LEN sizeof(GZ_SUFFIX) #define SUFFIX_LEN sizeof(GZ_SUFFIX)
extern int unlink OF((const char *));
#define BUFLEN 4096 #define BUFLEN 4096
#define MAX_NAME_LEN 1024 #define MAX_NAME_LEN 1024

View File

@@ -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.5 1995/05/03 17:27:12 jloup Exp $ */ /* $Id: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */
#include "deflate.h" #include "deflate.h"
@@ -154,7 +154,7 @@ local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
#else /* DEBUG */ #else /* DEBUG */
# define send_code(s, c, tree) \ # define send_code(s, c, tree) \
{ if (verbose>1) fprintf(stderr,"\ncd %3d ",(c)); \ { if (verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
send_bits(s, tree[c].Code, tree[c].Len); } send_bits(s, tree[c].Code, tree[c].Len); }
#endif #endif
@@ -232,7 +232,7 @@ local void send_bits(s, value, length)
*/ */
local void tr_static_init() local void tr_static_init()
{ {
static static_init_done = 0; static int static_init_done = 0;
int n; /* iterates over tree elements */ int n; /* iterates over tree elements */
int bits; /* bit counter */ int bits; /* bit counter */
int length; /* length value */ int length; /* length value */

View File

@@ -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: uncompr.c,v 1.5 1995/05/03 17:27:12 jloup Exp $ */ /* $Id: uncompr.c,v 1.8 1996/01/30 21:59:26 me Exp $ */
#include "zlib.h" #include "zlib.h"

46
zconf.h
View File

@@ -3,14 +3,14 @@
* 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.12 1995/05/03 17:27:12 jloup Exp $ */ /* $Id: zconf.h,v 1.20 1996/07/02 15:09:28 me Exp $ */
#ifndef _ZCONF_H #ifndef _ZCONF_H
#define _ZCONF_H #define _ZCONF_H
/* /*
* People prefering a unique prefix for all types and library functions * If you *really* need a unique prefix for all types and library functions,
* should compile with -DZ_PREFIX * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
*/ */
#ifdef Z_PREFIX #ifdef Z_PREFIX
# define deflateInit_ z_deflateInit_ # define deflateInit_ z_deflateInit_
@@ -20,10 +20,12 @@
# define inflate z_inflate # define inflate z_inflate
# define inflateEnd z_inflateEnd # define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_ # define deflateInit2_ z_deflateInit2_
# define deflateSetDictionary z_deflateSetDictionary
# define deflateCopy z_deflateCopy # define deflateCopy z_deflateCopy
# define deflateReset z_deflateReset # define deflateReset z_deflateReset
# define deflateParams z_deflateParams # define deflateParams z_deflateParams
# define inflateInit2_ z_inflateInit2_ # define inflateInit2_ z_inflateInit2_
# define inflateSetDictionary z_inflateSetDictionary
# define inflateSync z_inflateSync # define inflateSync z_inflateSync
# define inflateReset z_inflateReset # define inflateReset z_inflateReset
# define compress z_compress # define compress z_compress
@@ -47,9 +49,11 @@
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
# define WIN32 # define WIN32
#endif #endif
#if (defined(__GNUC__) || defined(WIN32)) && !defined(__32BIT__) #if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
# ifndef __32BIT__
# define __32BIT__ # define __32BIT__
# endif # endif
#endif
#if defined(__MSDOS__) && !defined(MSDOS) #if defined(__MSDOS__) && !defined(MSDOS)
# define MSDOS # define MSDOS
#endif #endif
@@ -72,13 +76,15 @@
# define STDC # define STDC
#endif #endif
#if !defined(STDC) && !defined(const) #ifndef STDC
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
# define const # define const
# endif # endif
#endif
#ifdef __MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */ /* Some Mac compilers merge all .h files incorrectly: */
# include <unix.h> #if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
# define Byte _Byte /* Byte already used on Mac */ # define NO_DUMMY_DECL
#endif #endif
/* Maximum value for memLevel in deflateInit2 */ /* Maximum value for memLevel in deflateInit2 */
@@ -124,7 +130,8 @@
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
* just define FAR to be empty. * just define FAR to be empty.
*/ */
#if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ #if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
/* MSC small or medium model */
# define SMALL_MEDIUM # define SMALL_MEDIUM
# ifdef _MSC_VER # ifdef _MSC_VER
# define FAR __far # define FAR __far
@@ -133,23 +140,25 @@
# endif # endif
#endif #endif
#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
# ifndef __32BIT__
# define SMALL_MEDIUM # define SMALL_MEDIUM
# define FAR __far # define FAR __far
# endif # endif
#endif
#ifndef FAR #ifndef FAR
# define FAR # define FAR
#endif #endif
/* The Watcom compiler defines M_I86SM and __SMALL__ even in 32 bit mode */
#if defined(__WATCOMC__) && defined(__386__)
# undef FAR
# undef SMALL_MEDIUM
#endif
typedef unsigned char Byte; /* 8 bits */ typedef unsigned char Byte; /* 8 bits */
typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned int uInt; /* 16 bits or more */
typedef unsigned long uLong; /* 32 bits or more */ typedef unsigned long uLong; /* 32 bits or more */
#if defined(__BORLANDC__) && defined(SMALL_MEDIUM)
/* Borland C/C++ ignores FAR inside typedef */
# define Bytef Byte FAR
#else
typedef Byte FAR Bytef; typedef Byte FAR Bytef;
#endif
typedef char FAR charf; typedef char FAR charf;
typedef int FAR intf; typedef int FAR intf;
typedef uInt FAR uIntf; typedef uInt FAR uIntf;
@@ -163,4 +172,13 @@ typedef uLong FAR uLongf;
typedef Byte *voidp; typedef Byte *voidp;
#endif #endif
/* Compile with -DZLIB_DLL for Windows DLL support */
#if (defined(_WINDOWS) || defined(WINDOWS)) && defined(ZLIB_DLL)
# include <windows.h>
# define EXPORT WINAPI
#else
# define EXPORT
#endif
#endif /* _ZCONF_H */ #endif /* _ZCONF_H */

46
zlib.def Normal file
View File

@@ -0,0 +1,46 @@
LIBRARY "zlib"
DESCRIPTION '"""zlib data compression library"""'
EXETYPE NT
SUBSYSTEM WINDOWS
STUB 'WINSTUB.EXE'
VERSION 1.05
CODE EXECUTE READ
DATA READ WRITE
HEAPSIZE 1048576,4096
EXPORTS
zlibVersion
deflate
deflateEnd
inflate
inflateEnd
deflateSetDictionary
deflateCopy
deflateReset
deflateParams
inflateSetDictionary
inflateSync
inflateReset
compress
uncompress
gzopen
gzdopen
gzread
gzwrite
gzflush
gzclose
gzerror
adler32
crc32
deflateInit_
inflateInit_
deflateInit2_
inflateInit2_

117
zlib.h
View File

@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library /* zlib.h -- interface of the 'zlib' general purpose compression library
version 1.0, Jan 27th, 1996. version 1.0.5, Jan 3rd, 1998.
Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages warranty. In no event will the authors be held liable for any damages
@@ -21,6 +21,11 @@
Jean-loup Gailly Mark Adler Jean-loup Gailly Mark Adler
gzip@prep.ai.mit.edu madler@alumni.caltech.edu gzip@prep.ai.mit.edu madler@alumni.caltech.edu
The data format used by the zlib library is described by RFCs (Request for
Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
(zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
*/ */
#ifndef _ZLIB_H #ifndef _ZLIB_H
@@ -32,7 +37,7 @@ extern "C" {
#include "zconf.h" #include "zconf.h"
#define ZLIB_VERSION "1.0" #define ZLIB_VERSION "1.0.5"
/* /*
The 'zlib' compression library provides in-memory compression and The 'zlib' compression library provides in-memory compression and
@@ -84,6 +89,8 @@ typedef struct z_stream_s {
uLong reserved; /* reserved for future use */ uLong reserved; /* reserved for future use */
} z_stream; } z_stream;
typedef z_stream FAR *z_streamp;
/* /*
The application must update next_in and avail_in when avail_in has The application must update next_in and avail_in when avail_in has
dropped to zero. It must update next_out and avail_out when avail_out dropped to zero. It must update next_out and avail_out when avail_out
@@ -156,16 +163,20 @@ typedef struct z_stream_s {
#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
extern const char *zlib_version; #define zlib_version zlibVersion()
/* The application can compare zlib_version and ZLIB_VERSION for consistency. /* for compatibility with versions < 1.0.2 */
If the first character differs, the library code actually used is
not compatible with the zlib.h header file used by the application.
*/
/* basic functions */ /* basic functions */
extern const char * EXPORT zlibVersion OF((void));
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
If the first character differs, the library code actually used is
not compatible with the zlib.h header file used by the application.
This check is automatically made by deflateInit and inflateInit.
*/
/* /*
extern int deflateInit OF((z_stream *strm, int level)); extern int EXPORT deflateInit OF((z_streamp strm, int level));
Initializes the internal stream state for compression. The fields Initializes the internal stream state for compression. The fields
zalloc, zfree and opaque must be initialized before by the caller. zalloc, zfree and opaque must be initialized before by the caller.
@@ -187,7 +198,7 @@ extern int deflateInit OF((z_stream *strm, int level));
*/ */
extern int deflate OF((z_stream *strm, int flush)); extern int EXPORT deflate OF((z_streamp strm, int flush));
/* /*
Performs one or both of the following actions: Performs one or both of the following actions:
@@ -207,7 +218,9 @@ extern int deflate OF((z_stream *strm, int flush));
more output, and updating avail_in or avail_out accordingly; avail_out more output, and updating avail_in or avail_out accordingly; avail_out
should never be zero before the call. The application can consume the 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 compressed output when it wants, for example when the output buffer is full
(avail_out == 0), or after each call of deflate(). (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
and with zero avail_out, it must be called again after making room in the
output buffer because there might be more output pending.
If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression If the parameter flush is set to Z_PARTIAL_FLUSH, the current compression
block is terminated and flushed to the output buffer so that the block is terminated and flushed to the output buffer so that the
@@ -228,8 +241,8 @@ extern int deflate OF((z_stream *strm, int flush));
parameter and more output space (updated avail_out), until the flush is parameter and more output space (updated avail_out), until the flush is
complete (deflate returns with non-zero avail_out). complete (deflate returns with non-zero avail_out).
If the parameter flush is set to Z_FINISH, all pending input is processed, If the parameter flush is set to Z_FINISH, pending input is processed,
all pending output is flushed and deflate returns with Z_STREAM_END if there 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 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 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 more input data, until it returns with Z_STREAM_END or an error. After
@@ -254,7 +267,7 @@ extern int deflate OF((z_stream *strm, int flush));
*/ */
extern int deflateEnd OF((z_stream *strm)); extern int EXPORT deflateEnd OF((z_streamp strm));
/* /*
All dynamically allocated data structures for this stream are freed. All dynamically allocated data structures for this stream are freed.
This function discards any unprocessed input and does not flush any This function discards any unprocessed input and does not flush any
@@ -269,7 +282,7 @@ extern int deflateEnd OF((z_stream *strm));
/* /*
extern int inflateInit OF((z_stream *strm)); extern int EXPORT inflateInit OF((z_streamp strm));
Initializes the internal stream state for decompression. The fields Initializes the internal stream state for decompression. The fields
zalloc, zfree and opaque must be initialized before by the caller. If zalloc, zfree and opaque must be initialized before by the caller. If
@@ -284,7 +297,7 @@ extern int inflateInit OF((z_stream *strm));
*/ */
extern int inflate OF((z_stream *strm, int flush)); extern int EXPORT inflate OF((z_streamp strm, int flush));
/* /*
Performs one or both of the following actions: Performs one or both of the following actions:
@@ -294,15 +307,18 @@ extern int inflate OF((z_stream *strm, int flush));
will resume at this point for the next call of inflate(). will resume at this point for the next call of inflate().
- Provide more output starting at next_out and update next_out and avail_out - Provide more output starting at next_out and update next_out and avail_out
accordingly. inflate() always provides as much output as possible accordingly. inflate() provides as much output as possible, until there
(until there is no more input data or no more space in the output buffer). is no more input data or no more space in the output buffer (see below
about the flush parameter).
Before the call of inflate(), the application should ensure that at least 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 one of the actions is possible, by providing more input and/or consuming
more output, and updating the next_* and avail_* values accordingly. more output, and updating the next_* and avail_* values accordingly.
The application can consume the uncompressed output when it wants, for The application can consume the uncompressed output when it wants, for
example when the output buffer is full (avail_out == 0), or after each example when the output buffer is full (avail_out == 0), or after each
call of inflate(). call of inflate(). If inflate returns Z_OK and with zero avail_out, it
must be called again after making room in the output buffer because there
might be more output pending.
If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much 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 output as possible to the output buffer. The flushing behavior of inflate is
@@ -336,7 +352,7 @@ extern int inflate OF((z_stream *strm, int flush));
*/ */
extern int inflateEnd OF((z_stream *strm)); extern int EXPORT inflateEnd OF((z_streamp strm));
/* /*
All dynamically allocated data structures for this stream are freed. All dynamically allocated data structures for this stream are freed.
This function discards any unprocessed input and does not flush any This function discards any unprocessed input and does not flush any
@@ -354,7 +370,7 @@ extern int inflateEnd OF((z_stream *strm));
*/ */
/* /*
extern int deflateInit2 OF((z_stream *strm, extern int EXPORT deflateInit2 OF((z_streamp strm,
int level, int level,
int method, int method,
int windowBits, int windowBits,
@@ -412,7 +428,7 @@ extern int deflateInit2 OF((z_stream *strm,
deflate(). deflate().
*/ */
extern int deflateSetDictionary OF((z_stream *strm, extern int EXPORT deflateSetDictionary OF((z_streamp strm,
const Bytef *dictionary, const Bytef *dictionary,
uInt dictLength)); uInt dictLength));
/* /*
@@ -441,8 +457,8 @@ extern int deflateSetDictionary OF((z_stream *strm,
be done by deflate(). be done by deflate().
*/ */
extern int deflateCopy OF((z_stream *dest, extern int EXPORT deflateCopy OF((z_streamp dest,
z_stream *source)); z_streamp source));
/* /*
Sets the destination stream as a complete copy of the source stream. If Sets the destination stream as a complete copy of the source stream. If
the source stream is using an application-supplied history buffer, a new the source stream is using an application-supplied history buffer, a new
@@ -464,7 +480,7 @@ extern int deflateCopy OF((z_stream *dest,
destination. destination.
*/ */
extern int deflateReset OF((z_stream *strm)); extern int EXPORT deflateReset OF((z_streamp strm));
/* /*
This function is equivalent to deflateEnd followed by deflateInit, This function is equivalent to deflateEnd followed by deflateInit,
but does not free and reallocate all the internal compression state. but does not free and reallocate all the internal compression state.
@@ -475,7 +491,7 @@ extern int deflateReset OF((z_stream *strm));
stream state was inconsistent (such as zalloc or state being NULL). stream state was inconsistent (such as zalloc or state being NULL).
*/ */
extern int deflateParams OF((z_stream *strm, int level, int strategy)); extern int EXPORT deflateParams OF((z_streamp strm, int level, int strategy));
/* /*
Dynamically update the compression level and compression strategy. Dynamically update the compression level and compression strategy.
This can be used to switch between compression and straight copy of This can be used to switch between compression and straight copy of
@@ -484,12 +500,17 @@ extern int deflateParams OF((z_stream *strm, int level, int strategy));
available so far is compressed with the old level (and may be flushed); available so far is compressed with the old level (and may be flushed);
the new level will take effect only at the next call of deflate(). the new level will take effect only at the next call of deflate().
Before the call of deflateParams, the stream state must be set as for
a call of deflate(), since the currently available input may have to
be compressed and flushed. In particular, strm->avail_out must be non-zero.
deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
stream state was inconsistent or if a parameter was invalid. stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
if strm->avail_out was zero.
*/ */
/* /*
extern int inflateInit2 OF((z_stream *strm, extern int EXPORT inflateInit2 OF((z_streamp strm,
int windowBits)); int windowBits));
This is another version of inflateInit with more compression options. The This is another version of inflateInit with more compression options. The
@@ -523,7 +544,7 @@ extern int inflateInit2 OF((z_stream *strm,
inflate(). inflate().
*/ */
extern int inflateSetDictionary OF((z_stream *strm, extern int EXPORT inflateSetDictionary OF((z_streamp strm,
const Bytef *dictionary, const Bytef *dictionary,
uInt dictLength)); uInt dictLength));
/* /*
@@ -542,7 +563,7 @@ extern int inflateSetDictionary OF((z_stream *strm,
inflate(). inflate().
*/ */
extern int inflateSync OF((z_stream *strm)); extern int EXPORT inflateSync OF((z_streamp strm));
/* /*
Skips invalid compressed data until the special marker (see deflate() Skips invalid compressed data until the special marker (see deflate()
above) can be found, or until all available input is skipped. No output above) can be found, or until all available input is skipped. No output
@@ -557,7 +578,7 @@ extern int inflateSync OF((z_stream *strm));
until success or end of the input data. until success or end of the input data.
*/ */
extern int inflateReset OF((z_stream *strm)); extern int EXPORT inflateReset OF((z_streamp strm));
/* /*
This function is equivalent to inflateEnd followed by inflateInit, This function is equivalent to inflateEnd followed by inflateInit,
but does not free and reallocate all the internal decompression state. but does not free and reallocate all the internal decompression state.
@@ -578,7 +599,7 @@ extern int inflateReset OF((z_stream *strm));
utility functions can easily be modified if you need special options. utility functions can easily be modified if you need special options.
*/ */
extern int compress OF((Bytef *dest, uLongf *destLen, extern int EXPORT compress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen)); const Bytef *source, uLong sourceLen));
/* /*
Compresses the source buffer into the destination buffer. sourceLen is Compresses the source buffer into the destination buffer. sourceLen is
@@ -593,7 +614,7 @@ extern int compress OF((Bytef *dest, uLongf *destLen,
buffer. buffer.
*/ */
extern int uncompress OF((Bytef *dest, uLongf *destLen, extern int EXPORT uncompress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen)); const Bytef *source, uLong sourceLen));
/* /*
Decompresses the source buffer into the destination buffer. sourceLen is Decompresses the source buffer into the destination buffer. sourceLen is
@@ -614,7 +635,7 @@ extern int uncompress OF((Bytef *dest, uLongf *destLen,
typedef voidp gzFile; typedef voidp gzFile;
extern gzFile gzopen OF((const char *path, const char *mode)); extern gzFile EXPORT gzopen OF((const char *path, const char *mode));
/* /*
Opens a gzip (.gz) file for reading or writing. The mode parameter Opens a gzip (.gz) file for reading or writing. The mode parameter
is as in fopen ("rb" or "wb") but can also include a compression level is as in fopen ("rb" or "wb") but can also include a compression level
@@ -626,12 +647,12 @@ extern gzFile gzopen OF((const char *path, const char *mode));
zlib error is Z_MEM_ERROR). zlib error is Z_MEM_ERROR).
*/ */
extern gzFile gzdopen OF((int fd, const char *mode)); extern gzFile EXPORT gzdopen OF((int fd, const char *mode));
/* /*
gzdopen() associates a gzFile with the file descriptor fd. File gzdopen() associates a gzFile with the file descriptor fd. File
descriptors are obtained from calls like open, dup, creat, pipe or descriptors are obtained from calls like open, dup, creat, pipe or
fileno (in the file has been previously opened with fopen). fileno (in the file has been previously opened with fopen).
The mode parameter is as in fopen ("rb" or "wb"). The mode parameter is as in gzopen.
The next call of gzclose on the returned gzFile will also close the The next call of gzclose on the returned gzFile will also close the
file descriptor fd, just like fclose(fdopen(fd), mode) closes the file file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
@@ -639,7 +660,7 @@ extern gzFile gzdopen OF((int fd, const char *mode));
the (de)compression state. the (de)compression state.
*/ */
extern int gzread OF((gzFile file, voidp buf, unsigned len)); extern int EXPORT gzread OF((gzFile file, voidp buf, unsigned len));
/* /*
Reads the given number of uncompressed bytes from the compressed file. Reads the given number of uncompressed bytes from the compressed file.
If the input file was not in gzip format, gzread copies the given number If the input file was not in gzip format, gzread copies the given number
@@ -647,14 +668,14 @@ extern int gzread OF((gzFile file, voidp buf, unsigned len));
gzread returns the number of uncompressed bytes actually read (0 for gzread returns the number of uncompressed bytes actually read (0 for
end of file, -1 for error). */ end of file, -1 for error). */
extern int gzwrite OF((gzFile file, const voidp buf, unsigned len)); extern int EXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len));
/* /*
Writes the given number of uncompressed bytes into the compressed file. Writes the given number of uncompressed bytes into the compressed file.
gzwrite returns the number of uncompressed bytes actually written gzwrite returns the number of uncompressed bytes actually written
(0 in case of error). (0 in case of error).
*/ */
extern int gzflush OF((gzFile file, int flush)); extern int EXPORT gzflush OF((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
@@ -664,14 +685,14 @@ extern int gzflush OF((gzFile file, int flush));
degrade compression. degrade compression.
*/ */
extern int gzclose OF((gzFile file)); extern int EXPORT gzclose OF((gzFile file));
/* /*
Flushes all pending output if necessary, closes the compressed file Flushes all pending output if necessary, closes the compressed file
and deallocates all the (de)compression state. The return value is the zlib and deallocates all the (de)compression state. The return value is the zlib
error number (see function gzerror below). error number (see function gzerror below).
*/ */
extern char* gzerror OF((gzFile file, int *errnum)); extern const char * EXPORT gzerror OF((gzFile file, int *errnum));
/* /*
Returns the error message for the last error which occurred on the Returns the error message for the last error which occurred on the
given compressed file. errnum is set to zlib error number. If an given compressed file. errnum is set to zlib error number. If an
@@ -688,7 +709,7 @@ extern char* gzerror OF((gzFile file, int *errnum));
compression library. compression library.
*/ */
extern uLong adler32 OF((uLong adler, const Bytef *buf, uInt len)); extern uLong EXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
/* /*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and Update a running Adler-32 checksum with the bytes buf[0..len-1] and
@@ -705,7 +726,7 @@ extern uLong adler32 OF((uLong adler, const Bytef *buf, uInt len));
if (adler != original_adler) error(); if (adler != original_adler) error();
*/ */
extern uLong crc32 OF((uLong crc, const Bytef *buf, uInt len)); extern uLong EXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
/* /*
Update a running crc with the bytes buf[0..len-1] and return the updated 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 crc. If buf is NULL, this function returns the required initial value
@@ -727,14 +748,14 @@ extern uLong crc32 OF((uLong crc, const Bytef *buf, uInt len));
/* deflateInit and inflateInit are macros to allow checking the zlib version /* deflateInit and inflateInit are macros to allow checking the zlib version
* and the compiler's view of z_stream: * and the compiler's view of z_stream:
*/ */
extern int deflateInit_ OF((z_stream *strm, int level, extern int EXPORT deflateInit_ OF((z_streamp strm, int level,
const char *version, int stream_size)); const char *version, int stream_size));
extern int inflateInit_ OF((z_stream *strm, extern int EXPORT inflateInit_ OF((z_streamp strm,
const char *version, int stream_size)); const char *version, int stream_size));
extern int deflateInit2_ OF((z_stream *strm, int level, int method, extern int EXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
int windowBits, int memLevel, int strategy, int windowBits, int memLevel, int strategy,
const char *version, int stream_size)); const char *version, int stream_size));
extern int inflateInit2_ OF((z_stream *strm, int windowBits, extern int EXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
const char *version, int stream_size)); const char *version, int stream_size));
#define deflateInit(strm, level) \ #define deflateInit(strm, level) \
deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
@@ -746,7 +767,7 @@ extern int inflateInit2_ OF((z_stream *strm, int windowBits,
#define inflateInit2(strm, windowBits) \ #define inflateInit2(strm, windowBits) \
inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
#ifndef _Z_UTIL_H #if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
struct internal_state {int dummy;}; /* hack for buggy compilers */ struct internal_state {int dummy;}; /* hack for buggy compilers */
#endif #endif

32
zlib.rc Normal file
View File

@@ -0,0 +1,32 @@
#include <windows.h>
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1,0,5,0
PRODUCTVERSION 1,0,5,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE 0 // not used
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
//language ID = U.S. English, char set = Windows, Multilingual
BEGIN
VALUE "FileDescription", "zlib data compression library\0"
VALUE "FileVersion", "1.0.5\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlib.lib\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments", "DLL support by Alessandro Iacopetti\0"
VALUE "LegalCopyright", "(C) 1995-1996 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 1252
END
END

34
zutil.c
View File

@@ -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.8 1995/05/03 17:27:12 jloup Exp $ */ /* $Id: zutil.c,v 1.17 1996/07/24 13:41:12 me Exp $ */
#include <stdio.h> #include <stdio.h>
@@ -15,8 +15,6 @@ struct internal_state {int dummy;}; /* for buggy compilers */
extern void exit OF((int)); extern void exit OF((int));
#endif #endif
const char *zlib_version = ZLIB_VERSION;
const char *z_errmsg[10] = { const char *z_errmsg[10] = {
"need dictionary", /* Z_NEED_DICT 2 */ "need dictionary", /* Z_NEED_DICT 2 */
"stream end", /* Z_STREAM_END 1 */ "stream end", /* Z_STREAM_END 1 */
@@ -30,12 +28,19 @@ const char *z_errmsg[10] = {
""}; ""};
const char *zlibVersion()
{
return ZLIB_VERSION;
}
#ifdef DEBUG
void z_error (m) void z_error (m)
char *m; char *m;
{ {
fprintf(stderr, "%s\n", m); fprintf(stderr, "%s\n", m);
exit(1); exit(1);
} }
#endif
#ifndef HAVE_MEMCPY #ifndef HAVE_MEMCPY
@@ -50,6 +55,19 @@ void zmemcpy(dest, source, len)
} while (--len != 0); } while (--len != 0);
} }
int zmemcmp(s1, s2, len)
Bytef* s1;
Bytef* s2;
uInt len;
{
uInt j;
for (j = 0; j < len; j++) {
if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
}
return 0;
}
void zmemzero(dest, len) void zmemzero(dest, len)
Bytef* dest; Bytef* dest;
uInt len; uInt len;
@@ -135,14 +153,14 @@ void zcfree (voidpf opaque, voidpf ptr)
return; return;
} }
ptr = opaque; /* just to make some compilers happy */ ptr = opaque; /* just to make some compilers happy */
z_error("zcfree: ptr not found"); Assert(0, "zcfree: ptr not found");
} }
#endif #endif
#endif /* __TURBOC__ */ #endif /* __TURBOC__ */
#if defined(M_I86) && !(defined(__WATCOMC__) && defined(__386__)) #if defined(M_I86) && !defined(__32BIT__)
/* Microsoft C */ /* Microsoft C in 16-bit mode */
# define MY_ZCALLOC # define MY_ZCALLOC
@@ -178,7 +196,7 @@ voidpf zcalloc (opaque, items, size)
unsigned items; unsigned items;
unsigned size; unsigned size;
{ {
if (opaque) opaque = 0; /* to make compiler happy */ if (opaque) items += size - size; /* make compiler happy */
return (voidpf)calloc(items, size); return (voidpf)calloc(items, size);
} }
@@ -186,8 +204,8 @@ void zcfree (opaque, ptr)
voidpf opaque; voidpf opaque;
voidpf ptr; voidpf ptr;
{ {
if (opaque) opaque = 0; /* to make compiler happy */
free(ptr); free(ptr);
if (opaque) return; /* make compiler happy */
} }
#endif /* MY_ZCALLOC */ #endif /* MY_ZCALLOC */

16
zutil.h
View File

@@ -8,14 +8,14 @@
subject to change. Applications should only use zlib.h. subject to change. Applications should only use zlib.h.
*/ */
/* $Id: zutil.h,v 1.9 1995/05/03 17:27:12 jloup Exp $ */ /* $Id: zutil.h,v 1.16 1996/07/24 13:41:13 me Exp $ */
#ifndef _Z_UTIL_H #ifndef _Z_UTIL_H
#define _Z_UTIL_H #define _Z_UTIL_H
#include "zlib.h" #include "zlib.h"
#if defined(MSDOS) || defined(VMS) || defined(CRAY) || defined(WIN32) #if defined(MSDOS)||defined(VMS)||defined(CRAY)||defined(WIN32)||defined(RISCOS)
# include <stddef.h> # include <stddef.h>
# include <errno.h> # include <errno.h>
#else #else
@@ -40,10 +40,10 @@ typedef unsigned long ulg;
extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */ /* (size given to avoid silly warnings with Visual C++) */
#define ERR_MSG(err) (char*)z_errmsg[Z_NEED_DICT-(err)] #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
#define ERR_RETURN(strm,err) \ #define ERR_RETURN(strm,err) \
return (strm->msg = ERR_MSG(err), (err)) return (strm->msg = (char*)ERR_MSG(err), (err))
/* To be used only when the state is known to be valid */ /* To be used only when the state is known to be valid */
/* common constants */ /* common constants */
@@ -114,6 +114,10 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
#ifdef TOPS20 #ifdef TOPS20
# define OS_CODE 0x0a # define OS_CODE 0x0a
#endif
#if defined(_BEOS_) || defined(RISCOS)
# define fdopen(fd,mode) NULL /* No fdopen() */
#endif #endif
/* Common defaults */ /* Common defaults */
@@ -159,6 +163,7 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
# endif # endif
#else #else
extern void zmemcpy OF((Bytef* dest, Bytef* source, uInt len)); extern void zmemcpy OF((Bytef* dest, Bytef* source, uInt len));
extern int zmemcmp OF((Bytef* s1, Bytef* s2, uInt len));
extern void zmemzero OF((Bytef* dest, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len));
#endif #endif
@@ -168,6 +173,7 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
# ifndef verbose # ifndef verbose
# define verbose 0 # define verbose 0
# endif # endif
extern void z_error OF((char *m));
# define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Assert(cond,msg) {if(!(cond)) z_error(msg);}
# define Trace(x) fprintf x # define Trace(x) fprintf x
# define Tracev(x) {if (verbose) fprintf x ;} # define Tracev(x) {if (verbose) fprintf x ;}
@@ -186,8 +192,6 @@ extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len)); typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len));
extern void z_error OF((char *m));
voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
void zcfree OF((voidpf opaque, voidpf ptr)); void zcfree OF((voidpf opaque, voidpf ptr));