Compare commits

..

4 Commits

Author SHA1 Message Date
Mark Adler
a2506218cd zlib 1.2.0.8 2011-09-09 23:23:14 -07:00
Mark Adler
b97ec631c6 zlib 1.2.0.7 2011-09-09 23:23:01 -07:00
Mark Adler
f81ba93d4a zlib 1.2.0.6 2011-09-09 23:22:48 -07:00
Mark Adler
4b5a43a219 zlib 1.2.0.5 2011-09-09 23:22:37 -07:00
166 changed files with 16903 additions and 13083 deletions

108
ChangeLog
View File

@@ -1,5 +1,111 @@
ChangeLog file for zlib ChangeLog file for zlib
Changes in 1.2.0.8 (4 November 2003)
- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas
- Add experimental NO_DIVIDE #define in adler32.c
- Possibly faster on some processors (let me know if it is)
- Correct Z_BLOCK to not return on first inflate call if no wrap
- Fix strm->data_type on inflate() return to correctly indicate EOB
- Add deflatePrime() function for appending in the middle of a byte
- Add contrib/gzappend for an example of appending to a stream
- Update win32/DLL_FAQ.txt [Truta]
- Delete Turbo C comment in README [Truta]
- Improve some indentation in zconf.h [Truta]
- Fix infinite loop on bad input in configure script [Church]
- Fix gzeof() for concatenated gzip files [Johnson]
- Add example to contrib/visual-basic.txt [Michael B.]
- Add -p to mkdir's in Makefile.in [vda]
- Fix configure to properly detect presence or lack of printf functions
- Add AS400 support [Monnerat]
- Added a little Cygwin support [Wilson]
Changes in 1.2.0.7 (21 September 2003)
- Correct some debug formats in contrib/infback9
- Cast a type in a debug statement in trees.c
- Change search and replace delimiter in configure from % to # [Beebe]
- Update contrib/untgz to 0.2 with various fixes [Truta]
- Add build support for Amiga [Nikl]
- Remove some directories in old that have been updated to 1.2
- Add dylib building for Mac OS X in configure and Makefile.in
- Remove old distribution stuff from Makefile
- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X
- Update links in README
Changes in 1.2.0.6 (13 September 2003)
- Minor FAQ updates
- Update contrib/minizip to 1.00 [Vollant]
- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta]
- Update POSTINC comment for 68060 [Nikl]
- Add contrib/infback9 with deflate64 decoding (unsupported)
- For MVS define NO_vsnprintf and undefine FAR [van Burik]
- Add pragma for fdopen on MVS [van Burik]
Changes in 1.2.0.5 (8 September 2003)
- Add OF to inflateBackEnd() declaration in zlib.h
- Remember start when using gzdopen in the middle of a file
- Use internal off_t counters in gz* functions to properly handle seeks
- Perform more rigorous check for distance-too-far in inffast.c
- Add Z_BLOCK flush option to return from inflate at block boundary
- Set strm->data_type on return from inflate
- Indicate bits unused, if at block boundary, and if in last block
- Replace size_t with ptrdiff_t in crc32.c, and check for correct size
- Add condition so old NO_DEFLATE define still works for compatibility
- FAQ update regarding the Windows DLL [Truta]
- INDEX update: add qnx entry, remove aix entry [Truta]
- Install zlib.3 into mandir [Wilson]
- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta]
- Adapt the zlib interface to the new DLL convention guidelines [Truta]
- Introduce ZLIB_WINAPI macro to allow the export of functions using
the WINAPI calling convention, for Visual Basic [Vollant, Truta]
- Update msdos and win32 scripts and makefiles [Truta]
- Export symbols by name, not by ordinal, in win32/zlib.def [Truta]
- Add contrib/ada [Anisimkov]
- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta]
- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant]
- Add contrib/masm686 [Truta]
- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm
[Truta, Vollant]
- Update contrib/delphi; rename to contrib/pascal; add example [Truta]
- Remove contrib/delphi2; add a new contrib/delphi [Truta]
- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream,
and fix some method prototypes [Truta]
- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip
[Truta]
- Avoid the use of backslash (\) in contrib/minizip [Vollant]
- Fix file time handling in contrib/untgz; update makefiles [Truta]
- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines
[Vollant]
- Remove contrib/vstudio/vc15_16 [Vollant]
- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta]
- Update README.contrib [Truta]
- Invert the assignment order of match_head and s->prev[...] in
INSERT_STRING [Truta]
- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings
[Truta]
- Compare function pointers with 0, not with NULL or Z_NULL [Truta]
- Fix prototype of syncsearch in inflate.c [Truta]
- Introduce ASMINF macro to be enabled when using an ASM implementation
of inflate_fast [Truta]
- Change NO_DEFLATE to NO_GZCOMPRESS [Truta]
- Modify test_gzio in example.c to take a single file name as a
parameter [Truta]
- Exit the example.c program if gzopen fails [Truta]
- Add type casts around strlen in example.c [Truta]
- Remove casting to sizeof in minigzip.c; give a proper type
to the variable compared with SUFFIX_LEN [Truta]
- Update definitions of STDC and STDC99 in zconf.h [Truta]
- Synchronize zconf.h with the new Windows DLL interface [Truta]
- Use SYS16BIT instead of __32BIT__ to distinguish between
16- and 32-bit platforms [Truta]
- Use far memory allocators in small 16-bit memory models for
Turbo C [Truta]
- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in
zlibCompileFlags [Truta]
- Cygwin has vsnprintf [Wilson]
- In Windows16, OS_CODE is 0, as in MSDOS [Truta]
- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson]
Changes in 1.2.0.4 (10 August 2003) Changes in 1.2.0.4 (10 August 2003)
- Minor FAQ updates - Minor FAQ updates
- Be more strict when checking inflateInit2's windowBits parameter - Be more strict when checking inflateInit2's windowBits parameter
@@ -369,7 +475,7 @@ Changes in 1.0.5 (3 Jan 98)
- Eliminate memory leaks on error conditions in inflate - Eliminate memory leaks on error conditions in inflate
- Removed some vestigial code in inflate - Removed some vestigial code in inflate
- Update web address in README - Update web address in README
Changes in 1.0.4 (24 Jul 96) Changes in 1.0.4 (24 Jul 96)
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF - 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 bit, so the decompressor could decompress all the correct data but went

14
FAQ
View File

@@ -2,7 +2,7 @@
Frequently Asked Questions about zlib Frequently Asked Questions about zlib
If your question is not there, please check the zlib home page If your question is not there, please check the zlib home page
http://www.zlib.org which may have more recent information. http://www.zlib.org which may have more recent information.
The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
@@ -13,9 +13,10 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
2. Where can I get a Windows DLL version? 2. Where can I get a Windows DLL version?
The zlib sources can be compiled without change to produce a DLL. If you The zlib sources can be compiled without change to produce a DLL.
want a precompiled DLL, see http://www.winimage.com/zLibDll/ . Questions See the file win32/DLL_FAQ.txt in the zlib distribution.
about the zlib DLL should be sent to Gilles Vollant (info@winimage.com). Pointers to the precompiled DLL are found in the zlib web site at
http://www.zlib.org.
3. Where can I get a Visual Basic interface to zlib? 3. Where can I get a Visual Basic interface to zlib?
@@ -66,14 +67,13 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
If "make test" produces something like If "make test" produces something like
example.o(.text+0x154): undefined reference to `gzputc' example.o(.text+0x154): undefined reference to `gzputc'
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
/usr/X11R6/lib. Remove any old versions, then do "make install". /usr/X11R6/lib. Remove any old versions, then do "make install".
10. I need a Delphi interface to zlib. 10. I need a Delphi interface to zlib.
See the directories contrib/delphi and contrib/delphi2 in the zlib See the contrib/delphi directory in the zlib distribution.
distribution.
11. Can zlib handle .zip archives? 11. Can zlib handle .zip archives?

6
INDEX
View File

@@ -8,11 +8,11 @@ algorithm.txt description of the (de)compression algorithm
configure configure script for Unix configure configure script for Unix
zconf.in.h template for zconf.h (used by configure) zconf.in.h template for zconf.h (used by configure)
aix/ instructions for building an AIX shared library msdos/ makefiles for MSDOS
msdos/ makefiles for MSDOS
old/ makefiles for various architectures and zlib documentation old/ makefiles for various architectures and zlib documentation
files that have not yet been updated for zlib 1.2.x files that have not yet been updated for zlib 1.2.x
win32/ makefiles for Windows qnx/ makefiles for QNX
win32/ makefiles for Windows
zlib public header files (must be kept): zlib public header files (must be kept):
zconf.h zconf.h

101
Makefile
View File

@@ -1,12 +1,16 @@
# Makefile for zlib # Makefile for zlib
# Copyright (C) 1995-2003 Jean-loup Gailly. # Copyright (C) 1995-2003 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:
# ./configure; make test # ./configure; make test
# The call of configure is optional if you don't have special requirements # The call of configure is optional if you don't have special requirements
# If you wish to build zlib as a shared library, use: ./configure -s # If you wish to build zlib as a shared library, use: ./configure -s
# To use the asm code, type:
# cp contrib/asm?86/match.S ./match.S
# make LOC=-DASMV OBJA=match.o
# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
# make install # make install
# To install in $HOME instead of /usr/local, use: # To install in $HOME instead of /usr/local, use:
@@ -24,19 +28,23 @@ LDFLAGS=libz.a
LDSHARED=$(CC) LDSHARED=$(CC)
CPP=$(CC) -E CPP=$(CC) -E
VER=1.2.0.4
LIBS=libz.a LIBS=libz.a
SHAREDLIB=libz.so SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.0.8
SHAREDLIBM=libz.so.1
AR=ar rc AR=ar rc
RANLIB=ranlib RANLIB=ranlib
TAR=tar TAR=tar
SHELL=/bin/sh SHELL=/bin/sh
EXE=
prefix = /usr/local prefix = /usr/local
exec_prefix = ${prefix} exec_prefix = ${prefix}
libdir = ${exec_prefix}/lib libdir = ${exec_prefix}/lib
includedir = ${prefix}/include includedir = ${prefix}/include
mandir = ${prefix}/share/man
man3dir = ${mandir}/man3
OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
zutil.o inflate.o infback.o inftrees.o inffast.o zutil.o inflate.o infback.o inftrees.o inffast.o
@@ -46,20 +54,7 @@ OBJA =
TEST_OBJS = example.o minigzip.o TEST_OBJS = example.o minigzip.o
# Note: this hasn't been updated for zlib 1.2.0 all: example$(EXE) minigzip$(EXE)
DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
algorithm.txt zlib.3 zlib.html \
msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
contrib/asm[56]86/*.S contrib/iostream/*.cpp \
contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
contrib/delphi*/*.???
all: example minigzip
check: test check: test
test: all test: all
@@ -82,80 +77,60 @@ match.o: match.S
mv _match.o match.o mv _match.o match.o
rm -f _match.s rm -f _match.s
$(SHAREDLIB).$(VER): $(OBJS) $(SHAREDLIBV): $(OBJS)
$(LDSHARED) -o $@ $(OBJS) $(LDSHARED) -o $@ $(OBJS)
rm -f $(SHAREDLIB) $(SHAREDLIB).1 rm -f $(SHAREDLIB) $(SHAREDLIBM)
ln -s $@ $(SHAREDLIB) ln -s $@ $(SHAREDLIB)
ln -s $@ $(SHAREDLIB).1 ln -s $@ $(SHAREDLIBM)
example: example.o $(LIBS) example$(EXE): example.o $(LIBS)
$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
minigzip: minigzip.o $(LIBS) minigzip$(EXE): minigzip.o $(LIBS)
$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
install: $(LIBS) install: $(LIBS)
-@if [ ! -d $(exec_prefix) ]; then mkdir $(exec_prefix); fi -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi
-@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi
-@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi
-@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi
cp zlib.h zconf.h $(includedir) cp zlib.h zconf.h $(includedir)
chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
cp $(LIBS) $(libdir) cp $(LIBS) $(libdir)
cd $(libdir); chmod 755 $(LIBS) cd $(libdir); chmod 755 $(LIBS)
-@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \ cd $(libdir); if test -f $(SHAREDLIBV); then \
rm -f $(SHAREDLIB) $(SHAREDLIB).1; \ rm -f $(SHAREDLIB) $(SHAREDLIBM); \
ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \ ln -s $(SHAREDLIBV) $(SHAREDLIB); \
ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \ ln -s $(SHAREDLIBV) $(SHAREDLIBM); \
(ldconfig || true) >/dev/null 2>&1; \ (ldconfig || true) >/dev/null 2>&1; \
fi fi
cp zlib.3 $(man3dir)
chmod 644 $(man3dir)/zlib.3
# The ranlib in install is needed on NeXTSTEP which checks file times # The ranlib in install is needed on NeXTSTEP which checks file times
# ldconfig is for Linux # ldconfig is for Linux
uninstall: uninstall:
cd $(includedir); \ cd $(includedir); \
v=$(VER); \
if test -f zlib.h; then \
v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
rm -f zlib.h zconf.h; \
fi; \
cd $(libdir); rm -f libz.a; \ cd $(libdir); rm -f libz.a; \
if test -f $(SHAREDLIB).$$v; then \ if test -f $(SHAREDLIBV); then \
rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \
fi fi
cd $(man3dir); rm -f zlib.3
mostlyclean: clean mostlyclean: clean
clean: clean:
rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \ rm -f *.o *~ example$(EXE) minigzip$(EXE) \
_match.s maketree libz.* foo.gz so_locations \
_match.s maketree contrib/infback9/*.o
maintainer-clean: distclean maintainer-clean: distclean
distclean: clean distclean: clean
cp -p Makefile.in Makefile cp -p Makefile.in Makefile
cp -p zconf.in.h zconf.h cp -p zconf.in.h zconf.h
rm -f .DS_Store
zip: tags:
mv Makefile Makefile~; cp -p Makefile.in Makefile
rm -f test.c ztest*.c contrib/minizip/test.zip
v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
zip -ul9 zlib$$v $(DISTFILES)
mv Makefile~ Makefile
dist:
echo Warning: this hasn't been updated for zlib 1.2.0 -- don't use
mv Makefile Makefile~; cp -p Makefile.in Makefile
rm -f test.c ztest*.c contrib/minizip/test.zip
d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
rm -f $$d.tar.gz; \
if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
files=""; \
for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
cd ..; \
GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
if test ! -d $$d; then rm -f $$d; fi
mv Makefile~ Makefile
tags:
etags *.[ch] etags *.[ch]
depend: depend:
@@ -173,7 +148,7 @@ inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inftrees.o: zutil.h zlib.h zconf.h inftrees.h inftrees.o: zutil.h zlib.h zconf.h inftrees.h
minigzip.o: zlib.h zconf.h minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
uncompr.o: zlib.h zconf.h uncompr.o: zlib.h zconf.h
zutil.o: zutil.h zlib.h zconf.h zutil.o: zutil.h zlib.h zconf.h

View File

@@ -1,12 +1,16 @@
# Makefile for zlib # Makefile for zlib
# Copyright (C) 1995-2003 Jean-loup Gailly. # Copyright (C) 1995-2003 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:
# ./configure; make test # ./configure; make test
# The call of configure is optional if you don't have special requirements # The call of configure is optional if you don't have special requirements
# If you wish to build zlib as a shared library, use: ./configure -s # If you wish to build zlib as a shared library, use: ./configure -s
# To use the asm code, type:
# cp contrib/asm?86/match.S ./match.S
# make LOC=-DASMV OBJA=match.o
# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
# make install # make install
# To install in $HOME instead of /usr/local, use: # To install in $HOME instead of /usr/local, use:
@@ -24,19 +28,23 @@ LDFLAGS=libz.a
LDSHARED=$(CC) LDSHARED=$(CC)
CPP=$(CC) -E CPP=$(CC) -E
VER=1.2.0.4
LIBS=libz.a LIBS=libz.a
SHAREDLIB=libz.so SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.0.8
SHAREDLIBM=libz.so.1
AR=ar rc AR=ar rc
RANLIB=ranlib RANLIB=ranlib
TAR=tar TAR=tar
SHELL=/bin/sh SHELL=/bin/sh
EXE=
prefix = /usr/local prefix = /usr/local
exec_prefix = ${prefix} exec_prefix = ${prefix}
libdir = ${exec_prefix}/lib libdir = ${exec_prefix}/lib
includedir = ${prefix}/include includedir = ${prefix}/include
mandir = ${prefix}/share/man
man3dir = ${mandir}/man3
OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
zutil.o inflate.o infback.o inftrees.o inffast.o zutil.o inflate.o infback.o inftrees.o inffast.o
@@ -46,20 +54,7 @@ OBJA =
TEST_OBJS = example.o minigzip.o TEST_OBJS = example.o minigzip.o
# Note: this hasn't been updated for zlib 1.2.0 all: example$(EXE) minigzip$(EXE)
DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
algorithm.txt zlib.3 zlib.html \
msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
contrib/asm[56]86/*.S contrib/iostream/*.cpp \
contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
contrib/delphi*/*.???
all: example minigzip
check: test check: test
test: all test: all
@@ -82,80 +77,60 @@ match.o: match.S
mv _match.o match.o mv _match.o match.o
rm -f _match.s rm -f _match.s
$(SHAREDLIB).$(VER): $(OBJS) $(SHAREDLIBV): $(OBJS)
$(LDSHARED) -o $@ $(OBJS) $(LDSHARED) -o $@ $(OBJS)
rm -f $(SHAREDLIB) $(SHAREDLIB).1 rm -f $(SHAREDLIB) $(SHAREDLIBM)
ln -s $@ $(SHAREDLIB) ln -s $@ $(SHAREDLIB)
ln -s $@ $(SHAREDLIB).1 ln -s $@ $(SHAREDLIBM)
example: example.o $(LIBS) example$(EXE): example.o $(LIBS)
$(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
minigzip: minigzip.o $(LIBS) minigzip$(EXE): minigzip.o $(LIBS)
$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
install: $(LIBS) install: $(LIBS)
-@if [ ! -d $(exec_prefix) ]; then mkdir $(exec_prefix); fi -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi
-@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi
-@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi
-@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi
cp zlib.h zconf.h $(includedir) cp zlib.h zconf.h $(includedir)
chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
cp $(LIBS) $(libdir) cp $(LIBS) $(libdir)
cd $(libdir); chmod 755 $(LIBS) cd $(libdir); chmod 755 $(LIBS)
-@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \ cd $(libdir); if test -f $(SHAREDLIBV); then \
rm -f $(SHAREDLIB) $(SHAREDLIB).1; \ rm -f $(SHAREDLIB) $(SHAREDLIBM); \
ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \ ln -s $(SHAREDLIBV) $(SHAREDLIB); \
ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \ ln -s $(SHAREDLIBV) $(SHAREDLIBM); \
(ldconfig || true) >/dev/null 2>&1; \ (ldconfig || true) >/dev/null 2>&1; \
fi fi
cp zlib.3 $(man3dir)
chmod 644 $(man3dir)/zlib.3
# The ranlib in install is needed on NeXTSTEP which checks file times # The ranlib in install is needed on NeXTSTEP which checks file times
# ldconfig is for Linux # ldconfig is for Linux
uninstall: uninstall:
cd $(includedir); \ cd $(includedir); \
v=$(VER); \
if test -f zlib.h; then \
v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
rm -f zlib.h zconf.h; \
fi; \
cd $(libdir); rm -f libz.a; \ cd $(libdir); rm -f libz.a; \
if test -f $(SHAREDLIB).$$v; then \ if test -f $(SHAREDLIBV); then \
rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \
fi fi
cd $(man3dir); rm -f zlib.3
mostlyclean: clean mostlyclean: clean
clean: clean:
rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \ rm -f *.o *~ example$(EXE) minigzip$(EXE) \
_match.s maketree libz.* foo.gz so_locations \
_match.s maketree contrib/infback9/*.o
maintainer-clean: distclean maintainer-clean: distclean
distclean: clean distclean: clean
cp -p Makefile.in Makefile cp -p Makefile.in Makefile
cp -p zconf.in.h zconf.h cp -p zconf.in.h zconf.h
rm -f .DS_Store
zip: tags:
mv Makefile Makefile~; cp -p Makefile.in Makefile
rm -f test.c ztest*.c contrib/minizip/test.zip
v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
zip -ul9 zlib$$v $(DISTFILES)
mv Makefile~ Makefile
dist:
echo Warning: this hasn't been updated for zlib 1.2.0 -- don't use
mv Makefile Makefile~; cp -p Makefile.in Makefile
rm -f test.c ztest*.c contrib/minizip/test.zip
d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
rm -f $$d.tar.gz; \
if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
files=""; \
for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
cd ..; \
GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
if test ! -d $$d; then rm -f $$d; fi
mv Makefile~ Makefile
tags:
etags *.[ch] etags *.[ch]
depend: depend:
@@ -173,7 +148,7 @@ inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inftrees.o: zutil.h zlib.h zconf.h inftrees.h inftrees.o: zutil.h zlib.h zconf.h inftrees.h
minigzip.o: zlib.h zconf.h minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
uncompr.o: zlib.h zconf.h uncompr.o: zlib.h zconf.h
zutil.o: zutil.h zlib.h zconf.h zutil.o: zutil.h zlib.h zconf.h

34
README
View File

@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY ZLIB DATA COMPRESSION LIBRARY
zlib 1.2.0.4 is a general purpose data compression library. All the code is zlib 1.2.0.8 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files (Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
@@ -8,7 +8,7 @@ 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 formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
All functions of the compression library are documented in the file zlib.h All functions of the compression library are documented in the file zlib.h
(volunteer to write man pages welcome, contact jloup@gzip.org). A usage example (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
of the library is given in the file example.c which also tests that the library of the library is given in the file example.c which also tests that the library
is working correctly. Another example is given in the file minigzip.c. The is working correctly. Another example is given in the file minigzip.c. The
compression library itself is composed of all source files except example.c and compression library itself is composed of all source files except example.c and
@@ -34,12 +34,12 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available in issue of Dr. Dobb's Journal; a copy of the article is available in
http://dogma.net/markn/articles/zlibtool/zlibtool.htm http://dogma.net/markn/articles/zlibtool/zlibtool.htm
The changes made in version 1.2.0.4 are documented in the file ChangeLog. The changes made in version 1.2.0.8 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory "contrib". Unsupported third party contributions are provided in directory "contrib".
A Java implementation of zlib is available in the Java Development Kit A Java implementation of zlib is available in the Java Development Kit
http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html
See the zlib home page http://www.zlib.org for details. See the zlib home page http://www.zlib.org for details.
A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is in the A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is in the
@@ -51,26 +51,16 @@ available in Python 1.5 and later versions, see
http://www.python.org/doc/lib/module-zlib.html http://www.python.org/doc/lib/module-zlib.html
A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com> is A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com> is
availlable at http://www.westend.com/~kupries/doc/trf/man/man.html availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html
An experimental package to read and write files in .zip format, written on top An experimental package to read and write files in .zip format, written on top
of zlib by Gilles Vollant <info@winimage.com>, is available at of zlib by Gilles Vollant <info@winimage.com>, is available in the
http://www.winimage.com/zLibDll/unzip.html and also in the contrib/minizip contrib/minizip directory of zlib.
directory of zlib.
Notes for some targets: Notes for some targets:
- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc - For Windows DLL versions, please see win32/DLL_FAQ.txt
and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL The
zlib DLL support was initially done by Alessandro Iacopetti and is now
maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL home
page at http://www.winimage.com/zLibDll
From Visual Basic, you can call the DLL functions which do not take a
structure as argument: compress, uncompress and all gz* functions. See
contrib/visual-basic.txt for more information, or get
http://www.tcfb.com/dowseware/cmp-z-it.zip
- For 64-bit Irix, deflate.c must be compiled without any optimization. With - For 64-bit Irix, deflate.c must be compiled without any optimization. With
-O, one libpng test fails. The test works in 32 bit mode (with the -n32 -O, one libpng test fails. The test works in 32 bit mode (with the -n32
@@ -87,11 +77,11 @@ Notes for some targets:
- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
- For Turbo C the small model is supported only with reduced performance to - For PalmOs, see http://palmzlib.sourceforge.net/
avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html Per - When building a shared, i.e. dynamic library on Mac OS X, the library must be
Harald Myrvang <perm@stud.cs.uit.no> installed before testing (do "make install" before "make test"), since the
library location is specified in the library.
Acknowledgments: Acknowledgments:

View File

@@ -1,6 +1,6 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream /* adler32.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2003 Mark Adler * Copyright (C) 1995-2003 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
*/ */
/* @(#) $Id$ */ /* @(#) $Id$ */
@@ -8,7 +8,7 @@
#define ZLIB_INTERNAL #define ZLIB_INTERNAL
#include "zlib.h" #include "zlib.h"
#define BASE 65521L /* largest prime smaller than 65536 */ #define BASE 65521UL /* largest prime smaller than 65536 */
#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 */
@@ -18,6 +18,31 @@
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf,0); DO8(buf,8); #define DO16(buf) DO8(buf,0); DO8(buf,8);
#ifdef NO_DIVIDE
# define MOD(a) \
do { \
if (a > (BASE << 16)) a -= (BASE << 16); \
if (a > (BASE << 15)) a -= (BASE << 15); \
if (a > (BASE << 14)) a -= (BASE << 14); \
if (a > (BASE << 13)) a -= (BASE << 13); \
if (a > (BASE << 12)) a -= (BASE << 12); \
if (a > (BASE << 11)) a -= (BASE << 11); \
if (a > (BASE << 10)) a -= (BASE << 10); \
if (a > (BASE << 9)) a -= (BASE << 9); \
if (a > (BASE << 8)) a -= (BASE << 8); \
if (a > (BASE << 7)) a -= (BASE << 7); \
if (a > (BASE << 6)) a -= (BASE << 6); \
if (a > (BASE << 5)) a -= (BASE << 5); \
if (a > (BASE << 4)) a -= (BASE << 4); \
if (a > (BASE << 3)) a -= (BASE << 3); \
if (a > (BASE << 2)) a -= (BASE << 2); \
if (a > (BASE << 1)) a -= (BASE << 1); \
if (a > BASE) a -= BASE; \
} while (0)
#else
# define MOD(a) a %= BASE
#endif
/* ========================================================================= */ /* ========================================================================= */
uLong ZEXPORT adler32(adler, buf, len) uLong ZEXPORT adler32(adler, buf, len)
uLong adler; uLong adler;
@@ -42,8 +67,8 @@ uLong ZEXPORT adler32(adler, buf, len)
s1 += *buf++; s1 += *buf++;
s2 += s1; s2 += s1;
} while (--k); } while (--k);
s1 %= BASE; MOD(s1);
s2 %= BASE; MOD(s2);
} }
return (s2 << 16) | s1; return (s2 << 16) | s1;
} }

View File

@@ -91,40 +91,40 @@ for 30 symbols.
2.2 More details on the inflate table lookup 2.2 More details on the inflate table lookup
Ok, you want to know what this cleverly obfuscated inflate tree actually Ok, you want to know what this cleverly obfuscated inflate tree actually
looks like. You are correct that it's not a Huffman tree. It is simply a looks like. You are correct that it's not a Huffman tree. It is simply a
lookup table for the first, let's say, nine bits of a Huffman symbol. The lookup table for the first, let's say, nine bits of a Huffman symbol. The
symbol could be as short as one bit or as long as 15 bits. If a particular symbol could be as short as one bit or as long as 15 bits. If a particular
symbol is shorter than nine bits, then that symbol's translation is duplicated symbol is shorter than nine bits, then that symbol's translation is duplicated
in all those entries that start with that symbol's bits. For example, if the in all those entries that start with that symbol's bits. For example, if the
symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
symbol is nine bits long, it appears in the table once. symbol is nine bits long, it appears in the table once.
If the symbol is longer than nine bits, then that entry in the table points If the symbol is longer than nine bits, then that entry in the table points
to another similar table for the remaining bits. Again, there are duplicated to another similar table for the remaining bits. Again, there are duplicated
entries as needed. The idea is that most of the time the symbol will be short entries as needed. The idea is that most of the time the symbol will be short
and there will only be one table look up. (That's whole idea behind data and there will only be one table look up. (That's whole idea behind data
compression in the first place.) For the less frequent long symbols, there compression in the first place.) For the less frequent long symbols, there
will be two lookups. If you had a compression method with really long will be two lookups. If you had a compression method with really long
symbols, you could have as many levels of lookups as is efficient. For symbols, you could have as many levels of lookups as is efficient. For
inflate, two is enough. inflate, two is enough.
So a table entry either points to another table (in which case nine bits in So a table entry either points to another table (in which case nine bits in
the above example are gobbled), or it contains the translation for the symbol the above example are gobbled), or it contains the translation for the symbol
and the number of bits to gobble. Then you start again with the next and the number of bits to gobble. Then you start again with the next
ungobbled bit. ungobbled bit.
You may wonder: why not just have one lookup table for how ever many bits the You may wonder: why not just have one lookup table for how ever many bits the
longest symbol is? The reason is that if you do that, you end up spending longest symbol is? The reason is that if you do that, you end up spending
more time filling in duplicate symbol entries than you do actually decoding. more time filling in duplicate symbol entries than you do actually decoding.
At least for deflate's output that generates new trees every several 10's of At least for deflate's output that generates new trees every several 10's of
kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
would take too long if you're only decoding several thousand symbols. At the would take too long if you're only decoding several thousand symbols. At the
other extreme, you could make a new table for every bit in the code. In fact, other extreme, you could make a new table for every bit in the code. In fact,
that's essentially a Huffman tree. But then you spend two much time that's essentially a Huffman tree. But then you spend two much time
traversing the tree while decoding, even for short symbols. traversing the tree while decoding, even for short symbols.
So the number of bits for the first lookup table is a trade of the time to So the number of bits for the first lookup table is a trade of the time to
fill out the table vs. the time spent looking at the second level and above of fill out the table vs. the time spent looking at the second level and above of
the table. the table.
@@ -154,7 +154,7 @@ Let's make the first table three bits long (eight entries):
110: -> table X (gobble 3 bits) 110: -> table X (gobble 3 bits)
111: -> table Y (gobble 3 bits) 111: -> table Y (gobble 3 bits)
Each entry is what the bits decode as and how many bits that is, i.e. how Each entry is what the bits decode as and how many bits that is, i.e. how
many bits to gobble. Or the entry points to another table, with the number of many bits to gobble. Or the entry points to another table, with the number of
bits to gobble implicit in the size of the table. bits to gobble implicit in the size of the table.
@@ -166,7 +166,7 @@ long:
10: D,2 10: D,2
11: E,2 11: E,2
Table Y is three bits long since the longest code starting with 111 is six Table Y is three bits long since the longest code starting with 111 is six
bits long: bits long:
000: F,2 000: F,2
@@ -178,20 +178,20 @@ bits long:
110: I,3 110: I,3
111: J,3 111: J,3
So what we have here are three tables with a total of 20 entries that had to So what we have here are three tables with a total of 20 entries that had to
be constructed. That's compared to 64 entries for a single table. Or be constructed. That's compared to 64 entries for a single table. Or
compared to 16 entries for a Huffman tree (six two entry tables and one four compared to 16 entries for a Huffman tree (six two entry tables and one four
entry table). Assuming that the code ideally represents the probability of entry table). Assuming that the code ideally represents the probability of
the symbols, it takes on the average 1.25 lookups per symbol. That's compared the symbols, it takes on the average 1.25 lookups per symbol. That's compared
to one lookup for the single table, or 1.66 lookups per symbol for the to one lookup for the single table, or 1.66 lookups per symbol for the
Huffman tree. Huffman tree.
There, I think that gives you a picture of what's going on. For inflate, the There, I think that gives you a picture of what's going on. For inflate, the
meaning of a particular symbol is often more than just a letter. It can be a meaning of a particular symbol is often more than just a letter. It can be a
byte (a "literal"), or it can be either a length or a distance which byte (a "literal"), or it can be either a length or a distance which
indicates a base value and a number of bits to fetch after the code that is indicates a base value and a number of bits to fetch after the code that is
added to the base value. Or it might be the special end-of-block code. The added to the base value. Or it might be the special end-of-block code. The
data structures created in inftrees.c try to encode all that information data structures created in inftrees.c try to encode all that information
compactly in the tables. compactly in the tables.

66
amiga/Makefile.pup Normal file
View File

@@ -0,0 +1,66 @@
# Amiga powerUP (TM) Makefile
# makefile for libpng and SAS C V6.58/7.00 PPC compiler
# Copyright (C) 1998 by Andreas R. Kleinert
LIBNAME = libzip.a
CC = scppc
CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \
OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER
AR = ppc-amigaos-ar cr
RANLIB = ppc-amigaos-ranlib
LD = ppc-amigaos-ld -r
LDFLAGS = -o
LDLIBS = LIB:scppc.a LIB:end.o
RM = delete quiet
OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
zutil.o inflate.o infback.o inftrees.o inffast.o
TEST_OBJS = example.o minigzip.o
all: example minigzip
check: test
test: all
example
echo hello world | minigzip | minigzip -d
$(LIBNAME): $(OBJS)
$(AR) $@ $(OBJS)
-$(RANLIB) $@
example: example.o $(LIBNAME)
$(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
minigzip: minigzip.o $(LIBNAME)
$(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
mostlyclean: clean
clean:
$(RM) *.o example minigzip $(LIBNAME) foo.gz
zip:
zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \
descrip.mms *.[ch]
tgz:
cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch]
# DO NOT DELETE THIS LINE -- make depend depends on it.
adler32.o: zlib.h zconf.h
compress.o: zlib.h zconf.h
crc32.o: crc32.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
inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
uncompr.o: zlib.h zconf.h
zutil.o: zutil.h zlib.h zconf.h

View File

@@ -10,22 +10,24 @@ CFLAGS=OPT
LDFLAGS=LIB z.lib LDFLAGS=LIB z.lib
SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \ SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \
DEF=POSTINC
OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ 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 zutil.o inflate.o infback.o inftrees.o inffast.o
TEST_OBJS = example.o minigzip.o TEST_OBJS = example.o minigzip.o
all: SCOPTIONS example minigzip all: SCOPTIONS example minigzip
check: test
test: all test: all
`cd`/example example
echo hello world | minigzip | minigzip -d echo hello world | minigzip | minigzip -d
install: z.lib install: z.lib
copy zlib.h zconf.h INCLUDE: clone copy clone zlib.h zconf.h INCLUDE:
copy z.lib LIB: clone copy clone z.lib LIB:
z.lib: $(OBJS) z.lib: $(OBJS)
oml z.lib r $(OBJS) oml z.lib r $(OBJS)
@@ -36,29 +38,28 @@ example: example.o z.lib
minigzip: minigzip.o z.lib minigzip: minigzip.o z.lib
$(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS) $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
mostlyclean: clean
clean: clean:
-delete force quiet *.o example minigzip z.lib foo.gz *.lnk SCOPTIONS -delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS
SCOPTIONS: Smakefile SCOPTIONS: Makefile.sas
copy to $@ <from < copy to $@ <from <
$(SCOPTIONS) $(SCOPTIONS)
< <
# DO NOT DELETE THIS LINE -- make depend depends on it. # DO NOT DELETE THIS LINE -- make depend depends on it.
adler32.o: zutil.h zlib.h zconf.h adler32.o: zlib.h zconf.h
compress.o: zlib.h zconf.h compress.o: zlib.h zconf.h
crc32.o: zutil.h zlib.h zconf.h crc32.o: crc32.h zlib.h zconf.h
deflate.o: deflate.h zutil.h zlib.h zconf.h deflate.o: deflate.h zutil.h zlib.h zconf.h
example.o: zlib.h zconf.h example.o: zlib.h zconf.h
gzio.o: zutil.h 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 inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inflate.o: zutil.h zlib.h zconf.h infblock.h
inftrees.o: zutil.h zlib.h zconf.h inftrees.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 minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
uncompr.o: zlib.h zconf.h uncompr.o: zlib.h zconf.h
zutil.o: zutil.h zlib.h zconf.h zutil.o: zutil.h zlib.h zconf.h

132
as400/bndsrc Normal file
View File

@@ -0,0 +1,132 @@
STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB')
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/* Version 1.1.3 entry points. */
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/********************************************************************/
/* *MODULE ADLER32 ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("adler32")
/********************************************************************/
/* *MODULE COMPRESS ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("compress")
EXPORT SYMBOL("compress2")
/********************************************************************/
/* *MODULE CRC32 ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("crc32")
EXPORT SYMBOL("get_crc_table")
/********************************************************************/
/* *MODULE DEFLATE ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("deflate")
EXPORT SYMBOL("deflateEnd")
EXPORT SYMBOL("deflateSetDictionary")
EXPORT SYMBOL("deflateCopy")
EXPORT SYMBOL("deflateReset")
EXPORT SYMBOL("deflateParams")
EXPORT SYMBOL("deflatePrime")
EXPORT SYMBOL("deflateInit_")
EXPORT SYMBOL("deflateInit2_")
/********************************************************************/
/* *MODULE GZIO ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("gzopen")
EXPORT SYMBOL("gzdopen")
EXPORT SYMBOL("gzsetparams")
EXPORT SYMBOL("gzread")
EXPORT SYMBOL("gzwrite")
EXPORT SYMBOL("gzprintf")
EXPORT SYMBOL("gzputs")
EXPORT SYMBOL("gzgets")
EXPORT SYMBOL("gzputc")
EXPORT SYMBOL("gzgetc")
EXPORT SYMBOL("gzflush")
EXPORT SYMBOL("gzseek")
EXPORT SYMBOL("gzrewind")
EXPORT SYMBOL("gztell")
EXPORT SYMBOL("gzeof")
EXPORT SYMBOL("gzclose")
EXPORT SYMBOL("gzerror")
/********************************************************************/
/* *MODULE INFLATE ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("inflate")
EXPORT SYMBOL("inflateEnd")
EXPORT SYMBOL("inflateSetDictionary")
EXPORT SYMBOL("inflateSync")
EXPORT SYMBOL("inflateReset")
EXPORT SYMBOL("inflateInit_")
EXPORT SYMBOL("inflateInit2_")
EXPORT SYMBOL("inflateSyncPoint")
/********************************************************************/
/* *MODULE UNCOMPR ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("uncompress")
/********************************************************************/
/* *MODULE ZUTIL ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("zlibVersion")
EXPORT SYMBOL("zError")
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/* Version 1.2.0.7 additional entry points. */
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/********************************************************************/
/* *MODULE COMPRESS ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("compressBound")
/********************************************************************/
/* *MODULE DEFLATE ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("deflateBound")
/********************************************************************/
/* *MODULE GZIO ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("gzungetc")
EXPORT SYMBOL("gzclearerr")
/********************************************************************/
/* *MODULE INFBACK ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("inflateBack")
EXPORT SYMBOL("inflateBackEnd")
EXPORT SYMBOL("inflateBackInit_")
/********************************************************************/
/* *MODULE INFLATE ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("inflateCopy")
/********************************************************************/
/* *MODULE ZUTIL ZLIB 01/02/01 00:15:09 */
/********************************************************************/
EXPORT SYMBOL("zlibCompileFlags")
ENDPGMEXP

123
as400/compile.clp Normal file
View File

@@ -0,0 +1,123 @@
/******************************************************************************/
/* */
/* ZLIB */
/* */
/* Compile sources into modules and link them into a service program. */
/* */
/******************************************************************************/
PGM
/* Configuration adjustable parameters. */
DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10) +
VALUE('ZLIB') /* Source library. */
DCL VAR(&SRCFILE) TYPE(*CHAR) LEN(10) +
VALUE('SOURCES') /* Source member file. */
DCL VAR(&CTLFILE) TYPE(*CHAR) LEN(10) +
VALUE('TOOLS') /* Control member file. */
DCL VAR(&MODLIB) TYPE(*CHAR) LEN(10) +
VALUE('ZLIB') /* Module library. */
DCL VAR(&SRVLIB) TYPE(*CHAR) LEN(10) +
VALUE('LGPL') /* Service program library. */
DCL VAR(&CFLAGS) TYPE(*CHAR) +
VALUE('OPTIMIZE(40)') /* Compile options. */
/* Working storage. */
DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(300) /* Command length. */
DCL VAR(&CMD) TYPE(*CHAR) LEN(512)
/* Compile sources into modules. */
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/ADLER32) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/COMPRESS) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/CRC32) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/DEFLATE) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/GZIO) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/INFBACK) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/INFFAST) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/INFLATE) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/INFTREES) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/TREES) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/UNCOMPR) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT +
'/ZUTIL) SRCFILE(' *TCAT +
&SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT +
') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS)
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
/* Link modules into a service program. */
CRTSRVPGM SRVPGM(&SRVLIB/ZLIB) +
MODULE(&MODLIB/ADLER32 &MODLIB/COMPRESS +
&MODLIB/CRC32 &MODLIB/DEFLATE +
&MODLIB/GZIO &MODLIB/INFBACK +
&MODLIB/INFFAST &MODLIB/INFLATE +
&MODLIB/INFTREES &MODLIB/TREES +
&MODLIB/UNCOMPR &MODLIB/ZUTIL) +
SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) +
TEXT('ZLIB 1.2.0.7') TGTRLS(V4R4M0)
ENDPGM

111
as400/readme.txt Normal file
View File

@@ -0,0 +1,111 @@
ZLIB version 1.2.0.7 for AS400 installation instructions
I) From an AS400 *SAVF file:
1) Unpacking archive to an AS400 save file
On the AS400:
_ Create the ZLIB AS400 library:
CRTLIB LIB(ZLIB) TYPE(PROD) TEXT('ZLIB compression API library')
_ Create a work save file, for example:
CRTSAVF FILE(ZLIB/ZLIBSAVF)
On a PC connected to the target AS400:
_ Unpack the save file image to a PC file "ZLIBSAVF"
_ Upload this file into the save file on the AS400, for example
using ftp in BINARY mode.
2) Populating the ZLIB AS400 source library
On the AS400:
_ Extract the saved objects into the ZLIB AS400 library using:
RSTOBJ OBJ(*ALL) SAVLIB(ZLIB) DEV(*SAVF) SAVF(ZLIB/ZLIBSAVF) RSTLIB(ZLIB)
3) Customize installation:
_ Edit CL member ZLIB/TOOLS(COMPILE) and change parameters if needed,
according to the comments.
_ Compile this member with:
CRTCLPGM PGM(ZLIB/COMPILE) SRCFILE(ZLIB/TOOLS) SRCMBR(COMPILE)
4) Compile and generate the service program:
_ This can now be done by executing:
CALL PGM(ZLIB/COMPILE)
II) From the original source distribution:
1) On the AS400, create the source library:
CRTLIB LIB(ZLIB) TYPE(PROD) TEXT('ZLIB compression API library')
2) Create the source files:
CRTSRCPF FILE(ZLIB/SOURCES) RCDLEN(112) TEXT('ZLIB library modules')
CRTSRCPF FILE(ZLIB/H) RCDLEN(112) TEXT('ZLIB library includes')
CRTSRCPF FILE(ZLIB/TOOLS) RCDLEN(112) TEXT('ZLIB library control utilities')
3) From the machine hosting the distribution files, upload them (with
FTP in text mode, for example) according to the following table:
Original AS400 AS400 AS400 AS400
file file member type description
SOURCES Original ZLIB C subprogram sources
adler32.c ADLER32 C ZLIB - Compute the Adler-32 checksum of a dta strm
compress.c COMPRESS C ZLIB - Compress a memory buffer
crc32.c CRC32 C ZLIB - Compute the CRC-32 of a data stream
deflate.c DEFLATE C ZLIB - Compress data using the deflation algorithm
gzio.c GZIO C ZLIB - IO on .gz files
infback.c INFBACK C ZLIB - Inflate using a callback interface
inffast.c INFFAST C ZLIB - Fast proc. literals & length/distance pairs
inflate.c INFLATE C ZLIB - Interface to inflate modules
inftrees.c INFTREES C ZLIB - Generate Huffman trees for efficient decode
trees.c TREES C ZLIB - Output deflated data using Huffman coding
uncompr.c UNCOMPR C ZLIB - Decompress a memory buffer
zutil.c ZUTIL C ZLIB - Target dependent utility functions
H Original ZLIB C and ILE/RPG include files
crc32.h CRC32 C ZLIB - CRC32 tables
deflate.h DEFLATE C ZLIB - Internal compression state
inffast.h INFFAST C ZLIB - Header to use inffast.c
inffixed.h INFFIXED C ZLIB - Table for decoding fixed codes
inflate.h INFLATE C ZLIB - Internal inflate state definitions
inftrees.h INFTREES C ZLIB - Header to use inftrees.c
trees.h TREES C ZLIB - Created automatically with -DGEN_TREES_H
zconf.h ZCONF C ZLIB - Compression library configuration
zlib.h ZLIB C ZLIB - Compression library C user interface
as400/zlib.inc ZLIB.INC RPGLE ZLIB - Compression library ILE RPG user interface
zutil.h ZUTIL C ZLIB - Internal interface and configuration
TOOLS Building source software & AS/400 README
as400/bndsrc BNDSRC Entry point exportation list
as400/compile.clp COMPILE CLP Compile sources & generate service program
as400/readme.txt README TXT Installation instructions
4) Continue as in I)3).
Notes: For AS400 ILE RPG programmers, a /copy member defining the ZLIB
API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC).
Please read comments in this member for more information.
Remember that most foreign textual data are ASCII coded: this
implementation does not handle conversion from/to ASCII, so
text data code conversions must be done explicitely.
Always open zipped files in binary mode.

327
as400/zlib.inc Normal file
View File

@@ -0,0 +1,327 @@
* ZLIB.INC - Interface to the general purpose compression library
*
* ILE RPG400 version by Patrick Monnerat, DATASPHERE.
* Version 1.2.0.7
*
*
* WARNING:
* Procedures inflateInit(), inflateInit2(), deflateInit(),
* deflateInit2() and inflateBackInit() need to be called with
* two additional arguments:
* the package version string and the stream control structure.
* size. This is needed because RPG lacks some macro feature.
* Call these procedures as:
* inflateInit(...: ZLIB_VERSION: %size(z_stream))
*
/if not defined(ZLIB_H_)
/define ZLIB_H_
*
**************************************************************************
* Constants
**************************************************************************
*
D ZLIB_VERSION C '1.2.0.8' Header's version
D ZLIB_VERNUM C X'1208'
*
D Z_NO_FLUSH C 0
D Z_SYNC_FLUSH C 2
D Z_FULL_FLUSH C 3
D Z_FINISH C 4
D Z_BLOCK C 5
*
D Z_OK C 0
D Z_STREAM_END C 1
D Z_NEED_DICT C 2
D Z_ERRNO C -1
D Z_STREAM_ERROR C -2
D Z_DATA_ERROR C -3
D Z_MEM_ERROR C -4
D Z_BUF_ERROR C -5
DZ_VERSION_ERROR C -6
*
D Z_NO_COMPRESSION...
D C 0
D Z_BEST_SPEED C 1
D Z_BEST_COMPRESSION...
D C 9
D Z_DEFAULT_COMPRESSION...
D C -1
*
D Z_FILTERED C 1
D Z_HUFFMAN_ONLY C 2
D Z_RLE C 3
D Z_DEFAULT_STRATEGY...
D C 0
*
D Z_BINARY C 0
D Z_ASCII C 1
D Z_UNKNOWN C 2
*
D Z_DEFLATED C 8
*
D Z_NULL C 0
*
**************************************************************************
* Types
**************************************************************************
*
D z_streamp S * Stream struct ptr
D gzFile S * File pointer
D z_off_t S 10i 0 Stream offsets
*
**************************************************************************
* Structures
**************************************************************************
*
* The GZIP encode/decode stream support structure.
*
D z_stream DS align based(z_streamp)
D zs_next_in * Next input byte
D zs_avail_in 10U 0 Byte cnt at next_in
D zs_total_in 10U 0 Total bytes read
D zs_next_out * Output buffer ptr
D zs_avail_out 10U 0 Room left @ next_out
D zs_total_out 10U 0 Total bytes written
D zs_msg * Last errmsg or null
D zs_state * Internal state
D zs_zalloc * procptr Int. state allocator
D zs_free * procptr Int. state dealloc.
D zs_opaque * Private alloc. data
D zs_data_type 10i 0 ASC/BIN best guess
D zs_adler 10u 0 Uncompr. adler32 val
D 10U 0 Reserved
D 10U 0 Ptr. alignment
*
**************************************************************************
* Utility function prototypes
**************************************************************************
*
D compress PR 10I 0 extproc('compress')
D dest 32767 options(*varsize) Destination buffer
D destLen 10U 0 Destination length
D source 32767 const options(*varsize) Source buffer
D sourceLen 10u 0 value Source length
*
D compress2 PR 10I 0 extproc('compress2')
D dest 32767 options(*varsize) Destination buffer
D destLen 10U 0 Destination length
D source 32767 const options(*varsize) Source buffer
D sourceLen 10U 0 value Source length
D level 10I 0 value Compression level
*
D compressBound PR 10U 0 extproc('compressBound')
D sourceLen 10U 0 value
*
D uncompress PR 10I 0 extproc('uncompress')
D dest 32767 options(*varsize) Destination buffer
D destLen 10U 0 Destination length
D source 32767 const options(*varsize) Source buffer
D sourceLen 10U 0 value Source length
*
D gzopen PR extproc('gzopen')
D like(gzFile)
D path * value options(*string) File pathname
D mode * value options(*string) Open mode
*
D gzdopen PR extproc('gzdopen')
D like(gzFile)
D fd 10i 0 value File descriptor
D mode * value options(*string) Open mode
*
D gzsetparams PR 10I 0 extproc('gzsetparams')
D file value like(gzFile) File pointer
D level 10I 0 value
D strategy 10i 0 value
*
D gzread PR 10I 0 extproc('gzread')
D file value like(gzFile) File pointer
D buf 32767 options(*varsize) Buffer
D len 10u 0 value Buffer length
*
D gzwrite PR 10I 0 extproc('gzwrite')
D file value like(gzFile) File pointer
D buf 32767 const options(*varsize) Buffer
D len 10u 0 value Buffer length
*
D gzputs PR 10I 0 extproc('gzputs')
D file value like(gzFile) File pointer
D s * value options(*string) String to output
*
D gzgets PR * extproc('gzgets')
D file value like(gzFile) File pointer
D buf 32767 options(*varsize) Read buffer
D len 10i 0 value Buffer length
*
D gzflush PR 10i 0 extproc('gzflush')
D file value like(gzFile) File pointer
D flush 10I 0 value Type of flush
*
D gzseek PR extproc('gzseek')
D like(z_off_t)
D file value like(gzFile) File pointer
D offset value like(z_off_t) Offset
D whence 10i 0 value Origin
*
D gzrewind PR 10i 0 extproc('gzrewind')
D file value like(gzFile) File pointer
*
D gztell PR extproc('gztell')
D like(z_off_t)
D file value like(gzFile) File pointer
*
D gzeof PR 10i 0 extproc('gzeof')
D file value like(gzFile) File pointer
*
D gzclose PR 10i 0 extproc('gzclose')
D file value like(gzFile) File pointer
*
D gzerror PR * extproc('gzerror') Error string
D file value like(gzFile) File pointer
D errnum 10I 0 Error code
*
D gzclearerr PR extproc('gzclearerr')
D file value like(gzFile) File pointer
*
**************************************************************************
* Basic function prototypes
**************************************************************************
*
D zlibVersion PR * extproc('zlibVersion') Version string
*
D deflateInit PR 10I 0 extproc('deflateInit_') Init. compression
D strm like(z_stream) Compression stream
D level 10I 0 value Compression level
D version * value options(*string) Version string
D stream_size 10i 0 value Stream struct. size
*
D deflate PR 10I 0 extproc('deflate') Compress data
D strm like(z_stream) Compression stream
D flush 10I 0 value Flush type required
*
D deflateEnd PR 10I 0 extproc('deflateEnd') Termin. compression
D strm like(z_stream) Compression stream
*
D inflateInit PR 10I 0 extproc('inflateInit_') Init. expansion
D strm like(z_stream) Expansion stream
D version * value options(*string) Version string
D stream_size 10i 0 value Stream struct. size
*
D inflate PR 10I 0 extproc('inflate') Expand data
D strm like(z_stream) Expansion stream
D flush 10I 0 value Flush type required
*
D inflateEnd PR 10I 0 extproc('inflateEnd') Termin. expansion
D strm like(z_stream) Expansion stream
*
**************************************************************************
* Advanced function prototypes
**************************************************************************
*
D deflateInit2 PR 10I 0 extproc('deflateInit2_') Init. compression
D strm like(z_stream) Compression stream
D level 10I 0 value Compression level
D method 10I 0 value Compression method
D windowBits 10I 0 value log2(window size)
D memLevel 10I 0 value Mem/cmpress tradeoff
D strategy 10I 0 value Compression stategy
D version * value options(*string) Version string
D stream_size 10i 0 value Stream struct. size
*
D deflateSetDictionary...
D PR 10I 0 extproc('deflateSetDictionary') Init. dictionary
D strm like(z_stream) Compression stream
D dictionary 32767 const options(*varsize) Dictionary bytes
D dictLength 10U 0 value Dictionary length
*
D deflateCopy PR 10I 0 extproc('deflateCopy') Compress strm 2 strm
D dest like(z_stream) Destination stream
D source like(z_stream) Source stream
*
D deflateReset PR 10I 0 extproc('deflateReset') End and init. stream
D strm like(z_stream) Compression stream
*
D deflateParams PR 10I 0 extproc('deflateParams') Change level & strat
D strm like(z_stream) Compression stream
D level 10I 0 value Compression level
D strategy 10I 0 value Compression stategy
*
D deflateBound PR 10U 0 extproc('deflateBound') Change level & strat
D strm like(z_stream) Compression stream
D sourcelen 10U 0 value Compression level
*
D deflatePrime PR 10I 0 extproc('deflatePrime') Change level & strat
D strm like(z_stream) Compression stream
D bits 10I 0 value Number of bits to insert
D value 10I 0 value Bits to insert
*
D inflateInit2 PR 10I 0 extproc('inflateInit2_') Init. expansion
D strm like(z_stream) Expansion stream
D windowBits 10I 0 value log2(window size)
D version * value options(*string) Version string
D stream_size 10i 0 value Stream struct. size
*
D inflateSetDictionary...
D PR 10I 0 extproc('inflateSetDictionary') Init. dictionary
D strm like(z_stream) Expansion stream
D dictionary 32767 const options(*varsize) Dictionary bytes
D dictLength 10U 0 value Dictionary length
*
D inflateSync PR 10I 0 extproc('inflateSync') Sync. expansion
D strm like(z_stream) Expansion stream
*
D inflateCopy PR 10I 0 extproc('inflateCopy')
D dest like(z_stream) Destination stream
D source like(z_stream) Source stream
*
D inflateReset PR 10I 0 extproc('inflateReset') End and init. stream
D strm like(z_stream) Expansion stream
*
D inflateBackInit...
D PR 10I 0 extproc('inflateBackInit_')
D strm like(z_stream) Expansion stream
D windowBits 10I 0 value Log2(buffer size)
D window 32767 options(*varsize) Buffer
D version * value options(*string) Version string
D stream_size 10i 0 value Stream struct. size
*
D inflateBack PR 10I 0 extproc('inflateBack')
D strm like(z_stream) Expansion stream
D in * value procptr Input function
D in_desc * value Input descriptor
D out * value procptr Output function
D out_desc * value Output descriptor
*
D inflateBackEnd PR 10I 0 extproc('inflateBackEnd')
D strm like(z_stream) Expansion stream
*
D zlibCompileFlags...
D PR 10U 0 extproc('zlibCompileFlags')
*
**************************************************************************
* Checksum function prototypes
**************************************************************************
*
D adler32 PR 10U 0 extproc('adler32') New checksum
D adler 10U 0 value Old checksum
D buf 32767 const options(*varsize) Bytes to accumulate
D len 10U 0 value Buffer length
*
D crc32 PR 10U 0 extproc('crc32') New checksum
D crc 10U 0 value Old checksum
D buf 32767 const options(*varsize) Bytes to accumulate
D len 10U 0 value Buffer length
*
**************************************************************************
* Miscellaneous function prototypes
**************************************************************************
*
D zError PR * extproc('zError') Error string
D err 10I 0 value Error code
*
D inflateSyncPoint...
D PR 10I 0 extproc('inflateSyncPoint')
D strm like(z_stream) Expansion stream
*
D get_crc_table PR * extproc('get_crc_table') Ptr to ulongs
*
/endif

View File

@@ -1,6 +1,6 @@
/* compress.c -- compress a memory buffer /* compress.c -- compress a memory buffer
* Copyright (C) 1995-2002 Jean-loup Gailly. * Copyright (C) 1995-2002 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
*/ */
/* @(#) $Id$ */ /* @(#) $Id$ */

198
configure vendored
View File

@@ -20,14 +20,16 @@
LIBS=libz.a LIBS=libz.a
LDFLAGS="-L. ${LIBS}" LDFLAGS="-L. ${LIBS}"
SHAREDLIB=libz.so
VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h`
VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h`
AR=${AR-"ar rc"} AR=${AR-"ar rc"}
RANLIB=${RANLIB-"ranlib"} RANLIB=${RANLIB-"ranlib"}
prefix=${prefix-/usr/local} prefix=${prefix-/usr/local}
exec_prefix=${exec_prefix-'${prefix}'} exec_prefix=${exec_prefix-'${prefix}'}
libdir=${libdir-'${exec_prefix}/lib'} libdir=${libdir-'${exec_prefix}/lib'}
includedir=${includedir-'${prefix}/include'} includedir=${includedir-'${prefix}/include'}
mandir=${mandir-'${prefix}/share/man'}
shared_ext='.so' shared_ext='.so'
shared=0 shared=0
gcc=0 gcc=0
@@ -51,13 +53,10 @@ case "$1" in
-l* | --l*) libdir="$2"; shift; shift;; -l* | --l*) libdir="$2"; shift; shift;;
-i* | --i*) includedir="$2"; shift; shift;; -i* | --i*) includedir="$2"; shift; shift;;
-s* | --s*) shared=1; shift;; -s* | --s*) shared=1; shift;;
*) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;;
esac esac
done done
if [ $shared -eq 1 ]; then
LDFLAGS="-L. ${SHAREDLIB}"
fi
test=ztest$$ test=ztest$$
cat > $test.c <<EOF cat > $test.c <<EOF
extern int getchar(); extern int getchar();
@@ -78,11 +77,21 @@ if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then
CFLAGS="$cflags" CFLAGS="$cflags"
case `(uname -s || echo unknown) 2>/dev/null` in case `(uname -s || echo unknown) 2>/dev/null` in
Linux | linux) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; Linux | linux) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};;
QNX*) #This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 (alain.bonnefoy@icbt.com) CYGWIN* | Cygwin* | cygwin* )
LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};; EXE='.exe';;
QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
# (alain.bonnefoy@icbt.com)
LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};;
HP-UX*) LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} HP-UX*) LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}
shared_ext='.sl' shared_ext='.sl'
SHAREDLIB='libz.sl';; SHAREDLIB='libz.sl';;
Darwin*) shared_ext='.dylib'
SHAREDLIB=libz$shared_ext
SHAREDLIBV=libz.$VER$shared_ext
SHAREDLIBM=libz.$VER1$shared_ext
LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name /usr/lib/$SHAREDLIBV -compatibility_version $VER2 -current_version $VER"}
libdir='/usr/lib'
includedir='/usr/include';;
*) LDSHARED=${LDSHARED-"$cc -shared"};; *) LDSHARED=${LDSHARED-"$cc -shared"};;
esac esac
else else
@@ -90,76 +99,82 @@ else
CC=${CC-cc} CC=${CC-cc}
case `(uname -sr || echo unknown) 2>/dev/null` in case `(uname -sr || echo unknown) 2>/dev/null` in
HP-UX*) SFLAGS=${CFLAGS-"-O +z"} HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} # LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
LDSHARED=${LDSHARED-"ld -b"} LDSHARED=${LDSHARED-"ld -b"}
shared_ext='.sl' shared_ext='.sl'
SHAREDLIB='libz.sl';; SHAREDLIB='libz.sl';;
IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
CFLAGS=${CFLAGS-"-ansi -O2"} CFLAGS=${CFLAGS-"-ansi -O2"}
LDSHARED=${LDSHARED-"cc -shared"};; LDSHARED=${LDSHARED-"cc -shared"};;
OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
CFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"}
LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};; LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
OSF1*) SFLAGS=${CFLAGS-"-O -std1"} OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
CFLAGS=${CFLAGS-"-O -std1"} CFLAGS=${CFLAGS-"-O -std1"}
LDSHARED=${LDSHARED-"cc -shared"};; LDSHARED=${LDSHARED-"cc -shared"};;
QNX*) SFLAGS=${CFLAGS-"-4 -O"} QNX*) SFLAGS=${CFLAGS-"-4 -O"}
CFLAGS=${CFLAGS-"-4 -O"} CFLAGS=${CFLAGS-"-4 -O"}
LDSHARED=${LDSHARED-"cc"} LDSHARED=${LDSHARED-"cc"}
RANLIB=${RANLIB-"true"} RANLIB=${RANLIB-"true"}
AR="cc -A";; AR="cc -A";;
SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
CFLAGS=${CFLAGS-"-O3"} CFLAGS=${CFLAGS-"-O3"}
LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};; LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."}
CFLAGS=${CFLAGS-"-fast -xcg89"} CFLAGS=${CFLAGS-"-fast -xcg89"}
LDSHARED=${LDSHARED-"cc -G"};; LDSHARED=${LDSHARED-"cc -G"};;
SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
CFLAGS=${CFLAGS-"-O2"} CFLAGS=${CFLAGS-"-O2"}
LDSHARED=${LDSHARED-"ld"};; LDSHARED=${LDSHARED-"ld"};;
UNIX_System_V\ 4.2.0) UNIX_System_V\ 4.2.0)
SFLAGS=${CFLAGS-"-KPIC -O"} SFLAGS=${CFLAGS-"-KPIC -O"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"cc -G"};; LDSHARED=${LDSHARED-"cc -G"};;
UNIX_SV\ 4.2MP) UNIX_SV\ 4.2MP)
SFLAGS=${CFLAGS-"-Kconform_pic -O"} SFLAGS=${CFLAGS-"-Kconform_pic -O"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"cc -G"};; LDSHARED=${LDSHARED-"cc -G"};;
OpenUNIX\ 5) OpenUNIX\ 5)
SFLAGS=${CFLAGS-"-KPIC -O"} SFLAGS=${CFLAGS-"-KPIC -O"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"cc -G"};; LDSHARED=${LDSHARED-"cc -G"};;
AIX*) # Courtesy of dbakker@arrayasolutions.com AIX*) # Courtesy of dbakker@arrayasolutions.com
SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
LDSHARED=${LDSHARED-"xlc -G"};; LDSHARED=${LDSHARED-"xlc -G"};;
# send working options for other systems to support@gzip.org # send working options for other systems to support@gzip.org
*) SFLAGS=${CFLAGS-"-O"} *) SFLAGS=${CFLAGS-"-O"}
CFLAGS=${CFLAGS-"-O"} CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"cc -shared"};; LDSHARED=${LDSHARED-"cc -shared"};;
esac esac
fi fi
SHAREDLIB=${SHAREDLIB-"libz$shared_ext"}
SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"}
SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"}
if test $shared -eq 1; then if test $shared -eq 1; then
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$shared_ext $test.o) 2>&1`" = ""; then test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then
CFLAGS="$SFLAGS" CFLAGS="$SFLAGS"
LIBS="$SHAREDLIB.$VER" LIBS="$SHAREDLIBV"
echo Building shared library $SHAREDLIB.$VER with $CC. echo Building shared library $SHAREDLIBV with $CC.
elif test -z "$old_cc" -a -z "$old_cflags"; then elif test -z "$old_cc" -a -z "$old_cflags"; then
echo No shared library suppport. echo No shared library support.
shared=0; shared=0;
else else
echo 'No shared library suppport; try without defining CC and CFLAGS' echo 'No shared library support; try without defining CC and CFLAGS'
shared=0; shared=0;
fi fi
fi fi
if test $shared -eq 0; then if test $shared -eq 0; then
LDSHARED="$CC" LDSHARED="$CC"
echo Building static library $LIBS version $VER with $CC. echo Building static library $LIBS version $VER with $CC.
else
LDFLAGS="-L. ${SHAREDLIBV}"
fi fi
cat > $test.c <<EOF cat > $test.c <<EOF
@@ -176,13 +191,10 @@ fi
cat > $test.c <<EOF cat > $test.c <<EOF
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdarg.h>
#include "zconf.h"
#if (defined(__MSDOS__) || defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)) && !defined(STDC) int main()
# define STDC
#endif
int main()
{ {
#ifndef STDC #ifndef STDC
choke me choke me
@@ -193,7 +205,7 @@ int main()
EOF EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
echo "Checking whether to use vsnprintf() or snprintf()... using vsnprintf()" echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()"
cat > $test.c <<EOF cat > $test.c <<EOF
#include <stdio.h> #include <stdio.h>
@@ -215,8 +227,8 @@ int main()
return (mytest("Hello%d\n", 1)); return (mytest("Hello%d\n", 1));
} }
EOF EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then
echo "Checking for vsnprintf() in stdio.h... Yes." echo "Checking for vsnprintf() in stdio.h... Yes."
cat >$test.c <<EOF cat >$test.c <<EOF
@@ -225,14 +237,14 @@ EOF
int mytest(char *fmt, ...) int mytest(char *fmt, ...)
{ {
int i; int n;
char buf[20]; char buf[20];
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
i = vsnprintf(buf, sizeof(buf), fmt, ap); n = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
return 0; return n;
} }
int main() int main()
@@ -263,17 +275,17 @@ EOF
int mytest(char *fmt, ...) int mytest(char *fmt, ...)
{ {
int i; int n;
char buf[20]; char buf[20];
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
i = vsprintf(buf, fmt, ap); n = vsprintf(buf, fmt, ap);
va_end(ap); va_end(ap);
return 0; return n;
} }
int main() int main()
{ {
return (mytest("Hello%d\n", 1)); return (mytest("Hello%d\n", 1));
} }
@@ -290,13 +302,12 @@ EOF
fi fi
fi fi
else else
echo "Checking whether to use vsnprintf() or snprintf()... using snprintf()" echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()"
cat >$test.c <<EOF cat >$test.c <<EOF
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
int mytest() int mytest()
{ {
char buf[20]; char buf[20];
@@ -304,29 +315,26 @@ int mytest()
return 0; return 0;
} }
int main() int main()
{ {
return (mytest()); return (mytest());
} }
EOF EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then
echo "Checking for snprintf() in stdio.h... Yes." echo "Checking for snprintf() in stdio.h... Yes."
cat >$test.c <<EOF cat >$test.c <<EOF
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
int mytest(char *fmt, ...) int mytest()
{ {
int i;
char buf[20]; char buf[20];
i = snprintf(buf, sizeof(buf), "%s", "foo"); return snprintf(buf, sizeof(buf), "%s", "foo");
return 0;
} }
int main() int main()
{ {
return (mytest()); return (mytest());
} }
@@ -350,18 +358,15 @@ EOF
cat >$test.c <<EOF cat >$test.c <<EOF
#include <stdio.h> #include <stdio.h>
#include <stdarg.h>
int mytest(char *fmt, ...) int mytest()
{ {
int i;
char buf[20]; char buf[20];
i = sprintf(buf, "%s", "foo"); return sprintf(buf, "%s", "foo");
return 0;
} }
int main() int main()
{ {
return (mytest()); return (mytest());
} }
@@ -384,9 +389,9 @@ cat >$test.c <<EOF
int main() { return 0; } int main() { return 0; }
EOF EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
echo "Checking for errno.h... Yes." echo "Checking for errno.h... Yes."
else else
echo "Checking for errno.h... No." echo "Checking for errno.h... No."
CFLAGS="$CFLAGS -DNO_ERRNO_H" CFLAGS="$CFLAGS -DNO_ERRNO_H"
fi fi
@@ -395,7 +400,7 @@ cat > $test.c <<EOF
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
caddr_t hello() { caddr_t hello() {
return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0); return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0);
} }
EOF EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
@@ -416,22 +421,25 @@ case $CFLAGS in
fi;; fi;;
esac esac
rm -f $test.[co] $test$shared_ext rm -f $test.[co] $test $test$shared_ext
# udpate Makefile # udpate Makefile
sed < Makefile.in " sed < Makefile.in "
/^CC *=/s%=.*%=$CC% /^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s%=.*%=$CFLAGS% /^CFLAGS *=/s#=.*#=$CFLAGS#
/^CPP *=/s%=.*%=$CPP% /^CPP *=/s#=.*#=$CPP#
/^LDSHARED *=/s%=.*%=$LDSHARED% /^LDSHARED *=/s#=.*#=$LDSHARED#
/^LIBS *=/s%=.*%=$LIBS% /^LIBS *=/s#=.*#=$LIBS#
/^SHAREDLIB *=/s%=.*%=$SHAREDLIB% /^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
/^AR *=/s%=.*%=$AR% /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
/^RANLIB *=/s%=.*%=$RANLIB% /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
/^VER *=/s%=.*%=$VER% /^AR *=/s#=.*#=$AR#
/^prefix *=/s%=.*%=$prefix% /^RANLIB *=/s#=.*#=$RANLIB#
/^exec_prefix *=/s%=.*%=$exec_prefix% /^EXE *=/s#=.*#=$EXE#
/^libdir *=/s%=.*%=$libdir% /^prefix *=/s#=.*#=$prefix#
/^includedir *=/s%=.*%=$includedir% /^exec_prefix *=/s#=.*#=$exec_prefix#
/^LDFLAGS *=/s%=.*%=$LDFLAGS% /^libdir *=/s#=.*#=$libdir#
/^includedir *=/s#=.*#=$includedir#
/^mandir *=/s#=.*#=$mandir#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
" > Makefile " > Makefile

View File

@@ -4,44 +4,67 @@ Use at your own risk. Please contact the authors of the contributions
for help about these, not the zlib authors. Thanks. for help about these, not the zlib authors. Thanks.
asm386/ by Gilles Vollant <info@winimage.com> ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
386 asm code replacing longest_match(), for Visual C++ 4.2 and ML 6.11c Support for Ada
See http://zlib-ada.sourceforge.net/
asm586/ and asm686/ by Brian Raiter <breadbox@muppetlabs.com> asm586/
asm code for Pentium and Pentium Pro asm686/ by Brian Raiter <breadbox@muppetlabs.com>
asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
See http://www.muppetlabs.com/~breadbox/software/assembly.html See http://www.muppetlabs.com/~breadbox/software/assembly.html
blast/ by Mark Adler <madler@alumni.caltech.edu> blast/ by Mark Adler <madler@alumni.caltech.edu>
Decompressor for output of PKWare Data Compression Library (DCL) Decompressor for output of PKWare Data Compression Library (DCL)
delphi/ by Bob Dellaca <bobdl@xtra.co.nz> delphi/ by Cosmin Truta <cosmint@cs.ubbcluj.ro>
Support for Delphi Support for Delphi and C++ Builder
delphi2/ by Davide Moretti <dave@rimini.com> gzappend/ by Mark Adler <madler@alumni.caltech.edu>
Another support for C++Builder and Delphi append to a gzip file -- illustrates the use of Z_BLOCK
infback9/ by Mark Adler <madler@alumni.caltech.edu>
Unsupported diffs to infback to decode the deflate64 format
inflate86/ by Chris Anderson <christop@charm.net> inflate86/ by Chris Anderson <christop@charm.net>
Tuned x86 gcc asm code to replace inflate_fast() Tuned x86 gcc asm code to replace inflate_fast()
minizip/ by Gilles Vollant <info@winimage.com>
Mini zip and unzip based on zlib
See http://www.winimage.com/zLibDll/unzip.html
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
A C++ I/O streams interface to the zlib gz* functions A C++ I/O streams interface to the zlib gz* functions
iostream2/ by Tyge L<>vset <Tyge.Lovset@cmr.no> iostream2/ by Tyge L<>vset <Tyge.Lovset@cmr.no>
Another C++ I/O streams interface Another C++ I/O streams interface
testzlib/ by Gilles Vollant <info@winimage.com> iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
Example of the use of zlib and Kevin Ruland <kevin@rodin.wustl.edu>
Yet another C++ I/O streams interface
masm686/ by Dan Higdon <hdan@kinesoft.com>
and Chuck Walbourn <chuckw@kinesoft.com>
asm code for Pentium Pro/PII, using the MASM syntax
masmx86/ by Gilles Vollant <info@winimage.com>
x86 asm code to replace longest_match() and inflate_fast(),
for Visual C++ and MASM
minizip/ by Gilles Vollant <info@winimage.com>
Mini zip and unzip based on zlib
See http://www.winimage.com/zLibDll/unzip.html
pascal/ by Bob Dellaca <bobdl@xtra.co.nz> et al.
Support for Pascal
puff/ by Mark Adler <madler@alumni.caltech.edu>
Small, low memory usage inflate. Also serves to provide an
unambiguous description of the deflate format.
testzlib/ by Gilles Vollant <info@winimage.com>
Example of the use of zlib
untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es> untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
A very simple tar.gz file extractor using zlib A very simple tar.gz file extractor using zlib
visual-basic.txt by Carlos Rios <c_rios@sonda.cl> visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
How to use compress(), uncompress() and the gz* functions from VB. How to use compress(), uncompress() and the gz* functions from VB
vstudio/ by Gilles Vollant <info@winimage.com> vstudio/ by Gilles Vollant <info@winimage.com>
Building zlib DLL with Visual Studio .NET Building zlib with Visual Studio .NET
Includes x86 inffast.asm for MASM

153
contrib/ada/mtest.adb Normal file
View File

@@ -0,0 +1,153 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- Continuous test for ZLib multithreading. If the test is fail
-- Wou should provide thread safe allocation routines for the Z_Stream.
--
-- $Id: mtest.adb,v 1.2 2003/08/12 12:11:05 vagul Exp $
with ZLib;
with Ada.Streams;
with Ada.Numerics.Discrete_Random;
with Ada.Text_IO;
with Ada.Exceptions;
with Ada.Task_Identification;
procedure MTest is
use Ada.Streams;
use ZLib;
Stop : Boolean := False;
pragma Atomic (Stop);
subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
package Random_Elements is
new Ada.Numerics.Discrete_Random (Visible_Symbols);
task type Test_Task;
task body Test_Task is
Buffer : Stream_Element_Array (1 .. 100_000);
Gen : Random_Elements.Generator;
Buffer_First : Stream_Element_Offset;
Compare_First : Stream_Element_Offset;
Deflate : Filter_Type;
Inflate : Filter_Type;
procedure Further (Item : in Stream_Element_Array);
procedure Read_Buffer
(Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
-------------
-- Further --
-------------
procedure Further (Item : in Stream_Element_Array) is
procedure Compare (Item : in Stream_Element_Array);
-------------
-- Compare --
-------------
procedure Compare (Item : in Stream_Element_Array) is
Next_First : Stream_Element_Offset := Compare_First + Item'Length;
begin
if Buffer (Compare_First .. Next_First - 1) /= Item then
raise Program_Error;
end if;
Compare_First := Next_First;
end Compare;
procedure Compare_Write is new ZLib.Write (Write => Compare);
begin
Compare_Write (Inflate, Item, No_Flush);
end Further;
-----------------
-- Read_Buffer --
-----------------
procedure Read_Buffer
(Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset)
is
Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First;
Next_First : Stream_Element_Offset;
begin
if Item'Length <= Buff_Diff then
Last := Item'Last;
Next_First := Buffer_First + Item'Length;
Item := Buffer (Buffer_First .. Next_First - 1);
Buffer_First := Next_First;
else
Last := Item'First + Buff_Diff;
Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
Buffer_First := Buffer'Last + 1;
end if;
end Read_Buffer;
procedure Translate is new Generic_Translate
(Data_In => Read_Buffer,
Data_Out => Further);
begin
Random_Elements.Reset (Gen);
Buffer := (others => 20);
Main : loop
for J in Buffer'Range loop
Buffer (J) := Random_Elements.Random (Gen);
Deflate_Init (Deflate);
Inflate_Init (Inflate);
Buffer_First := Buffer'First;
Compare_First := Buffer'First;
Translate (Deflate);
if Compare_First /= Buffer'Last + 1 then
raise Program_Error;
end if;
Ada.Text_IO.Put_Line
(Ada.Task_Identification.Image
(Ada.Task_Identification.Current_Task)
& Stream_Element_Offset'Image (J)
& ZLib.Count'Image (Total_Out (Deflate)));
Close (Deflate);
Close (Inflate);
exit Main when Stop;
end loop;
end loop Main;
exception
when E : others =>
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
Stop := True;
end Test_Task;
Test : array (1 .. 4) of Test_Task;
pragma Unreferenced (Test);
begin
null;
end MTest;

151
contrib/ada/read.adb Normal file
View File

@@ -0,0 +1,151 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: read.adb,v 1.7 2003/08/12 12:12:35 vagul Exp $
-- Test/demo program for the generic read interface.
with Ada.Numerics.Discrete_Random;
with Ada.Streams;
with Ada.Text_IO;
with ZLib;
procedure Read is
use Ada.Streams;
------------------------------------
-- Test configuration parameters --
------------------------------------
File_Size : Stream_Element_Offset := 100_000;
Continuous : constant Boolean := False;
-- If this constant is True, the test would be repeated again and again,
-- with increment File_Size for every iteration.
Header : constant ZLib.Header_Type := ZLib.Default;
-- Do not use Header other than Default in ZLib versions 1.1.4 and older.
Init_Random : constant := 8;
-- We are using the same random sequence, in case of we catch bug,
-- so we would be able to reproduce it.
-- End --
Pack_Size : Stream_Element_Offset;
Offset : Stream_Element_Offset;
Filter : ZLib.Filter_Type;
subtype Visible_Symbols
is Stream_Element range 16#20# .. 16#7E#;
package Random_Elements is new
Ada.Numerics.Discrete_Random (Visible_Symbols);
Gen : Random_Elements.Generator;
Period : constant Stream_Element_Offset := 200;
-- Period constant variable for random generator not to be very random.
-- Bigger period, harder random.
Read_Buffer : Stream_Element_Array (1 .. 2048);
Read_First : Stream_Element_Offset;
Read_Last : Stream_Element_Offset;
procedure Reset;
procedure Read
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- this procedure is for generic instantiation of
-- ZLib.Read
-- reading data from the File_In.
procedure Read is new ZLib.Read (Read, Read_Buffer, Read_First, Read_Last);
----------
-- Read --
----------
procedure Read
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset) is
begin
Last := Stream_Element_Offset'Min
(Item'Last,
Item'First + File_Size - Offset);
for J in Item'First .. Last loop
if J < Item'First + Period then
Item (J) := Random_Elements.Random (Gen);
else
Item (J) := Item (J - Period);
end if;
Offset := Offset + 1;
end loop;
end Read;
-----------
-- Reset --
-----------
procedure Reset is
begin
Random_Elements.Reset (Gen, Init_Random);
Pack_Size := 0;
Offset := 1;
Read_First := Read_Buffer'Last + 1;
end Reset;
begin
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
loop
for Level in ZLib.Compression_Level'Range loop
Ada.Text_IO.Put ("Level ="
& ZLib.Compression_Level'Image (Level));
-- Deflate using generic instantiation.
ZLib.Deflate_Init
(Filter,
Level,
Header => Header);
Reset;
Ada.Text_IO.Put
(Stream_Element_Offset'Image (File_Size) & " ->");
loop
declare
Buffer : Stream_Element_Array (1 .. 1024);
Last : Stream_Element_Offset;
begin
Read (Filter, Buffer, Last);
Pack_Size := Pack_Size + Last - Buffer'First + 1;
exit when Last < Buffer'Last;
end;
end loop;
Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
ZLib.Close (Filter);
end loop;
exit when not Continuous;
File_Size := File_Size + 1;
end loop;
end Read;

52
contrib/ada/readme.txt Normal file
View File

@@ -0,0 +1,52 @@
ZLib for Ada thick binding (ZLib.Ada)
Release 1.2
ZLib.Ada is a thick binding interface to the popular ZLib data
compression library, available at http://www.gzip.org/zlib/.
It provides Ada-style access to the ZLib C library.
Here are the main changes since ZLib.Ada 1.1:
- The default header type has a name "Default" now. Auto is used only for
automatic GZip/ZLib header detection.
- Added test for multitasking mtest.adb.
- Added GNAT project file zlib.gpr.
How to build ZLib.Ada under GNAT
You should have the ZLib library already build on your computer, before
building ZLib.Ada. Make the directory of ZLib.Ada sources current and
issue the command:
gnatmake test -largs -L<directory where libz.a is> -lz
Or use the GNAT project file build for GNAT 3.15 or later:
gnatmake -Pzlib.gpr -L<directory where libz.a is>
How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
1. Make a project with all *.ads and *.adb files from the distribution.
2. Build the libz.a library from the ZLib C sources.
3. Rename libz.a to z.lib.
4. Add the library z.lib to the project.
5. Add the libc.lib library from the ObjectAda distribution to the project.
6. Build the executable using test.adb as a main procedure.
How to use ZLib.Ada
The source files test.adb and read.adb are small demo programs that show
the main functionality of ZLib.Ada.
The routines from the package specifications are commented.
Homepage: http://zlib-ada.sourceforge.net/
Author: Dmitriy Anisimkov <anisimkov@yahoo.com>

463
contrib/ada/test.adb Normal file
View File

@@ -0,0 +1,463 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
-- The program has a few aims.
-- 1. Test ZLib.Ada95 thick binding functionality.
-- 2. Show the example of use main functionality of the ZLib.Ada95 binding.
-- 3. Build this program automatically compile all ZLib.Ada95 packages under
-- GNAT Ada95 compiler.
with ZLib.Streams;
with Ada.Streams.Stream_IO;
with Ada.Numerics.Discrete_Random;
with Ada.Text_IO;
with Ada.Calendar;
procedure Test is
use Ada.Streams;
use Stream_IO;
------------------------------------
-- Test configuration parameters --
------------------------------------
File_Size : Count := 100_000;
Continuous : constant Boolean := False;
Header : constant ZLib.Header_Type := ZLib.Default;
-- ZLib.None;
-- ZLib.Auto;
-- ZLib.GZip;
-- Do not use Header other then Default in ZLib versions 1.1.4
-- and older.
Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
Init_Random : constant := 10;
-- End --
In_File_Name : constant String := "testzlib.in";
-- Name of the input file
Z_File_Name : constant String := "testzlib.zlb";
-- Name of the compressed file.
Out_File_Name : constant String := "testzlib.out";
-- Name of the decompressed file.
File_In : File_Type;
File_Out : File_Type;
File_Back : File_Type;
File_Z : ZLib.Streams.Stream_Type;
Filter : ZLib.Filter_Type;
Time_Stamp : Ada.Calendar.Time;
procedure Generate_File;
-- Generate file of spetsified size with some random data.
-- The random data is repeatable, for the good compression.
procedure Compare_Streams
(Left, Right : in out Root_Stream_Type'Class);
-- The procedure compearing data in 2 streams.
-- It is for compare data before and after compression/decompression.
procedure Compare_Files (Left, Right : String);
-- Compare files. Based on the Compare_Streams.
procedure Copy_Streams
(Source, Target : in out Root_Stream_Type'Class;
Buffer_Size : in Stream_Element_Offset := 1024);
-- Copying data from one stream to another. It is for test stream
-- interface of the library.
procedure Data_In
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- this procedure is for generic instantiation of
-- ZLib.Generic_Translate.
-- reading data from the File_In.
procedure Data_Out (Item : in Stream_Element_Array);
-- this procedure is for generic instantiation of
-- ZLib.Generic_Translate.
-- writing data to the File_Out.
procedure Stamp;
-- Store the timestamp to the local variable.
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
-- Print the time statistic with the message.
procedure Translate is new ZLib.Generic_Translate
(Data_In => Data_In,
Data_Out => Data_Out);
-- This procedure is moving data from File_In to File_Out
-- with compression or decompression, depend on initialization of
-- Filter parameter.
-------------------
-- Compare_Files --
-------------------
procedure Compare_Files (Left, Right : String) is
Left_File, Right_File : File_Type;
begin
Open (Left_File, In_File, Left);
Open (Right_File, In_File, Right);
Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
Close (Left_File);
Close (Right_File);
end Compare_Files;
---------------------
-- Compare_Streams --
---------------------
procedure Compare_Streams
(Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
is
Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
Left_Last, Right_Last : Stream_Element_Offset;
begin
loop
Read (Left, Left_Buffer, Left_Last);
Read (Right, Right_Buffer, Right_Last);
if Left_Last /= Right_Last then
Ada.Text_IO.Put_Line ("Compare error :"
& Stream_Element_Offset'Image (Left_Last)
& " /= "
& Stream_Element_Offset'Image (Right_Last));
raise Constraint_Error;
elsif Left_Buffer (0 .. Left_Last)
/= Right_Buffer (0 .. Right_Last)
then
Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
raise Constraint_Error;
end if;
exit when Left_Last < Left_Buffer'Last;
end loop;
end Compare_Streams;
------------------
-- Copy_Streams --
------------------
procedure Copy_Streams
(Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
Buffer_Size : in Stream_Element_Offset := 1024)
is
Buffer : Stream_Element_Array (1 .. Buffer_Size);
Last : Stream_Element_Offset;
begin
loop
Read (Source, Buffer, Last);
Write (Target, Buffer (1 .. Last));
exit when Last < Buffer'Last;
end loop;
end Copy_Streams;
-------------
-- Data_In --
-------------
procedure Data_In
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset) is
begin
Read (File_In, Item, Last);
end Data_In;
--------------
-- Data_Out --
--------------
procedure Data_Out (Item : in Stream_Element_Array) is
begin
Write (File_Out, Item);
end Data_Out;
-------------------
-- Generate_File --
-------------------
procedure Generate_File is
subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
package Random_Elements is
new Ada.Numerics.Discrete_Random (Visible_Symbols);
Gen : Random_Elements.Generator;
Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
Buffer_Count : constant Count := File_Size / Buffer'Length;
-- Number of same buffers in the packet.
Density : constant Count := 30; -- from 0 to Buffer'Length - 2;
procedure Fill_Buffer (J, D : in Count);
-- Change the part of the buffer.
-----------------
-- Fill_Buffer --
-----------------
procedure Fill_Buffer (J, D : in Count) is
begin
for K in 0 .. D loop
Buffer
(Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
:= Random_Elements.Random (Gen);
end loop;
end Fill_Buffer;
begin
Random_Elements.Reset (Gen, Init_Random);
Create (File_In, Out_File, In_File_Name);
Fill_Buffer (1, Buffer'Length - 2);
for J in 1 .. Buffer_Count loop
Write (File_In, Buffer);
Fill_Buffer (J, Density);
end loop;
-- fill remain size.
Write
(File_In,
Buffer
(1 .. Stream_Element_Offset
(File_Size - Buffer'Length * Buffer_Count)));
Flush (File_In);
Close (File_In);
end Generate_File;
---------------------
-- Print_Statistic --
---------------------
procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
use Ada.Calendar;
use Ada.Text_IO;
package Count_IO is new Integer_IO (ZLib.Count);
Curr_Dur : Duration := Clock - Time_Stamp;
begin
Put (Msg);
Set_Col (20);
Ada.Text_IO.Put ("size =");
Count_IO.Put
(Data_Size,
Width => Stream_IO.Count'Image (File_Size)'Length);
Put_Line (" duration =" & Duration'Image (Curr_Dur));
end Print_Statistic;
-----------
-- Stamp --
-----------
procedure Stamp is
begin
Time_Stamp := Ada.Calendar.Clock;
end Stamp;
begin
Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
loop
Generate_File;
for Level in ZLib.Compression_Level'Range loop
Ada.Text_IO.Put_Line ("Level ="
& ZLib.Compression_Level'Image (Level));
-- Test generic interface.
Open (File_In, In_File, In_File_Name);
Create (File_Out, Out_File, Z_File_Name);
Stamp;
-- Deflate using generic instantiation.
ZLib.Deflate_Init
(Filter => Filter,
Level => Level,
Strategy => Strategy,
Header => Header);
Translate (Filter);
Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
ZLib.Close (Filter);
Close (File_In);
Close (File_Out);
Open (File_In, In_File, Z_File_Name);
Create (File_Out, Out_File, Out_File_Name);
Stamp;
-- Inflate using generic instantiation.
ZLib.Inflate_Init (Filter, Header => Header);
Translate (Filter);
Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
ZLib.Close (Filter);
Close (File_In);
Close (File_Out);
Compare_Files (In_File_Name, Out_File_Name);
-- Test stream interface.
-- Compress to the back stream.
Open (File_In, In_File, In_File_Name);
Create (File_Back, Out_File, Z_File_Name);
Stamp;
ZLib.Streams.Create
(Stream => File_Z,
Mode => ZLib.Streams.Out_Stream,
Back => ZLib.Streams.Stream_Access
(Stream (File_Back)),
Back_Compressed => True,
Level => Level,
Strategy => Strategy,
Header => Header);
Copy_Streams
(Source => Stream (File_In).all,
Target => File_Z);
-- Flushing internal buffers to the back stream.
ZLib.Streams.Flush (File_Z, ZLib.Finish);
Print_Statistic ("Write compress",
ZLib.Streams.Write_Total_Out (File_Z));
ZLib.Streams.Close (File_Z);
Close (File_In);
Close (File_Back);
-- Compare reading from original file and from
-- decompression stream.
Open (File_In, In_File, In_File_Name);
Open (File_Back, In_File, Z_File_Name);
ZLib.Streams.Create
(Stream => File_Z,
Mode => ZLib.Streams.In_Stream,
Back => ZLib.Streams.Stream_Access
(Stream (File_Back)),
Back_Compressed => True,
Header => Header);
Stamp;
Compare_Streams (Stream (File_In).all, File_Z);
Print_Statistic ("Read decompress",
ZLib.Streams.Read_Total_Out (File_Z));
ZLib.Streams.Close (File_Z);
Close (File_In);
Close (File_Back);
-- Compress by reading from compression stream.
Open (File_Back, In_File, In_File_Name);
Create (File_Out, Out_File, Z_File_Name);
ZLib.Streams.Create
(Stream => File_Z,
Mode => ZLib.Streams.In_Stream,
Back => ZLib.Streams.Stream_Access
(Stream (File_Back)),
Back_Compressed => False,
Level => Level,
Strategy => Strategy,
Header => Header);
Stamp;
Copy_Streams
(Source => File_Z,
Target => Stream (File_Out).all);
Print_Statistic ("Read compress",
ZLib.Streams.Read_Total_Out (File_Z));
ZLib.Streams.Close (File_Z);
Close (File_Out);
Close (File_Back);
-- Decompress to decompression stream.
Open (File_In, In_File, Z_File_Name);
Create (File_Back, Out_File, Out_File_Name);
ZLib.Streams.Create
(Stream => File_Z,
Mode => ZLib.Streams.Out_Stream,
Back => ZLib.Streams.Stream_Access
(Stream (File_Back)),
Back_Compressed => False,
Header => Header);
Stamp;
Copy_Streams
(Source => Stream (File_In).all,
Target => File_Z);
Print_Statistic ("Write decompress",
ZLib.Streams.Write_Total_Out (File_Z));
ZLib.Streams.Close (File_Z);
Close (File_In);
Close (File_Back);
Compare_Files (In_File_Name, Out_File_Name);
end loop;
Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
exit when not Continuous;
File_Size := File_Size + 1;
end loop;
end Test;

View File

@@ -0,0 +1,215 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: zlib-streams.adb,v 1.9 2003/08/12 13:15:31 vagul Exp $
with Ada.Unchecked_Deallocation;
package body ZLib.Streams is
-----------
-- Close --
-----------
procedure Close (Stream : in out Stream_Type) is
procedure Free is new Ada.Unchecked_Deallocation
(Stream_Element_Array, Buffer_Access);
begin
if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
-- We should flush the data written by the writer.
Flush (Stream, Finish);
Close (Stream.Writer);
end if;
if Stream.Mode = In_Stream or Stream.Mode = Duplex then
Close (Stream.Reader);
Free (Stream.Buffer);
end if;
end Close;
------------
-- Create --
------------
procedure Create
(Stream : out Stream_Type;
Mode : in Stream_Mode;
Back : in Stream_Access;
Back_Compressed : in Boolean;
Level : in Compression_Level := Default_Compression;
Strategy : in Strategy_Type := Default_Strategy;
Header : in Header_Type := Default;
Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
:= Default_Buffer_Size;
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
:= Default_Buffer_Size)
is
subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
procedure Init_Filter
(Filter : in out Filter_Type;
Compress : in Boolean);
-----------------
-- Init_Filter --
-----------------
procedure Init_Filter
(Filter : in out Filter_Type;
Compress : in Boolean) is
begin
if Compress then
Deflate_Init
(Filter, Level, Strategy, Header => Header);
else
Inflate_Init (Filter, Header => Header);
end if;
end Init_Filter;
begin
Stream.Back := Back;
Stream.Mode := Mode;
if Mode = Out_Stream or Mode = Duplex then
Init_Filter (Stream.Writer, Back_Compressed);
Stream.Buffer_Size := Write_Buffer_Size;
else
Stream.Buffer_Size := 0;
end if;
if Mode = In_Stream or Mode = Duplex then
Init_Filter (Stream.Reader, not Back_Compressed);
Stream.Buffer := new Buffer_Subtype;
Stream.Rest_First := Stream.Buffer'Last + 1;
end if;
end Create;
-----------
-- Flush --
-----------
procedure Flush
(Stream : in out Stream_Type;
Mode : in Flush_Mode := Sync_Flush)
is
Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
Last : Stream_Element_Offset;
begin
loop
Flush (Stream.Writer, Buffer, Last, Mode);
Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
exit when Last < Buffer'Last;
end loop;
end Flush;
----------
-- Read --
----------
procedure Read
(Stream : in out Stream_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset)
is
procedure Read
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset);
----------
-- Read --
----------
procedure Read
(Item : out Stream_Element_Array;
Last : out Stream_Element_Offset) is
begin
Ada.Streams.Read (Stream.Back.all, Item, Last);
end Read;
procedure Read is new ZLib.Read
(Read => Read,
Buffer => Stream.Buffer.all,
Rest_First => Stream.Rest_First,
Rest_Last => Stream.Rest_Last);
begin
Read (Stream.Reader, Item, Last);
end Read;
-------------------
-- Read_Total_In --
-------------------
function Read_Total_In (Stream : in Stream_Type) return Count is
begin
return Total_In (Stream.Reader);
end Read_Total_In;
--------------------
-- Read_Total_Out --
--------------------
function Read_Total_Out (Stream : in Stream_Type) return Count is
begin
return Total_Out (Stream.Reader);
end Read_Total_Out;
-----------
-- Write --
-----------
procedure Write
(Stream : in out Stream_Type;
Item : in Stream_Element_Array)
is
procedure Write (Item : in Stream_Element_Array);
-----------
-- Write --
-----------
procedure Write (Item : in Stream_Element_Array) is
begin
Ada.Streams.Write (Stream.Back.all, Item);
end Write;
procedure Write is new ZLib.Write
(Write => Write,
Buffer_Size => Stream.Buffer_Size);
begin
Write (Stream.Writer, Item, No_Flush);
end Write;
--------------------
-- Write_Total_In --
--------------------
function Write_Total_In (Stream : in Stream_Type) return Count is
begin
return Total_In (Stream.Writer);
end Write_Total_In;
---------------------
-- Write_Total_Out --
---------------------
function Write_Total_Out (Stream : in Stream_Type) return Count is
begin
return Total_Out (Stream.Writer);
end Write_Total_Out;
end ZLib.Streams;

View File

@@ -0,0 +1,112 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: zlib-streams.ads,v 1.11 2003/08/12 13:15:31 vagul Exp $
package ZLib.Streams is
type Stream_Mode is (In_Stream, Out_Stream, Duplex);
type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class;
type Stream_Type is
new Ada.Streams.Root_Stream_Type with private;
procedure Read
(Stream : in out Stream_Type;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
procedure Write
(Stream : in out Stream_Type;
Item : in Ada.Streams.Stream_Element_Array);
procedure Flush
(Stream : in out Stream_Type;
Mode : in Flush_Mode := Sync_Flush);
-- Flush the written data to the back stream,
-- all data placed to the compressor is flushing to the Back stream.
-- Should not be used untill necessary, becouse it is decreasing
-- compression.
function Read_Total_In (Stream : in Stream_Type) return Count;
pragma Inline (Read_Total_In);
-- Return total number of bytes read from back stream so far.
function Read_Total_Out (Stream : in Stream_Type) return Count;
pragma Inline (Read_Total_Out);
-- Return total number of bytes read so far.
function Write_Total_In (Stream : in Stream_Type) return Count;
pragma Inline (Write_Total_In);
-- Return total number of bytes written so far.
function Write_Total_Out (Stream : in Stream_Type) return Count;
pragma Inline (Write_Total_Out);
-- Return total number of bytes written to the back stream.
procedure Create
(Stream : out Stream_Type;
Mode : in Stream_Mode;
Back : in Stream_Access;
Back_Compressed : in Boolean;
Level : in Compression_Level := Default_Compression;
Strategy : in Strategy_Type := Default_Strategy;
Header : in Header_Type := Default;
Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
:= Default_Buffer_Size;
Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
:= Default_Buffer_Size);
-- Create the Comression/Decompression stream.
-- If mode is In_Stream then Write operation is disabled.
-- If mode is Out_Stream then Read operation is disabled.
-- If Back_Compressed is true then
-- Data written to the Stream is compressing to the Back stream
-- and data read from the Stream is decompressed data from the Back stream.
-- If Back_Compressed is false then
-- Data written to the Stream is decompressing to the Back stream
-- and data read from the Stream is compressed data from the Back stream.
-- !!! When the Need_Header is False ZLib-Ada is using undocumented
-- ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
procedure Close (Stream : in out Stream_Type);
private
use Ada.Streams;
type Buffer_Access is access all Stream_Element_Array;
type Stream_Type
is new Root_Stream_Type with
record
Mode : Stream_Mode;
Buffer : Buffer_Access;
Rest_First : Stream_Element_Offset;
Rest_Last : Stream_Element_Offset;
-- Buffer for Read operation.
-- We need to have this buffer in the record
-- becouse not all read data from back stream
-- could be processed during the read operation.
Buffer_Size : Stream_Element_Offset;
-- Buffer size for write operation.
-- We do not need to have this buffer
-- in the record becouse all data could be
-- processed in the write operation.
Back : Stream_Access;
Reader : Filter_Type;
Writer : Filter_Type;
end record;
end ZLib.Streams;

185
contrib/ada/zlib-thin.adb Normal file
View File

@@ -0,0 +1,185 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: zlib-thin.adb,v 1.6 2003/01/21 15:26:37 vagul Exp $
package body ZLib.Thin is
ZLIB_VERSION : constant Chars_Ptr :=
Interfaces.C.Strings.New_String ("1.1.4");
Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
--------------
-- Avail_In --
--------------
function Avail_In (Strm : in Z_Stream) return UInt is
begin
return Strm.Avail_In;
end Avail_In;
---------------
-- Avail_Out --
---------------
function Avail_Out (Strm : in Z_Stream) return UInt is
begin
return Strm.Avail_Out;
end Avail_Out;
------------------
-- Deflate_Init --
------------------
function Deflate_Init
(strm : in Z_Streamp;
level : in Int := Z_DEFAULT_COMPRESSION)
return Int is
begin
return deflateInit (strm, level, ZLIB_VERSION, Z_Stream_Size);
end Deflate_Init;
function Deflate_Init
(strm : Z_Streamp;
level : Int;
method : Int;
windowBits : Int;
memLevel : Int;
strategy : Int)
return Int is
begin
return deflateInit2
(strm,
level,
method,
windowBits,
memLevel,
strategy,
ZLIB_VERSION,
Z_Stream_Size);
end Deflate_Init;
------------------
-- Inflate_Init --
------------------
function Inflate_Init (strm : Z_Streamp) return Int is
begin
return inflateInit (strm, ZLIB_VERSION, Z_Stream_Size);
end Inflate_Init;
function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is
begin
return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size);
end Inflate_Init;
function Last_Error_Message (Strm : in Z_Stream) return String is
use Interfaces.C.Strings;
begin
if Strm.msg = Null_Ptr then
return "";
else
return Value (Strm.msg);
end if;
end Last_Error_Message;
-------------
-- Need_In --
-------------
function Need_In (strm : Z_Stream) return Boolean is
begin
return strm.Avail_In = 0;
end Need_In;
--------------
-- Need_Out --
--------------
function Need_Out (strm : Z_Stream) return Boolean is
begin
return strm.Avail_Out = 0;
end Need_Out;
------------
-- Set_In --
------------
procedure Set_In
(Strm : in out Z_Stream;
Buffer : in Byte_Access;
Size : in UInt) is
begin
Strm.Next_In := Buffer;
Strm.Avail_In := Size;
end Set_In;
procedure Set_In
(Strm : in out Z_Stream;
Buffer : in Voidp;
Size : in UInt) is
begin
Set_In (Strm, Bytes.To_Pointer (Buffer), Size);
end Set_In;
------------------
-- Set_Mem_Func --
------------------
procedure Set_Mem_Func
(Strm : in out Z_Stream;
Opaque : in Voidp;
Alloc : in alloc_func;
Free : in free_func) is
begin
Strm.opaque := Opaque;
Strm.zalloc := Alloc;
Strm.zfree := Free;
end Set_Mem_Func;
-------------
-- Set_Out --
-------------
procedure Set_Out
(Strm : in out Z_Stream;
Buffer : in Byte_Access;
Size : in UInt) is
begin
Strm.Next_Out := Buffer;
Strm.Avail_Out := Size;
end Set_Out;
procedure Set_Out
(Strm : in out Z_Stream;
Buffer : in Voidp;
Size : in UInt) is
begin
Set_Out (Strm, Bytes.To_Pointer (Buffer), Size);
end Set_Out;
--------------
-- Total_In --
--------------
function Total_In (Strm : in Z_Stream) return ULong is
begin
return Strm.Total_In;
end Total_In;
---------------
-- Total_Out --
---------------
function Total_Out (Strm : in Z_Stream) return ULong is
begin
return Strm.Total_Out;
end Total_Out;
end ZLib.Thin;

491
contrib/ada/zlib-thin.ads Normal file
View File

@@ -0,0 +1,491 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: zlib-thin.ads,v 1.8 2003/08/12 13:16:51 vagul Exp $
with Interfaces.C.Strings;
with System.Address_To_Access_Conversions;
private package ZLib.Thin is
-- From zconf.h
MAX_MEM_LEVEL : constant := 9; -- zconf.h:105
-- zconf.h:105
MAX_WBITS : constant := 15; -- zconf.h:115
-- 32K LZ77 window
-- zconf.h:115
SEEK_SET : constant := 8#0000#; -- zconf.h:244
-- Seek from beginning of file.
-- zconf.h:244
SEEK_CUR : constant := 1; -- zconf.h:245
-- Seek from current position.
-- zconf.h:245
SEEK_END : constant := 2; -- zconf.h:246
-- Set file pointer to EOF plus "offset"
-- zconf.h:246
type Byte is new Interfaces.C.unsigned_char; -- 8 bits
-- zconf.h:214
type UInt is new Interfaces.C.unsigned; -- 16 bits or more
-- zconf.h:216
type Int is new Interfaces.C.int;
type ULong is new Interfaces.C.unsigned; -- 32 bits or more
-- zconf.h:217
subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr;
type ULong_Access is access ULong;
type Int_Access is access Int;
subtype Voidp is System.Address; -- zconf.h:232
package Bytes is new System.Address_To_Access_Conversions (Byte);
subtype Byte_Access is Bytes.Object_Pointer;
-- end from zconf
Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125
-- zlib.h:125
Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126
-- will be removed, use
-- Z_SYNC_FLUSH instead
-- zlib.h:126
Z_SYNC_FLUSH : constant := 2; -- zlib.h:127
-- zlib.h:127
Z_FULL_FLUSH : constant := 3; -- zlib.h:128
-- zlib.h:128
Z_FINISH : constant := 4; -- zlib.h:129
-- zlib.h:129
Z_OK : constant := 8#0000#; -- zlib.h:132
-- zlib.h:132
Z_STREAM_END : constant := 1; -- zlib.h:133
-- zlib.h:133
Z_NEED_DICT : constant := 2; -- zlib.h:134
-- zlib.h:134
Z_ERRNO : constant := -1; -- zlib.h:135
-- zlib.h:135
Z_STREAM_ERROR : constant := -2; -- zlib.h:136
-- zlib.h:136
Z_DATA_ERROR : constant := -3; -- zlib.h:137
-- zlib.h:137
Z_MEM_ERROR : constant := -4; -- zlib.h:138
-- zlib.h:138
Z_BUF_ERROR : constant := -5; -- zlib.h:139
-- zlib.h:139
Z_VERSION_ERROR : constant := -6; -- zlib.h:140
-- zlib.h:140
Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145
-- zlib.h:145
Z_BEST_SPEED : constant := 1; -- zlib.h:146
-- zlib.h:146
Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147
-- zlib.h:147
Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148
-- zlib.h:148
Z_FILTERED : constant := 1; -- zlib.h:151
-- zlib.h:151
Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152
-- zlib.h:152
Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153
-- zlib.h:153
Z_BINARY : constant := 8#0000#; -- zlib.h:156
-- zlib.h:156
Z_ASCII : constant := 1; -- zlib.h:157
-- zlib.h:157
Z_UNKNOWN : constant := 2; -- zlib.h:158
-- zlib.h:158
Z_DEFLATED : constant := 8; -- zlib.h:161
-- zlib.h:161
Z_NULL : constant := 8#0000#; -- zlib.h:164
-- for initializing zalloc, zfree, opaque
-- zlib.h:164
type gzFile is new Voidp; -- zlib.h:646
type Z_Stream is private;
type Z_Streamp is access all Z_Stream; -- zlib.h:89
type alloc_func is access function
(Opaque : Voidp;
Items : UInt;
Size : UInt)
return Voidp; -- zlib.h:63
type free_func is access procedure (opaque : Voidp; address : Voidp);
function zlibVersion return Chars_Ptr;
function Deflate (strm : Z_Streamp; flush : Int) return Int;
function DeflateEnd (strm : Z_Streamp) return Int;
function Inflate (strm : Z_Streamp; flush : Int) return Int;
function InflateEnd (strm : Z_Streamp) return Int;
function deflateSetDictionary
(strm : Z_Streamp;
dictionary : Byte_Access;
dictLength : UInt)
return Int;
function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int;
-- zlib.h:478
function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495
function deflateParams
(strm : Z_Streamp;
level : Int;
strategy : Int)
return Int; -- zlib.h:506
function deflateBound
(strm : Z_Streamp;
sourceLen : ULong)
return Int; -- zlib.h:595
function deflatePrime
(strm : Z_Streamp;
bits : Int;
value : Int)
return Int; -- zlib.h:604
function inflateSetDictionary
(strm : Z_Streamp;
dictionary : Byte_Access;
dictLength : UInt)
return Int; -- zlib.h:548
function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565
function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580
function compress
(dest : Byte_Access;
destLen : ULong_Access;
source : Byte_Access;
sourceLen : ULong)
return Int; -- zlib.h:601
function compress2
(dest : Byte_Access;
destLen : ULong_Access;
source : Byte_Access;
sourceLen : ULong;
level : Int)
return Int; -- zlib.h:615
function uncompress
(dest : Byte_Access;
destLen : ULong_Access;
source : Byte_Access;
sourceLen : ULong)
return Int;
function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile;
function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile;
function gzsetparams
(file : gzFile;
level : Int;
strategy : Int)
return Int;
function gzread
(file : gzFile;
buf : Voidp;
len : UInt)
return Int;
function gzwrite
(file : in gzFile;
buf : in Voidp;
len : in UInt)
return Int;
function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int;
function gzputs (file : in gzFile; s : in Chars_Ptr) return Int;
function gzgets
(file : gzFile;
buf : Chars_Ptr;
len : Int)
return Chars_Ptr;
function gzputc (file : gzFile; char : Int) return Int;
function gzgetc (file : gzFile) return Int;
function gzflush (file : gzFile; flush : Int) return Int;
function gzseek
(file : gzFile;
offset : Int;
whence : Int)
return Int;
function gzrewind (file : gzFile) return Int;
function gztell (file : gzFile) return Int;
function gzeof (file : gzFile) return Int;
function gzclose (file : gzFile) return Int;
function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr;
function adler32
(adler : ULong;
buf : Byte_Access;
len : UInt)
return ULong;
function crc32
(crc : ULong;
buf : Byte_Access;
len : UInt)
return ULong;
function deflateInit
(strm : Z_Streamp;
level : Int;
version : Chars_Ptr;
stream_size : Int)
return Int;
function Deflate_Init
(strm : in Z_Streamp;
level : in Int := Z_DEFAULT_COMPRESSION)
return Int;
pragma Inline (Deflate_Init);
function deflateInit2
(strm : Z_Streamp;
level : Int;
method : Int;
windowBits : Int;
memLevel : Int;
strategy : Int;
version : Chars_Ptr;
stream_size : Int)
return Int;
function Deflate_Init
(strm : Z_Streamp;
level : Int;
method : Int;
windowBits : Int;
memLevel : Int;
strategy : Int)
return Int;
pragma Inline (Deflate_Init);
function inflateInit
(strm : Z_Streamp;
version : Chars_Ptr;
stream_size : Int)
return Int;
function Inflate_Init (strm : Z_Streamp) return Int;
pragma Inline (Inflate_Init);
function inflateInit2
(strm : in Z_Streamp;
windowBits : in Int;
version : in Chars_Ptr;
stream_size : in Int)
return Int;
function inflateBackInit
(strm : in Z_Streamp;
windowBits : in Int;
window : in Byte_Access;
version : in Chars_Ptr;
stream_size : in Int)
return Int;
-- Size of window have to be 2**windowBits.
function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int;
pragma Inline (Inflate_Init);
function zError (err : Int) return Chars_Ptr;
function inflateSyncPoint (z : Z_Streamp) return Int;
function get_crc_table return ULong_Access;
-- Interface to the available fields of the z_stream structure.
-- 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
-- has dropped to zero. The application must initialize zalloc, zfree and
-- opaque before calling the init function.
function Need_In (strm : in Z_Stream) return Boolean;
-- return true when we do not need to setup Next_In and Avail_In fields.
pragma Inline (Need_In);
function Need_Out (strm : in Z_Stream) return Boolean;
-- return true when we do not need to setup Next_Out and Avail_Out field.
pragma Inline (Need_Out);
procedure Set_In
(Strm : in out Z_Stream;
Buffer : in Byte_Access;
Size : in UInt);
pragma Inline (Set_In);
procedure Set_In
(Strm : in out Z_Stream;
Buffer : in Voidp;
Size : in UInt);
pragma Inline (Set_In);
procedure Set_Out
(Strm : in out Z_Stream;
Buffer : in Byte_Access;
Size : in UInt);
pragma Inline (Set_Out);
procedure Set_Out
(Strm : in out Z_Stream;
Buffer : in Voidp;
Size : in UInt);
pragma Inline (Set_Out);
procedure Set_Mem_Func
(Strm : in out Z_Stream;
Opaque : in Voidp;
Alloc : in alloc_func;
Free : in free_func);
pragma Inline (Set_Mem_Func);
function Last_Error_Message (Strm : in Z_Stream) return String;
pragma Inline (Last_Error_Message);
function Avail_Out (Strm : in Z_Stream) return UInt;
pragma Inline (Avail_Out);
function Avail_In (Strm : in Z_Stream) return UInt;
pragma Inline (Avail_In);
function Total_In (Strm : in Z_Stream) return ULong;
pragma Inline (Total_In);
function Total_Out (Strm : in Z_Stream) return ULong;
pragma Inline (Total_Out);
function inflateCopy
(dest : in Z_Streamp;
Source : in Z_Streamp)
return Int;
function compressBound (Source_Len : in ULong) return ULong;
function deflateBound
(Strm : in Z_Streamp;
Source_Len : in ULong)
return ULong;
function gzungetc (C : in Int; File : in gzFile) return Int;
function zlibCompileFlags return ULong;
private
type Z_Stream is record -- zlib.h:68
Next_In : Byte_Access; -- next input byte
Avail_In : UInt := 0; -- number of bytes available at next_in
Total_In : ULong := 0; -- total nb of input bytes read so far
Next_Out : Byte_Access; -- next output byte should be put there
Avail_Out : UInt := 0; -- remaining free space at next_out
Total_Out : ULong := 0; -- total nb of bytes output so far
msg : Chars_Ptr; -- last error message, NULL if no error
state : Voidp; -- not visible by applications
zalloc : alloc_func := null; -- used to allocate the internal state
zfree : free_func := null; -- used to free the internal state
opaque : Voidp; -- private data object passed to
-- zalloc and zfree
data_type : Int; -- best guess about the data type:
-- ascii or binary
adler : ULong; -- adler32 value of the uncompressed
-- data
reserved : ULong; -- reserved for future use
end record;
pragma Convention (C, Z_Stream);
pragma Import (C, zlibVersion, "zlibVersion");
pragma Import (C, Deflate, "deflate");
pragma Import (C, DeflateEnd, "deflateEnd");
pragma Import (C, Inflate, "inflate");
pragma Import (C, InflateEnd, "inflateEnd");
pragma Import (C, deflateSetDictionary, "deflateSetDictionary");
pragma Import (C, deflateCopy, "deflateCopy");
pragma Import (C, deflateReset, "deflateReset");
pragma Import (C, deflateParams, "deflateParams");
pragma Import (C, deflateBound, "deflateBound");
pragma Import (C, deflatePrime, "deflatePrime");
pragma Import (C, inflateSetDictionary, "inflateSetDictionary");
pragma Import (C, inflateSync, "inflateSync");
pragma Import (C, inflateReset, "inflateReset");
pragma Import (C, compress, "compress");
pragma Import (C, compress2, "compress2");
pragma Import (C, uncompress, "uncompress");
pragma Import (C, gzopen, "gzopen");
pragma Import (C, gzdopen, "gzdopen");
pragma Import (C, gzsetparams, "gzsetparams");
pragma Import (C, gzread, "gzread");
pragma Import (C, gzwrite, "gzwrite");
pragma Import (C, gzprintf, "gzprintf");
pragma Import (C, gzputs, "gzputs");
pragma Import (C, gzgets, "gzgets");
pragma Import (C, gzputc, "gzputc");
pragma Import (C, gzgetc, "gzgetc");
pragma Import (C, gzflush, "gzflush");
pragma Import (C, gzseek, "gzseek");
pragma Import (C, gzrewind, "gzrewind");
pragma Import (C, gztell, "gztell");
pragma Import (C, gzeof, "gzeof");
pragma Import (C, gzclose, "gzclose");
pragma Import (C, gzerror, "gzerror");
pragma Import (C, adler32, "adler32");
pragma Import (C, crc32, "crc32");
pragma Import (C, deflateInit, "deflateInit_");
pragma Import (C, inflateInit, "inflateInit_");
pragma Import (C, deflateInit2, "deflateInit2_");
pragma Import (C, inflateInit2, "inflateInit2_");
pragma Import (C, zError, "zError");
pragma Import (C, inflateSyncPoint, "inflateSyncPoint");
pragma Import (C, get_crc_table, "get_crc_table");
-- since zlib 1.2.0:
pragma Import (C, inflateCopy, "inflateCopy");
pragma Import (C, compressBound, "compressBound");
pragma Import (C, deflateBound, "deflateBound");
pragma Import (C, gzungetc, "gzungetc");
pragma Import (C, zlibCompileFlags, "zlibCompileFlags");
pragma Import (C, inflateBackInit, "inflateBackInit_");
-- I stopped binding the inflateBack routines, becouse realize that
-- it does not support zlib and gzip headers for now, and have no
-- symmetric deflateBack routines.
-- ZLib-Ada is symmetric regarding deflate/inflate data transformation
-- and has a similar generic callback interface for the
-- deflate/inflate transformation based on the regular Deflate/Inflate
-- routines.
-- pragma Import (C, inflateBack, "inflateBack");
-- pragma Import (C, inflateBackEnd, "inflateBackEnd");
end ZLib.Thin;

674
contrib/ada/zlib.adb Normal file
View File

@@ -0,0 +1,674 @@
----------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- Open source license information is in the zlib.ads file. --
----------------------------------------------------------------
-- $Id: zlib.adb,v 1.19 2003/07/13 16:02:19 vagul Exp $
with Ada.Exceptions;
with Ada.Unchecked_Conversion;
with Ada.Unchecked_Deallocation;
with Interfaces.C.Strings;
with ZLib.Thin;
package body ZLib is
use type Thin.Int;
type Z_Stream is new Thin.Z_Stream;
type Return_Code_Enum is
(OK,
STREAM_END,
NEED_DICT,
ERRNO,
STREAM_ERROR,
DATA_ERROR,
MEM_ERROR,
BUF_ERROR,
VERSION_ERROR);
type Flate_Step_Function is access
function (Strm : Thin.Z_Streamp; flush : Thin.Int) return Thin.Int;
pragma Convention (C, Flate_Step_Function);
type Flate_End_Function is access
function (Ctrm : in Thin.Z_Streamp) return Thin.Int;
pragma Convention (C, Flate_End_Function);
type Flate_Type is record
Step : Flate_Step_Function;
Done : Flate_End_Function;
end record;
subtype Footer_Array is Stream_Element_Array (1 .. 8);
Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)
:= (16#1f#, 16#8b#, -- Magic header
16#08#, -- Z_DEFLATED
16#00#, -- Flags
16#00#, 16#00#, 16#00#, 16#00#, -- Time
16#00#, -- XFlags
16#03# -- OS code
);
-- The simplest gzip header is not for informational, but just for
-- gzip format compatibility.
-- Note that some code below is using assumption
-- Simple_GZip_Header'Last > Footer_Array'Last, so do not make
-- Simple_GZip_Header'Last <= Footer_Array'Last.
Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum
:= (0 => OK,
1 => STREAM_END,
2 => NEED_DICT,
-1 => ERRNO,
-2 => STREAM_ERROR,
-3 => DATA_ERROR,
-4 => MEM_ERROR,
-5 => BUF_ERROR,
-6 => VERSION_ERROR);
Flate : constant array (Boolean) of Flate_Type
:= (True => (Step => Thin.Deflate'Access,
Done => Thin.DeflateEnd'Access),
False => (Step => Thin.Inflate'Access,
Done => Thin.InflateEnd'Access));
Flush_Finish : constant array (Boolean) of Flush_Mode
:= (True => Finish, False => No_Flush);
procedure Raise_Error (Stream : Z_Stream);
pragma Inline (Raise_Error);
procedure Raise_Error (Message : String);
pragma Inline (Raise_Error);
procedure Check_Error (Stream : Z_Stream; Code : Thin.Int);
procedure Free is new Ada.Unchecked_Deallocation
(Z_Stream, Z_Stream_Access);
function To_Thin_Access is new Ada.Unchecked_Conversion
(Z_Stream_Access, Thin.Z_Streamp);
procedure Translate_GZip
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode);
-- Separate translate routine for make gzip header.
procedure Translate_Auto
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode);
-- translate routine without additional headers.
-----------------
-- Check_Error --
-----------------
procedure Check_Error (Stream : Z_Stream; Code : Thin.Int) is
use type Thin.Int;
begin
if Code /= Thin.Z_OK then
Raise_Error
(Return_Code_Enum'Image (Return_Code (Code))
& ": " & Last_Error_Message (Stream));
end if;
end Check_Error;
-----------
-- Close --
-----------
procedure Close
(Filter : in out Filter_Type;
Ignore_Error : in Boolean := False)
is
Code : Thin.Int;
begin
Code := Flate (Filter.Compression).Done
(To_Thin_Access (Filter.Strm));
Filter.Opened := False;
if Ignore_Error or else Code = Thin.Z_OK then
Free (Filter.Strm);
else
declare
Error_Message : constant String
:= Last_Error_Message (Filter.Strm.all);
begin
Free (Filter.Strm);
Ada.Exceptions.Raise_Exception
(ZLib_Error'Identity,
Return_Code_Enum'Image (Return_Code (Code))
& ": " & Error_Message);
end;
end if;
end Close;
-----------
-- CRC32 --
-----------
function CRC32
(CRC : in Unsigned_32;
Data : in Ada.Streams.Stream_Element_Array)
return Unsigned_32
is
use Thin;
begin
return Unsigned_32 (crc32
(ULong (CRC),
Bytes.To_Pointer (Data'Address),
Data'Length));
end CRC32;
procedure CRC32
(CRC : in out Unsigned_32;
Data : in Ada.Streams.Stream_Element_Array) is
begin
CRC := CRC32 (CRC, Data);
end CRC32;
------------------
-- Deflate_Init --
------------------
procedure Deflate_Init
(Filter : in out Filter_Type;
Level : in Compression_Level := Default_Compression;
Strategy : in Strategy_Type := Default_Strategy;
Method : in Compression_Method := Deflated;
Window_Bits : in Window_Bits_Type := 15;
Memory_Level : in Memory_Level_Type := 8;
Header : in Header_Type := Default)
is
use type Thin.Int;
Win_Bits : Thin.Int := Thin.Int (Window_Bits);
begin
-- We allow ZLib to make header only in case of default header type.
-- Otherwise we would either do header by ourselfs, or do not do
-- header at all.
if Header = None or else Header = GZip then
Win_Bits := -Win_Bits;
end if;
-- For the GZip CRC calculation and make headers.
if Header = GZip then
Filter.CRC := 0;
Filter.Offset := Simple_GZip_Header'First;
else
Filter.Offset := Simple_GZip_Header'Last + 1;
end if;
Filter.Strm := new Z_Stream;
Filter.Compression := True;
Filter.Stream_End := False;
Filter.Opened := True;
Filter.Header := Header;
if Thin.Deflate_Init
(To_Thin_Access (Filter.Strm),
Level => Thin.Int (Level),
method => Thin.Int (Method),
windowBits => Win_Bits,
memLevel => Thin.Int (Memory_Level),
strategy => Thin.Int (Strategy)) /= Thin.Z_OK
then
Raise_Error (Filter.Strm.all);
end if;
end Deflate_Init;
-----------
-- Flush --
-----------
procedure Flush
(Filter : in out Filter_Type;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode)
is
No_Data : Stream_Element_Array := (1 .. 0 => 0);
Last : Stream_Element_Offset;
begin
Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);
end Flush;
-----------------------
-- Generic_Translate --
-----------------------
procedure Generic_Translate
(Filter : in out ZLib.Filter_Type;
In_Buffer_Size : Integer := Default_Buffer_Size;
Out_Buffer_Size : Integer := Default_Buffer_Size)
is
In_Buffer : Stream_Element_Array
(1 .. Stream_Element_Offset (In_Buffer_Size));
Out_Buffer : Stream_Element_Array
(1 .. Stream_Element_Offset (Out_Buffer_Size));
Last : Stream_Element_Offset;
In_Last : Stream_Element_Offset;
In_First : Stream_Element_Offset;
Out_Last : Stream_Element_Offset;
begin
Main : loop
Data_In (In_Buffer, Last);
In_First := In_Buffer'First;
loop
Translate
(Filter,
In_Buffer (In_First .. Last),
In_Last,
Out_Buffer,
Out_Last,
Flush_Finish (Last < In_Buffer'First));
Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
exit Main when Stream_End (Filter);
-- The end of in buffer.
exit when In_Last = Last;
In_First := In_Last + 1;
end loop;
end loop Main;
end Generic_Translate;
------------------
-- Inflate_Init --
------------------
procedure Inflate_Init
(Filter : in out Filter_Type;
Window_Bits : in Window_Bits_Type := 15;
Header : in Header_Type := Default)
is
use type Thin.Int;
Win_Bits : Thin.Int := Thin.Int (Window_Bits);
procedure Check_Version;
-- Check the latest header types compatibility.
procedure Check_Version is
begin
if Version <= "1.1.4" then
Raise_Error
("Inflate header type " & Header_Type'Image (Header)
& " incompatible with ZLib version " & Version);
end if;
end Check_Version;
begin
case Header is
when None =>
Check_Version;
-- Inflate data without headers determined
-- by negative Win_Bits.
Win_Bits := -Win_Bits;
when GZip =>
Check_Version;
-- Inflate gzip data defined by flag 16.
Win_Bits := Win_Bits + 16;
when Auto =>
Check_Version;
-- Inflate with automatic detection
-- of gzip or native header defined by flag 32.
Win_Bits := Win_Bits + 32;
when Default => null;
end case;
Filter.Strm := new Z_Stream;
Filter.Compression := False;
Filter.Stream_End := False;
Filter.Opened := True;
Filter.Header := Header;
if Thin.Inflate_Init
(To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK
then
Raise_Error (Filter.Strm.all);
end if;
end Inflate_Init;
-----------------
-- Raise_Error --
-----------------
procedure Raise_Error (Message : String) is
begin
Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
end Raise_Error;
procedure Raise_Error (Stream : Z_Stream) is
begin
Raise_Error (Last_Error_Message (Stream));
end Raise_Error;
----------
-- Read --
----------
procedure Read
(Filter : in out Filter_Type;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset)
is
In_Last : Stream_Element_Offset;
Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
begin
pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
loop
if Rest_First > Buffer'Last then
Read (Buffer, Rest_Last);
Rest_First := Buffer'First;
end if;
pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
Translate
(Filter => Filter,
In_Data => Buffer (Rest_First .. Rest_Last),
In_Last => In_Last,
Out_Data => Item (Item_First .. Item'Last),
Out_Last => Last,
Flush => Flush_Finish (Rest_Last < Rest_First));
Rest_First := In_Last + 1;
exit when Last = Item'Last or else Stream_End (Filter);
Item_First := Last + 1;
end loop;
end Read;
----------------
-- Stream_End --
----------------
function Stream_End (Filter : in Filter_Type) return Boolean is
begin
if Filter.Header = GZip and Filter.Compression then
return Filter.Stream_End
and then Filter.Offset = Footer_Array'Last + 1;
else
return Filter.Stream_End;
end if;
end Stream_End;
--------------
-- Total_In --
--------------
function Total_In (Filter : in Filter_Type) return Count is
begin
return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));
end Total_In;
---------------
-- Total_Out --
---------------
function Total_Out (Filter : in Filter_Type) return Count is
begin
return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));
end Total_Out;
---------------
-- Translate --
---------------
procedure Translate
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode) is
begin
if Filter.Header = GZip and then Filter.Compression then
Translate_GZip
(Filter => Filter,
In_Data => In_Data,
In_Last => In_Last,
Out_Data => Out_Data,
Out_Last => Out_Last,
Flush => Flush);
else
Translate_Auto
(Filter => Filter,
In_Data => In_Data,
In_Last => In_Last,
Out_Data => Out_Data,
Out_Last => Out_Last,
Flush => Flush);
end if;
end Translate;
--------------------
-- Translate_Auto --
--------------------
procedure Translate_Auto
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode)
is
use type Thin.Int;
Code : Thin.Int;
begin
if Filter.Opened = False then
raise ZLib_Error;
end if;
if Out_Data'Length = 0 then
raise Constraint_Error;
end if;
Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);
Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length);
Code := Flate (Filter.Compression).Step
(To_Thin_Access (Filter.Strm),
Thin.Int (Flush));
if Code = Thin.Z_STREAM_END then
Filter.Stream_End := True;
else
Check_Error (Filter.Strm.all, Code);
end if;
In_Last := In_Data'Last
- Stream_Element_Offset (Avail_In (Filter.Strm.all));
Out_Last := Out_Data'Last
- Stream_Element_Offset (Avail_Out (Filter.Strm.all));
end Translate_Auto;
--------------------
-- Translate_GZip --
--------------------
procedure Translate_GZip
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode)
is
Out_First : Stream_Element_Offset;
procedure Add_Data (Data : in Stream_Element_Array);
-- Add data to stream from the Filter.Offset till necessary,
-- used for add gzip headr/footer.
procedure Put_32
(Item : in out Stream_Element_Array;
Data : in Unsigned_32);
pragma Inline (Put_32);
--------------
-- Add_Data --
--------------
procedure Add_Data (Data : in Stream_Element_Array) is
Data_First : Stream_Element_Offset renames Filter.Offset;
Data_Last : Stream_Element_Offset;
Data_Len : Stream_Element_Offset; -- -1
Out_Len : Stream_Element_Offset; -- -1
begin
Out_First := Out_Last + 1;
if Data_First > Data'Last then
return;
end if;
Data_Len := Data'Last - Data_First;
Out_Len := Out_Data'Last - Out_First;
if Data_Len <= Out_Len then
Out_Last := Out_First + Data_Len;
Data_Last := Data'Last;
else
Out_Last := Out_Data'Last;
Data_Last := Data_First + Out_Len;
end if;
Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);
Data_First := Data_Last + 1;
Out_First := Out_Last + 1;
end Add_Data;
------------
-- Put_32 --
------------
procedure Put_32
(Item : in out Stream_Element_Array;
Data : in Unsigned_32)
is
D : Unsigned_32 := Data;
begin
for J in Item'First .. Item'First + 3 loop
Item (J) := Stream_Element (D and 16#FF#);
D := Shift_Right (D, 8);
end loop;
end Put_32;
begin
Out_Last := Out_Data'First - 1;
if not Filter.Stream_End then
Add_Data (Simple_GZip_Header);
Translate_Auto
(Filter => Filter,
In_Data => In_Data,
In_Last => In_Last,
Out_Data => Out_Data (Out_First .. Out_Data'Last),
Out_Last => Out_Last,
Flush => Flush);
CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
end if;
if Filter.Stream_End and then Out_Last <= Out_Data'Last then
-- This detection method would work only when
-- Simple_GZip_Header'Last > Footer_Array'Last
if Filter.Offset = Simple_GZip_Header'Last + 1 then
Filter.Offset := Footer_Array'First;
end if;
declare
Footer : Footer_Array;
begin
Put_32 (Footer, Filter.CRC);
Put_32 (Footer (Footer'First + 4 .. Footer'Last),
Unsigned_32 (Total_In (Filter)));
Add_Data (Footer);
end;
end if;
end Translate_GZip;
-------------
-- Version --
-------------
function Version return String is
begin
return Interfaces.C.Strings.Value (Thin.zlibVersion);
end Version;
-----------
-- Write --
-----------
procedure Write
(Filter : in out Filter_Type;
Item : in Ada.Streams.Stream_Element_Array;
Flush : in Flush_Mode)
is
Buffer : Stream_Element_Array (1 .. Buffer_Size);
In_Last, Out_Last : Stream_Element_Offset;
In_First : Stream_Element_Offset := Item'First;
begin
if Item'Length = 0 and Flush = No_Flush then
return;
end if;
loop
Translate
(Filter => Filter,
In_Data => Item (In_First .. Item'Last),
In_Last => In_Last,
Out_Data => Buffer,
Out_Last => Out_Last,
Flush => Flush);
if Out_Last >= Buffer'First then
Write (Buffer (1 .. Out_Last));
end if;
exit when In_Last = Item'Last or Stream_End (Filter);
In_First := In_Last + 1;
end loop;
end Write;
end ZLib;

311
contrib/ada/zlib.ads Normal file
View File

@@ -0,0 +1,311 @@
------------------------------------------------------------------------------
-- ZLib for Ada thick binding. --
-- --
-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under the terms of the GNU General Public License as published by --
-- the Free Software Foundation; either version 2 of the License, or (at --
-- your option) any later version. --
-- --
-- This library is distributed in the hope that it will be useful, but --
-- WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public License --
-- along with this library; if not, write to the Free Software Foundation, --
-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- $Id: zlib.ads,v 1.17 2003/08/12 13:19:07 vagul Exp $
with Ada.Streams;
with Interfaces;
package ZLib is
ZLib_Error : exception;
type Compression_Level is new Integer range -1 .. 9;
type Flush_Mode is private;
type Compression_Method is private;
type Window_Bits_Type is new Integer range 8 .. 15;
type Memory_Level_Type is new Integer range 1 .. 9;
type Unsigned_32 is new Interfaces.Unsigned_32;
type Strategy_Type is private;
type Header_Type is (None, Auto, Default, GZip);
-- Header type usage have a some limitation for inflate.
-- See comment for Inflate_Init.
subtype Count is Ada.Streams.Stream_Element_Count;
----------------------------------
-- Compression method constants --
----------------------------------
Deflated : constant Compression_Method;
-- Only one method allowed in this ZLib version.
---------------------------------
-- Compression level constants --
---------------------------------
No_Compression : constant Compression_Level := 0;
Best_Speed : constant Compression_Level := 1;
Best_Compression : constant Compression_Level := 9;
Default_Compression : constant Compression_Level := -1;
--------------------------
-- Flush mode constants --
--------------------------
No_Flush : constant Flush_Mode;
-- Regular way for compression, no flush
Partial_Flush : constant Flush_Mode;
-- will be removed, use Z_SYNC_FLUSH instead
Sync_Flush : constant Flush_Mode;
-- all pending output is flushed to the output buffer and the output
-- is aligned on a byte boundary, so that the decompressor can get all
-- input data available so far. (In particular avail_in is zero after the
-- call if enough output space has been provided before the call.)
-- Flushing may degrade compression for some compression algorithms and so
-- it should be used only when necessary.
Full_Flush : constant Flush_Mode;
-- all output is flushed as with SYNC_FLUSH, and the compression state
-- is reset so that decompression can restart from this point if previous
-- compressed data has been damaged or if random access is desired. Using
-- FULL_FLUSH too often can seriously degrade the compression.
Finish : constant Flush_Mode;
-- Just for tell the compressor that input data is complete.
------------------------------------
-- Compression strategy constants --
------------------------------------
-- RLE stategy could be used only in version 1.2.0 and later.
Filtered : constant Strategy_Type;
Huffman_Only : constant Strategy_Type;
RLE : constant Strategy_Type;
Default_Strategy : constant Strategy_Type;
Default_Buffer_Size : constant := 4096;
type Filter_Type is limited private;
-- The filter is for compression and for decompression.
-- The usage of the type is depend of its initialization.
function Version return String;
pragma Inline (Version);
-- Return string representation of the ZLib version.
procedure Deflate_Init
(Filter : in out Filter_Type;
Level : in Compression_Level := Default_Compression;
Strategy : in Strategy_Type := Default_Strategy;
Method : in Compression_Method := Deflated;
Window_Bits : in Window_Bits_Type := 15;
Memory_Level : in Memory_Level_Type := 8;
Header : in Header_Type := Default);
-- Compressor initialization.
-- When Header parameter is Auto or Default, then default zlib header
-- would be provided for compressed data.
-- When Header is GZip, then gzip header would be set instead of
-- default header.
-- When Header is None, no header would be set for compressed data.
procedure Inflate_Init
(Filter : in out Filter_Type;
Window_Bits : in Window_Bits_Type := 15;
Header : in Header_Type := Default);
-- Decompressor initialization.
-- Default header type mean that ZLib default header is expecting in the
-- input compressed stream.
-- Header type None mean that no header is expecting in the input stream.
-- GZip header type mean that GZip header is expecting in the
-- input compressed stream.
-- Auto header type mean that header type (GZip or Native) would be
-- detected automatically in the input stream.
-- Note that header types parameter values None, GZip and Auto is
-- supporting for inflate routine only in ZLib versions 1.2.0.2 and later.
-- Deflate_Init is supporting all header types.
procedure Close
(Filter : in out Filter_Type;
Ignore_Error : in Boolean := False);
-- Closing the compression or decompressor.
-- If stream is closing before the complete and Ignore_Error is False,
-- The exception would be raised.
generic
with procedure Data_In
(Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
with procedure Data_Out
(Item : in Ada.Streams.Stream_Element_Array);
procedure Generic_Translate
(Filter : in out Filter_Type;
In_Buffer_Size : in Integer := Default_Buffer_Size;
Out_Buffer_Size : in Integer := Default_Buffer_Size);
-- Compressing/decompressing data arrived from Data_In routine
-- to the Data_Out routine. User should provide Data_In and Data_Out
-- for compression/decompression data flow.
-- Compression or decompression depend on initialization of Filter.
function Total_In (Filter : in Filter_Type) return Count;
pragma Inline (Total_In);
-- Return total number of input bytes read so far.
function Total_Out (Filter : in Filter_Type) return Count;
pragma Inline (Total_Out);
-- Return total number of bytes output so far.
function CRC32
(CRC : in Unsigned_32;
Data : in Ada.Streams.Stream_Element_Array)
return Unsigned_32;
pragma Inline (CRC32);
-- Calculate CRC32, it could be necessary for make gzip format.
procedure CRC32
(CRC : in out Unsigned_32;
Data : in Ada.Streams.Stream_Element_Array);
pragma Inline (CRC32);
-- Calculate CRC32, it could be necessary for make gzip format.
-------------------------------------------------
-- Below is more complex low level routines. --
-------------------------------------------------
procedure Translate
(Filter : in out Filter_Type;
In_Data : in Ada.Streams.Stream_Element_Array;
In_Last : out Ada.Streams.Stream_Element_Offset;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode);
-- Compressing/decompressing the datas from In_Data buffer to the
-- Out_Data buffer.
-- In_Data is incoming data portion,
-- In_Last is the index of last element from In_Data accepted by the
-- Filter.
-- Out_Data is the buffer for output data from the filter.
-- Out_Last is the last element of the received data from Filter.
-- To tell the filter that incoming data is complete put the
-- Flush parameter to FINISH.
function Stream_End (Filter : in Filter_Type) return Boolean;
pragma Inline (Stream_End);
-- Return the true when the stream is complete.
procedure Flush
(Filter : in out Filter_Type;
Out_Data : out Ada.Streams.Stream_Element_Array;
Out_Last : out Ada.Streams.Stream_Element_Offset;
Flush : in Flush_Mode);
pragma Inline (Flush);
-- Flushing the data from the compressor.
generic
with procedure Write
(Item : in Ada.Streams.Stream_Element_Array);
-- User should provide this routine for accept
-- compressed/decompressed data.
Buffer_Size : in Ada.Streams.Stream_Element_Offset
:= Default_Buffer_Size;
-- Buffer size for Write user routine.
procedure Write
(Filter : in out Filter_Type;
Item : in Ada.Streams.Stream_Element_Array;
Flush : in Flush_Mode);
-- Compressing/Decompressing data from Item to the
-- generic parameter procedure Write.
-- Output buffer size could be set in Buffer_Size generic parameter.
generic
with procedure Read
(Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
-- User should provide data for compression/decompression
-- thru this routine.
Buffer : in out Ada.Streams.Stream_Element_Array;
-- Buffer for keep remaining data from the previous
-- back read.
Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset;
-- Rest_First have to be initialized to Buffer'Last + 1
-- before usage.
procedure Read
(Filter : in out Filter_Type;
Item : out Ada.Streams.Stream_Element_Array;
Last : out Ada.Streams.Stream_Element_Offset);
-- Compressing/Decompressing data from generic parameter
-- procedure Read to the Item.
-- User should provide Buffer for the operation
-- and Rest_First variable first time initialized to the Buffer'Last + 1.
private
use Ada.Streams;
type Flush_Mode is new Integer range 0 .. 4;
type Compression_Method is new Integer range 8 .. 8;
type Strategy_Type is new Integer range 0 .. 3;
No_Flush : constant Flush_Mode := 0;
Sync_Flush : constant Flush_Mode := 2;
Full_Flush : constant Flush_Mode := 3;
Finish : constant Flush_Mode := 4;
Partial_Flush : constant Flush_Mode := 1;
-- will be removed, use Z_SYNC_FLUSH instead
Filtered : constant Strategy_Type := 1;
Huffman_Only : constant Strategy_Type := 2;
RLE : constant Strategy_Type := 3;
Default_Strategy : constant Strategy_Type := 0;
Deflated : constant Compression_Method := 8;
type Z_Stream;
type Z_Stream_Access is access all Z_Stream;
type Filter_Type is record
Strm : Z_Stream_Access;
Compression : Boolean;
Stream_End : Boolean;
Header : Header_Type;
CRC : Unsigned_32;
Offset : Stream_Element_Offset;
-- Offset for gzip header/footer output.
Opened : Boolean := False;
end record;
end ZLib;

21
contrib/ada/zlib.gpr Normal file
View File

@@ -0,0 +1,21 @@
project Zlib is
for Languages use ("Ada");
for Source_Dirs use (".");
for Object_Dir use ".";
for Main use ("test.adb", "mtest.adb", "read.adb");
package Compiler is
for Default_Switches ("ada") use ("-gnatwbcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
end Compiler;
package Linker is
for Default_Switches ("ada") use ("-lz");
end Linker;
package Builder is
for Default_Switches ("ada") use ("-s", "-gnatQ");
end Builder;
end Zlib;

View File

@@ -1,559 +0,0 @@
;
; gvmat32.asm -- Asm portion of the optimized longest_match for 32 bits x86
; Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
; File written by Gilles Vollant, by modifiying the longest_match
; from Jean-loup Gailly in deflate.c
; It need wmask == 0x7fff
; (assembly code is faster with a fixed wmask)
;
; For Visual C++ 4.2 and ML 6.11c (version in directory \MASM611C of Win95 DDK)
; I compile with : "ml /coff /Zi /c gvmat32.asm"
;
;uInt longest_match_7fff(s, cur_match)
; deflate_state *s;
; IPos cur_match; /* current match */
NbStack equ 76
cur_match equ dword ptr[esp+NbStack-0]
str_s equ dword ptr[esp+NbStack-4]
; 5 dword on top (ret,ebp,esi,edi,ebx)
adrret equ dword ptr[esp+NbStack-8]
pushebp equ dword ptr[esp+NbStack-12]
pushedi equ dword ptr[esp+NbStack-16]
pushesi equ dword ptr[esp+NbStack-20]
pushebx equ dword ptr[esp+NbStack-24]
chain_length equ dword ptr [esp+NbStack-28]
limit equ dword ptr [esp+NbStack-32]
best_len equ dword ptr [esp+NbStack-36]
window equ dword ptr [esp+NbStack-40]
prev equ dword ptr [esp+NbStack-44]
scan_start equ word ptr [esp+NbStack-48]
wmask equ dword ptr [esp+NbStack-52]
match_start_ptr equ dword ptr [esp+NbStack-56]
nice_match equ dword ptr [esp+NbStack-60]
scan equ dword ptr [esp+NbStack-64]
windowlen equ dword ptr [esp+NbStack-68]
match_start equ dword ptr [esp+NbStack-72]
strend equ dword ptr [esp+NbStack-76]
NbStackAdd equ (NbStack-24)
.386p
name gvmatch
.MODEL FLAT
; all the +4 offsets are due to the addition of pending_buf_size (in zlib
; in the deflate_state structure since the asm code was first written
; (if you compile with zlib 1.0.4 or older, remove the +4).
; Note : these value are good with a 8 bytes boundary pack structure
dep_chain_length equ 70h+4
dep_window equ 2ch+4
dep_strstart equ 60h+4
dep_prev_length equ 6ch+4
dep_nice_match equ 84h+4
dep_w_size equ 20h+4
dep_prev equ 34h+4
dep_w_mask equ 28h+4
dep_good_match equ 80h+4
dep_match_start equ 64h+4
dep_lookahead equ 68h+4
_TEXT segment
IFDEF NOUNDERLINE
public longest_match_7fff
; public match_init
ELSE
public _longest_match_7fff
; public _match_init
ENDIF
MAX_MATCH equ 258
MIN_MATCH equ 3
MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
IFDEF NOUNDERLINE
;match_init proc near
; ret
;match_init endp
ELSE
;_match_init proc near
; ret
;_match_init endp
ENDIF
IFDEF NOUNDERLINE
longest_match_7fff proc near
ELSE
_longest_match_7fff proc near
ENDIF
mov edx,[esp+4]
push ebp
push edi
push esi
push ebx
sub esp,NbStackAdd
; initialize or check the variables used in match.asm.
mov ebp,edx
; chain_length = s->max_chain_length
; if (prev_length>=good_match) chain_length >>= 2
mov edx,[ebp+dep_chain_length]
mov ebx,[ebp+dep_prev_length]
cmp [ebp+dep_good_match],ebx
ja noshr
shr edx,2
noshr:
; we increment chain_length because in the asm, the --chain_lenght is in the beginning of the loop
inc edx
mov edi,[ebp+dep_nice_match]
mov chain_length,edx
mov eax,[ebp+dep_lookahead]
cmp eax,edi
; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
jae nolookaheadnicematch
mov edi,eax
nolookaheadnicematch:
; best_len = s->prev_length
mov best_len,ebx
; window = s->window
mov esi,[ebp+dep_window]
mov ecx,[ebp+dep_strstart]
mov window,esi
mov nice_match,edi
; scan = window + strstart
add esi,ecx
mov scan,esi
; dx = *window
mov dx,word ptr [esi]
; bx = *(window+best_len-1)
mov bx,word ptr [esi+ebx-1]
add esi,MAX_MATCH-1
; scan_start = *scan
mov scan_start,dx
; strend = scan + MAX_MATCH-1
mov strend,esi
; bx = scan_end = *(window+best_len-1)
; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
; s->strstart - (IPos)MAX_DIST(s) : NIL;
mov esi,[ebp+dep_w_size]
sub esi,MIN_LOOKAHEAD
; here esi = MAX_DIST(s)
sub ecx,esi
ja nodist
xor ecx,ecx
nodist:
mov limit,ecx
; prev = s->prev
mov edx,[ebp+dep_prev]
mov prev,edx
;
mov edx,dword ptr [ebp+dep_match_start]
mov bp,scan_start
mov eax,cur_match
mov match_start,edx
mov edx,window
mov edi,edx
add edi,best_len
mov esi,prev
dec edi
; windowlen = window + best_len -1
mov windowlen,edi
jmp beginloop2
align 4
; here, in the loop
; eax = ax = cur_match
; ecx = limit
; bx = scan_end
; bp = scan_start
; edi = windowlen (window + best_len -1)
; esi = prev
;// here; chain_length <=16
normalbeg0add16:
add chain_length,16
jz exitloop
normalbeg0:
cmp word ptr[edi+eax],bx
je normalbeg2noroll
rcontlabnoroll:
; cur_match = prev[cur_match & wmask]
and eax,7fffh
mov ax,word ptr[esi+eax*2]
; if cur_match > limit, go to exitloop
cmp ecx,eax
jnb exitloop
; if --chain_length != 0, go to exitloop
dec chain_length
jnz normalbeg0
jmp exitloop
normalbeg2noroll:
; if (scan_start==*(cur_match+window)) goto normalbeg2
cmp bp,word ptr[edx+eax]
jne rcontlabnoroll
jmp normalbeg2
contloop3:
mov edi,windowlen
; cur_match = prev[cur_match & wmask]
and eax,7fffh
mov ax,word ptr[esi+eax*2]
; if cur_match > limit, go to exitloop
cmp ecx,eax
jnbexitloopshort1:
jnb exitloop
; if --chain_length != 0, go to exitloop
; begin the main loop
beginloop2:
sub chain_length,16+1
; if chain_length <=16, don't use the unrolled loop
jna normalbeg0add16
do16:
cmp word ptr[edi+eax],bx
je normalbeg2dc0
maccn MACRO lab
and eax,7fffh
mov ax,word ptr[esi+eax*2]
cmp ecx,eax
jnb exitloop
cmp word ptr[edi+eax],bx
je lab
ENDM
rcontloop0:
maccn normalbeg2dc1
rcontloop1:
maccn normalbeg2dc2
rcontloop2:
maccn normalbeg2dc3
rcontloop3:
maccn normalbeg2dc4
rcontloop4:
maccn normalbeg2dc5
rcontloop5:
maccn normalbeg2dc6
rcontloop6:
maccn normalbeg2dc7
rcontloop7:
maccn normalbeg2dc8
rcontloop8:
maccn normalbeg2dc9
rcontloop9:
maccn normalbeg2dc10
rcontloop10:
maccn short normalbeg2dc11
rcontloop11:
maccn short normalbeg2dc12
rcontloop12:
maccn short normalbeg2dc13
rcontloop13:
maccn short normalbeg2dc14
rcontloop14:
maccn short normalbeg2dc15
rcontloop15:
and eax,7fffh
mov ax,word ptr[esi+eax*2]
cmp ecx,eax
jnb exitloop
sub chain_length,16
ja do16
jmp normalbeg0add16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
normbeg MACRO rcontlab,valsub
; if we are here, we know that *(match+best_len-1) == scan_end
cmp bp,word ptr[edx+eax]
; if (match != scan_start) goto rcontlab
jne rcontlab
; calculate the good chain_length, and we'll compare scan and match string
add chain_length,16-valsub
jmp iseq
ENDM
normalbeg2dc11:
normbeg rcontloop11,11
normalbeg2dc12:
normbeg short rcontloop12,12
normalbeg2dc13:
normbeg short rcontloop13,13
normalbeg2dc14:
normbeg short rcontloop14,14
normalbeg2dc15:
normbeg short rcontloop15,15
normalbeg2dc10:
normbeg rcontloop10,10
normalbeg2dc9:
normbeg rcontloop9,9
normalbeg2dc8:
normbeg rcontloop8,8
normalbeg2dc7:
normbeg rcontloop7,7
normalbeg2dc6:
normbeg rcontloop6,6
normalbeg2dc5:
normbeg rcontloop5,5
normalbeg2dc4:
normbeg rcontloop4,4
normalbeg2dc3:
normbeg rcontloop3,3
normalbeg2dc2:
normbeg rcontloop2,2
normalbeg2dc1:
normbeg rcontloop1,1
normalbeg2dc0:
normbeg rcontloop0,0
; we go in normalbeg2 because *(ushf*)(match+best_len-1) == scan_end
normalbeg2:
mov edi,window
cmp bp,word ptr[edi+eax]
jne contloop3 ; if *(ushf*)match != scan_start, continue
iseq:
; if we are here, we know that *(match+best_len-1) == scan_end
; and (match == scan_start)
mov edi,edx
mov esi,scan ; esi = scan
add edi,eax ; edi = window + cur_match = match
mov edx,[esi+3] ; compare manually dword at match+3
xor edx,[edi+3] ; and scan +3
jz begincompare ; if equal, go to long compare
; we will determine the unmatch byte and calculate len (in esi)
or dl,dl
je eq1rr
mov esi,3
jmp trfinval
eq1rr:
or dx,dx
je eq1
mov esi,4
jmp trfinval
eq1:
and edx,0ffffffh
jz eq11
mov esi,5
jmp trfinval
eq11:
mov esi,6
jmp trfinval
begincompare:
; here we now scan and match begin same
add edi,6
add esi,6
mov ecx,(MAX_MATCH-(2+4))/4 ; scan for at most MAX_MATCH bytes
repe cmpsd ; loop until mismatch
je trfin ; go to trfin if not unmatch
; we determine the unmatch byte
sub esi,4
mov edx,[edi-4]
xor edx,[esi]
or dl,dl
jnz trfin
inc esi
or dx,dx
jnz trfin
inc esi
and edx,0ffffffh
jnz trfin
inc esi
trfin:
sub esi,scan ; esi = len
trfinval:
; here we have finised compare, and esi contain len of equal string
cmp esi,best_len ; if len > best_len, go newbestlen
ja short newbestlen
; now we restore edx, ecx and esi, for the big loop
mov esi,prev
mov ecx,limit
mov edx,window
jmp contloop3
newbestlen:
mov best_len,esi ; len become best_len
mov match_start,eax ; save new position as match_start
cmp esi,nice_match ; if best_len >= nice_match, exit
jae exitloop
mov ecx,scan
mov edx,window ; restore edx=window
add ecx,esi
add esi,edx
dec esi
mov windowlen,esi ; windowlen = window + best_len-1
mov bx,[ecx-1] ; bx = *(scan+best_len-1) = scan_end
; now we restore ecx and esi, for the big loop :
mov esi,prev
mov ecx,limit
jmp contloop3
exitloop:
; exit : s->match_start=match_start
mov ebx,match_start
mov ebp,str_s
mov ecx,best_len
mov dword ptr [ebp+dep_match_start],ebx
mov eax,dword ptr [ebp+dep_lookahead]
cmp ecx,eax
ja minexlo
mov eax,ecx
minexlo:
; return min(best_len,s->lookahead)
; restore stack and register ebx,esi,edi,ebp
add esp,NbStackAdd
pop ebx
pop esi
pop edi
pop ebp
ret
InfoAuthor:
; please don't remove this string !
; Your are free use gvmat32 in any fre or commercial apps if you don't remove the string in the binary!
db 0dh,0ah,"GVMat32 optimised assembly code written 1996-98 by Gilles Vollant",0dh,0ah
IFDEF NOUNDERLINE
longest_match_7fff endp
ELSE
_longest_match_7fff endp
ENDIF
IFDEF NOUNDERLINE
cpudetect32 proc near
ELSE
_cpudetect32 proc near
ENDIF
pushfd ; push original EFLAGS
pop eax ; get original EFLAGS
mov ecx, eax ; save original EFLAGS
xor eax, 40000h ; flip AC bit in EFLAGS
push eax ; save new EFLAGS value on stack
popfd ; replace current EFLAGS value
pushfd ; get new EFLAGS
pop eax ; store new EFLAGS in EAX
xor eax, ecx ; can<61>t toggle AC bit, processor=80386
jz end_cpu_is_386 ; jump if 80386 processor
push ecx
popfd ; restore AC bit in EFLAGS first
pushfd
pushfd
pop ecx
mov eax, ecx ; get original EFLAGS
xor eax, 200000h ; flip ID bit in EFLAGS
push eax ; save new EFLAGS value on stack
popfd ; replace current EFLAGS value
pushfd ; get new EFLAGS
pop eax ; store new EFLAGS in EAX
popfd ; restore original EFLAGS
xor eax, ecx ; can<61>t toggle ID bit,
je is_old_486 ; processor=old
mov eax,1
db 0fh,0a2h ;CPUID
exitcpudetect:
ret
end_cpu_is_386:
mov eax,0300h
jmp exitcpudetect
is_old_486:
mov eax,0400h
jmp exitcpudetect
IFDEF NOUNDERLINE
cpudetect32 endp
ELSE
_cpudetect32 endp
ENDIF
_TEXT ends
end

View File

@@ -1,200 +0,0 @@
/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
* Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
* File written by Gilles Vollant, by modifiying the longest_match
* from Jean-loup Gailly in deflate.c
* it prepare all parameters and call the assembly longest_match_gvasm
* longest_match execute standard C code is wmask != 0x7fff
* (assembly code is faster with a fixed wmask)
*
*/
#include "deflate.h"
#undef FAR
#include <windows.h>
#ifdef ASMV
#define NIL 0
#define UNALIGNED_OK
/* if your C compiler don't add underline before function name,
define ADD_UNDERLINE_ASMFUNC */
#ifdef ADD_UNDERLINE_ASMFUNC
#define longest_match_7fff _longest_match_7fff
#endif
void match_init()
{
}
unsigned long cpudetect32();
uInt longest_match_c(
deflate_state *s,
IPos cur_match); /* current match */
uInt longest_match_7fff(
deflate_state *s,
IPos cur_match); /* current match */
uInt longest_match(
deflate_state *s,
IPos cur_match) /* current match */
{
static uInt iIsPPro=2;
if ((s->w_mask == 0x7fff) && (iIsPPro==0))
return longest_match_7fff(s,cur_match);
if (iIsPPro==2)
iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
return longest_match_c(s,cur_match);
}
uInt longest_match_c(s, cur_match)
deflate_state *s;
IPos cur_match; /* current match */
{
unsigned chain_length = s->max_chain_length;/* max hash chain length */
register Bytef *scan = s->window + s->strstart; /* current string */
register Bytef *match; /* matched string */
register int len; /* length of current match */
int best_len = s->prev_length; /* best match length so far */
int nice_match = s->nice_match; /* stop if match long enough */
IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
s->strstart - (IPos)MAX_DIST(s) : NIL;
/* Stop when cur_match becomes <= limit. To simplify the code,
* we prevent matches with the string of window index 0.
*/
Posf *prev = s->prev;
uInt wmask = s->w_mask;
#ifdef UNALIGNED_OK
/* Compare two bytes at a time. Note: this is not always beneficial.
* Try with and without -DUNALIGNED_OK to check.
*/
register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
register ush scan_start = *(ushf*)scan;
register ush scan_end = *(ushf*)(scan+best_len-1);
#else
register Bytef *strend = s->window + s->strstart + MAX_MATCH;
register Byte scan_end1 = scan[best_len-1];
register Byte scan_end = scan[best_len];
#endif
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
* It is easy to get rid of this optimization if necessary.
*/
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
/* Do not waste too much time if we already have a good match: */
if (s->prev_length >= s->good_match) {
chain_length >>= 2;
}
/* Do not look for matches beyond the end of the input. This is necessary
* to make deflate deterministic.
*/
if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
do {
Assert(cur_match < s->strstart, "no future");
match = s->window + cur_match;
/* Skip to next match if the match length cannot increase
* or if the match length is less than 2:
*/
#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
/* This code assumes sizeof(unsigned short) == 2. Do not use
* UNALIGNED_OK if your compiler uses a different size.
*/
if (*(ushf*)(match+best_len-1) != scan_end ||
*(ushf*)match != scan_start) continue;
/* It is not necessary to compare scan[2] and match[2] since they are
* always equal when the other bytes match, given that the hash keys
* are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
* strstart+3, +5, ... up to strstart+257. We check for insufficient
* lookahead only every 4th comparison; the 128th check will be made
* at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
* necessary to put more guard bytes at the end of the window, or
* to check more often for insufficient lookahead.
*/
Assert(scan[2] == match[2], "scan[2]?");
scan++, match++;
do {
} while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
scan < strend);
/* The funny "do {}" generates better code on most compilers */
/* Here, scan <= window+strstart+257 */
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
if (*scan == *match) scan++;
len = (MAX_MATCH - 1) - (int)(strend-scan);
scan = strend - (MAX_MATCH-1);
#else /* UNALIGNED_OK */
if (match[best_len] != scan_end ||
match[best_len-1] != scan_end1 ||
*match != *scan ||
*++match != scan[1]) continue;
/* The check at best_len-1 can be removed because it will be made
* again later. (This heuristic is not always a win.)
* It is not necessary to compare scan[2] and match[2] since they
* are always equal when the other bytes match, given that
* the hash keys are equal and that HASH_BITS >= 8.
*/
scan += 2, match++;
Assert(*scan == *match, "match[2]?");
/* We check for insufficient lookahead only every 8th comparison;
* the 256th check will be made at strstart+258.
*/
do {
} while (*++scan == *++match && *++scan == *++match &&
*++scan == *++match && *++scan == *++match &&
*++scan == *++match && *++scan == *++match &&
*++scan == *++match && *++scan == *++match &&
scan < strend);
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
len = MAX_MATCH - (int)(strend - scan);
scan = strend - MAX_MATCH;
#endif /* UNALIGNED_OK */
if (len > best_len) {
s->match_start = cur_match;
best_len = len;
if (len >= nice_match) break;
#ifdef UNALIGNED_OK
scan_end = *(ushf*)(scan+best_len-1);
#else
scan_end1 = scan[best_len-1];
scan_end = scan[best_len];
#endif
}
} while ((cur_match = prev[cur_match & wmask]) > limit
&& --chain_length != 0);
if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
return s->lookahead;
}
#endif /* ASMV */

View File

@@ -1 +0,0 @@
c:\masm611\bin\ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm

View File

@@ -1,74 +0,0 @@
LIBRARY "zlib"
DESCRIPTION '"""zlib data compression library"""'
VERSION 1.11
HEAPSIZE 1048576,8192
EXPORTS
adler32 @1
compress @2
crc32 @3
deflate @4
deflateCopy @5
deflateEnd @6
deflateInit2_ @7
deflateInit_ @8
deflateParams @9
deflateReset @10
deflateSetDictionary @11
gzclose @12
gzdopen @13
gzerror @14
gzflush @15
gzopen @16
gzread @17
gzwrite @18
inflate @19
inflateEnd @20
inflateInit2_ @21
inflateInit_ @22
inflateReset @23
inflateSetDictionary @24
inflateSync @25
uncompress @26
zlibVersion @27
gzprintf @28
gzputc @29
gzgetc @30
gzseek @31
gzrewind @32
gztell @33
gzeof @34
gzsetparams @35
zError @36
inflateSyncPoint @37
get_crc_table @38
compress2 @39
gzputs @40
gzgets @41
unzOpen @61
unzClose @62
unzGetGlobalInfo @63
unzGetCurrentFileInfo @64
unzGoToFirstFile @65
unzGoToNextFile @66
unzOpenCurrentFile @67
unzReadCurrentFile @68
unztell @70
unzeof @71
unzCloseCurrentFile @72
unzGetGlobalComment @73
unzStringFileNameCompare @74
unzLocateFile @75
unzGetLocalExtrafield @76
zipOpen @80
zipOpenNewFileInZip @81
zipWriteInFileInZip @82
zipCloseFileInZip @83
zipClose @84

View File

@@ -1,651 +0,0 @@
# Microsoft Developer Studio Project File - Name="zlibvc" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 5.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
# TARGTYPE "Win32 (ALPHA) Dynamic-Link Library" 0x0602
CFG=zlibvc - Win32 Release
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "zlibvc.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "zlibvc.mak" CFG="zlibvc - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "zlibvc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "zlibvc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "zlibvc - Win32 ReleaseAxp" (based on\
"Win32 (ALPHA) Dynamic-Link Library")
!MESSAGE "zlibvc - Win32 ReleaseWithoutAsm" (based on\
"Win32 (x86) Dynamic-Link Library")
!MESSAGE "zlibvc - Win32 ReleaseWithoutCrtdll" (based on\
"Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
!IF "$(CFG)" == "zlibvc - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir ".\Release"
# PROP BASE Intermediate_Dir ".\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir ".\Release"
# PROP Intermediate_Dir ".\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
CPP=cl.exe
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
# SUBTRACT CPP /YX
MTL=midl.exe
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir ".\Debug"
# PROP BASE Intermediate_Dir ".\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir ".\Debug"
# PROP Intermediate_Dir ".\Debug"
# PROP Target_Dir ""
CPP=cl.exe
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /FD /c
# SUBTRACT CPP /YX
MTL=midl.exe
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
RSC=rc.exe
# ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:".\Debug\zlib.dll"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "zlibvc__"
# PROP BASE Intermediate_Dir "zlibvc__"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "zlibvc__"
# PROP Intermediate_Dir "zlibvc__"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
MTL=midl.exe
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
CPP=cl.exe
# ADD BASE CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
# ADD CPP /nologo /MT /Gt0 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
# SUBTRACT CPP /YX
RSC=rc.exe
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:".\Release\zlib.dll"
# SUBTRACT BASE LINK32 /pdb:none
# ADD LINK32 crtdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /map /machine:ALPHA /nodefaultlib /out:"zlibvc__\zlib.dll"
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "zlibvc_0"
# PROP BASE Intermediate_Dir "zlibvc_0"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "zlibvc_0"
# PROP Intermediate_Dir "zlibvc_0"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
CPP=cl.exe
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /FAcs /FR /FD /c
# SUBTRACT CPP /YX
MTL=midl.exe
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
# SUBTRACT BASE LINK32 /pdb:none
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_0\zlib.dll"
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "zlibvc_1"
# PROP BASE Intermediate_Dir "zlibvc_1"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "zlibvc_1"
# PROP Intermediate_Dir "zlibvc_1"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
CPP=cl.exe
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_WINDLL" /D "_WIN32" /D "BUILD_ZLIBDLL" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FR /FD /c
# SUBTRACT CPP /YX
MTL=midl.exe
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\Release\zlib.dll"
# SUBTRACT BASE LINK32 /pdb:none
# ADD LINK32 gvmat32.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib crtdll.lib /nologo /subsystem:windows /dll /map /machine:I386 /nodefaultlib /out:".\zlibvc_1\zlib.dll"
# SUBTRACT LINK32 /pdb:none
!ENDIF
# Begin Target
# Name "zlibvc - Win32 Release"
# Name "zlibvc - Win32 Debug"
# Name "zlibvc - Win32 ReleaseAxp"
# Name "zlibvc - Win32 ReleaseWithoutAsm"
# Name "zlibvc - Win32 ReleaseWithoutCrtdll"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
# Begin Source File
SOURCE=.\adler32.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_ADLER=\
".\zconf.h"\
".\zlib.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\compress.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_COMPR=\
".\zconf.h"\
".\zlib.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\crc32.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_CRC32=\
".\zconf.h"\
".\zlib.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\deflate.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_DEFLA=\
".\deflate.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\gvmat32c.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\gzio.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_GZIO_=\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\infblock.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFBL=\
".\infblock.h"\
".\infcodes.h"\
".\inftrees.h"\
".\infutil.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\infcodes.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFCO=\
".\infblock.h"\
".\infcodes.h"\
".\inffast.h"\
".\inftrees.h"\
".\infutil.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\inffast.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFFA=\
".\infblock.h"\
".\infcodes.h"\
".\inffast.h"\
".\inftrees.h"\
".\infutil.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\inflate.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFLA=\
".\infblock.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\inftrees.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFTR=\
".\inftrees.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\infutil.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_INFUT=\
".\infblock.h"\
".\infcodes.h"\
".\inftrees.h"\
".\infutil.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\trees.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_TREES=\
".\deflate.h"\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\uncompr.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_UNCOM=\
".\zconf.h"\
".\zlib.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\unzip.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\zip.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\zlib.rc
# End Source File
# Begin Source File
SOURCE=.\zlibvc.def
# End Source File
# Begin Source File
SOURCE=.\zutil.c
!IF "$(CFG)" == "zlibvc - Win32 Release"
!ELSEIF "$(CFG)" == "zlibvc - Win32 Debug"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseAxp"
DEP_CPP_ZUTIL=\
".\zconf.h"\
".\zlib.h"\
".\zutil.h"\
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutAsm"
!ELSEIF "$(CFG)" == "zlibvc - Win32 ReleaseWithoutCrtdll"
!ENDIF
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
# Begin Source File
SOURCE=.\deflate.h
# End Source File
# Begin Source File
SOURCE=.\infblock.h
# End Source File
# Begin Source File
SOURCE=.\infcodes.h
# End Source File
# Begin Source File
SOURCE=.\inffast.h
# End Source File
# Begin Source File
SOURCE=.\inftrees.h
# End Source File
# Begin Source File
SOURCE=.\infutil.h
# End Source File
# Begin Source File
SOURCE=.\zconf.h
# End Source File
# Begin Source File
SOURCE=.\zlib.h
# End Source File
# Begin Source File
SOURCE=.\zutil.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

View File

@@ -1,41 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 5.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "zlibstat"=.\zlibstat.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "zlibvc"=.\zlibvc.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@@ -20,36 +20,36 @@
/* /*
* Change history: * Change history:
* *
* 1.0 12 Feb 2003 - First version * 1.0 12 Feb 2003 - First version
* 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data
*/ */
#include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */ #include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
#include "blast.h" /* prototype for blast() */ #include "blast.h" /* prototype for blast() */
#define local static /* for local function definitions */ #define local static /* for local function definitions */
#define MAXBITS 13 /* maximum code length */ #define MAXBITS 13 /* maximum code length */
#define MAXWIN 4096 /* maximum window size */ #define MAXWIN 4096 /* maximum window size */
/* input and output state */ /* input and output state */
struct state { struct state {
/* input state */ /* input state */
blast_in infun; /* input function provided by user */ blast_in infun; /* input function provided by user */
void *inhow; /* opaque information passed to infun() */ void *inhow; /* opaque information passed to infun() */
unsigned char *in; /* next input location */ unsigned char *in; /* next input location */
unsigned left; /* available input at in */ unsigned left; /* available input at in */
int bitbuf; /* bit buffer */ int bitbuf; /* bit buffer */
int bitcnt; /* number of bits in bit buffer */ int bitcnt; /* number of bits in bit buffer */
/* input limit error return state for bits() and decode() */ /* input limit error return state for bits() and decode() */
jmp_buf env; jmp_buf env;
/* output state */ /* output state */
blast_out outfun; /* output function provided by user */ blast_out outfun; /* output function provided by user */
void *outhow; /* opaque information passed to outfun() */ void *outhow; /* opaque information passed to outfun() */
unsigned next; /* index of next write location in out[] */ unsigned next; /* index of next write location in out[] */
int first; /* true to check distances (for first 4K) */ int first; /* true to check distances (for first 4K) */
unsigned char out[MAXWIN]; /* output buffer and sliding window */ unsigned char out[MAXWIN]; /* output buffer and sliding window */
}; };
/* /*
@@ -65,16 +65,16 @@ struct state {
*/ */
local int bits(struct state *s, int need) local int bits(struct state *s, int need)
{ {
int val; /* bit accumulator */ int val; /* bit accumulator */
/* load at least need bits into val */ /* load at least need bits into val */
val = s->bitbuf; val = s->bitbuf;
while (s->bitcnt < need) { while (s->bitcnt < need) {
if (s->left == 0) { if (s->left == 0) {
s->left = s->infun(s->inhow, &(s->in)); s->left = s->infun(s->inhow, &(s->in));
if (s->left == 0) longjmp(s->env, 1); /* out of input */ if (s->left == 0) longjmp(s->env, 1); /* out of input */
} }
val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */ val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */
s->left--; s->left--;
s->bitcnt += 8; s->bitcnt += 8;
} }
@@ -95,8 +95,8 @@ local int bits(struct state *s, int need)
* seen in the function decode() below. * seen in the function decode() below.
*/ */
struct huffman { struct huffman {
short *count; /* number of symbols of each length */ short *count; /* number of symbols of each length */
short *symbol; /* canonically ordered symbols */ short *symbol; /* canonically ordered symbols */
}; };
/* /*
@@ -122,14 +122,14 @@ struct huffman {
*/ */
local int decode(struct state *s, struct huffman *h) local int decode(struct state *s, struct huffman *h)
{ {
int len; /* current number of bits in code */ int len; /* current number of bits in code */
int code; /* len bits being decoded */ int code; /* len bits being decoded */
int first; /* first code of length len */ int first; /* first code of length len */
int count; /* number of codes of length len */ int count; /* number of codes of length len */
int index; /* index of first code of length len in symbol table */ int index; /* index of first code of length len in symbol table */
int bitbuf; /* bits from stream */ int bitbuf; /* bits from stream */
int left; /* bits left in next or left to process */ int left; /* bits left in next or left to process */
short *next; /* next number of codes */ short *next; /* next number of codes */
bitbuf = s->bitbuf; bitbuf = s->bitbuf;
left = s->bitcnt; left = s->bitcnt;
@@ -138,15 +138,15 @@ local int decode(struct state *s, struct huffman *h)
next = h->count + 1; next = h->count + 1;
while (1) { while (1) {
while (left--) { while (left--) {
code |= (bitbuf & 1) ^ 1; /* invert code */ code |= (bitbuf & 1) ^ 1; /* invert code */
bitbuf >>= 1; bitbuf >>= 1;
count = *next++; count = *next++;
if (code < first + count) { /* if length len, return symbol */ if (code < first + count) { /* if length len, return symbol */
s->bitbuf = bitbuf; s->bitbuf = bitbuf;
s->bitcnt = (s->bitcnt - len) & 7; s->bitcnt = (s->bitcnt - len) & 7;
return h->symbol[index + (code - first)]; return h->symbol[index + (code - first)];
} }
index += count; /* else update for next length */ index += count; /* else update for next length */
first += count; first += count;
first <<= 1; first <<= 1;
code <<= 1; code <<= 1;
@@ -156,13 +156,13 @@ local int decode(struct state *s, struct huffman *h)
if (left == 0) break; if (left == 0) break;
if (s->left == 0) { if (s->left == 0) {
s->left = s->infun(s->inhow, &(s->in)); s->left = s->infun(s->inhow, &(s->in));
if (s->left == 0) longjmp(s->env, 1); /* out of input */ if (s->left == 0) longjmp(s->env, 1); /* out of input */
} }
bitbuf = *(s->in)++; bitbuf = *(s->in)++;
s->left--; s->left--;
if (left > 8) left = 8; if (left > 8) left = 8;
} }
return -9; /* ran out of codes */ return -9; /* ran out of codes */
} }
/* /*
@@ -184,11 +184,11 @@ local int decode(struct state *s, struct huffman *h)
*/ */
local int construct(struct huffman *h, const unsigned char *rep, int n) local int construct(struct huffman *h, const unsigned char *rep, int n)
{ {
int symbol; /* current symbol when stepping through length[] */ int symbol; /* current symbol when stepping through length[] */
int len; /* current length when stepping through h->count[] */ int len; /* current length when stepping through h->count[] */
int left; /* number of possible codes left of current length */ int left; /* number of possible codes left of current length */
short offs[MAXBITS+1]; /* offsets in symbol table for each length */ short offs[MAXBITS+1]; /* offsets in symbol table for each length */
short length[256]; /* code lengths */ short length[256]; /* code lengths */
/* convert compact repeat counts into symbol bit length list */ /* convert compact repeat counts into symbol bit length list */
symbol = 0; symbol = 0;
@@ -206,17 +206,17 @@ local int construct(struct huffman *h, const unsigned char *rep, int n)
for (len = 0; len <= MAXBITS; len++) for (len = 0; len <= MAXBITS; len++)
h->count[len] = 0; h->count[len] = 0;
for (symbol = 0; symbol < n; symbol++) for (symbol = 0; symbol < n; symbol++)
(h->count[length[symbol]])++; /* assumes lengths are within bounds */ (h->count[length[symbol]])++; /* assumes lengths are within bounds */
if (h->count[0] == n) /* no codes! */ if (h->count[0] == n) /* no codes! */
return 0; /* complete, but decode() will fail */ return 0; /* complete, but decode() will fail */
/* check for an over-subscribed or incomplete set of lengths */ /* check for an over-subscribed or incomplete set of lengths */
left = 1; /* one possible code of zero length */ left = 1; /* one possible code of zero length */
for (len = 1; len <= MAXBITS; len++) { for (len = 1; len <= MAXBITS; len++) {
left <<= 1; /* one more bit, double codes left */ left <<= 1; /* one more bit, double codes left */
left -= h->count[len]; /* deduct count from possible codes */ left -= h->count[len]; /* deduct count from possible codes */
if (left < 0) return left; /* over-subscribed--return negative */ if (left < 0) return left; /* over-subscribed--return negative */
} /* left > 0 means incomplete */ } /* left > 0 means incomplete */
/* generate offsets into symbol table for each length for sorting */ /* generate offsets into symbol table for each length for sorting */
offs[1] = 0; offs[1] = 0;
@@ -275,35 +275,35 @@ local int construct(struct huffman *h, const unsigned char *rep, int n)
*/ */
local int decomp(struct state *s) local int decomp(struct state *s)
{ {
int lit; /* true if literals are coded */ int lit; /* true if literals are coded */
int dict; /* log2(dictionary size) - 6 */ int dict; /* log2(dictionary size) - 6 */
int symbol; /* decoded symbol, extra bits for distance */ int symbol; /* decoded symbol, extra bits for distance */
int len; /* length for copy */ int len; /* length for copy */
int dist; /* distance for copy */ int dist; /* distance for copy */
int copy; /* copy counter */ int copy; /* copy counter */
unsigned char *from, *to; /* copy pointers */ unsigned char *from, *to; /* copy pointers */
static int virgin = 1; /* build tables once */ static int virgin = 1; /* build tables once */
static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */ static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */
static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */ static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */
static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */ static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */
static struct huffman litcode = {litcnt, litsym}; /* length code */ static struct huffman litcode = {litcnt, litsym}; /* length code */
static struct huffman lencode = {lencnt, lensym}; /* length code */ static struct huffman lencode = {lencnt, lensym}; /* length code */
static struct huffman distcode = {distcnt, distsym};/* distance code */ static struct huffman distcode = {distcnt, distsym};/* distance code */
/* bit lengths of literal codes */ /* bit lengths of literal codes */
static const unsigned char litlen[] = { static const unsigned char litlen[] = {
11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
44, 173}; 44, 173};
/* bit lengths of length codes 0..15 */ /* bit lengths of length codes 0..15 */
static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23}; static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23};
/* bit lengths of distance codes 0..63 */ /* bit lengths of distance codes 0..63 */
static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248}; static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248};
static const short base[16] = { /* base for length codes */ static const short base[16] = { /* base for length codes */
3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264}; 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264};
static const char extra[16] = { /* extra bits for length codes */ static const char extra[16] = { /* extra bits for length codes */
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
/* set up decoding tables (once--might not be thread-safe) */ /* set up decoding tables (once--might not be thread-safe) */
@@ -326,7 +326,7 @@ local int decomp(struct state *s)
/* get length */ /* get length */
symbol = decode(s, &lencode); symbol = decode(s, &lencode);
len = base[symbol] + bits(s, extra[symbol]); len = base[symbol] + bits(s, extra[symbol]);
if (len == 519) break; /* end code */ if (len == 519) break; /* end code */
/* get distance */ /* get distance */
symbol = len == 2 ? 2 : dict; symbol = len == 2 ? 2 : dict;
@@ -334,7 +334,7 @@ local int decomp(struct state *s)
dist += bits(s, symbol); dist += bits(s, symbol);
dist++; dist++;
if (s->first && dist > s->next) if (s->first && dist > s->next)
return -3; /* distance too far back */ return -3; /* distance too far back */
/* copy length bytes from distance bytes back */ /* copy length bytes from distance bytes back */
do { do {
@@ -376,8 +376,8 @@ local int decomp(struct state *s)
/* See comments in blast.h */ /* See comments in blast.h */
int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow) int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow)
{ {
struct state s; /* input/output state */ struct state s; /* input/output state */
int err; /* return value */ int err; /* return value */
/* initialize input state */ /* initialize input state */
s.infun = infun; s.infun = infun;
@@ -393,10 +393,10 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow)
s.first = 1; s.first = 1;
/* return if bits() or decode() tries to read past available input */ /* return if bits() or decode() tries to read past available input */
if (setjmp(s.env) != 0) /* if came back here via longjmp(), */ if (setjmp(s.env) != 0) /* if came back here via longjmp(), */
err = 2; /* then skip decomp(), return error */ err = 2; /* then skip decomp(), return error */
else else
err = decomp(&s); /* decompress */ err = decomp(&s); /* decompress */
/* write any leftover output and update the error code if needed */ /* write any leftover output and update the error code if needed */
if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0) if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0)

View File

@@ -18,7 +18,7 @@
misrepresented as being the original software. misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
Mark Adler madler@alumni.caltech.edu Mark Adler madler@alumni.caltech.edu
*/ */

View File

@@ -1,33 +1,33 @@
{*******************************************************} {*******************************************************}
{ } { }
{ Delphi Supplemental Components } { Borland Delphi Supplemental Components }
{ ZLIB Data Compression Interface Unit } { ZLIB Data Compression Interface Unit }
{ } { }
{ Copyright (c) 1997 Borland International } { Copyright (c) 1997,99 Borland Corporation }
{ } { }
{*******************************************************} {*******************************************************}
{ Modified for zlib 1.1.3 by Davide Moretti <dave@rimini.com } { Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
unit zlib; unit ZLib;
interface interface
uses Sysutils, Classes; uses SysUtils, Classes;
type type
TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
TFree = procedure (AppData, Block: Pointer); TFree = procedure (AppData, Block: Pointer); cdecl;
// Internal structure. Ignore. // Internal structure. Ignore.
TZStreamRec = packed record TZStreamRec = packed record
next_in: PChar; // next input byte next_in: PChar; // next input byte
avail_in: Integer; // number of bytes available at next_in avail_in: Integer; // number of bytes available at next_in
total_in: Integer; // total nb of input bytes read so far total_in: Longint; // total nb of input bytes read so far
next_out: PChar; // next output byte should be put here next_out: PChar; // next output byte should be put here
avail_out: Integer; // remaining free space at next_out avail_out: Integer; // remaining free space at next_out
total_out: Integer; // total nb of bytes output so far total_out: Longint; // total nb of bytes output so far
msg: PChar; // last error message, NULL if no error msg: PChar; // last error message, NULL if no error
internal: Pointer; // not visible by applications internal: Pointer; // not visible by applications
@@ -36,9 +36,9 @@ type
zfree: TFree; // used to free the internal state zfree: TFree; // used to free the internal state
AppData: Pointer; // private data object passed to zalloc and zfree AppData: Pointer; // private data object passed to zalloc and zfree
data_type: Integer; // best guess about the data type: ascii or binary data_type: Integer; // best guess about the data type: ascii or binary
adler: Integer; // adler32 value of the uncompressed data adler: Longint; // adler32 value of the uncompressed data
reserved: Integer; // reserved for future use reserved: Longint; // reserved for future use
end; end;
// Abstract ancestor class // Abstract ancestor class
@@ -143,18 +143,26 @@ procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
In: InBuf = ptr to compressed data
InBytes = number of bytes in InBuf
Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
BufSize = number of bytes in OutBuf }
procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer);
const const
zlib_version = '1.1.3'; zlib_version = '1.2.1';
type type
EZlibError = class(Exception); EZlibError = class(Exception);
ECompressionError = class(EZlibError); ECompressionError = class(EZlibError);
EDecompressionError = class(EZlibError); EDecompressionError = class(EZlibError);
function adler32(adler: Integer; buf: PChar; len: Integer): Integer;
implementation implementation
uses ZLibConst;
const const
Z_NO_FLUSH = 0; Z_NO_FLUSH = 0;
Z_PARTIAL_FLUSH = 1; Z_PARTIAL_FLUSH = 1;
@@ -179,6 +187,7 @@ const
Z_FILTERED = 1; Z_FILTERED = 1;
Z_HUFFMAN_ONLY = 2; Z_HUFFMAN_ONLY = 2;
Z_RLE = 3;
Z_DEFAULT_STRATEGY = 0; Z_DEFAULT_STRATEGY = 0;
Z_BINARY = 0; Z_BINARY = 0;
@@ -187,56 +196,41 @@ const
Z_DEFLATED = 8; Z_DEFLATED = 8;
_z_errmsg: array[0..9] of PChar = (
'need dictionary', // Z_NEED_DICT (2)
'stream end', // Z_STREAM_END (1)
'', // Z_OK (0)
'file error', // Z_ERRNO (-1)
'stream error', // Z_STREAM_ERROR (-2)
'data error', // Z_DATA_ERROR (-3)
'insufficient memory', // Z_MEM_ERROR (-4)
'buffer error', // Z_BUF_ERROR (-5)
'incompatible version', // Z_VERSION_ERROR (-6)
''
);
{$L adler32.obj}
{$L compress.obj}
{$L crc32.obj}
{$L deflate.obj} {$L deflate.obj}
{$L infback.obj}
{$L inffast.obj}
{$L inflate.obj} {$L inflate.obj}
{$L inftrees.obj} {$L inftrees.obj}
{$L trees.obj} {$L trees.obj}
{$L adler32.obj} {$L uncompr.obj}
{$L infblock.obj} {$L zutil.obj}
{$L infcodes.obj}
{$L infutil.obj}
{$L inffast.obj}
procedure _tr_init; external; procedure adler32; external;
procedure _tr_tally; external; procedure compressBound; external;
procedure _tr_flush_block; external; procedure crc32; external;
procedure _tr_align; external; procedure deflateInit2_; external;
procedure _tr_stored_block; external; procedure deflateParams; external;
function adler32; external;
procedure inflate_blocks_new; external;
procedure inflate_blocks; external;
procedure inflate_blocks_reset; external;
procedure inflate_blocks_free; external;
procedure inflate_set_dictionary; external;
procedure inflate_trees_bits; external;
procedure inflate_trees_dynamic; external;
procedure inflate_trees_fixed; external;
procedure inflate_codes_new; external;
procedure inflate_codes; external;
procedure inflate_codes_free; external;
procedure _inflate_mask; external;
procedure inflate_flush; external;
procedure inflate_fast; external;
procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl; function _malloc(Size: Integer): Pointer; cdecl;
begin
Result := AllocMem(Size);
end;
procedure _free(Block: Pointer); cdecl;
begin
FreeMem(Block);
end;
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
begin begin
FillChar(P^, count, B); FillChar(P^, count, B);
end; end;
procedure _memcpy(dest, source: Pointer; count: Integer);cdecl; procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
begin begin
Move(source^, dest^, count); Move(source^, dest^, count);
end; end;
@@ -257,22 +251,23 @@ function inflateEnd(var strm: TZStreamRec): Integer; external;
function inflateReset(var strm: TZStreamRec): Integer; external; function inflateReset(var strm: TZStreamRec): Integer; external;
function zcalloc(AppData: Pointer; Items, Size: Integer): Pointer; function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
begin begin
GetMem(Result, Items*Size); // GetMem(Result, Items*Size);
Result := AllocMem(Items * Size);
end; end;
procedure zcfree(AppData, Block: Pointer); procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
begin begin
FreeMem(Block); FreeMem(Block);
end; end;
function zlibCheck(code: Integer): Integer; {function zlibCheck(code: Integer): Integer;
begin begin
Result := code; Result := code;
if code < 0 then if code < 0 then
raise EZlibError.Create('error'); //!! raise EZlibError.Create('error'); //!!
end; end;}
function CCheck(code: Integer): Integer; function CCheck(code: Integer): Integer;
begin begin
@@ -295,6 +290,8 @@ var
P: Pointer; P: Pointer;
begin begin
FillChar(strm, sizeof(strm), 0); FillChar(strm, sizeof(strm), 0);
strm.zalloc := zlibAllocMem;
strm.zfree := zlibFreeMem;
OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
GetMem(OutBuf, OutBytes); GetMem(OutBuf, OutBytes);
try try
@@ -332,6 +329,8 @@ var
BufInc: Integer; BufInc: Integer;
begin begin
FillChar(strm, sizeof(strm), 0); FillChar(strm, sizeof(strm), 0);
strm.zalloc := zlibAllocMem;
strm.zfree := zlibFreeMem;
BufInc := (InBytes + 255) and not 255; BufInc := (InBytes + 255) and not 255;
if OutEstimate = 0 then if OutEstimate = 0 then
OutBytes := BufInc OutBytes := BufInc
@@ -364,6 +363,26 @@ begin
end; end;
end; end;
procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer);
var
strm: TZStreamRec;
begin
FillChar(strm, sizeof(strm), 0);
strm.zalloc := zlibAllocMem;
strm.zfree := zlibFreeMem;
strm.next_in := InBuf;
strm.avail_in := InBytes;
strm.next_out := OutBuf;
strm.avail_out := BufSize;
DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
try
if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
raise EZlibError.CreateRes(@sTargetBufferTooSmall);
finally
DCheck(inflateEnd(strm));
end;
end;
// TCustomZlibStream // TCustomZlibStream
@@ -372,6 +391,8 @@ begin
inherited Create; inherited Create;
FStrm := Strm; FStrm := Strm;
FStrmPos := Strm.Position; FStrmPos := Strm.Position;
FZRec.zalloc := zlibAllocMem;
FZRec.zfree := zlibFreeMem;
end; end;
procedure TCustomZLibStream.Progress(Sender: TObject); procedure TCustomZLibStream.Progress(Sender: TObject);
@@ -417,7 +438,7 @@ end;
function TCompressionStream.Read(var Buffer; Count: Longint): Longint; function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
begin begin
raise ECompressionError.Create('Invalid stream operation'); raise ECompressionError.CreateRes(@sInvalidStreamOp);
end; end;
function TCompressionStream.Write(const Buffer; Count: Longint): Longint; function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
@@ -445,7 +466,7 @@ begin
if (Offset = 0) and (Origin = soFromCurrent) then if (Offset = 0) and (Origin = soFromCurrent) then
Result := FZRec.total_in Result := FZRec.total_in
else else
raise ECompressionError.Create('Invalid stream operation'); raise ECompressionError.CreateRes(@sInvalidStreamOp);
end; end;
function TCompressionStream.GetCompressionRate: Single; function TCompressionStream.GetCompressionRate: Single;
@@ -469,6 +490,7 @@ end;
destructor TDecompressionStream.Destroy; destructor TDecompressionStream.Destroy;
begin begin
FStrm.Seek(-FZRec.avail_in, 1);
inflateEnd(FZRec); inflateEnd(FZRec);
inherited Destroy; inherited Destroy;
end; end;
@@ -484,22 +506,22 @@ begin
begin begin
FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
if FZRec.avail_in = 0 then if FZRec.avail_in = 0 then
begin begin
Result := Count - FZRec.avail_out; Result := Count - FZRec.avail_out;
Exit; Exit;
end; end;
FZRec.next_in := FBuffer; FZRec.next_in := FBuffer;
FStrmPos := FStrm.Position; FStrmPos := FStrm.Position;
Progress(Self); Progress(Self);
end; end;
DCheck(inflate(FZRec, 0)); CCheck(inflate(FZRec, 0));
end; end;
Result := Count; Result := Count;
end; end;
function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
begin begin
raise EDecompressionError.Create('Invalid stream operation'); raise EDecompressionError.CreateRes(@sInvalidStreamOp);
end; end;
function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
@@ -527,8 +549,9 @@ begin
end; end;
end end
else else
raise EDecompressionError.Create('Invalid stream operation'); raise EDecompressionError.CreateRes(@sInvalidStreamOp);
Result := FZRec.total_out; Result := FZRec.total_out;
end; end;
end. end.

View File

@@ -0,0 +1,11 @@
unit ZLibConst;
interface
resourcestring
sTargetBufferTooSmall = 'ZLib error: target buffer may be too small';
sInvalidStreamOp = 'Invalid stream operation';
implementation
end.

76
contrib/delphi/readme.txt Normal file
View File

@@ -0,0 +1,76 @@
Overview
========
This directory contains an update to the ZLib interface unit,
distributed by Borland as a Delphi supplemental component.
The original ZLib unit is Copyright (c) 1997,99 Borland Corp.,
and is based on zlib version 1.0.4. There are a series of bugs
and security problems associated with that old zlib version, and
we recommend the users to update their ZLib unit.
Summary of modifications
========================
- Improved makefile, adapted to zlib version 1.2.0.
- Some field types from TZStreamRec are changed from Integer to
Longint, for consistency with the zlib.h header, and for 64-bit
readiness.
- The zlib_version constant is updated.
- The new Z_RLE strategy has its corresponding symbolic constant.
- The allocation and deallocation functions and function types
(TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl,
and _malloc and _free are added as C RTL stubs. As a result,
the original C sources of zlib can be compiled out of the box,
and linked to the ZLib unit.
Suggestions for improvements
============================
Currently, the ZLib unit provides only a limited wrapper around
the zlib library, and much of the original zlib functionality is
missing. Handling compressed file formats like ZIP/GZIP or PNG
cannot be implemented without having this functionality.
Applications that handle these formats are either using their own,
duplicated code, or not using the ZLib unit at all.
Here are a few suggestions:
- Checksum class wrappers around adler32() and crc32(), similar
to the Java classes that implement the java.util.zip.Checksum
interface.
- The ability to read and write raw deflate streams, without the
zlib stream header and trailer. Raw deflate streams are used
in the ZIP file format.
- The ability to read and write gzip streams, used in the GZIP
file format, and normally produced by the gzip program.
- The ability to select a different compression strategy, useful
to PNG and MNG image compression, and to multimedia compression
in general. Besides the compression level
TCompressionLevel = (clNone, clFastest, clDefault, clMax);
which, in fact, could have used the 'z' prefix and avoided
TColor-like symbols
TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax);
there could be a compression strategy
TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle);
- ZIP and GZIP stream handling via TStreams.
--
Cosmin Truta <cosmint@cs.ubbcluj.ro>

View File

@@ -1,36 +0,0 @@
# Makefile for zlib32bd.lib
# ------------- Borland C++ 4.5 -------------
# The (32-bit) zlib32bd.lib made with this makefile is intended for use
# in making the (32-bit) DLL, png32bd.dll. It uses the "stdcall" calling
# convention.
CFLAGS= -ps -O2 -C -K -N- -k- -d -3 -r- -w-par -w-aus -WDE
CC=f:\bc45\bin\bcc32
LIBFLAGS= /C
LIB=f:\bc45\bin\tlib
ZLIB=zlib32bd.lib
.autodepend
.c.obj:
$(CC) -c $(CFLAGS) $<
OBJ1=adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj
OBJ2=infcodes.obj inflate.obj inftrees.obj infutil.obj inffast.obj
OBJ3=trees.obj uncompr.obj zutil.obj
pOBJ1=+adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infblock.obj
pOBJ2=+infcodes.obj+inflate.obj+inftrees.obj+infutil.obj+inffast.obj
pOBJ3=+trees.obj+uncompr.obj+zutil.obj
all: $(ZLIB)
$(ZLIB): $(OBJ1) $(OBJ2) $(OBJ3)
@if exist $@ del $@
$(LIB) @&&|
$@ $(LIBFLAGS) &
$(pOBJ1) &
$(pOBJ2) &
$(pOBJ3)
|
# End of makefile for zlib32bd.lib

View File

@@ -0,0 +1,93 @@
# Makefile for zlib
# For use with Delphi and C++ Builder under Win32
# Updated for zlib 1.2.x by Cosmin Truta
# ------------ Borland C++ ------------
# This project uses the Delphi (fastcall/register) calling convention:
LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
CC = bcc32
LD = bcc32
AR = tlib
# do not use "-pr" in CFLAGS
CFLAGS = -a -d -k- -O2 $(LOC)
LDFLAGS =
# variables
ZLIB_LIB = zlib.lib
OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj
OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
# targets
all: $(ZLIB_LIB) example.exe minigzip.exe
.c.obj:
$(CC) -c $(CFLAGS) $*.c
adler32.obj: adler32.c zlib.h zconf.h
compress.obj: compress.c zlib.h zconf.h
crc32.obj: crc32.c zlib.h zconf.h crc32.h
deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
gzio.obj: gzio.c zutil.h zlib.h zconf.h
infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h inffixed.h
inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h
inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h inffixed.h
inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
uncompr.obj: uncompr.c zlib.h zconf.h
zutil.obj: zutil.c zutil.h zlib.h zconf.h
example.obj: example.c zlib.h zconf.h
minigzip.obj: minigzip.c zlib.h zconf.h
# For the sake of the old Borland make,
# the command line is cut to fit in the MS-DOS 128 byte limit:
$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-del $(ZLIB_LIB)
$(AR) $(ZLIB_LIB) $(OBJP1)
$(AR) $(ZLIB_LIB) $(OBJP2)
# testing
test: example.exe minigzip.exe
example
echo hello world | minigzip | minigzip -d
example.exe: example.obj $(ZLIB_LIB)
$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
minigzip.exe: minigzip.obj $(ZLIB_LIB)
$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
# cleanup
clean:
-del *.obj
-del *.exe
-del *.lib
-del *.tds
-del zlib.bak
-del foo.gz

View File

@@ -1,169 +0,0 @@
unit zlibdef;
interface
uses
Windows;
const
ZLIB_VERSION = '1.1.3';
type
voidpf = Pointer;
int = Integer;
uInt = Cardinal;
pBytef = PChar;
uLong = Cardinal;
alloc_func = function(opaque: voidpf; items, size: uInt): voidpf;
stdcall;
free_func = procedure(opaque, address: voidpf);
stdcall;
internal_state = Pointer;
z_streamp = ^z_stream;
z_stream = packed record
next_in: pBytef; // next input byte
avail_in: uInt; // number of bytes available at next_in
total_in: uLong; // total nb of input bytes read so far
next_out: pBytef; // next output byte should be put there
avail_out: uInt; // remaining free space at next_out
total_out: uLong; // total nb of bytes output so far
msg: PChar; // last error message, NULL if no error
state: internal_state; // not visible by applications
zalloc: alloc_func; // used to allocate the internal state
zfree: free_func; // used to free the internal state
opaque: voidpf; // private data object passed to zalloc and zfree
data_type: int; // best guess about the data type: ascii or binary
adler: uLong; // adler32 value of the uncompressed data
reserved: uLong; // reserved for future use
end;
const
Z_NO_FLUSH = 0;
Z_SYNC_FLUSH = 2;
Z_FULL_FLUSH = 3;
Z_FINISH = 4;
Z_OK = 0;
Z_STREAM_END = 1;
Z_NO_COMPRESSION = 0;
Z_BEST_SPEED = 1;
Z_BEST_COMPRESSION = 9;
Z_DEFAULT_COMPRESSION = -1;
Z_FILTERED = 1;
Z_HUFFMAN_ONLY = 2;
Z_DEFAULT_STRATEGY = 0;
Z_BINARY = 0;
Z_ASCII = 1;
Z_UNKNOWN = 2;
Z_DEFLATED = 8;
MAX_MEM_LEVEL = 9;
function adler32(adler: uLong; const buf: pBytef; len: uInt): uLong;
stdcall;
function crc32(crc: uLong; const buf: pBytef; len: uInt): uLong;
stdcall;
function deflate(strm: z_streamp; flush: int): int;
stdcall;
function deflateCopy(dest, source: z_streamp): int;
stdcall;
function deflateEnd(strm: z_streamp): int;
stdcall;
function deflateInit2_(strm: z_streamp; level, method,
windowBits, memLevel, strategy: int;
const version: PChar; stream_size: int): int;
stdcall;
function deflateInit_(strm: z_streamp; level: int;
const version: PChar; stream_size: int): int;
stdcall;
function deflateParams(strm: z_streamp; level, strategy: int): int;
stdcall;
function deflateReset(strm: z_streamp): int;
stdcall;
function deflateSetDictionary(strm: z_streamp;
const dictionary: pBytef;
dictLength: uInt): int;
stdcall;
function inflate(strm: z_streamp; flush: int): int;
stdcall;
function inflateEnd(strm: z_streamp): int;
stdcall;
function inflateInit2_(strm: z_streamp; windowBits: int;
const version: PChar; stream_size: int): int;
stdcall;
function inflateInit_(strm: z_streamp; const version: PChar;
stream_size: int): int;
stdcall;
function inflateReset(strm: z_streamp): int;
stdcall;
function inflateSetDictionary(strm: z_streamp;
const dictionary: pBytef;
dictLength: uInt): int;
stdcall;
function inflateSync(strm: z_streamp): int;
stdcall;
function deflateInit(strm: z_streamp; level: int): int;
function deflateInit2(strm: z_streamp; level, method, windowBits,
memLevel, strategy: int): int;
function inflateInit(strm: z_streamp): int;
function inflateInit2(strm: z_streamp; windowBits: int): int;
implementation
function deflateInit(strm: z_streamp; level: int): int;
begin
Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
end;
function deflateInit2(strm: z_streamp; level, method, windowBits,
memLevel, strategy: int): int;
begin
Result := deflateInit2_(strm, level, method, windowBits, memLevel,
strategy, ZLIB_VERSION, sizeof(z_stream));
end;
function inflateInit(strm: z_streamp): int;
begin
Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
end;
function inflateInit2(strm: z_streamp; windowBits: int): int;
begin
Result := inflateInit2_(strm, windowBits, ZLIB_VERSION,
sizeof(z_stream));
end;
const
zlibDLL = 'png32bd.dll';
function adler32; external zlibDLL;
function crc32; external zlibDLL;
function deflate; external zlibDLL;
function deflateCopy; external zlibDLL;
function deflateEnd; external zlibDLL;
function deflateInit2_; external zlibDLL;
function deflateInit_; external zlibDLL;
function deflateParams; external zlibDLL;
function deflateReset; external zlibDLL;
function deflateSetDictionary; external zlibDLL;
function inflate; external zlibDLL;
function inflateEnd; external zlibDLL;
function inflateInit2_; external zlibDLL;
function inflateInit_; external zlibDLL;
function inflateReset; external zlibDLL;
function inflateSetDictionary; external zlibDLL;
function inflateSync; external zlibDLL;
end.

View File

@@ -1,224 +0,0 @@
# ---------------------------------------------------------------------------
!if !$d(BCB)
BCB = $(MAKEDIR)\..
!endif
# ---------------------------------------------------------------------------
# IDE SECTION
# ---------------------------------------------------------------------------
# The following section of the project makefile is managed by the BCB IDE.
# It is recommended to use the IDE to change any of the values in this
# section.
# ---------------------------------------------------------------------------
VERSION = BCB.03
# ---------------------------------------------------------------------------
PROJECT = d_zlib.lib
OBJFILES = d_zlib.obj adler32.obj deflate.obj infblock.obj infcodes.obj inffast.obj \
inflate.obj inftrees.obj infutil.obj trees.obj
RESFILES =
RESDEPEN = $(RESFILES)
LIBFILES =
LIBRARIES = VCL35.lib
SPARELIBS = VCL35.lib
DEFFILE =
PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
# ---------------------------------------------------------------------------
PATHCPP = .;
PATHASM = .;
PATHPAS = .;
PATHRC = .;
DEBUGLIBPATH = $(BCB)\lib\debug
RELEASELIBPATH = $(BCB)\lib\release
# ---------------------------------------------------------------------------
CFLAG1 = -O2 -Ve -d -k- -vi
CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
CFLAG3 = -ff -pr -5
PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl
AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
LFLAGS =
IFLAGS = -g -Gn
# ---------------------------------------------------------------------------
ALLOBJ = c0w32.obj $(OBJFILES)
ALLRES = $(RESFILES)
ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
# ---------------------------------------------------------------------------
!!ifdef IDEOPTIONS
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1040
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=2
Item0=$(BCB)\include
Item1=$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=1
Item0=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[Debugging]
DebugSourceDirs=
[Parameters]
RunParams=
HostApplication=
!endif
---------------------------------------------------------------------------
# MAKE SECTION
# ---------------------------------------------------------------------------
# This section of the project file is not used by the BCB IDE. It is for
# the benefit of building from the command-line using the MAKE utility.
# ---------------------------------------------------------------------------
.autodepend
# ---------------------------------------------------------------------------
!if !$d(BCC32)
BCC32 = bcc32
!endif
!if !$d(DCC32)
DCC32 = dcc32
!endif
!if !$d(TASM32)
TASM32 = tasm32
!endif
!if !$d(LINKER)
LINKER = TLib
!endif
!if !$d(BRCC32)
BRCC32 = brcc32
!endif
# ---------------------------------------------------------------------------
!if $d(PATHCPP)
.PATH.CPP = $(PATHCPP)
.PATH.C = $(PATHCPP)
!endif
!if $d(PATHPAS)
.PATH.PAS = $(PATHPAS)
!endif
!if $d(PATHASM)
.PATH.ASM = $(PATHASM)
!endif
!if $d(PATHRC)
.PATH.RC = $(PATHRC)
!endif
# ---------------------------------------------------------------------------
!ifdef IDEOPTIONS
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1040
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=2
Item0=$(BCB)\include;$(BCB)\include\vcl
Item1=$(BCB)\include
[HistoryLists\hlLibraryPath]
Count=1
Item0=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[Debugging]
DebugSourceDirs=
[Parameters]
RunParams=
HostApplication=
!endif
$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
$(BCB)\BIN\$(LINKER) @&&!
$(LFLAGS) $(IFLAGS) +
$(ALLOBJ), +
$(PROJECT),, +
$(ALLLIB), +
$(DEFFILE), +
$(ALLRES)
!
# ---------------------------------------------------------------------------
.pas.hpp:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.pas.obj:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.cpp.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.c.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.asm.obj:
$(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
.rc.res:
$(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
# ---------------------------------------------------------------------------

View File

@@ -1,17 +0,0 @@
#include <condefs.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEUNIT("adler32.c");
USEUNIT("deflate.c");
USEUNIT("infblock.c");
USEUNIT("infcodes.c");
USEUNIT("inffast.c");
USEUNIT("inflate.c");
USEUNIT("inftrees.c");
USEUNIT("infutil.c");
USEUNIT("trees.c");
//---------------------------------------------------------------------------
#define Library
// To add a file to the library use the Project menu 'Add to Project'.

View File

@@ -1,17 +0,0 @@
These are files used to compile zlib under Borland C++ Builder 3.
zlib.bpg is the main project group that can be loaded in the BCB IDE and
loads all other *.bpr projects
zlib.bpr is a project used to create a static zlib.lib library with C calling
convention for functions.
zlib32.bpr creates a zlib32.dll dynamic link library with Windows standard
calling convention.
d_zlib.bpr creates a set of .obj files with register calling convention.
These files are used by zlib.pas to create a Delphi unit containing zlib.
The d_zlib.lib file generated isn't useful and can be deleted.
zlib.cpp, zlib32.cpp and d_zlib.cpp are used by the above projects.

View File

@@ -1,26 +0,0 @@
#------------------------------------------------------------------------------
VERSION = BWS.01
#------------------------------------------------------------------------------
!ifndef ROOT
ROOT = $(MAKEDIR)\..
!endif
#------------------------------------------------------------------------------
MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
DCC = $(ROOT)\bin\dcc32.exe $**
BRCC = $(ROOT)\bin\brcc32.exe $**
#------------------------------------------------------------------------------
PROJECTS = zlib zlib32 d_zlib
#------------------------------------------------------------------------------
default: $(PROJECTS)
#------------------------------------------------------------------------------
zlib: zlib.bpr
$(MAKE)
zlib32: zlib32.bpr
$(MAKE)
d_zlib: d_zlib.bpr
$(MAKE)

View File

@@ -1,225 +0,0 @@
# ---------------------------------------------------------------------------
!if !$d(BCB)
BCB = $(MAKEDIR)\..
!endif
# ---------------------------------------------------------------------------
# IDE SECTION
# ---------------------------------------------------------------------------
# The following section of the project makefile is managed by the BCB IDE.
# It is recommended to use the IDE to change any of the values in this
# section.
# ---------------------------------------------------------------------------
VERSION = BCB.03
# ---------------------------------------------------------------------------
PROJECT = zlib.lib
OBJFILES = zlib.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
uncompr.obj zutil.obj
RESFILES =
RESDEPEN = $(RESFILES)
LIBFILES =
LIBRARIES = VCL35.lib
SPARELIBS = VCL35.lib
DEFFILE =
PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
# ---------------------------------------------------------------------------
PATHCPP = .;
PATHASM = .;
PATHPAS = .;
PATHRC = .;
DEBUGLIBPATH = $(BCB)\lib\debug
RELEASELIBPATH = $(BCB)\lib\release
# ---------------------------------------------------------------------------
CFLAG1 = -O2 -Ve -d -k- -vi
CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -H=$(BCB)\lib\vcl35.csm
CFLAG3 = -ff -5
PFLAGS = -U;$(DEBUGLIBPATH) -I$(BCB)\include;$(BCB)\include\vcl -H -W -$I- -v -JPHN -M
RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl
AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /mx /w2 /zn
LFLAGS =
IFLAGS = -g -Gn
# ---------------------------------------------------------------------------
ALLOBJ = c0w32.obj $(OBJFILES)
ALLRES = $(RESFILES)
ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
# ---------------------------------------------------------------------------
!!ifdef IDEOPTIONS
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1040
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=2
Item0=$(BCB)\include
Item1=$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=1
Item0=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[Debugging]
DebugSourceDirs=
[Parameters]
RunParams=
HostApplication=
!endif
---------------------------------------------------------------------------
# MAKE SECTION
# ---------------------------------------------------------------------------
# This section of the project file is not used by the BCB IDE. It is for
# the benefit of building from the command-line using the MAKE utility.
# ---------------------------------------------------------------------------
.autodepend
# ---------------------------------------------------------------------------
!if !$d(BCC32)
BCC32 = bcc32
!endif
!if !$d(DCC32)
DCC32 = dcc32
!endif
!if !$d(TASM32)
TASM32 = tasm32
!endif
!if !$d(LINKER)
LINKER = TLib
!endif
!if !$d(BRCC32)
BRCC32 = brcc32
!endif
# ---------------------------------------------------------------------------
!if $d(PATHCPP)
.PATH.CPP = $(PATHCPP)
.PATH.C = $(PATHCPP)
!endif
!if $d(PATHPAS)
.PATH.PAS = $(PATHPAS)
!endif
!if $d(PATHASM)
.PATH.ASM = $(PATHASM)
!endif
!if $d(PATHRC)
.PATH.RC = $(PATHRC)
!endif
# ---------------------------------------------------------------------------
!ifdef IDEOPTIONS
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1040
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=2
Item0=$(BCB)\include;$(BCB)\include\vcl
Item1=$(BCB)\include
[HistoryLists\hlLibraryPath]
Count=1
Item0=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[Debugging]
DebugSourceDirs=
[Parameters]
RunParams=
HostApplication=
!endif
$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
$(BCB)\BIN\$(LINKER) @&&!
$(LFLAGS) $(IFLAGS) +
$(ALLOBJ), +
$(PROJECT),, +
$(ALLLIB), +
$(DEFFILE), +
$(ALLRES)
!
# ---------------------------------------------------------------------------
.pas.hpp:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.pas.obj:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.cpp.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.c.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.asm.obj:
$(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
.rc.res:
$(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
# ---------------------------------------------------------------------------

View File

@@ -1,22 +0,0 @@
#include <condefs.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEUNIT("adler32.c");
USEUNIT("compress.c");
USEUNIT("crc32.c");
USEUNIT("deflate.c");
USEUNIT("gzio.c");
USEUNIT("infblock.c");
USEUNIT("infcodes.c");
USEUNIT("inffast.c");
USEUNIT("inflate.c");
USEUNIT("inftrees.c");
USEUNIT("infutil.c");
USEUNIT("trees.c");
USEUNIT("uncompr.c");
USEUNIT("zutil.c");
//---------------------------------------------------------------------------
#define Library
// To add a file to the library use the Project menu 'Add to Project'.

View File

@@ -1,174 +0,0 @@
# ---------------------------------------------------------------------------
!if !$d(BCB)
BCB = $(MAKEDIR)\..
!endif
# ---------------------------------------------------------------------------
# IDE SECTION
# ---------------------------------------------------------------------------
# The following section of the project makefile is managed by the BCB IDE.
# It is recommended to use the IDE to change any of the values in this
# section.
# ---------------------------------------------------------------------------
VERSION = BCB.03
# ---------------------------------------------------------------------------
PROJECT = zlib32.dll
OBJFILES = zlib32.obj adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infblock.obj \
infcodes.obj inffast.obj inflate.obj inftrees.obj infutil.obj trees.obj \
uncompr.obj zutil.obj
RESFILES =
RESDEPEN = $(RESFILES)
LIBFILES =
LIBRARIES =
SPARELIBS =
DEFFILE =
PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi ibsmp35.bpi bcbsmp35.bpi \
dclocx35.bpi QRPT35.bpi TEEUI35.bpi TEEDB35.bpi TEE35.bpi DSS35.bpi \
NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi
# ---------------------------------------------------------------------------
PATHCPP = .;
PATHASM = .;
PATHPAS = .;
PATHRC = .;
DEBUGLIBPATH = $(BCB)\lib\debug
RELEASELIBPATH = $(BCB)\lib\release
# ---------------------------------------------------------------------------
CFLAG1 = -WD -O2 -Ve -d -k- -vi -c -tWD
CFLAG2 = -D_NO_VCL;ZLIB_DLL -I$(BCB)\include
CFLAG3 = -ff -5
PFLAGS = -D_NO_VCL;ZLIB_DLL -U$(BCB)\lib;$(RELEASELIBPATH) -I$(BCB)\include -$I- -v \
-JPHN -M
RFLAGS = -D_NO_VCL;ZLIB_DLL -i$(BCB)\include
AFLAGS = /i$(BCB)\include /d_NO_VCL /dZLIB_DLL /mx /w2 /zn
LFLAGS = -L$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpd -x -Gi
IFLAGS = -Gn -g
# ---------------------------------------------------------------------------
ALLOBJ = c0d32.obj $(OBJFILES)
ALLRES = $(RESFILES)
ALLLIB = $(LIBFILES) import32.lib cw32mt.lib
# ---------------------------------------------------------------------------
!ifdef IDEOPTIONS
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=1
Locale=1040
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=DLL (GUI)
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=1
Item0=$(BCB)\include
[HistoryLists\hlLibraryPath]
Count=1
Item0=$(BCB)\lib
[HistoryLists\hlConditionals]
Count=1
Item0=_NO_VCL;ZLIB_DLL
[Debugging]
DebugSourceDirs=
[Parameters]
RunParams=
HostApplication=
!endif
# ---------------------------------------------------------------------------
# MAKE SECTION
# ---------------------------------------------------------------------------
# This section of the project file is not used by the BCB IDE. It is for
# the benefit of building from the command-line using the MAKE utility.
# ---------------------------------------------------------------------------
.autodepend
# ---------------------------------------------------------------------------
!if !$d(BCC32)
BCC32 = bcc32
!endif
!if !$d(DCC32)
DCC32 = dcc32
!endif
!if !$d(TASM32)
TASM32 = tasm32
!endif
!if !$d(LINKER)
LINKER = ilink32
!endif
!if !$d(BRCC32)
BRCC32 = brcc32
!endif
# ---------------------------------------------------------------------------
!if $d(PATHCPP)
.PATH.CPP = $(PATHCPP)
.PATH.C = $(PATHCPP)
!endif
!if $d(PATHPAS)
.PATH.PAS = $(PATHPAS)
!endif
!if $d(PATHASM)
.PATH.ASM = $(PATHASM)
!endif
!if $d(PATHRC)
.PATH.RC = $(PATHRC)
!endif
# ---------------------------------------------------------------------------
$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE)
$(BCB)\BIN\$(LINKER) @&&!
$(LFLAGS) $(IFLAGS) +
$(ALLOBJ), +
$(PROJECT),, +
$(ALLLIB), +
$(DEFFILE), +
$(ALLRES)
!
# ---------------------------------------------------------------------------
.pas.hpp:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.pas.obj:
$(BCB)\BIN\$(DCC32) $(PFLAGS) {$< }
.cpp.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.c.obj:
$(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< }
.asm.obj:
$(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@
.rc.res:
$(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $<
# ---------------------------------------------------------------------------

View File

@@ -1,42 +0,0 @@
#include <windows.h>
#pragma hdrstop
#include <condefs.h>
//---------------------------------------------------------------------------
// Important note about DLL memory management in a VCL DLL:
//
//
//
// If your DLL uses VCL and exports any functions that pass VCL String objects
// (or structs/classes containing nested Strings) as parameter or function
// results, you will need to build both your DLL project and any EXE projects
// that use your DLL with the dynamic RTL (the RTL DLL). This will change your
// DLL and its calling EXE's to use BORLNDMM.DLL as their memory manager. In
// these cases, the file BORLNDMM.DLL should be deployed along with your DLL
// and the RTL DLL (CP3240MT.DLL). To avoid the requiring BORLNDMM.DLL in
// these situations, pass string information using "char *" or ShortString
// parameters and then link with the static RTL.
//
//---------------------------------------------------------------------------
USEUNIT("adler32.c");
USEUNIT("compress.c");
USEUNIT("crc32.c");
USEUNIT("deflate.c");
USEUNIT("gzio.c");
USEUNIT("infblock.c");
USEUNIT("infcodes.c");
USEUNIT("inffast.c");
USEUNIT("inflate.c");
USEUNIT("inftrees.c");
USEUNIT("infutil.c");
USEUNIT("trees.c");
USEUNIT("uncompr.c");
USEUNIT("zutil.c");
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}

500
contrib/gzappend/gzappend.c Normal file
View File

@@ -0,0 +1,500 @@
/* gzappend -- command to append to a gzip file
Copyright (C) 2003 Mark Adler, all rights reserved
version 1.1, 4 Nov 2003
This software is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Mark Adler madler@alumni.caltech.edu
*/
/*
* Change history:
*
* 1.0 19 Oct 2003 - First version
* 1.1 4 Nov 2003 - Expand and clarify some comments and notes
* - Add version and copyright to help
* - Send help to stdout instead of stderr
* - Add some preemptive typecasts
* - Add L to constants in lseek() calls
* - Remove some debugging information in error messages
* - Use new data_type definition for zlib 1.2.1
* - Simplfy and unify file operations
* - Finish off gzip file in gztack()
* - Use deflatePrime() instead of adding empty blocks
* - Keep gzip file clean on appended file read errors
* - Use in-place rotate instead of auxiliary buffer
* (Why you ask? Because it was fun to write!)
*/
/*
gzappend takes a gzip file and appends to it, compressing files from the
command line or data from stdin. The gzip file is written to directly, to
avoid copying that file, in case it's large. Note that this results in the
unfriendly behavior that if gzappend fails, the gzip file is corrupted.
This program was written to illustrate the use of the new Z_BLOCK option of
zlib 1.2.1's inflate() function. This option returns from inflate() at each
block boundary to facilitate locating and modifying the last block bit at
the start of the final deflate block. Also whether using Z_BLOCK or not,
another required feature of zlib 1.2.1 is that inflate() now provides the
number of unusued bits in the last input byte used. gzappend will not work
with versions of zlib earlier than 1.2.1.
gzappend first decompresses the gzip file internally, discarding all but
the last 32K of uncompressed data, and noting the location of the last block
bit and the number of unused bits in the last byte of the compressed data.
The gzip trailer containing the CRC-32 and length of the uncompressed data
is verified. This trailer will be later overwritten.
Then the last block bit is cleared by seeking back in the file and rewriting
the byte that contains it. Seeking forward, the last byte of the compressed
data is saved along with the number of unused bits to initialize deflate.
A deflate process is initialized, using the last 32K of the uncompressed
data from the gzip file to initialize the dictionary. If the total
uncompressed data was less than 32K, then all of it is used to initialize
the dictionary. The deflate output bit buffer is also initialized with the
last bits from the original deflate stream. From here on, the data to
append is simply compressed using deflate, and written to the gzip file.
When that is complete, the new CRC-32 and uncompressed length are written
as the trailer of the gzip file.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include "zlib.h"
#define local static
#define LGCHUNK 14
#define CHUNK (1U << LGCHUNK)
#define DSIZE 32768U
/* print an error message and terminate with extreme prejudice */
local void bye(char *msg1, char *msg2)
{
fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2);
exit(1);
}
/* return the greatest common divisor of a and b using Euclid's algorithm,
modified to be fast when one argument much greater than the other, and
coded to avoid unnecessary swapping */
local unsigned gcd(unsigned a, unsigned b)
{
unsigned c;
while (a && b)
if (a > b) {
c = b;
while (a - c >= c)
c <<= 1;
a -= c;
}
else {
c = a;
while (b - c >= c)
c <<= 1;
b -= c;
}
return a + b;
}
/* rotate list[0..len-1] left by rot positions, in place */
local void rotate(unsigned char *list, unsigned len, unsigned rot)
{
unsigned char tmp;
unsigned cycles;
unsigned char *start, *last, *to, *from;
/* normalize rot and handle degenerate cases */
if (len < 2) return;
if (rot >= len) rot %= len;
if (rot == 0) return;
/* pointer to last entry in list */
last = list + (len - 1);
/* do simple left shift by one */
if (rot == 1) {
tmp = *list;
memcpy(list, list + 1, len - 1);
*last = tmp;
return;
}
/* do simple right shift by one */
if (rot == len - 1) {
tmp = *last;
memmove(list + 1, list, len - 1);
*list = tmp;
return;
}
/* otherwise do rotate as a set of cycles in place */
cycles = gcd(len, rot); /* number of cycles */
do {
start = from = list + cycles; /* start index is arbitrary */
tmp = *from; /* save entry to be overwritten */
for (;;) {
to = from; /* next step in cycle */
from += rot; /* go right rot positions */
if (from > last) from -= len; /* (pointer better not wrap) */
if (from == start) break; /* all but one shifted */
*to = *from; /* shift left */
}
*to = tmp; /* complete the circle */
} while (--cycles);
}
/* structure for gzip file read operations */
typedef struct {
int fd; /* file descriptor */
int size; /* 1 << size is bytes in buf */
unsigned left; /* bytes available at next */
unsigned char *buf; /* buffer */
unsigned char *next; /* next byte in buffer */
char *name; /* file name for error messages */
} file;
/* reload buffer */
local int readin(file *in)
{
int len;
len = read(in->fd, in->buf, 1 << in->size);
if (len == -1) bye("error reading ", in->name);
in->left = (unsigned)len;
in->next = in->buf;
return len;
}
/* read from file in, exit if end-of-file */
local int readmore(file *in)
{
if (readin(in) == 0) bye("unexpected end of ", in->name);
return 0;
}
#define read1(in) (in->left == 0 ? readmore(in) : 0, \
in->left--, *(in->next)++)
/* skip over n bytes of in */
local void skip(file *in, unsigned n)
{
unsigned bypass;
if (n > in->left) {
n -= in->left;
bypass = n & ~((1U << in->size) - 1);
if (bypass) {
if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1)
bye("seeking ", in->name);
n -= bypass;
}
readmore(in);
if (n > in->left)
bye("unexpected end of ", in->name);
}
in->left -= n;
in->next += n;
}
/* read a four-byte unsigned integer, little-endian, from in */
unsigned long read4(file *in)
{
unsigned long val;
val = read1(in);
val += (unsigned)read1(in) << 8;
val += (unsigned long)read1(in) << 16;
val += (unsigned long)read1(in) << 24;
return val;
}
/* skip over gzip header */
local void gzheader(file *in)
{
int flags;
unsigned n;
if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file");
if (read1(in) != 8) bye("unknown compression method in", in->name);
flags = read1(in);
if (flags & 0xe0) bye("unknown header flags set in", in->name);
skip(in, 6);
if (flags & 4) {
n = read1(in);
n += (unsigned)(read1(in)) << 8;
skip(in, n);
}
if (flags & 8) while (read1(in) != 0) ;
if (flags & 16) while (read1(in) != 0) ;
if (flags & 2) skip(in, 2);
}
/* decompress gzip file "name", return strm with a deflate stream ready to
continue compression of the data in the gzip file, and return a file
descriptor pointing to where to write the compressed data -- the deflate
stream is initialized to compress using level "level" */
local int gzscan(char *name, z_stream *strm, int level)
{
int ret, lastbit, left, full;
unsigned have;
unsigned long crc, tot;
unsigned char *window;
off_t lastoff, end;
file gz;
/* open gzip file */
gz.name = name;
gz.fd = open(name, O_RDWR, 0);
if (gz.fd == -1) bye("cannot open ", name);
gz.buf = malloc(CHUNK);
if (gz.buf == NULL) bye("out of memory", "");
gz.size = LGCHUNK;
gz.left = 0;
/* skip gzip header */
gzheader(&gz);
/* prepare to decompress */
window = malloc(DSIZE);
if (window == NULL) bye("out of memory", "");
strm->zalloc = Z_NULL;
strm->zfree = Z_NULL;
strm->opaque = Z_NULL;
ret = inflateInit2(strm, -15);
if (ret != Z_OK) bye("out of memory", " or library mismatch");
/* decompress the deflate stream, saving append information */
lastbit = 0;
lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left;
left = 0;
strm->avail_in = gz.left;
strm->next_in = gz.next;
crc = crc32(0L, Z_NULL, 0);
have = full = 0;
do {
/* if needed, get more input */
if (strm->avail_in == 0) {
readmore(&gz);
strm->avail_in = gz.left;
strm->next_in = gz.next;
}
/* set up output to next available section of sliding window */
strm->avail_out = DSIZE - have;
strm->next_out = window + have;
/* inflate and check for errors */
ret = inflate(strm, Z_BLOCK);
if (ret == Z_STREAM_ERROR) bye("internal stream error!", "");
if (ret == Z_MEM_ERROR) bye("out of memory", "");
if (ret == Z_DATA_ERROR)
bye("invalid compressed data--format violated in", name);
/* update crc and sliding window pointer */
crc = crc32(crc, window + have, DSIZE - have - strm->avail_out);
if (strm->avail_out)
have = DSIZE - strm->avail_out;
else {
have = 0;
full = 1;
}
/* process end of block */
if (strm->data_type & 128) {
if (strm->data_type & 64)
left = strm->data_type & 0x1f;
else {
lastbit = strm->data_type & 0x1f;
lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in;
}
}
} while (ret != Z_STREAM_END);
inflateEnd(strm);
gz.left = strm->avail_in;
gz.next = strm->next_in;
/* save the location of the end of the compressed data */
end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left;
/* check gzip trailer and save total for deflate */
if (crc != read4(&gz))
bye("invalid compressed data--crc mismatch in ", name);
tot = strm->total_out;
if ((tot & 0xffffffffUL) != read4(&gz))
bye("invalid compressed data--length mismatch in", name);
/* if not at end of file, warn */
if (gz.left || readin(&gz))
fprintf(stderr,
"gzappend warning: junk at end of gzip file overwritten\n");
/* clear last block bit */
lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET);
if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name);
*gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7)));
lseek(gz.fd, -1L, SEEK_CUR);
if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name);
/* if window wrapped, build dictionary from window by rotating */
if (full) {
rotate(window, DSIZE, have);
have = DSIZE;
}
/* set up deflate stream with window, crc, total_in, and leftover bits */
ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
if (ret != Z_OK) bye("out of memory", "");
deflateSetDictionary(strm, window, have);
strm->adler = crc;
strm->total_in = tot;
if (left) {
lseek(gz.fd, --end, SEEK_SET);
if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name);
deflatePrime(strm, 8 - left, *gz.buf);
}
lseek(gz.fd, end, SEEK_SET);
/* clean up and return */
free(window);
free(gz.buf);
return gz.fd;
}
/* append file "name" to gzip file gd using deflate stream strm -- if last
is true, then finish off the deflate stream at the end */
local void gztack(char *name, int gd, z_stream *strm, int last)
{
int fd, len, ret;
unsigned left;
unsigned char *in, *out;
/* open file to compress and append */
fd = 0;
if (name != NULL) {
fd = open(name, O_RDONLY, 0);
if (fd == -1)
fprintf(stderr, "gzappend warning: %s not found, skipping ...\n",
name);
}
/* allocate buffers */
in = fd == -1 ? NULL : malloc(CHUNK);
out = malloc(CHUNK);
if (out == NULL) bye("out of memory", "");
/* compress input file and append to gzip file */
do {
/* get more input */
len = fd == -1 ? 0 : read(fd, in, CHUNK);
if (len == -1) {
fprintf(stderr,
"gzappend warning: error reading %s, skipping rest ...\n",
name);
len = 0;
}
strm->avail_in = (unsigned)len;
strm->next_in = in;
if (len) strm->adler = crc32(strm->adler, in, (unsigned)len);
/* compress and write all available output */
do {
strm->avail_out = CHUNK;
strm->next_out = out;
ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH);
left = CHUNK - strm->avail_out;
while (left) {
len = write(gd, out + CHUNK - strm->avail_out - left, left);
if (len == -1) bye("writing gzip file", "");
left -= (unsigned)len;
}
} while (strm->avail_out == 0 && ret != Z_STREAM_END);
} while (len != 0);
/* write trailer after last entry */
if (last) {
deflateEnd(strm);
out[0] = (unsigned char)(strm->adler);
out[1] = (unsigned char)(strm->adler >> 8);
out[2] = (unsigned char)(strm->adler >> 16);
out[3] = (unsigned char)(strm->adler >> 24);
out[4] = (unsigned char)(strm->total_in);
out[5] = (unsigned char)(strm->total_in >> 8);
out[6] = (unsigned char)(strm->total_in >> 16);
out[7] = (unsigned char)(strm->total_in >> 24);
len = 8;
do {
ret = write(gd, out + 8 - len, len);
if (ret == -1) bye("writing gzip file", "");
len -= ret;
} while (len);
close(gd);
}
/* clean up and return */
free(out);
if (in != NULL) free(in);
if (fd > 0) close(fd);
}
/* process the compression level option if present, scan the gzip file, and
append the specified files, or append the data from stdin if no other file
names are provided on the command line -- the gzip file must be writable
and seekable */
int main(int argc, char **argv)
{
int gd, level;
z_stream strm;
/* ignore command name */
argv++;
/* provide usage if no arguments */
if (*argv == NULL) {
printf("gzappend 1.1 (4 Nov 2003) Copyright (C) 2003 Mark Adler\n");
printf(
"usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n");
return 0;
}
/* set compression level */
level = Z_DEFAULT_COMPRESSION;
if (argv[0][0] == '-') {
if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0)
bye("invalid compression level", "");
level = argv[0][1] - '0';
if (*++argv == NULL) bye("no gzip file name after options", "");
}
/* prepare to append to gzip file */
gd = gzscan(*argv++, &strm, level);
/* append files on command line, or from stdin if none */
if (*argv == NULL)
gztack(NULL, gd, &strm, 1);
else
do {
gztack(*argv, gd, &strm, argv[1] == NULL);
} while (*++argv != NULL);
return 0;
}

1
contrib/infback9/README Normal file
View File

@@ -0,0 +1 @@
See infback9.h for what this is and how to use it.

605
contrib/infback9/infback9.c Normal file
View File

@@ -0,0 +1,605 @@
/* infback9.c -- inflate deflate64 data using a call-back interface
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zutil.h"
#include "infback9.h"
#include "inftree9.h"
#include "inflate9.h"
#define WSIZE 65536UL
/*
strm provides memory allocation functions in zalloc and zfree, or
Z_NULL to use the library memory allocation functions.
window is a user-supplied window and output buffer that is 64K bytes.
*/
int ZEXPORT inflateBack9Init_(strm, window, version, stream_size)
z_stream FAR *strm;
unsigned char FAR *window;
const char *version;
int stream_size;
{
struct inflate_state FAR *state;
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
stream_size != (int)(sizeof(z_stream)))
return Z_VERSION_ERROR;
if (strm == Z_NULL || window == Z_NULL)
return Z_STREAM_ERROR;
strm->msg = Z_NULL; /* in case we return an error */
if (strm->zalloc == (alloc_func)0) {
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
}
if (strm->zfree == (free_func)0) strm->zfree = zcfree;
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
Tracev((stderr, "inflate: allocated\n"));
strm->state = (voidpf)state;
state->window = window;
return Z_OK;
}
/*
Build and output length and distance decoding tables for fixed code
decoding.
*/
#ifdef MAKEFIXED
#include <stdio.h>
void makefixed9(void)
{
unsigned sym, bits, low, size;
code *next, *lenfix, *distfix;
struct inflate_state state;
code fixed[544];
/* literal/length table */
sym = 0;
while (sym < 144) state.lens[sym++] = 8;
while (sym < 256) state.lens[sym++] = 9;
while (sym < 280) state.lens[sym++] = 7;
while (sym < 288) state.lens[sym++] = 8;
next = fixed;
lenfix = next;
bits = 9;
inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work);
/* distance table */
sym = 0;
while (sym < 32) state.lens[sym++] = 5;
distfix = next;
bits = 5;
inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work);
/* write tables */
puts(" /* inffix9.h -- table for decoding deflate64 fixed codes");
puts(" * Generated automatically by makefixed9().");
puts(" */");
puts("");
puts(" /* WARNING: this file should *not* be used by applications.");
puts(" It is part of the implementation of this library and is");
puts(" subject to change. Applications should only use zlib.h.");
puts(" */");
puts("");
size = 1U << 9;
printf(" static const code lenfix[%u] = {", size);
low = 0;
for (;;) {
if ((low % 6) == 0) printf("\n ");
printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits,
lenfix[low].val);
if (++low == size) break;
putchar(',');
}
puts("\n };");
size = 1U << 5;
printf("\n static const code distfix[%u] = {", size);
low = 0;
for (;;) {
if ((low % 5) == 0) printf("\n ");
printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits,
distfix[low].val);
if (++low == size) break;
putchar(',');
}
puts("\n };");
}
#endif /* MAKEFIXED */
/* Macros for inflateBack(): */
/* Clear the input bit accumulator */
#define INITBITS() \
do { \
hold = 0; \
bits = 0; \
} while (0)
/* Assure that some input is available. If input is requested, but denied,
then return a Z_BUF_ERROR from inflateBack(). */
#define PULL() \
do { \
if (have == 0) { \
have = in(in_desc, &next); \
if (have == 0) { \
next = Z_NULL; \
ret = Z_BUF_ERROR; \
goto inf_leave; \
} \
} \
} while (0)
/* Get a byte of input into the bit accumulator, or return from inflateBack()
with an error if there is no input available. */
#define PULLBYTE() \
do { \
PULL(); \
have--; \
hold += (unsigned long)(*next++) << bits; \
bits += 8; \
} while (0)
/* Assure that there are at least n bits in the bit accumulator. If there is
not enough available input to do that, then return from inflateBack() with
an error. */
#define NEEDBITS(n) \
do { \
while (bits < (unsigned)(n)) \
PULLBYTE(); \
} while (0)
/* Return the low n bits of the bit accumulator (n <= 16) */
#define BITS(n) \
((unsigned)hold & ((1U << (n)) - 1))
/* Remove n bits from the bit accumulator */
#define DROPBITS(n) \
do { \
hold >>= (n); \
bits -= (unsigned)(n); \
} while (0)
/* Remove zero to seven bits as needed to go to a byte boundary */
#define BYTEBITS() \
do { \
hold >>= bits & 7; \
bits -= bits & 7; \
} while (0)
/* Assure that some output space is available, by writing out the window
if it's full. If the write fails, return from inflateBack() with a
Z_BUF_ERROR. */
#define ROOM() \
do { \
if (left == 0) { \
put = window; \
left = WSIZE; \
wrap = 1; \
if (out(out_desc, put, (unsigned)left)) { \
ret = Z_BUF_ERROR; \
goto inf_leave; \
} \
} \
} while (0)
/*
strm provides the memory allocation functions and window buffer on input,
and provides information on the unused input on return. For Z_DATA_ERROR
returns, strm will also provide an error message.
in() and out() are the call-back input and output functions. When
inflateBack() needs more input, it calls in(). When inflateBack() has
filled the window with output, or when it completes with data in the
window, it calls out() to write out the data. The application must not
change the provided input until in() is called again or inflateBack()
returns. The application must not change the window/output buffer until
inflateBack() returns.
in() and out() are called with a descriptor parameter provided in the
inflateBack() call. This parameter can be a structure that provides the
information required to do the read or write, as well as accumulated
information on the input and output such as totals and check values.
in() should return zero on failure. out() should return non-zero on
failure. If either in() or out() fails, than inflateBack() returns a
Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
was in() or out() that caused in the error. Otherwise, inflateBack()
returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
error, or Z_MEM_ERROR if it could not allocate memory for the state.
inflateBack() can also return Z_STREAM_ERROR if the input parameters
are not correct, i.e. strm is Z_NULL or the state was not initialized.
*/
int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc)
z_stream FAR *strm;
in_func in;
void FAR *in_desc;
out_func out;
void FAR *out_desc;
{
struct inflate_state FAR *state;
unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
unsigned have; /* available input */
unsigned long left; /* available output */
inflate_mode mode; /* current inflate mode */
int lastblock; /* true if processing last block */
int wrap; /* true if the window has wrapped */
unsigned long write; /* window write index */
unsigned char FAR *window; /* allocated sliding window, if needed */
unsigned long hold; /* bit buffer */
unsigned bits; /* bits in bit buffer */
unsigned extra; /* extra bits needed */
unsigned long length; /* literal or length of data to copy */
unsigned long offset; /* distance back to copy string from */
unsigned long copy; /* number of stored or match bytes to copy */
unsigned char FAR *from; /* where to copy match bytes from */
code const FAR *lencode; /* starting table for length/literal codes */
code const FAR *distcode; /* starting table for distance codes */
unsigned lenbits; /* index bits for lencode */
unsigned distbits; /* index bits for distcode */
code this; /* current decoding table entry */
code last; /* parent table entry */
unsigned len; /* length to copy for repeats, bits to drop */
int ret; /* return code */
static const unsigned short order[19] = /* permutation of code lengths */
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
#include "inffix9.h"
/* Check that the strm exists and that the state was initialized */
if (strm == Z_NULL || strm->state == Z_NULL)
return Z_STREAM_ERROR;
state = (struct inflate_state FAR *)strm->state;
/* Reset the state */
strm->msg = Z_NULL;
mode = TYPE;
lastblock = 0;
write = 0;
wrap = 0;
window = state->window;
next = strm->next_in;
have = next != Z_NULL ? strm->avail_in : 0;
hold = 0;
bits = 0;
put = window;
left = WSIZE;
lencode = Z_NULL;
distcode = Z_NULL;
/* Inflate until end of block marked as last */
for (;;)
switch (mode) {
case TYPE:
/* determine and dispatch block type */
if (lastblock) {
BYTEBITS();
mode = DONE;
break;
}
NEEDBITS(3);
lastblock = BITS(1);
DROPBITS(1);
switch (BITS(2)) {
case 0: /* stored block */
Tracev((stderr, "inflate: stored block%s\n",
lastblock ? " (last)" : ""));
mode = STORED;
break;
case 1: /* fixed block */
lencode = lenfix;
lenbits = 9;
distcode = distfix;
distbits = 5;
Tracev((stderr, "inflate: fixed codes block%s\n",
lastblock ? " (last)" : ""));
mode = LEN; /* decode codes */
break;
case 2: /* dynamic block */
Tracev((stderr, "inflate: dynamic codes block%s\n",
lastblock ? " (last)" : ""));
mode = TABLE;
break;
case 3:
strm->msg = (char *)"invalid block type";
mode = BAD;
}
DROPBITS(2);
break;
case STORED:
/* get and verify stored block length */
BYTEBITS(); /* go to byte boundary */
NEEDBITS(32);
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
strm->msg = (char *)"invalid stored block lengths";
mode = BAD;
break;
}
length = (unsigned)hold & 0xffff;
Tracev((stderr, "inflate: stored length %lu\n",
length));
INITBITS();
/* copy stored block from input to output */
while (length != 0) {
copy = length;
PULL();
ROOM();
if (copy > have) copy = have;
if (copy > left) copy = left;
zmemcpy(put, next, copy);
have -= copy;
next += copy;
left -= copy;
put += copy;
length -= copy;
}
Tracev((stderr, "inflate: stored end\n"));
mode = TYPE;
break;
case TABLE:
/* get dynamic table entries descriptor */
NEEDBITS(14);
state->nlen = BITS(5) + 257;
DROPBITS(5);
state->ndist = BITS(5) + 1;
DROPBITS(5);
state->ncode = BITS(4) + 4;
DROPBITS(4);
if (state->nlen > 286) {
strm->msg = (char *)"too many length symbols";
mode = BAD;
break;
}
Tracev((stderr, "inflate: table sizes ok\n"));
/* get code length code lengths (not a typo) */
state->have = 0;
while (state->have < state->ncode) {
NEEDBITS(3);
state->lens[order[state->have++]] = (unsigned short)BITS(3);
DROPBITS(3);
}
while (state->have < 19)
state->lens[order[state->have++]] = 0;
state->next = state->codes;
lencode = (code const FAR *)(state->next);
lenbits = 7;
ret = inflate_table9(CODES, state->lens, 19, &(state->next),
&(lenbits), state->work);
if (ret) {
strm->msg = (char *)"invalid code lengths set";
mode = BAD;
break;
}
Tracev((stderr, "inflate: code lengths ok\n"));
/* get length and distance code code lengths */
state->have = 0;
while (state->have < state->nlen + state->ndist) {
for (;;) {
this = lencode[BITS(lenbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if (this.val < 16) {
NEEDBITS(this.bits);
DROPBITS(this.bits);
state->lens[state->have++] = this.val;
}
else {
if (this.val == 16) {
NEEDBITS(this.bits + 2);
DROPBITS(this.bits);
if (state->have == 0) {
strm->msg = (char *)"invalid bit length repeat";
mode = BAD;
break;
}
len = (unsigned)(state->lens[state->have - 1]);
copy = 3 + BITS(2);
DROPBITS(2);
}
else if (this.val == 17) {
NEEDBITS(this.bits + 3);
DROPBITS(this.bits);
len = 0;
copy = 3 + BITS(3);
DROPBITS(3);
}
else {
NEEDBITS(this.bits + 7);
DROPBITS(this.bits);
len = 0;
copy = 11 + BITS(7);
DROPBITS(7);
}
if (state->have + copy > state->nlen + state->ndist) {
strm->msg = (char *)"invalid bit length repeat";
mode = BAD;
break;
}
while (copy--)
state->lens[state->have++] = (unsigned short)len;
}
}
/* build code tables */
state->next = state->codes;
lencode = (code const FAR *)(state->next);
lenbits = 9;
ret = inflate_table9(LENS, state->lens, state->nlen,
&(state->next), &(lenbits), state->work);
if (ret) {
strm->msg = (char *)"invalid literal/lengths set";
mode = BAD;
break;
}
distcode = (code const FAR *)(state->next);
distbits = 6;
ret = inflate_table9(DISTS, state->lens + state->nlen,
state->ndist, &(state->next), &(distbits),
state->work);
if (ret) {
strm->msg = (char *)"invalid distances set";
mode = BAD;
break;
}
Tracev((stderr, "inflate: codes ok\n"));
mode = LEN;
case LEN:
/* get a literal, length, or end-of-block code */
for (;;) {
this = lencode[BITS(lenbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if (this.op && (this.op & 0xf0) == 0) {
last = this;
for (;;) {
this = lencode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
if ((unsigned)(last.bits + this.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
}
DROPBITS(this.bits);
length = (unsigned)this.val;
/* process literal */
if (this.op == 0) {
Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
"inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", this.val));
ROOM();
*put++ = (unsigned char)(length);
left--;
mode = LEN;
break;
}
/* process end of block */
if (this.op & 32) {
Tracevv((stderr, "inflate: end of block\n"));
mode = TYPE;
break;
}
/* invalid code */
if (this.op & 64) {
strm->msg = (char *)"invalid literal/length code";
mode = BAD;
break;
}
/* length code -- get extra bits, if any */
extra = (unsigned)(this.op) & 31;
if (extra != 0) {
NEEDBITS(extra);
length += BITS(extra);
DROPBITS(extra);
}
Tracevv((stderr, "inflate: length %lu\n", length));
/* get distance code */
for (;;) {
this = distcode[BITS(distbits)];
if ((unsigned)(this.bits) <= bits) break;
PULLBYTE();
}
if ((this.op & 0xf0) == 0) {
last = this;
for (;;) {
this = distcode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
if ((unsigned)(last.bits + this.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
}
DROPBITS(this.bits);
if (this.op & 64) {
strm->msg = (char *)"invalid distance code";
mode = BAD;
break;
}
offset = (unsigned)this.val;
/* get distance extra bits, if any */
extra = (unsigned)(this.op) & 15;
if (extra != 0) {
NEEDBITS(extra);
offset += BITS(extra);
DROPBITS(extra);
}
if (offset > WSIZE - (wrap ? 0: left)) {
strm->msg = (char *)"invalid distance too far back";
mode = BAD;
break;
}
Tracevv((stderr, "inflate: distance %lu\n", offset));
/* copy match from window to output */
do {
ROOM();
copy = WSIZE - offset;
if (copy < left) {
from = put + copy;
copy = left - copy;
}
else {
from = put - offset;
copy = left;
}
if (copy > length) copy = length;
length -= copy;
left -= copy;
do {
*put++ = *from++;
} while (--copy);
} while (length != 0);
break;
case DONE:
/* inflate stream terminated properly -- write leftover output */
ret = Z_STREAM_END;
if (left < WSIZE) {
if (out(out_desc, window, (unsigned)(WSIZE - left)))
ret = Z_BUF_ERROR;
}
goto inf_leave;
case BAD:
ret = Z_DATA_ERROR;
goto inf_leave;
default: /* can't happen, but makes compilers happy */
ret = Z_STREAM_ERROR;
goto inf_leave;
}
/* Return unused input */
inf_leave:
strm->next_in = next;
strm->avail_in = have;
return ret;
}
int ZEXPORT inflateBack9End(strm)
z_stream FAR *strm;
{
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
return Z_STREAM_ERROR;
ZFREE(strm, strm->state);
strm->state = Z_NULL;
Tracev((stderr, "inflate: end\n"));
return Z_OK;
}

View File

@@ -0,0 +1,29 @@
/* infback9.h -- header for using inflateBack9 functions
* Copyright (C) 2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/*
* This header file and associated patches provide a decoder for PKWare's
* undocumented deflate64 compression method (method 9). Use with infback9.c,
* inftree9.h, inftree9.c, and inffix9.h. These patches are not supported.
* This should be compiled with zlib, since it uses zutil.h and zutil.o.
* This code has not yet been tested on 16-bit architectures. See the
* comments in zlib.h for inflateBack() usage. These functions are used
* identically, except that there is no windowBits parameter, and a 64K
* window must be provided. Also if int's are 16 bits, then a zero for
* the third parameter of the "out" function actually means 65536UL.
* zlib.h must be included before this header file.
*/
ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm,
in_func in, void FAR *in_desc,
out_func out, void FAR *out_desc));
ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm));
ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm,
unsigned char FAR *window,
const char *version,
int stream_size));
#define inflateBack9Init(strm, window) \
inflateBack9Init_((strm), (window), \
ZLIB_VERSION, sizeof(z_stream))

107
contrib/infback9/inffix9.h Normal file
View File

@@ -0,0 +1,107 @@
/* inffix9.h -- table for decoding deflate64 fixed codes
* Generated automatically by makefixed9().
*/
/* WARNING: this file should *not* be used by applications.
It is part of the implementation of this library and is
subject to change. Applications should only use zlib.h.
*/
static const code lenfix[512] = {
{96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112},
{0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160},
{0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88},
{0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208},
{129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136},
{0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227},
{131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100},
{0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},
{128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124},
{0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184},
{0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82},
{0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196},
{129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130},
{0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148},
{132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106},
{0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},
{128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118},
{0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172},
{0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94},
{0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220},
{130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
{0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131},
{130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97},
{0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226},
{128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121},
{0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178},
{0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85},
{0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202},
{129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},
{0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154},
{132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109},
{0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250},
{128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115},
{0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166},
{0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91},
{0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214},
{130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},
{0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0},
{131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103},
{0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238},
{128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127},
{0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190},
{0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},
{0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193},
{128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128},
{0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145},
{131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104},
{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241},
{128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116},
{0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169},
{0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92},
{0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217},
{130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140},
{0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163},
{131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98},
{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
{128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122},
{0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181},
{0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86},
{0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205},
{129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134},
{0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157},
{132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110},
{0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},
{96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113},
{0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163},
{0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89},
{0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211},
{129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137},
{0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3},
{131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101},
{0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},
{128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125},
{0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187},
{0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83},
{0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199},
{129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
{0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151},
{132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107},
{0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247},
{128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119},
{0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175},
{0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95},
{0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223},
{130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},
{0,8,79},{0,9,255}
};
static const code distfix[32] = {
{128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5},
{137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513},
{132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129},
{142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145},
{129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4},
{136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073},
{134,5,193},{142,5,49153}
};

View File

@@ -0,0 +1,47 @@
/* inflate9.h -- internal inflate state definition
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
/* Possible inflate modes between inflate() calls */
typedef enum {
TYPE, /* i: waiting for type bits, including last-flag bit */
STORED, /* i: waiting for stored size (length and complement) */
TABLE, /* i: waiting for dynamic block table lengths */
LEN, /* i: waiting for length/lit code */
DONE, /* finished check, done -- remain here until reset */
BAD /* got a data error -- remain here until reset */
} inflate_mode;
/*
State transitions between above modes -
(most modes can go to the BAD mode -- not shown for clarity)
Read deflate blocks:
TYPE -> STORED or TABLE or LEN or DONE
STORED -> TYPE
TABLE -> LENLENS -> CODELENS -> LEN
Read deflate codes:
LEN -> LEN or TYPE
*/
/* state maintained between inflate() calls. Approximately 7K bytes. */
struct inflate_state {
/* sliding window */
unsigned char FAR *window; /* allocated sliding window, if needed */
/* dynamic table building */
unsigned ncode; /* number of code length code lengths */
unsigned nlen; /* number of length code lengths */
unsigned ndist; /* number of distance code lengths */
unsigned have; /* number of code lengths in lens[] */
code FAR *next; /* next available space in codes[] */
unsigned short lens[320]; /* temporary storage for code lengths */
unsigned short work[288]; /* work area for code table building */
code codes[ENOUGH]; /* space for code tables */
};

323
contrib/infback9/inftree9.c Normal file
View File

@@ -0,0 +1,323 @@
/* inftree9.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zutil.h"
#include "inftree9.h"
#define MAXBITS 15
const char inflate9_copyright[] =
" inflate9 1.2.0.8 Copyright 1995-2003 Mark Adler ";
/*
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
include such an acknowledgment, I would appreciate that you keep this
copyright string in the executable of your product.
*/
/*
Build a set of tables to decode the provided canonical Huffman code.
The code lengths are lens[0..codes-1]. The result starts at *table,
whose indices are 0..2^bits-1. work is a writable array of at least
lens shorts, which is used as a work area. type is the type of code
to be generated, CODES, LENS, or DISTS. On return, zero is success,
-1 is an invalid code, and +1 means that ENOUGH isn't enough. table
on return points to the next available entry's address. bits is the
requested root table index bits, and on return it is the actual root
table index bits. It will differ if the request is greater than the
longest code or if it is less than the shortest code.
*/
int inflate_table9(type, lens, codes, table, bits, work)
codetype type;
unsigned short FAR *lens;
unsigned codes;
code FAR * FAR *table;
unsigned FAR *bits;
unsigned short FAR *work;
{
unsigned len; /* a code's length in bits */
unsigned sym; /* index of code symbols */
unsigned min, max; /* minimum and maximum code lengths */
unsigned root; /* number of index bits for root table */
unsigned curr; /* number of index bits for current table */
unsigned drop; /* code bits to drop for sub-table */
int left; /* number of prefix codes available */
unsigned used; /* code entries in table used */
unsigned huff; /* Huffman code */
unsigned incr; /* for incrementing code, index */
unsigned fill; /* index for replicating entries */
unsigned low; /* low bits for current root entry */
unsigned mask; /* mask for low root bits */
code this; /* table entry for duplication */
code FAR *next; /* next available space in table */
const unsigned short FAR *base; /* base value table to use */
const unsigned short FAR *extra; /* extra bits table to use */
int end; /* use base and extra for symbol > end */
unsigned short count[MAXBITS+1]; /* number of codes of each length */
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
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, 3, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
133, 133, 133, 133, 144, 76, 203};
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
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, 8193, 12289, 16385, 24577, 32769, 49153};
static const unsigned short dext[32] = { /* Distance codes 0..31 extra */
128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132,
133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138,
139, 139, 140, 140, 141, 141, 142, 142};
/*
Process a set of code lengths to create a canonical Huffman code. The
code lengths are lens[0..codes-1]. Each length corresponds to the
symbols 0..codes-1. The Huffman code is generated by first sorting the
symbols by length from short to long, and retaining the symbol order
for codes with equal lengths. Then the code starts with all zero bits
for the first code of the shortest length, and the codes are integer
increments for the same length, and zeros are appended as the length
increases. For the deflate format, these bits are stored backwards
from their more natural integer increment ordering, and so when the
decoding tables are built in the large loop below, the integer codes
are incremented backwards.
This routine assumes, but does not check, that all of the entries in
lens[] are in the range 0..MAXBITS. The caller must assure this.
1..MAXBITS is interpreted as that code length. zero means that that
symbol does not occur in this code.
The codes are sorted by computing a count of codes for each length,
creating from that a table of starting indices for each length in the
sorted table, and then entering the symbols in order in the sorted
table. The sorted table is work[], with that space being provided by
the caller.
The length counts are used for other purposes as well, i.e. finding
the minimum and maximum length codes, determining if there are any
codes at all, checking for a valid set of lengths, and looking ahead
at length counts to determine sub-table sizes when building the
decoding tables.
*/
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
for (len = 0; len <= MAXBITS; len++)
count[len] = 0;
for (sym = 0; sym < codes; sym++)
count[lens[sym]]++;
/* bound code lengths, force root to be within code lengths */
root = *bits;
for (max = MAXBITS; max >= 1; max--)
if (count[max] != 0) break;
if (root > max) root = max;
if (max == 0) return -1; /* no codes! */
for (min = 1; min <= MAXBITS; min++)
if (count[min] != 0) break;
if (root < min) root = min;
/* check for an over-subscribed or incomplete set of lengths */
left = 1;
for (len = 1; len <= MAXBITS; len++) {
left <<= 1;
left -= count[len];
if (left < 0) return -1; /* over-subscribed */
}
if (left > 0 && (type == CODES || (codes - count[0] != 1)))
return -1; /* incomplete set */
/* generate offsets into symbol table for each length for sorting */
offs[1] = 0;
for (len = 1; len < MAXBITS; len++)
offs[len + 1] = offs[len] + count[len];
/* sort symbols by length, by symbol order within each length */
for (sym = 0; sym < codes; sym++)
if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
/*
Create and fill in decoding tables. In this loop, the table being
filled is at next and has curr index bits. The code being used is huff
with length len. That code is converted to an index by dropping drop
bits off of the bottom. For codes where len is less than drop + curr,
those top drop + curr - len bits are incremented through all values to
fill the table with replicated entries.
root is the number of index bits for the root table. When len exceeds
root, sub-tables are created pointed to by the root entry with an index
of the low root bits of huff. This is saved in low to check for when a
new sub-table should be started. drop is zero when the root table is
being filled, and drop is root when sub-tables are being filled.
When a new sub-table is needed, it is necessary to look ahead in the
code lengths to determine what size sub-table is needed. The length
counts are used for this, and so count[] is decremented as codes are
entered in the tables.
used keeps track of how many table entries have been allocated from the
provided *table space. It is checked when a LENS table is being made
against the space in *table, ENOUGH, minus the maximum space needed by
the worst case distance code, MAXD. This should never happen, but the
sufficiency of ENOUGH has not been proven exhaustively, hence the check.
This assumes that when type == LENS, bits == 9.
sym increments through all symbols, and the loop terminates when
all codes of length max, i.e. all codes, have been processed. This
routine permits incomplete codes, so another loop after this one fills
in the rest of the decoding tables with invalid code markers.
*/
/* set up for code type */
switch (type) {
case CODES:
base = extra = work; /* dummy value--not used */
end = 19;
break;
case LENS:
base = lbase;
base -= 257;
extra = lext;
extra -= 257;
end = 256;
break;
default: /* DISTS */
base = dbase;
extra = dext;
end = -1;
}
/* initialize state for loop */
huff = 0; /* starting code */
sym = 0; /* starting code symbol */
len = min; /* starting code length */
next = *table; /* current table to fill in */
curr = root; /* current table index bits */
drop = 0; /* current bits to drop from code for index */
low = (unsigned)(-1); /* trigger new sub-table when len > root */
used = 1U << root; /* use root table entries */
mask = used - 1; /* mask for comparing low */
/* check available table space */
if (type == LENS && used >= ENOUGH - MAXD)
return 1;
/* process all codes and make table entries */
for (;;) {
/* create table entry */
this.bits = (unsigned char)(len - drop);
if ((int)(work[sym]) < end) {
this.op = (unsigned char)0;
this.val = work[sym];
}
else if ((int)(work[sym]) > end) {
this.op = (unsigned char)(extra[work[sym]]);
this.val = base[work[sym]];
}
else {
this.op = (unsigned char)(32 + 64); /* end of block */
this.val = 0;
}
/* replicate for those indices with low len bits equal to huff */
incr = 1U << (len - drop);
fill = 1U << curr;
do {
fill -= incr;
next[(huff >> drop) + fill] = this;
} while (fill != 0);
/* backwards increment the len-bit code huff */
incr = 1U << (len - 1);
while (huff & incr)
incr >>= 1;
if (incr != 0) {
huff &= incr - 1;
huff += incr;
}
else
huff = 0;
/* go to next symbol, update count, len */
sym++;
if (--(count[len]) == 0) {
if (len == max) break;
len = lens[work[sym]];
}
/* create new sub-table if needed */
if (len > root && (huff & mask) != low) {
/* if first time, transition to sub-tables */
if (drop == 0)
drop = root;
/* increment past last table */
next += 1U << curr;
/* determine length of next table */
curr = len - drop;
left = (int)(1 << curr);
while (curr + drop < max) {
left -= count[curr + drop];
if (left <= 0) break;
curr++;
left <<= 1;
}
/* check for enough space */
used += 1U << curr;
if (type == LENS && used >= ENOUGH - MAXD)
return 1;
/* point entry in root table to sub-table */
low = huff & mask;
(*table)[low].op = (unsigned char)curr;
(*table)[low].bits = (unsigned char)root;
(*table)[low].val = (unsigned short)(next - *table);
}
}
/*
Fill in rest of table for incomplete codes. This loop is similar to the
loop above in incrementing huff for table indices. It is assumed that
len is equal to curr + drop, so there is no loop needed to increment
through high index bits. When the current sub-table is filled, the loop
drops back to the root table to fill in any remaining entries there.
*/
this.op = (unsigned char)64; /* invalid code marker */
this.bits = (unsigned char)(len - drop);
this.val = (unsigned short)0;
while (huff != 0) {
/* when done with sub-table, drop back to root table */
if (drop != 0 && (huff & mask) != low) {
drop = 0;
len = root;
next = *table;
curr = root;
this.bits = (unsigned char)len;
}
/* put invalid code marker in table */
next[huff >> drop] = this;
/* backwards increment the len-bit code huff */
incr = 1U << (len - 1);
while (huff & incr)
incr >>= 1;
if (incr != 0) {
huff &= incr - 1;
huff += incr;
}
else
huff = 0;
}
/* set return parameters */
*table += used;
*bits = root;
return 0;
}

View File

@@ -0,0 +1,55 @@
/* inftree9.h -- header to use inftree9.c
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
/* Structure for decoding tables. Each entry provides either the
information needed to do the operation requested by the code that
indexed that table entry, or it provides a pointer to another
table that indexes more bits of the code. op indicates whether
the entry is a pointer to another table, a literal, a length or
distance, an end-of-block, or an invalid code. For a table
pointer, the low four bits of op is the number of index bits of
that table. For a length or distance, the low four bits of op
is the number of extra bits to get after the code. bits is
the number of bits in this code or part of the code to drop off
of the bit buffer. val is the actual byte to output in the case
of a literal, the base length or distance, or the offset from
the current table to the next table. Each entry is four bytes. */
typedef struct {
unsigned char op; /* operation, extra bits, table bits */
unsigned char bits; /* bits in this part of the code */
unsigned short val; /* offset in table or code value */
} code;
/* op values as set by inflate_table():
00000000 - literal
0000tttt - table link, tttt != 0 is the number of table index bits
100eeeee - length or distance, eeee is the number of extra bits
01100000 - end of block
01000000 - invalid code
*/
/* Maximum size of dynamic tree. The maximum found in a long but non-
exhaustive search was 1004 code structures (850 for length/literals
and 154 for distances, the latter actually the result of an
exhaustive search). The true maximum is not known, but the value
below is more than safe. */
#define ENOUGH 1440
#define MAXD 154
/* Type of code to build for inftable() */
typedef enum {
CODES,
LENS,
DISTS
} codetype;
extern int inflate_table9 OF((codetype type, unsigned short FAR *lens,
unsigned codes, code FAR * FAR *table,
unsigned FAR *bits, unsigned short FAR *work));

View File

@@ -3,11 +3,11 @@
* *
* inffast.c -- fast decoding * inffast.c -- fast decoding
* Copyright (C) 1995-2003 Mark Adler * Copyright (C) 1995-2003 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
* *
* Copyright (C) 2003 Chris Anderson <christop@charm.net> * Copyright (C) 2003 Chris Anderson <christop@charm.net>
* Please use the copyright conditions above. * Please use the copyright conditions above.
* *
* This version (Jan-23-2003) of inflate_fast was coded and tested under * This version (Jan-23-2003) of inflate_fast was coded and tested under
* GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that
* machine, I found that gzip style archives decompressed about 20% faster than * machine, I found that gzip style archives decompressed about 20% faster than
@@ -61,7 +61,7 @@
*/ */
#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) #if ! defined( GAS_COFF ) && ! defined( GAS_ELF )
#if defined( __CYGWIN__ ) #if defined( WIN32 ) || defined( __CYGWIN__ )
#define GAS_COFF /* windows object format */ #define GAS_COFF /* windows object format */
#else #else
#define GAS_ELF #define GAS_ELF
@@ -151,14 +151,14 @@
*/ */
#define mode_state 0 /* state->mode */ #define mode_state 0 /* state->mode */
#define wsize_state 32 /* state->wsize */ #define wsize_state 32 /* state->wsize */
#define write_state 36 /* state->write */ #define write_state 40 /* state->write */
#define window_state 40 /* state->window */ #define window_state 44 /* state->window */
#define hold_state 44 /* state->hold */ #define hold_state 48 /* state->hold */
#define bits_state 48 /* state->bits */ #define bits_state 52 /* state->bits */
#define lencode_state 64 /* state->lencode */ #define lencode_state 68 /* state->lencode */
#define distcode_state 68 /* state->distcode */ #define distcode_state 72 /* state->distcode */
#define lenbits_state 72 /* state->lenbits */ #define lenbits_state 76 /* state->lenbits */
#define distbits_state 76 /* state->distbits */ #define distbits_state 80 /* state->distbits */
/* /*
* inflate_fast's activation record * inflate_fast's activation record
@@ -387,7 +387,7 @@ inflate_fast:
* bios may load a cpuid instruction and * bios may load a cpuid instruction and
* cpuid may be disabled on Cyrix 5-6x86 */ * cpuid may be disabled on Cyrix 5-6x86 */
popf popf
pushf pushf
popl %edx /* copy new eflags to edx */ popl %edx /* copy new eflags to edx */
xorl %eax, %edx /* test if ID bit is flipped */ xorl %eax, %edx /* test if ID bit is flipped */
jz .L_dont_use_mmx /* not flipped if zero */ jz .L_dont_use_mmx /* not flipped if zero */
@@ -420,7 +420,7 @@ inflate_fast:
popl %eax popl %eax
jmp .L_check_mmx jmp .L_check_mmx
#endif #endif
/*** Non-MMX code ***/ /*** Non-MMX code ***/
@@ -443,7 +443,7 @@ inflate_fast:
.L_do_loop: .L_do_loop:
/* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
* *
* do { * do {
* if (bits < 15) { * if (bits < 15) {
* hold |= *((unsigned short *)in)++ << bits; * hold |= *((unsigned short *)in)++ << bits;
* bits += 16 * bits += 16
@@ -900,7 +900,7 @@ inflate_fast:
#define dmask_mm %mm5 #define dmask_mm %mm5
#define tmp_mm %mm6 #define tmp_mm %mm6
movd lmask(%esp), lmask_mm movd lmask(%esp), lmask_mm
movq lmask_mm, lmask2_mm movq lmask_mm, lmask2_mm
movd dmask(%esp), dmask_mm movd dmask(%esp), dmask_mm
movq dmask_mm, dmask2_mm movq dmask_mm, dmask2_mm
@@ -1056,7 +1056,7 @@ inflate_fast:
jmp .L_while_test_mmx jmp .L_while_test_mmx
.align 16,0x90 .align 16,0x90
.L_test_for_second_level_length_mmx: .L_test_for_second_level_length_mmx:
testb $64, %al testb $64, %al
jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */

View File

@@ -1,5 +1,4 @@
#include <memory.h>
#include "zfstream.h" #include "zfstream.h"
gzfilebuf::gzfilebuf() : gzfilebuf::gzfilebuf() :
@@ -17,15 +16,13 @@ gzfilebuf::~gzfilebuf() {
} }
gzfilebuf *gzfilebuf::open( const char *name, gzfilebuf *gzfilebuf::open( const char *name,
int io_mode ) { int io_mode ) {
if ( is_open() ) if ( is_open() )
return NULL; return NULL;
char char_mode[10]; char char_mode[10];
char *p; char *p = char_mode;
memset(char_mode,'\0',10);
p = char_mode;
if ( io_mode & ios::in ) { if ( io_mode & ios::in ) {
mode = ios::in; mode = ios::in;
@@ -48,6 +45,9 @@ gzfilebuf *gzfilebuf::open( const char *name,
*p++ = '9'; *p++ = '9';
} }
// Put the end-of-string indicator
*p = '\0';
if ( (file = gzopen(name, char_mode)) == NULL ) if ( (file = gzopen(name, char_mode)) == NULL )
return NULL; return NULL;
@@ -58,15 +58,13 @@ gzfilebuf *gzfilebuf::open( const char *name,
} }
gzfilebuf *gzfilebuf::attach( int file_descriptor, gzfilebuf *gzfilebuf::attach( int file_descriptor,
int io_mode ) { int io_mode ) {
if ( is_open() ) if ( is_open() )
return NULL; return NULL;
char char_mode[10]; char char_mode[10];
char *p; char *p = char_mode;
memset(char_mode,'\0',10);
p = char_mode;
if ( io_mode & ios::in ) { if ( io_mode & ios::in ) {
mode = ios::in; mode = ios::in;
@@ -89,6 +87,9 @@ gzfilebuf *gzfilebuf::attach( int file_descriptor,
*p++ = '9'; *p++ = '9';
} }
// Put the end-of-string indicator
*p = '\0';
if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
return NULL; return NULL;
@@ -112,13 +113,13 @@ gzfilebuf *gzfilebuf::close() {
} }
int gzfilebuf::setcompressionlevel( short comp_level ) { int gzfilebuf::setcompressionlevel( int comp_level ) {
return gzsetparams(file, comp_level, -2); return gzsetparams(file, comp_level, -2);
} }
int gzfilebuf::setcompressionstrategy( short comp_strategy ) { int gzfilebuf::setcompressionstrategy( int comp_strategy ) {
return gzsetparams(file, -2, comp_strategy); return gzsetparams(file, -2, comp_strategy);
@@ -151,7 +152,7 @@ int gzfilebuf::underflow() {
if ( out_waiting() ) { if ( out_waiting() ) {
if ( flushbuf() == EOF ) if ( flushbuf() == EOF )
return EOF; return EOF;
} }
} }
@@ -180,11 +181,11 @@ int gzfilebuf::overflow( int c ) {
setg(0,0,0); setg(0,0,0);
} else { } else {
if (in_avail()) { if (in_avail()) {
return EOF; return EOF;
} }
if (out_waiting()) { if (out_waiting()) {
if (flushbuf() == EOF) if (flushbuf() == EOF)
return EOF; return EOF;
} }
} }
@@ -282,12 +283,11 @@ void gzfilestream_common::close() {
} }
gzfilebuf *gzfilestream_common::rdbuf() { gzfilebuf *gzfilestream_common::rdbuf()
{
return &buffer; return &buffer;
} }
gzifstream::gzifstream() : gzifstream::gzifstream() :
ios( gzfilestream_common::rdbuf() ) ios( gzfilestream_common::rdbuf() )
{ {

View File

@@ -1,6 +1,6 @@
#ifndef _zfstream_h #ifndef zfstream_h
#define _zfstream_h #define zfstream_h
#include <fstream.h> #include <fstream.h>
#include "zlib.h" #include "zlib.h"
@@ -16,8 +16,8 @@ public:
gzfilebuf *attach( int file_descriptor, int io_mode ); gzfilebuf *attach( int file_descriptor, int io_mode );
gzfilebuf *close(); gzfilebuf *close();
int setcompressionlevel( short comp_level ); int setcompressionlevel( int comp_level );
int setcompressionstrategy( short comp_strategy ); int setcompressionstrategy( int comp_strategy );
inline int is_open() const { return (file !=NULL); } inline int is_open() const { return (file !=NULL); }
@@ -98,18 +98,19 @@ private:
T val; T val;
}; };
template<class T> gzofstream &operator<<(gzofstream &s, template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
const gzomanip<T> &m) { {
return (*m.func)(s, m.val); return (*m.func)(s, m.val);
} }
inline gzofstream &setcompressionlevel( gzofstream &s, int l ) { inline gzofstream &setcompressionlevel( gzofstream &s, int l )
{
(s.rdbuf())->setcompressionlevel(l); (s.rdbuf())->setcompressionlevel(l);
return s; return s;
} }
inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) { inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
{
(s.rdbuf())->setcompressionstrategy(l); (s.rdbuf())->setcompressionstrategy(l);
return s; return s;
} }
@@ -125,18 +126,3 @@ inline gzomanip<int> setcompressionstrategy(int l)
} }
#endif #endif

View File

@@ -4,9 +4,9 @@
#include <iomanip.h> #include <iomanip.h>
void main() { void main() {
char h[256] = "Hello"; char h[256] = "Hello";
char* g = "Goodbye"; char* g = "Goodbye";
ozstream out("temp.gz"); ozstream out("temp.gz");
out < "This works well" < h < g; out < "This works well" < h < g;
out.close(); out.close();

View File

@@ -3,19 +3,19 @@ to do things like:
gzofstream outf("blah.gz"); gzofstream outf("blah.gz");
outf << "These go into the gzip file " << 123 << endl; outf << "These go into the gzip file " << 123 << endl;
It does this by deriving a specialized stream buffer for gzipped files, which is It does this by deriving a specialized stream buffer for gzipped files, which is
the way Stroustrup would have done it. :-> the way Stroustrup would have done it. :->
The gzifstream and gzofstream classes were originally written by Kevin Ruland The gzifstream and gzofstream classes were originally written by Kevin Ruland
and made available in the zlib contrib/iostream directory. The older version still and made available in the zlib contrib/iostream directory. The older version still
compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of
this version. this version.
The new classes are as standard-compliant as possible, closely following the The new classes are as standard-compliant as possible, closely following the
approach of the standard library's fstream classes. It compiles under gcc versions approach of the standard library's fstream classes. It compiles under gcc versions
3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard 3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard
library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs
from the previous one in the following respects: from the previous one in the following respects:
- added showmanyc - added showmanyc
- added setbuf, with support for unbuffered output via setbuf(0,0) - added setbuf, with support for unbuffered output via setbuf(0,0)
@@ -23,7 +23,7 @@ from the previous one in the following respects:
- gzipped output file opened with default compression level instead of maximum level - gzipped output file opened with default compression level instead of maximum level
- setcompressionlevel()/strategy() members replaced by single setcompression() - setcompressionlevel()/strategy() members replaced by single setcompression()
The code is provided "as is", with the permission to use, copy, modify, distribute The code is provided "as is", with the permission to use, copy, modify, distribute
and sell it for any purpose without fee. and sell it for any purpose without fee.
Ludwig Schwardt Ludwig Schwardt

View File

@@ -13,5 +13,5 @@ Possible upgrades to gzfilebuf:
- Check public interface to see which calls give problems - Check public interface to see which calls give problems
(due to dependence on library internals) (due to dependence on library internals)
- Override operator<<(ostream&, gzfilebuf*) to allow direct copying - Override operator<<(ostream&, gzfilebuf*) to allow direct copying
of stream buffer to stream ( i.e. os << is.rdbuf(); ) of stream buffer to stream ( i.e. os << is.rdbuf(); )

View File

@@ -1,6 +1,6 @@
/* /*
* Test program for gzifstream and gzofstream * Test program for gzifstream and gzofstream
* *
* by Ludwig Schwardt <schwardt@sun.ac.za> * by Ludwig Schwardt <schwardt@sun.ac.za>
* original version by Kevin Ruland <kevin@rodin.wustl.edu> * original version by Kevin Ruland <kevin@rodin.wustl.edu>
*/ */
@@ -13,15 +13,15 @@ int main() {
gzofstream outf; gzofstream outf;
gzifstream inf; gzifstream inf;
char buf[80]; char buf[80];
outf.open("test1.txt.gz"); outf.open("test1.txt.gz");
outf << "The quick brown fox sidestepped the lazy canine\n" outf << "The quick brown fox sidestepped the lazy canine\n"
<< 1.3 << "\nPlan " << 9 << std::endl; << 1.3 << "\nPlan " << 9 << std::endl;
outf.close(); outf.close();
std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n"
<< "The quick brown fox sidestepped the lazy canine\n" << "The quick brown fox sidestepped the lazy canine\n"
<< 1.3 << "\nPlan " << 9 << std::endl; << 1.3 << "\nPlan " << 9 << std::endl;
std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n";
inf.open("test1.txt.gz"); inf.open("test1.txt.gz");
while (inf.getline(buf,80,'\n')) { while (inf.getline(buf,80,'\n')) {

View File

@@ -1,9 +1,9 @@
/* /*
* A C++ I/O streams interface to the zlib gz* functions * A C++ I/O streams interface to the zlib gz* functions
* *
* by Ludwig Schwardt <schwardt@sun.ac.za> * by Ludwig Schwardt <schwardt@sun.ac.za>
* original version by Kevin Ruland <kevin@rodin.wustl.edu> * original version by Kevin Ruland <kevin@rodin.wustl.edu>
* *
* This version is standard-compliant and compatible with gcc 3.x. * This version is standard-compliant and compatible with gcc 3.x.
*/ */
@@ -18,8 +18,8 @@
/*****************************************************************************/ /*****************************************************************************/
// Default constructor // Default constructor
gzfilebuf::gzfilebuf() gzfilebuf::gzfilebuf()
: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), : file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false),
buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true)
{ {
// No buffers to start with // No buffers to start with
@@ -27,12 +27,12 @@ gzfilebuf::gzfilebuf()
} }
// Destructor // Destructor
gzfilebuf::~gzfilebuf() gzfilebuf::~gzfilebuf()
{ {
// Sync output buffer and close only if responsible for file // Sync output buffer and close only if responsible for file
// (i.e. attached streams should be left open at this stage) // (i.e. attached streams should be left open at this stage)
this->sync(); this->sync();
if (own_fd) if (own_fd)
this->close(); this->close();
// Make sure internal buffer is deallocated // Make sure internal buffer is deallocated
this->disable_buffer(); this->disable_buffer();
@@ -41,30 +41,30 @@ gzfilebuf::~gzfilebuf()
// Set compression level and strategy // Set compression level and strategy
int int
gzfilebuf::setcompression(int comp_level, gzfilebuf::setcompression(int comp_level,
int comp_strategy) int comp_strategy)
{ {
return gzsetparams(file, comp_level, comp_strategy); return gzsetparams(file, comp_level, comp_strategy);
} }
// Open gzipped file // Open gzipped file
gzfilebuf* gzfilebuf*
gzfilebuf::open(const char *name, gzfilebuf::open(const char *name,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
// Fail if file already open // Fail if file already open
if (this->is_open()) if (this->is_open())
return NULL; return NULL;
// Don't support simultaneous read/write access (yet) // Don't support simultaneous read/write access (yet)
if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
return NULL; return NULL;
// Build mode string for gzopen and check it [27.8.1.3.2] // Build mode string for gzopen and check it [27.8.1.3.2]
char char_mode[6] = "\0\0\0\0\0"; char char_mode[6] = "\0\0\0\0\0";
if (!this->open_mode(mode, char_mode)) if (!this->open_mode(mode, char_mode))
return NULL; return NULL;
// Attempt to open file // Attempt to open file
if ((file = gzopen(name, char_mode)) == NULL) if ((file = gzopen(name, char_mode)) == NULL)
return NULL; return NULL;
// On success, allocate internal buffer and set flags // On success, allocate internal buffer and set flags
@@ -77,24 +77,24 @@ gzfilebuf::open(const char *name,
// Attach to gzipped file // Attach to gzipped file
gzfilebuf* gzfilebuf*
gzfilebuf::attach(int fd, gzfilebuf::attach(int fd,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
// Fail if file already open // Fail if file already open
if (this->is_open()) if (this->is_open())
return NULL; return NULL;
// Don't support simultaneous read/write access (yet) // Don't support simultaneous read/write access (yet)
if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
return NULL; return NULL;
// Build mode string for gzdopen and check it [27.8.1.3.2] // Build mode string for gzdopen and check it [27.8.1.3.2]
char char_mode[6] = "\0\0\0\0\0"; char char_mode[6] = "\0\0\0\0\0";
if (!this->open_mode(mode, char_mode)) if (!this->open_mode(mode, char_mode))
return NULL; return NULL;
// Attempt to attach to file // Attempt to attach to file
if ((file = gzdopen(fd, char_mode)) == NULL) if ((file = gzdopen(fd, char_mode)) == NULL)
return NULL; return NULL;
// On success, allocate internal buffer and set flags // On success, allocate internal buffer and set flags
this->enable_buffer(); this->enable_buffer();
io_mode = mode; io_mode = mode;
@@ -104,7 +104,7 @@ gzfilebuf::attach(int fd,
// Close gzipped file // Close gzipped file
gzfilebuf* gzfilebuf*
gzfilebuf::close() gzfilebuf::close()
{ {
// Fail immediately if no file is open // Fail immediately if no file is open
if (!this->is_open()) if (!this->is_open())
@@ -127,16 +127,16 @@ gzfilebuf::close()
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Convert int open mode to mode string // Convert int open mode to mode string
bool bool
gzfilebuf::open_mode(std::ios_base::openmode mode, gzfilebuf::open_mode(std::ios_base::openmode mode,
char* c_mode) const char* c_mode) const
{ {
bool testb = mode & std::ios_base::binary; bool testb = mode & std::ios_base::binary;
bool testi = mode & std::ios_base::in; bool testi = mode & std::ios_base::in;
bool testo = mode & std::ios_base::out; bool testo = mode & std::ios_base::out;
bool testt = mode & std::ios_base::trunc; bool testt = mode & std::ios_base::trunc;
bool testa = mode & std::ios_base::app; bool testa = mode & std::ios_base::app;
// Check for valid flag combinations - see [27.8.1.3.2] (Table 92) // Check for valid flag combinations - see [27.8.1.3.2] (Table 92)
// Original zfstream hardcoded the compression level to maximum here... // Original zfstream hardcoded the compression level to maximum here...
// Double the time for less than 1% size improvement seems // Double the time for less than 1% size improvement seems
@@ -156,7 +156,7 @@ gzfilebuf::open_mode(std::ios_base::openmode mode,
// if (testi && testo && testt && !testa) // if (testi && testo && testt && !testa)
// strcpy(c_mode, "w+"); // strcpy(c_mode, "w+");
// Mode string should be empty for invalid combination of flags // Mode string should be empty for invalid combination of flags
if (strlen(c_mode) == 0) if (strlen(c_mode) == 0)
return false; return false;
if (testb) if (testb)
@@ -165,7 +165,7 @@ gzfilebuf::open_mode(std::ios_base::openmode mode,
} }
// Determine number of characters in internal get buffer // Determine number of characters in internal get buffer
std::streamsize std::streamsize
gzfilebuf::showmanyc() gzfilebuf::showmanyc()
{ {
// Calls to underflow will fail if file not opened for reading // Calls to underflow will fail if file not opened for reading
@@ -180,10 +180,10 @@ gzfilebuf::showmanyc()
// Fill get area from gzipped file // Fill get area from gzipped file
gzfilebuf::int_type gzfilebuf::int_type
gzfilebuf::underflow() gzfilebuf::underflow()
{ {
// If something is left in the get area by chance, return it // If something is left in the get area by chance, return it
// (this shouldn't normally happen, as underflow is only supposed // (this shouldn't normally happen, as underflow is only supposed
// to be called when gptr >= egptr, but it serves as error check) // to be called when gptr >= egptr, but it serves as error check)
if (this->gptr() && (this->gptr() < this->egptr())) if (this->gptr() && (this->gptr() < this->egptr()))
return traits_type::to_int_type(*(this->gptr())); return traits_type::to_int_type(*(this->gptr()));
@@ -204,14 +204,14 @@ gzfilebuf::underflow()
} }
// Make all bytes read from file available as get area // Make all bytes read from file available as get area
this->setg(buffer, buffer, buffer + bytes_read); this->setg(buffer, buffer, buffer + bytes_read);
// Return next character in get area // Return next character in get area
return traits_type::to_int_type(*(this->gptr())); return traits_type::to_int_type(*(this->gptr()));
} }
// Write put area to gzipped file // Write put area to gzipped file
gzfilebuf::int_type gzfilebuf::int_type
gzfilebuf::overflow(int_type c) gzfilebuf::overflow(int_type c)
{ {
// Determine whether put area is in use // Determine whether put area is in use
if (this->pbase()) if (this->pbase())
@@ -232,10 +232,10 @@ gzfilebuf::overflow(int_type c)
{ {
// If the file hasn't been opened for writing, produce error // If the file hasn't been opened for writing, produce error
if (!this->is_open() || !(io_mode & std::ios_base::out)) if (!this->is_open() || !(io_mode & std::ios_base::out))
return traits_type::eof(); return traits_type::eof();
// If gzipped file won't accept all bytes written to it, fail // If gzipped file won't accept all bytes written to it, fail
if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write)
return traits_type::eof(); return traits_type::eof();
// Reset next pointer to point to pbase on success // Reset next pointer to point to pbase on success
this->pbump(-bytes_to_write); this->pbump(-bytes_to_write);
} }
@@ -250,7 +250,7 @@ gzfilebuf::overflow(int_type c)
char_type last_char = traits_type::to_char_type(c); char_type last_char = traits_type::to_char_type(c);
// If gzipped file won't accept this character, fail // If gzipped file won't accept this character, fail
if (gzwrite(file, &last_char, 1) != 1) if (gzwrite(file, &last_char, 1) != 1)
return traits_type::eof(); return traits_type::eof();
} }
// If you got here, you have succeeded (even if c was EOF) // If you got here, you have succeeded (even if c was EOF)
@@ -262,9 +262,9 @@ gzfilebuf::overflow(int_type c)
} }
// Assign new buffer // Assign new buffer
std::streambuf* std::streambuf*
gzfilebuf::setbuf(char_type* p, gzfilebuf::setbuf(char_type* p,
std::streamsize n) std::streamsize n)
{ {
// First make sure stuff is sync'ed, for safety // First make sure stuff is sync'ed, for safety
if (this->sync() == -1) if (this->sync() == -1)
@@ -295,8 +295,8 @@ gzfilebuf::setbuf(char_type* p,
} }
// Write put area to gzipped file (i.e. ensures that put area is empty) // Write put area to gzipped file (i.e. ensures that put area is empty)
int int
gzfilebuf::sync() gzfilebuf::sync()
{ {
return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0;
} }
@@ -304,11 +304,11 @@ gzfilebuf::sync()
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Allocate internal buffer // Allocate internal buffer
void void
gzfilebuf::enable_buffer() gzfilebuf::enable_buffer()
{ {
// If internal buffer required, allocate one // If internal buffer required, allocate one
if (own_buffer && !buffer) if (own_buffer && !buffer)
{ {
// Check for buffered vs. "unbuffered" // Check for buffered vs. "unbuffered"
if (buffer_size > 0) if (buffer_size > 0)
@@ -335,16 +335,16 @@ gzfilebuf::enable_buffer()
} }
else else
{ {
// If buffer already allocated, reset buffer pointers just to make sure no // If buffer already allocated, reset buffer pointers just to make sure no
// stale chars are lying around // stale chars are lying around
this->setg(buffer, buffer, buffer); this->setg(buffer, buffer, buffer);
this->setp(buffer, buffer + buffer_size - 1); this->setp(buffer, buffer + buffer_size - 1);
} }
} }
// Destroy internal buffer // Destroy internal buffer
void void
gzfilebuf::disable_buffer() gzfilebuf::disable_buffer()
{ {
// If internal buffer exists, deallocate it // If internal buffer exists, deallocate it
if (own_buffer && buffer) if (own_buffer && buffer)
@@ -371,13 +371,13 @@ gzfilebuf::disable_buffer()
/*****************************************************************************/ /*****************************************************************************/
// Default constructor initializes stream buffer // Default constructor initializes stream buffer
gzifstream::gzifstream() gzifstream::gzifstream()
: std::istream(NULL), sb() : std::istream(NULL), sb()
{ this->init(&sb); } { this->init(&sb); }
// Initialize stream buffer and open file // Initialize stream buffer and open file
gzifstream::gzifstream(const char* name, gzifstream::gzifstream(const char* name,
std::ios_base::openmode mode) std::ios_base::openmode mode)
: std::istream(NULL), sb() : std::istream(NULL), sb()
{ {
this->init(&sb); this->init(&sb);
@@ -386,7 +386,7 @@ gzifstream::gzifstream(const char* name,
// Initialize stream buffer and attach to file // Initialize stream buffer and attach to file
gzifstream::gzifstream(int fd, gzifstream::gzifstream(int fd,
std::ios_base::openmode mode) std::ios_base::openmode mode)
: std::istream(NULL), sb() : std::istream(NULL), sb()
{ {
this->init(&sb); this->init(&sb);
@@ -394,9 +394,9 @@ gzifstream::gzifstream(int fd,
} }
// Open file and go into fail() state if unsuccessful // Open file and go into fail() state if unsuccessful
void void
gzifstream::open(const char* name, gzifstream::open(const char* name,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
if (!sb.open(name, mode | std::ios_base::in)) if (!sb.open(name, mode | std::ios_base::in))
this->setstate(std::ios_base::failbit); this->setstate(std::ios_base::failbit);
@@ -405,9 +405,9 @@ gzifstream::open(const char* name,
} }
// Attach to file and go into fail() state if unsuccessful // Attach to file and go into fail() state if unsuccessful
void void
gzifstream::attach(int fd, gzifstream::attach(int fd,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
if (!sb.attach(fd, mode | std::ios_base::in)) if (!sb.attach(fd, mode | std::ios_base::in))
this->setstate(std::ios_base::failbit); this->setstate(std::ios_base::failbit);
@@ -416,7 +416,7 @@ gzifstream::attach(int fd,
} }
// Close file // Close file
void void
gzifstream::close() gzifstream::close()
{ {
if (!sb.close()) if (!sb.close())
@@ -426,13 +426,13 @@ gzifstream::close()
/*****************************************************************************/ /*****************************************************************************/
// Default constructor initializes stream buffer // Default constructor initializes stream buffer
gzofstream::gzofstream() gzofstream::gzofstream()
: std::ostream(NULL), sb() : std::ostream(NULL), sb()
{ this->init(&sb); } { this->init(&sb); }
// Initialize stream buffer and open file // Initialize stream buffer and open file
gzofstream::gzofstream(const char* name, gzofstream::gzofstream(const char* name,
std::ios_base::openmode mode) std::ios_base::openmode mode)
: std::ostream(NULL), sb() : std::ostream(NULL), sb()
{ {
this->init(&sb); this->init(&sb);
@@ -441,7 +441,7 @@ gzofstream::gzofstream(const char* name,
// Initialize stream buffer and attach to file // Initialize stream buffer and attach to file
gzofstream::gzofstream(int fd, gzofstream::gzofstream(int fd,
std::ios_base::openmode mode) std::ios_base::openmode mode)
: std::ostream(NULL), sb() : std::ostream(NULL), sb()
{ {
this->init(&sb); this->init(&sb);
@@ -449,9 +449,9 @@ gzofstream::gzofstream(int fd,
} }
// Open file and go into fail() state if unsuccessful // Open file and go into fail() state if unsuccessful
void void
gzofstream::open(const char* name, gzofstream::open(const char* name,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
if (!sb.open(name, mode | std::ios_base::out)) if (!sb.open(name, mode | std::ios_base::out))
this->setstate(std::ios_base::failbit); this->setstate(std::ios_base::failbit);
@@ -460,9 +460,9 @@ gzofstream::open(const char* name,
} }
// Attach to file and go into fail() state if unsuccessful // Attach to file and go into fail() state if unsuccessful
void void
gzofstream::attach(int fd, gzofstream::attach(int fd,
std::ios_base::openmode mode) std::ios_base::openmode mode)
{ {
if (!sb.attach(fd, mode | std::ios_base::out)) if (!sb.attach(fd, mode | std::ios_base::out))
this->setstate(std::ios_base::failbit); this->setstate(std::ios_base::failbit);
@@ -471,7 +471,7 @@ gzofstream::attach(int fd,
} }
// Close file // Close file
void void
gzofstream::close() gzofstream::close()
{ {
if (!sb.close()) if (!sb.close())

View File

@@ -1,9 +1,9 @@
/* /*
* A C++ I/O streams interface to the zlib gz* functions * A C++ I/O streams interface to the zlib gz* functions
* *
* by Ludwig Schwardt <schwardt@sun.ac.za> * by Ludwig Schwardt <schwardt@sun.ac.za>
* original version by Kevin Ruland <kevin@rodin.wustl.edu> * original version by Kevin Ruland <kevin@rodin.wustl.edu>
* *
* This version is standard-compliant and compatible with gcc 3.x. * This version is standard-compliant and compatible with gcc 3.x.
*/ */
@@ -20,204 +20,204 @@
* @brief Gzipped file stream buffer class. * @brief Gzipped file stream buffer class.
* *
* This class implements basic_filebuf for gzipped files. It doesn't yet support * This class implements basic_filebuf for gzipped files. It doesn't yet support
* seeking (allowed by zlib but slow/limited), putback and read/write access * seeking (allowed by zlib but slow/limited), putback and read/write access
* (tricky). Otherwise, it attempts to be a drop-in replacement for the standard * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard
* file streambuf. * file streambuf.
*/ */
class gzfilebuf : public std::streambuf class gzfilebuf : public std::streambuf
{ {
public: public:
// Default constructor. // Default constructor.
gzfilebuf(); gzfilebuf();
// Destructor. // Destructor.
virtual virtual
~gzfilebuf(); ~gzfilebuf();
/** /**
* @brief Set compression level and strategy on the fly. * @brief Set compression level and strategy on the fly.
* @param comp_level Compression level (see zlib.h for allowed values) * @param comp_level Compression level (see zlib.h for allowed values)
* @param comp_strategy Compression strategy (see zlib.h for allowed values) * @param comp_strategy Compression strategy (see zlib.h for allowed values)
* @return Z_OK on success, Z_STREAM_ERROR otherwise. * @return Z_OK on success, Z_STREAM_ERROR otherwise.
* *
* Unfortunately, these parameters cannot be modified separately, as the * Unfortunately, these parameters cannot be modified separately, as the
* previous zfstream version assumed. Since the strategy is seldom changed, * previous zfstream version assumed. Since the strategy is seldom changed,
* it can default and setcompression(level) then becomes like the old * it can default and setcompression(level) then becomes like the old
* setcompressionlevel(level). * setcompressionlevel(level).
*/ */
int int
setcompression(int comp_level, setcompression(int comp_level,
int comp_strategy = Z_DEFAULT_STRATEGY); int comp_strategy = Z_DEFAULT_STRATEGY);
/** /**
* @brief Check if file is open. * @brief Check if file is open.
* @return True if file is open. * @return True if file is open.
*/ */
bool bool
is_open() const { return (file != NULL); } is_open() const { return (file != NULL); }
/** /**
* @brief Open gzipped file. * @brief Open gzipped file.
* @param name File name. * @param name File name.
* @param mode Open mode flags. * @param mode Open mode flags.
* @return @c this on success, NULL on failure. * @return @c this on success, NULL on failure.
*/ */
gzfilebuf* gzfilebuf*
open(const char* name, open(const char* name,
std::ios_base::openmode mode); std::ios_base::openmode mode);
/** /**
* @brief Attach to already open gzipped file. * @brief Attach to already open gzipped file.
* @param fd File descriptor. * @param fd File descriptor.
* @param mode Open mode flags. * @param mode Open mode flags.
* @return @c this on success, NULL on failure. * @return @c this on success, NULL on failure.
*/ */
gzfilebuf* gzfilebuf*
attach(int fd, attach(int fd,
std::ios_base::openmode mode); std::ios_base::openmode mode);
/** /**
* @brief Close gzipped file. * @brief Close gzipped file.
* @return @c this on success, NULL on failure. * @return @c this on success, NULL on failure.
*/ */
gzfilebuf* gzfilebuf*
close(); close();
protected: protected:
/** /**
* @brief Convert ios open mode int to mode string used by zlib. * @brief Convert ios open mode int to mode string used by zlib.
* @return True if valid mode flag combination. * @return True if valid mode flag combination.
*/ */
bool bool
open_mode(std::ios_base::openmode mode, open_mode(std::ios_base::openmode mode,
char* c_mode) const; char* c_mode) const;
/** /**
* @brief Number of characters available in stream buffer. * @brief Number of characters available in stream buffer.
* @return Number of characters. * @return Number of characters.
* *
* This indicates number of characters in get area of stream buffer. * This indicates number of characters in get area of stream buffer.
* These characters can be read without accessing the gzipped file. * These characters can be read without accessing the gzipped file.
*/ */
virtual std::streamsize virtual std::streamsize
showmanyc(); showmanyc();
/** /**
* @brief Fill get area from gzipped file. * @brief Fill get area from gzipped file.
* @return First character in get area on success, EOF on error. * @return First character in get area on success, EOF on error.
* *
* This actually reads characters from gzipped file to stream * This actually reads characters from gzipped file to stream
* buffer. Always buffered. * buffer. Always buffered.
*/ */
virtual int_type virtual int_type
underflow(); underflow();
/** /**
* @brief Write put area to gzipped file. * @brief Write put area to gzipped file.
* @param c Extra character to add to buffer contents. * @param c Extra character to add to buffer contents.
* @return Non-EOF on success, EOF on error. * @return Non-EOF on success, EOF on error.
* *
* This actually writes characters in stream buffer to * This actually writes characters in stream buffer to
* gzipped file. With unbuffered output this is done one * gzipped file. With unbuffered output this is done one
* character at a time. * character at a time.
*/ */
virtual int_type virtual int_type
overflow(int_type c = traits_type::eof()); overflow(int_type c = traits_type::eof());
/** /**
* @brief Installs external stream buffer. * @brief Installs external stream buffer.
* @param p Pointer to char buffer. * @param p Pointer to char buffer.
* @param n Size of external buffer. * @param n Size of external buffer.
* @return @c this on success, NULL on failure. * @return @c this on success, NULL on failure.
* *
* Call setbuf(0,0) to enable unbuffered output. * Call setbuf(0,0) to enable unbuffered output.
*/ */
virtual std::streambuf* virtual std::streambuf*
setbuf(char_type* p, setbuf(char_type* p,
std::streamsize n); std::streamsize n);
/** /**
* @brief Flush stream buffer to file. * @brief Flush stream buffer to file.
* @return 0 on success, -1 on error. * @return 0 on success, -1 on error.
* *
* This calls underflow(EOF) to do the job. * This calls underflow(EOF) to do the job.
*/ */
virtual int virtual int
sync(); sync();
// //
// Some future enhancements // Some future enhancements
// //
// virtual int_type uflow(); // virtual int_type uflow();
// virtual int_type pbackfail(int_type c = traits_type::eof()); // virtual int_type pbackfail(int_type c = traits_type::eof());
// virtual pos_type // virtual pos_type
// seekoff(off_type off, // seekoff(off_type off,
// std::ios_base::seekdir way, // std::ios_base::seekdir way,
// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); // std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
// virtual pos_type // virtual pos_type
// seekpos(pos_type sp, // seekpos(pos_type sp,
// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); // std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
private: private:
/** /**
* @brief Allocate internal buffer. * @brief Allocate internal buffer.
* *
* This function is safe to call multiple times. It will ensure * This function is safe to call multiple times. It will ensure
* that a proper internal buffer exists if it is required. If the * that a proper internal buffer exists if it is required. If the
* buffer already exists or is external, the buffer pointers will be * buffer already exists or is external, the buffer pointers will be
* reset to their original state. * reset to their original state.
*/ */
void void
enable_buffer(); enable_buffer();
/** /**
* @brief Destroy internal buffer. * @brief Destroy internal buffer.
* *
* This function is safe to call multiple times. It will ensure * This function is safe to call multiple times. It will ensure
* that the internal buffer is deallocated if it exists. In any * that the internal buffer is deallocated if it exists. In any
* case, it will also reset the buffer pointers. * case, it will also reset the buffer pointers.
*/ */
void void
disable_buffer(); disable_buffer();
/** /**
* Underlying file pointer. * Underlying file pointer.
*/ */
gzFile file; gzFile file;
/** /**
* Mode in which file was opened. * Mode in which file was opened.
*/ */
std::ios_base::openmode io_mode; std::ios_base::openmode io_mode;
/** /**
* @brief True if this object owns file descriptor. * @brief True if this object owns file descriptor.
* *
* This makes the class responsible for closing the file * This makes the class responsible for closing the file
* upon destruction. * upon destruction.
*/ */
bool own_fd; bool own_fd;
/** /**
* @brief Stream buffer. * @brief Stream buffer.
* *
* For simplicity this remains allocated on the free store for the * For simplicity this remains allocated on the free store for the
* entire life span of the gzfilebuf object, unless replaced by setbuf. * entire life span of the gzfilebuf object, unless replaced by setbuf.
*/ */
char_type* buffer; char_type* buffer;
/** /**
* @brief Stream buffer size. * @brief Stream buffer size.
* *
* Defaults to system default buffer size (typically 8192 bytes). * Defaults to system default buffer size (typically 8192 bytes).
* Modified by setbuf. * Modified by setbuf.
*/ */
std::streamsize buffer_size; std::streamsize buffer_size;
/** /**
* @brief True if this object owns stream buffer. * @brief True if this object owns stream buffer.
* *
* This makes the class responsible for deleting the buffer * This makes the class responsible for deleting the buffer
* upon destruction. * upon destruction.
*/ */
bool own_buffer; bool own_buffer;
@@ -231,49 +231,49 @@ private:
* This class implements ifstream for gzipped files. Seeking and putback * This class implements ifstream for gzipped files. Seeking and putback
* is not supported yet. * is not supported yet.
*/ */
class gzifstream : public std::istream class gzifstream : public std::istream
{ {
public: public:
// Default constructor // Default constructor
gzifstream(); gzifstream();
/** /**
* @brief Construct stream on gzipped file to be opened. * @brief Construct stream on gzipped file to be opened.
* @param name File name. * @param name File name.
* @param mode Open mode flags (forced to contain ios::in). * @param mode Open mode flags (forced to contain ios::in).
*/ */
explicit explicit
gzifstream(const char* name, gzifstream(const char* name,
std::ios_base::openmode mode = std::ios_base::in); std::ios_base::openmode mode = std::ios_base::in);
/** /**
* @brief Construct stream on already open gzipped file. * @brief Construct stream on already open gzipped file.
* @param fd File descriptor. * @param fd File descriptor.
* @param mode Open mode flags (forced to contain ios::in). * @param mode Open mode flags (forced to contain ios::in).
*/ */
explicit explicit
gzifstream(int fd, gzifstream(int fd,
std::ios_base::openmode mode = std::ios_base::in); std::ios_base::openmode mode = std::ios_base::in);
/** /**
* Obtain underlying stream buffer. * Obtain underlying stream buffer.
*/ */
gzfilebuf* gzfilebuf*
rdbuf() const rdbuf() const
{ return const_cast<gzfilebuf*>(&sb); } { return const_cast<gzfilebuf*>(&sb); }
/** /**
* @brief Check if file is open. * @brief Check if file is open.
* @return True if file is open. * @return True if file is open.
*/ */
bool bool
is_open() { return sb.is_open(); } is_open() { return sb.is_open(); }
/** /**
* @brief Open gzipped file. * @brief Open gzipped file.
* @param name File name. * @param name File name.
* @param mode Open mode flags (forced to contain ios::in). * @param mode Open mode flags (forced to contain ios::in).
* *
* Stream will be in state good() if file opens successfully; * Stream will be in state good() if file opens successfully;
* otherwise in state fail(). This differs from the behavior of * otherwise in state fail(). This differs from the behavior of
* ifstream, which never sets the state to good() and therefore * ifstream, which never sets the state to good() and therefore
@@ -281,34 +281,34 @@ public:
* you manually clear() the state. The choice is a matter of * you manually clear() the state. The choice is a matter of
* convenience. * convenience.
*/ */
void void
open(const char* name, open(const char* name,
std::ios_base::openmode mode = std::ios_base::in); std::ios_base::openmode mode = std::ios_base::in);
/** /**
* @brief Attach to already open gzipped file. * @brief Attach to already open gzipped file.
* @param fd File descriptor. * @param fd File descriptor.
* @param mode Open mode flags (forced to contain ios::in). * @param mode Open mode flags (forced to contain ios::in).
* *
* Stream will be in state good() if attach succeeded; otherwise * Stream will be in state good() if attach succeeded; otherwise
* in state fail(). * in state fail().
*/ */
void void
attach(int fd, attach(int fd,
std::ios_base::openmode mode = std::ios_base::in); std::ios_base::openmode mode = std::ios_base::in);
/** /**
* @brief Close gzipped file. * @brief Close gzipped file.
* *
* Stream will be in state fail() if close failed. * Stream will be in state fail() if close failed.
*/ */
void void
close(); close();
private: private:
/** /**
* Underlying stream buffer. * Underlying stream buffer.
*/ */
gzfilebuf sb; gzfilebuf sb;
}; };
@@ -325,44 +325,44 @@ class gzofstream : public std::ostream
public: public:
// Default constructor // Default constructor
gzofstream(); gzofstream();
/** /**
* @brief Construct stream on gzipped file to be opened. * @brief Construct stream on gzipped file to be opened.
* @param name File name. * @param name File name.
* @param mode Open mode flags (forced to contain ios::out). * @param mode Open mode flags (forced to contain ios::out).
*/ */
explicit explicit
gzofstream(const char* name, gzofstream(const char* name,
std::ios_base::openmode mode = std::ios_base::out); std::ios_base::openmode mode = std::ios_base::out);
/** /**
* @brief Construct stream on already open gzipped file. * @brief Construct stream on already open gzipped file.
* @param fd File descriptor. * @param fd File descriptor.
* @param mode Open mode flags (forced to contain ios::out). * @param mode Open mode flags (forced to contain ios::out).
*/ */
explicit explicit
gzofstream(int fd, gzofstream(int fd,
std::ios_base::openmode mode = std::ios_base::out); std::ios_base::openmode mode = std::ios_base::out);
/** /**
* Obtain underlying stream buffer. * Obtain underlying stream buffer.
*/ */
gzfilebuf* gzfilebuf*
rdbuf() const rdbuf() const
{ return const_cast<gzfilebuf*>(&sb); } { return const_cast<gzfilebuf*>(&sb); }
/** /**
* @brief Check if file is open. * @brief Check if file is open.
* @return True if file is open. * @return True if file is open.
*/ */
bool bool
is_open() { return sb.is_open(); } is_open() { return sb.is_open(); }
/** /**
* @brief Open gzipped file. * @brief Open gzipped file.
* @param name File name. * @param name File name.
* @param mode Open mode flags (forced to contain ios::out). * @param mode Open mode flags (forced to contain ios::out).
* *
* Stream will be in state good() if file opens successfully; * Stream will be in state good() if file opens successfully;
* otherwise in state fail(). This differs from the behavior of * otherwise in state fail(). This differs from the behavior of
* ofstream, which never sets the state to good() and therefore * ofstream, which never sets the state to good() and therefore
@@ -370,39 +370,39 @@ public:
* you manually clear() the state. The choice is a matter of * you manually clear() the state. The choice is a matter of
* convenience. * convenience.
*/ */
void void
open(const char* name, open(const char* name,
std::ios_base::openmode mode = std::ios_base::out); std::ios_base::openmode mode = std::ios_base::out);
/** /**
* @brief Attach to already open gzipped file. * @brief Attach to already open gzipped file.
* @param fd File descriptor. * @param fd File descriptor.
* @param mode Open mode flags (forced to contain ios::out). * @param mode Open mode flags (forced to contain ios::out).
* *
* Stream will be in state good() if attach succeeded; otherwise * Stream will be in state good() if attach succeeded; otherwise
* in state fail(). * in state fail().
*/ */
void void
attach(int fd, attach(int fd,
std::ios_base::openmode mode = std::ios_base::out); std::ios_base::openmode mode = std::ios_base::out);
/** /**
* @brief Close gzipped file. * @brief Close gzipped file.
* *
* Stream will be in state fail() if close failed. * Stream will be in state fail() if close failed.
*/ */
void void
close(); close();
private: private:
/** /**
* Underlying stream buffer. * Underlying stream buffer.
*/ */
gzfilebuf sb; gzfilebuf sb;
}; };
/*****************************************************************************/ /*****************************************************************************/
/** /**
* @brief Gzipped file output stream manipulator class. * @brief Gzipped file output stream manipulator class.
* *
@@ -415,28 +415,28 @@ template<typename T1, typename T2>
public: public:
// Allows insertor to peek at internals // Allows insertor to peek at internals
template <typename Ta, typename Tb> template <typename Ta, typename Tb>
friend gzofstream& friend gzofstream&
operator<<(gzofstream&, operator<<(gzofstream&,
const gzomanip2<Ta,Tb>&); const gzomanip2<Ta,Tb>&);
// Constructor // Constructor
gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2),
T1 v1, T1 v1,
T2 v2); T2 v2);
private: private:
// Underlying manipulator function // Underlying manipulator function
gzofstream& gzofstream&
(*func)(gzofstream&, T1, T2); (*func)(gzofstream&, T1, T2);
// Arguments for manipulator function // Arguments for manipulator function
T1 val1; T1 val1;
T2 val2; T2 val2;
}; };
/*****************************************************************************/ /*****************************************************************************/
// Manipulator function thunks through to stream buffer // Manipulator function thunks through to stream buffer
inline gzofstream& inline gzofstream&
setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
{ {
(gzs.rdbuf())->setcompression(l, s); (gzs.rdbuf())->setcompression(l, s);
@@ -445,22 +445,22 @@ setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
// Manipulator constructor stores arguments // Manipulator constructor stores arguments
template<typename T1, typename T2> template<typename T1, typename T2>
inline inline
gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2),
T1 v1, T1 v1,
T2 v2) T2 v2)
: func(f), val1(v1), val2(v2) : func(f), val1(v1), val2(v2)
{ } { }
// Insertor applies underlying manipulator function to stream // Insertor applies underlying manipulator function to stream
template<typename T1, typename T2> template<typename T1, typename T2>
inline gzofstream& inline gzofstream&
operator<<(gzofstream& s, const gzomanip2<T1,T2>& m) operator<<(gzofstream& s, const gzomanip2<T1,T2>& m)
{ return (*m.func)(s, m.val1, m.val2); } { return (*m.func)(s, m.val1, m.val2); }
// Insert this onto stream to simplify setting of compression level // Insert this onto stream to simplify setting of compression level
inline gzomanip2<int,int> inline gzomanip2<int,int>
setcompression(int l, int s = Z_DEFAULT_STRATEGY) setcompression(int l, int s = Z_DEFAULT_STRATEGY)
{ return gzomanip2<int,int>(&setcompression, l, s); } { return gzomanip2<int,int>(&setcompression, l, s); }
#endif // ZFSTREAM_H #endif // ZFSTREAM_H

408
contrib/masm686/match.asm Normal file
View File

@@ -0,0 +1,408 @@
; match.asm -- Pentium-Pro optimized version of longest_match()
;
; Updated for zlib 1.1.3 and converted to MASM 6.1x
; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com>
; and Chuck Walbourn <chuckw@kinesoft.com>
; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro>
;
; This is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License.
; Based on match.S
; Written for zlib 1.1.2
; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
.686P
.MODEL FLAT
;===========================================================================
; EQUATES
;===========================================================================
MAX_MATCH EQU 258
MIN_MATCH EQU 3
MIN_LOOKAHEAD EQU (MAX_MATCH + MIN_MATCH + 1)
MAX_MATCH_8 EQU ((MAX_MATCH + 7) AND (NOT 7))
;===========================================================================
; STRUCTURES
;===========================================================================
; This STRUCT assumes a 4-byte alignment
DEFLATE_STATE STRUCT
ds_strm dd ?
ds_status dd ?
ds_pending_buf dd ?
ds_pending_buf_size dd ?
ds_pending_out dd ?
ds_pending dd ?
ds_wrap dd ?
ds_data_type db ?
ds_method db ?
db ? ; padding
db ? ; padding
ds_last_flush dd ?
ds_w_size dd ? ; used
ds_w_bits dd ?
ds_w_mask dd ? ; used
ds_window dd ? ; used
ds_window_size dd ?
ds_prev dd ? ; used
ds_head dd ?
ds_ins_h dd ?
ds_hash_size dd ?
ds_hash_bits dd ?
ds_hash_mask dd ?
ds_hash_shift dd ?
ds_block_start dd ?
ds_match_length dd ? ; used
ds_prev_match dd ? ; used
ds_match_available dd ?
ds_strstart dd ? ; used
ds_match_start dd ? ; used
ds_lookahead dd ? ; used
ds_prev_length dd ? ; used
ds_max_chain_length dd ? ; used
ds_max_laxy_match dd ?
ds_level dd ?
ds_strategy dd ?
ds_good_match dd ? ; used
ds_nice_match dd ? ; used
; Don't need anymore of the struct for match
DEFLATE_STATE ENDS
;===========================================================================
; CODE
;===========================================================================
_TEXT SEGMENT
;---------------------------------------------------------------------------
; match_init
;---------------------------------------------------------------------------
ALIGN 4
PUBLIC _match_init
_match_init PROC
; no initialization needed
ret
_match_init ENDP
;---------------------------------------------------------------------------
; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
;---------------------------------------------------------------------------
ALIGN 4
PUBLIC _longest_match
_longest_match PROC
; Since this code uses EBP for a scratch register, the stack frame must
; be manually constructed and referenced relative to the ESP register.
; Stack image
; Variables
chainlenwmask = 0 ; high word: current chain len
; low word: s->wmask
window = 4 ; local copy of s->window
windowbestlen = 8 ; s->window + bestlen
scanend = 12 ; last two bytes of string
scanstart = 16 ; first two bytes of string
scanalign = 20 ; dword-misalignment of string
nicematch = 24 ; a good enough match size
bestlen = 28 ; size of best match so far
scan = 32 ; ptr to string wanting match
varsize = 36 ; number of bytes (also offset to last saved register)
; Saved Registers (actually pushed into place)
ebx_save = 36
edi_save = 40
esi_save = 44
ebp_save = 48
; Parameters
retaddr = 52
deflatestate = 56
curmatch = 60
; Save registers that the compiler may be using
push ebp
push edi
push esi
push ebx
; Allocate local variable space
sub esp,varsize
; Retrieve the function arguments. ecx will hold cur_match
; throughout the entire function. edx will hold the pointer to the
; deflate_state structure during the function's setup (before
; entering the main loop).
mov edx, [esp+deflatestate]
ASSUME edx:PTR DEFLATE_STATE
mov ecx, [esp+curmatch]
; uInt wmask = s->w_mask;
; unsigned chain_length = s->max_chain_length;
; if (s->prev_length >= s->good_match) {
; chain_length >>= 2;
; }
mov eax, [edx].ds_prev_length
mov ebx, [edx].ds_good_match
cmp eax, ebx
mov eax, [edx].ds_w_mask
mov ebx, [edx].ds_max_chain_length
jl SHORT LastMatchGood
shr ebx, 2
LastMatchGood:
; chainlen is decremented once beforehand so that the function can
; use the sign flag instead of the zero flag for the exit test.
; It is then shifted into the high word, to make room for the wmask
; value, which it will always accompany.
dec ebx
shl ebx, 16
or ebx, eax
mov [esp+chainlenwmask], ebx
; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
mov eax, [edx].ds_nice_match
mov ebx, [edx].ds_lookahead
cmp ebx, eax
jl SHORT LookaheadLess
mov ebx, eax
LookaheadLess:
mov [esp+nicematch], ebx
;/* register Bytef *scan = s->window + s->strstart; */
mov esi, [edx].ds_window
mov [esp+window], esi
mov ebp, [edx].ds_strstart
lea edi, [esi+ebp]
mov [esp+scan],edi
;/* Determine how many bytes the scan ptr is off from being */
;/* dword-aligned. */
mov eax, edi
neg eax
and eax, 3
mov [esp+scanalign], eax
;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
;/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
mov eax, [edx].ds_w_size
sub eax, MIN_LOOKAHEAD
sub ebp, eax
jg SHORT LimitPositive
xor ebp, ebp
LimitPositive:
;/* int best_len = s->prev_length; */
mov eax, [edx].ds_prev_length
mov [esp+bestlen], eax
;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
add esi, eax
mov [esp+windowbestlen], esi
;/* register ush scan_start = *(ushf*)scan; */
;/* register ush scan_end = *(ushf*)(scan+best_len-1); */
;/* Posf *prev = s->prev; */
movzx ebx, WORD PTR[edi]
mov [esp+scanstart], ebx
movzx ebx, WORD PTR[eax+edi-1]
mov [esp+scanend], ebx
mov edi, [edx].ds_prev
;/* Jump into the main loop. */
mov edx, [esp+chainlenwmask]
jmp SHORT LoopEntry
;/* do {
; * match = s->window + cur_match;
; * if (*(ushf*)(match+best_len-1) != scan_end ||
; * *(ushf*)match != scan_start) continue;
; * [...]
; * } while ((cur_match = prev[cur_match & wmask]) > limit
; * && --chain_length != 0);
; *
; * Here is the inner loop of the function. The function will spend the
; * majority of its time in this loop, and majority of that time will
; * be spent in the first ten instructions.
; *
; * Within this loop:
; * %ebx = scanend
; * %ecx = curmatch
; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
; * %esi = windowbestlen - i.e., (window + bestlen)
; * %edi = prev
; * %ebp = limit
; */
ALIGN 4
LookupLoop:
and ecx, edx
movzx ecx, WORD PTR[edi+ecx*2]
cmp ecx, ebp
jbe LeaveNow
sub edx, 000010000H
js LeaveNow
LoopEntry:
movzx eax, WORD PTR[esi+ecx-1]
cmp eax, ebx
jnz SHORT LookupLoop
mov eax, [esp+window]
movzx eax, WORD PTR[eax+ecx]
cmp eax, [esp+scanstart]
jnz SHORT LookupLoop
;/* Store the current value of chainlen. */
mov [esp+chainlenwmask], edx
;/* Point %edi to the string under scrutiny, and %esi to the string we */
;/* are hoping to match it up with. In actuality, %esi and %edi are */
;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
;/* initialized to -(MAX_MATCH_8 - scanalign). */
mov esi, [esp+window]
mov edi, [esp+scan]
add esi, ecx
mov eax, [esp+scanalign]
mov edx, -MAX_MATCH_8
lea edi, [edi+eax+MAX_MATCH_8]
lea esi, [esi+eax+MAX_MATCH_8]
;/* Test the strings for equality, 8 bytes at a time. At the end,
; * adjust %edx so that it is offset to the exact byte that mismatched.
; *
; * We already know at this point that the first three bytes of the
; * strings match each other, and they can be safely passed over before
; * starting the compare loop. So what this code does is skip over 0-3
; * bytes, as much as necessary in order to dword-align the %edi
; * pointer. (%esi will still be misaligned three times out of four.)
; *
; * It should be confessed that this loop usually does not represent
; * much of the total running time. Replacing it with a more
; * straightforward "rep cmpsb" would not drastically degrade
; * performance.
; */
LoopCmps:
mov eax, DWORD PTR[esi+edx]
xor eax, DWORD PTR[edi+edx]
jnz SHORT LeaveLoopCmps
mov eax, DWORD PTR[esi+edx+4]
xor eax, DWORD PTR[edi+edx+4]
jnz SHORT LeaveLoopCmps4
add edx, 8
jnz SHORT LoopCmps
jmp LenMaximum
ALIGN 4
LeaveLoopCmps4:
add edx, 4
LeaveLoopCmps:
test eax, 00000FFFFH
jnz SHORT LenLower
add edx, 2
shr eax, 16
LenLower:
sub al, 1
adc edx, 0
;/* Calculate the length of the match. If it is longer than MAX_MATCH, */
;/* then automatically accept it as the best possible match and leave. */
lea eax, [edi+edx]
mov edi, [esp+scan]
sub eax, edi
cmp eax, MAX_MATCH
jge SHORT LenMaximum
;/* If the length of the match is not longer than the best match we */
;/* have so far, then forget it and return to the lookup loop. */
mov edx, [esp+deflatestate]
mov ebx, [esp+bestlen]
cmp eax, ebx
jg SHORT LongerMatch
mov esi, [esp+windowbestlen]
mov edi, [edx].ds_prev
mov ebx, [esp+scanend]
mov edx, [esp+chainlenwmask]
jmp LookupLoop
ALIGN 4
;/* s->match_start = cur_match; */
;/* best_len = len; */
;/* if (len >= nice_match) break; */
;/* scan_end = *(ushf*)(scan+best_len-1); */
LongerMatch:
mov ebx, [esp+nicematch]
mov [esp+bestlen], eax
mov [edx].ds_match_start, ecx
cmp eax, ebx
jge SHORT LeaveNow
mov esi, [esp+window]
add esi, eax
mov [esp+windowbestlen], esi
movzx ebx, WORD PTR[edi+eax-1]
mov edi, [edx].ds_prev
mov [esp+scanend], ebx
mov edx, [esp+chainlenwmask]
jmp LookupLoop
ALIGN 4
;/* Accept the current string, with the maximum possible length. */
LenMaximum:
mov edx, [esp+deflatestate]
mov DWORD PTR[esp+bestlen], MAX_MATCH
mov [edx].ds_match_start, ecx
;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
;/* return s->lookahead; */
LeaveNow:
mov edx, [esp+deflatestate]
mov ebx, [esp+bestlen]
mov eax, [edx].ds_lookahead
cmp ebx, eax
jg SHORT LookaheadRet
mov eax, ebx
LookaheadRet:
; Restore the stack and return from whence we came.
add esp, varsize
pop ebx
pop esi
pop edi
pop ebp
ret
_longest_match ENDP
_TEXT ENDS
END

View File

@@ -1,209 +1,206 @@
/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86 /* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
* Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant. * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
* File written by Gilles Vollant, by modifiying the longest_match * File written by Gilles Vollant, by modifiying the longest_match
* from Jean-loup Gailly in deflate.c * from Jean-loup Gailly in deflate.c
* it prepare all parameters and call the assembly longest_match_gvasm * it prepare all parameters and call the assembly longest_match_gvasm
* longest_match execute standard C code is wmask != 0x7fff * longest_match execute standard C code is wmask != 0x7fff
* (assembly code is faster with a fixed wmask) * (assembly code is faster with a fixed wmask)
* *
*/ */
#include "deflate.h" #include "deflate.h"
#undef FAR #ifdef ASMV
//#include <windows.h> #define NIL 0
#ifdef ASMV #define UNALIGNED_OK
#define NIL 0
#define UNALIGNED_OK /* if your C compiler don't add underline before function name,
define ADD_UNDERLINE_ASMFUNC */
#ifdef ADD_UNDERLINE_ASMFUNC
/* if your C compiler don't add underline before function name, #define longest_match_7fff _longest_match_7fff
define ADD_UNDERLINE_ASMFUNC */ #define longest_match_686 _longest_match_686
#ifdef ADD_UNDERLINE_ASMFUNC #define cpudetect32 _cpudetect32
#define longest_match_7fff _longest_match_7fff #endif
#define longest_match_686 _longest_match_686
#define cpudetect32 _cpudetect32
#endif
void match_init()
{
}
void match_init()
{ unsigned long cpudetect32();
}
uInt longest_match_c(
unsigned long cpudetect32(); deflate_state *s,
IPos cur_match); /* current match */
uInt longest_match_c(
deflate_state *s,
IPos cur_match); /* current match */ uInt longest_match_7fff(
deflate_state *s,
IPos cur_match); /* current match */
uInt longest_match_7fff(
deflate_state *s, uInt longest_match_686(
IPos cur_match); /* current match */ deflate_state *s,
IPos cur_match); /* current match */
uInt longest_match_686(
deflate_state *s, uInt longest_match(
IPos cur_match); /* current match */ deflate_state *s,
IPos cur_match) /* current match */
uInt longest_match( {
deflate_state *s, static uInt iIsPPro=2;
IPos cur_match) /* current match */
{ if ((s->w_mask == 0x7fff) && (iIsPPro==0))
static uInt iIsPPro=2; return longest_match_7fff(s,cur_match);
if ((s->w_mask == 0x7fff) && (iIsPPro==0)) if (iIsPPro==1)
return longest_match_7fff(s,cur_match); return longest_match_686(s,cur_match);
if (iIsPPro==1) if (iIsPPro==2)
return longest_match_686(s,cur_match); iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
if (iIsPPro==2) return longest_match_c(s,cur_match);
iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0; }
return longest_match_c(s,cur_match);
}
uInt longest_match_c(s, cur_match)
deflate_state *s;
IPos cur_match; /* current match */
uInt longest_match_c(s, cur_match) {
deflate_state *s; unsigned chain_length = s->max_chain_length;/* max hash chain length */
IPos cur_match; /* current match */ register Bytef *scan = s->window + s->strstart; /* current string */
{ register Bytef *match; /* matched string */
unsigned chain_length = s->max_chain_length;/* max hash chain length */ register int len; /* length of current match */
register Bytef *scan = s->window + s->strstart; /* current string */ int best_len = s->prev_length; /* best match length so far */
register Bytef *match; /* matched string */ int nice_match = s->nice_match; /* stop if match long enough */
register int len; /* length of current match */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
int best_len = s->prev_length; /* best match length so far */ s->strstart - (IPos)MAX_DIST(s) : NIL;
int nice_match = s->nice_match; /* stop if match long enough */ /* Stop when cur_match becomes <= limit. To simplify the code,
IPos limit = s->strstart > (IPos)MAX_DIST(s) ? * we prevent matches with the string of window index 0.
s->strstart - (IPos)MAX_DIST(s) : NIL; */
/* Stop when cur_match becomes <= limit. To simplify the code, Posf *prev = s->prev;
* we prevent matches with the string of window index 0. uInt wmask = s->w_mask;
*/
Posf *prev = s->prev; #ifdef UNALIGNED_OK
uInt wmask = s->w_mask; /* Compare two bytes at a time. Note: this is not always beneficial.
* Try with and without -DUNALIGNED_OK to check.
#ifdef UNALIGNED_OK */
/* Compare two bytes at a time. Note: this is not always beneficial. register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
* Try with and without -DUNALIGNED_OK to check. register ush scan_start = *(ushf*)scan;
*/ register ush scan_end = *(ushf*)(scan+best_len-1);
register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; #else
register ush scan_start = *(ushf*)scan; register Bytef *strend = s->window + s->strstart + MAX_MATCH;
register ush scan_end = *(ushf*)(scan+best_len-1); register Byte scan_end1 = scan[best_len-1];
#else register Byte scan_end = scan[best_len];
register Bytef *strend = s->window + s->strstart + MAX_MATCH; #endif
register Byte scan_end1 = scan[best_len-1];
register Byte scan_end = scan[best_len]; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
#endif * It is easy to get rid of this optimization if necessary.
*/
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
* It is easy to get rid of this optimization if necessary.
*/ /* Do not waste too much time if we already have a good match: */
Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); if (s->prev_length >= s->good_match) {
chain_length >>= 2;
/* Do not waste too much time if we already have a good match: */ }
if (s->prev_length >= s->good_match) { /* Do not look for matches beyond the end of the input. This is necessary
chain_length >>= 2; * to make deflate deterministic.
} */
/* Do not look for matches beyond the end of the input. This is necessary if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
* to make deflate deterministic.
*/ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
do {
Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future");
match = s->window + cur_match;
do {
Assert(cur_match < s->strstart, "no future"); /* Skip to next match if the match length cannot increase
match = s->window + cur_match; * or if the match length is less than 2:
*/
/* Skip to next match if the match length cannot increase #if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
* or if the match length is less than 2: /* This code assumes sizeof(unsigned short) == 2. Do not use
*/ * UNALIGNED_OK if your compiler uses a different size.
#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) */
/* This code assumes sizeof(unsigned short) == 2. Do not use if (*(ushf*)(match+best_len-1) != scan_end ||
* UNALIGNED_OK if your compiler uses a different size. *(ushf*)match != scan_start) continue;
*/
if (*(ushf*)(match+best_len-1) != scan_end || /* It is not necessary to compare scan[2] and match[2] since they are
*(ushf*)match != scan_start) continue; * always equal when the other bytes match, given that the hash keys
* are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
/* It is not necessary to compare scan[2] and match[2] since they are * strstart+3, +5, ... up to strstart+257. We check for insufficient
* always equal when the other bytes match, given that the hash keys * lookahead only every 4th comparison; the 128th check will be made
* are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
* strstart+3, +5, ... up to strstart+257. We check for insufficient * necessary to put more guard bytes at the end of the window, or
* lookahead only every 4th comparison; the 128th check will be made * to check more often for insufficient lookahead.
* at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is */
* necessary to put more guard bytes at the end of the window, or Assert(scan[2] == match[2], "scan[2]?");
* to check more often for insufficient lookahead. scan++, match++;
*/ do {
Assert(scan[2] == match[2], "scan[2]?"); } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
scan++, match++; *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
do { *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
} while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
*(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend);
*(ushf*)(scan+=2) == *(ushf*)(match+=2) && /* The funny "do {}" generates better code on most compilers */
*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
scan < strend); /* Here, scan <= window+strstart+257 */
/* The funny "do {}" generates better code on most compilers */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
if (*scan == *match) scan++;
/* Here, scan <= window+strstart+257 */
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = (MAX_MATCH - 1) - (int)(strend-scan);
if (*scan == *match) scan++; scan = strend - (MAX_MATCH-1);
len = (MAX_MATCH - 1) - (int)(strend-scan); #else /* UNALIGNED_OK */
scan = strend - (MAX_MATCH-1);
if (match[best_len] != scan_end ||
#else /* UNALIGNED_OK */ match[best_len-1] != scan_end1 ||
*match != *scan ||
if (match[best_len] != scan_end || *++match != scan[1]) continue;
match[best_len-1] != scan_end1 ||
*match != *scan || /* The check at best_len-1 can be removed because it will be made
*++match != scan[1]) continue; * again later. (This heuristic is not always a win.)
* It is not necessary to compare scan[2] and match[2] since they
/* The check at best_len-1 can be removed because it will be made * are always equal when the other bytes match, given that
* again later. (This heuristic is not always a win.) * the hash keys are equal and that HASH_BITS >= 8.
* It is not necessary to compare scan[2] and match[2] since they */
* are always equal when the other bytes match, given that scan += 2, match++;
* the hash keys are equal and that HASH_BITS >= 8. Assert(*scan == *match, "match[2]?");
*/
scan += 2, match++; /* We check for insufficient lookahead only every 8th comparison;
Assert(*scan == *match, "match[2]?"); * the 256th check will be made at strstart+258.
*/
/* We check for insufficient lookahead only every 8th comparison; do {
* the 256th check will be made at strstart+258. } while (*++scan == *++match && *++scan == *++match &&
*/ *++scan == *++match && *++scan == *++match &&
do { *++scan == *++match && *++scan == *++match &&
} while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match &&
*++scan == *++match && *++scan == *++match && scan < strend);
*++scan == *++match && *++scan == *++match &&
*++scan == *++match && *++scan == *++match && Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
scan < strend);
len = MAX_MATCH - (int)(strend - scan);
Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); scan = strend - MAX_MATCH;
len = MAX_MATCH - (int)(strend - scan); #endif /* UNALIGNED_OK */
scan = strend - MAX_MATCH;
if (len > best_len) {
#endif /* UNALIGNED_OK */ s->match_start = cur_match;
best_len = len;
if (len > best_len) { if (len >= nice_match) break;
s->match_start = cur_match; #ifdef UNALIGNED_OK
best_len = len; scan_end = *(ushf*)(scan+best_len-1);
if (len >= nice_match) break; #else
#ifdef UNALIGNED_OK scan_end1 = scan[best_len-1];
scan_end = *(ushf*)(scan+best_len-1); scan_end = scan[best_len];
#else #endif
scan_end1 = scan[best_len-1]; }
scan_end = scan[best_len]; } while ((cur_match = prev[cur_match & wmask]) > limit
#endif && --chain_length != 0);
}
} while ((cur_match = prev[cur_match & wmask]) > limit if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
&& --chain_length != 0); return s->lookahead;
}
if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
return s->lookahead; #endif /* ASMV */
}
#endif /* ASMV */

1033
contrib/masmx86/inffas32.asm Normal file

File diff suppressed because it is too large Load Diff

3
contrib/masmx86/mkasm.bat Executable file
View File

@@ -0,0 +1,3 @@
cl /I..\.. /O2 /c gvmat32c.c
ml /coff /Zi /c /Flgvmat32.lst gvmat32.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm

View File

@@ -0,0 +1,21 @@
Summary
-------
This directory contains ASM implementations of the functions
longest_match() and inflate_fast().
Use instructions
----------------
Copy these files into the zlib source directory, then run the
appropriate makefile, as suggested below.
Build instructions
------------------
* With Microsoft C and MASM:
nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj"
* With Borland C and TASM:
make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="gvmat32c.obj gvmat32.obj inffas32.obj" OBJPA="+gvmat32c.obj+gvmat32.obj+inffas32.obj"

View File

@@ -1,51 +1,55 @@
Change in 0.22: (19 May 03) Change in 1.00: (10 sept 03)
- crypting support (unless you define NOCRYPT) - rename to 1.00
- append file in existing zipfile - cosmetic code change
Change in 0.21: (10 Mar 03) Change in 0.22: (19 May 03)
- bug fixes - crypting support (unless you define NOCRYPT)
- append file in existing zipfile
Change in 0.17: (27 Jan 02)
- bug fixes Change in 0.21: (10 Mar 03)
- bug fixes
Change in 0.16: (19 Jan 02)
- Support of ioapi for virtualize zip file access Change in 0.17: (27 Jan 02)
- bug fixes
Change in 0.15: (19 Mar 98)
- fix memory leak in minizip.c Change in 0.16: (19 Jan 02)
- Support of ioapi for virtualize zip file access
Change in 0.14: (10 Mar 98)
- fix bugs in minizip.c sample for zipping big file Change in 0.15: (19 Mar 98)
- fix problem in month in date handling - fix memory leak in minizip.c
- fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
comment handling Change in 0.14: (10 Mar 98)
- fix bugs in minizip.c sample for zipping big file
Change in 0.13: (6 Mar 98) - fix problem in month in date handling
- fix bugs in zip.c - fix bug in unzlocal_GetCurrentFileInfoInternal in unzip.c for
- add real minizip sample comment handling
Change in 0.12: (4 Mar 98) Change in 0.13: (6 Mar 98)
- add zip.c and zip.h for creates .zip file - fix bugs in zip.c
- fix change_file_date in miniunz.c for Unix (Jean-loup Gailly) - add real minizip sample
- fix miniunz.c for file without specific record for directory
Change in 0.12: (4 Mar 98)
Change in 0.11: (3 Mar 98) - add zip.c and zip.h for creates .zip file
- fix bug in unzGetCurrentFileInfo for get extra field and comment - fix change_file_date in miniunz.c for Unix (Jean-loup Gailly)
- enhance miniunz sample, remove the bad unztst.c sample - fix miniunz.c for file without specific record for directory
Change in 0.10: (2 Mar 98) Change in 0.11: (3 Mar 98)
- fix bug in unzReadCurrentFile - fix bug in unzGetCurrentFileInfo for get extra field and comment
- rename unzip* to unz* function and structure - enhance miniunz sample, remove the bad unztst.c sample
- remove Windows-like hungary notation variable name
- modify some structure in unzip.h Change in 0.10: (2 Mar 98)
- add somes comment in source - fix bug in unzReadCurrentFile
- remove unzipGetcCurrentFile function - rename unzip* to unz* function and structure
- replace ZUNZEXPORT by ZEXPORT - remove Windows-like hungary notation variable name
- add unzGetLocalExtrafield for get the local extrafield info - modify some structure in unzip.h
- add a new sample, miniunz.c - add somes comment in source
- remove unzipGetcCurrentFile function
Change in 0.4: (25 Feb 98) - replace ZUNZEXPORT by ZEXPORT
- suppress the type unzipFileInZip. - add unzGetLocalExtrafield for get the local extrafield info
Only on file in the zipfile can be open at the same time - add a new sample, miniunz.c
- fix somes typo in code
- added tm_unz structure in unzip_file_info (date/time in readable format) Change in 0.4: (25 Feb 98)
- suppress the type unzipFileInZip.
Only on file in the zipfile can be open at the same time
- fix somes typo in code
- added tm_unz structure in unzip_file_info (date/time in readable format)

View File

@@ -1,25 +1,25 @@
CC=cc CC=cc
CFLAGS=-O -I../.. CFLAGS=-O -I../..
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
.c.o: .c.o:
$(CC) -c $(CFLAGS) $*.c $(CC) -c $(CFLAGS) $*.c
all: miniunz minizip all: miniunz minizip
miniunz: $(UNZ_OBJS) miniunz: $(UNZ_OBJS)
$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
minizip: $(ZIP_OBJS) minizip: $(ZIP_OBJS)
$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
test: miniunz minizip test: miniunz minizip
./minizip test readme.txt ./minizip test readme.txt
./miniunz -l test.zip ./miniunz -l test.zip
mv readme.txt readme.old mv readme.txt readme.old
./miniunz test.zip ./miniunz test.zip
clean: clean:
/bin/rm -f *.o *~ minizip miniunz /bin/rm -f *.o *~ minizip miniunz

View File

@@ -1,104 +1,132 @@
/* crypt.h -- base code for crypt/uncrypt ZIPfile
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
/*********************************************************************** Version 1.00, September 10th, 2003
* Return the next byte in the pseudo-random sequence
*/ Copyright (C) 1998-2003 Gilles Vollant
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
{ This code is a modified version of crypting code in Infozip distribution
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
* unpredictable manner on 16-bit systems; not a problem The encryption/decryption parts of this source code (as opposed to the
* with any known compiler so far, though */ non-echoing password parts) were originally written in Europe. The
whole source package can be freely distributed, including from the USA.
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; (Prior to January 2000, re-export from the US was a violation of US law.)
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
} This encryption code is a direct transcription of the algorithm from
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
/*********************************************************************** file (appnote.txt) is distributed with the PKZIP program (even in the
* Update the encryption keys with the next byte of plain text version without encryption capabilities).
*/
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) If you don't need crypting in your application, just define symbols
{ NOCRYPT and NOUNCRYPT.
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
(*(pkeys+1)) += (*(pkeys+0)) & 0xff; This code support the "Traditional PKWARE Encryption".
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
{ The new AES encryption added on Zip format by Winzip (see the page
register int keyshift = (int)((*(pkeys+1)) >> 24); http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); Encryption is not supported.
} */
return c;
} #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
/***********************************************************************
/*********************************************************************** * Return the next byte in the pseudo-random sequence
* Initialize the encryption keys and the random header according to */
* the given password. static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
*/ {
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
{ * unpredictable manner on 16-bit systems; not a problem
*(pkeys+0) = 305419896L; * with any known compiler so far, though */
*(pkeys+1) = 591751049L;
*(pkeys+2) = 878082192L; temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
while (*passwd != '\0') { return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
update_keys(pkeys,pcrc_32_tab,(int)*passwd); }
passwd++;
} /***********************************************************************
} * Update the encryption keys with the next byte of plain text
*/
#define zdecode(pkeys,pcrc_32_tab,c) \ static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) {
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
#define zencode(pkeys,pcrc_32_tab,c,t) \ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
{
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED register int keyshift = (int)((*(pkeys+1)) >> 24);
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
#define RAND_HEAD_LEN 12 }
/* "last resort" source for second part of crypt seed pattern */ return c;
# ifndef ZCR_SEED2 }
# define ZCR_SEED2 (unsigned long)3141592654L /* use PI as default pattern */
# endif
/***********************************************************************
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) * Initialize the encryption keys and the random header according to
const char *passwd; /* password string */ * the given password.
unsigned char *buf; /* where to write header */ */
int bufSize; static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
unsigned long* pkeys; {
const unsigned long* pcrc_32_tab; *(pkeys+0) = 305419896L;
unsigned long crcForCrypting; *(pkeys+1) = 591751049L;
{ *(pkeys+2) = 878082192L;
int n; /* index in random header */ while (*passwd != '\0') {
int t; /* temporary */ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
int c; /* random byte */ passwd++;
unsigned char header[RAND_HEAD_LEN-2]; /* random header */ }
static unsigned calls = 0; /* ensure different random header each time */ }
if (bufSize<RAND_HEAD_LEN) #define zdecode(pkeys,pcrc_32_tab,c) \
return 0; (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the #define zencode(pkeys,pcrc_32_tab,c,t) \
* output of rand() to get less predictability, since rand() is (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
* often poorly implemented.
*/ #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
if (++calls == 1)
{ #define RAND_HEAD_LEN 12
srand((unsigned)(time(NULL) ^ ZCR_SEED2)); /* "last resort" source for second part of crypt seed pattern */
} # ifndef ZCR_SEED2
init_keys(passwd, pkeys, pcrc_32_tab); # define ZCR_SEED2 3141592654UL /* use PI as default pattern */
for (n = 0; n < RAND_HEAD_LEN-2; n++) # endif
{
c = (rand() >> 7) & 0xff; static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); const char *passwd; /* password string */
} unsigned char *buf; /* where to write header */
/* Encrypt random header (last two bytes is high word of crc) */ int bufSize;
init_keys(passwd, pkeys, pcrc_32_tab); unsigned long* pkeys;
for (n = 0; n < RAND_HEAD_LEN-2; n++) const unsigned long* pcrc_32_tab;
{ unsigned long crcForCrypting;
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); {
} int n; /* index in random header */
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); int t; /* temporary */
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); int c; /* random byte */
return n; unsigned char header[RAND_HEAD_LEN-2]; /* random header */
} static unsigned calls = 0; /* ensure different random header each time */
#endif if (bufSize<RAND_HEAD_LEN)
return 0;
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
* output of rand() to get less predictability, since rand() is
* often poorly implemented.
*/
if (++calls == 1)
{
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
}
init_keys(passwd, pkeys, pcrc_32_tab);
for (n = 0; n < RAND_HEAD_LEN-2; n++)
{
c = (rand() >> 7) & 0xff;
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
}
/* Encrypt random header (last two bytes is high word of crc) */
init_keys(passwd, pkeys, pcrc_32_tab);
for (n = 0; n < RAND_HEAD_LEN-2; n++)
{
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
}
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
return n;
}
#endif

View File

@@ -1,177 +1,177 @@
/* ioapi.c -- IO base function header for compress/uncompress .zip /* ioapi.c -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "zlib.h" #include "zlib.h"
#include "ioapi.h" #include "ioapi.h"
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
#ifndef SEEK_CUR #ifndef SEEK_CUR
#define SEEK_CUR 1 #define SEEK_CUR 1
#endif #endif
#ifndef SEEK_END #ifndef SEEK_END
#define SEEK_END 2 #define SEEK_END 2
#endif #endif
#ifndef SEEK_SET #ifndef SEEK_SET
#define SEEK_SET 0 #define SEEK_SET 0
#endif #endif
voidpf ZCALLBACK fopen_file_func OF(( voidpf ZCALLBACK fopen_file_func OF((
voidpf opaque, voidpf opaque,
const char* filename, const char* filename,
int mode)); int mode));
uLong ZCALLBACK fread_file_func OF(( uLong ZCALLBACK fread_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
void* buf, void* buf,
uLong size)); uLong size));
uLong ZCALLBACK fwrite_file_func OF(( uLong ZCALLBACK fwrite_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
const void* buf, const void* buf,
uLong size)); uLong size));
long ZCALLBACK ftell_file_func OF(( long ZCALLBACK ftell_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
long ZCALLBACK fseek_file_func OF(( long ZCALLBACK fseek_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream, voidpf stream,
uLong offset, uLong offset,
int origin)); int origin));
int ZCALLBACK fclose_file_func OF(( int ZCALLBACK fclose_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
int ZCALLBACK ferror_file_func OF(( int ZCALLBACK ferror_file_func OF((
voidpf opaque, voidpf opaque,
voidpf stream)); voidpf stream));
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
voidpf opaque; voidpf opaque;
const char* filename; const char* filename;
int mode; int mode;
{ {
FILE* file = NULL; FILE* file = NULL;
const char* mode_fopen = NULL; const char* mode_fopen = NULL;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
mode_fopen = "rb"; mode_fopen = "rb";
else else
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
mode_fopen = "r+b"; mode_fopen = "r+b";
else else
if (mode & ZLIB_FILEFUNC_MODE_CREATE) if (mode & ZLIB_FILEFUNC_MODE_CREATE)
mode_fopen = "wb"; mode_fopen = "wb";
if ((filename!=NULL) && (mode_fopen != NULL)) if ((filename!=NULL) && (mode_fopen != NULL))
file = fopen(filename, mode_fopen); file = fopen(filename, mode_fopen);
return file; return file;
} }
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
void* buf; void* buf;
uLong size; uLong size;
{ {
uLong ret; uLong ret;
ret = fread(buf, 1, (size_t)size, (FILE *)stream); ret = fread(buf, 1, (size_t)size, (FILE *)stream);
return ret; return ret;
} }
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
const void* buf; const void* buf;
uLong size; uLong size;
{ {
uLong ret; uLong ret;
ret = fwrite(buf, 1, (size_t)size, (FILE *)stream); ret = fwrite(buf, 1, (size_t)size, (FILE *)stream);
return ret; return ret;
} }
long ZCALLBACK ftell_file_func (opaque, stream) long ZCALLBACK ftell_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
long ret; long ret;
ret = ftell((FILE *)stream); ret = ftell((FILE *)stream);
return ret; return ret;
} }
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
uLong offset; uLong offset;
int origin; int origin;
{ {
int fseek_origin=0; int fseek_origin=0;
long ret; long ret;
switch (origin) switch (origin)
{ {
case ZLIB_FILEFUNC_SEEK_CUR : case ZLIB_FILEFUNC_SEEK_CUR :
fseek_origin = SEEK_CUR; fseek_origin = SEEK_CUR;
break; break;
case ZLIB_FILEFUNC_SEEK_END : case ZLIB_FILEFUNC_SEEK_END :
fseek_origin = SEEK_END; fseek_origin = SEEK_END;
break; break;
case ZLIB_FILEFUNC_SEEK_SET : case ZLIB_FILEFUNC_SEEK_SET :
fseek_origin = SEEK_SET; fseek_origin = SEEK_SET;
break; break;
default: return -1; default: return -1;
} }
ret = 0; ret = 0;
fseek((FILE *)stream, offset, fseek_origin); fseek((FILE *)stream, offset, fseek_origin);
return ret; return ret;
} }
int ZCALLBACK fclose_file_func (opaque, stream) int ZCALLBACK fclose_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret; int ret;
ret = fclose((FILE *)stream); ret = fclose((FILE *)stream);
return ret; return ret;
} }
int ZCALLBACK ferror_file_func (opaque, stream) int ZCALLBACK ferror_file_func (opaque, stream)
voidpf opaque; voidpf opaque;
voidpf stream; voidpf stream;
{ {
int ret; int ret;
ret = ferror((FILE *)stream); ret = ferror((FILE *)stream);
return ret; return ret;
} }
void fill_fopen_filefunc (pzlib_filefunc_def) void fill_fopen_filefunc (pzlib_filefunc_def)
zlib_filefunc_def* pzlib_filefunc_def; zlib_filefunc_def* pzlib_filefunc_def;
{ {
pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zopen_file = fopen_file_func;
pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zread_file = fread_file_func;
pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func;
pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func;
pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func;
pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func;
pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func;
pzlib_filefunc_def->opaque = NULL; pzlib_filefunc_def->opaque = NULL;
} }

View File

@@ -1,75 +1,75 @@
/* ioapi.h -- IO base function header for compress/uncompress .zip /* ioapi.h -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
*/ */
#ifndef _ZLIBIOAPI_H #ifndef _ZLIBIOAPI_H
#define _ZLIBIOAPI_H #define _ZLIBIOAPI_H
#define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_SEEK_SET (0)
#define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_READ (1)
#define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_WRITE (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
#define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_EXISTING (4)
#define ZLIB_FILEFUNC_MODE_CREATE (8) #define ZLIB_FILEFUNC_MODE_CREATE (8)
#ifndef ZCALLBACK #ifndef ZCALLBACK
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
#define ZCALLBACK CALLBACK #define ZCALLBACK CALLBACK
#else #else
#define ZCALLBACK #define ZCALLBACK
#endif #endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
typedef struct zlib_filefunc_def_s typedef struct zlib_filefunc_def_s
{ {
open_file_func zopen_file; open_file_func zopen_file;
read_file_func zread_file; read_file_func zread_file;
write_file_func zwrite_file; write_file_func zwrite_file;
tell_file_func ztell_file; tell_file_func ztell_file;
seek_file_func zseek_file; seek_file_func zseek_file;
close_file_func zclose_file; close_file_func zclose_file;
testerror_file_func zerror_file; testerror_file_func zerror_file;
voidpf opaque; voidpf opaque;
} zlib_filefunc_def; } zlib_filefunc_def;
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) #define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) #define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) #define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,271 +1,270 @@
/* iowin32.c -- IO base function header for compress/uncompress .zip /* iowin32.c -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
This IO API version uses the Win32 API (for Microsoft Windows) This IO API version uses the Win32 API (for Microsoft Windows)
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
*/ */
#include <windows.h> #include <stdlib.h>
#include <stdlib.h>
#include "zlib.h"
#include "zlib.h" #include "ioapi.h"
#include "ioapi.h" #include "iowin32.h"
#include "iowin32.h"
#ifndef INVALID_HANDLE_VALUE
#ifndef INVALID_HANDLE_VALUE #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
#define INVALID_HANDLE_VALUE (0xFFFFFFFF) #endif
#endif
#ifndef INVALID_SET_FILE_POINTER
#ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER ((DWORD)-1)
#define INVALID_SET_FILE_POINTER ((DWORD)-1) #endif
#endif
voidpf ZCALLBACK win32_open_file_func OF((
voidpf ZCALLBACK win32_open_file_func OF(( voidpf opaque,
voidpf opaque, const char* filename,
const char* filename, int mode));
int mode));
uLong ZCALLBACK win32_read_file_func OF((
uLong ZCALLBACK win32_read_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream,
voidpf stream, void* buf,
void* buf, uLong size));
uLong size));
uLong ZCALLBACK win32_write_file_func OF((
uLong ZCALLBACK win32_write_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream,
voidpf stream, const void* buf,
const void* buf, uLong size));
uLong size));
long ZCALLBACK win32_tell_file_func OF((
long ZCALLBACK win32_tell_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream));
voidpf stream));
long ZCALLBACK win32_seek_file_func OF((
long ZCALLBACK win32_seek_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream,
voidpf stream, uLong offset,
uLong offset, int origin));
int origin));
int ZCALLBACK win32_close_file_func OF((
long ZCALLBACK win32_close_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream));
voidpf stream));
int ZCALLBACK win32_error_file_func OF((
int ZCALLBACK win32_error_file_func OF(( voidpf opaque,
voidpf opaque, voidpf stream));
voidpf stream));
typedef struct
typedef struct {
{ HANDLE hf;
HANDLE hf; int error;
int error; } WIN32FILE_IOWIN;
} WIN32FILE_IOWIN;
voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode) voidpf opaque;
voidpf opaque; const char* filename;
const char* filename; int mode;
int mode; {
{ const char* mode_fopen = NULL;
const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = 0;
HANDLE hFile = 0; voidpf ret=NULL;
voidpf ret=NULL;
dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) {
{ dwDesiredAccess = GENERIC_READ;
dwDesiredAccess = GENERIC_READ; dwCreationDisposition = OPEN_EXISTING;
dwCreationDisposition = OPEN_EXISTING; dwShareMode = FILE_SHARE_READ;
dwShareMode = FILE_SHARE_READ; }
} else
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
if (mode & ZLIB_FILEFUNC_MODE_EXISTING) {
{ dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; dwCreationDisposition = OPEN_EXISTING;
dwCreationDisposition = OPEN_EXISTING; }
} else
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
if (mode & ZLIB_FILEFUNC_MODE_CREATE) {
{ dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
dwDesiredAccess = GENERIC_WRITE | GENERIC_READ; dwCreationDisposition = CREATE_ALWAYS;
dwCreationDisposition = CREATE_ALWAYS; }
}
if ((filename!=NULL) && (dwDesiredAccess != 0))
if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
dwCreationDisposition, dwFlagsAndAttributes, NULL);
if (hFile == INVALID_HANDLE_VALUE)
if (hFile == INVALID_HANDLE_VALUE) hFile = NULL;
hFile = NULL;
if (hFile != NULL)
if (hFile != NULL) {
{ WIN32FILE_IOWIN w32fiow;
WIN32FILE_IOWIN w32fiow; w32fiow.hf = hFile;
w32fiow.hf = hFile; w32fiow.error = 0;
w32fiow.error = 0; ret = malloc(sizeof(WIN32FILE_IOWIN));
ret = malloc(sizeof(WIN32FILE_IOWIN)); if (ret==NULL)
if (ret==NULL) CloseHandle(hFile);
CloseHandle(hFile); else *((WIN32FILE_IOWIN*)ret) = w32fiow;
else *((WIN32FILE_IOWIN*)ret) = w32fiow; }
} return ret;
return ret; }
}
uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; void* buf;
void* buf; uLong size;
uLong size; {
{ uLong ret=0;
uLong ret=0; HANDLE hFile = NULL;
HANDLE hFile = NULL; if (stream!=NULL)
if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL)
if (hFile != NULL) if (!ReadFile(hFile, buf, size, &ret, NULL))
if (!ReadFile(hFile, buf, size, &ret, NULL)) {
{ DWORD dwErr = GetLastError();
DWORD dwErr = GetLastError(); if (dwErr == ERROR_HANDLE_EOF)
if (dwErr == ERROR_HANDLE_EOF) dwErr = 0;
dwErr = 0; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; }
}
return ret;
return ret; }
}
uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; const void* buf;
const void* buf; uLong size;
uLong size; {
{ uLong ret=0;
uLong ret=0; HANDLE hFile = NULL;
HANDLE hFile = NULL; if (stream!=NULL)
if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
if (hFile !=NULL)
if (hFile !=NULL) if (!WriteFile(hFile, buf, size, &ret, NULL))
if (!WriteFile(hFile, buf, size, &ret, NULL)) {
{ DWORD dwErr = GetLastError();
DWORD dwErr = GetLastError(); if (dwErr == ERROR_HANDLE_EOF)
if (dwErr == ERROR_HANDLE_EOF) dwErr = 0;
dwErr = 0; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; }
}
return ret;
return ret; }
}
long ZCALLBACK win32_tell_file_func (opaque, stream)
long ZCALLBACK win32_tell_file_func (opaque, stream) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; {
{ long ret=-1;
long ret=-1; HANDLE hFile = NULL;
HANDLE hFile = NULL; if (stream!=NULL)
if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL)
if (hFile != NULL) {
{ DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); if (dwSet == INVALID_SET_FILE_POINTER)
if (dwSet == INVALID_SET_FILE_POINTER) {
{ DWORD dwErr = GetLastError();
DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = -1;
ret = -1; }
} else
else ret=(long)dwSet;
ret=(long)dwSet; }
} return ret;
return ret; }
}
long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; uLong offset;
uLong offset; int origin;
int origin; {
{ DWORD dwMoveMethod=0xFFFFFFFF;
DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL;
HANDLE hFile = NULL;
long ret=-1;
long ret=-1; if (stream!=NULL)
if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; switch (origin)
switch (origin) {
{ case ZLIB_FILEFUNC_SEEK_CUR :
case ZLIB_FILEFUNC_SEEK_CUR : dwMoveMethod = FILE_CURRENT;
dwMoveMethod = FILE_CURRENT; break;
break; case ZLIB_FILEFUNC_SEEK_END :
case ZLIB_FILEFUNC_SEEK_END : dwMoveMethod = FILE_END;
dwMoveMethod = FILE_END; break;
break; case ZLIB_FILEFUNC_SEEK_SET :
case ZLIB_FILEFUNC_SEEK_SET : dwMoveMethod = FILE_BEGIN;
dwMoveMethod = FILE_BEGIN; break;
break; default: return -1;
default: return -1; }
}
if (hFile != NULL)
if (hFile != NULL) {
{ DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); if (dwSet == INVALID_SET_FILE_POINTER)
if (dwSet == INVALID_SET_FILE_POINTER) {
{ DWORD dwErr = GetLastError();
DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = -1;
ret = -1; }
} else
else ret=0;
ret=0; }
} return ret;
return ret; }
}
int ZCALLBACK win32_close_file_func (opaque, stream)
long ZCALLBACK win32_close_file_func (opaque, stream) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; {
{ int ret=-1;
long ret=-1;
if (stream!=NULL)
if (stream!=NULL) {
{ HANDLE hFile;
HANDLE hFile; hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL)
if (hFile != NULL) {
{ CloseHandle(hFile);
CloseHandle(hFile); ret=0;
ret=0; }
} free(stream);
free(stream); }
} return ret;
return ret; }
}
int ZCALLBACK win32_error_file_func (opaque, stream)
int ZCALLBACK win32_error_file_func (opaque, stream) voidpf opaque;
voidpf opaque; voidpf stream;
voidpf stream; {
{ int ret=-1;
int ret=-1; if (stream!=NULL)
if (stream!=NULL) {
{ ret = ((WIN32FILE_IOWIN*)stream) -> error;
ret = ((WIN32FILE_IOWIN*)stream) -> error; }
} return ret;
return ret; }
}
void fill_win32_filefunc (pzlib_filefunc_def)
void fill_win32_filefunc (pzlib_filefunc_def) zlib_filefunc_def* pzlib_filefunc_def;
zlib_filefunc_def* pzlib_filefunc_def; {
{ pzlib_filefunc_def->zopen_file = win32_open_file_func;
pzlib_filefunc_def->zopen_file = win32_open_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func;
pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func;
pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->ztell_file = win32_tell_file_func;
pzlib_filefunc_def->ztell_file = win32_tell_file_func; pzlib_filefunc_def->zseek_file = win32_seek_file_func;
pzlib_filefunc_def->zseek_file = win32_seek_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func;
pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func;
pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->opaque=NULL;
pzlib_filefunc_def->opaque=NULL; }
}

View File

@@ -1,19 +1,21 @@
/* iowin32.h -- IO base function header for compress/uncompress .zip /* iowin32.h -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API files using zlib + zip or unzip API
This IO API version uses the Win32 API (for Microsoft Windows) This IO API version uses the Win32 API (for Microsoft Windows)
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
*/ */
#ifdef __cplusplus #include <windows.h>
extern "C" {
#endif
#ifdef __cplusplus
void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); extern "C" {
#endif
#ifdef __cplusplus void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
}
#endif #ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,397 +1,397 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#ifdef unix #ifdef unix
# include <unistd.h> # include <unistd.h>
# include <utime.h> # include <utime.h>
# include <sys/types.h> # include <sys/types.h>
# include <sys/stat.h> # include <sys/stat.h>
#else #else
# include <direct.h> # include <direct.h>
# include <io.h> # include <io.h>
#endif #endif
#include "zip.h" #include "zip.h"
#ifdef WIN32 #ifdef WIN32
#define USEWIN32IOAPI #define USEWIN32IOAPI
#include "iowin32.h" #include "iowin32.h"
#endif #endif
#define WRITEBUFFERSIZE (16384) #define WRITEBUFFERSIZE (16384)
#define MAXFILENAME (256) #define MAXFILENAME (256)
#ifdef WIN32 #ifdef WIN32
uLong filetime(f, tmzip, dt) uLong filetime(f, tmzip, dt)
char *f; /* name of file to get info on */ char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */ tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */ uLong *dt; /* dostime */
{ {
int ret = 0; int ret = 0;
{ {
FILETIME ftLocal; FILETIME ftLocal;
HANDLE hFind; HANDLE hFind;
WIN32_FIND_DATA ff32; WIN32_FIND_DATA ff32;
hFind = FindFirstFile(f,&ff32); hFind = FindFirstFile(f,&ff32);
if (hFind != INVALID_HANDLE_VALUE) if (hFind != INVALID_HANDLE_VALUE)
{ {
FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
FindClose(hFind); FindClose(hFind);
ret = 1; ret = 1;
} }
} }
return ret; return ret;
} }
#else #else
#ifdef unix #ifdef unix
uLong filetime(f, tmzip, dt) uLong filetime(f, tmzip, dt)
char *f; /* name of file to get info on */ char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */ tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */ uLong *dt; /* dostime */
{ {
int ret=0; int ret=0;
struct stat s; /* results of stat() */ struct stat s; /* results of stat() */
struct tm* filedate; struct tm* filedate;
time_t tm_t=0; time_t tm_t=0;
if (strcmp(f,"-")!=0) if (strcmp(f,"-")!=0)
{ {
char name[MAXFILENAME+1]; char name[MAXFILENAME+1];
int len = strlen(f); int len = strlen(f);
strncpy(name, f,MAXFILENAME-1); strncpy(name, f,MAXFILENAME-1);
/* strncpy doesnt append the trailing NULL, of the string is too long. */ /* strncpy doesnt append the trailing NULL, of the string is too long. */
name[ MAXFILENAME ] = '\0'; name[ MAXFILENAME ] = '\0';
if (name[len - 1] == '/') if (name[len - 1] == '/')
name[len - 1] = '\0'; name[len - 1] = '\0';
/* not all systems allow stat'ing a file with / appended */ /* not all systems allow stat'ing a file with / appended */
if (stat(name,&s)==0) if (stat(name,&s)==0)
{ {
tm_t = s.st_mtime; tm_t = s.st_mtime;
ret = 1; ret = 1;
} }
} }
filedate = localtime(&tm_t); filedate = localtime(&tm_t);
tmzip->tm_sec = filedate->tm_sec; tmzip->tm_sec = filedate->tm_sec;
tmzip->tm_min = filedate->tm_min; tmzip->tm_min = filedate->tm_min;
tmzip->tm_hour = filedate->tm_hour; tmzip->tm_hour = filedate->tm_hour;
tmzip->tm_mday = filedate->tm_mday; tmzip->tm_mday = filedate->tm_mday;
tmzip->tm_mon = filedate->tm_mon ; tmzip->tm_mon = filedate->tm_mon ;
tmzip->tm_year = filedate->tm_year; tmzip->tm_year = filedate->tm_year;
return ret; return ret;
} }
#else #else
uLong filetime(f, tmzip, dt) uLong filetime(f, tmzip, dt)
char *f; /* name of file to get info on */ char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */ tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */ uLong *dt; /* dostime */
{ {
return 0; return 0;
} }
#endif #endif
#endif #endif
int check_exist_file(filename) int check_exist_file(filename)
const char* filename; const char* filename;
{ {
FILE* ftestexist; FILE* ftestexist;
int ret = 1; int ret = 1;
ftestexist = fopen(filename,"rb"); ftestexist = fopen(filename,"rb");
if (ftestexist==NULL) if (ftestexist==NULL)
ret = 0; ret = 0;
else else
fclose(ftestexist); fclose(ftestexist);
return ret; return ret;
} }
void do_banner() void do_banner()
{ {
printf("MiniZip 0.22, demo of zLib + Zip package written by Gilles Vollant\n"); printf("MiniZip 1.00, demo of zLib + Zip package written by Gilles Vollant\n");
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
} }
void do_help() void do_help()
{ {
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \ printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] file.zip [files_to_add]\n\n" \
" -o Overwrite existing file.zip\n" \ " -o Overwrite existing file.zip\n" \
" -a Append to existing file.zip\n" \ " -a Append to existing file.zip\n" \
" -0 Store only\n" \ " -0 Store only\n" \
" -1 Compress faster\n" \ " -1 Compress faster\n" \
" -9 Compress better\n\n"); " -9 Compress better\n\n");
} }
/* calculate the CRC32 of a file, /* calculate the CRC32 of a file,
because to encrypt a file, we need known the CRC32 of the file before */ because to encrypt a file, we need known the CRC32 of the file before */
int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)
{ {
unsigned long calculate_crc=0; unsigned long calculate_crc=0;
int err=ZIP_OK; int err=ZIP_OK;
FILE * fin = fopen(filenameinzip,"rb"); FILE * fin = fopen(filenameinzip,"rb");
unsigned long size_read = 0; unsigned long size_read = 0;
unsigned long total_read = 0; unsigned long total_read = 0;
if (fin==NULL) if (fin==NULL)
{ {
err = ZIP_ERRNO; err = ZIP_ERRNO;
} }
if (err == ZIP_OK) if (err == ZIP_OK)
do do
{ {
err = ZIP_OK; err = ZIP_OK;
size_read = (int)fread(buf,1,size_buf,fin); size_read = (int)fread(buf,1,size_buf,fin);
if (size_read < size_buf) if (size_read < size_buf)
if (feof(fin)==0) if (feof(fin)==0)
{ {
printf("error in reading %s\n",filenameinzip); printf("error in reading %s\n",filenameinzip);
err = ZIP_ERRNO; err = ZIP_ERRNO;
} }
if (size_read>0) if (size_read>0)
calculate_crc = crc32(calculate_crc,buf,size_read); calculate_crc = crc32(calculate_crc,buf,size_read);
total_read += size_read; total_read += size_read;
} while ((err == ZIP_OK) && (size_read>0)); } while ((err == ZIP_OK) && (size_read>0));
if (fin) if (fin)
fclose(fin); fclose(fin);
*result_crc=calculate_crc; *result_crc=calculate_crc;
printf("file %s crc %x\n",filenameinzip,calculate_crc); printf("file %s crc %x\n",filenameinzip,calculate_crc);
return err; return err;
} }
int main(argc,argv) int main(argc,argv)
int argc; int argc;
char *argv[]; char *argv[];
{ {
int i; int i;
int opt_overwrite=0; int opt_overwrite=0;
int opt_compress_level=Z_DEFAULT_COMPRESSION; int opt_compress_level=Z_DEFAULT_COMPRESSION;
int zipfilenamearg = 0; int zipfilenamearg = 0;
char filename_try[MAXFILENAME+16]; char filename_try[MAXFILENAME+16];
int zipok; int zipok;
int err=0; int err=0;
int size_buf=0; int size_buf=0;
void* buf=NULL; void* buf=NULL;
const char* password=NULL; const char* password=NULL;
do_banner(); do_banner();
if (argc==1) if (argc==1)
{ {
do_help(); do_help();
return 0; return 0;
} }
else else
{ {
for (i=1;i<argc;i++) for (i=1;i<argc;i++)
{ {
if ((*argv[i])=='-') if ((*argv[i])=='-')
{ {
const char *p=argv[i]+1; const char *p=argv[i]+1;
while ((*p)!='\0') while ((*p)!='\0')
{ {
char c=*(p++);; char c=*(p++);;
if ((c=='o') || (c=='O')) if ((c=='o') || (c=='O'))
opt_overwrite = 1; opt_overwrite = 1;
if ((c=='a') || (c=='A')) if ((c=='a') || (c=='A'))
opt_overwrite = 2; opt_overwrite = 2;
if ((c>='0') && (c<='9')) if ((c>='0') && (c<='9'))
opt_compress_level = c-'0'; opt_compress_level = c-'0';
if (((c=='p') || (c=='P')) && (i+1<argc)) if (((c=='p') || (c=='P')) && (i+1<argc))
{ {
password=argv[i+1]; password=argv[i+1];
i++; i++;
} }
} }
} }
else else
if (zipfilenamearg == 0) if (zipfilenamearg == 0)
zipfilenamearg = i ; zipfilenamearg = i ;
} }
} }
size_buf = WRITEBUFFERSIZE; size_buf = WRITEBUFFERSIZE;
buf = (void*)malloc(size_buf); buf = (void*)malloc(size_buf);
if (buf==NULL) if (buf==NULL)
{ {
printf("Error allocating memory\n"); printf("Error allocating memory\n");
return ZIP_INTERNALERROR; return ZIP_INTERNALERROR;
} }
if (zipfilenamearg==0) if (zipfilenamearg==0)
zipok=0; zipok=0;
else else
{ {
int i,len; int i,len;
int dot_found=0; int dot_found=0;
zipok = 1 ; zipok = 1 ;
strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);
/* strncpy doesnt append the trailing NULL, of the string is too long. */ /* strncpy doesnt append the trailing NULL, of the string is too long. */
filename_try[ MAXFILENAME ] = '\0'; filename_try[ MAXFILENAME ] = '\0';
len=(int)strlen(filename_try); len=(int)strlen(filename_try);
for (i=0;i<len;i++) for (i=0;i<len;i++)
if (filename_try[i]=='.') if (filename_try[i]=='.')
dot_found=1; dot_found=1;
if (dot_found==0) if (dot_found==0)
strcat(filename_try,".zip"); strcat(filename_try,".zip");
if (opt_overwrite==2) if (opt_overwrite==2)
{ {
/* if the file don't exist, we not append file */ /* if the file don't exist, we not append file */
if (check_exist_file(filename_try)==0) if (check_exist_file(filename_try)==0)
opt_overwrite=1; opt_overwrite=1;
} }
else else
if (opt_overwrite==0) if (opt_overwrite==0)
if (check_exist_file(filename_try)!=0) if (check_exist_file(filename_try)!=0)
{ {
char rep=0; char rep=0;
do do
{ {
char answer[128]; char answer[128];
printf("The file %s exist. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try); printf("The file %s exist. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try);
scanf("%1s",answer); scanf("%1s",answer);
rep = answer[0] ; rep = answer[0] ;
if ((rep>='a') && (rep<='z')) if ((rep>='a') && (rep<='z'))
rep -= 0x20; rep -= 0x20;
} }
while ((rep!='Y') && (rep!='N') && (rep!='A')); while ((rep!='Y') && (rep!='N') && (rep!='A'));
if (rep=='N') if (rep=='N')
zipok = 0; zipok = 0;
if (rep=='A') if (rep=='A')
opt_overwrite = 2; opt_overwrite = 2;
} }
} }
if (zipok==1) if (zipok==1)
{ {
zipFile zf; zipFile zf;
int errclose; int errclose;
#ifdef USEWIN32IOAPI # ifdef USEWIN32IOAPI
zlib_filefunc_def ffunc; zlib_filefunc_def ffunc;
fill_win32_filefunc(&ffunc); fill_win32_filefunc(&ffunc);
zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); zf = zipOpen2(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);
#else # else
zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0); zf = zipOpen(filename_try,(opt_overwrite==2) ? 2 : 0);
#endif # endif
if (zf == NULL) if (zf == NULL)
{ {
printf("error opening %s\n",filename_try); printf("error opening %s\n",filename_try);
err= ZIP_ERRNO; err= ZIP_ERRNO;
} }
else else
printf("creating %s\n",filename_try); printf("creating %s\n",filename_try);
for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++) for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
{ {
if (((*(argv[i]))!='-') && ((*(argv[i]))!='/')) if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))
{ {
FILE * fin; FILE * fin;
int size_read; int size_read;
const char* filenameinzip = argv[i]; const char* filenameinzip = argv[i];
zip_fileinfo zi; zip_fileinfo zi;
unsigned long crcFile=0; unsigned long crcFile=0;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0; zi.dosDate = 0;
zi.internal_fa = 0; zi.internal_fa = 0;
zi.external_fa = 0; zi.external_fa = 0;
filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
/* /*
err = zipOpenNewFileInZip(zf,filenameinzip,&zi, err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
NULL,0,NULL,0,NULL / * comment * /, NULL,0,NULL,0,NULL / * comment * /,
(opt_compress_level != 0) ? Z_DEFLATED : 0, (opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level); opt_compress_level);
*/ */
if ((password != NULL) && (err==ZIP_OK)) if ((password != NULL) && (err==ZIP_OK))
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
err = zipOpenNewFileInZip3(zf,filenameinzip,&zi, err = zipOpenNewFileInZip3(zf,filenameinzip,&zi,
NULL,0,NULL,0,NULL /* comment*/, NULL,0,NULL,0,NULL /* comment*/,
(opt_compress_level != 0) ? Z_DEFLATED : 0, (opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level,0, opt_compress_level,0,
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
password,crcFile); password,crcFile);
if (err != ZIP_OK) if (err != ZIP_OK)
printf("error in opening %s in zipfile\n",filenameinzip); printf("error in opening %s in zipfile\n",filenameinzip);
else else
{ {
fin = fopen(filenameinzip,"rb"); fin = fopen(filenameinzip,"rb");
if (fin==NULL) if (fin==NULL)
{ {
err=ZIP_ERRNO; err=ZIP_ERRNO;
printf("error in opening %s for reading\n",filenameinzip); printf("error in opening %s for reading\n",filenameinzip);
} }
} }
if (err == ZIP_OK) if (err == ZIP_OK)
do do
{ {
err = ZIP_OK; err = ZIP_OK;
size_read = (int)fread(buf,1,size_buf,fin); size_read = (int)fread(buf,1,size_buf,fin);
if (size_read < size_buf) if (size_read < size_buf)
if (feof(fin)==0) if (feof(fin)==0)
{ {
printf("error in reading %s\n",filenameinzip); printf("error in reading %s\n",filenameinzip);
err = ZIP_ERRNO; err = ZIP_ERRNO;
} }
if (size_read>0) if (size_read>0)
{ {
err = zipWriteInFileInZip (zf,buf,size_read); err = zipWriteInFileInZip (zf,buf,size_read);
if (err<0) if (err<0)
{ {
printf("error in writing %s in the zipfile\n", printf("error in writing %s in the zipfile\n",
filenameinzip); filenameinzip);
} }
} }
} while ((err == ZIP_OK) && (size_read>0)); } while ((err == ZIP_OK) && (size_read>0));
if (fin) if (fin)
fclose(fin); fclose(fin);
if (err<0) if (err<0)
err=ZIP_ERRNO; err=ZIP_ERRNO;
else else
{ {
err = zipCloseFileInZip(zf); err = zipCloseFileInZip(zf);
if (err!=ZIP_OK) if (err!=ZIP_OK)
printf("error in closing %s in the zipfile\n", printf("error in closing %s in the zipfile\n",
filenameinzip); filenameinzip);
} }
} }
} }
errclose = zipClose(zf,NULL); errclose = zipClose(zf,NULL);
if (errclose != ZIP_OK) if (errclose != ZIP_OK)
printf("error in closing %s\n",filename_try); printf("error in closing %s\n",filename_try);
} }
free(buf); free(buf);
return 0; return 0;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,342 +1,342 @@
/* unzip.h -- IO for uncompress .zip files using zlib /* unzip.h -- IO for uncompress .zip files using zlib
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
WinZip, InfoZip tools and compatible. WinZip, InfoZip tools and compatible.
Encryption and multi volume ZipFile (span) are not supported. Encryption and multi volume ZipFile (span) are not supported.
Old compressions used by old PKZip 1.x are not supported Old compressions used by old PKZip 1.x are not supported
I WAIT FEEDBACK at mail info@winimage.com I WAIT FEEDBACK at mail info@winimage.com
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
Condition of use and distribution are the same than zlib : Condition of use and distribution are the same than zlib :
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
arising from the use of this software. arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions: freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not 1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be in a product, an acknowledgment in the product documentation would be
appreciated but is not required. appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be 2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software. misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
/* for more info about .ZIP format, see /* for more info about .ZIP format, see
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
http://www.info-zip.org/pub/infozip/doc/ http://www.info-zip.org/pub/infozip/doc/
PkWare has also a specification at : PkWare has also a specification at :
ftp://ftp.pkware.com/probdesc.zip ftp://ftp.pkware.com/probdesc.zip
*/ */
#ifndef _unz_H #ifndef _unz_H
#define _unz_H #define _unz_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#ifndef _ZLIB_H #ifndef _ZLIB_H
#include "zlib.h" #include "zlib.h"
#endif #endif
#ifndef _ZLIBIOAPI_H #ifndef _ZLIBIOAPI_H
#include "ioapi.h" #include "ioapi.h"
#endif #endif
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted /* like the STRICT of WIN32, we define a pointer that cannot be converted
from (void*) without cast */ from (void*) without cast */
typedef struct TagunzFile__ { int unused; } unzFile__; typedef struct TagunzFile__ { int unused; } unzFile__;
typedef unzFile__ *unzFile; typedef unzFile__ *unzFile;
#else #else
typedef voidp unzFile; typedef voidp unzFile;
#endif #endif
#define UNZ_OK (0) #define UNZ_OK (0)
#define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_END_OF_LIST_OF_FILE (-100)
#define UNZ_ERRNO (Z_ERRNO) #define UNZ_ERRNO (Z_ERRNO)
#define UNZ_EOF (0) #define UNZ_EOF (0)
#define UNZ_PARAMERROR (-102) #define UNZ_PARAMERROR (-102)
#define UNZ_BADZIPFILE (-103) #define UNZ_BADZIPFILE (-103)
#define UNZ_INTERNALERROR (-104) #define UNZ_INTERNALERROR (-104)
#define UNZ_CRCERROR (-105) #define UNZ_CRCERROR (-105)
/* tm_unz contain date/time info */ /* tm_unz contain date/time info */
typedef struct tm_unz_s typedef struct tm_unz_s
{ {
uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */ uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */ uInt tm_year; /* years - [1980..2044] */
} tm_unz; } tm_unz;
/* unz_global_info structure contain global data about the ZIPfile /* unz_global_info structure contain global data about the ZIPfile
These data comes from the end of central dir */ These data comes from the end of central dir */
typedef struct unz_global_info_s typedef struct unz_global_info_s
{ {
uLong number_entry; /* total number of entries in uLong number_entry; /* total number of entries in
the central dir on this disk */ the central dir on this disk */
uLong size_comment; /* size of the global comment of the zipfile */ uLong size_comment; /* size of the global comment of the zipfile */
} unz_global_info; } unz_global_info;
/* unz_file_info contain information about a file in the zipfile */ /* unz_file_info contain information about a file in the zipfile */
typedef struct unz_file_info_s typedef struct unz_file_info_s
{ {
uLong version; /* version made by 2 bytes */ uLong version; /* version made by 2 bytes */
uLong version_needed; /* version needed to extract 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */
uLong flag; /* general purpose bit flag 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */
uLong compression_method; /* compression method 2 bytes */ uLong compression_method; /* compression method 2 bytes */
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
uLong crc; /* crc-32 4 bytes */ uLong crc; /* crc-32 4 bytes */
uLong compressed_size; /* compressed size 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */
uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */
uLong size_filename; /* filename length 2 bytes */ uLong size_filename; /* filename length 2 bytes */
uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */
uLong size_file_comment; /* file comment length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */
uLong disk_num_start; /* disk number start 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */
uLong internal_fa; /* internal file attributes 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */
uLong external_fa; /* external file attributes 4 bytes */ uLong external_fa; /* external file attributes 4 bytes */
tm_unz tmu_date; tm_unz tmu_date;
} unz_file_info; } unz_file_info;
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
const char* fileName2, const char* fileName2,
int iCaseSensitivity)); int iCaseSensitivity));
/* /*
Compare two filename (fileName1,fileName2). Compare two filename (fileName1,fileName2).
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
or strcasecmp) or strcasecmp)
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
(like 1 on Unix, 2 on Windows) (like 1 on Unix, 2 on Windows)
*/ */
extern unzFile ZEXPORT unzOpen OF((const char *path)); extern unzFile ZEXPORT unzOpen OF((const char *path));
/* /*
Open a Zip file. path contain the full pathname (by example, Open a Zip file. path contain the full pathname (by example,
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
"zlib/zlib113.zip". "zlib/zlib113.zip".
If the zipfile cannot be opened (file don't exist or in not valid), the If the zipfile cannot be opened (file don't exist or in not valid), the
return value is NULL. return value is NULL.
Else, the return value is a unzFile Handle, usable with other function Else, the return value is a unzFile Handle, usable with other function
of this unzip package. of this unzip package.
*/ */
extern unzFile ZEXPORT unzOpen2 OF((const char *path, extern unzFile ZEXPORT unzOpen2 OF((const char *path,
zlib_filefunc_def* pzlib_filefunc_def)); zlib_filefunc_def* pzlib_filefunc_def));
/* /*
Open a Zip file, like unzOpen, but provide a set of file low level API Open a Zip file, like unzOpen, but provide a set of file low level API
for read/write the zip file (see ioapi.h) for read/write the zip file (see ioapi.h)
*/ */
extern int ZEXPORT unzClose OF((unzFile file)); extern int ZEXPORT unzClose OF((unzFile file));
/* /*
Close a ZipFile opened with unzipOpen. Close a ZipFile opened with unzipOpen.
If there is files inside the .Zip opened with unzOpenCurrentFile (see later), If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
these files MUST be closed with unzipCloseCurrentFile before call unzipClose. these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
return UNZ_OK if there is no problem. */ return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
unz_global_info *pglobal_info)); unz_global_info *pglobal_info));
/* /*
Write info about the ZipFile in the *pglobal_info structure. Write info about the ZipFile in the *pglobal_info structure.
No preparation of the structure is needed No preparation of the structure is needed
return UNZ_OK if there is no problem. */ return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalComment OF((unzFile file, extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
char *szComment, char *szComment,
uLong uSizeBuf)); uLong uSizeBuf));
/* /*
Get the global comment string of the ZipFile, in the szComment buffer. Get the global comment string of the ZipFile, in the szComment buffer.
uSizeBuf is the size of the szComment buffer. uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0 return the number of byte copied or an error code <0
*/ */
/***************************************************************************/ /***************************************************************************/
/* Unzip package allow you browse the directory of the zipfile */ /* Unzip package allow you browse the directory of the zipfile */
extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
/* /*
Set the current file of the zipfile to the first file. Set the current file of the zipfile to the first file.
return UNZ_OK if there is no problem return UNZ_OK if there is no problem
*/ */
extern int ZEXPORT unzGoToNextFile OF((unzFile file)); extern int ZEXPORT unzGoToNextFile OF((unzFile file));
/* /*
Set the current file of the zipfile to the next file. Set the current file of the zipfile to the next file.
return UNZ_OK if there is no problem return UNZ_OK if there is no problem
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
*/ */
extern int ZEXPORT unzLocateFile OF((unzFile file, extern int ZEXPORT unzLocateFile OF((unzFile file,
const char *szFileName, const char *szFileName,
int iCaseSensitivity)); int iCaseSensitivity));
/* /*
Try locate the file szFileName in the zipfile. Try locate the file szFileName in the zipfile.
For the iCaseSensitivity signification, see unzStringFileNameCompare For the iCaseSensitivity signification, see unzStringFileNameCompare
return value : return value :
UNZ_OK if the file is found. It becomes the current file. UNZ_OK if the file is found. It becomes the current file.
UNZ_END_OF_LIST_OF_FILE if the file is not found UNZ_END_OF_LIST_OF_FILE if the file is not found
*/ */
/* ****************************************** */ /* ****************************************** */
/* Ryan supplied functions */ /* Ryan supplied functions */
/* unz_file_info contain information about a file in the zipfile */ /* unz_file_info contain information about a file in the zipfile */
typedef struct unz_file_pos_s typedef struct unz_file_pos_s
{ {
uLong pos_in_zip_directory; /* offset in zip file directory */ uLong pos_in_zip_directory; /* offset in zip file directory */
uLong num_of_file; /* # of file */ uLong num_of_file; /* # of file */
} unz_file_pos; } unz_file_pos;
extern int ZEXPORT unzGetFilePos( extern int ZEXPORT unzGetFilePos(
unzFile file, unzFile file,
unz_file_pos* file_pos); unz_file_pos* file_pos);
extern int ZEXPORT unzGoToFilePos( extern int ZEXPORT unzGoToFilePos(
unzFile file, unzFile file,
unz_file_pos* file_pos); unz_file_pos* file_pos);
/* ****************************************** */ /* ****************************************** */
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
unz_file_info *pfile_info, unz_file_info *pfile_info,
char *szFileName, char *szFileName,
uLong fileNameBufferSize, uLong fileNameBufferSize,
void *extraField, void *extraField,
uLong extraFieldBufferSize, uLong extraFieldBufferSize,
char *szComment, char *szComment,
uLong commentBufferSize)); uLong commentBufferSize));
/* /*
Get Info about the current file Get Info about the current file
if pfile_info!=NULL, the *pfile_info structure will contain somes info about if pfile_info!=NULL, the *pfile_info structure will contain somes info about
the current file the current file
if szFileName!=NULL, the filemane string will be copied in szFileName if szFileName!=NULL, the filemane string will be copied in szFileName
(fileNameBufferSize is the size of the buffer) (fileNameBufferSize is the size of the buffer)
if extraField!=NULL, the extra field information will be copied in extraField if extraField!=NULL, the extra field information will be copied in extraField
(extraFieldBufferSize is the size of the buffer). (extraFieldBufferSize is the size of the buffer).
This is the Central-header version of the extra field This is the Central-header version of the extra field
if szComment!=NULL, the comment string of the file will be copied in szComment if szComment!=NULL, the comment string of the file will be copied in szComment
(commentBufferSize is the size of the buffer) (commentBufferSize is the size of the buffer)
*/ */
/***************************************************************************/ /***************************************************************************/
/* for reading the content of the current zipfile, you can open it, read data /* for reading the content of the current zipfile, you can open it, read data
from it, and close it (you can close it before reading all the file) from it, and close it (you can close it before reading all the file)
*/ */
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
/* /*
Open for reading data the current file in the zipfile. Open for reading data the current file in the zipfile.
If there is no error, the return value is UNZ_OK. If there is no error, the return value is UNZ_OK.
*/ */
extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
const char* password)); const char* password));
/* /*
Open for reading data the current file in the zipfile. Open for reading data the current file in the zipfile.
password is a crypting password password is a crypting password
If there is no error, the return value is UNZ_OK. If there is no error, the return value is UNZ_OK.
*/ */
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
int* method, int* method,
int* level, int* level,
int raw)); int raw));
/* /*
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
if raw==1 if raw==1
*method will receive method of compression, *level will receive level of *method will receive method of compression, *level will receive level of
compression compression
note : you can set level parameter as NULL (if you did not want known level, note : you can set level parameter as NULL (if you did not want known level,
but you CANNOT set method parameter as NULL but you CANNOT set method parameter as NULL
*/ */
extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
int* method, int* method,
int* level, int* level,
int raw, int raw,
const char* password)); const char* password));
/* /*
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
if raw==1 if raw==1
*method will receive method of compression, *level will receive level of *method will receive method of compression, *level will receive level of
compression compression
note : you can set level parameter as NULL (if you did not want known level, note : you can set level parameter as NULL (if you did not want known level,
but you CANNOT set method parameter as NULL but you CANNOT set method parameter as NULL
*/ */
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
/* /*
Close the file in zip opened with unzOpenCurrentFile Close the file in zip opened with unzOpenCurrentFile
Return UNZ_CRCERROR if all the file was read but the CRC is not good Return UNZ_CRCERROR if all the file was read but the CRC is not good
*/ */
extern int ZEXPORT unzReadCurrentFile OF((unzFile file, extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
voidp buf, voidp buf,
unsigned len)); unsigned len));
/* /*
Read bytes from the current file (opened by unzOpenCurrentFile) Read bytes from the current file (opened by unzOpenCurrentFile)
buf contain buffer where data must be copied buf contain buffer where data must be copied
len the size of buf. len the size of buf.
return the number of byte copied if somes bytes are copied return the number of byte copied if somes bytes are copied
return 0 if the end of file was reached return 0 if the end of file was reached
return <0 with error code if there is an error return <0 with error code if there is an error
(UNZ_ERRNO for IO error, or zLib error for uncompress error) (UNZ_ERRNO for IO error, or zLib error for uncompress error)
*/ */
extern z_off_t ZEXPORT unztell OF((unzFile file)); extern z_off_t ZEXPORT unztell OF((unzFile file));
/* /*
Give the current position in uncompressed data Give the current position in uncompressed data
*/ */
extern int ZEXPORT unzeof OF((unzFile file)); extern int ZEXPORT unzeof OF((unzFile file));
/* /*
return 1 if the end of file was reached, 0 elsewhere return 1 if the end of file was reached, 0 elsewhere
*/ */
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
voidp buf, voidp buf,
unsigned len)); unsigned len));
/* /*
Read extra field from the current file (opened by unzOpenCurrentFile) Read extra field from the current file (opened by unzOpenCurrentFile)
This is the local-header version of the extra field (sometimes, there is This is the local-header version of the extra field (sometimes, there is
more info in the local-header version than in the central-header) more info in the local-header version than in the central-header)
if buf==NULL, it return the size of the local extra field if buf==NULL, it return the size of the local extra field
if buf!=NULL, len is the size of the buffer, the extra header is copied in if buf!=NULL, len is the size of the buffer, the extra header is copied in
buf. buf.
the return value is the number of bytes copied in buf, or (if <0) the return value is the number of bytes copied in buf, or (if <0)
the error code the error code
*/ */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _unz_H */ #endif /* _unz_H */

File diff suppressed because it is too large Load Diff

View File

@@ -1,235 +1,235 @@
/* zip.h -- IO for compress .zip files using zlib /* zip.h -- IO for compress .zip files using zlib
Version 0.22, May 19th, 2003 Version 1.00, September 10th, 2003
Copyright (C) 1998-2003 Gilles Vollant Copyright (C) 1998-2003 Gilles Vollant
This unzip package allow creates .ZIP file, compatible with PKZip 2.04g This unzip package allow creates .ZIP file, compatible with PKZip 2.04g
WinZip, InfoZip tools and compatible. WinZip, InfoZip tools and compatible.
Encryption and multi volume ZipFile (span) are not supported. Encryption and multi volume ZipFile (span) are not supported.
Old compressions used by old PKZip 1.x are not supported Old compressions used by old PKZip 1.x are not supported
For uncompress .zip file, look at unzip.h For uncompress .zip file, look at unzip.h
I WAIT FEEDBACK at mail info@winimage.com I WAIT FEEDBACK at mail info@winimage.com
Visit also http://www.winimage.com/zLibDll/unzip.html for evolution Visit also http://www.winimage.com/zLibDll/unzip.html for evolution
Condition of use and distribution are the same than zlib : Condition of use and distribution are the same than zlib :
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
arising from the use of this software. arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions: freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not 1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be in a product, an acknowledgment in the product documentation would be
appreciated but is not required. appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be 2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software. misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
/* for more info about .ZIP format, see /* for more info about .ZIP format, see
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
http://www.info-zip.org/pub/infozip/doc/ http://www.info-zip.org/pub/infozip/doc/
PkWare has also a specification at : PkWare has also a specification at :
ftp://ftp.pkware.com/probdesc.zip ftp://ftp.pkware.com/probdesc.zip
*/ */
#ifndef _zip_H #ifndef _zip_H
#define _zip_H #define _zip_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#ifndef _ZLIB_H #ifndef _ZLIB_H
#include "zlib.h" #include "zlib.h"
#endif #endif
#ifndef _ZLIBIOAPI_H #ifndef _ZLIBIOAPI_H
#include "ioapi.h" #include "ioapi.h"
#endif #endif
#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) #if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted /* like the STRICT of WIN32, we define a pointer that cannot be converted
from (void*) without cast */ from (void*) without cast */
typedef struct TagzipFile__ { int unused; } zipFile__; typedef struct TagzipFile__ { int unused; } zipFile__;
typedef zipFile__ *zipFile; typedef zipFile__ *zipFile;
#else #else
typedef voidp zipFile; typedef voidp zipFile;
#endif #endif
#define ZIP_OK (0) #define ZIP_OK (0)
#define ZIP_EOF (0) #define ZIP_EOF (0)
#define ZIP_ERRNO (Z_ERRNO) #define ZIP_ERRNO (Z_ERRNO)
#define ZIP_PARAMERROR (-102) #define ZIP_PARAMERROR (-102)
#define ZIP_BADZIPFILE (-103) #define ZIP_BADZIPFILE (-103)
#define ZIP_INTERNALERROR (-104) #define ZIP_INTERNALERROR (-104)
#ifndef DEF_MEM_LEVEL #ifndef DEF_MEM_LEVEL
# if MAX_MEM_LEVEL >= 8 # if MAX_MEM_LEVEL >= 8
# define DEF_MEM_LEVEL 8 # define DEF_MEM_LEVEL 8
# else # else
# define DEF_MEM_LEVEL MAX_MEM_LEVEL # define DEF_MEM_LEVEL MAX_MEM_LEVEL
# endif # endif
#endif #endif
/* default memLevel */ /* default memLevel */
/* tm_zip contain date/time info */ /* tm_zip contain date/time info */
typedef struct tm_zip_s typedef struct tm_zip_s
{ {
uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */ uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */ uInt tm_year; /* years - [1980..2044] */
} tm_zip; } tm_zip;
typedef struct typedef struct
{ {
tm_zip tmz_date; /* date in understandable format */ tm_zip tmz_date; /* date in understandable format */
uLong dosDate; /* if dos_date == 0, tmu_date is used */ uLong dosDate; /* if dos_date == 0, tmu_date is used */
/* uLong flag; */ /* general purpose bit flag 2 bytes */ /* uLong flag; */ /* general purpose bit flag 2 bytes */
uLong internal_fa; /* internal file attributes 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */
uLong external_fa; /* external file attributes 4 bytes */ uLong external_fa; /* external file attributes 4 bytes */
} zip_fileinfo; } zip_fileinfo;
typedef const char* zipcharpc; typedef const char* zipcharpc;
#define APPEND_STATUS_CREATE (0) #define APPEND_STATUS_CREATE (0)
#define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_CREATEAFTER (1)
#define APPEND_STATUS_ADDINZIP (2) #define APPEND_STATUS_ADDINZIP (2)
extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
/* /*
Create a zipfile. Create a zipfile.
pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
an Unix computer "zlib/zlib113.zip". an Unix computer "zlib/zlib113.zip".
if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
will be created at the end of the file. will be created at the end of the file.
(useful if the file contain a self extractor code) (useful if the file contain a self extractor code)
if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
add files in existing zip (be sure you don't add file that doesn't exist) add files in existing zip (be sure you don't add file that doesn't exist)
If the zipfile cannot be opened, the return value is NULL. If the zipfile cannot be opened, the return value is NULL.
Else, the return value is a zipFile Handle, usable with other function Else, the return value is a zipFile Handle, usable with other function
of this zip package. of this zip package.
*/ */
/* Note : there is no delete function into a zipfile. /* Note : there is no delete function into a zipfile.
If you want delete file into a zipfile, you must open a zipfile, and create another If you want delete file into a zipfile, you must open a zipfile, and create another
Of couse, you can use RAW reading and writing to copy the file you did not want delte Of couse, you can use RAW reading and writing to copy the file you did not want delte
*/ */
extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
int append, int append,
zipcharpc* globalcomment, zipcharpc* globalcomment,
zlib_filefunc_def* pzlib_filefunc_def)); zlib_filefunc_def* pzlib_filefunc_def));
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
const char* filename, const char* filename,
const zip_fileinfo* zipfi, const zip_fileinfo* zipfi,
const void* extrafield_local, const void* extrafield_local,
uInt size_extrafield_local, uInt size_extrafield_local,
const void* extrafield_global, const void* extrafield_global,
uInt size_extrafield_global, uInt size_extrafield_global,
const char* comment, const char* comment,
int method, int method,
int level)); int level));
/* /*
Open a file in the ZIP for writing. Open a file in the ZIP for writing.
filename : the filename in zip (if NULL, '-' without quote will be used filename : the filename in zip (if NULL, '-' without quote will be used
*zipfi contain supplemental information *zipfi contain supplemental information
if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
contains the extrafield data the the local header contains the extrafield data the the local header
if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
contains the extrafield data the the local header contains the extrafield data the the local header
if comment != NULL, comment contain the comment string if comment != NULL, comment contain the comment string
method contain the compression method (0 for store, Z_DEFLATED for deflate) method contain the compression method (0 for store, Z_DEFLATED for deflate)
level contain the level of compression (can be Z_DEFAULT_COMPRESSION) level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
*/ */
extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
const char* filename, const char* filename,
const zip_fileinfo* zipfi, const zip_fileinfo* zipfi,
const void* extrafield_local, const void* extrafield_local,
uInt size_extrafield_local, uInt size_extrafield_local,
const void* extrafield_global, const void* extrafield_global,
uInt size_extrafield_global, uInt size_extrafield_global,
const char* comment, const char* comment,
int method, int method,
int level, int level,
int raw)); int raw));
/* /*
Same than zipOpenNewFileInZip, except if raw=1, we write raw file Same than zipOpenNewFileInZip, except if raw=1, we write raw file
*/ */
extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
const char* filename, const char* filename,
const zip_fileinfo* zipfi, const zip_fileinfo* zipfi,
const void* extrafield_local, const void* extrafield_local,
uInt size_extrafield_local, uInt size_extrafield_local,
const void* extrafield_global, const void* extrafield_global,
uInt size_extrafield_global, uInt size_extrafield_global,
const char* comment, const char* comment,
int method, int method,
int level, int level,
int raw, int raw,
int windowBits, int windowBits,
int memLevel, int memLevel,
int strategy, int strategy,
const char* password, const char* password,
uLong crcForCtypting)); uLong crcForCtypting));
/* /*
Same than zipOpenNewFileInZip2, except Same than zipOpenNewFileInZip2, except
windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
password : crypting password (NULL for no crypting) password : crypting password (NULL for no crypting)
crcForCtypting : crc of file to compress (needed for crypting) crcForCtypting : crc of file to compress (needed for crypting)
*/ */
extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
const void* buf, const void* buf,
unsigned len)); unsigned len));
/* /*
Write data in the zipfile Write data in the zipfile
*/ */
extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
/* /*
Close the current file in the zipfile Close the current file in the zipfile
*/ */
extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
uLong uncompressed_size, uLong uncompressed_size,
uLong crc32)); uLong crc32));
/* /*
Close the current file in the zipfile, for fiel opened with Close the current file in the zipfile, for fiel opened with
parameter raw=1 in zipOpenNewFileInZip2 parameter raw=1 in zipOpenNewFileInZip2
uncompressed_size and crc32 are value for the uncompressed size uncompressed_size and crc32 are value for the uncompressed size
*/ */
extern int ZEXPORT zipClose OF((zipFile file, extern int ZEXPORT zipClose OF((zipFile file,
const char* global_comment)); const char* global_comment));
/* /*
Close the zipfile Close the zipfile
*/ */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _zip_H */ #endif /* _zip_H */

599
contrib/pascal/example.pas Normal file
View File

@@ -0,0 +1,599 @@
(* example.c -- usage example of the zlib compression library
* Copyright (C) 1995-2003 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Pascal translation
* Copyright (C) 1998 by Jacques Nomssi Nzali.
* For conditions of distribution and use, see copyright notice in readme.txt
*
* Adaptation to the zlibpas interface
* Copyright (C) 2003 by Cosmin Truta.
* For conditions of distribution and use, see copyright notice in readme.txt
*)
program example;
{$DEFINE TEST_COMPRESS}
{DO NOT $DEFINE TEST_GZIO}
{$DEFINE TEST_DEFLATE}
{$DEFINE TEST_INFLATE}
{$DEFINE TEST_FLUSH}
{$DEFINE TEST_SYNC}
{$DEFINE TEST_DICT}
uses SysUtils, zlibpas;
const TESTFILE = 'foo.gz';
(* "hello world" would be more standard, but the repeated "hello"
* stresses the compression code better, sorry...
*)
const hello: PChar = 'hello, hello!';
const dictionary: PChar = 'hello';
var dictId: LongInt; (* Adler32 value of the dictionary *)
procedure CHECK_ERR(err: Integer; msg: String);
begin
if err <> Z_OK then
begin
WriteLn(msg, ' error: ', err);
Halt(1);
end;
end;
procedure EXIT_ERR(const msg: String);
begin
WriteLn('Error: ', msg);
Halt(1);
end;
(* ===========================================================================
* Test compress and uncompress
*)
{$IFDEF TEST_COMPRESS}
procedure test_compress(compr: Pointer; comprLen: LongInt;
uncompr: Pointer; uncomprLen: LongInt);
var err: Integer;
len: LongInt;
begin
len := StrLen(hello)+1;
err := compress(compr, comprLen, hello, len);
CHECK_ERR(err, 'compress');
StrCopy(PChar(uncompr), 'garbage');
err := uncompress(uncompr, uncomprLen, compr, comprLen);
CHECK_ERR(err, 'uncompress');
if StrComp(PChar(uncompr), hello) <> 0 then
EXIT_ERR('bad uncompress')
else
WriteLn('uncompress(): ', PChar(uncompr));
end;
{$ENDIF}
(* ===========================================================================
* Test read/write of .gz files
*)
{$IFDEF TEST_GZIO}
procedure test_gzio(const fname: PChar; (* compressed file name *)
uncompr: Pointer;
uncomprLen: LongInt);
var err: Integer;
len: Integer;
zfile: gzFile;
pos: LongInt;
begin
len := StrLen(hello)+1;
zfile := gzopen(fname, 'wb');
if zfile = NIL then
begin
WriteLn('gzopen error');
Halt(1);
end;
gzputc(zfile, 'h');
if gzputs(zfile, 'ello') <> 4 then
begin
WriteLn('gzputs err: ', gzerror(zfile, err));
Halt(1);
end;
{$IFDEF GZ_FORMAT_STRING}
if gzprintf(zfile, ', %s!', 'hello') <> 8 then
begin
WriteLn('gzprintf err: ', gzerror(zfile, err));
Halt(1);
end;
{$ELSE}
if gzputs(zfile, ', hello!') <> 8 then
begin
WriteLn('gzputs err: ', gzerror(zfile, err));
Halt(1);
end;
{$ENDIF}
gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *)
gzclose(zfile);
zfile := gzopen(fname, 'rb');
if zfile = NIL then
begin
WriteLn('gzopen error');
Halt(1);
end;
StrCopy(PChar(uncompr), 'garbage');
if gzread(zfile, uncompr, uncomprLen) <> len then
begin
WriteLn('gzread err: ', gzerror(zfile, err));
Halt(1);
end;
if StrComp(PChar(uncompr), hello) <> 0 then
begin
WriteLn('bad gzread: ', PChar(uncompr));
Halt(1);
end
else
WriteLn('gzread(): ', PChar(uncompr));
pos := gzseek(zfile, -8, SEEK_CUR);
if (pos <> 6) or (gztell(zfile) <> pos) then
begin
WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile));
Halt(1);
end;
if gzgetc(zfile) <> ' ' then
begin
WriteLn('gzgetc error');
Halt(1);
end;
if gzungetc(' ', zfile) <> ' ' then
begin
WriteLn('gzungetc error');
Halt(1);
end;
gzgets(zfile, PChar(uncompr), uncomprLen);
uncomprLen := StrLen(PChar(uncompr));
if uncomprLen <> 7 then (* " hello!" *)
begin
WriteLn('gzgets err after gzseek: ', gzerror(zfile, err));
Halt(1);
end;
if StrComp(PChar(uncompr), hello + 6) <> 0 then
begin
WriteLn('bad gzgets after gzseek');
Halt(1);
end
else
WriteLn('gzgets() after gzseek: ', PChar(uncompr));
gzclose(zfile);
end;
{$ENDIF}
(* ===========================================================================
* Test deflate with small buffers
*)
{$IFDEF TEST_DEFLATE}
procedure test_deflate(compr: Pointer; comprLen: LongInt);
var c_stream: z_stream; (* compression stream *)
err: Integer;
len: LongInt;
begin
len := StrLen(hello)+1;
c_stream.zalloc := NIL;
c_stream.zfree := NIL;
c_stream.opaque := NIL;
err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
CHECK_ERR(err, 'deflateInit');
c_stream.next_in := hello;
c_stream.next_out := compr;
while (c_stream.total_in <> len) and
(c_stream.total_out < comprLen) do
begin
c_stream.avail_out := 1; { force small buffers }
c_stream.avail_in := 1;
err := deflate(c_stream, Z_NO_FLUSH);
CHECK_ERR(err, 'deflate');
end;
(* Finish the stream, still forcing small buffers: *)
while TRUE do
begin
c_stream.avail_out := 1;
err := deflate(c_stream, Z_FINISH);
if err = Z_STREAM_END then
break;
CHECK_ERR(err, 'deflate');
end;
err := deflateEnd(c_stream);
CHECK_ERR(err, 'deflateEnd');
end;
{$ENDIF}
(* ===========================================================================
* Test inflate with small buffers
*)
{$IFDEF TEST_INFLATE}
procedure test_inflate(compr: Pointer; comprLen : LongInt;
uncompr: Pointer; uncomprLen : LongInt);
var err: Integer;
d_stream: z_stream; (* decompression stream *)
begin
StrCopy(PChar(uncompr), 'garbage');
d_stream.zalloc := NIL;
d_stream.zfree := NIL;
d_stream.opaque := NIL;
d_stream.next_in := compr;
d_stream.avail_in := 0;
d_stream.next_out := uncompr;
err := inflateInit(d_stream);
CHECK_ERR(err, 'inflateInit');
while (d_stream.total_out < uncomprLen) and
(d_stream.total_in < comprLen) do
begin
d_stream.avail_out := 1; (* force small buffers *)
d_stream.avail_in := 1;
err := inflate(d_stream, Z_NO_FLUSH);
if err = Z_STREAM_END then
break;
CHECK_ERR(err, 'inflate');
end;
err := inflateEnd(d_stream);
CHECK_ERR(err, 'inflateEnd');
if StrComp(PChar(uncompr), hello) <> 0 then
EXIT_ERR('bad inflate')
else
WriteLn('inflate(): ', PChar(uncompr));
end;
{$ENDIF}
(* ===========================================================================
* Test deflate with large buffers and dynamic change of compression level
*)
{$IFDEF TEST_DEFLATE}
procedure test_large_deflate(compr: Pointer; comprLen: LongInt;
uncompr: Pointer; uncomprLen: LongInt);
var c_stream: z_stream; (* compression stream *)
err: Integer;
begin
c_stream.zalloc := NIL;
c_stream.zfree := NIL;
c_stream.opaque := NIL;
err := deflateInit(c_stream, Z_BEST_SPEED);
CHECK_ERR(err, 'deflateInit');
c_stream.next_out := compr;
c_stream.avail_out := Integer(comprLen);
(* At this point, uncompr is still mostly zeroes, so it should compress
* very well:
*)
c_stream.next_in := uncompr;
c_stream.avail_in := Integer(uncomprLen);
err := deflate(c_stream, Z_NO_FLUSH);
CHECK_ERR(err, 'deflate');
if c_stream.avail_in <> 0 then
EXIT_ERR('deflate not greedy');
(* Feed in already compressed data and switch to no compression: *)
deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
c_stream.next_in := compr;
c_stream.avail_in := Integer(comprLen div 2);
err := deflate(c_stream, Z_NO_FLUSH);
CHECK_ERR(err, 'deflate');
(* Switch back to compressing mode: *)
deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
c_stream.next_in := uncompr;
c_stream.avail_in := Integer(uncomprLen);
err := deflate(c_stream, Z_NO_FLUSH);
CHECK_ERR(err, 'deflate');
err := deflate(c_stream, Z_FINISH);
if err <> Z_STREAM_END then
EXIT_ERR('deflate should report Z_STREAM_END');
err := deflateEnd(c_stream);
CHECK_ERR(err, 'deflateEnd');
end;
{$ENDIF}
(* ===========================================================================
* Test inflate with large buffers
*)
{$IFDEF TEST_INFLATE}
procedure test_large_inflate(compr: Pointer; comprLen: LongInt;
uncompr: Pointer; uncomprLen: LongInt);
var err: Integer;
d_stream: z_stream; (* decompression stream *)
begin
StrCopy(PChar(uncompr), 'garbage');
d_stream.zalloc := NIL;
d_stream.zfree := NIL;
d_stream.opaque := NIL;
d_stream.next_in := compr;
d_stream.avail_in := Integer(comprLen);
err := inflateInit(d_stream);
CHECK_ERR(err, 'inflateInit');
while TRUE do
begin
d_stream.next_out := uncompr; (* discard the output *)
d_stream.avail_out := Integer(uncomprLen);
err := inflate(d_stream, Z_NO_FLUSH);
if err = Z_STREAM_END then
break;
CHECK_ERR(err, 'large inflate');
end;
err := inflateEnd(d_stream);
CHECK_ERR(err, 'inflateEnd');
if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then
begin
WriteLn('bad large inflate: ', d_stream.total_out);
Halt(1);
end
else
WriteLn('large_inflate(): OK');
end;
{$ENDIF}
(* ===========================================================================
* Test deflate with full flush
*)
{$IFDEF TEST_FLUSH}
procedure test_flush(compr: Pointer; var comprLen : LongInt);
var c_stream: z_stream; (* compression stream *)
err: Integer;
len: Integer;
begin
len := StrLen(hello)+1;
c_stream.zalloc := NIL;
c_stream.zfree := NIL;
c_stream.opaque := NIL;
err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
CHECK_ERR(err, 'deflateInit');
c_stream.next_in := hello;
c_stream.next_out := compr;
c_stream.avail_in := 3;
c_stream.avail_out := Integer(comprLen);
err := deflate(c_stream, Z_FULL_FLUSH);
CHECK_ERR(err, 'deflate');
Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *)
c_stream.avail_in := len - 3;
err := deflate(c_stream, Z_FINISH);
if err <> Z_STREAM_END then
CHECK_ERR(err, 'deflate');
err := deflateEnd(c_stream);
CHECK_ERR(err, 'deflateEnd');
comprLen := c_stream.total_out;
end;
{$ENDIF}
(* ===========================================================================
* Test inflateSync()
*)
{$IFDEF TEST_SYNC}
procedure test_sync(compr: Pointer; comprLen: LongInt;
uncompr: Pointer; uncomprLen : LongInt);
var err: Integer;
d_stream: z_stream; (* decompression stream *)
begin
StrCopy(PChar(uncompr), 'garbage');
d_stream.zalloc := NIL;
d_stream.zfree := NIL;
d_stream.opaque := NIL;
d_stream.next_in := compr;
d_stream.avail_in := 2; (* just read the zlib header *)
err := inflateInit(d_stream);
CHECK_ERR(err, 'inflateInit');
d_stream.next_out := uncompr;
d_stream.avail_out := Integer(uncomprLen);
inflate(d_stream, Z_NO_FLUSH);
CHECK_ERR(err, 'inflate');
d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *)
err := inflateSync(d_stream); (* but skip the damaged part *)
CHECK_ERR(err, 'inflateSync');
err := inflate(d_stream, Z_FINISH);
if err <> Z_DATA_ERROR then
EXIT_ERR('inflate should report DATA_ERROR');
(* Because of incorrect adler32 *)
err := inflateEnd(d_stream);
CHECK_ERR(err, 'inflateEnd');
WriteLn('after inflateSync(): hel', PChar(uncompr));
end;
{$ENDIF}
(* ===========================================================================
* Test deflate with preset dictionary
*)
{$IFDEF TEST_DICT}
procedure test_dict_deflate(compr: Pointer; comprLen: LongInt);
var c_stream: z_stream; (* compression stream *)
err: Integer;
begin
c_stream.zalloc := NIL;
c_stream.zfree := NIL;
c_stream.opaque := NIL;
err := deflateInit(c_stream, Z_BEST_COMPRESSION);
CHECK_ERR(err, 'deflateInit');
err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary));
CHECK_ERR(err, 'deflateSetDictionary');
dictId := c_stream.adler;
c_stream.next_out := compr;
c_stream.avail_out := Integer(comprLen);
c_stream.next_in := hello;
c_stream.avail_in := StrLen(hello)+1;
err := deflate(c_stream, Z_FINISH);
if err <> Z_STREAM_END then
EXIT_ERR('deflate should report Z_STREAM_END');
err := deflateEnd(c_stream);
CHECK_ERR(err, 'deflateEnd');
end;
{$ENDIF}
(* ===========================================================================
* Test inflate with a preset dictionary
*)
{$IFDEF TEST_DICT}
procedure test_dict_inflate(compr: Pointer; comprLen: LongInt;
uncompr: Pointer; uncomprLen: LongInt);
var err: Integer;
d_stream: z_stream; (* decompression stream *)
begin
StrCopy(PChar(uncompr), 'garbage');
d_stream.zalloc := NIL;
d_stream.zfree := NIL;
d_stream.opaque := NIL;
d_stream.next_in := compr;
d_stream.avail_in := Integer(comprLen);
err := inflateInit(d_stream);
CHECK_ERR(err, 'inflateInit');
d_stream.next_out := uncompr;
d_stream.avail_out := Integer(uncomprLen);
while TRUE do
begin
err := inflate(d_stream, Z_NO_FLUSH);
if err = Z_STREAM_END then
break;
if err = Z_NEED_DICT then
begin
if d_stream.adler <> dictId then
EXIT_ERR('unexpected dictionary');
err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary));
end;
CHECK_ERR(err, 'inflate with dict');
end;
err := inflateEnd(d_stream);
CHECK_ERR(err, 'inflateEnd');
if StrComp(PChar(uncompr), hello) <> 0 then
EXIT_ERR('bad inflate with dict')
else
WriteLn('inflate with dictionary: ', PChar(uncompr));
end;
{$ENDIF}
var compr, uncompr: Pointer;
comprLen, uncomprLen: LongInt;
begin
if zlibVersion^ <> ZLIB_VERSION[1] then
EXIT_ERR('Incompatible zlib version');
WriteLn('zlib version: ', zlibVersion);
WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags]));
comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *)
uncomprLen := comprLen;
GetMem(compr, comprLen);
GetMem(uncompr, uncomprLen);
if (compr = NIL) or (uncompr = NIL) then
EXIT_ERR('Out of memory');
(* compr and uncompr are cleared to avoid reading uninitialized
* data and to ensure that uncompr compresses well.
*)
FillChar(compr^, comprLen, 0);
FillChar(uncompr^, uncomprLen, 0);
{$IFDEF TEST_COMPRESS}
WriteLn('** Testing compress');
test_compress(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
{$IFDEF TEST_GZIO}
WriteLn('** Testing gzio');
if ParamCount >= 1 then
test_gzio(ParamStr(1), uncompr, uncomprLen)
else
test_gzio(TESTFILE, uncompr, uncomprLen);
{$ENDIF}
{$IFDEF TEST_DEFLATE}
WriteLn('** Testing deflate with small buffers');
test_deflate(compr, comprLen);
{$ENDIF}
{$IFDEF TEST_INFLATE}
WriteLn('** Testing inflate with small buffers');
test_inflate(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
{$IFDEF TEST_DEFLATE}
WriteLn('** Testing deflate with large buffers');
test_large_deflate(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
{$IFDEF TEST_INFLATE}
WriteLn('** Testing inflate with large buffers');
test_large_inflate(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
{$IFDEF TEST_FLUSH}
WriteLn('** Testing deflate with full flush');
test_flush(compr, comprLen);
{$ENDIF}
{$IFDEF TEST_SYNC}
WriteLn('** Testing inflateSync');
test_sync(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
comprLen := uncomprLen;
{$IFDEF TEST_DICT}
WriteLn('** Testing deflate and inflate with preset dictionary');
test_dict_deflate(compr, comprLen);
test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
{$ENDIF}
FreeMem(compr, comprLen);
FreeMem(uncompr, uncomprLen);
end.

76
contrib/pascal/readme.txt Normal file
View File

@@ -0,0 +1,76 @@
This directory contains a Pascal (Delphi, Kylix) interface to the
zlib data compression library.
Directory listing
=================
zlibd32.mak makefile for Borland C++
example.pas usage example of zlib
zlibpas.pas the Pascal interface to zlib
readme.txt this file
Compatibility notes
===================
- Although the name "zlib" would have been more normal for the
zlibpas unit, this name is already taken by Borland's ZLib unit.
This is somehow unfortunate, because that unit is not a genuine
interface to the full-fledged zlib functionality, but a suite of
class wrappers around zlib streams. Other essential features,
such as checksums, are missing.
It would have been more appropriate for that unit to have a name
like "ZStreams", or something similar.
- The C and zlib-supplied types int, uInt, long, uLong, etc. are
translated directly into Pascal types of similar sizes (Integer,
LongInt, etc.), to avoid namespace pollution. In particular,
there is no conversion of unsigned int into a Pascal unsigned
integer. The Word type is non-portable and has the same size
(16 bits) both in a 16-bit and in a 32-bit environment, unlike
Integer. Even if there is a 32-bit Cardinal type, there is no
real need for unsigned int in zlib under a 32-bit environment.
- Except for the callbacks, the zlib function interfaces are
assuming the calling convention normally used in Pascal
(__pascal for DOS and Windows16, __fastcall for Windows32).
Since the cdecl keyword is used, the old Turbo Pascal does
not work with this interface.
- The gz* function interfaces are not translated, to avoid
interfacing problems with the C runtime library. Besides,
gzprintf(gzFile file, const char *format, ...)
cannot be translated into Pascal.
Legal issues
============
The zlibpas interface is:
Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler.
Copyright (C) 1998 by Bob Dellaca.
Copyright (C) 2003 by Cosmin Truta.
The example program is:
Copyright (C) 1995-2003 by Jean-loup Gailly.
Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali.
Copyright (C) 2003 by Cosmin Truta.
This software is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

View File

@@ -0,0 +1,93 @@
# Makefile for zlib
# For use with Delphi and C++ Builder under Win32
# Updated for zlib 1.2.x by Cosmin Truta
# ------------ Borland C++ ------------
# This project uses the Delphi (fastcall/register) calling convention:
LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
CC = bcc32
LD = bcc32
AR = tlib
# do not use "-pr" in CFLAGS
CFLAGS = -a -d -k- -O2 $(LOC)
LDFLAGS =
# variables
ZLIB_LIB = zlib.lib
OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzio.obj infback.obj
OBJ2 = inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzio.obj+infback.obj
OBJP2 = +inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
# targets
all: $(ZLIB_LIB) example.exe minigzip.exe
.c.obj:
$(CC) -c $(CFLAGS) $*.c
adler32.obj: adler32.c zlib.h zconf.h
compress.obj: compress.c zlib.h zconf.h
crc32.obj: crc32.c zlib.h zconf.h crc32.h
deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
gzio.obj: gzio.c zutil.h zlib.h zconf.h
infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h inffixed.h
inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h
inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
inffast.h inffixed.h
inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
uncompr.obj: uncompr.c zlib.h zconf.h
zutil.obj: zutil.c zutil.h zlib.h zconf.h
example.obj: example.c zlib.h zconf.h
minigzip.obj: minigzip.c zlib.h zconf.h
# For the sake of the old Borland make,
# the command line is cut to fit in the MS-DOS 128 byte limit:
$(ZLIB_LIB): $(OBJ1) $(OBJ2)
-del $(ZLIB_LIB)
$(AR) $(ZLIB_LIB) $(OBJP1)
$(AR) $(ZLIB_LIB) $(OBJP2)
# testing
test: example.exe minigzip.exe
example
echo hello world | minigzip | minigzip -d
example.exe: example.obj $(ZLIB_LIB)
$(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
minigzip.exe: minigzip.obj $(ZLIB_LIB)
$(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
# cleanup
clean:
-del *.obj
-del *.exe
-del *.lib
-del *.tds
-del zlib.bak
-del foo.gz

235
contrib/pascal/zlibpas.pas Normal file
View File

@@ -0,0 +1,235 @@
(* zlibpas -- Pascal interface to the zlib data compression library
*
* Copyright (C) 2003 Cosmin Truta.
* Derived from original sources by Bob Dellaca.
* For conditions of distribution and use, see copyright notice in readme.txt
*)
unit zlibpas;
interface
const
ZLIB_VERSION = '1.2.1';
type
alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
cdecl;
free_func = procedure(opaque, address: Pointer);
cdecl;
in_func = function(opaque: Pointer; var buf: PByte): Integer;
cdecl;
out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer;
cdecl;
z_streamp = ^z_stream;
z_stream = packed record
next_in: PChar; (* next input byte *)
avail_in: Integer; (* number of bytes available at next_in *)
total_in: LongInt; (* total nb of input bytes read so far *)
next_out: PChar; (* next output byte should be put there *)
avail_out: Integer; (* remaining free space at next_out *)
total_out: LongInt; (* total nb of bytes output so far *)
msg: PChar; (* last error message, NULL if no error *)
state: Pointer; (* not visible by applications *)
zalloc: alloc_func; (* used to allocate the internal state *)
zfree: free_func; (* used to free the internal state *)
opaque: Pointer; (* private data object passed to zalloc and zfree *)
data_type: Integer; (* best guess about the data type: ascii or binary *)
adler: LongInt; (* adler32 value of the uncompressed data *)
reserved: LongInt; (* reserved for future use *)
end;
(* constants *)
const
Z_NO_FLUSH = 0;
Z_PARTIAL_FLUSH = 1;
Z_SYNC_FLUSH = 2;
Z_FULL_FLUSH = 3;
Z_FINISH = 4;
Z_OK = 0;
Z_STREAM_END = 1;
Z_NEED_DICT = 2;
Z_ERRNO = -1;
Z_STREAM_ERROR = -2;
Z_DATA_ERROR = -3;
Z_MEM_ERROR = -4;
Z_BUF_ERROR = -5;
Z_VERSION_ERROR = -6;
Z_NO_COMPRESSION = 0;
Z_BEST_SPEED = 1;
Z_BEST_COMPRESSION = 9;
Z_DEFAULT_COMPRESSION = -1;
Z_FILTERED = 1;
Z_HUFFMAN_ONLY = 2;
Z_RLE = 3;
Z_DEFAULT_STRATEGY = 0;
Z_BINARY = 0;
Z_ASCII = 1;
Z_UNKNOWN = 2;
Z_DEFLATED = 8;
(* basic functions *)
function zlibVersion: PChar;
function deflateInit(var strm: z_stream; level: Integer): Integer;
function deflate(var strm: z_stream; flush: Integer): Integer;
function deflateEnd(var strm: z_stream): Integer;
function inflateInit(var strm: z_stream): Integer;
function inflate(var strm: z_stream; flush: Integer): Integer;
function inflateEnd(var strm: z_stream): Integer;
(* advanced functions *)
function deflateInit2(var strm: z_stream; level, method, windowBits,
memLevel, strategy: Integer): Integer;
function deflateSetDictionary(var strm: z_stream; const dictionary: PChar;
dictLength: Integer): Integer;
function deflateCopy(var dest, source: z_stream): Integer;
function deflateReset(var strm: z_stream): Integer;
function deflateParams(var strm: z_stream; level, strategy: Integer): Integer;
function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt;
function deflatePrime(var strm: z_stream; bits, value: Integer): Integer;
function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
function inflateSetDictionary(var strm: z_stream; const dictionary: PChar;
dictLength: Integer): Integer;
function inflateSync(var strm: z_stream): Integer;
function inflateCopy(var dest, source: z_stream): Integer;
function inflateReset(var strm: z_stream): Integer;
function inflateBackInit(var strm: z_stream;
windowBits: Integer; window: PChar): Integer;
function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer;
out_fn: out_func; out_desc: Pointer): Integer;
function inflateBackEnd(var strm: z_stream): Integer;
function zlibCompileFlags: LongInt;
(* utility functions *)
function compress(dest: PChar; var destLen: LongInt;
const source: PChar; sourceLen: LongInt): Integer;
function compress2(dest: PChar; var destLen: LongInt;
const source: PChar; sourceLen: LongInt;
level: Integer): Integer;
function compressBound(sourceLen: LongInt): LongInt;
function uncompress(dest: PChar; var destLen: LongInt;
const source: PChar; sourceLen: LongInt): Integer;
(* checksum functions *)
function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt;
function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt;
(* various hacks, don't look :) *)
function deflateInit_(var strm: z_stream; level: Integer;
const version: PChar; stream_size: Integer): Integer;
function inflateInit_(var strm: z_stream; const version: PChar;
stream_size: Integer): Integer;
function deflateInit2_(var strm: z_stream;
level, method, windowBits, memLevel, strategy: Integer;
const version: PChar; stream_size: Integer): Integer;
function inflateInit2_(var strm: z_stream; windowBits: Integer;
const version: PChar; stream_size: Integer): Integer;
function inflateBackInit_(var strm: z_stream;
windowBits: Integer; window: PChar;
const version: PChar; stream_size: Integer): Integer;
implementation
{$L adler32.obj}
{$L compress.obj}
{$L crc32.obj}
{$L deflate.obj}
{$L infback.obj}
{$L inffast.obj}
{$L inflate.obj}
{$L inftrees.obj}
{$L trees.obj}
{$L uncompr.obj}
{$L zutil.obj}
function adler32; external;
function compress; external;
function compress2; external;
function compressBound; external;
function crc32; external;
function deflate; external;
function deflateBound; external;
function deflateCopy; external;
function deflateEnd; external;
function deflateInit_; external;
function deflateInit2_; external;
function deflateParams; external;
function deflateReset; external;
function deflateSetDictionary; external;
function inflate; external;
function inflateBack; external;
function inflateBackEnd; external;
function inflateBackInit_; external;
function inflateCopy; external;
function inflateEnd; external;
function inflateInit_; external;
function inflateInit2_; external;
function inflateReset; external;
function inflateSetDictionary; external;
function inflateSync; external;
function uncompress; external;
function zlibCompileFlags; external;
function zlibVersion; external;
function deflateInit(var strm: z_stream; level: Integer): Integer;
begin
Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
end;
function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel,
strategy: Integer): Integer;
begin
Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
ZLIB_VERSION, sizeof(z_stream));
end;
function inflateInit(var strm: z_stream): Integer;
begin
Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
end;
function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
begin
Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream));
end;
function inflateBackInit(var strm: z_stream;
windowBits: Integer; window: PChar): Integer;
begin
Result := inflateBackInit_(strm, windowBits, window,
ZLIB_VERSION, sizeof(z_stream));
end;
function _malloc(Size: Integer): Pointer; cdecl;
begin
GetMem(Result, Size);
end;
procedure _free(Block: Pointer); cdecl;
begin
FreeMem(Block);
end;
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
begin
FillChar(P^, count, B);
end;
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
begin
Move(source^, dest^, count);
end;
end.

View File

@@ -14,7 +14,7 @@ Why I wrote this --
puff.c was written to document the deflate format unambiguously, by virtue of puff.c was written to document the deflate format unambiguously, by virtue of
being working C code. It is meant to supplement RFC 1951, which formally being working C code. It is meant to supplement RFC 1951, which formally
describes the deflate format. I have received many questions on details of the describes the deflate format. I have received many questions on details of the
deflate format, and I hope that reading this code will answer those questions. deflate format, and I hope that reading this code will answer those questions.
puff.c is heavily commented with details of the deflate format, especially puff.c is heavily commented with details of the deflate format, especially
those little nooks and cranies of the format that might not be obvious from a those little nooks and cranies of the format that might not be obvious from a
specification. specification.
@@ -29,10 +29,10 @@ applications, but if you must ...
Include puff.h in your code, which provides this prototype: Include puff.h in your code, which provides this prototype:
int puff(unsigned char *dest, /* pointer to destination pointer */ int puff(unsigned char *dest, /* pointer to destination pointer */
unsigned long *destlen, /* amount of output space */ unsigned long *destlen, /* amount of output space */
unsigned char *source, /* pointer to source data pointer */ unsigned char *source, /* pointer to source data pointer */
unsigned long *sourcelen); /* amount of input available */ unsigned long *sourcelen); /* amount of input available */
Then you can call puff() to decompress a deflate stream that is in memory in Then you can call puff() to decompress a deflate stream that is in memory in
its entirety at source, to a sufficiently sized block of memory for the its entirety at source, to a sufficiently sized block of memory for the

View File

@@ -58,7 +58,7 @@
* - Add FIXLCODES #define * - Add FIXLCODES #define
* 1.5 6 Apr 2002 - Minor comment fixes * 1.5 6 Apr 2002 - Minor comment fixes
* 1.6 7 Aug 2002 - Minor format changes * 1.6 7 Aug 2002 - Minor format changes
* 1.7 3 Mar 2002 - Added test code for distribution * 1.7 3 Mar 2003 - Added test code for distribution
* - Added zlib-like license * - Added zlib-like license
*/ */
@@ -805,7 +805,7 @@ local unsigned char *yank(char *name, unsigned long *len)
buf = NULL; buf = NULL;
} }
fclose(in); fclose(in);
*len = size; *len = size;
return buf; return buf;
} }

View File

@@ -18,7 +18,7 @@
misrepresented as being the original software. misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
Mark Adler madler@alumni.caltech.edu Mark Adler madler@alumni.caltech.edu
*/ */

View File

@@ -1,149 +1,149 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>
#include "zlib.h" #include "zlib.h"
int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr) int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr)
{ {
FILE* stream; FILE* stream;
void* ptr; void* ptr;
int retVal=1; int retVal=1;
stream=fopen(filename, "rb"); stream=fopen(filename, "rb");
if (stream==NULL) if (stream==NULL)
return 0; return 0;
fseek(stream,0,SEEK_END); fseek(stream,0,SEEK_END);
*plFileSize=ftell(stream); *plFileSize=ftell(stream);
fseek(stream,0,SEEK_SET); fseek(stream,0,SEEK_SET);
ptr=malloc((*plFileSize)+1); ptr=malloc((*plFileSize)+1);
if (ptr==NULL) if (ptr==NULL)
retVal=0; retVal=0;
else else
{ {
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
retVal=0; retVal=0;
} }
fclose(stream); fclose(stream);
*pFilePtr=ptr; *pFilePtr=ptr;
return retVal; return retVal;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int BlockSizeCompress=0x8000; int BlockSizeCompress=0x8000;
int BlockSizeUncompress=0x8000; int BlockSizeUncompress=0x8000;
int cprLevel=Z_DEFAULT_COMPRESSION ; int cprLevel=Z_DEFAULT_COMPRESSION ;
long lFileSize; long lFileSize;
unsigned char* FilePtr; unsigned char* FilePtr;
long lBufferSizeCpr; long lBufferSizeCpr;
long lBufferSizeUncpr; long lBufferSizeUncpr;
long lCompressedSize=0; long lCompressedSize=0;
unsigned char* CprPtr; unsigned char* CprPtr;
unsigned char* UncprPtr; unsigned char* UncprPtr;
long lSizeCpr,lSizeUncpr; long lSizeCpr,lSizeUncpr;
DWORD dwGetTick; DWORD dwGetTick;
if (argc<=1) if (argc<=1)
{ {
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
return 0; return 0;
} }
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
{ {
printf("error reading %s\n",argv[1]); printf("error reading %s\n",argv[1]);
return 1; return 1;
} }
else printf("file %s read, %u bytes\n",argv[1],lFileSize); else printf("file %s read, %u bytes\n",argv[1],lFileSize);
if (argc>=3) if (argc>=3)
BlockSizeCompress=atol(argv[2]); BlockSizeCompress=atol(argv[2]);
if (argc>=4) if (argc>=4)
BlockSizeUncompress=atol(argv[3]); BlockSizeUncompress=atol(argv[3]);
if (argc>=5) if (argc>=5)
cprLevel=(int)atol(argv[4]); cprLevel=(int)atol(argv[4]);
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
lBufferSizeUncpr = lBufferSizeCpr; lBufferSizeUncpr = lBufferSizeCpr;
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
dwGetTick=GetTickCount(); dwGetTick=GetTickCount();
{ {
z_stream zcpr; z_stream zcpr;
int ret=Z_OK; int ret=Z_OK;
long lOrigToDo = lFileSize; long lOrigToDo = lFileSize;
long lOrigDone = 0; long lOrigDone = 0;
int step=0; int step=0;
memset(&zcpr,0,sizeof(z_stream)); memset(&zcpr,0,sizeof(z_stream));
deflateInit(&zcpr,cprLevel); deflateInit(&zcpr,cprLevel);
zcpr.next_in = FilePtr; zcpr.next_in = FilePtr;
zcpr.next_out = CprPtr; zcpr.next_out = CprPtr;
do do
{ {
long all_read_before = zcpr.total_in; long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
zcpr.avail_out = BlockSizeCompress; zcpr.avail_out = BlockSizeCompress;
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before); lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before); lOrigToDo -= (zcpr.total_in-all_read_before);
step++; step++;
} while (ret==Z_OK); } while (ret==Z_OK);
lSizeCpr=zcpr.total_out; lSizeCpr=zcpr.total_out;
deflateEnd(&zcpr); deflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick; dwGetTick=GetTickCount()-dwGetTick;
printf("total compress size = %u, in %u step\n",lSizeCpr,step); printf("total compress size = %u, in %u step\n",lSizeCpr,step);
printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.); printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.);
} }
dwGetTick=GetTickCount(); dwGetTick=GetTickCount();
{ {
z_stream zcpr; z_stream zcpr;
int ret=Z_OK; int ret=Z_OK;
long lOrigToDo = lSizeCpr; long lOrigToDo = lSizeCpr;
long lOrigDone = 0; long lOrigDone = 0;
int step=0; int step=0;
memset(&zcpr,0,sizeof(z_stream)); memset(&zcpr,0,sizeof(z_stream));
inflateInit(&zcpr); inflateInit(&zcpr);
zcpr.next_in = CprPtr; zcpr.next_in = CprPtr;
zcpr.next_out = UncprPtr; zcpr.next_out = UncprPtr;
do do
{ {
long all_read_before = zcpr.total_in; long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
zcpr.avail_out = BlockSizeUncompress; zcpr.avail_out = BlockSizeUncompress;
ret=inflate(&zcpr,Z_SYNC_FLUSH); ret=inflate(&zcpr,Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before); lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before); lOrigToDo -= (zcpr.total_in-all_read_before);
step++; step++;
} while (ret==Z_OK); } while (ret==Z_OK);
lSizeUncpr=zcpr.total_out; lSizeUncpr=zcpr.total_out;
inflateEnd(&zcpr); inflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick; dwGetTick=GetTickCount()-dwGetTick;
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.); printf("time = %u msec = %f sec\n\n",dwGetTick,dwGetTick/(double)1000.);
} }
if (lSizeUncpr==lFileSize) if (lSizeUncpr==lFileSize)
{ {
if (memcmp(FilePtr,UncprPtr,lFileSize)==0) if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
printf("compare ok\n"); printf("compare ok\n");
} }
return 0; return 0;
} }

View File

@@ -19,7 +19,7 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
PreprocessorDefinitions="WIN32;ZLIB_DLL;_DEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE" MinimalRebuild="TRUE"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="5" RuntimeLibrary="5"
@@ -63,7 +63,7 @@
Optimization="2" Optimization="2"
InlineFunctionExpansion="1" InlineFunctionExpansion="1"
OmitFramePointers="TRUE" OmitFramePointers="TRUE"
PreprocessorDefinitions="WIN32;ZLIB_DLL;NDEBUG;_CONSOLE" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE"
StringPooling="TRUE" StringPooling="TRUE"
RuntimeLibrary="4" RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE" EnableFunctionLevelLinking="TRUE"
@@ -116,7 +116,7 @@
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"> Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter> </Filter>
<File <File
RelativePath="zlib.lib"> RelativePath="zlibwapi.lib">
</File> </File>
</Files> </Files>
<Globals> <Globals>

View File

@@ -1,14 +1,14 @@
CC=cc CC=cc
CFLAGS=-g CFLAGS=-g
untgz: untgz.o ../../libz.a untgz: untgz.o ../../libz.a
$(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
untgz.o: untgz.c ../../zlib.h untgz.o: untgz.c ../../zlib.h
$(CC) $(CFLAGS) -c -I../.. untgz.c $(CC) $(CFLAGS) -c -I../.. untgz.c
../../libz.a: ../../libz.a:
cd ../..; make cd ../..; ./configure; make
clean: clean:
rm -f untgz untgz.o *~ rm -f untgz untgz.o *~

View File

@@ -0,0 +1,17 @@
CC=cl
CFLAGS=-MD
untgz.exe: untgz.obj ..\..\zlib.lib
$(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib
untgz.obj: untgz.c ..\..\zlib.h
$(CC) $(CFLAGS) -c -I..\.. untgz.c
..\..\zlib.lib:
cd ..\..
$(MAKE) -f win32\makefile.msc
cd contrib\untgz
clean:
-del untgz.obj
-del untgz.exe

View File

@@ -1,63 +0,0 @@
# Makefile for zlib. Modified for mingw32
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile,
#
# make -fmakefile.w32
#
CC=gcc
# Generate dependencies (see end of the file)
CPPFLAGS=-MMD
#CFLAGS=-MMD -O
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
#CFLAGS=-MMD -g -DDEBUG
CFLAGS=-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
# The default value of RM is "rm -f."
# If "rm.exe" is not found, uncomment:
# RM=del
LD=gcc
LDLIBS=-L. -lz
LDFLAGS=-s
INCL=zlib.h zconf.h
LIBS=libz.a
AR=ar rcs
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 = minigzip.o untgz.o
all: minigzip.exe untgz.exe
rebuild: clean all
libz.a: $(OBJS)
$(AR) $@ $(OBJS)
%.exe : %.o $(LIBS)
$(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)
.PHONY : clean
clean:
$(RM) *.d *.o *.exe libz.a foo.gz
DEPS := $(wildcard *.d)
ifneq ($(DEPS),)
include $(DEPS)
endif

View File

@@ -1,8 +1,9 @@
/* /*
* untgz.c -- Display contents and/or extract file from * untgz.c -- Display contents and extract files from a gzip'd TAR file
* a gzip'd TAR file *
* written by "Pedro A. Aranda Guti\irrez" <paag@tid.es> * written by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
* adaptation to Unix by Jean-loup Gailly <jloup@gzip.org> * adaptation to Unix by Jean-loup Gailly <jloup@gzip.org>
* various fixes by Cosmin Truta <cosmint@cs.ubbcluj.ro>
*/ */
#include <stdio.h> #include <stdio.h>
@@ -10,7 +11,9 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include "zlib.h"
#ifdef unix #ifdef unix
# include <unistd.h> # include <unistd.h>
#else #else
@@ -18,58 +21,54 @@
# include <io.h> # include <io.h>
#endif #endif
#include "zlib.h"
#ifdef WIN32 #ifdef WIN32
#include <windows.h>
# ifndef F_OK # ifndef F_OK
# define F_OK (0) # define F_OK 0
# endif # endif
# define mkdir(dirname,mode) _mkdir(dirname)
# ifdef _MSC_VER # ifdef _MSC_VER
# define mkdir(dirname,mode) _mkdir(dirname)
# define strdup(str) _strdup(str) # define strdup(str) _strdup(str)
# define unlink(fn) _unlink(fn)
# define access(path,mode) _access(path,mode) # define access(path,mode) _access(path,mode)
# else
# define mkdir(dirname,mode) _mkdir(dirname)
# endif # endif
#else #else
# include <utime.h> # include <utime.h>
#endif #endif
/* Values used in typeflag field. */ /* values used in typeflag field */
#define REGTYPE '0' /* regular file */ #define REGTYPE '0' /* regular file */
#define AREGTYPE '\0' /* regular file */ #define AREGTYPE '\0' /* regular file */
#define LNKTYPE '1' /* link */ #define LNKTYPE '1' /* link */
#define SYMTYPE '2' /* reserved */ #define SYMTYPE '2' /* reserved */
#define CHRTYPE '3' /* character special */ #define CHRTYPE '3' /* character special */
#define BLKTYPE '4' /* block special */ #define BLKTYPE '4' /* block special */
#define DIRTYPE '5' /* directory */ #define DIRTYPE '5' /* directory */
#define FIFOTYPE '6' /* FIFO special */ #define FIFOTYPE '6' /* FIFO special */
#define CONTTYPE '7' /* reserved */ #define CONTTYPE '7' /* reserved */
#define BLOCKSIZE 512 #define BLOCKSIZE 512
struct tar_header struct tar_header
{ /* byte offset */ { /* byte offset */
char name[100]; /* 0 */ char name[100]; /* 0 */
char mode[8]; /* 100 */ char mode[8]; /* 100 */
char uid[8]; /* 108 */ char uid[8]; /* 108 */
char gid[8]; /* 116 */ char gid[8]; /* 116 */
char size[12]; /* 124 */ char size[12]; /* 124 */
char mtime[12]; /* 136 */ char mtime[12]; /* 136 */
char chksum[8]; /* 148 */ char chksum[8]; /* 148 */
char typeflag; /* 156 */ char typeflag; /* 156 */
char linkname[100]; /* 157 */ char linkname[100]; /* 157 */
char magic[6]; /* 257 */ char magic[6]; /* 257 */
char version[2]; /* 263 */ char version[2]; /* 263 */
char uname[32]; /* 265 */ char uname[32]; /* 265 */
char gname[32]; /* 297 */ char gname[32]; /* 297 */
char devmajor[8]; /* 329 */ char devmajor[8]; /* 329 */
char devminor[8]; /* 337 */ char devminor[8]; /* 337 */
char prefix[155]; /* 345 */ char prefix[155]; /* 345 */
/* 500 */ /* 500 */
}; };
union tar_buffer { union tar_buffer {
@@ -77,137 +76,190 @@ union tar_buffer {
struct tar_header header; struct tar_header header;
}; };
enum { TGZ_EXTRACT = 0, TGZ_LIST }; enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID };
static char *TGZfname OF((const char *)); char *TGZfname OF((const char *));
void TGZnotfound OF((const char *)); void TGZnotfound OF((const char *));
int getoct OF((char *, int)); int getoct OF((char *, int));
char *strtime OF((time_t *)); char *strtime OF((time_t *));
int ExprMatch OF((char *,char *)); int setfiletime OF((char *, time_t));
int ExprMatch OF((char *, char *));
int makedir OF((char *)); int makedir OF((char *));
int matchname OF((int,int,char **,char *)); int matchname OF((int, int, char **, char *));
void error OF((const char *)); void error OF((const char *));
int tar OF((gzFile, int, int, int, char **)); int tar OF((gzFile, int, int, int, char **));
void help OF((int)); void help OF((int));
int main OF((int, char **)); int main OF((int, char **));
char *prog; char *prog;
/* This will give a benign warning */ const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL };
static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", ".tar", NULL }; /* return the file name of the TGZ archive */
/* or NULL if it does not exist */
/* Return the real name of the TGZ archive */ char *TGZfname (const char *arcname)
/* or NULL if it does not exist. */
static char *TGZfname OF((const char *fname))
{ {
static char buffer[1024]; static char buffer[1024];
int origlen,i; int origlen,i;
strcpy(buffer,fname); strcpy(buffer,arcname);
origlen = strlen(buffer); origlen = strlen(buffer);
for (i=0; TGZprefix[i]; i++) for (i=0; TGZsuffix[i]; i++)
{ {
strcpy(buffer+origlen,TGZprefix[i]); strcpy(buffer+origlen,TGZsuffix[i]);
if (access(buffer,F_OK) == 0) if (access(buffer,F_OK) == 0)
return buffer; return buffer;
} }
return NULL; return NULL;
} }
/* error message for the filename */ /* error message for the filename */
void TGZnotfound OF((const char *fname)) void TGZnotfound (const char *arcname)
{ {
int i; int i;
fprintf(stderr,"%s : couldn't find ",prog); fprintf(stderr,"%s: Couldn't find ",prog);
for (i=0;TGZprefix[i];i++) for (i=0;TGZsuffix[i];i++)
fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n", fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n",
fname, arcname,
TGZprefix[i]); TGZsuffix[i]);
exit(1); exit(1);
} }
/* help functions */ /* convert octal digits to int */
/* on error return -1 */
int getoct(char *p,int width) int getoct (char *p,int width)
{ {
int result = 0; int result = 0;
char c; char c;
while (width --) while (width--)
{ {
c = *p++; c = *p++;
if (c == ' ')
continue;
if (c == 0) if (c == 0)
break; break;
if (c == ' ')
continue;
if (c < '0' || c > '7')
return -1;
result = result * 8 + (c - '0'); result = result * 8 + (c - '0');
} }
return result; return result;
} }
/* convert time_t to string */
/* use the "YYYY/MM/DD hh:mm:ss" format */
char *strtime (time_t *t) char *strtime (time_t *t)
{ {
struct tm *local; struct tm *local;
static char result[32]; static char result[32];
local = localtime(t); local = localtime(t);
sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d", sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d",
local->tm_mday, local->tm_mon+1, local->tm_year+1900, local->tm_year+1900, local->tm_mon+1, local->tm_mday,
local->tm_hour, local->tm_min, local->tm_sec); local->tm_hour, local->tm_min, local->tm_sec);
return result; return result;
} }
/* set file time */
int setfiletime (char *fname,time_t ftime)
{
#ifdef WIN32
static int isWinNT = -1;
SYSTEMTIME st;
FILETIME locft, modft;
struct tm *loctm;
HANDLE hFile;
int result;
loctm = localtime(&ftime);
if (loctm == NULL)
return -1;
st.wYear = (WORD)loctm->tm_year + 1900;
st.wMonth = (WORD)loctm->tm_mon + 1;
st.wDayOfWeek = (WORD)loctm->tm_wday;
st.wDay = (WORD)loctm->tm_mday;
st.wHour = (WORD)loctm->tm_hour;
st.wMinute = (WORD)loctm->tm_min;
st.wSecond = (WORD)loctm->tm_sec;
st.wMilliseconds = 0;
if (!SystemTimeToFileTime(&st, &locft) ||
!LocalFileTimeToFileTime(&locft, &modft))
return -1;
if (isWinNT < 0)
isWinNT = (GetVersion() < 0x80000000) ? 1 : 0;
hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
(isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0),
NULL);
if (hFile == INVALID_HANDLE_VALUE)
return -1;
result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1;
CloseHandle(hFile);
return result;
#else
struct utimbuf settime;
settime.actime = settime.modtime = ftime;
return utime(fname,&settime);
#endif
}
/* regular expression matching */ /* regular expression matching */
#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) #define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
int ExprMatch(char *string,char *expr) int ExprMatch (char *string,char *expr)
{ {
while (1) while (1)
{ {
if (ISSPECIAL(*expr)) if (ISSPECIAL(*expr))
{ {
if (*expr == '/') if (*expr == '/')
{ {
if (*string != '\\' && *string != '/') if (*string != '\\' && *string != '/')
return 0; return 0;
string ++; expr++; string ++; expr++;
} }
else if (*expr == '*') else if (*expr == '*')
{ {
if (*expr ++ == 0) if (*expr ++ == 0)
return 1; return 1;
while (*++string != *expr) while (*++string != *expr)
if (*string == 0) if (*string == 0)
return 0; return 0;
} }
} }
else else
{ {
if (*string != *expr) if (*string != *expr)
return 0; return 0;
if (*expr++ == 0) if (*expr++ == 0)
return 1; return 1;
string++; string++;
} }
} }
} }
/* recursive make directory */
/* abort if you get an ENOENT errno somewhere in the middle */ /* recursive mkdir */
/* e.g. ignore error "mkdir on existing directory" */ /* abort on ENOENT; ignore other errors like "directory already exists" */
/* */
/* return 1 if OK */ /* return 1 if OK */
/* 0 on error */ /* 0 on error */
@@ -216,7 +268,7 @@ int makedir (char *newdir)
char *buffer = strdup(newdir); char *buffer = strdup(newdir);
char *p; char *p;
int len = strlen(buffer); int len = strlen(buffer);
if (len <= 0) { if (len <= 0) {
free(buffer); free(buffer);
return 0; return 0;
@@ -224,7 +276,7 @@ int makedir (char *newdir)
if (buffer[len-1] == '/') { if (buffer[len-1] == '/') {
buffer[len-1] = '\0'; buffer[len-1] = '\0';
} }
if (mkdir(buffer, 0775) == 0) if (mkdir(buffer, 0755) == 0)
{ {
free(buffer); free(buffer);
return 1; return 1;
@@ -234,28 +286,29 @@ int makedir (char *newdir)
while (1) while (1)
{ {
char hold; char hold;
while(*p && *p != '\\' && *p != '/') while(*p && *p != '\\' && *p != '/')
p++; p++;
hold = *p; hold = *p;
*p = 0; *p = 0;
if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT)) if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT))
{ {
fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer); fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer);
free(buffer); free(buffer);
return 0; return 0;
} }
if (hold == 0) if (hold == 0)
break; break;
*p++ = hold; *p++ = hold;
} }
free(buffer); free(buffer);
return 1; return 1;
} }
int matchname (int arg,int argc,char **argv,char *fname) int matchname (int arg,int argc,char **argv,char *fname)
{ {
if (arg == argc) /* no arguments given (untgz tgzarchive) */ if (arg == argc) /* no arguments given (untgz tgzarchive) */
return 1; return 1;
while (arg < argc) while (arg < argc)
@@ -266,7 +319,7 @@ int matchname (int arg,int argc,char **argv,char *fname)
} }
/* Tar file list or extract */ /* tar file list or extract */
int tar (gzFile in,int action,int arg,int argc,char **argv) int tar (gzFile in,int action,int arg,int argc,char **argv)
{ {
@@ -277,145 +330,140 @@ int tar (gzFile in,int action,int arg,int argc,char **argv)
int remaining = 0; int remaining = 0;
FILE *outfile = NULL; FILE *outfile = NULL;
char fname[BLOCKSIZE]; char fname[BLOCKSIZE];
int tarmode;
time_t tartime; time_t tartime;
if (action == TGZ_LIST) if (action == TGZ_LIST)
printf(" day time size file\n" printf(" date time size file\n"
" ---------- -------- --------- -------------------------------------\n"); " ---------- -------- --------- -------------------------------------\n");
while (1) while (1)
{ {
len = gzread(in, &buffer, BLOCKSIZE); len = gzread(in, &buffer, BLOCKSIZE);
if (len < 0) if (len < 0)
error (gzerror(in, &err)); error(gzerror(in, &err));
/* /*
* Always expect complete blocks to process * Always expect complete blocks to process
* the tar information. * the tar information.
*/ */
if (len != BLOCKSIZE) if (len != BLOCKSIZE)
error("gzread: incomplete block read"); {
action = TGZ_INVALID; /* force error exit */
remaining = 0; /* force I/O cleanup */
}
/* /*
* If we have to get a tar header * If we have to get a tar header
*/ */
if (getheader == 1) if (getheader == 1)
{ {
/* /*
* if we met the end of the tar * if we met the end of the tar
* or the end-of-tar block, * or the end-of-tar block,
* we are done * we are done
*/ */
if ((len == 0) || (buffer.header.name[0]== 0)) break; if ((len == 0) || (buffer.header.name[0] == 0)) break;
tartime = (time_t)getoct(buffer.header.mtime,12); tarmode = getoct(buffer.header.mode,8);
strcpy(fname,buffer.header.name); tartime = (time_t)getoct(buffer.header.mtime,12);
if (tarmode == -1 || tartime == (time_t)-1)
switch (buffer.header.typeflag) {
{ buffer.header.name[0] = 0;
case DIRTYPE: action = TGZ_INVALID;
if (action == TGZ_LIST) }
printf(" %s <dir> %s\n",strtime(&tartime),fname);
if (action == TGZ_EXTRACT) strcpy(fname,buffer.header.name);
makedir(fname);
break; switch (buffer.header.typeflag)
case REGTYPE: {
case AREGTYPE: case DIRTYPE:
remaining = getoct(buffer.header.size,12); if (action == TGZ_LIST)
if (action == TGZ_LIST) printf(" %s <dir> %s\n",strtime(&tartime),fname);
printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); if (action == TGZ_EXTRACT)
if (action == TGZ_EXTRACT) {
{ makedir(fname);
if ((remaining) && (matchname(arg,argc,argv,fname))) setfiletime(fname,tartime);
{ }
outfile = fopen(fname,"wb"); break;
if (outfile == NULL) { case REGTYPE:
/* try creating directory */ case AREGTYPE:
char *p = strrchr(fname, '/'); remaining = getoct(buffer.header.size,12);
if (p != NULL) { if (remaining == -1)
*p = '\0'; {
makedir(fname); action = TGZ_INVALID;
*p = '/'; break;
outfile = fopen(fname,"wb"); }
} if (action == TGZ_LIST)
} printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
fprintf(stderr, else if (action == TGZ_EXTRACT)
"%s %s\n", {
(outfile) ? "Extracting" : "Couldn't create", if (matchname(arg,argc,argv,fname))
fname); {
} outfile = fopen(fname,"wb");
else if (outfile == NULL) {
outfile = NULL; /* try creating directory */
} char *p = strrchr(fname, '/');
/* if (p != NULL) {
* could have no contents *p = '\0';
*/ makedir(fname);
getheader = (remaining) ? 0 : 1; *p = '/';
break; outfile = fopen(fname,"wb");
default: }
if (action == TGZ_LIST) }
printf(" %s <---> %s\n",strtime(&tartime),fname); if (outfile != NULL)
break; printf("Extracting %s\n",fname);
} else
} fprintf(stderr, "%s: Couldn't create %s",prog,fname);
}
else
outfile = NULL;
}
getheader = 0;
break;
default:
if (action == TGZ_LIST)
printf(" %s <---> %s\n",strtime(&tartime),fname);
break;
}
}
else else
{ {
unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
if ((action == TGZ_EXTRACT) && (outfile != NULL)) if (outfile != NULL)
{ {
if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
{ {
fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname); fprintf(stderr,"%s: Error writing %s -- skipping\n",prog,fname);
fclose(outfile); fclose(outfile);
unlink(fname); outfile = NULL;
} remove(fname);
} }
remaining -= bytes; }
if (remaining == 0) remaining -= bytes;
{ }
getheader = 1;
if ((action == TGZ_EXTRACT) && (outfile != NULL))
{
#ifdef WIN32
HANDLE hFile;
FILETIME ftm,ftLocal;
SYSTEMTIME st;
struct tm localt;
fclose(outfile);
localt = *localtime(&tartime); if (remaining == 0)
{
getheader = 1;
if (outfile != NULL)
{
fclose(outfile);
outfile = NULL;
if (action != TGZ_INVALID)
setfiletime(fname,tartime);
}
}
hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE, /*
0, NULL, OPEN_EXISTING, 0, NULL); * Abandon if errors are found
*/
st.wYear = (WORD)localt.tm_year+1900; if (action == TGZ_INVALID)
st.wMonth = (WORD)localt.tm_mon; {
st.wDayOfWeek = (WORD)localt.tm_wday; error("broken archive");
st.wDay = (WORD)localt.tm_mday; break;
st.wHour = (WORD)localt.tm_hour; }
st.wMinute = (WORD)localt.tm_min;
st.wSecond = (WORD)localt.tm_sec;
st.wMilliseconds = 0;
SystemTimeToFileTime(&st,&ftLocal);
LocalFileTimeToFileTime(&ftLocal,&ftm);
SetFileTime(hFile,&ftm,NULL,&ftm);
CloseHandle(hFile);
outfile = NULL;
#else
struct utimbuf settime;
settime.actime = settime.modtime = tartime;
fclose(outfile);
outfile = NULL;
utime(fname,&settime);
#endif
}
}
}
} }
if (gzclose(in) != Z_OK) if (gzclose(in) != Z_OK)
error("failed gzclose"); error("failed gzclose");
@@ -423,73 +471,74 @@ int tar (gzFile in,int action,int arg,int argc,char **argv)
} }
/* =========================================================== */ /* ============================================================ */
void help(int exitval) void help(int exitval)
{ {
fprintf(stderr, printf("untgz version 0.2\n"
"untgz v 0.1\n" " using zlib version %s\n\n",
" an sample application of zlib 1.0.4\n\n" zlibVersion());
"Usage : untgz TGZfile to extract all files\n" printf("Usage: untgz file.tgz extract all files\n"
" untgz TGZfile fname ... to extract selected files\n" " untgz file.tgz fname ... extract selected files\n"
" untgz -l TGZfile to list archive contents\n" " untgz -l file.tgz list archive contents\n"
" untgz -h to display this help\n\n"); " untgz -h display this help\n");
exit(exitval); exit(exitval);
} }
void error(const char *msg) void error(const char *msg)
{ {
fprintf(stderr, "%s: %s\n", prog, msg); fprintf(stderr, "%s: %s\n", prog, msg);
exit(1); exit(1);
} }
/* ====================================================================== */ /* ============================================================ */
int _CRT_glob = 0; /* disable globbing of the arguments */ #if defined(WIN32) && defined(__GNUC__)
int _CRT_glob = 0; /* disable argument globbing in MinGW */
#endif
int main(int argc,char **argv) int main(int argc,char **argv)
{ {
int action = TGZ_EXTRACT; int action = TGZ_EXTRACT;
int arg = 1; int arg = 1;
char *TGZfile; char *TGZfile;
gzFile *f; gzFile *f;
prog = strrchr(argv[0],'\\'); prog = strrchr(argv[0],'\\');
if (prog == NULL) if (prog == NULL)
{ {
prog = strrchr(argv[0],'/'); prog = strrchr(argv[0],'/');
if (prog == NULL) if (prog == NULL)
{ {
prog = strrchr(argv[0],':'); prog = strrchr(argv[0],':');
if (prog == NULL) if (prog == NULL)
prog = argv[0]; prog = argv[0];
else else
prog++; prog++;
} }
else else
prog++; prog++;
} }
else else
prog++; prog++;
if (argc == 1) if (argc == 1)
help(0); help(0);
if (strcmp(argv[arg],"-l") == 0) if (strcmp(argv[arg],"-l") == 0)
{ {
action = TGZ_LIST; action = TGZ_LIST;
if (argc == ++arg) if (argc == ++arg)
help(0); help(0);
} }
else if (strcmp(argv[arg],"-h") == 0) else if (strcmp(argv[arg],"-h") == 0)
{ {
help(0); help(0);
} }
if ((TGZfile = TGZfname(argv[arg])) == NULL) if ((TGZfile = TGZfname(argv[arg])) == NULL)
TGZnotfound(argv[arg]); TGZnotfound(argv[arg]);
++arg; ++arg;
if ((action == TGZ_LIST) && (arg != argc)) if ((action == TGZ_LIST) && (arg != argc))
@@ -502,20 +551,18 @@ int main(int argc,char **argv)
{ {
case TGZ_LIST: case TGZ_LIST:
case TGZ_EXTRACT: case TGZ_EXTRACT:
f = gzopen(TGZfile,"rb"); f = gzopen(TGZfile,"rb");
if (f == NULL) if (f == NULL)
{ {
fprintf(stderr,"%s: Couldn't gzopen %s\n", fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile);
prog, return 1;
TGZfile); }
return 1; exit(tar(f, action, arg, argc, argv));
}
exit(tar(f, action, arg, argc, argv));
break; break;
default: default:
error("Unknown option!"); error("Unknown option");
exit(1); exit(1);
} }
return 0; return 0;

View File

@@ -67,3 +67,94 @@ Declare Function gzclose Lib "ZLIB32.DLL"
-Jon Caruana -Jon Caruana
jon-net@usa.net jon-net@usa.net
Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
Here is another example from Michael <michael_borgsys@hotmail.com> that he
says conforms to the VB guidelines, and that solves the problem of not
knowing the uncompressed size by storing it at the end of the file:
'Calling the functions:
'bracket meaning: <parameter> [optional] {Range of possible values}
'Call subCompressFile(<path with filename to compress> [, <path with
filename to write to>, [level of compression {1..9}]])
'Call subUncompressFile(<path with filename to compress>)
Option Explicit
Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller'
Private Const SUCCESS As Long = 0
Private Const strFilExt As String = ".cpr"
Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef
dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long,
ByVal level As Integer) As Long
Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef
dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long)
As Long
Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal
strargCprFilPth As String, Optional ByVal intLvl As Integer = 9)
Dim strCprPth As String
Dim lngOriSiz As Long
Dim lngCprSiz As Long
Dim bytaryOri() As Byte
Dim bytaryCpr() As Byte
lngOriSiz = FileLen(strargOriFilPth)
ReDim bytaryOri(lngOriSiz - 1)
Open strargOriFilPth For Binary Access Read As #1
Get #1, , bytaryOri()
Close #1
strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth)
'Select file path and name
strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) =
strFilExt, "", strFilExt) 'Add file extension if not exists
lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit
more space then original file size
ReDim bytaryCpr(lngCprSiz - 1)
If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) =
SUCCESS Then
lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100
ReDim Preserve bytaryCpr(lngCprSiz - 1)
Open strCprPth For Binary Access Write As #1
Put #1, , bytaryCpr()
Put #1, , lngOriSiz 'Add the the original size value to the end
(last 4 bytes)
Close #1
Else
MsgBox "Compression error"
End If
Erase bytaryCpr
Erase bytaryOri
End Sub
Public Sub subUncompressFile(ByVal strargFilPth As String)
Dim bytaryCpr() As Byte
Dim bytaryOri() As Byte
Dim lngOriSiz As Long
Dim lngCprSiz As Long
Dim strOriPth As String
lngCprSiz = FileLen(strargFilPth)
ReDim bytaryCpr(lngCprSiz - 1)
Open strargFilPth For Binary Access Read As #1
Get #1, , bytaryCpr()
Close #1
'Read the original file size value:
lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _
+ bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _
+ bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _
+ bytaryCpr(lngCprSiz - 4)
ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value
ReDim bytaryOri(lngOriSiz - 1)
If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS
Then
strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt))
Open strOriPth For Binary Access Write As #1
Put #1, , bytaryOri()
Close #1
Else
MsgBox "Uncompression error"
End If
Erase bytaryCpr
Erase bytaryOri
End Sub
Public Property Get lngPercentSmaller() As Long
lngPercentSmaller = lngpvtPcnSml
End Property

Some files were not shown because too many files have changed in this diff Show More