diff options
-rw-r--r-- | ChangeLog | 61 | ||||
-rw-r--r-- | Make_vms.com | 2 | ||||
-rw-r--r-- | Makefile | 119 | ||||
-rw-r--r-- | Makefile.bor | 2 | ||||
-rw-r--r-- | Makefile.in | 130 | ||||
-rw-r--r-- | Makefile.qnx | 75 | ||||
-rw-r--r-- | README | 101 | ||||
-rw-r--r-- | adler32.c | 4 | ||||
-rw-r--r-- | compress.c | 7 | ||||
-rwxr-xr-x | configure | 81 | ||||
-rw-r--r-- | crc32.c | 60 | ||||
-rw-r--r-- | deflate.c | 399 | ||||
-rw-r--r-- | deflate.h | 26 | ||||
-rw-r--r-- | example.c | 322 | ||||
-rw-r--r-- | gzio.c | 370 | ||||
-rw-r--r-- | infblock.c | 25 | ||||
-rw-r--r-- | infblock.h | 8 | ||||
-rw-r--r-- | infcodes.c | 11 | ||||
-rw-r--r-- | infcodes.h | 2 | ||||
-rw-r--r-- | inffast.c | 11 | ||||
-rw-r--r-- | inffast.h | 2 | ||||
-rw-r--r-- | inflate.c | 103 | ||||
-rw-r--r-- | inftrees.c | 77 | ||||
-rw-r--r-- | inftrees.h | 2 | ||||
-rw-r--r-- | infutil.c | 8 | ||||
-rw-r--r-- | infutil.h | 29 | ||||
-rw-r--r-- | minigzip.c | 21 | ||||
-rw-r--r-- | trees.c | 134 | ||||
-rw-r--r-- | uncompr.c | 6 | ||||
-rw-r--r-- | zconf.h | 86 | ||||
-rw-r--r-- | zlib.h | 259 | ||||
-rw-r--r-- | zutil.c | 46 | ||||
-rw-r--r-- | zutil.h | 25 |
33 files changed, 1836 insertions, 778 deletions
@@ -1,6 +1,67 @@ | |||
1 | 1 | ||
2 | ChangeLog file for zlib | 2 | ChangeLog file for zlib |
3 | 3 | ||
4 | Changes in 1.0 (15 Jan 96) | ||
5 | - allow preset dictionary shared between compressor and decompressor | ||
6 | - allow compression level 0 (no compression) | ||
7 | - add deflateParams in zlib.h: allow dynamic change of compression level | ||
8 | and compression strategy. | ||
9 | - test large buffers and deflateParams in example.c | ||
10 | - add optional "configure" to build zlib as a shared library | ||
11 | - suppress Makefile.qnx, use configure instead | ||
12 | - fixed deflate for 64-bit systems (detected on Cray) | ||
13 | - fixed inflate_blocks for 64-bit systems (detected on Alpha) | ||
14 | - declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) | ||
15 | - always return Z_BUF_ERROR when deflate() has nothing to do | ||
16 | - deflateInit and inflateInit are now macros to allow version checking | ||
17 | - prefix all global functions and types with z_ with -DZ_PREFIX | ||
18 | - make falloc completely reentrant (inftrees.c) | ||
19 | - fixed very unlikely race condition in ct_static_init | ||
20 | - free in reverse order of allocation to help memory manager | ||
21 | - use zlib-1.0/* instead of zlib/* inside the tar.gz | ||
22 | - make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith | ||
23 | -Wconversion -Wstrict-prototypes -Wmissing-prototypes" | ||
24 | - allow gzread on concatenated .gz files | ||
25 | - deflateEnd now returns Z_DATA_ERROR if it was premature | ||
26 | - deflate is finally (?) fully deterministic (no matches beyond end of input) | ||
27 | - Document Z_SYNC_FLUSH | ||
28 | - add uninstall in Makefile | ||
29 | - Check for __cpluplus in zlib.h | ||
30 | - Better test in ct_align for partial flush | ||
31 | - avoid harmless warnings for Borland C++ | ||
32 | - initialize hash_head in deflate.c | ||
33 | - avoid warning on fdopen (gzio.c) for HP cc -Aa | ||
34 | - include stdlib.h for STDC compilers | ||
35 | - include errno.h for Cray | ||
36 | - ignore error if ranlib doesn't exist | ||
37 | - call ranlib twice for NeXTSTEP | ||
38 | - use exec_prefix instead of prefix for libz.a | ||
39 | - renamed ct_* as _tr_* to avoid conflict with applications | ||
40 | - clear z->msg in inflateInit2 before any error return | ||
41 | - initialize opaque in example.c, gzio.c, deflate.c and inflate.c | ||
42 | - fixed typo in zconf.h (_GNUC__ => __GNUC__) | ||
43 | - check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) | ||
44 | - fix typo in Make_vms.com (f$trnlnm -> f$getsyi) | ||
45 | - in fcalloc, normalize pointer if size > 65520 bytes | ||
46 | - don't use special fcalloc for 32 bit Borland C++ | ||
47 | - use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... | ||
48 | - use Z_BINARY instead of BINARY | ||
49 | - document that gzclose after gzdopen will close the file | ||
50 | - allow "a" as mode in gzopen. | ||
51 | - fix error checking in gzread | ||
52 | - allow skipping .gz extra-field on pipes | ||
53 | - added reference to Perl interface in README | ||
54 | - put the crc table in FAR data (I dislike more and more the medium model :) | ||
55 | - added get_crc_table | ||
56 | - added a dimension to all arrays (Borland C can't count). | ||
57 | - workaround Borland C bug in declaration of inflate_codes_new & inflate_fast | ||
58 | - guard against multiple inclusion of *.h (for precompiled header on Mac) | ||
59 | - Watcom C pretends to be Microsoft C small model even in 32 bit mode. | ||
60 | - don't use unsized arrays to avoid silly warnings by Visual C++: | ||
61 | warning C4746: 'inflate_mask' : unsized array treated as '__far' | ||
62 | (what's wrong with far data in far model?). | ||
63 | - define enum out of inflate_blocks_state to allow compilation with C++ | ||
64 | |||
4 | Changes in 0.95 (16 Aug 95) | 65 | Changes in 0.95 (16 Aug 95) |
5 | - fix MSDOS small and medium model (now easier to adapt to any compiler) | 66 | - fix MSDOS small and medium model (now easier to adapt to any compiler) |
6 | - inlined send_bits | 67 | - inlined send_bits |
diff --git a/Make_vms.com b/Make_vms.com index 2d09f7d..0008d00 100644 --- a/Make_vms.com +++ b/Make_vms.com | |||
@@ -4,7 +4,7 @@ $! | |||
4 | $! Look for the compiler used | 4 | $! Look for the compiler used |
5 | $! | 5 | $! |
6 | $ ccopt = "" | 6 | $ ccopt = "" |
7 | $ if f$trnlnm("HW_MODEL").ge.1024 | 7 | $ if f$getsyi("HW_MODEL").ge.1024 |
8 | $ then | 8 | $ then |
9 | $ ccopt = "/prefix=all"+ccopt | 9 | $ ccopt = "/prefix=all"+ccopt |
10 | $ comp = "__decc__=1" | 10 | $ comp = "__decc__=1" |
@@ -1,73 +1,130 @@ | |||
1 | # Makefile for zlib | 1 | # Makefile for zlib |
2 | # Copyright (C) 1995 Jean-loup Gailly. | 2 | # Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | # For conditions of distribution and use, see copyright notice in zlib.h | 3 | # For conditions of distribution and use, see copyright notice in zlib.h |
4 | 4 | ||
5 | # To compile and test, type: | ||
6 | # ./configure; make test | ||
7 | # The call of configure is optional if you don't have special requirements | ||
8 | |||
9 | # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: | ||
10 | # make install | ||
11 | # To install in $HOME instead of /usr/local, use: | ||
12 | # make install prefix=$HOME | ||
13 | |||
5 | CC=cc | 14 | CC=cc |
15 | |||
6 | CFLAGS=-O | 16 | CFLAGS=-O |
7 | #use -O3 for gcc to take advantage of inlining | 17 | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 |
8 | #CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" | ||
9 | #CFLAGS=-g -DDEBUG | 18 | #CFLAGS=-g -DDEBUG |
19 | #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||
20 | # -Wstrict-prototypes -Wmissing-prototypes | ||
21 | |||
10 | LDFLAGS=-L. -lz | 22 | LDFLAGS=-L. -lz |
23 | LDSHARED=$(CC) | ||
11 | 24 | ||
25 | VER=1.0 | ||
26 | LIBS=libz.a | ||
27 | |||
28 | AR=ar rc | ||
12 | RANLIB=ranlib | 29 | RANLIB=ranlib |
30 | TAR=tar | ||
13 | 31 | ||
14 | prefix=/usr/local | 32 | prefix=/usr/local |
33 | exec_prefix = $(prefix) | ||
15 | 34 | ||
16 | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | 35 | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ |
17 | zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | 36 | zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o |
18 | 37 | ||
19 | TEST_OBJS = example.o minigzip.o | 38 | TEST_OBJS = example.o minigzip.o |
20 | 39 | ||
40 | DISTFILES = README ChangeLog configure Makefile.in Makefile Makefile.msc \ | ||
41 | Makefile.bor Makefile.tc Make_vms.com descrip.mms *.[ch] | ||
42 | |||
21 | all: example minigzip | 43 | all: example minigzip |
22 | 44 | ||
23 | test: all | 45 | test: all |
24 | ./example | 46 | ./example |
25 | echo hello world | ./minigzip | ./minigzip -d | 47 | echo hello world | ./minigzip | ./minigzip -d |
26 | 48 | ||
27 | install: libz.a | ||
28 | -@mkdir $(prefix)/include | ||
29 | -@mkdir $(prefix)/lib | ||
30 | cp zlib.h zconf.h $(prefix)/include | ||
31 | chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||
32 | cp libz.a $(prefix)/lib | ||
33 | chmod 644 $(prefix)/lib/libz.a | ||
34 | |||
35 | libz.a: $(OBJS) | 49 | libz.a: $(OBJS) |
36 | ar rc $@ $(OBJS) | 50 | $(AR) $@ $(OBJS) |
37 | $(RANLIB) $@ | 51 | -@ ($(RANLIB) $@ || true) 2>/dev/null |
38 | 52 | ||
39 | example: example.o libz.a | 53 | libz.so.$(VER): $(OBJS) |
54 | $(LDSHARED) -o $@ $(OBJS) | ||
55 | rm -f libz.so; ln -s $@ libz.so | ||
56 | |||
57 | example: example.o $(LIBS) | ||
40 | $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | 58 | $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) |
41 | 59 | ||
42 | minigzip: minigzip.o libz.a | 60 | minigzip: minigzip.o $(LIBS) |
43 | $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | 61 | $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) |
44 | 62 | ||
63 | install: $(LIBS) | ||
64 | -@if [ ! $(prefix)/include ]; then mkdir $(prefix)/include; fi | ||
65 | -@if [ ! $(exec_prefix)/lib ]; then mkdir $(exec_prefix)/lib; fi | ||
66 | cp zlib.h zconf.h $(prefix)/include | ||
67 | chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||
68 | cp $(LIBS) $(exec_prefix)/lib | ||
69 | cd $(exec_prefix)/lib; chmod 644 $(LIBS) | ||
70 | -@(cd $(exec_prefix)/lib; $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||
71 | cd $(exec_prefix)/lib; if test -f libz.so.$(VER); then \ | ||
72 | ln -s libz.so.$(VER) libz.so; \ | ||
73 | fi | ||
74 | # The ranlib in install is needed on NeXTSTEP which checks file times | ||
75 | |||
76 | uninstall: | ||
77 | cd $(exec_prefix)/lib; rm -f $(LIBS); \ | ||
78 | if test -f libz.so; then \ | ||
79 | v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p'<$(prefix)/include/zlib.h`;\ | ||
80 | rm -f libz.so.$$v libz.so; \ | ||
81 | fi | ||
82 | cd $(prefix)/include; rm -f zlib.h zconf.h | ||
83 | |||
45 | clean: | 84 | clean: |
46 | rm -f *.o example minigzip libz.a foo.gz | 85 | rm -f *.o *~ example minigzip libz.a libz.so* foo.gz |
47 | 86 | ||
48 | zip: | 87 | zip: |
49 | zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \ | 88 | mv Makefile Makefile~; cp -p Makefile.in Makefile |
50 | descrip.mms *.[ch] | 89 | v=`sed -n -e 's/\./-/' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ |
51 | 90 | zip -ul9 zlib-$$v $(DISTFILES) | |
52 | tgz: | 91 | mv Makefile~ Makefile |
53 | cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ | 92 | |
54 | zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch] | 93 | dist: |
94 | mv Makefile Makefile~; cp -p Makefile.in Makefile | ||
95 | d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||
96 | rm -f $$d.tar.gz; \ | ||
97 | if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ | ||
98 | files=""; \ | ||
99 | for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ | ||
100 | cd ..; \ | ||
101 | GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ | ||
102 | if test ! -d $$d; then rm -f $$d; fi | ||
103 | mv Makefile~ Makefile | ||
104 | |||
105 | tags: | ||
106 | etags *.[ch] | ||
107 | |||
108 | depend: | ||
109 | makedepend -- $(CFLAGS) -- *.[ch] | ||
55 | 110 | ||
56 | # DO NOT DELETE THIS LINE -- make depend depends on it. | 111 | # DO NOT DELETE THIS LINE -- make depend depends on it. |
57 | 112 | ||
58 | adler32.o: zutil.h zlib.h zconf.h | 113 | adler32.o: zlib.h zconf.h |
59 | compress.o: zlib.h zconf.h | 114 | compress.o: zlib.h zconf.h |
60 | crc32.o: zutil.h zlib.h zconf.h | 115 | crc32.o: zlib.h zconf.h |
61 | deflate.o: deflate.h zutil.h zlib.h zconf.h | 116 | deflate.o: deflate.h zutil.h zlib.h zconf.h |
62 | example.o: zlib.h zconf.h | 117 | example.o: zlib.h zconf.h |
63 | gzio.o: zutil.h zlib.h zconf.h | 118 | gzio.o: zutil.h zlib.h zconf.h |
64 | infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | 119 | infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h |
65 | infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h | 120 | infcodes.o: zutil.h zlib.h zconf.h |
66 | inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | 121 | infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h |
122 | inffast.o: zutil.h zlib.h zconf.h inftrees.h | ||
123 | inffast.o: infblock.h infcodes.h infutil.h inffast.h | ||
67 | inflate.o: zutil.h zlib.h zconf.h infblock.h | 124 | inflate.o: zutil.h zlib.h zconf.h infblock.h |
68 | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | 125 | inftrees.o: zutil.h zlib.h zconf.h inftrees.h |
69 | infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h | 126 | infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h |
70 | minigzip.o: zlib.h zconf.h | 127 | minigzip.o: zlib.h zconf.h |
71 | trees.o: deflate.h zutil.h zlib.h zconf.h | 128 | trees.o: deflate.h zutil.h zlib.h zconf.h |
72 | uncompr.o: zlib.h zconf.h | 129 | uncompr.o: zlib.h zconf.h |
73 | zutil.o: zutil.h zlib.h zconf.h | 130 | zutil.o: zutil.h zlib.h zconf.h |
diff --git a/Makefile.bor b/Makefile.bor index 536b76d..2116563 100644 --- a/Makefile.bor +++ b/Makefile.bor | |||
@@ -18,7 +18,7 @@ CFLAGS=-O2 -Z $(MODEL) | |||
18 | CC=bcc | 18 | CC=bcc |
19 | LD=bcc | 19 | LD=bcc |
20 | LIB=tlib | 20 | LIB=tlib |
21 | # replace bcc with tcc for Turbo C++ 1.0 | 21 | # replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version |
22 | LDFLAGS=$(MODEL) | 22 | LDFLAGS=$(MODEL) |
23 | O=.obj | 23 | O=.obj |
24 | 24 | ||
diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..fe5b372 --- /dev/null +++ b/Makefile.in | |||
@@ -0,0 +1,130 @@ | |||
1 | # Makefile for zlib | ||
2 | # Copyright (C) 1995-1996 Jean-loup Gailly. | ||
3 | # For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | |||
5 | # To compile and test, type: | ||
6 | # ./configure; make test | ||
7 | # The call of configure is optional if you don't have special requirements | ||
8 | |||
9 | # To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: | ||
10 | # make install | ||
11 | # To install in $HOME instead of /usr/local, use: | ||
12 | # make install prefix=$HOME | ||
13 | |||
14 | CC=cc | ||
15 | |||
16 | CFLAGS=-O | ||
17 | #CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 | ||
18 | #CFLAGS=-g -DDEBUG | ||
19 | #CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ | ||
20 | # -Wstrict-prototypes -Wmissing-prototypes | ||
21 | |||
22 | LDFLAGS=-L. -lz | ||
23 | LDSHARED=$(CC) | ||
24 | |||
25 | VER=1.0 | ||
26 | LIBS=libz.a | ||
27 | |||
28 | AR=ar rc | ||
29 | RANLIB=ranlib | ||
30 | TAR=tar | ||
31 | |||
32 | prefix=/usr/local | ||
33 | exec_prefix = $(prefix) | ||
34 | |||
35 | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||
36 | zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||
37 | |||
38 | TEST_OBJS = example.o minigzip.o | ||
39 | |||
40 | DISTFILES = README ChangeLog configure Makefile.in Makefile Makefile.msc \ | ||
41 | Makefile.bor Makefile.tc Make_vms.com descrip.mms *.[ch] | ||
42 | |||
43 | all: example minigzip | ||
44 | |||
45 | test: all | ||
46 | ./example | ||
47 | echo hello world | ./minigzip | ./minigzip -d | ||
48 | |||
49 | libz.a: $(OBJS) | ||
50 | $(AR) $@ $(OBJS) | ||
51 | -@ ($(RANLIB) $@ || true) 2>/dev/null | ||
52 | |||
53 | libz.so.$(VER): $(OBJS) | ||
54 | $(LDSHARED) -o $@ $(OBJS) | ||
55 | rm -f libz.so; ln -s $@ libz.so | ||
56 | |||
57 | example: example.o $(LIBS) | ||
58 | $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | ||
59 | |||
60 | minigzip: minigzip.o $(LIBS) | ||
61 | $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||
62 | |||
63 | install: $(LIBS) | ||
64 | -@if [ ! $(prefix)/include ]; then mkdir $(prefix)/include; fi | ||
65 | -@if [ ! $(exec_prefix)/lib ]; then mkdir $(exec_prefix)/lib; fi | ||
66 | cp zlib.h zconf.h $(prefix)/include | ||
67 | chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||
68 | cp $(LIBS) $(exec_prefix)/lib | ||
69 | cd $(exec_prefix)/lib; chmod 644 $(LIBS) | ||
70 | -@(cd $(exec_prefix)/lib; $(RANLIB) libz.a || true) >/dev/null 2>&1 | ||
71 | cd $(exec_prefix)/lib; if test -f libz.so.$(VER); then \ | ||
72 | ln -s libz.so.$(VER) libz.so; \ | ||
73 | fi | ||
74 | # The ranlib in install is needed on NeXTSTEP which checks file times | ||
75 | |||
76 | uninstall: | ||
77 | cd $(exec_prefix)/lib; rm -f $(LIBS); \ | ||
78 | if test -f libz.so; then \ | ||
79 | v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p'<$(prefix)/include/zlib.h`;\ | ||
80 | rm -f libz.so.$$v libz.so; \ | ||
81 | fi | ||
82 | cd $(prefix)/include; rm -f zlib.h zconf.h | ||
83 | |||
84 | clean: | ||
85 | rm -f *.o *~ example minigzip libz.a libz.so* foo.gz | ||
86 | |||
87 | zip: | ||
88 | mv Makefile Makefile~; cp -p Makefile.in Makefile | ||
89 | v=`sed -n -e 's/\./-/' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||
90 | zip -ul9 zlib-$$v $(DISTFILES) | ||
91 | mv Makefile~ Makefile | ||
92 | |||
93 | dist: | ||
94 | mv Makefile Makefile~; cp -p Makefile.in Makefile | ||
95 | d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ | ||
96 | rm -f $$d.tar.gz; \ | ||
97 | if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ | ||
98 | files=""; \ | ||
99 | for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ | ||
100 | cd ..; \ | ||
101 | GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ | ||
102 | if test ! -d $$d; then rm -f $$d; fi | ||
103 | mv Makefile~ Makefile | ||
104 | |||
105 | tags: | ||
106 | etags *.[ch] | ||
107 | |||
108 | depend: | ||
109 | makedepend -- $(CFLAGS) -- *.[ch] | ||
110 | |||
111 | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||
112 | |||
113 | adler32.o: zlib.h zconf.h | ||
114 | compress.o: zlib.h zconf.h | ||
115 | crc32.o: zlib.h zconf.h | ||
116 | deflate.o: deflate.h zutil.h zlib.h zconf.h | ||
117 | example.o: zlib.h zconf.h | ||
118 | gzio.o: zutil.h zlib.h zconf.h | ||
119 | infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h | ||
120 | infcodes.o: zutil.h zlib.h zconf.h | ||
121 | infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h | ||
122 | inffast.o: zutil.h zlib.h zconf.h inftrees.h | ||
123 | inffast.o: infblock.h infcodes.h infutil.h inffast.h | ||
124 | inflate.o: zutil.h zlib.h zconf.h infblock.h | ||
125 | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||
126 | infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||
127 | minigzip.o: zlib.h zconf.h | ||
128 | trees.o: deflate.h zutil.h zlib.h zconf.h | ||
129 | uncompr.o: zlib.h zconf.h | ||
130 | zutil.o: zutil.h zlib.h zconf.h | ||
diff --git a/Makefile.qnx b/Makefile.qnx deleted file mode 100644 index 22b1a23..0000000 --- a/Makefile.qnx +++ /dev/null | |||
@@ -1,75 +0,0 @@ | |||
1 | # Makefile for zlib | ||
2 | # Copyright (C) 1995 Jean-loup Gailly. | ||
3 | # For conditions of distribution and use, see copyright notice in zlib.h | ||
4 | |||
5 | # Modified slightly for QNX by Chris Herborth (chrish@qnx.com) | ||
6 | |||
7 | CC=cc | ||
8 | CFLAGS=-4 -O -Q | ||
9 | #use -O3 for gcc to take advantage of inlining | ||
10 | #CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" | ||
11 | #CFLAGS=-g -DDEBUG | ||
12 | LDFLAGS=-L. -lz | ||
13 | |||
14 | #RANLIB=ranlib | ||
15 | |||
16 | prefix=/usr/local | ||
17 | |||
18 | OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ | ||
19 | zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o | ||
20 | |||
21 | TEST_OBJS = example.o minigzip.o | ||
22 | |||
23 | all: example minigzip | ||
24 | |||
25 | test: all | ||
26 | ./example | ||
27 | echo hello world | ./minigzip | ./minigzip -d | ||
28 | |||
29 | install: zlib.lib | ||
30 | -@mkdir $(prefix)/include | ||
31 | -@mkdir $(prefix)/lib | ||
32 | cp zlib.h zconf.h $(prefix)/include | ||
33 | chmod 644 $(prefix)/include/zlib.h $(prefix)/include/zconf.h | ||
34 | cp zlib.lib $(prefix)/lib | ||
35 | chmod 644 $(prefix)/lib/zlib.lib | ||
36 | |||
37 | zlib.lib: $(OBJS) | ||
38 | cc -A $@ $(OBJS) | ||
39 | # ar rc $@ $(OBJS) | ||
40 | # $(RANLIB) $@ | ||
41 | |||
42 | example: example.o zlib.lib | ||
43 | $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) | ||
44 | |||
45 | minigzip: minigzip.o zlib.lib | ||
46 | $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) | ||
47 | |||
48 | clean: | ||
49 | rm -f *.o example minigzip zlib.lib foo.gz | ||
50 | |||
51 | zip: | ||
52 | zip -ul9 zlib README ChangeLog Makefile Makefile.??? Makefile.?? *.[ch] | ||
53 | |||
54 | tgz: | ||
55 | cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ | ||
56 | zlib/Makefile.??? zlib/Makefile.?? zlib/*.[ch] | ||
57 | |||
58 | # DO NOT DELETE THIS LINE -- make depend depends on it. | ||
59 | |||
60 | adler32.o: zutil.h zlib.h zconf.h | ||
61 | compress.o: zlib.h zconf.h | ||
62 | crc32.o: zutil.h zlib.h zconf.h | ||
63 | deflate.o: deflate.h zutil.h zlib.h zconf.h | ||
64 | example.o: zlib.h zconf.h | ||
65 | gzio.o: zutil.h zlib.h zconf.h | ||
66 | infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h | ||
67 | infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h | ||
68 | inffast.o: zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h | ||
69 | inflate.o: zutil.h zlib.h zconf.h infblock.h | ||
70 | inftrees.o: zutil.h zlib.h zconf.h inftrees.h | ||
71 | infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h | ||
72 | minigzip.o: zlib.h zconf.h | ||
73 | trees.o: deflate.h zutil.h zlib.h zconf.h | ||
74 | uncompr.o: zlib.h zconf.h | ||
75 | zutil.o: zutil.h zlib.h zconf.h | ||
@@ -1,40 +1,75 @@ | |||
1 | zlib 0.95 is a beta version of a general purpose compression library. | 1 | zlib 1.0 is a general purpose data compression library. All the code |
2 | This should be the last version before the first official | 2 | is reentrant (thread safe). The data format used by the zlib library |
3 | version (1.0), so please test it now. (At least compile and run it with | 3 | is described in the files zlib-3.3.doc, deflate-1.3.doc and |
4 | "make test"). This version has no known bugs. | 4 | gzip-4.3.doc, available in ftp://ftp.uu.net/pub/archiving/zip/doc/ |
5 | |||
6 | The data format used by the zlib library is described in the | ||
7 | files zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available | ||
8 | in ftp.uu.net:/pub/archiving/zip/doc. | ||
9 | 5 | ||
10 | All functions of the compression library are documented in the file | 6 | All functions of the compression library are documented in the file |
11 | zlib.h. A usage example of the library is given in the file example.c | 7 | zlib.h. A usage example of the library is given in the file example.c |
12 | which also tests that the library is working correctly. Another | 8 | which also tests that the library is working correctly. Another |
13 | example is given in the file minigzip.c. | 9 | example is given in the file minigzip.c. The compression library itself |
14 | 10 | is composed of all source files except example.c and minigzip.c. | |
15 | To compile all files and run the test program, just type: make test | 11 | |
16 | (For MSDOS, use one of the special makefiles such as Makefile.msc; | 12 | To compile all files and run the test program, follow the instructions |
17 | for VMS, use Make_vms.com or descrip.mms.) | 13 | given at the top of Makefile. In short "make test; make install" |
18 | To install the zlib library (libz.a) in /usr/local/lib, type: make install | 14 | should work for most machines. For MSDOS, use one of the special |
19 | To install in a different directory, use for example: | 15 | makefiles such as Makefile.msc; for VMS, use Make_vms.com or descrip.mms. |
20 | make install prefix=$HOME | 16 | |
21 | This will install in $HOME/lib instead of /usr/local/lib. | 17 | Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov> or, |
22 | 18 | if this fails, to the addresses given below in the Copyright section. | |
23 | The changes made in version 0.95 are documented in the file ChangeLog. | 19 | |
24 | The main changes since 0.94 are: | 20 | The changes made in version 1.0 are documented in the file ChangeLog. |
25 | - fix MSDOS small and medium model (now easier to adapt to any compiler) | 21 | The main changes since 0.95 are: |
26 | - inlined send_bits | 22 | - allow preset dictionary shared between compressor and decompressor |
27 | - fix the final (:-) bug for deflate with flush (output was correct but | 23 | - allow compression level 0 (no compression) |
28 | not completely flushed in rare occasions). | 24 | - add deflateParams in zlib.h: allow dynamic change of compression level |
29 | 25 | and compression strategy. | |
30 | For MSDOS, the small and medium models have been tested only with Microsoft C. | 26 | - test large buffers and deflateParams in example.c |
31 | (This should now work for Borland C also, but I don't have a recent Borland | 27 | - add optional "configure" to build zlib as a shared library |
32 | compiler to test with.) The small model was tested with Turbo C but only with | 28 | - suppress Makefile.qnx, use configure instead |
33 | reduced performance to avoid any far allocation; it was tested with | 29 | - fixes for 64-bit systems (needed for Alpha and Cray) |
34 | -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 | 30 | - declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) |
35 | 31 | - always return Z_BUF_ERROR when deflate() has nothing to do | |
36 | 32 | - deflateInit and inflateInit are now macros to allow version checking | |
37 | (C) 1995 Jean-loup Gailly and Mark Adler | 33 | - prefix all global functions and types with z_ with -DZ_PREFIX |
34 | - fix some very unlikely race conditions in multi-threaded environment | ||
35 | - several minor fixes for better portability | ||
36 | - free in reverse order of allocation to help memory manager | ||
37 | - use zlib-1.0/* instead of zlib/* inside the tar.gz | ||
38 | - make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith | ||
39 | -Wconversion -Wstrict-prototypes -Wmissing-prototypes" | ||
40 | - allow gzread on concatenated .gz files | ||
41 | - deflateEnd now returns Z_DATA_ERROR if it was premature | ||
42 | - deflate is finally (?) fully deterministic | ||
43 | |||
44 | Notes for some targets: | ||
45 | |||
46 | - For Turbo C the small model is supported only with reduced performance to | ||
47 | avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 | ||
48 | |||
49 | - For 64-bit Iris, deflate.c must be compiled without any optimization. | ||
50 | With -O, one libpng test fails. The test works in 32 bit mode (with the | ||
51 | -32 compiler flag). | ||
52 | |||
53 | - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 | ||
54 | it works when compiled with cc. | ||
55 | |||
56 | - zlib doesn't work on HP-UX 9.05 with one cc compiler (the one not | ||
57 | accepting the -O option). It works with the other cc compiler. | ||
58 | |||
59 | A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk> | ||
60 | is in the CPAN (Comprehensive Perl Archive Network) sites, such as: | ||
61 | ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* | ||
62 | |||
63 | Acknowledgments: | ||
64 | |||
65 | The deflate format used by zlib was defined by Phil Katz. The deflate | ||
66 | and zlib specifications were written by Peter Deutsch. Thanks to all the | ||
67 | people who reported problems and suggested various improvements in zlib; | ||
68 | they are too numerous to cite here. | ||
69 | |||
70 | Copyright notice: | ||
71 | |||
72 | (C) 1995-1996 Jean-loup Gailly and Mark Adler | ||
38 | 73 | ||
39 | This software is provided 'as-is', without any express or implied | 74 | This software is provided 'as-is', without any express or implied |
40 | warranty. In no event will the authors be held liable for any damages | 75 | warranty. In no event will the authors be held liable for any damages |
@@ -1,5 +1,5 @@ | |||
1 | /* adler32.c -- compute the Adler-32 checksum of a data stream | 1 | /* adler32.c -- compute the Adler-32 checksum of a data stream |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -20,7 +20,7 @@ | |||
20 | /* ========================================================================= */ | 20 | /* ========================================================================= */ |
21 | uLong adler32(adler, buf, len) | 21 | uLong adler32(adler, buf, len) |
22 | uLong adler; | 22 | uLong adler; |
23 | Bytef *buf; | 23 | const Bytef *buf; |
24 | uInt len; | 24 | uInt len; |
25 | { | 25 | { |
26 | unsigned long s1 = adler & 0xffff; | 26 | unsigned long s1 = adler & 0xffff; |
@@ -1,5 +1,5 @@ | |||
1 | /* compress.c -- compress a memory buffer | 1 | /* compress.c -- compress a memory buffer |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -22,13 +22,13 @@ | |||
22 | int compress (dest, destLen, source, sourceLen) | 22 | int compress (dest, destLen, source, sourceLen) |
23 | Bytef *dest; | 23 | Bytef *dest; |
24 | uLongf *destLen; | 24 | uLongf *destLen; |
25 | Bytef *source; | 25 | const Bytef *source; |
26 | uLong sourceLen; | 26 | uLong sourceLen; |
27 | { | 27 | { |
28 | z_stream stream; | 28 | z_stream stream; |
29 | int err; | 29 | int err; |
30 | 30 | ||
31 | stream.next_in = source; | 31 | stream.next_in = (Bytef*)source; |
32 | stream.avail_in = (uInt)sourceLen; | 32 | stream.avail_in = (uInt)sourceLen; |
33 | /* Check for source > 64K on 16-bit machine: */ | 33 | /* Check for source > 64K on 16-bit machine: */ |
34 | if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; | 34 | if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; |
@@ -39,6 +39,7 @@ int compress (dest, destLen, source, sourceLen) | |||
39 | 39 | ||
40 | stream.zalloc = (alloc_func)0; | 40 | stream.zalloc = (alloc_func)0; |
41 | stream.zfree = (free_func)0; | 41 | stream.zfree = (free_func)0; |
42 | stream.opaque = (voidpf)0; | ||
42 | 43 | ||
43 | err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); | 44 | err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); |
44 | if (err != Z_OK) return err; | 45 | if (err != Z_OK) return err; |
diff --git a/configure b/configure new file mode 100755 index 0000000..6f3c729 --- /dev/null +++ b/configure | |||
@@ -0,0 +1,81 @@ | |||
1 | #!/bin/sh | ||
2 | # configure script for zlib. This script is needed only if | ||
3 | # you wish to build a shared library and your system supports them, | ||
4 | # of if you need special compiler, flags or install directory. | ||
5 | # Otherwise, you can just use directly "make test; make install" | ||
6 | # | ||
7 | # To impose specific compiler or flags or install directory, use for example: | ||
8 | # prefix=$HOME CC=cc CFLAGS="-O4" ./configure | ||
9 | # or for csh/tcsh users: | ||
10 | # (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) | ||
11 | # LDSHARED is the command to be used to create a shared library | ||
12 | |||
13 | LIBS=libz.a | ||
14 | VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` | ||
15 | AR=${AR-"ar rc"} | ||
16 | prefix=${prefix-/usr/local} | ||
17 | exec_prefix=${exec_prefix-$prefix} | ||
18 | |||
19 | test -z "$CC" && echo Checking for gcc... | ||
20 | test=ztest$$ | ||
21 | cat > $test.c <<EOF | ||
22 | int hello() { printf("hello\n"); } | ||
23 | EOF | ||
24 | if test -z "$CC" && (gcc -c -O3 $test.c) 2>/dev/null; then | ||
25 | CC=gcc | ||
26 | SFLAGS=${CFLAGS-"-fPIC -O3"} | ||
27 | CFLAGS=${CFLAGS-"-O3"} | ||
28 | LDSHARED=${LDSHARED-"gcc -shared"} | ||
29 | else | ||
30 | # find system name and corresponding cc options | ||
31 | CC=${CC-cc} | ||
32 | case `(uname -sr || echo unknown) 2>/dev/null` in | ||
33 | SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."} | ||
34 | CFLAGS=${CFLAGS-"-fast -xcg89"} | ||
35 | LDSHARED=${LDSHARED-"cc -G"};; | ||
36 | SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} | ||
37 | CFLAGS=${CFLAGS-"-O2"} | ||
38 | LDSHARED=${LDSHARED-"ld"};; | ||
39 | IRIX*) SFLAGS=${CFLAGS-"-O2 -rpath ."} | ||
40 | CFLAGS=${CFLAGS-"-O2"} | ||
41 | LDSHARED=${LDSHARED-"cc -shared"};; | ||
42 | QNX*) SFLAGS=${CFLAGS-"-4 -O -Q"} | ||
43 | CFLAGS=${CFLAGS-"-4 -O -Q"} | ||
44 | LDSHARED=${LDSHARED-"cc"} | ||
45 | LIBS=zlib.lib | ||
46 | AR="cc -A";; | ||
47 | # send working options for other systems to gzip@prep.ai.mit.edu | ||
48 | *) SFLAGS=${CFLAGS-"-O"} | ||
49 | CFLAGS=${CFLAGS-"-O"} | ||
50 | LDSHARED=${LDSHARED-"-shared"};; | ||
51 | esac | ||
52 | fi | ||
53 | |||
54 | echo Checking for shared library support... | ||
55 | # we must test in two steps (cc then ld), required at least on SunOS 4.x | ||
56 | if test "`$CC -c $SFLAGS $test.c 2>&1`" = "" && | ||
57 | test "`$LDSHARED -o $test.so $test.o 2>&1`" = ""; then | ||
58 | CFLAGS="$SFLAGS" | ||
59 | LIBS='libz.so.$(VER)' | ||
60 | echo Building shared library libz.so.$VER with $CC. | ||
61 | else | ||
62 | LDSHARED="$CC" | ||
63 | echo Building static library $LIBS version $VER with $CC. | ||
64 | fi | ||
65 | rm -f $test.[co] $test.so | ||
66 | |||
67 | # udpate Makefile | ||
68 | # ed -s Makefile <<EOF | ||
69 | sed < Makefile.in " | ||
70 | /^CC *=/s/=.*/=$CC/ | ||
71 | /^CFLAGS *=/s/=.*/=$CFLAGS/ | ||
72 | /^LDSHARED *=/s/=.*/=$LDSHARED/ | ||
73 | /^LIBS *=/s,=.*,=$LIBS, | ||
74 | /^AR *=/s/=.*/=$AR/ | ||
75 | /^VER *=/s/=.*/=$VER/ | ||
76 | /^prefix *=/s,=.*,=$prefix, | ||
77 | /^exec_prefix *=/s,=.*,=$exec_prefix, | ||
78 | " > Makefile | ||
79 | #w | ||
80 | #q | ||
81 | #EOF | ||
@@ -1,5 +1,5 @@ | |||
1 | /* crc32.c -- compute the CRC-32 of a data stream | 1 | /* crc32.c -- compute the CRC-32 of a data stream |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -10,23 +10,53 @@ | |||
10 | #define local static | 10 | #define local static |
11 | 11 | ||
12 | #ifdef DYNAMIC_CRC_TABLE | 12 | #ifdef DYNAMIC_CRC_TABLE |
13 | /* ========================================================================= | 13 | |
14 | * Make the crc table. This function is needed only if you want to compute | ||
15 | * the table dynamically. | ||
16 | */ | ||
17 | local int crc_table_empty = 1; | 14 | local int crc_table_empty = 1; |
18 | local uLong crc_table[256]; | 15 | local uLongf crc_table[256]; |
16 | local void make_crc_table OF((void)); | ||
17 | |||
18 | /* | ||
19 | Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: | ||
20 | x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. | ||
19 | 21 | ||
22 | Polynomials over GF(2) are represented in binary, one bit per coefficient, | ||
23 | with the lowest powers in the most significant bit. Then adding polynomials | ||
24 | is just exclusive-or, and multiplying a polynomial by x is a right shift by | ||
25 | one. If we call the above polynomial p, and represent a byte as the | ||
26 | polynomial q, also with the lowest power in the most significant bit (so the | ||
27 | byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, | ||
28 | where a mod b means the remainder after dividing a by b. | ||
29 | |||
30 | This calculation is done using the shift-register method of multiplying and | ||
31 | taking the remainder. The register is initialized to zero, and for each | ||
32 | incoming bit, x^32 is added mod p to the register if the bit is a one (where | ||
33 | x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by | ||
34 | x (which is shifting right by one and adding x^32 mod p if the bit shifted | ||
35 | out is a one). We start with the highest power (least significant bit) of | ||
36 | q and repeat for all eight bits of q. | ||
37 | |||
38 | The table is simply the CRC of all possible eight bit values. This is all | ||
39 | the information needed to generate CRC's on data a byte at a time for all | ||
40 | combinations of CRC register values and incoming bytes. | ||
41 | */ | ||
20 | local void make_crc_table() | 42 | local void make_crc_table() |
21 | { | 43 | { |
22 | uLong c; | 44 | uLong c; |
23 | int n, k; | 45 | int n, k; |
46 | uLong poly; /* polynomial exclusive-or pattern */ | ||
47 | /* terms of polynomial defining this crc (except x^32): */ | ||
48 | static Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; | ||
49 | |||
50 | /* make exclusive-or pattern from polynomial (0xedb88320L) */ | ||
51 | poly = 0L; | ||
52 | for (n = 0; n < sizeof(p)/sizeof(Byte); n++) | ||
53 | poly |= 1L << (31 - p[n]); | ||
24 | 54 | ||
25 | for (n = 0; n < 256; n++) | 55 | for (n = 0; n < 256; n++) |
26 | { | 56 | { |
27 | c = (uLong)n; | 57 | c = (uLong)n; |
28 | for (k = 0; k < 8; k++) | 58 | for (k = 0; k < 8; k++) |
29 | c = c & 1 ? 0xedb88320L ^ (c >> 1) : c >> 1; | 59 | c = c & 1 ? poly ^ (c >> 1) : c >> 1; |
30 | crc_table[n] = c; | 60 | crc_table[n] = c; |
31 | } | 61 | } |
32 | crc_table_empty = 0; | 62 | crc_table_empty = 0; |
@@ -35,7 +65,7 @@ local void make_crc_table() | |||
35 | /* ======================================================================== | 65 | /* ======================================================================== |
36 | * Table of CRC-32's of all single-byte values (made by make_crc_table) | 66 | * Table of CRC-32's of all single-byte values (made by make_crc_table) |
37 | */ | 67 | */ |
38 | local uLong crc_table[] = { | 68 | local uLongf crc_table[256] = { |
39 | 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, | 69 | 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, |
40 | 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, | 70 | 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, |
41 | 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, | 71 | 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, |
@@ -91,6 +121,18 @@ local uLong crc_table[] = { | |||
91 | }; | 121 | }; |
92 | #endif | 122 | #endif |
93 | 123 | ||
124 | /* ========================================================================= | ||
125 | * This function can be used by asm versions of crc32() | ||
126 | */ | ||
127 | uLongf *get_crc_table() | ||
128 | { | ||
129 | #ifdef DYNAMIC_CRC_TABLE | ||
130 | if (crc_table_empty) make_crc_table(); | ||
131 | #endif | ||
132 | return (uLongf *)crc_table; | ||
133 | } | ||
134 | |||
135 | /* ========================================================================= */ | ||
94 | #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); | 136 | #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); |
95 | #define DO2(buf) DO1(buf); DO1(buf); | 137 | #define DO2(buf) DO1(buf); DO1(buf); |
96 | #define DO4(buf) DO2(buf); DO2(buf); | 138 | #define DO4(buf) DO2(buf); DO2(buf); |
@@ -99,7 +141,7 @@ local uLong crc_table[] = { | |||
99 | /* ========================================================================= */ | 141 | /* ========================================================================= */ |
100 | uLong crc32(crc, buf, len) | 142 | uLong crc32(crc, buf, len) |
101 | uLong crc; | 143 | uLong crc; |
102 | Bytef *buf; | 144 | const Bytef *buf; |
103 | uInt len; | 145 | uInt len; |
104 | { | 146 | { |
105 | if (buf == Z_NULL) return 0L; | 147 | if (buf == Z_NULL) return 0L; |
@@ -1,5 +1,5 @@ | |||
1 | /* deflate.c -- compress data using the deflation algorithm | 1 | /* deflate.c -- compress data using the deflation algorithm |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -51,7 +51,7 @@ | |||
51 | 51 | ||
52 | #include "deflate.h" | 52 | #include "deflate.h" |
53 | 53 | ||
54 | char copyright[] = " deflate Copyright 1995 Jean-loup Gailly "; | 54 | char deflate_copyright[] = " deflate 1.0 Copyright 1995-1996 Jean-loup Gailly "; |
55 | /* | 55 | /* |
56 | If you use the zlib library in a product, an acknowledgment is welcome | 56 | If you use the zlib library in a product, an acknowledgment is welcome |
57 | in the documentation of your product. If for some reason you cannot | 57 | in the documentation of your product. If for some reason you cannot |
@@ -59,6 +59,31 @@ char copyright[] = " deflate Copyright 1995 Jean-loup Gailly "; | |||
59 | copyright string in the executable of your product. | 59 | copyright string in the executable of your product. |
60 | */ | 60 | */ |
61 | 61 | ||
62 | /* =========================================================================== | ||
63 | * Function prototypes. | ||
64 | */ | ||
65 | local void fill_window OF((deflate_state *s)); | ||
66 | local int deflate_stored OF((deflate_state *s, int flush)); | ||
67 | local int deflate_fast OF((deflate_state *s, int flush)); | ||
68 | local int deflate_slow OF((deflate_state *s, int flush)); | ||
69 | local void lm_init OF((deflate_state *s)); | ||
70 | local int longest_match OF((deflate_state *s, IPos cur_match)); | ||
71 | local void putShortMSB OF((deflate_state *s, uInt b)); | ||
72 | local void flush_pending OF((z_stream *strm)); | ||
73 | local int read_buf OF((z_stream *strm, charf *buf, unsigned size)); | ||
74 | #ifdef ASMV | ||
75 | void match_init OF((void)); /* asm code initialization */ | ||
76 | #endif | ||
77 | |||
78 | #ifdef DEBUG | ||
79 | local void check_match OF((deflate_state *s, IPos start, IPos match, | ||
80 | int length)); | ||
81 | #endif | ||
82 | |||
83 | /* =========================================================================== | ||
84 | * Local data | ||
85 | */ | ||
86 | |||
62 | #define NIL 0 | 87 | #define NIL 0 |
63 | /* Tail of hash chains */ | 88 | /* Tail of hash chains */ |
64 | 89 | ||
@@ -72,32 +97,35 @@ char copyright[] = " deflate Copyright 1995 Jean-loup Gailly "; | |||
72 | * See deflate.c for comments about the MIN_MATCH+1. | 97 | * See deflate.c for comments about the MIN_MATCH+1. |
73 | */ | 98 | */ |
74 | 99 | ||
100 | typedef int (*compress_func) OF((deflate_state *s, int flush)); | ||
101 | /* Compressing function */ | ||
102 | |||
75 | /* Values for max_lazy_match, good_match and max_chain_length, depending on | 103 | /* Values for max_lazy_match, good_match and max_chain_length, depending on |
76 | * the desired pack level (0..9). The values given below have been tuned to | 104 | * the desired pack level (0..9). The values given below have been tuned to |
77 | * exclude worst case performance for pathological files. Better values may be | 105 | * exclude worst case performance for pathological files. Better values may be |
78 | * found for specific files. | 106 | * found for specific files. |
79 | */ | 107 | */ |
80 | |||
81 | typedef struct config_s { | 108 | typedef struct config_s { |
82 | ush good_length; /* reduce lazy search above this match length */ | 109 | ush good_length; /* reduce lazy search above this match length */ |
83 | ush max_lazy; /* do not perform lazy search above this match length */ | 110 | ush max_lazy; /* do not perform lazy search above this match length */ |
84 | ush nice_length; /* quit search above this match length */ | 111 | ush nice_length; /* quit search above this match length */ |
85 | ush max_chain; | 112 | ush max_chain; |
113 | compress_func func; | ||
86 | } config; | 114 | } config; |
87 | 115 | ||
88 | local config configuration_table[10] = { | 116 | local config configuration_table[10] = { |
89 | /* good lazy nice chain */ | 117 | /* good lazy nice chain */ |
90 | /* 0 */ {0, 0, 0, 0}, /* store only */ | 118 | /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ |
91 | /* 1 */ {4, 4, 8, 4}, /* maximum speed, no lazy matches */ | 119 | /* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ |
92 | /* 2 */ {4, 5, 16, 8}, | 120 | /* 2 */ {4, 5, 16, 8, deflate_fast}, |
93 | /* 3 */ {4, 6, 32, 32}, | 121 | /* 3 */ {4, 6, 32, 32, deflate_fast}, |
94 | 122 | ||
95 | /* 4 */ {4, 4, 16, 16}, /* lazy matches */ | 123 | /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ |
96 | /* 5 */ {8, 16, 32, 32}, | 124 | /* 5 */ {8, 16, 32, 32, deflate_slow}, |
97 | /* 6 */ {8, 16, 128, 128}, | 125 | /* 6 */ {8, 16, 128, 128, deflate_slow}, |
98 | /* 7 */ {8, 32, 128, 256}, | 126 | /* 7 */ {8, 32, 128, 256, deflate_slow}, |
99 | /* 8 */ {32, 128, 258, 1024}, | 127 | /* 8 */ {32, 128, 258, 1024, deflate_slow}, |
100 | /* 9 */ {32, 258, 258, 4096}}; /* maximum compression */ | 128 | /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ |
101 | 129 | ||
102 | /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 | 130 | /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 |
103 | * For deflate_fast() (levels <= 3) good is ignored and lazy has a different | 131 | * For deflate_fast() (levels <= 3) good is ignored and lazy has a different |
@@ -110,28 +138,6 @@ local config configuration_table[10] = { | |||
110 | struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ | 138 | struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ |
111 | 139 | ||
112 | /* =========================================================================== | 140 | /* =========================================================================== |
113 | * Prototypes for local functions. | ||
114 | */ | ||
115 | |||
116 | local void fill_window OF((deflate_state *s)); | ||
117 | local int deflate_fast OF((deflate_state *s, int flush)); | ||
118 | local int deflate_slow OF((deflate_state *s, int flush)); | ||
119 | local void lm_init OF((deflate_state *s)); | ||
120 | local int longest_match OF((deflate_state *s, IPos cur_match)); | ||
121 | local void putShortMSB OF((deflate_state *s, uInt b)); | ||
122 | local void flush_pending OF((z_stream *strm)); | ||
123 | local int read_buf OF((z_stream *strm, charf *buf, unsigned size)); | ||
124 | #ifdef ASMV | ||
125 | void match_init OF((void)); /* asm code initialization */ | ||
126 | #endif | ||
127 | |||
128 | #ifdef DEBUG | ||
129 | local void check_match OF((deflate_state *s, IPos start, IPos match, | ||
130 | int length)); | ||
131 | #endif | ||
132 | |||
133 | |||
134 | /* =========================================================================== | ||
135 | * Update a hash value with the given input byte | 141 | * Update a hash value with the given input byte |
136 | * IN assertion: all calls to to UPDATE_HASH are made with consecutive | 142 | * IN assertion: all calls to to UPDATE_HASH are made with consecutive |
137 | * input characters, so that a running hash key can be computed from the | 143 | * input characters, so that a running hash key can be computed from the |
@@ -162,30 +168,43 @@ local void check_match OF((deflate_state *s, IPos start, IPos match, | |||
162 | zmemzero((charf *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); | 168 | zmemzero((charf *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); |
163 | 169 | ||
164 | /* ========================================================================= */ | 170 | /* ========================================================================= */ |
165 | int deflateInit (strm, level) | 171 | int deflateInit_(strm, level, version, stream_size) |
166 | z_stream *strm; | 172 | z_stream *strm; |
167 | int level; | 173 | int level; |
174 | const char *version; | ||
175 | int stream_size; | ||
168 | { | 176 | { |
169 | return deflateInit2 (strm, level, DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, 0); | 177 | return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, |
178 | Z_DEFAULT_STRATEGY, version, stream_size); | ||
170 | /* To do: ignore strm->next_in if we use it as window */ | 179 | /* To do: ignore strm->next_in if we use it as window */ |
171 | } | 180 | } |
172 | 181 | ||
173 | /* ========================================================================= */ | 182 | /* ========================================================================= */ |
174 | int deflateInit2 (strm, level, method, windowBits, memLevel, strategy) | 183 | int deflateInit2_(strm, level, method, windowBits, memLevel, strategy, |
184 | version, stream_size) | ||
175 | z_stream *strm; | 185 | z_stream *strm; |
176 | int level; | 186 | int level; |
177 | int method; | 187 | int method; |
178 | int windowBits; | 188 | int windowBits; |
179 | int memLevel; | 189 | int memLevel; |
180 | int strategy; | 190 | int strategy; |
191 | const char *version; | ||
192 | int stream_size; | ||
181 | { | 193 | { |
182 | deflate_state *s; | 194 | deflate_state *s; |
183 | int noheader = 0; | 195 | int noheader = 0; |
184 | 196 | ||
197 | if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || | ||
198 | stream_size != sizeof(z_stream)) { | ||
199 | return Z_VERSION_ERROR; | ||
200 | } | ||
185 | if (strm == Z_NULL) return Z_STREAM_ERROR; | 201 | if (strm == Z_NULL) return Z_STREAM_ERROR; |
186 | 202 | ||
187 | strm->msg = Z_NULL; | 203 | strm->msg = Z_NULL; |
188 | if (strm->zalloc == Z_NULL) strm->zalloc = zcalloc; | 204 | if (strm->zalloc == Z_NULL) { |
205 | strm->zalloc = zcalloc; | ||
206 | strm->opaque = (voidpf)0; | ||
207 | } | ||
189 | if (strm->zfree == Z_NULL) strm->zfree = zcfree; | 208 | if (strm->zfree == Z_NULL) strm->zfree = zcfree; |
190 | 209 | ||
191 | if (level == Z_DEFAULT_COMPRESSION) level = 6; | 210 | if (level == Z_DEFAULT_COMPRESSION) level = 6; |
@@ -194,8 +213,9 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy) | |||
194 | noheader = 1; | 213 | noheader = 1; |
195 | windowBits = -windowBits; | 214 | windowBits = -windowBits; |
196 | } | 215 | } |
197 | if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != DEFLATED || | 216 | if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || |
198 | windowBits < 8 || windowBits > 15 || level < 1 || level > 9) { | 217 | windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || |
218 | strategy < 0 || strategy > Z_HUFFMAN_ONLY) { | ||
199 | return Z_STREAM_ERROR; | 219 | return Z_STREAM_ERROR; |
200 | } | 220 | } |
201 | s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); | 221 | s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); |
@@ -223,15 +243,15 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy) | |||
223 | 243 | ||
224 | if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || | 244 | if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || |
225 | s->pending_buf == Z_NULL) { | 245 | s->pending_buf == Z_NULL) { |
226 | strm->msg = z_errmsg[1-Z_MEM_ERROR]; | 246 | strm->msg = ERR_MSG(Z_MEM_ERROR); |
227 | deflateEnd (strm); | 247 | deflateEnd (strm); |
228 | return Z_MEM_ERROR; | 248 | return Z_MEM_ERROR; |
229 | } | 249 | } |
230 | s->d_buf = (ushf *) &(s->pending_buf[s->lit_bufsize]); | 250 | s->l_buf = (uchf *) &(s->pending_buf[s->lit_bufsize]); |
231 | s->l_buf = (uchf *) &(s->pending_buf[3*s->lit_bufsize]); | 251 | s->d_buf = (ushf *) &(s->pending_buf[2*s->lit_bufsize]); |
232 | /* We overlay pending_buf and d_buf+l_buf. This works since the average | 252 | /* We overlay pending_buf and d_buf+l_buf. This works since the average |
233 | * output size for (length,distance) codes is <= 32 bits (worst case | 253 | * output size for (length,distance) codes is <= 32 bits (worst case |
234 | * is 15+15+13=33). | 254 | * is 15+15+13=33). d_buf is put last in case sizeof(short)>2. |
235 | */ | 255 | */ |
236 | 256 | ||
237 | s->level = level; | 257 | s->level = level; |
@@ -242,6 +262,44 @@ int deflateInit2 (strm, level, method, windowBits, memLevel, strategy) | |||
242 | } | 262 | } |
243 | 263 | ||
244 | /* ========================================================================= */ | 264 | /* ========================================================================= */ |
265 | int deflateSetDictionary (strm, dictionary, dictLength) | ||
266 | z_stream *strm; | ||
267 | const Bytef *dictionary; | ||
268 | uInt dictLength; | ||
269 | { | ||
270 | deflate_state *s; | ||
271 | uInt length = dictLength; | ||
272 | uInt n; | ||
273 | IPos hash_head; | ||
274 | |||
275 | if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || | ||
276 | strm->state->status != INIT_STATE) return Z_STREAM_ERROR; | ||
277 | |||
278 | s = strm->state; | ||
279 | strm->adler = adler32(strm->adler, dictionary, dictLength); | ||
280 | |||
281 | if (length < MIN_MATCH) return Z_OK; | ||
282 | if (length > MAX_DIST(s)) { | ||
283 | length = MAX_DIST(s); | ||
284 | dictionary += dictLength - length; | ||
285 | } | ||
286 | zmemcpy((charf *)s->window, dictionary, length); | ||
287 | s->strstart = length; | ||
288 | s->block_start = (long)length; | ||
289 | |||
290 | /* Insert all strings in the hash table (except for the last two bytes). | ||
291 | * s->lookahead stays null, so s->ins_h will be recomputed at the next | ||
292 | * call of fill_window. | ||
293 | */ | ||
294 | s->ins_h = s->window[0]; | ||
295 | UPDATE_HASH(s, s->ins_h, s->window[1]); | ||
296 | for (n = 0; n <= length - MIN_MATCH; n++) { | ||
297 | INSERT_STRING(s, n, hash_head); | ||
298 | } | ||
299 | return Z_OK; | ||
300 | } | ||
301 | |||
302 | /* ========================================================================= */ | ||
245 | int deflateReset (strm) | 303 | int deflateReset (strm) |
246 | z_stream *strm; | 304 | z_stream *strm; |
247 | { | 305 | { |
@@ -262,14 +320,52 @@ int deflateReset (strm) | |||
262 | s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ | 320 | s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ |
263 | } | 321 | } |
264 | s->status = s->noheader ? BUSY_STATE : INIT_STATE; | 322 | s->status = s->noheader ? BUSY_STATE : INIT_STATE; |
265 | s->adler = 1; | 323 | strm->adler = 1; |
324 | s->last_flush = Z_NO_FLUSH; | ||
266 | 325 | ||
267 | ct_init(s); | 326 | _tr_init(s); |
268 | lm_init(s); | 327 | lm_init(s); |
269 | 328 | ||
270 | return Z_OK; | 329 | return Z_OK; |
271 | } | 330 | } |
272 | 331 | ||
332 | /* ========================================================================= */ | ||
333 | int deflateParams(strm, level, strategy) | ||
334 | z_stream *strm; | ||
335 | int level; | ||
336 | int strategy; | ||
337 | { | ||
338 | deflate_state *s; | ||
339 | compress_func func; | ||
340 | |||
341 | if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | ||
342 | s = strm->state; | ||
343 | |||
344 | if (level == Z_DEFAULT_COMPRESSION) { | ||
345 | level = 6; | ||
346 | } | ||
347 | if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { | ||
348 | return Z_STREAM_ERROR; | ||
349 | } | ||
350 | func = configuration_table[s->level].func; | ||
351 | |||
352 | if (func != configuration_table[level].func | ||
353 | && strm->state->lookahead != 0) { | ||
354 | |||
355 | /* Flush the last buffer: */ | ||
356 | (void)(*func)(strm->state, Z_PARTIAL_FLUSH); | ||
357 | } | ||
358 | if (s->level != level) { | ||
359 | s->level = level; | ||
360 | s->max_lazy_match = configuration_table[level].max_lazy; | ||
361 | s->good_match = configuration_table[level].good_length; | ||
362 | s->nice_match = configuration_table[level].nice_length; | ||
363 | s->max_chain_length = configuration_table[level].max_chain; | ||
364 | } | ||
365 | s->strategy = strategy; | ||
366 | return Z_OK; | ||
367 | } | ||
368 | |||
273 | /* ========================================================================= | 369 | /* ========================================================================= |
274 | * Put a short in the pending buffer. The 16-bit value is put in MSB order. | 370 | * Put a short in the pending buffer. The 16-bit value is put in MSB order. |
275 | * IN assertion: the stream state is correct and there is enough room in | 371 | * IN assertion: the stream state is correct and there is enough room in |
@@ -284,7 +380,10 @@ local void putShortMSB (s, b) | |||
284 | } | 380 | } |
285 | 381 | ||
286 | /* ========================================================================= | 382 | /* ========================================================================= |
287 | * Flush as much pending output as possible. | 383 | * Flush as much pending output as possible. All deflate() output goes |
384 | * through this function so some applications may wish to modify it | ||
385 | * to avoid allocating a large strm->next_out buffer and copying into it. | ||
386 | * (See also read_buf()). | ||
288 | */ | 387 | */ |
289 | local void flush_pending(strm) | 388 | local void flush_pending(strm) |
290 | z_stream *strm; | 389 | z_stream *strm; |
@@ -310,55 +409,76 @@ int deflate (strm, flush) | |||
310 | z_stream *strm; | 409 | z_stream *strm; |
311 | int flush; | 410 | int flush; |
312 | { | 411 | { |
412 | int old_flush; /* value of flush param for previous deflate call */ | ||
413 | deflate_state *s; | ||
414 | |||
313 | if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | 415 | if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
314 | 416 | ||
417 | s = strm->state; | ||
418 | |||
315 | if (strm->next_out == Z_NULL || | 419 | if (strm->next_out == Z_NULL || |
316 | (strm->next_in == Z_NULL && strm->avail_in != 0)) { | 420 | (strm->next_in == Z_NULL && strm->avail_in != 0) || |
421 | (s->status == FINISH_STATE && flush != Z_FINISH)) { | ||
317 | ERR_RETURN(strm, Z_STREAM_ERROR); | 422 | ERR_RETURN(strm, Z_STREAM_ERROR); |
318 | } | 423 | } |
319 | if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); | 424 | if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); |
320 | 425 | ||
321 | strm->state->strm = strm; /* just in case */ | 426 | s->strm = strm; /* just in case */ |
427 | old_flush = s->last_flush; | ||
428 | s->last_flush = flush; | ||
322 | 429 | ||
323 | /* Write the zlib header */ | 430 | /* Write the zlib header */ |
324 | if (strm->state->status == INIT_STATE) { | 431 | if (s->status == INIT_STATE) { |
325 | 432 | ||
326 | uInt header = (DEFLATED + ((strm->state->w_bits-8)<<4)) << 8; | 433 | uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; |
327 | uInt level_flags = (strm->state->level-1) >> 1; | 434 | uInt level_flags = (s->level-1) >> 1; |
328 | 435 | ||
329 | if (level_flags > 3) level_flags = 3; | 436 | if (level_flags > 3) level_flags = 3; |
330 | header |= (level_flags << 6); | 437 | header |= (level_flags << 6); |
438 | if (s->strstart != 0) header |= PRESET_DICT; | ||
331 | header += 31 - (header % 31); | 439 | header += 31 - (header % 31); |
332 | 440 | ||
333 | strm->state->status = BUSY_STATE; | 441 | s->status = BUSY_STATE; |
334 | putShortMSB(strm->state, header); | 442 | putShortMSB(s, header); |
443 | |||
444 | /* Save the adler32 of the preset dictionary: */ | ||
445 | if (s->strstart != 0) { | ||
446 | putShortMSB(s, (uInt)(strm->adler >> 16)); | ||
447 | putShortMSB(s, (uInt)(strm->adler & 0xffff)); | ||
448 | strm->adler = 1L; | ||
449 | } | ||
335 | } | 450 | } |
336 | 451 | ||
337 | /* Flush as much pending output as possible */ | 452 | /* Flush as much pending output as possible */ |
338 | if (strm->state->pending != 0) { | 453 | if (s->pending != 0) { |
339 | flush_pending(strm); | 454 | flush_pending(strm); |
340 | if (strm->avail_out == 0) return Z_OK; | 455 | if (strm->avail_out == 0) return Z_OK; |
456 | |||
457 | /* Make sure there is something to do and avoid duplicate consecutive | ||
458 | * flushes. For repeated and useless calls with Z_FINISH, we keep | ||
459 | * returning Z_STREAM_END instead of Z_BUFF_ERROR. | ||
460 | */ | ||
461 | } else if (strm->avail_in == 0 && flush <= old_flush && | ||
462 | flush != Z_FINISH) { | ||
463 | ERR_RETURN(strm, Z_BUF_ERROR); | ||
341 | } | 464 | } |
342 | 465 | ||
343 | /* User must not provide more input after the first FINISH: */ | 466 | /* User must not provide more input after the first FINISH: */ |
344 | if (strm->state->status == FINISH_STATE && strm->avail_in != 0) { | 467 | if (s->status == FINISH_STATE && strm->avail_in != 0) { |
345 | ERR_RETURN(strm, Z_BUF_ERROR); | 468 | ERR_RETURN(strm, Z_BUF_ERROR); |
346 | } | 469 | } |
347 | 470 | ||
348 | /* Start a new block or continue the current one. | 471 | /* Start a new block or continue the current one. |
349 | */ | 472 | */ |
350 | if (strm->avail_in != 0 || strm->state->lookahead != 0 || | 473 | if (strm->avail_in != 0 || s->lookahead != 0 || |
351 | (flush != Z_NO_FLUSH && strm->state->status != FINISH_STATE)) { | 474 | (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { |
352 | int quit; | 475 | int quit; |
353 | 476 | ||
354 | if (flush == Z_FINISH) { | 477 | if (flush == Z_FINISH) { |
355 | strm->state->status = FINISH_STATE; | 478 | s->status = FINISH_STATE; |
356 | } | ||
357 | if (strm->state->level <= 3) { | ||
358 | quit = deflate_fast(strm->state, flush); | ||
359 | } else { | ||
360 | quit = deflate_slow(strm->state, flush); | ||
361 | } | 479 | } |
480 | quit = (*(configuration_table[s->level].func))(s, flush); | ||
481 | |||
362 | if (quit || strm->avail_out == 0) return Z_OK; | 482 | if (quit || strm->avail_out == 0) return Z_OK; |
363 | /* If flush != Z_NO_FLUSH && avail_out == 0, the next call | 483 | /* If flush != Z_NO_FLUSH && avail_out == 0, the next call |
364 | * of deflate should use the same flush parameter to make sure | 484 | * of deflate should use the same flush parameter to make sure |
@@ -367,16 +487,16 @@ int deflate (strm, flush) | |||
367 | * ensures that for a very small output buffer, we emit at most | 487 | * ensures that for a very small output buffer, we emit at most |
368 | * one empty block. | 488 | * one empty block. |
369 | */ | 489 | */ |
370 | if (flush != Z_OK && flush != Z_FINISH) { | 490 | if (flush != Z_NO_FLUSH && flush != Z_FINISH) { |
371 | if (flush == Z_PARTIAL_FLUSH) { | 491 | if (flush == Z_PARTIAL_FLUSH) { |
372 | ct_align(strm->state); | 492 | _tr_align(s); |
373 | } else { /* FULL_FLUSH or SYNC_FLUSH */ | 493 | } else { /* FULL_FLUSH or SYNC_FLUSH */ |
374 | ct_stored_block(strm->state, (char*)0, 0L, 0); | 494 | _tr_stored_block(s, (char*)0, 0L, 0); |
375 | /* For a full flush, this empty block will be recognized | 495 | /* For a full flush, this empty block will be recognized |
376 | * as a special marker by inflate_sync(). | 496 | * as a special marker by inflate_sync(). |
377 | */ | 497 | */ |
378 | if (flush == Z_FULL_FLUSH) { | 498 | if (flush == Z_FULL_FLUSH) { |
379 | CLEAR_HASH(strm->state); /* forget history */ | 499 | CLEAR_HASH(s); /* forget history */ |
380 | } | 500 | } |
381 | } | 501 | } |
382 | flush_pending(strm); | 502 | flush_pending(strm); |
@@ -386,34 +506,38 @@ int deflate (strm, flush) | |||
386 | Assert(strm->avail_out > 0, "bug2"); | 506 | Assert(strm->avail_out > 0, "bug2"); |
387 | 507 | ||
388 | if (flush != Z_FINISH) return Z_OK; | 508 | if (flush != Z_FINISH) return Z_OK; |
389 | if (strm->state->noheader) return Z_STREAM_END; | 509 | if (s->noheader) return Z_STREAM_END; |
390 | 510 | ||
391 | /* Write the zlib trailer (adler32) */ | 511 | /* Write the zlib trailer (adler32) */ |
392 | putShortMSB(strm->state, (uInt)(strm->state->adler >> 16)); | 512 | putShortMSB(s, (uInt)(strm->adler >> 16)); |
393 | putShortMSB(strm->state, (uInt)(strm->state->adler & 0xffff)); | 513 | putShortMSB(s, (uInt)(strm->adler & 0xffff)); |
394 | flush_pending(strm); | 514 | flush_pending(strm); |
395 | /* If avail_out is zero, the application will call deflate again | 515 | /* If avail_out is zero, the application will call deflate again |
396 | * to flush the rest. | 516 | * to flush the rest. |
397 | */ | 517 | */ |
398 | strm->state->noheader = -1; /* write the trailer only once! */ | 518 | s->noheader = -1; /* write the trailer only once! */ |
399 | return strm->state->pending != 0 ? Z_OK : Z_STREAM_END; | 519 | return s->pending != 0 ? Z_OK : Z_STREAM_END; |
400 | } | 520 | } |
401 | 521 | ||
402 | /* ========================================================================= */ | 522 | /* ========================================================================= */ |
403 | int deflateEnd (strm) | 523 | int deflateEnd (strm) |
404 | z_stream *strm; | 524 | z_stream *strm; |
405 | { | 525 | { |
526 | int status; | ||
527 | |||
406 | if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; | 528 | if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; |
407 | 529 | ||
408 | TRY_FREE(strm, strm->state->window); | 530 | /* Deallocate in reverse order of allocations: */ |
409 | TRY_FREE(strm, strm->state->prev); | ||
410 | TRY_FREE(strm, strm->state->head); | ||
411 | TRY_FREE(strm, strm->state->pending_buf); | 531 | TRY_FREE(strm, strm->state->pending_buf); |
532 | TRY_FREE(strm, strm->state->head); | ||
533 | TRY_FREE(strm, strm->state->prev); | ||
534 | TRY_FREE(strm, strm->state->window); | ||
412 | 535 | ||
536 | status = strm->state->status; | ||
413 | ZFREE(strm, strm->state); | 537 | ZFREE(strm, strm->state); |
414 | strm->state = Z_NULL; | 538 | strm->state = Z_NULL; |
415 | 539 | ||
416 | return Z_OK; | 540 | return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; |
417 | } | 541 | } |
418 | 542 | ||
419 | /* ========================================================================= */ | 543 | /* ========================================================================= */ |
@@ -438,7 +562,10 @@ int deflateCopy (dest, source) | |||
438 | 562 | ||
439 | /* =========================================================================== | 563 | /* =========================================================================== |
440 | * Read a new buffer from the current input stream, update the adler32 | 564 | * Read a new buffer from the current input stream, update the adler32 |
441 | * and total number of bytes read. | 565 | * and total number of bytes read. All deflate() input goes through |
566 | * this function so some applications may wish to modify it to avoid | ||
567 | * allocating a large strm->next_in buffer and copying from it. | ||
568 | * (See also flush_pending()). | ||
442 | */ | 569 | */ |
443 | local int read_buf(strm, buf, size) | 570 | local int read_buf(strm, buf, size) |
444 | z_stream *strm; | 571 | z_stream *strm; |
@@ -453,7 +580,7 @@ local int read_buf(strm, buf, size) | |||
453 | strm->avail_in -= len; | 580 | strm->avail_in -= len; |
454 | 581 | ||
455 | if (!strm->state->noheader) { | 582 | if (!strm->state->noheader) { |
456 | strm->state->adler = adler32(strm->state->adler, strm->next_in, len); | 583 | strm->adler = adler32(strm->adler, strm->next_in, len); |
457 | } | 584 | } |
458 | zmemcpy(buf, strm->next_in, len); | 585 | zmemcpy(buf, strm->next_in, len); |
459 | strm->next_in += len; | 586 | strm->next_in += len; |
@@ -482,7 +609,7 @@ local void lm_init (s) | |||
482 | s->strstart = 0; | 609 | s->strstart = 0; |
483 | s->block_start = 0L; | 610 | s->block_start = 0L; |
484 | s->lookahead = 0; | 611 | s->lookahead = 0; |
485 | s->match_length = MIN_MATCH-1; | 612 | s->match_length = s->prev_length = MIN_MATCH-1; |
486 | s->match_available = 0; | 613 | s->match_available = 0; |
487 | s->ins_h = 0; | 614 | s->ins_h = 0; |
488 | #ifdef ASMV | 615 | #ifdef ASMV |
@@ -497,6 +624,7 @@ local void lm_init (s) | |||
497 | * garbage. | 624 | * garbage. |
498 | * IN assertions: cur_match is the head of the hash chain for the current | 625 | * IN assertions: cur_match is the head of the hash chain for the current |
499 | * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 | 626 | * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 |
627 | * OUT assertion: the match length is not greater than s->lookahead. | ||
500 | */ | 628 | */ |
501 | #ifndef ASMV | 629 | #ifndef ASMV |
502 | /* For 80x86 and 680x0, an optimized version will be provided in match.asm or | 630 | /* For 80x86 and 680x0, an optimized version will be provided in match.asm or |
@@ -511,6 +639,7 @@ local int longest_match(s, cur_match) | |||
511 | register Bytef *match; /* matched string */ | 639 | register Bytef *match; /* matched string */ |
512 | register int len; /* length of current match */ | 640 | register int len; /* length of current match */ |
513 | int best_len = s->prev_length; /* best match length so far */ | 641 | int best_len = s->prev_length; /* best match length so far */ |
642 | int nice_match = s->nice_match; /* stop if match long enough */ | ||
514 | IPos limit = s->strstart > (IPos)MAX_DIST(s) ? | 643 | IPos limit = s->strstart > (IPos)MAX_DIST(s) ? |
515 | s->strstart - (IPos)MAX_DIST(s) : NIL; | 644 | s->strstart - (IPos)MAX_DIST(s) : NIL; |
516 | /* Stop when cur_match becomes <= limit. To simplify the code, | 645 | /* Stop when cur_match becomes <= limit. To simplify the code, |
@@ -541,6 +670,11 @@ local int longest_match(s, cur_match) | |||
541 | if (s->prev_length >= s->good_match) { | 670 | if (s->prev_length >= s->good_match) { |
542 | chain_length >>= 2; | 671 | chain_length >>= 2; |
543 | } | 672 | } |
673 | /* Do not look for matches beyond the end of the input. This is necessary | ||
674 | * to make deflate deterministic. | ||
675 | */ | ||
676 | if (nice_match > s->lookahead) nice_match = s->lookahead; | ||
677 | |||
544 | Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); | 678 | Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); |
545 | 679 | ||
546 | do { | 680 | do { |
@@ -619,7 +753,7 @@ local int longest_match(s, cur_match) | |||
619 | if (len > best_len) { | 753 | if (len > best_len) { |
620 | s->match_start = cur_match; | 754 | s->match_start = cur_match; |
621 | best_len = len; | 755 | best_len = len; |
622 | if (len >= s->nice_match) break; | 756 | if (len >= nice_match) break; |
623 | #ifdef UNALIGNED_OK | 757 | #ifdef UNALIGNED_OK |
624 | scan_end = *(ushf*)(scan+best_len-1); | 758 | scan_end = *(ushf*)(scan+best_len-1); |
625 | #else | 759 | #else |
@@ -630,7 +764,8 @@ local int longest_match(s, cur_match) | |||
630 | } while ((cur_match = prev[cur_match & wmask]) > limit | 764 | } while ((cur_match = prev[cur_match & wmask]) > limit |
631 | && --chain_length != 0); | 765 | && --chain_length != 0); |
632 | 766 | ||
633 | return best_len; | 767 | if (best_len <= s->lookahead) return best_len; |
768 | return s->lookahead; | ||
634 | } | 769 | } |
635 | #endif /* ASMV */ | 770 | #endif /* ASMV */ |
636 | 771 | ||
@@ -644,13 +779,13 @@ local void check_match(s, start, match, length) | |||
644 | int length; | 779 | int length; |
645 | { | 780 | { |
646 | /* check that the match is indeed a match */ | 781 | /* check that the match is indeed a match */ |
647 | if (memcmp((charf *)s->window + match, | 782 | if (zmemcmp((charf *)s->window + match, |
648 | (charf *)s->window + start, length) != EQUAL) { | 783 | (charf *)s->window + start, length) != EQUAL) { |
649 | fprintf(stderr, | 784 | fprintf(stderr, " start %u, match %u, length %d\n", |
650 | " start %u, match %u, length %d\n", | 785 | start, match, length); |
651 | start, match, length); | 786 | do { |
652 | do { fprintf(stderr, "%c%c", s->window[match++], | 787 | fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); |
653 | s->window[start++]); } while (--length != 0); | 788 | } while (--length != 0); |
654 | z_error("invalid match"); | 789 | z_error("invalid match"); |
655 | } | 790 | } |
656 | if (verbose > 1) { | 791 | if (verbose > 1) { |
@@ -686,6 +821,7 @@ local void fill_window(s) | |||
686 | /* Deal with !@#$% 64K limit: */ | 821 | /* Deal with !@#$% 64K limit: */ |
687 | if (more == 0 && s->strstart == 0 && s->lookahead == 0) { | 822 | if (more == 0 && s->strstart == 0 && s->lookahead == 0) { |
688 | more = wsize; | 823 | more = wsize; |
824 | |||
689 | } else if (more == (unsigned)(-1)) { | 825 | } else if (more == (unsigned)(-1)) { |
690 | /* Very unlikely, but possible on 16 bit machine if strstart == 0 | 826 | /* Very unlikely, but possible on 16 bit machine if strstart == 0 |
691 | * and lookahead == 1 (input done one byte at time) | 827 | * and lookahead == 1 (input done one byte at time) |
@@ -697,9 +833,6 @@ local void fill_window(s) | |||
697 | */ | 833 | */ |
698 | } else if (s->strstart >= wsize+MAX_DIST(s)) { | 834 | } else if (s->strstart >= wsize+MAX_DIST(s)) { |
699 | 835 | ||
700 | /* By the IN assertion, the window is not empty so we can't confuse | ||
701 | * more == 0 with more == 64K on a 16 bit machine. | ||
702 | */ | ||
703 | zmemcpy((charf *)s->window, (charf *)s->window+wsize, | 836 | zmemcpy((charf *)s->window, (charf *)s->window+wsize, |
704 | (unsigned)wsize); | 837 | (unsigned)wsize); |
705 | s->match_start -= wsize; | 838 | s->match_start -= wsize; |
@@ -768,9 +901,11 @@ local void fill_window(s) | |||
768 | * IN assertion: strstart is set to the end of the current match. | 901 | * IN assertion: strstart is set to the end of the current match. |
769 | */ | 902 | */ |
770 | #define FLUSH_BLOCK_ONLY(s, eof) { \ | 903 | #define FLUSH_BLOCK_ONLY(s, eof) { \ |
771 | ct_flush_block(s, (s->block_start >= 0L ? \ | 904 | _tr_flush_block(s, (s->block_start >= 0L ? \ |
772 | (charf *)&s->window[(unsigned)s->block_start] : \ | 905 | (charf *)&s->window[(unsigned)s->block_start] : \ |
773 | (charf *)Z_NULL), (long)s->strstart - s->block_start, (eof)); \ | 906 | (charf *)Z_NULL), \ |
907 | (ulg)((long)s->strstart - s->block_start), \ | ||
908 | (eof)); \ | ||
774 | s->block_start = s->strstart; \ | 909 | s->block_start = s->strstart; \ |
775 | flush_pending(s->strm); \ | 910 | flush_pending(s->strm); \ |
776 | Tracev((stderr,"[FLUSH]")); \ | 911 | Tracev((stderr,"[FLUSH]")); \ |
@@ -783,9 +918,54 @@ local void fill_window(s) | |||
783 | } | 918 | } |
784 | 919 | ||
785 | /* =========================================================================== | 920 | /* =========================================================================== |
921 | * Copy without compression as much as possible from the input stream, return | ||
922 | * true if processing was terminated prematurely (no more input or output | ||
923 | * space). This function does not insert new strings in the dictionary | ||
924 | * since uncompressible data is probably not useful. This function is used | ||
925 | * only for the level=0 compression option. | ||
926 | * NOTE: this function should be optimized to avoid extra copying. | ||
927 | */ | ||
928 | local int deflate_stored(s, flush) | ||
929 | deflate_state *s; | ||
930 | int flush; | ||
931 | { | ||
932 | for (;;) { | ||
933 | /* Fill the window as much as possible: */ | ||
934 | if (s->lookahead <= 1) { | ||
935 | |||
936 | Assert(s->strstart < s->w_size+MAX_DIST(s) || | ||
937 | s->block_start >= (long)s->w_size, "slide too late"); | ||
938 | |||
939 | fill_window(s); | ||
940 | if (s->lookahead == 0 && flush == Z_NO_FLUSH) return 1; | ||
941 | |||
942 | if (s->lookahead == 0) break; /* flush the current block */ | ||
943 | } | ||
944 | Assert(s->block_start >= 0L, "block gone"); | ||
945 | |||
946 | s->strstart += s->lookahead; | ||
947 | s->lookahead = 0; | ||
948 | |||
949 | /* Stored blocks are limited to 0xffff bytes: */ | ||
950 | if (s->strstart == 0 || s->strstart > 0xffff) { | ||
951 | /* strstart == 0 is possible when wraparound on 16-bit machine */ | ||
952 | s->lookahead = s->strstart - 0xffff; | ||
953 | s->strstart = 0xffff; | ||
954 | } | ||
955 | |||
956 | /* Emit a stored block if it is large enough: */ | ||
957 | if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { | ||
958 | FLUSH_BLOCK(s, 0); | ||
959 | } | ||
960 | } | ||
961 | FLUSH_BLOCK(s, flush == Z_FINISH); | ||
962 | return 0; /* normal exit */ | ||
963 | } | ||
964 | |||
965 | /* =========================================================================== | ||
786 | * Compress as much as possible from the input stream, return true if | 966 | * Compress as much as possible from the input stream, return true if |
787 | * processing was terminated prematurely (no more input or output space). | 967 | * processing was terminated prematurely (no more input or output space). |
788 | * This function does not perform lazy evaluationof matches and inserts | 968 | * This function does not perform lazy evaluation of matches and inserts |
789 | * new strings in the dictionary only for unmatched strings or for short | 969 | * new strings in the dictionary only for unmatched strings or for short |
790 | * matches. It is used only for the fast compression options. | 970 | * matches. It is used only for the fast compression options. |
791 | */ | 971 | */ |
@@ -793,10 +973,8 @@ local int deflate_fast(s, flush) | |||
793 | deflate_state *s; | 973 | deflate_state *s; |
794 | int flush; | 974 | int flush; |
795 | { | 975 | { |
796 | IPos hash_head; /* head of the hash chain */ | 976 | IPos hash_head = NIL; /* head of the hash chain */ |
797 | int bflush; /* set if current block must be flushed */ | 977 | int bflush; /* set if current block must be flushed */ |
798 | |||
799 | s->prev_length = MIN_MATCH-1; | ||
800 | 978 | ||
801 | for (;;) { | 979 | for (;;) { |
802 | /* Make sure that we always have enough lookahead, except | 980 | /* Make sure that we always have enough lookahead, except |
@@ -830,14 +1008,12 @@ local int deflate_fast(s, flush) | |||
830 | s->match_length = longest_match (s, hash_head); | 1008 | s->match_length = longest_match (s, hash_head); |
831 | } | 1009 | } |
832 | /* longest_match() sets match_start */ | 1010 | /* longest_match() sets match_start */ |
833 | |||
834 | if (s->match_length > s->lookahead) s->match_length = s->lookahead; | ||
835 | } | 1011 | } |
836 | if (s->match_length >= MIN_MATCH) { | 1012 | if (s->match_length >= MIN_MATCH) { |
837 | check_match(s, s->strstart, s->match_start, s->match_length); | 1013 | check_match(s, s->strstart, s->match_start, s->match_length); |
838 | 1014 | ||
839 | bflush = ct_tally(s, s->strstart - s->match_start, | 1015 | bflush = _tr_tally(s, s->strstart - s->match_start, |
840 | s->match_length - MIN_MATCH); | 1016 | s->match_length - MIN_MATCH); |
841 | 1017 | ||
842 | s->lookahead -= s->match_length; | 1018 | s->lookahead -= s->match_length; |
843 | 1019 | ||
@@ -870,7 +1046,7 @@ local int deflate_fast(s, flush) | |||
870 | } else { | 1046 | } else { |
871 | /* No match, output a literal byte */ | 1047 | /* No match, output a literal byte */ |
872 | Tracevv((stderr,"%c", s->window[s->strstart])); | 1048 | Tracevv((stderr,"%c", s->window[s->strstart])); |
873 | bflush = ct_tally (s, 0, s->window[s->strstart]); | 1049 | bflush = _tr_tally (s, 0, s->window[s->strstart]); |
874 | s->lookahead--; | 1050 | s->lookahead--; |
875 | s->strstart++; | 1051 | s->strstart++; |
876 | } | 1052 | } |
@@ -889,7 +1065,7 @@ local int deflate_slow(s, flush) | |||
889 | deflate_state *s; | 1065 | deflate_state *s; |
890 | int flush; | 1066 | int flush; |
891 | { | 1067 | { |
892 | IPos hash_head; /* head of hash chain */ | 1068 | IPos hash_head = NIL; /* head of hash chain */ |
893 | int bflush; /* set if current block must be flushed */ | 1069 | int bflush; /* set if current block must be flushed */ |
894 | 1070 | ||
895 | /* Process the input block. */ | 1071 | /* Process the input block. */ |
@@ -928,7 +1104,6 @@ local int deflate_slow(s, flush) | |||
928 | s->match_length = longest_match (s, hash_head); | 1104 | s->match_length = longest_match (s, hash_head); |
929 | } | 1105 | } |
930 | /* longest_match() sets match_start */ | 1106 | /* longest_match() sets match_start */ |
931 | if (s->match_length > s->lookahead) s->match_length = s->lookahead; | ||
932 | 1107 | ||
933 | if (s->match_length <= 5 && (s->strategy == Z_FILTERED || | 1108 | if (s->match_length <= 5 && (s->strategy == Z_FILTERED || |
934 | (s->match_length == MIN_MATCH && | 1109 | (s->match_length == MIN_MATCH && |
@@ -949,8 +1124,8 @@ local int deflate_slow(s, flush) | |||
949 | 1124 | ||
950 | check_match(s, s->strstart-1, s->prev_match, s->prev_length); | 1125 | check_match(s, s->strstart-1, s->prev_match, s->prev_length); |
951 | 1126 | ||
952 | bflush = ct_tally(s, s->strstart -1 - s->prev_match, | 1127 | bflush = _tr_tally(s, s->strstart -1 - s->prev_match, |
953 | s->prev_length - MIN_MATCH); | 1128 | s->prev_length - MIN_MATCH); |
954 | 1129 | ||
955 | /* Insert in hash table all strings up to the end of the match. | 1130 | /* Insert in hash table all strings up to the end of the match. |
956 | * strstart-1 and strstart are already inserted. If there is not | 1131 | * strstart-1 and strstart are already inserted. If there is not |
@@ -976,7 +1151,7 @@ local int deflate_slow(s, flush) | |||
976 | * is longer, truncate the previous match to a single literal. | 1151 | * is longer, truncate the previous match to a single literal. |
977 | */ | 1152 | */ |
978 | Tracevv((stderr,"%c", s->window[s->strstart-1])); | 1153 | Tracevv((stderr,"%c", s->window[s->strstart-1])); |
979 | if (ct_tally (s, 0, s->window[s->strstart-1])) { | 1154 | if (_tr_tally (s, 0, s->window[s->strstart-1])) { |
980 | FLUSH_BLOCK_ONLY(s, 0); | 1155 | FLUSH_BLOCK_ONLY(s, 0); |
981 | } | 1156 | } |
982 | s->strstart++; | 1157 | s->strstart++; |
@@ -994,7 +1169,7 @@ local int deflate_slow(s, flush) | |||
994 | Assert (flush != Z_NO_FLUSH, "no flush?"); | 1169 | Assert (flush != Z_NO_FLUSH, "no flush?"); |
995 | if (s->match_available) { | 1170 | if (s->match_available) { |
996 | Tracevv((stderr,"%c", s->window[s->strstart-1])); | 1171 | Tracevv((stderr,"%c", s->window[s->strstart-1])); |
997 | ct_tally (s, 0, s->window[s->strstart-1]); | 1172 | _tr_tally (s, 0, s->window[s->strstart-1]); |
998 | s->match_available = 0; | 1173 | s->match_available = 0; |
999 | } | 1174 | } |
1000 | FLUSH_BLOCK(s, flush == Z_FINISH); | 1175 | FLUSH_BLOCK(s, flush == Z_FINISH); |
@@ -1,5 +1,5 @@ | |||
1 | /* deflate.h -- internal compression state | 1 | /* deflate.h -- internal compression state |
2 | * Copyright (C) 1995 Jean-loup Gailly | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -10,17 +10,15 @@ | |||
10 | 10 | ||
11 | /* $Id: deflate.h,v 1.5 1995/05/03 17:27:09 jloup Exp $ */ | 11 | /* $Id: deflate.h,v 1.5 1995/05/03 17:27:09 jloup Exp $ */ |
12 | 12 | ||
13 | #ifndef _DEFLATE_H | ||
14 | #define _DEFLATE_H | ||
15 | |||
13 | #include "zutil.h" | 16 | #include "zutil.h" |
14 | 17 | ||
15 | /* =========================================================================== | 18 | /* =========================================================================== |
16 | * Internal compression state. | 19 | * Internal compression state. |
17 | */ | 20 | */ |
18 | 21 | ||
19 | /* Data type */ | ||
20 | #define BINARY 0 | ||
21 | #define ASCII 1 | ||
22 | #define UNKNOWN 2 | ||
23 | |||
24 | #define LENGTH_CODES 29 | 22 | #define LENGTH_CODES 29 |
25 | /* number of length codes, not counting the special END_BLOCK code */ | 23 | /* number of length codes, not counting the special END_BLOCK code */ |
26 | 24 | ||
@@ -87,10 +85,10 @@ typedef struct internal_state { | |||
87 | Bytef *pending_buf; /* output still pending */ | 85 | Bytef *pending_buf; /* output still pending */ |
88 | Bytef *pending_out; /* next pending byte to output to the stream */ | 86 | Bytef *pending_out; /* next pending byte to output to the stream */ |
89 | int pending; /* nb of bytes in the pending buffer */ | 87 | int pending; /* nb of bytes in the pending buffer */ |
90 | uLong adler; /* adler32 of uncompressed data */ | ||
91 | int noheader; /* suppress zlib header and adler32 */ | 88 | int noheader; /* suppress zlib header and adler32 */ |
92 | Byte data_type; /* UNKNOWN, BINARY or ASCII */ | 89 | Byte data_type; /* UNKNOWN, BINARY or ASCII */ |
93 | Byte method; /* STORED (for zip only) or DEFLATED */ | 90 | Byte method; /* STORED (for zip only) or DEFLATED */ |
91 | int last_flush; /* value of flush param for previous deflate call */ | ||
94 | 92 | ||
95 | /* used by deflate.c: */ | 93 | /* used by deflate.c: */ |
96 | 94 | ||
@@ -173,7 +171,7 @@ typedef struct internal_state { | |||
173 | uInt good_match; | 171 | uInt good_match; |
174 | /* Use a faster search when the previous match is longer than this */ | 172 | /* Use a faster search when the previous match is longer than this */ |
175 | 173 | ||
176 | int nice_match; /* Stop searching when current match exceeds this */ | 174 | int nice_match; /* Stop searching when current match exceeds this */ |
177 | 175 | ||
178 | /* used by trees.c: */ | 176 | /* used by trees.c: */ |
179 | /* Didn't use ct_data typedef below to supress compiler warning */ | 177 | /* Didn't use ct_data typedef below to supress compiler warning */ |
@@ -267,9 +265,11 @@ typedef struct internal_state { | |||
267 | */ | 265 | */ |
268 | 266 | ||
269 | /* in trees.c */ | 267 | /* in trees.c */ |
270 | void ct_init OF((deflate_state *s)); | 268 | void _tr_init OF((deflate_state *s)); |
271 | int ct_tally OF((deflate_state *s, int dist, int lc)); | 269 | int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); |
272 | ulg ct_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); | 270 | ulg _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, |
273 | void ct_align OF((deflate_state *s)); | 271 | int eof)); |
274 | void ct_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, | 272 | void _tr_align OF((deflate_state *s)); |
273 | void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, | ||
275 | int eof)); | 274 | int eof)); |
275 | #endif | ||
@@ -1,5 +1,5 @@ | |||
1 | /* example.c -- usage example of the zlib compression library | 1 | /* example.c -- usage example of the zlib compression library |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -10,20 +10,11 @@ | |||
10 | 10 | ||
11 | #ifdef STDC | 11 | #ifdef STDC |
12 | # include <string.h> | 12 | # include <string.h> |
13 | # include <stdlib.h> | ||
14 | #else | ||
15 | extern void exit OF((int)); | ||
13 | #endif | 16 | #endif |
14 | 17 | ||
15 | #ifndef __GO32__ | ||
16 | extern void exit OF((int)); | ||
17 | #endif | ||
18 | |||
19 | #define BUFLEN 4096 | ||
20 | |||
21 | #define local static | ||
22 | /* For MSDOS and other systems with limitation on stack size. For Unix, | ||
23 | #define local | ||
24 | works also. | ||
25 | */ | ||
26 | |||
27 | #define CHECK_ERR(err, msg) { \ | 18 | #define CHECK_ERR(err, msg) { \ |
28 | if (err != Z_OK) { \ | 19 | if (err != Z_OK) { \ |
29 | fprintf(stderr, "%s error: %d\n", msg, err); \ | 20 | fprintf(stderr, "%s error: %d\n", msg, err); \ |
@@ -31,32 +22,44 @@ extern void exit OF((int)); | |||
31 | } \ | 22 | } \ |
32 | } | 23 | } |
33 | 24 | ||
34 | char *hello = "hello, hello!"; | 25 | const char hello[] = "hello, hello!"; |
35 | /* "hello world" would be more standard, but the repeated "hello" | 26 | /* "hello world" would be more standard, but the repeated "hello" |
36 | * stresses the compression code better, sorry... | 27 | * stresses the compression code better, sorry... |
37 | */ | 28 | */ |
38 | 29 | ||
39 | void test_compress OF((void)); | 30 | const char dictionary[] = "hello"; |
40 | void test_gzio OF((char *out, char *in)); | 31 | uLong dictId; /* Adler32 value of the dictionary */ |
41 | void test_deflate OF((Byte compr[])); | 32 | |
42 | void test_inflate OF((Byte compr[])); | 33 | void test_compress OF((Bytef *compr, uLong comprLen, |
43 | void test_flush OF((Byte compr[])); | 34 | Bytef *uncompr, uLong uncomprLen)); |
44 | void test_sync OF((Byte compr[])); | 35 | void test_gzio OF((const char *out, const char *in, |
45 | int main OF((int argc, char *argv[])); | 36 | Bytef *uncompr, int uncomprLen)); |
37 | void test_deflate OF((Bytef *compr, uLong comprLen)); | ||
38 | void test_inflate OF((Bytef *compr, uLong comprLen, | ||
39 | Bytef *uncompr, uLong uncomprLen)); | ||
40 | void test_large_deflate OF((Bytef *compr, uLong comprLen, | ||
41 | Bytef *uncompr, uLong uncomprLen)); | ||
42 | void test_large_inflate OF((Bytef *compr, uLong comprLen, | ||
43 | Bytef *uncompr, uLong uncomprLen)); | ||
44 | void test_flush OF((Bytef *compr, uLong comprLen)); | ||
45 | void test_sync OF((Bytef *compr, uLong comprLen, | ||
46 | Bytef *uncompr, uLong uncomprLen)); | ||
47 | void test_dict_deflate OF((Bytef *compr, uLong comprLen)); | ||
48 | void test_dict_inflate OF((Bytef *compr, uLong comprLen, | ||
49 | Bytef *uncompr, uLong uncomprLen)); | ||
50 | int main OF((int argc, char *argv[])); | ||
46 | 51 | ||
47 | /* =========================================================================== | 52 | /* =========================================================================== |
48 | * Test compress() and uncompress() | 53 | * Test compress() and uncompress() |
49 | */ | 54 | */ |
50 | void test_compress() | 55 | void test_compress(compr, comprLen, uncompr, uncomprLen) |
56 | Bytef *compr, *uncompr; | ||
57 | uLong comprLen, uncomprLen; | ||
51 | { | 58 | { |
52 | local Byte compr[BUFLEN]; | ||
53 | uLong comprLen = sizeof(compr); | ||
54 | local Byte uncompr[BUFLEN]; | ||
55 | uLong uncomprLen = sizeof(uncompr); | ||
56 | int err; | 59 | int err; |
57 | uLong len = strlen(hello)+1; | 60 | uLong len = strlen(hello)+1; |
58 | 61 | ||
59 | err = compress(compr, &comprLen, (Byte*)hello, len); | 62 | err = compress(compr, &comprLen, (const Bytef*)hello, len); |
60 | CHECK_ERR(err, "compress"); | 63 | CHECK_ERR(err, "compress"); |
61 | 64 | ||
62 | strcpy((char*)uncompr, "garbage"); | 65 | strcpy((char*)uncompr, "garbage"); |
@@ -74,12 +77,12 @@ void test_compress() | |||
74 | /* =========================================================================== | 77 | /* =========================================================================== |
75 | * Test read/write of .gz files | 78 | * Test read/write of .gz files |
76 | */ | 79 | */ |
77 | void test_gzio(out, in) | 80 | void test_gzio(out, in, uncompr, uncomprLen) |
78 | char *out; /* output file */ | 81 | const char *out; /* output file */ |
79 | char *in; /* input file */ | 82 | const char *in; /* input file */ |
83 | Bytef *uncompr; | ||
84 | int uncomprLen; | ||
80 | { | 85 | { |
81 | local Byte uncompr[BUFLEN]; | ||
82 | int uncomprLen = sizeof(uncompr); | ||
83 | int err; | 86 | int err; |
84 | int len = strlen(hello)+1; | 87 | int len = strlen(hello)+1; |
85 | gzFile file; | 88 | gzFile file; |
@@ -90,7 +93,7 @@ void test_gzio(out, in) | |||
90 | exit(1); | 93 | exit(1); |
91 | } | 94 | } |
92 | 95 | ||
93 | if (gzwrite(file, hello, len) != len) { | 96 | if (gzwrite(file, (const voidp)hello, (unsigned)len) != len) { |
94 | fprintf(stderr, "gzwrite err: %s\n", gzerror(file, &err)); | 97 | fprintf(stderr, "gzwrite err: %s\n", gzerror(file, &err)); |
95 | } | 98 | } |
96 | gzclose(file); | 99 | gzclose(file); |
@@ -101,7 +104,7 @@ void test_gzio(out, in) | |||
101 | } | 104 | } |
102 | strcpy((char*)uncompr, "garbage"); | 105 | strcpy((char*)uncompr, "garbage"); |
103 | 106 | ||
104 | uncomprLen = gzread(file, uncompr, uncomprLen); | 107 | uncomprLen = gzread(file, uncompr, (unsigned)uncomprLen); |
105 | if (uncomprLen != len) { | 108 | if (uncomprLen != len) { |
106 | fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); | 109 | fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); |
107 | } | 110 | } |
@@ -117,8 +120,9 @@ void test_gzio(out, in) | |||
117 | /* =========================================================================== | 120 | /* =========================================================================== |
118 | * Test deflate() with small buffers | 121 | * Test deflate() with small buffers |
119 | */ | 122 | */ |
120 | void test_deflate(compr) | 123 | void test_deflate(compr, comprLen) |
121 | Byte compr[]; | 124 | Bytef *compr; |
125 | uLong comprLen; | ||
122 | { | 126 | { |
123 | z_stream c_stream; /* compression stream */ | 127 | z_stream c_stream; /* compression stream */ |
124 | int err; | 128 | int err; |
@@ -126,14 +130,15 @@ void test_deflate(compr) | |||
126 | 130 | ||
127 | c_stream.zalloc = (alloc_func)0; | 131 | c_stream.zalloc = (alloc_func)0; |
128 | c_stream.zfree = (free_func)0; | 132 | c_stream.zfree = (free_func)0; |
133 | c_stream.opaque = (voidpf)0; | ||
129 | 134 | ||
130 | err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); | 135 | err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); |
131 | CHECK_ERR(err, "deflateInit"); | 136 | CHECK_ERR(err, "deflateInit"); |
132 | 137 | ||
133 | c_stream.next_in = (Byte*)hello; | 138 | c_stream.next_in = (Bytef*)hello; |
134 | c_stream.next_out = compr; | 139 | c_stream.next_out = compr; |
135 | 140 | ||
136 | while (c_stream.total_in != (uLong)len) { | 141 | while (c_stream.total_in != (uLong)len && c_stream.total_out < comprLen) { |
137 | c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ | 142 | c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ |
138 | err = deflate(&c_stream, Z_NO_FLUSH); | 143 | err = deflate(&c_stream, Z_NO_FLUSH); |
139 | CHECK_ERR(err, "deflate"); | 144 | CHECK_ERR(err, "deflate"); |
@@ -153,10 +158,10 @@ void test_deflate(compr) | |||
153 | /* =========================================================================== | 158 | /* =========================================================================== |
154 | * Test inflate() with small buffers | 159 | * Test inflate() with small buffers |
155 | */ | 160 | */ |
156 | void test_inflate(compr) | 161 | void test_inflate(compr, comprLen, uncompr, uncomprLen) |
157 | Byte compr[]; | 162 | Bytef *compr, *uncompr; |
163 | uLong comprLen, uncomprLen; | ||
158 | { | 164 | { |
159 | local Byte uncompr[BUFLEN]; | ||
160 | int err; | 165 | int err; |
161 | z_stream d_stream; /* decompression stream */ | 166 | z_stream d_stream; /* decompression stream */ |
162 | 167 | ||
@@ -164,6 +169,7 @@ void test_inflate(compr) | |||
164 | 169 | ||
165 | d_stream.zalloc = (alloc_func)0; | 170 | d_stream.zalloc = (alloc_func)0; |
166 | d_stream.zfree = (free_func)0; | 171 | d_stream.zfree = (free_func)0; |
172 | d_stream.opaque = (voidpf)0; | ||
167 | 173 | ||
168 | err = inflateInit(&d_stream); | 174 | err = inflateInit(&d_stream); |
169 | CHECK_ERR(err, "inflateInit"); | 175 | CHECK_ERR(err, "inflateInit"); |
@@ -171,7 +177,7 @@ void test_inflate(compr) | |||
171 | d_stream.next_in = compr; | 177 | d_stream.next_in = compr; |
172 | d_stream.next_out = uncompr; | 178 | d_stream.next_out = uncompr; |
173 | 179 | ||
174 | for (;;) { | 180 | while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { |
175 | d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ | 181 | d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ |
176 | err = inflate(&d_stream, Z_NO_FLUSH); | 182 | err = inflate(&d_stream, Z_NO_FLUSH); |
177 | if (err == Z_STREAM_END) break; | 183 | if (err == Z_STREAM_END) break; |
@@ -189,10 +195,104 @@ void test_inflate(compr) | |||
189 | } | 195 | } |
190 | 196 | ||
191 | /* =========================================================================== | 197 | /* =========================================================================== |
198 | * Test deflate() with large buffers and dynamic change of compression level | ||
199 | */ | ||
200 | void test_large_deflate(compr, comprLen, uncompr, uncomprLen) | ||
201 | Bytef *compr, *uncompr; | ||
202 | uLong comprLen, uncomprLen; | ||
203 | { | ||
204 | z_stream c_stream; /* compression stream */ | ||
205 | int err; | ||
206 | |||
207 | c_stream.zalloc = (alloc_func)0; | ||
208 | c_stream.zfree = (free_func)0; | ||
209 | c_stream.opaque = (voidpf)0; | ||
210 | |||
211 | err = deflateInit(&c_stream, Z_BEST_SPEED); | ||
212 | CHECK_ERR(err, "deflateInit"); | ||
213 | |||
214 | c_stream.next_out = compr; | ||
215 | c_stream.avail_out = (uInt)comprLen; | ||
216 | |||
217 | /* At this point, uncompr is still mostly zeroes, so it should compress | ||
218 | * very well: | ||
219 | */ | ||
220 | c_stream.next_in = uncompr; | ||
221 | c_stream.avail_in = (uInt)uncomprLen; | ||
222 | err = deflate(&c_stream, Z_NO_FLUSH); | ||
223 | CHECK_ERR(err, "deflate"); | ||
224 | if (c_stream.avail_in != 0) { | ||
225 | fprintf(stderr, "deflate not greedy\n"); | ||
226 | } | ||
227 | |||
228 | /* Feed in already compressed data and switch to no compression: */ | ||
229 | deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); | ||
230 | c_stream.next_in = compr; | ||
231 | c_stream.avail_in = (uInt)comprLen/2; | ||
232 | err = deflate(&c_stream, Z_NO_FLUSH); | ||
233 | CHECK_ERR(err, "deflate"); | ||
234 | |||
235 | /* Switch back to compressing mode: */ | ||
236 | deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); | ||
237 | c_stream.next_in = uncompr; | ||
238 | c_stream.avail_in = (uInt)uncomprLen; | ||
239 | err = deflate(&c_stream, Z_NO_FLUSH); | ||
240 | CHECK_ERR(err, "deflate"); | ||
241 | |||
242 | err = deflate(&c_stream, Z_FINISH); | ||
243 | if (err != Z_STREAM_END) { | ||
244 | fprintf(stderr, "deflate should report Z_STREAM_END\n"); | ||
245 | } | ||
246 | err = deflateEnd(&c_stream); | ||
247 | CHECK_ERR(err, "deflateEnd"); | ||
248 | } | ||
249 | |||
250 | /* =========================================================================== | ||
251 | * Test inflate() with large buffers | ||
252 | */ | ||
253 | void test_large_inflate(compr, comprLen, uncompr, uncomprLen) | ||
254 | Bytef *compr, *uncompr; | ||
255 | uLong comprLen, uncomprLen; | ||
256 | { | ||
257 | int err; | ||
258 | z_stream d_stream; /* decompression stream */ | ||
259 | |||
260 | strcpy((char*)uncompr, "garbage"); | ||
261 | |||
262 | d_stream.zalloc = (alloc_func)0; | ||
263 | d_stream.zfree = (free_func)0; | ||
264 | d_stream.opaque = (voidpf)0; | ||
265 | |||
266 | err = inflateInit(&d_stream); | ||
267 | CHECK_ERR(err, "inflateInit"); | ||
268 | |||
269 | d_stream.next_in = compr; | ||
270 | d_stream.avail_in = (uInt)comprLen; | ||
271 | |||
272 | for (;;) { | ||
273 | d_stream.next_out = uncompr; /* discard the output */ | ||
274 | d_stream.avail_out = (uInt)uncomprLen; | ||
275 | err = inflate(&d_stream, Z_NO_FLUSH); | ||
276 | if (err == Z_STREAM_END) break; | ||
277 | CHECK_ERR(err, "large inflate"); | ||
278 | } | ||
279 | |||
280 | err = inflateEnd(&d_stream); | ||
281 | CHECK_ERR(err, "inflateEnd"); | ||
282 | |||
283 | if (d_stream.total_out != 2*uncomprLen + comprLen/2) { | ||
284 | fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); | ||
285 | } else { | ||
286 | printf("large_inflate(): OK\n"); | ||
287 | } | ||
288 | } | ||
289 | |||
290 | /* =========================================================================== | ||
192 | * Test deflate() with full flush | 291 | * Test deflate() with full flush |
193 | */ | 292 | */ |
194 | void test_flush(compr) | 293 | void test_flush(compr, comprLen) |
195 | Byte compr[]; | 294 | Bytef *compr; |
295 | uLong comprLen; | ||
196 | { | 296 | { |
197 | z_stream c_stream; /* compression stream */ | 297 | z_stream c_stream; /* compression stream */ |
198 | int err; | 298 | int err; |
@@ -200,14 +300,15 @@ void test_flush(compr) | |||
200 | 300 | ||
201 | c_stream.zalloc = (alloc_func)0; | 301 | c_stream.zalloc = (alloc_func)0; |
202 | c_stream.zfree = (free_func)0; | 302 | c_stream.zfree = (free_func)0; |
303 | c_stream.opaque = (voidpf)0; | ||
203 | 304 | ||
204 | err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); | 305 | err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); |
205 | CHECK_ERR(err, "deflateInit"); | 306 | CHECK_ERR(err, "deflateInit"); |
206 | 307 | ||
207 | c_stream.next_in = (Byte*)hello; | 308 | c_stream.next_in = (Bytef*)hello; |
208 | c_stream.next_out = compr; | 309 | c_stream.next_out = compr; |
209 | c_stream.avail_in = 3; | 310 | c_stream.avail_in = 3; |
210 | c_stream.avail_out = BUFLEN; | 311 | c_stream.avail_out = (uInt)comprLen; |
211 | err = deflate(&c_stream, Z_FULL_FLUSH); | 312 | err = deflate(&c_stream, Z_FULL_FLUSH); |
212 | CHECK_ERR(err, "deflate"); | 313 | CHECK_ERR(err, "deflate"); |
213 | 314 | ||
@@ -225,10 +326,10 @@ void test_flush(compr) | |||
225 | /* =========================================================================== | 326 | /* =========================================================================== |
226 | * Test inflateSync() | 327 | * Test inflateSync() |
227 | */ | 328 | */ |
228 | void test_sync(compr) | 329 | void test_sync(compr, comprLen, uncompr, uncomprLen) |
229 | Byte compr[]; | 330 | Bytef *compr, *uncompr; |
331 | uLong comprLen, uncomprLen; | ||
230 | { | 332 | { |
231 | local Byte uncompr[BUFLEN]; | ||
232 | int err; | 333 | int err; |
233 | z_stream d_stream; /* decompression stream */ | 334 | z_stream d_stream; /* decompression stream */ |
234 | 335 | ||
@@ -236,6 +337,7 @@ void test_sync(compr) | |||
236 | 337 | ||
237 | d_stream.zalloc = (alloc_func)0; | 338 | d_stream.zalloc = (alloc_func)0; |
238 | d_stream.zfree = (free_func)0; | 339 | d_stream.zfree = (free_func)0; |
340 | d_stream.opaque = (voidpf)0; | ||
239 | 341 | ||
240 | err = inflateInit(&d_stream); | 342 | err = inflateInit(&d_stream); |
241 | CHECK_ERR(err, "inflateInit"); | 343 | CHECK_ERR(err, "inflateInit"); |
@@ -243,13 +345,13 @@ void test_sync(compr) | |||
243 | d_stream.next_in = compr; | 345 | d_stream.next_in = compr; |
244 | d_stream.next_out = uncompr; | 346 | d_stream.next_out = uncompr; |
245 | d_stream.avail_in = 2; /* just read the zlib header */ | 347 | d_stream.avail_in = 2; /* just read the zlib header */ |
246 | d_stream.avail_out = sizeof(uncompr); | 348 | d_stream.avail_out = (uInt)uncomprLen; |
247 | 349 | ||
248 | inflate(&d_stream, Z_NO_FLUSH); | 350 | inflate(&d_stream, Z_NO_FLUSH); |
249 | CHECK_ERR(err, "inflate"); | 351 | CHECK_ERR(err, "inflate"); |
250 | 352 | ||
251 | d_stream.avail_in = BUFLEN-2; /* let inflate read all compressed data */ | 353 | d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ |
252 | err = inflateSync(&d_stream); /* skip the damaged part */ | 354 | err = inflateSync(&d_stream); /* but skip the damaged part */ |
253 | CHECK_ERR(err, "inflateSync"); | 355 | CHECK_ERR(err, "inflateSync"); |
254 | 356 | ||
255 | err = inflate(&d_stream, Z_FINISH); | 357 | err = inflate(&d_stream, Z_FINISH); |
@@ -264,6 +366,91 @@ void test_sync(compr) | |||
264 | } | 366 | } |
265 | 367 | ||
266 | /* =========================================================================== | 368 | /* =========================================================================== |
369 | * Test deflate() with preset dictionary | ||
370 | */ | ||
371 | void test_dict_deflate(compr, comprLen) | ||
372 | Bytef *compr; | ||
373 | uLong comprLen; | ||
374 | { | ||
375 | z_stream c_stream; /* compression stream */ | ||
376 | int err; | ||
377 | |||
378 | c_stream.zalloc = (alloc_func)0; | ||
379 | c_stream.zfree = (free_func)0; | ||
380 | c_stream.opaque = (voidpf)0; | ||
381 | |||
382 | err = deflateInit(&c_stream, Z_BEST_COMPRESSION); | ||
383 | CHECK_ERR(err, "deflateInit"); | ||
384 | |||
385 | err = deflateSetDictionary(&c_stream, | ||
386 | (const Bytef*)dictionary, sizeof(dictionary)); | ||
387 | CHECK_ERR(err, "deflateSetDictionary"); | ||
388 | |||
389 | dictId = c_stream.adler; | ||
390 | c_stream.next_out = compr; | ||
391 | c_stream.avail_out = (uInt)comprLen; | ||
392 | |||
393 | c_stream.next_in = (Bytef*)hello; | ||
394 | c_stream.avail_in = (uInt)strlen(hello)+1; | ||
395 | |||
396 | err = deflate(&c_stream, Z_FINISH); | ||
397 | if (err != Z_STREAM_END) { | ||
398 | fprintf(stderr, "deflate should report Z_STREAM_END\n"); | ||
399 | } | ||
400 | err = deflateEnd(&c_stream); | ||
401 | CHECK_ERR(err, "deflateEnd"); | ||
402 | } | ||
403 | |||
404 | /* =========================================================================== | ||
405 | * Test inflate() with a preset dictionary | ||
406 | */ | ||
407 | void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) | ||
408 | Bytef *compr, *uncompr; | ||
409 | uLong comprLen, uncomprLen; | ||
410 | { | ||
411 | int err; | ||
412 | z_stream d_stream; /* decompression stream */ | ||
413 | |||
414 | strcpy((char*)uncompr, "garbage"); | ||
415 | |||
416 | d_stream.zalloc = (alloc_func)0; | ||
417 | d_stream.zfree = (free_func)0; | ||
418 | d_stream.opaque = (voidpf)0; | ||
419 | |||
420 | err = inflateInit(&d_stream); | ||
421 | CHECK_ERR(err, "inflateInit"); | ||
422 | |||
423 | d_stream.next_in = compr; | ||
424 | d_stream.avail_in = (uInt)comprLen; | ||
425 | |||
426 | d_stream.next_out = uncompr; | ||
427 | d_stream.avail_out = (uInt)uncomprLen; | ||
428 | |||
429 | for (;;) { | ||
430 | err = inflate(&d_stream, Z_NO_FLUSH); | ||
431 | if (err == Z_STREAM_END) break; | ||
432 | if (err == Z_NEED_DICT) { | ||
433 | if (d_stream.adler != dictId) { | ||
434 | fprintf(stderr, "unexpected dictionary"); | ||
435 | exit(1); | ||
436 | } | ||
437 | err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, | ||
438 | sizeof(dictionary)); | ||
439 | } | ||
440 | CHECK_ERR(err, "inflate with dict"); | ||
441 | } | ||
442 | |||
443 | err = inflateEnd(&d_stream); | ||
444 | CHECK_ERR(err, "inflateEnd"); | ||
445 | |||
446 | if (strcmp((char*)uncompr, hello)) { | ||
447 | fprintf(stderr, "bad inflate with dict\n"); | ||
448 | } else { | ||
449 | printf("inflate with dictionary: %s\n", uncompr); | ||
450 | } | ||
451 | } | ||
452 | |||
453 | /* =========================================================================== | ||
267 | * Usage: example [output.gz [input.gz]] | 454 | * Usage: example [output.gz [input.gz]] |
268 | */ | 455 | */ |
269 | 456 | ||
@@ -271,7 +458,9 @@ int main(argc, argv) | |||
271 | int argc; | 458 | int argc; |
272 | char *argv[]; | 459 | char *argv[]; |
273 | { | 460 | { |
274 | local Byte compr[BUFLEN]; | 461 | Bytef *compr, *uncompr; |
462 | uLong comprLen = 32750*sizeof(int); /* don't overflow on MSDOS */ | ||
463 | uLong uncomprLen = comprLen; | ||
275 | 464 | ||
276 | if (zlib_version[0] != ZLIB_VERSION[0]) { | 465 | if (zlib_version[0] != ZLIB_VERSION[0]) { |
277 | fprintf(stderr, "incompatible zlib version\n"); | 466 | fprintf(stderr, "incompatible zlib version\n"); |
@@ -280,16 +469,31 @@ int main(argc, argv) | |||
280 | } else if (strcmp(zlib_version, ZLIB_VERSION) != 0) { | 469 | } else if (strcmp(zlib_version, ZLIB_VERSION) != 0) { |
281 | fprintf(stderr, "warning: different zlib version\n"); | 470 | fprintf(stderr, "warning: different zlib version\n"); |
282 | } | 471 | } |
283 | test_compress(); | 472 | |
473 | compr = (Bytef*)malloc((uInt)comprLen); | ||
474 | uncompr = (Bytef*)calloc((uInt)uncomprLen, 1); /* must be cleared */ | ||
475 | if (compr == Z_NULL || uncompr == Z_NULL) { | ||
476 | printf("out of memory\n"); | ||
477 | exit(1); | ||
478 | } | ||
479 | |||
480 | test_compress(compr, comprLen, uncompr, uncomprLen); | ||
284 | 481 | ||
285 | test_gzio((argc > 1 ? argv[1] : "foo.gz"), | 482 | test_gzio((argc > 1 ? argv[1] : "foo.gz"), |
286 | (argc > 2 ? argv[2] : "foo.gz")); | 483 | (argc > 2 ? argv[2] : "foo.gz"), |
484 | uncompr, (int)uncomprLen); | ||
485 | |||
486 | test_deflate(compr, comprLen); | ||
487 | test_inflate(compr, comprLen, uncompr, uncomprLen); | ||
488 | |||
489 | test_large_deflate(compr, comprLen, uncompr, uncomprLen); | ||
490 | test_large_inflate(compr, comprLen, uncompr, uncomprLen); | ||
287 | 491 | ||
288 | test_deflate(compr); | 492 | test_flush(compr, comprLen); |
289 | test_inflate(compr); | 493 | test_sync(compr, comprLen, uncompr, uncomprLen); |
290 | 494 | ||
291 | test_flush(compr); | 495 | test_dict_deflate(compr, comprLen); |
292 | test_sync(compr); | 496 | test_dict_inflate(compr, comprLen, uncompr, uncomprLen); |
293 | 497 | ||
294 | exit(0); | 498 | exit(0); |
295 | return 0; /* to avoid warning */ | 499 | return 0; /* to avoid warning */ |
@@ -1,5 +1,5 @@ | |||
1 | /* gzio.c -- IO on .gz files | 1 | /* gzio.c -- IO on .gz files |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -16,8 +16,7 @@ struct internal_state {int dummy;}; /* for buggy compilers */ | |||
16 | #define ALLOC(size) malloc(size) | 16 | #define ALLOC(size) malloc(size) |
17 | #define TRYFREE(p) {if (p) free(p);} | 17 | #define TRYFREE(p) {if (p) free(p);} |
18 | 18 | ||
19 | #define GZ_MAGIC_1 0x1f | 19 | static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ |
20 | #define GZ_MAGIC_2 0x8b | ||
21 | 20 | ||
22 | /* gzip flag byte */ | 21 | /* gzip flag byte */ |
23 | #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ | 22 | #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ |
@@ -27,10 +26,6 @@ struct internal_state {int dummy;}; /* for buggy compilers */ | |||
27 | #define COMMENT 0x10 /* bit 4 set: file comment present */ | 26 | #define COMMENT 0x10 /* bit 4 set: file comment present */ |
28 | #define RESERVED 0xE0 /* bits 5..7: reserved */ | 27 | #define RESERVED 0xE0 /* bits 5..7: reserved */ |
29 | 28 | ||
30 | #ifndef SEEK_CUR | ||
31 | # define SEEK_CUR 1 | ||
32 | #endif | ||
33 | |||
34 | typedef struct gz_stream { | 29 | typedef struct gz_stream { |
35 | z_stream stream; | 30 | z_stream stream; |
36 | int z_err; /* error code for last stream operation */ | 31 | int z_err; /* error code for last stream operation */ |
@@ -46,44 +41,16 @@ typedef struct gz_stream { | |||
46 | } gz_stream; | 41 | } gz_stream; |
47 | 42 | ||
48 | 43 | ||
49 | local int destroy OF((gz_stream *s)); | 44 | local gzFile gz_open OF((const char *path, const char *mode, int fd)); |
50 | local gzFile gz_open OF((char *path, char *mode, int fd)); | 45 | local int get_byte OF((gz_stream *s)); |
51 | local void putLong OF((FILE *file, uLong x)); | 46 | local void check_header OF((gz_stream *s)); |
52 | local uLong getLong OF((Bytef *buf)); | 47 | local int destroy OF((gz_stream *s)); |
53 | 48 | local void putLong OF((FILE *file, uLong x)); | |
54 | /* =========================================================================== | 49 | local uLong getLong OF((gz_stream *s)); |
55 | * Cleanup then free the given gz_stream. Return a zlib error code. | ||
56 | */ | ||
57 | local int destroy (s) | ||
58 | gz_stream *s; | ||
59 | { | ||
60 | int err = Z_OK; | ||
61 | |||
62 | if (!s) return Z_STREAM_ERROR; | ||
63 | |||
64 | TRYFREE(s->inbuf); | ||
65 | TRYFREE(s->outbuf); | ||
66 | TRYFREE(s->path); | ||
67 | TRYFREE(s->msg); | ||
68 | |||
69 | if (s->stream.state != NULL) { | ||
70 | if (s->mode == 'w') { | ||
71 | err = deflateEnd(&(s->stream)); | ||
72 | } else if (s->mode == 'r') { | ||
73 | err = inflateEnd(&(s->stream)); | ||
74 | } | ||
75 | } | ||
76 | if (s->file != NULL && fclose(s->file)) { | ||
77 | err = Z_ERRNO; | ||
78 | } | ||
79 | if (s->z_err < 0) err = s->z_err; | ||
80 | TRYFREE(s); | ||
81 | return err; | ||
82 | } | ||
83 | 50 | ||
84 | /* =========================================================================== | 51 | /* =========================================================================== |
85 | Opens a gzip (.gz) file for reading or writing. The mode parameter | 52 | Opens a gzip (.gz) file for reading or writing. The mode parameter |
86 | is as in fopen ("rb" or "wb"). The file is given either by file descritor | 53 | is as in fopen ("rb" or "wb"). The file is given either by file descriptor |
87 | or path name (if fd == -1). | 54 | or path name (if fd == -1). |
88 | gz_open return NULL if the file could not be opened or if there was | 55 | gz_open return NULL if the file could not be opened or if there was |
89 | insufficient memory to allocate the (de)compression state; errno | 56 | insufficient memory to allocate the (de)compression state; errno |
@@ -91,19 +58,25 @@ local int destroy (s) | |||
91 | zlib error is Z_MEM_ERROR). | 58 | zlib error is Z_MEM_ERROR). |
92 | */ | 59 | */ |
93 | local gzFile gz_open (path, mode, fd) | 60 | local gzFile gz_open (path, mode, fd) |
94 | char *path; | 61 | const char *path; |
95 | char *mode; | 62 | const char *mode; |
96 | int fd; | 63 | int fd; |
97 | { | 64 | { |
98 | int err; | 65 | int err; |
99 | int level = Z_DEFAULT_COMPRESSION; /* compression level */ | 66 | int level = Z_DEFAULT_COMPRESSION; /* compression level */ |
100 | char *p = mode; | 67 | char *p = (char*)mode; |
101 | gz_stream *s = (gz_stream *)ALLOC(sizeof(gz_stream)); | 68 | gz_stream *s; |
69 | char fmode[80]; /* copy of mode, without the compression level */ | ||
70 | char *m = fmode; | ||
71 | |||
72 | if (!path || !mode) return Z_NULL; | ||
102 | 73 | ||
74 | s = (gz_stream *)ALLOC(sizeof(gz_stream)); | ||
103 | if (!s) return Z_NULL; | 75 | if (!s) return Z_NULL; |
104 | 76 | ||
105 | s->stream.zalloc = (alloc_func)0; | 77 | s->stream.zalloc = (alloc_func)0; |
106 | s->stream.zfree = (free_func)0; | 78 | s->stream.zfree = (free_func)0; |
79 | s->stream.opaque = (voidpf)0; | ||
107 | s->stream.next_in = s->inbuf = Z_NULL; | 80 | s->stream.next_in = s->inbuf = Z_NULL; |
108 | s->stream.next_out = s->outbuf = Z_NULL; | 81 | s->stream.next_out = s->outbuf = Z_NULL; |
109 | s->stream.avail_in = s->stream.avail_out = 0; | 82 | s->stream.avail_in = s->stream.avail_out = 0; |
@@ -123,14 +96,18 @@ local gzFile gz_open (path, mode, fd) | |||
123 | s->mode = '\0'; | 96 | s->mode = '\0'; |
124 | do { | 97 | do { |
125 | if (*p == 'r') s->mode = 'r'; | 98 | if (*p == 'r') s->mode = 'r'; |
126 | if (*p == 'w') s->mode = 'w'; | 99 | if (*p == 'w' || *p == 'a') s->mode = 'w'; |
127 | if (*p >= '1' && *p <= '9') level = *p - '0'; | 100 | if (*p >= '0' && *p <= '9') { |
128 | } while (*p++); | 101 | level = *p - '0'; |
102 | } else { | ||
103 | *m++ = *p; /* copy the mode */ | ||
104 | } | ||
105 | } while (*p++ && m != fmode + sizeof(fmode)); | ||
129 | if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; | 106 | if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; |
130 | 107 | ||
131 | if (s->mode == 'w') { | 108 | if (s->mode == 'w') { |
132 | err = deflateInit2(&(s->stream), level, | 109 | err = deflateInit2(&(s->stream), level, |
133 | DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0); | 110 | Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, 0); |
134 | /* windowBits is passed < 0 to suppress zlib header */ | 111 | /* windowBits is passed < 0 to suppress zlib header */ |
135 | 112 | ||
136 | s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); | 113 | s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); |
@@ -149,7 +126,7 @@ local gzFile gz_open (path, mode, fd) | |||
149 | s->stream.avail_out = Z_BUFSIZE; | 126 | s->stream.avail_out = Z_BUFSIZE; |
150 | 127 | ||
151 | errno = 0; | 128 | errno = 0; |
152 | s->file = fd < 0 ? FOPEN(path, mode) : fdopen(fd, mode); | 129 | s->file = fd < 0 ? FOPEN(path, fmode) : (FILE*)fdopen(fd, fmode); |
153 | 130 | ||
154 | if (s->file == NULL) { | 131 | if (s->file == NULL) { |
155 | return destroy(s), (gzFile)Z_NULL; | 132 | return destroy(s), (gzFile)Z_NULL; |
@@ -157,50 +134,10 @@ local gzFile gz_open (path, mode, fd) | |||
157 | if (s->mode == 'w') { | 134 | if (s->mode == 'w') { |
158 | /* Write a very simple .gz header: | 135 | /* Write a very simple .gz header: |
159 | */ | 136 | */ |
160 | fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", GZ_MAGIC_1, GZ_MAGIC_2, | 137 | fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], |
161 | DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); | 138 | Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); |
162 | } else { | 139 | } else { |
163 | /* Check and skip the header: | 140 | check_header(s); /* skip the .gz header */ |
164 | */ | ||
165 | Byte c1 = 0, c2 = 0; | ||
166 | Byte method = 0; | ||
167 | Byte flags = 0; | ||
168 | Byte xflags = 0; | ||
169 | Byte time[4]; | ||
170 | Byte osCode; | ||
171 | int c; | ||
172 | |||
173 | s->stream.avail_in = fread(s->inbuf, 1, 2, s->file); | ||
174 | if (s->stream.avail_in != 2 || s->inbuf[0] != GZ_MAGIC_1 | ||
175 | || s->inbuf[1] != GZ_MAGIC_2) { | ||
176 | s->transparent = 1; | ||
177 | return (gzFile)s; | ||
178 | } | ||
179 | s->stream.avail_in = 0; | ||
180 | fscanf(s->file,"%c%c%4c%c%c", &method, &flags, time, &xflags, &osCode); | ||
181 | |||
182 | if (method != DEFLATED || feof(s->file) || (flags & RESERVED) != 0) { | ||
183 | s->z_err = Z_DATA_ERROR; | ||
184 | return (gzFile)s; | ||
185 | } | ||
186 | if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ | ||
187 | long len; | ||
188 | fscanf(s->file, "%c%c", &c1, &c2); | ||
189 | len = c1 + ((long)c2<<8); | ||
190 | fseek(s->file, len, SEEK_CUR); | ||
191 | } | ||
192 | if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ | ||
193 | while ((c = getc(s->file)) != 0 && c != EOF) ; | ||
194 | } | ||
195 | if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ | ||
196 | while ((c = getc(s->file)) != 0 && c != EOF) ; | ||
197 | } | ||
198 | if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ | ||
199 | fscanf(s->file, "%c%c", &c1, &c2); | ||
200 | } | ||
201 | if (feof(s->file)) { | ||
202 | s->z_err = Z_DATA_ERROR; | ||
203 | } | ||
204 | } | 141 | } |
205 | return (gzFile)s; | 142 | return (gzFile)s; |
206 | } | 143 | } |
@@ -209,26 +146,139 @@ local gzFile gz_open (path, mode, fd) | |||
209 | Opens a gzip (.gz) file for reading or writing. | 146 | Opens a gzip (.gz) file for reading or writing. |
210 | */ | 147 | */ |
211 | gzFile gzopen (path, mode) | 148 | gzFile gzopen (path, mode) |
212 | char *path; | 149 | const char *path; |
213 | char *mode; | 150 | const char *mode; |
214 | { | 151 | { |
215 | return gz_open (path, mode, -1); | 152 | return gz_open (path, mode, -1); |
216 | } | 153 | } |
217 | 154 | ||
218 | /* =========================================================================== | 155 | /* =========================================================================== |
219 | Associate a gzFile with the file descriptor fd. | 156 | Associate a gzFile with the file descriptor fd. fd is not dup'ed here |
157 | to mimic the behavio(u)r of fdopen. | ||
220 | */ | 158 | */ |
221 | gzFile gzdopen (fd, mode) | 159 | gzFile gzdopen (fd, mode) |
222 | int fd; | 160 | int fd; |
223 | char *mode; | 161 | const char *mode; |
224 | { | 162 | { |
225 | char name[20]; | 163 | char name[20]; |
164 | |||
165 | if (fd < 0) return (gzFile)Z_NULL; | ||
226 | sprintf(name, "<fd:%d>", fd); /* for debugging */ | 166 | sprintf(name, "<fd:%d>", fd); /* for debugging */ |
227 | 167 | ||
228 | return gz_open (name, mode, fd); | 168 | return gz_open (name, mode, fd); |
229 | } | 169 | } |
230 | 170 | ||
231 | /* =========================================================================== | 171 | /* =========================================================================== |
172 | Read a byte from a gz_stream; update next_in and avail_in. Return EOF | ||
173 | for end of file. | ||
174 | IN assertion: the stream s has been sucessfully opened for reading. | ||
175 | */ | ||
176 | local int get_byte(s) | ||
177 | gz_stream *s; | ||
178 | { | ||
179 | if (s->z_eof) return EOF; | ||
180 | if (s->stream.avail_in == 0) { | ||
181 | errno = 0; | ||
182 | s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||
183 | if (s->stream.avail_in == 0) { | ||
184 | s->z_eof = 1; | ||
185 | if (ferror(s->file)) s->z_err = Z_ERRNO; | ||
186 | return EOF; | ||
187 | } | ||
188 | s->stream.next_in = s->inbuf; | ||
189 | } | ||
190 | s->stream.avail_in--; | ||
191 | return *(s->stream.next_in)++; | ||
192 | } | ||
193 | |||
194 | /* =========================================================================== | ||
195 | Check the gzip header of a gz_stream opened for reading. Set the stream | ||
196 | mode to transparent if the gzip magic header is not present; set s->err | ||
197 | to Z_DATA_ERROR if the magic header is present but the rest of the header | ||
198 | is incorrect. | ||
199 | IN assertion: the stream s has already been created sucessfully; | ||
200 | s->stream.avail_in is zero for the first time, but may be non-zero | ||
201 | for concatenated .gz files. | ||
202 | */ | ||
203 | local void check_header(s) | ||
204 | gz_stream *s; | ||
205 | { | ||
206 | int method = 0; | ||
207 | int flags = 0; | ||
208 | uInt len; | ||
209 | int c; | ||
210 | |||
211 | /* Check the gzip magic header */ | ||
212 | for (len = 0; len < 2; len++) { | ||
213 | c = get_byte(s); | ||
214 | if (c != gz_magic[len]) { | ||
215 | s->transparent = 1; | ||
216 | if (c != EOF) s->stream.avail_in++, s->stream.next_in--; | ||
217 | s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END; | ||
218 | return; | ||
219 | } | ||
220 | } | ||
221 | method = get_byte(s); | ||
222 | flags = get_byte(s); | ||
223 | if (method != Z_DEFLATED || (flags & RESERVED) != 0) { | ||
224 | s->z_err = Z_DATA_ERROR; | ||
225 | return; | ||
226 | } | ||
227 | |||
228 | /* Discard time, xflags and OS code: */ | ||
229 | for (len = 0; len < 6; len++) (void)get_byte(s); | ||
230 | |||
231 | if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ | ||
232 | len = (uInt)get_byte(s); | ||
233 | len += ((uInt)get_byte(s))<<8; | ||
234 | /* len is garbage if EOF but the loop below will quit anyway */ | ||
235 | while (len-- != 0 && get_byte(s) != EOF) ; | ||
236 | } | ||
237 | if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ | ||
238 | while ((c = get_byte(s)) != 0 && c != EOF) ; | ||
239 | } | ||
240 | if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ | ||
241 | while ((c = get_byte(s)) != 0 && c != EOF) ; | ||
242 | } | ||
243 | if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ | ||
244 | for (len = 0; len < 2; len++) (void)get_byte(s); | ||
245 | } | ||
246 | s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; | ||
247 | } | ||
248 | |||
249 | /* =========================================================================== | ||
250 | * Cleanup then free the given gz_stream. Return a zlib error code. | ||
251 | Try freeing in the reverse order of allocations. | ||
252 | */ | ||
253 | local int destroy (s) | ||
254 | gz_stream *s; | ||
255 | { | ||
256 | int err = Z_OK; | ||
257 | |||
258 | if (!s) return Z_STREAM_ERROR; | ||
259 | |||
260 | TRYFREE(s->msg); | ||
261 | |||
262 | if (s->stream.state != NULL) { | ||
263 | if (s->mode == 'w') { | ||
264 | err = deflateEnd(&(s->stream)); | ||
265 | } else if (s->mode == 'r') { | ||
266 | err = inflateEnd(&(s->stream)); | ||
267 | } | ||
268 | } | ||
269 | if (s->file != NULL && fclose(s->file)) { | ||
270 | err = Z_ERRNO; | ||
271 | } | ||
272 | if (s->z_err < 0) err = s->z_err; | ||
273 | |||
274 | TRYFREE(s->inbuf); | ||
275 | TRYFREE(s->outbuf); | ||
276 | TRYFREE(s->path); | ||
277 | TRYFREE(s); | ||
278 | return err; | ||
279 | } | ||
280 | |||
281 | /* =========================================================================== | ||
232 | Reads the given number of uncompressed bytes from the compressed file. | 282 | Reads the given number of uncompressed bytes from the compressed file. |
233 | gzread returns the number of bytes actually read (0 for end of file). | 283 | gzread returns the number of bytes actually read (0 for end of file). |
234 | */ | 284 | */ |
@@ -238,52 +288,71 @@ int gzread (file, buf, len) | |||
238 | unsigned len; | 288 | unsigned len; |
239 | { | 289 | { |
240 | gz_stream *s = (gz_stream*)file; | 290 | gz_stream *s = (gz_stream*)file; |
291 | Byte *start = buf; /* starting point for crc computation */ | ||
241 | 292 | ||
242 | if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; | 293 | if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; |
243 | 294 | ||
244 | if (s->transparent) { | 295 | if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; |
245 | int n = 0; | 296 | if (s->z_err == Z_STREAM_END) return 0; /* EOF */ |
246 | Byte *b = (Byte*)buf; | ||
247 | /* Copy the first two (non-magic) bytes if not done already */ | ||
248 | while (s->stream.avail_in > 0 && len > 0) { | ||
249 | *b++ = *s->stream.next_in++; | ||
250 | s->stream.avail_in--; | ||
251 | len--; n++; | ||
252 | } | ||
253 | if (len == 0) return n; | ||
254 | return n + fread(b, 1, len, s->file); | ||
255 | } | ||
256 | if (s->z_err == Z_DATA_ERROR) return -1; /* bad .gz file */ | ||
257 | if (s->z_err == Z_STREAM_END) return 0; /* don't read crc as data */ | ||
258 | 297 | ||
259 | s->stream.next_out = buf; | 298 | s->stream.next_out = buf; |
260 | s->stream.avail_out = len; | 299 | s->stream.avail_out = len; |
261 | 300 | ||
262 | while (s->stream.avail_out != 0) { | 301 | while (s->stream.avail_out != 0) { |
263 | 302 | ||
303 | if (s->transparent) { | ||
304 | /* Copy first the lookahead bytes: */ | ||
305 | uInt n = s->stream.avail_in; | ||
306 | if (n > s->stream.avail_out) n = s->stream.avail_out; | ||
307 | if (n > 0) { | ||
308 | zmemcpy(s->stream.next_out, s->stream.next_in, n); | ||
309 | s->stream.next_out += n; | ||
310 | s->stream.next_in += n; | ||
311 | s->stream.avail_out -= n; | ||
312 | s->stream.avail_in -= n; | ||
313 | } | ||
314 | if (s->stream.avail_out > 0) { | ||
315 | s->stream.avail_out -= fread(s->stream.next_out, | ||
316 | 1, s->stream.avail_out, s->file); | ||
317 | } | ||
318 | return (int)(len - s->stream.avail_out); | ||
319 | } | ||
264 | if (s->stream.avail_in == 0 && !s->z_eof) { | 320 | if (s->stream.avail_in == 0 && !s->z_eof) { |
265 | 321 | ||
266 | errno = 0; | 322 | errno = 0; |
267 | s->stream.avail_in = | 323 | s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); |
268 | fread(s->inbuf, 1, Z_BUFSIZE, s->file); | ||
269 | if (s->stream.avail_in == 0) { | 324 | if (s->stream.avail_in == 0) { |
270 | s->z_eof = 1; | 325 | s->z_eof = 1; |
271 | } else if (s->stream.avail_in == (uInt)EOF) { | 326 | if (ferror(s->file)) { |
272 | s->stream.avail_in = 0; | 327 | s->z_err = Z_ERRNO; |
273 | s->z_eof = 1; | 328 | break; |
274 | s->z_err = Z_ERRNO; | 329 | } |
275 | break; | ||
276 | } | 330 | } |
277 | s->stream.next_in = s->inbuf; | 331 | s->stream.next_in = s->inbuf; |
278 | } | 332 | } |
279 | s->z_err = inflate(&(s->stream), Z_NO_FLUSH); | 333 | s->z_err = inflate(&(s->stream), Z_NO_FLUSH); |
280 | 334 | ||
281 | if (s->z_err == Z_STREAM_END || | 335 | if (s->z_err == Z_STREAM_END) { |
282 | s->z_err != Z_OK || s->z_eof) break; | 336 | /* Check CRC and original size */ |
337 | s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); | ||
338 | start = s->stream.next_out; | ||
339 | |||
340 | if (getLong(s) != s->crc || getLong(s) != s->stream.total_out) { | ||
341 | s->z_err = Z_DATA_ERROR; | ||
342 | } else { | ||
343 | /* Check for concatenated .gz files: */ | ||
344 | check_header(s); | ||
345 | if (s->z_err == Z_OK) { | ||
346 | inflateReset(&(s->stream)); | ||
347 | s->crc = crc32(0L, Z_NULL, 0); | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | if (s->z_err != Z_OK || s->z_eof) break; | ||
283 | } | 352 | } |
284 | len -= s->stream.avail_out; | 353 | s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); |
285 | s->crc = crc32(s->crc, buf, len); | 354 | |
286 | return (int)len; | 355 | return (int)(len - s->stream.avail_out); |
287 | } | 356 | } |
288 | 357 | ||
289 | /* =========================================================================== | 358 | /* =========================================================================== |
@@ -292,7 +361,7 @@ int gzread (file, buf, len) | |||
292 | */ | 361 | */ |
293 | int gzwrite (file, buf, len) | 362 | int gzwrite (file, buf, len) |
294 | gzFile file; | 363 | gzFile file; |
295 | voidp buf; | 364 | const voidp buf; |
296 | unsigned len; | 365 | unsigned len; |
297 | { | 366 | { |
298 | gz_stream *s = (gz_stream*)file; | 367 | gz_stream *s = (gz_stream*)file; |
@@ -343,7 +412,7 @@ int gzflush (file, flush) | |||
343 | len = Z_BUFSIZE - s->stream.avail_out; | 412 | len = Z_BUFSIZE - s->stream.avail_out; |
344 | 413 | ||
345 | if (len != 0) { | 414 | if (len != 0) { |
346 | if (fwrite(s->outbuf, 1, len, s->file) != len) { | 415 | if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { |
347 | s->z_err = Z_ERRNO; | 416 | s->z_err = Z_ERRNO; |
348 | return Z_ERRNO; | 417 | return Z_ERRNO; |
349 | } | 418 | } |
@@ -379,18 +448,19 @@ local void putLong (file, x) | |||
379 | } | 448 | } |
380 | 449 | ||
381 | /* =========================================================================== | 450 | /* =========================================================================== |
382 | Reads a long in LSB order from the given buffer | 451 | Reads a long in LSB order from the given gz_stream. Sets |
383 | */ | 452 | */ |
384 | local uLong getLong (buf) | 453 | local uLong getLong (s) |
385 | Bytef *buf; | 454 | gz_stream *s; |
386 | { | 455 | { |
387 | uLong x = 0; | 456 | uLong x = (uLong)get_byte(s); |
388 | Bytef *p = buf+4; | 457 | int c; |
389 | 458 | ||
390 | do { | 459 | x += ((uLong)get_byte(s))<<8; |
391 | x <<= 8; | 460 | x += ((uLong)get_byte(s))<<16; |
392 | x |= *--p; | 461 | c = get_byte(s); |
393 | } while (p != buf); | 462 | if (c == EOF) s->z_err = Z_DATA_ERROR; |
463 | x += ((uLong)c)<<24; | ||
394 | return x; | 464 | return x; |
395 | } | 465 | } |
396 | 466 | ||
@@ -401,7 +471,6 @@ local uLong getLong (buf) | |||
401 | int gzclose (file) | 471 | int gzclose (file) |
402 | gzFile file; | 472 | gzFile file; |
403 | { | 473 | { |
404 | uInt n; | ||
405 | int err; | 474 | int err; |
406 | gz_stream *s = (gz_stream*)file; | 475 | gz_stream *s = (gz_stream*)file; |
407 | 476 | ||
@@ -414,25 +483,6 @@ int gzclose (file) | |||
414 | putLong (s->file, s->crc); | 483 | putLong (s->file, s->crc); |
415 | putLong (s->file, s->stream.total_in); | 484 | putLong (s->file, s->stream.total_in); |
416 | 485 | ||
417 | } else if (s->mode == 'r' && s->z_err == Z_STREAM_END) { | ||
418 | |||
419 | /* slide CRC and original size if they are at the end of inbuf */ | ||
420 | if ((n = s->stream.avail_in) < 8 && !s->z_eof) { | ||
421 | Byte *p = s->inbuf; | ||
422 | Bytef *q = s->stream.next_in; | ||
423 | while (n--) { *p++ = *q++; }; | ||
424 | |||
425 | n = s->stream.avail_in; | ||
426 | n += fread(p, 1, 8, s->file); | ||
427 | s->stream.next_in = s->inbuf; | ||
428 | } | ||
429 | /* check CRC and original size */ | ||
430 | if (n < 8 || | ||
431 | getLong(s->stream.next_in) != s->crc || | ||
432 | getLong(s->stream.next_in + 4) != s->stream.total_out) { | ||
433 | |||
434 | s->z_err = Z_DATA_ERROR; | ||
435 | } | ||
436 | } | 486 | } |
437 | return destroy(file); | 487 | return destroy(file); |
438 | } | 488 | } |
@@ -453,14 +503,14 @@ char* gzerror (file, errnum) | |||
453 | 503 | ||
454 | if (s == NULL) { | 504 | if (s == NULL) { |
455 | *errnum = Z_STREAM_ERROR; | 505 | *errnum = Z_STREAM_ERROR; |
456 | return z_errmsg[1-Z_STREAM_ERROR]; | 506 | return ERR_MSG(Z_STREAM_ERROR); |
457 | } | 507 | } |
458 | *errnum = s->z_err; | 508 | *errnum = s->z_err; |
459 | if (*errnum == Z_OK) return ""; | 509 | if (*errnum == Z_OK) return (char*)""; |
460 | 510 | ||
461 | m = *errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg; | 511 | m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); |
462 | 512 | ||
463 | if (m == NULL || *m == '\0') m = z_errmsg[1-s->z_err]; | 513 | if (m == NULL || *m == '\0') m = (char*)z_errmsg[1-s->z_err]; |
464 | 514 | ||
465 | TRYFREE(s->msg); | 515 | TRYFREE(s->msg); |
466 | s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); | 516 | s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); |
@@ -1,5 +1,5 @@ | |||
1 | /* infblock.c -- interpret and process block types to last block | 1 | /* infblock.c -- interpret and process block types to last block |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -81,7 +81,7 @@ uLongf *c; | |||
81 | s->bitb = 0; | 81 | s->bitb = 0; |
82 | s->read = s->write = s->window; | 82 | s->read = s->write = s->window; |
83 | if (s->checkfn != Z_NULL) | 83 | if (s->checkfn != Z_NULL) |
84 | s->check = (*s->checkfn)(0L, Z_NULL, 0); | 84 | z->adler = s->check = (*s->checkfn)(0L, Z_NULL, 0); |
85 | Trace((stderr, "inflate: blocks reset\n")); | 85 | Trace((stderr, "inflate: blocks reset\n")); |
86 | } | 86 | } |
87 | 87 | ||
@@ -172,17 +172,17 @@ int r; | |||
172 | case 3: /* illegal */ | 172 | case 3: /* illegal */ |
173 | DUMPBITS(3) | 173 | DUMPBITS(3) |
174 | s->mode = BAD; | 174 | s->mode = BAD; |
175 | z->msg = "invalid block type"; | 175 | z->msg = (char*)"invalid block type"; |
176 | r = Z_DATA_ERROR; | 176 | r = Z_DATA_ERROR; |
177 | LEAVE | 177 | LEAVE |
178 | } | 178 | } |
179 | break; | 179 | break; |
180 | case LENS: | 180 | case LENS: |
181 | NEEDBITS(32) | 181 | NEEDBITS(32) |
182 | if (((~b) >> 16) != (b & 0xffff)) | 182 | if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) |
183 | { | 183 | { |
184 | s->mode = BAD; | 184 | s->mode = BAD; |
185 | z->msg = "invalid stored block lengths"; | 185 | z->msg = (char*)"invalid stored block lengths"; |
186 | r = Z_DATA_ERROR; | 186 | r = Z_DATA_ERROR; |
187 | LEAVE | 187 | LEAVE |
188 | } | 188 | } |
@@ -215,7 +215,7 @@ int r; | |||
215 | if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) | 215 | if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) |
216 | { | 216 | { |
217 | s->mode = BAD; | 217 | s->mode = BAD; |
218 | z->msg = "too many length or distance symbols"; | 218 | z->msg = (char*)"too many length or distance symbols"; |
219 | r = Z_DATA_ERROR; | 219 | r = Z_DATA_ERROR; |
220 | LEAVE | 220 | LEAVE |
221 | } | 221 | } |
@@ -285,7 +285,7 @@ int r; | |||
285 | (c == 16 && i < 1)) | 285 | (c == 16 && i < 1)) |
286 | { | 286 | { |
287 | s->mode = BAD; | 287 | s->mode = BAD; |
288 | z->msg = "invalid bit length repeat"; | 288 | z->msg = (char*)"invalid bit length repeat"; |
289 | r = Z_DATA_ERROR; | 289 | r = Z_DATA_ERROR; |
290 | LEAVE | 290 | LEAVE |
291 | } | 291 | } |
@@ -383,3 +383,14 @@ uLongf *c; | |||
383 | Trace((stderr, "inflate: blocks freed\n")); | 383 | Trace((stderr, "inflate: blocks freed\n")); |
384 | return Z_OK; | 384 | return Z_OK; |
385 | } | 385 | } |
386 | |||
387 | |||
388 | void inflate_set_dictionary(s, z, d, n) | ||
389 | inflate_blocks_statef *s; | ||
390 | z_stream *z; | ||
391 | const Bytef *d; | ||
392 | uInt n; | ||
393 | { | ||
394 | zmemcpy((charf *)s->window, d, n); | ||
395 | s->read = s->write = s->window + n; | ||
396 | } | ||
@@ -1,5 +1,5 @@ | |||
1 | /* infblock.h -- header to use infblock.c | 1 | /* infblock.h -- header to use infblock.c |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -30,3 +30,9 @@ extern int inflate_blocks_free OF(( | |||
30 | inflate_blocks_statef *, | 30 | inflate_blocks_statef *, |
31 | z_stream *, | 31 | z_stream *, |
32 | uLongf *)); /* check value on output */ | 32 | uLongf *)); /* check value on output */ |
33 | |||
34 | extern void inflate_set_dictionary OF(( | ||
35 | inflate_blocks_statef *s, | ||
36 | z_stream *z, | ||
37 | const Bytef *d, /* dictionary */ | ||
38 | uInt n)); /* dictionary length */ | ||
@@ -1,5 +1,5 @@ | |||
1 | /* infcodes.c -- process literals and length/distance pairs | 1 | /* infcodes.c -- process literals and length/distance pairs |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -58,7 +58,8 @@ struct inflate_codes_state { | |||
58 | 58 | ||
59 | inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) | 59 | inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) |
60 | uInt bl, bd; | 60 | uInt bl, bd; |
61 | inflate_huft *tl, *td; | 61 | inflate_huft *tl; |
62 | inflate_huft *td; /* need separate declaration for Borland C++ */ | ||
62 | z_stream *z; | 63 | z_stream *z; |
63 | { | 64 | { |
64 | inflate_codes_statef *c; | 65 | inflate_codes_statef *c; |
@@ -152,7 +153,7 @@ int r; | |||
152 | break; | 153 | break; |
153 | } | 154 | } |
154 | c->mode = BADCODE; /* invalid code */ | 155 | c->mode = BADCODE; /* invalid code */ |
155 | z->msg = "invalid literal/length code"; | 156 | z->msg = (char*)"invalid literal/length code"; |
156 | r = Z_DATA_ERROR; | 157 | r = Z_DATA_ERROR; |
157 | LEAVE | 158 | LEAVE |
158 | case LENEXT: /* i: getting length extra (have base) */ | 159 | case LENEXT: /* i: getting length extra (have base) */ |
@@ -184,7 +185,7 @@ int r; | |||
184 | break; | 185 | break; |
185 | } | 186 | } |
186 | c->mode = BADCODE; /* invalid code */ | 187 | c->mode = BADCODE; /* invalid code */ |
187 | z->msg = "invalid distance code"; | 188 | z->msg = (char*)"invalid distance code"; |
188 | r = Z_DATA_ERROR; | 189 | r = Z_DATA_ERROR; |
189 | LEAVE | 190 | LEAVE |
190 | case DISTEXT: /* i: getting distance extra */ | 191 | case DISTEXT: /* i: getting distance extra */ |
@@ -202,7 +203,7 @@ int r; | |||
202 | #else | 203 | #else |
203 | f = q - c->sub.copy.dist; | 204 | f = q - c->sub.copy.dist; |
204 | if ((uInt)(q - s->window) < c->sub.copy.dist) | 205 | if ((uInt)(q - s->window) < c->sub.copy.dist) |
205 | f = s->end - (c->sub.copy.dist - (q - s->window)); | 206 | f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); |
206 | #endif | 207 | #endif |
207 | while (c->len) | 208 | while (c->len) |
208 | { | 209 | { |
@@ -1,5 +1,5 @@ | |||
1 | /* infcodes.h -- header to use infcodes.c | 1 | /* infcodes.h -- header to use infcodes.c |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* inffast.c -- process literals and length/distance pairs fast | 1 | /* inffast.c -- process literals and length/distance pairs fast |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -29,7 +29,8 @@ struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | |||
29 | 29 | ||
30 | int inflate_fast(bl, bd, tl, td, s, z) | 30 | int inflate_fast(bl, bd, tl, td, s, z) |
31 | uInt bl, bd; | 31 | uInt bl, bd; |
32 | inflate_huft *tl, *td; | 32 | inflate_huft *tl; |
33 | inflate_huft *td; /* need separate declaration for Borland C++ */ | ||
33 | inflate_blocks_statef *s; | 34 | inflate_blocks_statef *s; |
34 | z_stream *z; | 35 | z_stream *z; |
35 | { | 36 | { |
@@ -102,7 +103,7 @@ z_stream *z; | |||
102 | } | 103 | } |
103 | else /* else offset after destination */ | 104 | else /* else offset after destination */ |
104 | { | 105 | { |
105 | e = d - (q - s->window); /* bytes from offset to end */ | 106 | e = d - (uInt)(q - s->window); /* bytes from offset to end */ |
106 | r = s->end - e; /* pointer to offset */ | 107 | r = s->end - e; /* pointer to offset */ |
107 | if (c > e) /* if source crosses, */ | 108 | if (c > e) /* if source crosses, */ |
108 | { | 109 | { |
@@ -122,7 +123,7 @@ z_stream *z; | |||
122 | e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop; | 123 | e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop; |
123 | else | 124 | else |
124 | { | 125 | { |
125 | z->msg = "invalid distance code"; | 126 | z->msg = (char*)"invalid distance code"; |
126 | UNGRAB | 127 | UNGRAB |
127 | UPDATE | 128 | UPDATE |
128 | return Z_DATA_ERROR; | 129 | return Z_DATA_ERROR; |
@@ -152,7 +153,7 @@ z_stream *z; | |||
152 | } | 153 | } |
153 | else | 154 | else |
154 | { | 155 | { |
155 | z->msg = "invalid literal/length code"; | 156 | z->msg = (char*)"invalid literal/length code"; |
156 | UNGRAB | 157 | UNGRAB |
157 | UPDATE | 158 | UPDATE |
158 | return Z_DATA_ERROR; | 159 | return Z_DATA_ERROR; |
@@ -1,5 +1,5 @@ | |||
1 | /* inffast.h -- header to use inffast.c | 1 | /* inffast.h -- header to use inffast.c |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* inflate.c -- zlib interface to inflate modules | 1 | /* inflate.c -- zlib interface to inflate modules |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -15,6 +15,11 @@ struct internal_state { | |||
15 | enum { | 15 | enum { |
16 | METHOD, /* waiting for method byte */ | 16 | METHOD, /* waiting for method byte */ |
17 | FLAG, /* waiting for flag byte */ | 17 | FLAG, /* waiting for flag byte */ |
18 | DICT4, /* four dictionary check bytes to go */ | ||
19 | DICT3, /* three dictionary check bytes to go */ | ||
20 | DICT2, /* two dictionary check bytes to go */ | ||
21 | DICT1, /* one dictionary check byte to go */ | ||
22 | DICT0, /* waiting for inflateSetDictionary */ | ||
18 | BLOCKS, /* decompressing blocks */ | 23 | BLOCKS, /* decompressing blocks */ |
19 | CHECK4, /* four check bytes to go */ | 24 | CHECK4, /* four check bytes to go */ |
20 | CHECK3, /* three check bytes to go */ | 25 | CHECK3, /* three check bytes to go */ |
@@ -75,14 +80,25 @@ z_stream *z; | |||
75 | } | 80 | } |
76 | 81 | ||
77 | 82 | ||
78 | int inflateInit2(z, w) | 83 | int inflateInit2_(z, w, version, stream_size) |
79 | z_stream *z; | 84 | z_stream *z; |
80 | int w; | 85 | int w; |
86 | const char *version; | ||
87 | int stream_size; | ||
81 | { | 88 | { |
89 | if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || | ||
90 | stream_size != sizeof(z_stream)) | ||
91 | return Z_VERSION_ERROR; | ||
92 | |||
82 | /* initialize state */ | 93 | /* initialize state */ |
83 | if (z == Z_NULL) | 94 | if (z == Z_NULL) |
84 | return Z_STREAM_ERROR; | 95 | return Z_STREAM_ERROR; |
85 | if (z->zalloc == Z_NULL) z->zalloc = zcalloc; | 96 | z->msg = Z_NULL; |
97 | if (z->zalloc == Z_NULL) | ||
98 | { | ||
99 | z->zalloc = zcalloc; | ||
100 | z->opaque = (voidpf)0; | ||
101 | } | ||
86 | if (z->zfree == Z_NULL) z->zfree = zcfree; | 102 | if (z->zfree == Z_NULL) z->zfree = zcfree; |
87 | if ((z->state = (struct internal_state FAR *) | 103 | if ((z->state = (struct internal_state FAR *) |
88 | ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) | 104 | ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) |
@@ -107,7 +123,7 @@ int w; | |||
107 | 123 | ||
108 | /* create inflate_blocks state */ | 124 | /* create inflate_blocks state */ |
109 | if ((z->state->blocks = | 125 | if ((z->state->blocks = |
110 | inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w)) | 126 | inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) |
111 | == Z_NULL) | 127 | == Z_NULL) |
112 | { | 128 | { |
113 | inflateEnd(z); | 129 | inflateEnd(z); |
@@ -121,10 +137,12 @@ int w; | |||
121 | } | 137 | } |
122 | 138 | ||
123 | 139 | ||
124 | int inflateInit(z) | 140 | int inflateInit_(z, version, stream_size) |
125 | z_stream *z; | 141 | z_stream *z; |
142 | const char *version; | ||
143 | int stream_size; | ||
126 | { | 144 | { |
127 | return inflateInit2(z, DEF_WBITS); | 145 | return inflateInit2_(z, DEF_WBITS, version, stream_size); |
128 | } | 146 | } |
129 | 147 | ||
130 | 148 | ||
@@ -138,46 +156,68 @@ int f; | |||
138 | int r = f; /* to avoid warning about unused f */ | 156 | int r = f; /* to avoid warning about unused f */ |
139 | uInt b; | 157 | uInt b; |
140 | 158 | ||
141 | if (z == Z_NULL || z->next_in == Z_NULL) | 159 | if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) |
142 | return Z_STREAM_ERROR; | 160 | return Z_STREAM_ERROR; |
143 | r = Z_BUF_ERROR; | 161 | r = Z_BUF_ERROR; |
144 | while (1) switch (z->state->mode) | 162 | while (1) switch (z->state->mode) |
145 | { | 163 | { |
146 | case METHOD: | 164 | case METHOD: |
147 | NEEDBYTE | 165 | NEEDBYTE |
148 | if (((z->state->sub.method = NEXTBYTE) & 0xf) != DEFLATED) | 166 | if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) |
149 | { | 167 | { |
150 | z->state->mode = BAD; | 168 | z->state->mode = BAD; |
151 | z->msg = "unknown compression method"; | 169 | z->msg = (char*)"unknown compression method"; |
152 | z->state->sub.marker = 5; /* can't try inflateSync */ | 170 | z->state->sub.marker = 5; /* can't try inflateSync */ |
153 | break; | 171 | break; |
154 | } | 172 | } |
155 | if ((z->state->sub.method >> 4) + 8 > z->state->wbits) | 173 | if ((z->state->sub.method >> 4) + 8 > z->state->wbits) |
156 | { | 174 | { |
157 | z->state->mode = BAD; | 175 | z->state->mode = BAD; |
158 | z->msg = "invalid window size"; | 176 | z->msg = (char*)"invalid window size"; |
159 | z->state->sub.marker = 5; /* can't try inflateSync */ | 177 | z->state->sub.marker = 5; /* can't try inflateSync */ |
160 | break; | 178 | break; |
161 | } | 179 | } |
162 | z->state->mode = FLAG; | 180 | z->state->mode = FLAG; |
163 | case FLAG: | 181 | case FLAG: |
164 | NEEDBYTE | 182 | NEEDBYTE |
165 | if ((b = NEXTBYTE) & 0x20) | 183 | b = NEXTBYTE; |
166 | { | ||
167 | z->state->mode = BAD; | ||
168 | z->msg = "invalid reserved bit"; | ||
169 | z->state->sub.marker = 5; /* can't try inflateSync */ | ||
170 | break; | ||
171 | } | ||
172 | if (((z->state->sub.method << 8) + b) % 31) | 184 | if (((z->state->sub.method << 8) + b) % 31) |
173 | { | 185 | { |
174 | z->state->mode = BAD; | 186 | z->state->mode = BAD; |
175 | z->msg = "incorrect header check"; | 187 | z->msg = (char*)"incorrect header check"; |
176 | z->state->sub.marker = 5; /* can't try inflateSync */ | 188 | z->state->sub.marker = 5; /* can't try inflateSync */ |
177 | break; | 189 | break; |
178 | } | 190 | } |
179 | Trace((stderr, "inflate: zlib header ok\n")); | 191 | Trace((stderr, "inflate: zlib header ok\n")); |
180 | z->state->mode = BLOCKS; | 192 | if (!(b & PRESET_DICT)) |
193 | { | ||
194 | z->state->mode = BLOCKS; | ||
195 | break; | ||
196 | } | ||
197 | z->state->mode = DICT4; | ||
198 | case DICT4: | ||
199 | NEEDBYTE | ||
200 | z->state->sub.check.need = (uLong)NEXTBYTE << 24; | ||
201 | z->state->mode = DICT3; | ||
202 | case DICT3: | ||
203 | NEEDBYTE | ||
204 | z->state->sub.check.need += (uLong)NEXTBYTE << 16; | ||
205 | z->state->mode = DICT2; | ||
206 | case DICT2: | ||
207 | NEEDBYTE | ||
208 | z->state->sub.check.need += (uLong)NEXTBYTE << 8; | ||
209 | z->state->mode = DICT1; | ||
210 | case DICT1: | ||
211 | NEEDBYTE | ||
212 | z->state->sub.check.need += (uLong)NEXTBYTE; | ||
213 | z->adler = z->state->sub.check.need; | ||
214 | z->state->mode = DICT0; | ||
215 | return Z_NEED_DICT; | ||
216 | case DICT0: | ||
217 | z->state->mode = BAD; | ||
218 | z->msg = (char*)"need dictionary"; | ||
219 | z->state->sub.marker = 0; /* can try inflateSync */ | ||
220 | return Z_STREAM_ERROR; | ||
181 | case BLOCKS: | 221 | case BLOCKS: |
182 | r = inflate_blocks(z->state->blocks, z, r); | 222 | r = inflate_blocks(z->state->blocks, z, r); |
183 | if (r == Z_DATA_ERROR) | 223 | if (r == Z_DATA_ERROR) |
@@ -215,7 +255,7 @@ int f; | |||
215 | if (z->state->sub.check.was != z->state->sub.check.need) | 255 | if (z->state->sub.check.was != z->state->sub.check.need) |
216 | { | 256 | { |
217 | z->state->mode = BAD; | 257 | z->state->mode = BAD; |
218 | z->msg = "incorrect data check"; | 258 | z->msg = (char*)"incorrect data check"; |
219 | z->state->sub.marker = 5; /* can't try inflateSync */ | 259 | z->state->sub.marker = 5; /* can't try inflateSync */ |
220 | break; | 260 | break; |
221 | } | 261 | } |
@@ -231,6 +271,29 @@ int f; | |||
231 | } | 271 | } |
232 | 272 | ||
233 | 273 | ||
274 | int inflateSetDictionary(z, dictionary, dictLength) | ||
275 | z_stream *z; | ||
276 | const Bytef *dictionary; | ||
277 | uInt dictLength; | ||
278 | { | ||
279 | uInt length = dictLength; | ||
280 | |||
281 | if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) | ||
282 | return Z_STREAM_ERROR; | ||
283 | if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; | ||
284 | z->adler = 1L; | ||
285 | |||
286 | if (length >= (1<<z->state->wbits)) | ||
287 | { | ||
288 | length = (1<<z->state->wbits)-1; | ||
289 | dictionary += dictLength - length; | ||
290 | } | ||
291 | inflate_set_dictionary(z->state->blocks, z, dictionary, length); | ||
292 | z->state->mode = BLOCKS; | ||
293 | return Z_OK; | ||
294 | } | ||
295 | |||
296 | |||
234 | int inflateSync(z) | 297 | int inflateSync(z) |
235 | z_stream *z; | 298 | z_stream *z; |
236 | { | 299 | { |
@@ -1,11 +1,18 @@ | |||
1 | /* inftrees.c -- generate Huffman trees for efficient decoding | 1 | /* inftrees.c -- generate Huffman trees for efficient decoding |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include "zutil.h" | 6 | #include "zutil.h" |
7 | #include "inftrees.h" | 7 | #include "inftrees.h" |
8 | 8 | ||
9 | char inflate_copyright[] = " inflate 1.0 Copyright 1995-1996 Mark Adler "; | ||
10 | /* | ||
11 | If you use the zlib library in a product, an acknowledgment is welcome | ||
12 | in the documentation of your product. If for some reason you cannot | ||
13 | include such an acknowledgment, I would appreciate that you keep this | ||
14 | copyright string in the executable of your product. | ||
15 | */ | ||
9 | struct internal_state {int dummy;}; /* for buggy compilers */ | 16 | struct internal_state {int dummy;}; /* for buggy compilers */ |
10 | 17 | ||
11 | /* simplify the use of the inflate_huft type with some defines */ | 18 | /* simplify the use of the inflate_huft type with some defines */ |
@@ -30,23 +37,19 @@ local voidpf falloc OF(( | |||
30 | uInt, /* number of items */ | 37 | uInt, /* number of items */ |
31 | uInt)); /* size of item */ | 38 | uInt)); /* size of item */ |
32 | 39 | ||
33 | local void ffree OF(( | ||
34 | voidpf q, /* opaque pointer (not used) */ | ||
35 | voidpf p)); /* what to free (not used) */ | ||
36 | |||
37 | /* Tables for deflate from PKZIP's appnote.txt. */ | 40 | /* Tables for deflate from PKZIP's appnote.txt. */ |
38 | local uInt cplens[] = { /* Copy lengths for literal codes 257..285 */ | 41 | local uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ |
39 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, | 42 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, |
40 | 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; | 43 | 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; |
41 | /* actually lengths - 2; also see note #13 above about 258 */ | 44 | /* actually lengths - 2; also see note #13 above about 258 */ |
42 | local uInt cplext[] = { /* Extra bits for literal codes 257..285 */ | 45 | local uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ |
43 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, | 46 | 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, |
44 | 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */ | 47 | 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 192, 192}; /* 192==invalid */ |
45 | local uInt cpdist[] = { /* Copy offsets for distance codes 0..29 */ | 48 | local uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ |
46 | 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, | 49 | 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, |
47 | 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, | 50 | 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, |
48 | 8193, 12289, 16385, 24577}; | 51 | 8193, 12289, 16385, 24577}; |
49 | local uInt cpdext[] = { /* Extra bits for distance codes */ | 52 | local uInt cpdext[30] = { /* Extra bits for distance codes */ |
50 | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, | 53 | 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, |
51 | 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, | 54 | 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, |
52 | 12, 12, 13, 13}; | 55 | 12, 12, 13, 13}; |
@@ -304,11 +307,11 @@ z_stream *z; /* for zfree function */ | |||
304 | 307 | ||
305 | r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); | 308 | r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, z); |
306 | if (r == Z_DATA_ERROR) | 309 | if (r == Z_DATA_ERROR) |
307 | z->msg = "oversubscribed dynamic bit lengths tree"; | 310 | z->msg = (char*)"oversubscribed dynamic bit lengths tree"; |
308 | else if (r == Z_BUF_ERROR) | 311 | else if (r == Z_BUF_ERROR) |
309 | { | 312 | { |
310 | inflate_trees_free(*tb, z); | 313 | inflate_trees_free(*tb, z); |
311 | z->msg = "incomplete dynamic bit lengths tree"; | 314 | z->msg = (char*)"incomplete dynamic bit lengths tree"; |
312 | r = Z_DATA_ERROR; | 315 | r = Z_DATA_ERROR; |
313 | } | 316 | } |
314 | return r; | 317 | return r; |
@@ -331,11 +334,11 @@ z_stream *z; /* for zfree function */ | |||
331 | if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK) | 334 | if ((r = huft_build(c, nl, 257, cplens, cplext, tl, bl, z)) != Z_OK) |
332 | { | 335 | { |
333 | if (r == Z_DATA_ERROR) | 336 | if (r == Z_DATA_ERROR) |
334 | z->msg = "oversubscribed literal/length tree"; | 337 | z->msg = (char*)"oversubscribed literal/length tree"; |
335 | else if (r == Z_BUF_ERROR) | 338 | else if (r == Z_BUF_ERROR) |
336 | { | 339 | { |
337 | inflate_trees_free(*tl, z); | 340 | inflate_trees_free(*tl, z); |
338 | z->msg = "incomplete literal/length tree"; | 341 | z->msg = (char*)"incomplete literal/length tree"; |
339 | r = Z_DATA_ERROR; | 342 | r = Z_DATA_ERROR; |
340 | } | 343 | } |
341 | return r; | 344 | return r; |
@@ -345,14 +348,14 @@ z_stream *z; /* for zfree function */ | |||
345 | if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK) | 348 | if ((r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, z)) != Z_OK) |
346 | { | 349 | { |
347 | if (r == Z_DATA_ERROR) | 350 | if (r == Z_DATA_ERROR) |
348 | z->msg = "oversubscribed literal/length tree"; | 351 | z->msg = (char*)"oversubscribed literal/length tree"; |
349 | else if (r == Z_BUF_ERROR) { | 352 | else if (r == Z_BUF_ERROR) { |
350 | #ifdef PKZIP_BUG_WORKAROUND | 353 | #ifdef PKZIP_BUG_WORKAROUND |
351 | r = Z_OK; | 354 | r = Z_OK; |
352 | } | 355 | } |
353 | #else | 356 | #else |
354 | inflate_trees_free(*td, z); | 357 | inflate_trees_free(*td, z); |
355 | z->msg = "incomplete literal/length tree"; | 358 | z->msg = (char*)"incomplete literal/length tree"; |
356 | r = Z_DATA_ERROR; | 359 | r = Z_DATA_ERROR; |
357 | } | 360 | } |
358 | inflate_trees_free(*tl, z); | 361 | inflate_trees_free(*tl, z); |
@@ -366,10 +369,8 @@ z_stream *z; /* for zfree function */ | |||
366 | 369 | ||
367 | 370 | ||
368 | /* build fixed tables only once--keep them here */ | 371 | /* build fixed tables only once--keep them here */ |
369 | local int fixed_lock = 0; | ||
370 | local int fixed_built = 0; | 372 | local int fixed_built = 0; |
371 | #define FIXEDH 530 /* number of hufts used by fixed tables */ | 373 | #define FIXEDH 530 /* number of hufts used by fixed tables */ |
372 | local uInt fixed_left = FIXEDH; | ||
373 | local inflate_huft fixed_mem[FIXEDH]; | 374 | local inflate_huft fixed_mem[FIXEDH]; |
374 | local uInt fixed_bl; | 375 | local uInt fixed_bl; |
375 | local uInt fixed_bd; | 376 | local uInt fixed_bd; |
@@ -378,24 +379,14 @@ local inflate_huft *fixed_td; | |||
378 | 379 | ||
379 | 380 | ||
380 | local voidpf falloc(q, n, s) | 381 | local voidpf falloc(q, n, s) |
381 | voidpf q; /* opaque pointer (not used) */ | 382 | voidpf q; /* opaque pointer */ |
382 | uInt n; /* number of items */ | 383 | uInt n; /* number of items */ |
383 | uInt s; /* size of item */ | 384 | uInt s; /* size of item */ |
384 | { | 385 | { |
385 | Assert(s == sizeof(inflate_huft) && n <= fixed_left, | 386 | Assert(s == sizeof(inflate_huft) && n <= *(intf *)q, |
386 | "inflate_trees falloc overflow"); | 387 | "inflate_trees falloc overflow"); |
387 | if (q) s++; /* to make some compilers happy */ | 388 | *(intf *)q -= n+s-s; /* s-s to avoid warning */ |
388 | fixed_left -= n; | 389 | return (voidpf)(fixed_mem + *(intf *)q); |
389 | return (voidpf)(fixed_mem + fixed_left); | ||
390 | } | ||
391 | |||
392 | |||
393 | local void ffree(q, p) | ||
394 | voidpf q; | ||
395 | voidpf p; | ||
396 | { | ||
397 | Assert(0, "inflate_trees ffree called!"); | ||
398 | if (q) q = p; /* to make some compilers happy */ | ||
399 | } | 390 | } |
400 | 391 | ||
401 | 392 | ||
@@ -405,19 +396,18 @@ uIntf *bd; /* distance desired/actual bit depth */ | |||
405 | inflate_huft * FAR *tl; /* literal/length tree result */ | 396 | inflate_huft * FAR *tl; /* literal/length tree result */ |
406 | inflate_huft * FAR *td; /* distance tree result */ | 397 | inflate_huft * FAR *td; /* distance tree result */ |
407 | { | 398 | { |
408 | /* build fixed tables if not built already--lock out other instances */ | 399 | /* build fixed tables if not already (multiple overlapped executions ok) */ |
409 | while (++fixed_lock > 1) | ||
410 | fixed_lock--; | ||
411 | if (!fixed_built) | 400 | if (!fixed_built) |
412 | { | 401 | { |
413 | int k; /* temporary variable */ | 402 | int k; /* temporary variable */ |
414 | unsigned c[288]; /* length list for huft_build */ | 403 | unsigned c[288]; /* length list for huft_build */ |
415 | z_stream z; /* for falloc function */ | 404 | z_stream z; /* for falloc function */ |
405 | int f = FIXEDH; /* number of hufts left in fixed_mem */ | ||
416 | 406 | ||
417 | /* set up fake z_stream for memory routines */ | 407 | /* set up fake z_stream for memory routines */ |
418 | z.zalloc = falloc; | 408 | z.zalloc = falloc; |
419 | z.zfree = ffree; | 409 | z.zfree = Z_NULL; |
420 | z.opaque = Z_NULL; | 410 | z.opaque = (voidpf)&f; |
421 | 411 | ||
422 | /* literal table */ | 412 | /* literal table */ |
423 | for (k = 0; k < 144; k++) | 413 | for (k = 0; k < 144; k++) |
@@ -438,9 +428,9 @@ inflate_huft * FAR *td; /* distance tree result */ | |||
438 | huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); | 428 | huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, &z); |
439 | 429 | ||
440 | /* done */ | 430 | /* done */ |
431 | Assert(f == 0, "invalid build of fixed tables"); | ||
441 | fixed_built = 1; | 432 | fixed_built = 1; |
442 | } | 433 | } |
443 | fixed_lock--; | ||
444 | *bl = fixed_bl; | 434 | *bl = fixed_bl; |
445 | *bd = fixed_bd; | 435 | *bd = fixed_bd; |
446 | *tl = fixed_tl; | 436 | *tl = fixed_tl; |
@@ -456,10 +446,19 @@ z_stream *z; /* for zfree function */ | |||
456 | list of the tables it made, with the links in a dummy first entry of | 446 | list of the tables it made, with the links in a dummy first entry of |
457 | each table. */ | 447 | each table. */ |
458 | { | 448 | { |
459 | register inflate_huft *p, *q; | 449 | register inflate_huft *p, *q, *r; |
460 | 450 | ||
451 | /* Reverse linked list */ | ||
452 | p = Z_NULL; | ||
453 | q = t; | ||
454 | while (q != Z_NULL) | ||
455 | { | ||
456 | r = (q - 1)->next; | ||
457 | (q - 1)->next = p; | ||
458 | p = q; | ||
459 | q = r; | ||
460 | } | ||
461 | /* Go through linked list, freeing from the malloced (t[-1]) address. */ | 461 | /* Go through linked list, freeing from the malloced (t[-1]) address. */ |
462 | p = t; | ||
463 | while (p != Z_NULL) | 462 | while (p != Z_NULL) |
464 | { | 463 | { |
465 | q = (--p)->next; | 464 | q = (--p)->next; |
@@ -1,5 +1,5 @@ | |||
1 | /* inftrees.h -- header to use inftrees.c | 1 | /* inftrees.h -- header to use inftrees.c |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* inflate_util.c -- data and routines common to blocks and codes | 1 | /* inflate_util.c -- data and routines common to blocks and codes |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -12,7 +12,7 @@ | |||
12 | struct inflate_codes_state {int dummy;}; /* for buggy compilers */ | 12 | struct inflate_codes_state {int dummy;}; /* for buggy compilers */ |
13 | 13 | ||
14 | /* And'ing with mask[n] masks the lower n bits */ | 14 | /* And'ing with mask[n] masks the lower n bits */ |
15 | uInt inflate_mask[] = { | 15 | uInt inflate_mask[17] = { |
16 | 0x0000, | 16 | 0x0000, |
17 | 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, | 17 | 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, |
18 | 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff | 18 | 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff |
@@ -43,7 +43,7 @@ int r; | |||
43 | 43 | ||
44 | /* update check information */ | 44 | /* update check information */ |
45 | if (s->checkfn != Z_NULL) | 45 | if (s->checkfn != Z_NULL) |
46 | s->check = (*s->checkfn)(s->check, q, n); | 46 | z->adler = s->check = (*s->checkfn)(s->check, q, n); |
47 | 47 | ||
48 | /* copy as far as end of window */ | 48 | /* copy as far as end of window */ |
49 | zmemcpy(p, q, n); | 49 | zmemcpy(p, q, n); |
@@ -69,7 +69,7 @@ int r; | |||
69 | 69 | ||
70 | /* update check information */ | 70 | /* update check information */ |
71 | if (s->checkfn != Z_NULL) | 71 | if (s->checkfn != Z_NULL) |
72 | s->check = (*s->checkfn)(s->check, q, n); | 72 | z->adler = s->check = (*s->checkfn)(s->check, q, n); |
73 | 73 | ||
74 | /* copy */ | 74 | /* copy */ |
75 | zmemcpy(p, q, n); | 75 | zmemcpy(p, q, n); |
@@ -1,5 +1,5 @@ | |||
1 | /* infutil.h -- types and macros common to blocks and codes | 1 | /* infutil.h -- types and macros common to blocks and codes |
2 | * Copyright (C) 1995 Mark Adler | 2 | * Copyright (C) 1995-1996 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -8,11 +8,10 @@ | |||
8 | subject to change. Applications should only use zlib.h. | 8 | subject to change. Applications should only use zlib.h. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /* inflate blocks semi-private state */ | 11 | #ifndef _INFUTIL_H |
12 | struct inflate_blocks_state { | 12 | #define _INFUTIL_H |
13 | 13 | ||
14 | /* mode */ | 14 | typedef enum { |
15 | enum { | ||
16 | TYPE, /* get type bits (3, including end bit) */ | 15 | TYPE, /* get type bits (3, including end bit) */ |
17 | LENS, /* get lengths for stored */ | 16 | LENS, /* get lengths for stored */ |
18 | STORED, /* processing stored block */ | 17 | STORED, /* processing stored block */ |
@@ -23,7 +22,13 @@ struct inflate_blocks_state { | |||
23 | DRY, /* output remaining window bytes */ | 22 | DRY, /* output remaining window bytes */ |
24 | DONE, /* finished last block, done */ | 23 | DONE, /* finished last block, done */ |
25 | BAD} /* got a data error--stuck here */ | 24 | BAD} /* got a data error--stuck here */ |
26 | mode; /* current inflate_block mode */ | 25 | inflate_block_mode; |
26 | |||
27 | /* inflate blocks semi-private state */ | ||
28 | struct inflate_blocks_state { | ||
29 | |||
30 | /* mode */ | ||
31 | inflate_block_mode mode; /* current inflate_block mode */ | ||
27 | 32 | ||
28 | /* mode dependent information */ | 33 | /* mode dependent information */ |
29 | union { | 34 | union { |
@@ -70,17 +75,17 @@ struct inflate_blocks_state { | |||
70 | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} | 75 | #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} |
71 | #define DUMPBITS(j) {b>>=(j);k-=(j);} | 76 | #define DUMPBITS(j) {b>>=(j);k-=(j);} |
72 | /* output bytes */ | 77 | /* output bytes */ |
73 | #define WAVAIL (q<s->read?s->read-q-1:s->end-q) | 78 | #define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) |
74 | #define LOADOUT {q=s->write;m=WAVAIL;} | 79 | #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} |
75 | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=WAVAIL;}} | 80 | #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} |
76 | #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} | 81 | #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} |
77 | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} | 82 | #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} |
78 | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} | 83 | #define OUTBYTE(a) {*q++=(Byte)(a);m--;} |
79 | /* load local pointers */ | 84 | /* load local pointers */ |
80 | #define LOAD {LOADIN LOADOUT} | 85 | #define LOAD {LOADIN LOADOUT} |
81 | 86 | ||
82 | /* masks for lower bits */ | 87 | /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ |
83 | extern uInt inflate_mask[]; | 88 | extern uInt inflate_mask[17]; |
84 | 89 | ||
85 | /* copy as much as possible from the sliding window to the output area */ | 90 | /* copy as much as possible from the sliding window to the output area */ |
86 | extern int inflate_flush OF(( | 91 | extern int inflate_flush OF(( |
@@ -89,3 +94,5 @@ extern int inflate_flush OF(( | |||
89 | int)); | 94 | int)); |
90 | 95 | ||
91 | struct internal_state {int dummy;}; /* for buggy compilers */ | 96 | struct internal_state {int dummy;}; /* for buggy compilers */ |
97 | |||
98 | #endif | ||
@@ -1,5 +1,5 @@ | |||
1 | /* minigzip.c -- simulate gzip using the zlib compression library | 1 | /* minigzip.c -- simulate gzip using the zlib compression library |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -18,14 +18,13 @@ | |||
18 | #include <stdio.h> | 18 | #include <stdio.h> |
19 | #include "zlib.h" | 19 | #include "zlib.h" |
20 | 20 | ||
21 | #ifndef __GO32__ | ||
22 | extern void exit OF((int)); | ||
23 | #endif | ||
24 | extern int unlink OF((const char *)); | ||
25 | |||
26 | #ifdef STDC | 21 | #ifdef STDC |
27 | # include <string.h> | 22 | # include <string.h> |
23 | # include <stdlib.h> | ||
24 | #else | ||
25 | extern void exit OF((int)); | ||
28 | #endif | 26 | #endif |
27 | extern int unlink OF((const char *)); | ||
29 | 28 | ||
30 | #if defined(MSDOS) || defined(OS2) || defined(WIN32) | 29 | #if defined(MSDOS) || defined(OS2) || defined(WIN32) |
31 | # include <fcntl.h> | 30 | # include <fcntl.h> |
@@ -53,7 +52,7 @@ extern int unlink OF((const char *)); | |||
53 | 52 | ||
54 | char *prog; | 53 | char *prog; |
55 | 54 | ||
56 | void error OF((char *msg)); | 55 | void error OF((const char *msg)); |
57 | void gz_compress OF((FILE *in, gzFile out)); | 56 | void gz_compress OF((FILE *in, gzFile out)); |
58 | void gz_uncompress OF((gzFile in, FILE *out)); | 57 | void gz_uncompress OF((gzFile in, FILE *out)); |
59 | void file_compress OF((char *file)); | 58 | void file_compress OF((char *file)); |
@@ -64,7 +63,7 @@ int main OF((int argc, char *argv[])); | |||
64 | * Display error message and exit | 63 | * Display error message and exit |
65 | */ | 64 | */ |
66 | void error(msg) | 65 | void error(msg) |
67 | char *msg; | 66 | const char *msg; |
68 | { | 67 | { |
69 | fprintf(stderr, "%s: %s\n", prog, msg); | 68 | fprintf(stderr, "%s: %s\n", prog, msg); |
70 | exit(1); | 69 | exit(1); |
@@ -89,7 +88,7 @@ void gz_compress(in, out) | |||
89 | } | 88 | } |
90 | if (len == 0) break; | 89 | if (len == 0) break; |
91 | 90 | ||
92 | if (gzwrite(out, buf, len) != len) error(gzerror(out, &err)); | 91 | if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); |
93 | } | 92 | } |
94 | fclose(in); | 93 | fclose(in); |
95 | if (gzclose(out) != Z_OK) error("failed gzclose"); | 94 | if (gzclose(out) != Z_OK) error("failed gzclose"); |
@@ -111,7 +110,9 @@ void gz_uncompress(in, out) | |||
111 | if (len < 0) error (gzerror(in, &err)); | 110 | if (len < 0) error (gzerror(in, &err)); |
112 | if (len == 0) break; | 111 | if (len == 0) break; |
113 | 112 | ||
114 | if (fwrite(buf, 1, len, out) != (uInt)len) error("failed fwrite"); | 113 | if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { |
114 | error("failed fwrite"); | ||
115 | } | ||
115 | } | 116 | } |
116 | if (fclose(out)) error("failed fclose"); | 117 | if (fclose(out)) error("failed fclose"); |
117 | 118 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* trees.c -- output deflated data using Huffman coding | 1 | /* trees.c -- output deflated data using Huffman coding |
2 | * Copyright (C) 1995 Jean-loup Gailly | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -78,13 +78,12 @@ local uch bl_order[BL_CODES] | |||
78 | 78 | ||
79 | /* =========================================================================== | 79 | /* =========================================================================== |
80 | * Local data. These are initialized only once. | 80 | * Local data. These are initialized only once. |
81 | * To do: initialize at compile time to be completely reentrant. ??? | ||
82 | */ | 81 | */ |
83 | 82 | ||
84 | local ct_data static_ltree[L_CODES+2]; | 83 | local ct_data static_ltree[L_CODES+2]; |
85 | /* The static literal tree. Since the bit lengths are imposed, there is no | 84 | /* The static literal tree. Since the bit lengths are imposed, there is no |
86 | * need for the L_CODES extra codes used during heap construction. However | 85 | * need for the L_CODES extra codes used during heap construction. However |
87 | * The codes 286 and 287 are needed to build a canonical tree (see ct_init | 86 | * The codes 286 and 287 are needed to build a canonical tree (see _tr_init |
88 | * below). | 87 | * below). |
89 | */ | 88 | */ |
90 | 89 | ||
@@ -129,7 +128,7 @@ local static_tree_desc static_bl_desc = | |||
129 | * Local (static) routines in this file. | 128 | * Local (static) routines in this file. |
130 | */ | 129 | */ |
131 | 130 | ||
132 | local void ct_static_init OF((void)); | 131 | local void tr_static_init OF((void)); |
133 | local void init_block OF((deflate_state *s)); | 132 | local void init_block OF((deflate_state *s)); |
134 | local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); | 133 | local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); |
135 | local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); | 134 | local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); |
@@ -187,7 +186,7 @@ local void send_bits(s, value, length) | |||
187 | int value; /* value to send */ | 186 | int value; /* value to send */ |
188 | int length; /* number of bits */ | 187 | int length; /* number of bits */ |
189 | { | 188 | { |
190 | Tracev((stderr," l %2d v %4x ", length, value)); | 189 | Tracevv((stderr," l %2d v %4x ", length, value)); |
191 | Assert(length > 0 && length <= 15, "invalid length"); | 190 | Assert(length > 0 && length <= 15, "invalid length"); |
192 | s->bits_sent += (ulg)length; | 191 | s->bits_sent += (ulg)length; |
193 | 192 | ||
@@ -227,11 +226,13 @@ local void send_bits(s, value, length) | |||
227 | /* the arguments must not have side effects */ | 226 | /* the arguments must not have side effects */ |
228 | 227 | ||
229 | /* =========================================================================== | 228 | /* =========================================================================== |
230 | * Initialize the various 'constant' tables. | 229 | * Initialize the various 'constant' tables. In a multi-threaded environment, |
231 | * To do: do this at compile time. | 230 | * this function may be called by two threads concurrently, but this is |
231 | * harmless since both invocations do exactly the same thing. | ||
232 | */ | 232 | */ |
233 | local void ct_static_init() | 233 | local void tr_static_init() |
234 | { | 234 | { |
235 | static static_init_done = 0; | ||
235 | int n; /* iterates over tree elements */ | 236 | int n; /* iterates over tree elements */ |
236 | int bits; /* bit counter */ | 237 | int bits; /* bit counter */ |
237 | int length; /* length value */ | 238 | int length; /* length value */ |
@@ -240,6 +241,8 @@ local void ct_static_init() | |||
240 | ush bl_count[MAX_BITS+1]; | 241 | ush bl_count[MAX_BITS+1]; |
241 | /* number of codes at each bit length for an optimal tree */ | 242 | /* number of codes at each bit length for an optimal tree */ |
242 | 243 | ||
244 | if (static_init_done) return; | ||
245 | |||
243 | /* Initialize the mapping length (0..255) -> length code (0..28) */ | 246 | /* Initialize the mapping length (0..255) -> length code (0..28) */ |
244 | length = 0; | 247 | length = 0; |
245 | for (code = 0; code < LENGTH_CODES-1; code++) { | 248 | for (code = 0; code < LENGTH_CODES-1; code++) { |
@@ -248,7 +251,7 @@ local void ct_static_init() | |||
248 | length_code[length++] = (uch)code; | 251 | length_code[length++] = (uch)code; |
249 | } | 252 | } |
250 | } | 253 | } |
251 | Assert (length == 256, "ct_static_init: length != 256"); | 254 | Assert (length == 256, "tr_static_init: length != 256"); |
252 | /* Note that the length 255 (match length 258) can be represented | 255 | /* Note that the length 255 (match length 258) can be represented |
253 | * in two different ways: code 284 + 5 bits or code 285, so we | 256 | * in two different ways: code 284 + 5 bits or code 285, so we |
254 | * overwrite length_code[255] to use the best encoding: | 257 | * overwrite length_code[255] to use the best encoding: |
@@ -263,7 +266,7 @@ local void ct_static_init() | |||
263 | dist_code[dist++] = (uch)code; | 266 | dist_code[dist++] = (uch)code; |
264 | } | 267 | } |
265 | } | 268 | } |
266 | Assert (dist == 256, "ct_static_init: dist != 256"); | 269 | Assert (dist == 256, "tr_static_init: dist != 256"); |
267 | dist >>= 7; /* from now on, all distances are divided by 128 */ | 270 | dist >>= 7; /* from now on, all distances are divided by 128 */ |
268 | for ( ; code < D_CODES; code++) { | 271 | for ( ; code < D_CODES; code++) { |
269 | base_dist[code] = dist << 7; | 272 | base_dist[code] = dist << 7; |
@@ -271,7 +274,7 @@ local void ct_static_init() | |||
271 | dist_code[256 + dist++] = (uch)code; | 274 | dist_code[256 + dist++] = (uch)code; |
272 | } | 275 | } |
273 | } | 276 | } |
274 | Assert (dist == 256, "ct_static_init: 256+dist != 512"); | 277 | Assert (dist == 256, "tr_static_init: 256+dist != 512"); |
275 | 278 | ||
276 | /* Construct the codes of the static literal tree */ | 279 | /* Construct the codes of the static literal tree */ |
277 | for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; | 280 | for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; |
@@ -289,19 +292,18 @@ local void ct_static_init() | |||
289 | /* The static distance tree is trivial: */ | 292 | /* The static distance tree is trivial: */ |
290 | for (n = 0; n < D_CODES; n++) { | 293 | for (n = 0; n < D_CODES; n++) { |
291 | static_dtree[n].Len = 5; | 294 | static_dtree[n].Len = 5; |
292 | static_dtree[n].Code = bi_reverse(n, 5); | 295 | static_dtree[n].Code = bi_reverse((unsigned)n, 5); |
293 | } | 296 | } |
297 | static_init_done = 1; | ||
294 | } | 298 | } |
295 | 299 | ||
296 | /* =========================================================================== | 300 | /* =========================================================================== |
297 | * Initialize the tree data structures for a new zlib stream. | 301 | * Initialize the tree data structures for a new zlib stream. |
298 | */ | 302 | */ |
299 | void ct_init(s) | 303 | void _tr_init(s) |
300 | deflate_state *s; | 304 | deflate_state *s; |
301 | { | 305 | { |
302 | if (static_dtree[0].Len == 0) { | 306 | tr_static_init(); |
303 | ct_static_init(); /* To do: at compile time */ | ||
304 | } | ||
305 | 307 | ||
306 | s->compressed_len = 0L; | 308 | s->compressed_len = 0L; |
307 | 309 | ||
@@ -523,7 +525,7 @@ local void gen_codes (tree, max_code, bl_count) | |||
523 | /* Now reverse the bits */ | 525 | /* Now reverse the bits */ |
524 | tree[n].Code = bi_reverse(next_code[len]++, len); | 526 | tree[n].Code = bi_reverse(next_code[len]++, len); |
525 | 527 | ||
526 | Tracec(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | 528 | Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", |
527 | n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); | 529 | n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); |
528 | } | 530 | } |
529 | } | 531 | } |
@@ -783,14 +785,14 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) | |||
783 | /* =========================================================================== | 785 | /* =========================================================================== |
784 | * Send a stored block | 786 | * Send a stored block |
785 | */ | 787 | */ |
786 | void ct_stored_block(s, buf, stored_len, eof) | 788 | void _tr_stored_block(s, buf, stored_len, eof) |
787 | deflate_state *s; | 789 | deflate_state *s; |
788 | charf *buf; /* input block */ | 790 | charf *buf; /* input block */ |
789 | ulg stored_len; /* length of input block */ | 791 | ulg stored_len; /* length of input block */ |
790 | int eof; /* true if this is the last block for a file */ | 792 | int eof; /* true if this is the last block for a file */ |
791 | { | 793 | { |
792 | send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ | 794 | send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ |
793 | s->compressed_len = (s->compressed_len + 3 + 7) & ~7L; | 795 | s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; |
794 | s->compressed_len += (stored_len + 4) << 3; | 796 | s->compressed_len += (stored_len + 4) << 3; |
795 | 797 | ||
796 | copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ | 798 | copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ |
@@ -799,12 +801,15 @@ void ct_stored_block(s, buf, stored_len, eof) | |||
799 | /* =========================================================================== | 801 | /* =========================================================================== |
800 | * Send one empty static block to give enough lookahead for inflate. | 802 | * Send one empty static block to give enough lookahead for inflate. |
801 | * This takes 10 bits, of which 7 may remain in the bit buffer. | 803 | * This takes 10 bits, of which 7 may remain in the bit buffer. |
802 | * The current inflate code requires 9 bits of lookahead. If the EOB | 804 | * The current inflate code requires 9 bits of lookahead. If the |
803 | * code for the previous block was coded on 5 bits or less, inflate | 805 | * last two codes for the previous block (real code plus EOB) were coded |
804 | * may have only 5+3 bits of lookahead to decode this EOB. | 806 | * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode |
805 | * (There are no problems if the previous block is stored or fixed.) | 807 | * the last real code. In this case we send two empty static blocks instead |
808 | * of one. (There are no problems if the previous block is stored or fixed.) | ||
809 | * To simplify the code, we assume the worst case of last real code encoded | ||
810 | * on one bit only. | ||
806 | */ | 811 | */ |
807 | void ct_align(s) | 812 | void _tr_align(s) |
808 | deflate_state *s; | 813 | deflate_state *s; |
809 | { | 814 | { |
810 | send_bits(s, STATIC_TREES<<1, 3); | 815 | send_bits(s, STATIC_TREES<<1, 3); |
@@ -812,10 +817,11 @@ void ct_align(s) | |||
812 | s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ | 817 | s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ |
813 | bi_flush(s); | 818 | bi_flush(s); |
814 | /* Of the 10 bits for the empty block, we have already sent | 819 | /* Of the 10 bits for the empty block, we have already sent |
815 | * (10 - bi_valid) bits. The lookahead for the EOB of the previous | 820 | * (10 - bi_valid) bits. The lookahead for the last real code (before |
816 | * block was thus its length plus what we have just sent. | 821 | * the EOB of the previous block) was thus at least one plus the length |
822 | * of the EOB plus what we have just sent of the empty static block. | ||
817 | */ | 823 | */ |
818 | if (s->last_eob_len + 10 - s->bi_valid < 9) { | 824 | if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { |
819 | send_bits(s, STATIC_TREES<<1, 3); | 825 | send_bits(s, STATIC_TREES<<1, 3); |
820 | send_code(s, END_BLOCK, static_ltree); | 826 | send_code(s, END_BLOCK, static_ltree); |
821 | s->compressed_len += 10L; | 827 | s->compressed_len += 10L; |
@@ -829,44 +835,52 @@ void ct_align(s) | |||
829 | * trees or store, and output the encoded block to the zip file. This function | 835 | * trees or store, and output the encoded block to the zip file. This function |
830 | * returns the total compressed length for the file so far. | 836 | * returns the total compressed length for the file so far. |
831 | */ | 837 | */ |
832 | ulg ct_flush_block(s, buf, stored_len, eof) | 838 | ulg _tr_flush_block(s, buf, stored_len, eof) |
833 | deflate_state *s; | 839 | deflate_state *s; |
834 | charf *buf; /* input block, or NULL if too old */ | 840 | charf *buf; /* input block, or NULL if too old */ |
835 | ulg stored_len; /* length of input block */ | 841 | ulg stored_len; /* length of input block */ |
836 | int eof; /* true if this is the last block for a file */ | 842 | int eof; /* true if this is the last block for a file */ |
837 | { | 843 | { |
838 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | 844 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ |
839 | int max_blindex; /* index of last bit length code of non zero freq */ | 845 | int max_blindex = 0; /* index of last bit length code of non zero freq */ |
840 | 846 | ||
841 | /* Check if the file is ascii or binary */ | 847 | /* Build the Huffman trees unless a stored block is forced */ |
842 | if (s->data_type == UNKNOWN) set_data_type(s); | 848 | if (s->level > 0) { |
843 | 849 | ||
844 | /* Construct the literal and distance trees */ | 850 | /* Check if the file is ascii or binary */ |
845 | build_tree(s, (tree_desc *)(&(s->l_desc))); | 851 | if (s->data_type == Z_UNKNOWN) set_data_type(s); |
846 | Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, | ||
847 | s->static_len)); | ||
848 | 852 | ||
849 | build_tree(s, (tree_desc *)(&(s->d_desc))); | 853 | /* Construct the literal and distance trees */ |
850 | Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, | 854 | build_tree(s, (tree_desc *)(&(s->l_desc))); |
851 | s->static_len)); | 855 | Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, |
852 | /* At this point, opt_len and static_len are the total bit lengths of | 856 | s->static_len)); |
853 | * the compressed block data, excluding the tree representations. | ||
854 | */ | ||
855 | 857 | ||
856 | /* Build the bit length tree for the above two trees, and get the index | 858 | build_tree(s, (tree_desc *)(&(s->d_desc))); |
857 | * in bl_order of the last bit length code to send. | 859 | Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, |
858 | */ | 860 | s->static_len)); |
859 | max_blindex = build_bl_tree(s); | 861 | /* At this point, opt_len and static_len are the total bit lengths of |
862 | * the compressed block data, excluding the tree representations. | ||
863 | */ | ||
860 | 864 | ||
861 | /* Determine the best encoding. Compute first the block length in bytes */ | 865 | /* Build the bit length tree for the above two trees, and get the index |
862 | opt_lenb = (s->opt_len+3+7)>>3; | 866 | * in bl_order of the last bit length code to send. |
863 | static_lenb = (s->static_len+3+7)>>3; | 867 | */ |
868 | max_blindex = build_bl_tree(s); | ||
864 | 869 | ||
865 | Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", | 870 | /* Determine the best encoding. Compute first the block length in bytes*/ |
866 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | 871 | opt_lenb = (s->opt_len+3+7)>>3; |
867 | s->last_lit)); | 872 | static_lenb = (s->static_len+3+7)>>3; |
868 | 873 | ||
869 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | 874 | Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", |
875 | opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, | ||
876 | s->last_lit)); | ||
877 | |||
878 | if (static_lenb <= opt_lenb) opt_lenb = static_lenb; | ||
879 | |||
880 | } else { | ||
881 | Assert(buf != (char*)0, "lost buf"); | ||
882 | opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ | ||
883 | } | ||
870 | 884 | ||
871 | /* If compression failed and this is the first and last block, | 885 | /* If compression failed and this is the first and last block, |
872 | * and if the .zip file can be seeked (to rewrite the local header), | 886 | * and if the .zip file can be seeked (to rewrite the local header), |
@@ -874,7 +888,7 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||
874 | */ | 888 | */ |
875 | #ifdef STORED_FILE_OK | 889 | #ifdef STORED_FILE_OK |
876 | # ifdef FORCE_STORED_FILE | 890 | # ifdef FORCE_STORED_FILE |
877 | if (eof && compressed_len == 0L) { /* force stored file */ | 891 | if (eof && s->compressed_len == 0L) { /* force stored file */ |
878 | # else | 892 | # else |
879 | if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { | 893 | if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { |
880 | # endif | 894 | # endif |
@@ -899,7 +913,7 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||
899 | * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to | 913 | * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to |
900 | * transform a block into a stored block. | 914 | * transform a block into a stored block. |
901 | */ | 915 | */ |
902 | ct_stored_block(s, buf, stored_len, eof); | 916 | _tr_stored_block(s, buf, stored_len, eof); |
903 | 917 | ||
904 | #ifdef FORCE_STATIC | 918 | #ifdef FORCE_STATIC |
905 | } else if (static_lenb >= 0) { /* force static trees */ | 919 | } else if (static_lenb >= 0) { /* force static trees */ |
@@ -933,10 +947,10 @@ ulg ct_flush_block(s, buf, stored_len, eof) | |||
933 | * Save the match info and tally the frequency counts. Return true if | 947 | * Save the match info and tally the frequency counts. Return true if |
934 | * the current block must be flushed. | 948 | * the current block must be flushed. |
935 | */ | 949 | */ |
936 | int ct_tally (s, dist, lc) | 950 | int _tr_tally (s, dist, lc) |
937 | deflate_state *s; | 951 | deflate_state *s; |
938 | int dist; /* distance of matched string */ | 952 | unsigned dist; /* distance of matched string */ |
939 | int lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ | 953 | unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ |
940 | { | 954 | { |
941 | s->d_buf[s->last_lit] = (ush)dist; | 955 | s->d_buf[s->last_lit] = (ush)dist; |
942 | s->l_buf[s->last_lit++] = (uch)lc; | 956 | s->l_buf[s->last_lit++] = (uch)lc; |
@@ -949,7 +963,7 @@ int ct_tally (s, dist, lc) | |||
949 | dist--; /* dist = match distance - 1 */ | 963 | dist--; /* dist = match distance - 1 */ |
950 | Assert((ush)dist < (ush)MAX_DIST(s) && | 964 | Assert((ush)dist < (ush)MAX_DIST(s) && |
951 | (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && | 965 | (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && |
952 | (ush)d_code(dist) < (ush)D_CODES, "ct_tally: bad match"); | 966 | (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); |
953 | 967 | ||
954 | s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; | 968 | s->dyn_ltree[length_code[lc]+LITERALS+1].Freq++; |
955 | s->dyn_dtree[d_code(dist)].Freq++; | 969 | s->dyn_dtree[d_code(dist)].Freq++; |
@@ -959,7 +973,7 @@ int ct_tally (s, dist, lc) | |||
959 | if (s->level > 2 && (s->last_lit & 0xfff) == 0) { | 973 | if (s->level > 2 && (s->last_lit & 0xfff) == 0) { |
960 | /* Compute an upper bound for the compressed length */ | 974 | /* Compute an upper bound for the compressed length */ |
961 | ulg out_length = (ulg)s->last_lit*8L; | 975 | ulg out_length = (ulg)s->last_lit*8L; |
962 | ulg in_length = (ulg)s->strstart - s->block_start; | 976 | ulg in_length = (ulg)((long)s->strstart - s->block_start); |
963 | int dcode; | 977 | int dcode; |
964 | for (dcode = 0; dcode < D_CODES; dcode++) { | 978 | for (dcode = 0; dcode < D_CODES; dcode++) { |
965 | out_length += (ulg)s->dyn_dtree[dcode].Freq * | 979 | out_length += (ulg)s->dyn_dtree[dcode].Freq * |
@@ -1043,7 +1057,7 @@ local void set_data_type(s) | |||
1043 | while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; | 1057 | while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; |
1044 | while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; | 1058 | while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; |
1045 | while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; | 1059 | while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; |
1046 | s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? BINARY : ASCII); | 1060 | s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); |
1047 | } | 1061 | } |
1048 | 1062 | ||
1049 | /* =========================================================================== | 1063 | /* =========================================================================== |
@@ -1,5 +1,5 @@ | |||
1 | /* uncompr.c -- decompress a memory buffer | 1 | /* uncompr.c -- decompress a memory buffer |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -25,13 +25,13 @@ | |||
25 | int uncompress (dest, destLen, source, sourceLen) | 25 | int uncompress (dest, destLen, source, sourceLen) |
26 | Bytef *dest; | 26 | Bytef *dest; |
27 | uLongf *destLen; | 27 | uLongf *destLen; |
28 | Bytef *source; | 28 | const Bytef *source; |
29 | uLong sourceLen; | 29 | uLong sourceLen; |
30 | { | 30 | { |
31 | z_stream stream; | 31 | z_stream stream; |
32 | int err; | 32 | int err; |
33 | 33 | ||
34 | stream.next_in = source; | 34 | stream.next_in = (Bytef*)source; |
35 | stream.avail_in = (uInt)sourceLen; | 35 | stream.avail_in = (uInt)sourceLen; |
36 | /* Check for source > 64K on 16-bit machine: */ | 36 | /* Check for source > 64K on 16-bit machine: */ |
37 | if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; | 37 | if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; |
@@ -1,5 +1,5 @@ | |||
1 | /* zconf.h -- configuration of the zlib compression library | 1 | /* zconf.h -- configuration of the zlib compression library |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -9,22 +9,55 @@ | |||
9 | #define _ZCONF_H | 9 | #define _ZCONF_H |
10 | 10 | ||
11 | /* | 11 | /* |
12 | The library does not install any signal handler. It is recommended to | 12 | * People prefering a unique prefix for all types and library functions |
13 | add at least a handler for SIGSEGV when decompressing; the library checks | 13 | * should compile with -DZ_PREFIX |
14 | the consistency of the input data whenever possible but may go nuts | ||
15 | for some forms of corrupted input. | ||
16 | */ | 14 | */ |
15 | #ifdef Z_PREFIX | ||
16 | # define deflateInit_ z_deflateInit_ | ||
17 | # define deflate z_deflate | ||
18 | # define deflateEnd z_deflateEnd | ||
19 | # define inflateInit_ z_inflateInit_ | ||
20 | # define inflate z_inflate | ||
21 | # define inflateEnd z_inflateEnd | ||
22 | # define deflateInit2_ z_deflateInit2_ | ||
23 | # define deflateCopy z_deflateCopy | ||
24 | # define deflateReset z_deflateReset | ||
25 | # define deflateParams z_deflateParams | ||
26 | # define inflateInit2_ z_inflateInit2_ | ||
27 | # define inflateSync z_inflateSync | ||
28 | # define inflateReset z_inflateReset | ||
29 | # define compress z_compress | ||
30 | # define uncompress z_uncompress | ||
31 | # define adler32 z_adler32 | ||
32 | # define crc32 z_crc32 | ||
33 | # define get_crc_table z_get_crc_table | ||
34 | |||
35 | # define Byte z_Byte | ||
36 | # define uInt z_uInt | ||
37 | # define uLong z_uLong | ||
38 | # define Bytef z_Bytef | ||
39 | # define charf z_charf | ||
40 | # define intf z_intf | ||
41 | # define uIntf z_uIntf | ||
42 | # define uLongf z_uLongf | ||
43 | # define voidpf z_voidpf | ||
44 | # define voidp z_voidp | ||
45 | #endif | ||
17 | 46 | ||
18 | /* | 47 | #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) |
19 | * Compile with -DMAXSEG_64K if the alloc function cannot allocate more | 48 | # define WIN32 |
20 | * than 64k bytes at a time (needed on systems with 16-bit int). | 49 | #endif |
21 | */ | 50 | #if (defined(__GNUC__) || defined(WIN32)) && !defined(__32BIT__) |
22 | #if defined(_GNUC__) && !defined(__32BIT__) | ||
23 | # define __32BIT__ | 51 | # define __32BIT__ |
24 | #endif | 52 | #endif |
25 | #if defined(__MSDOS__) && !defined(MSDOS) | 53 | #if defined(__MSDOS__) && !defined(MSDOS) |
26 | # define MSDOS | 54 | # define MSDOS |
27 | #endif | 55 | #endif |
56 | |||
57 | /* | ||
58 | * Compile with -DMAXSEG_64K if the alloc function cannot allocate more | ||
59 | * than 64k bytes at a time (needed on systems with 16-bit int). | ||
60 | */ | ||
28 | #if defined(MSDOS) && !defined(__32BIT__) | 61 | #if defined(MSDOS) && !defined(__32BIT__) |
29 | # define MAXSEG_64K | 62 | # define MAXSEG_64K |
30 | #endif | 63 | #endif |
@@ -32,20 +65,20 @@ | |||
32 | # define UNALIGNED_OK | 65 | # define UNALIGNED_OK |
33 | #endif | 66 | #endif |
34 | 67 | ||
35 | #ifndef STDC | 68 | #if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) |
36 | # if defined(MSDOS) || defined(__STDC__) || defined(__cplusplus) | 69 | # define STDC |
37 | # define STDC | 70 | #endif |
38 | # endif | 71 | #if (defined(__STDC__) || defined(__cplusplus)) && !defined(STDC) |
72 | # define STDC | ||
39 | #endif | 73 | #endif |
40 | 74 | ||
41 | #ifndef STDC | 75 | #if !defined(STDC) && !defined(const) |
42 | # ifndef const | 76 | # define const |
43 | # define const | ||
44 | # endif | ||
45 | #endif | 77 | #endif |
46 | 78 | ||
47 | #ifdef __MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */ | 79 | #ifdef __MWERKS__ /* Metrowerks CodeWarrior declares fileno() in unix.h */ |
48 | # include <unix.h> | 80 | # include <unix.h> |
81 | # define Byte _Byte /* Byte already used on Mac */ | ||
49 | #endif | 82 | #endif |
50 | 83 | ||
51 | /* Maximum value for memLevel in deflateInit2 */ | 84 | /* Maximum value for memLevel in deflateInit2 */ |
@@ -92,6 +125,7 @@ | |||
92 | * just define FAR to be empty. | 125 | * just define FAR to be empty. |
93 | */ | 126 | */ |
94 | #if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ | 127 | #if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ |
128 | # define SMALL_MEDIUM | ||
95 | # ifdef _MSC_VER | 129 | # ifdef _MSC_VER |
96 | # define FAR __far | 130 | # define FAR __far |
97 | # else | 131 | # else |
@@ -99,20 +133,26 @@ | |||
99 | # endif | 133 | # endif |
100 | #endif | 134 | #endif |
101 | #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) | 135 | #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) |
102 | # define FAR __far /* completely untested, just a best guess */ | 136 | # define SMALL_MEDIUM |
137 | # define FAR __far | ||
103 | #endif | 138 | #endif |
104 | #ifndef FAR | 139 | #ifndef FAR |
105 | # define FAR | 140 | # define FAR |
106 | #endif | 141 | #endif |
142 | /* The Watcom compiler defines M_I86SM and __SMALL__ even in 32 bit mode */ | ||
143 | #if defined(__WATCOMC__) && defined(__386__) | ||
144 | # undef FAR | ||
145 | # undef SMALL_MEDIUM | ||
146 | #endif | ||
107 | 147 | ||
108 | typedef unsigned char Byte; /* 8 bits */ | 148 | typedef unsigned char Byte; /* 8 bits */ |
109 | typedef unsigned int uInt; /* 16 bits or more */ | 149 | typedef unsigned int uInt; /* 16 bits or more */ |
110 | typedef unsigned long uLong; /* 32 bits or more */ | 150 | typedef unsigned long uLong; /* 32 bits or more */ |
111 | 151 | ||
112 | typedef Byte FAR Bytef; | 152 | typedef Byte FAR Bytef; |
113 | typedef char FAR charf; | 153 | typedef char FAR charf; |
114 | typedef int FAR intf; | 154 | typedef int FAR intf; |
115 | typedef uInt FAR uIntf; | 155 | typedef uInt FAR uIntf; |
116 | typedef uLong FAR uLongf; | 156 | typedef uLong FAR uLongf; |
117 | 157 | ||
118 | #ifdef STDC | 158 | #ifdef STDC |
@@ -1,7 +1,7 @@ | |||
1 | /* zlib.h -- interface of the 'zlib' general purpose compression library | 1 | /* zlib.h -- interface of the 'zlib' general purpose compression library |
2 | version 0.95, Aug 16th, 1995. | 2 | version 1.0, Jan 27th, 1996. |
3 | 3 | ||
4 | Copyright (C) 1995 Jean-loup Gailly and Mark Adler | 4 | Copyright (C) 1995-1996 Jean-loup Gailly and Mark Adler |
5 | 5 | ||
6 | This software is provided 'as-is', without any express or implied | 6 | This software is provided 'as-is', without any express or implied |
7 | warranty. In no event will the authors be held liable for any damages | 7 | warranty. In no event will the authors be held liable for any damages |
@@ -26,9 +26,13 @@ | |||
26 | #ifndef _ZLIB_H | 26 | #ifndef _ZLIB_H |
27 | #define _ZLIB_H | 27 | #define _ZLIB_H |
28 | 28 | ||
29 | #ifdef __cplusplus | ||
30 | extern "C" { | ||
31 | #endif | ||
32 | |||
29 | #include "zconf.h" | 33 | #include "zconf.h" |
30 | 34 | ||
31 | #define ZLIB_VERSION "0.95" | 35 | #define ZLIB_VERSION "1.0" |
32 | 36 | ||
33 | /* | 37 | /* |
34 | The 'zlib' compression library provides in-memory compression and | 38 | The 'zlib' compression library provides in-memory compression and |
@@ -47,6 +51,11 @@ | |||
47 | repeated calls of the compression function. In the latter case, the | 51 | repeated calls of the compression function. In the latter case, the |
48 | application must provide more input and/or consume the output | 52 | application must provide more input and/or consume the output |
49 | (providing more output space) before each call. | 53 | (providing more output space) before each call. |
54 | |||
55 | The library does not install any signal handler. It is recommended to | ||
56 | add at least a handler for SIGSEGV when decompressing; the library checks | ||
57 | the consistency of the input data whenever possible but may go nuts | ||
58 | for some forms of corrupted input. | ||
50 | */ | 59 | */ |
51 | 60 | ||
52 | typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); | 61 | typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); |
@@ -68,10 +77,11 @@ typedef struct z_stream_s { | |||
68 | 77 | ||
69 | alloc_func zalloc; /* used to allocate the internal state */ | 78 | alloc_func zalloc; /* used to allocate the internal state */ |
70 | free_func zfree; /* used to free the internal state */ | 79 | free_func zfree; /* used to free the internal state */ |
71 | voidp opaque; /* private data object passed to zalloc and zfree */ | 80 | voidpf opaque; /* private data object passed to zalloc and zfree */ |
72 | |||
73 | Byte data_type; /* best guess about the data type: ascii or binary */ | ||
74 | 81 | ||
82 | int data_type; /* best guess about the data type: ascii or binary */ | ||
83 | uLong adler; /* adler32 value of the uncompressed data */ | ||
84 | uLong reserved; /* reserved for future use */ | ||
75 | } z_stream; | 85 | } z_stream; |
76 | 86 | ||
77 | /* | 87 | /* |
@@ -107,20 +117,25 @@ typedef struct z_stream_s { | |||
107 | 117 | ||
108 | #define Z_NO_FLUSH 0 | 118 | #define Z_NO_FLUSH 0 |
109 | #define Z_PARTIAL_FLUSH 1 | 119 | #define Z_PARTIAL_FLUSH 1 |
110 | #define Z_FULL_FLUSH 2 | 120 | #define Z_SYNC_FLUSH 2 |
111 | #define Z_SYNC_FLUSH 3 /* experimental: partial_flush + byte align */ | 121 | #define Z_FULL_FLUSH 3 |
112 | #define Z_FINISH 4 | 122 | #define Z_FINISH 4 |
113 | /* See deflate() below for the usage of these constants */ | 123 | /* Allowed flush values; see deflate() below for details */ |
114 | 124 | ||
115 | #define Z_OK 0 | 125 | #define Z_OK 0 |
116 | #define Z_STREAM_END 1 | 126 | #define Z_STREAM_END 1 |
127 | #define Z_NEED_DICT 2 | ||
117 | #define Z_ERRNO (-1) | 128 | #define Z_ERRNO (-1) |
118 | #define Z_STREAM_ERROR (-2) | 129 | #define Z_STREAM_ERROR (-2) |
119 | #define Z_DATA_ERROR (-3) | 130 | #define Z_DATA_ERROR (-3) |
120 | #define Z_MEM_ERROR (-4) | 131 | #define Z_MEM_ERROR (-4) |
121 | #define Z_BUF_ERROR (-5) | 132 | #define Z_BUF_ERROR (-5) |
122 | /* error codes for the compression/decompression functions */ | 133 | #define Z_VERSION_ERROR (-6) |
134 | /* Return codes for the compression/decompression functions. Negative | ||
135 | * values are errors, positive values are used for special but normal events. | ||
136 | */ | ||
123 | 137 | ||
138 | #define Z_NO_COMPRESSION 0 | ||
124 | #define Z_BEST_SPEED 1 | 139 | #define Z_BEST_SPEED 1 |
125 | #define Z_BEST_COMPRESSION 9 | 140 | #define Z_BEST_COMPRESSION 9 |
126 | #define Z_DEFAULT_COMPRESSION (-1) | 141 | #define Z_DEFAULT_COMPRESSION (-1) |
@@ -129,15 +144,19 @@ typedef struct z_stream_s { | |||
129 | #define Z_FILTERED 1 | 144 | #define Z_FILTERED 1 |
130 | #define Z_HUFFMAN_ONLY 2 | 145 | #define Z_HUFFMAN_ONLY 2 |
131 | #define Z_DEFAULT_STRATEGY 0 | 146 | #define Z_DEFAULT_STRATEGY 0 |
147 | /* compression strategy; see deflateInit2() below for details */ | ||
132 | 148 | ||
133 | #define Z_BINARY 0 | 149 | #define Z_BINARY 0 |
134 | #define Z_ASCII 1 | 150 | #define Z_ASCII 1 |
135 | #define Z_UNKNOWN 2 | 151 | #define Z_UNKNOWN 2 |
136 | /* Used to set the data_type field */ | 152 | /* Possible values of the data_type field */ |
153 | |||
154 | #define Z_DEFLATED 8 | ||
155 | /* The deflate compression method (the only one supported in this version) */ | ||
137 | 156 | ||
138 | #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ | 157 | #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ |
139 | 158 | ||
140 | extern char *zlib_version; | 159 | extern const char *zlib_version; |
141 | /* The application can compare zlib_version and ZLIB_VERSION for consistency. | 160 | /* The application can compare zlib_version and ZLIB_VERSION for consistency. |
142 | If the first character differs, the library code actually used is | 161 | If the first character differs, the library code actually used is |
143 | not compatible with the zlib.h header file used by the application. | 162 | not compatible with the zlib.h header file used by the application. |
@@ -145,20 +164,24 @@ extern char *zlib_version; | |||
145 | 164 | ||
146 | /* basic functions */ | 165 | /* basic functions */ |
147 | 166 | ||
148 | extern int deflateInit OF((z_stream *strm, int level)); | ||
149 | /* | 167 | /* |
168 | extern int deflateInit OF((z_stream *strm, int level)); | ||
169 | |||
150 | Initializes the internal stream state for compression. The fields | 170 | Initializes the internal stream state for compression. The fields |
151 | zalloc, zfree and opaque must be initialized before by the caller. | 171 | zalloc, zfree and opaque must be initialized before by the caller. |
152 | If zalloc and zfree are set to Z_NULL, deflateInit updates them to | 172 | If zalloc and zfree are set to Z_NULL, deflateInit updates them to |
153 | use default allocation functions. | 173 | use default allocation functions. |
154 | 174 | ||
155 | The compression level must be Z_DEFAULT_COMPRESSION, or between 1 and 9: | 175 | The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: |
156 | 1 gives best speed, 9 gives best compression. Z_DEFAULT_COMPRESSION requests | 176 | 1 gives best speed, 9 gives best compression, 0 gives no compression at |
157 | a default compromise between speed and compression (currently equivalent | 177 | all (the input data is simply copied a block at a time). |
158 | to level 6). | 178 | Z_DEFAULT_COMPRESSION requests a default compromise between speed and |
179 | compression (currently equivalent to level 6). | ||
159 | 180 | ||
160 | deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not | 181 | deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not |
161 | enough memory, Z_STREAM_ERROR if level is not a valid compression level. | 182 | enough memory, Z_STREAM_ERROR if level is not a valid compression level, |
183 | Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible | ||
184 | with the version assumed by the caller (ZLIB_VERSION). | ||
162 | msg is set to null if there is no error message. deflateInit does not | 185 | msg is set to null if there is no error message. deflateInit does not |
163 | perform any compression: this will be done by deflate(). | 186 | perform any compression: this will be done by deflate(). |
164 | */ | 187 | */ |
@@ -190,7 +213,12 @@ extern int deflate OF((z_stream *strm, int flush)); | |||
190 | block is terminated and flushed to the output buffer so that the | 213 | block is terminated and flushed to the output buffer so that the |
191 | decompressor can get all input data available so far. For method 9, a future | 214 | decompressor can get all input data available so far. For method 9, a future |
192 | variant on method 8, the current block will be flushed but not terminated. | 215 | variant on method 8, the current block will be flushed but not terminated. |
193 | If flush is set to Z_FULL_FLUSH, the compression block is terminated, a | 216 | Z_SYNC_FLUSH has the same effect as partial flush except that the compressed |
217 | output is byte aligned (the compressor can clear its internal bit buffer) | ||
218 | and the current block is always terminated; this can be useful if the | ||
219 | compressor has to be restarted from scratch after an interruption (in which | ||
220 | case the internal state of the compressor may be lost). | ||
221 | If flush is set to Z_FULL_FLUSH, the compression block is terminated, a | ||
194 | special marker is output and the compression dictionary is discarded; this | 222 | special marker is output and the compression dictionary is discarded; this |
195 | is useful to allow the decompressor to synchronize if one compressed block | 223 | is useful to allow the decompressor to synchronize if one compressed block |
196 | has been damaged (see inflateSync below). Flushing degrades compression and | 224 | has been damaged (see inflateSync below). Flushing degrades compression and |
@@ -233,22 +261,26 @@ extern int deflateEnd OF((z_stream *strm)); | |||
233 | pending output. | 261 | pending output. |
234 | 262 | ||
235 | deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the | 263 | deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the |
236 | stream state was inconsistent. In the error case, msg may be set | 264 | stream state was inconsistent, Z_DATA_ERROR if the stream was freed |
237 | but then points to a static string (which must not be deallocated). | 265 | prematurely (some input or output was discarded). In the error case, |
266 | msg may be set but then points to a static string (which must not be | ||
267 | deallocated). | ||
238 | */ | 268 | */ |
239 | 269 | ||
240 | 270 | ||
241 | extern int inflateInit OF((z_stream *strm)); | ||
242 | /* | 271 | /* |
272 | extern int inflateInit OF((z_stream *strm)); | ||
273 | |||
243 | Initializes the internal stream state for decompression. The fields | 274 | Initializes the internal stream state for decompression. The fields |
244 | zalloc and zfree must be initialized before by the caller. If zalloc and | 275 | zalloc, zfree and opaque must be initialized before by the caller. If |
245 | zfree are set to Z_NULL, inflateInit updates them to use default allocation | 276 | zalloc and zfree are set to Z_NULL, inflateInit updates them to use default |
246 | functions. | 277 | allocation functions. |
247 | 278 | ||
248 | inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not | 279 | inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not |
249 | enough memory. msg is set to null if there is no error message. | 280 | enough memory, Z_VERSION_ERROR if the zlib library version is incompatible |
250 | inflateInit does not perform any decompression: this will be done by | 281 | with the version assumed by the caller. msg is set to null if there is no |
251 | inflate(). | 282 | error message. inflateInit does not perform any decompression: this will be |
283 | done by inflate(). | ||
252 | */ | 284 | */ |
253 | 285 | ||
254 | 286 | ||
@@ -292,12 +324,15 @@ extern int inflate OF((z_stream *strm, int flush)); | |||
292 | inflate() returns Z_OK if some progress has been made (more input | 324 | inflate() returns Z_OK if some progress has been made (more input |
293 | processed or more output produced), Z_STREAM_END if the end of the | 325 | processed or more output produced), Z_STREAM_END if the end of the |
294 | compressed data has been reached and all uncompressed output has been | 326 | compressed data has been reached and all uncompressed output has been |
295 | produced, Z_DATA_ERROR if the input data was corrupted, Z_STREAM_ERROR if | 327 | produced, Z_NEED_DICT if a preset dictionary is needed at this point (see |
296 | the stream structure was inconsistent (for example if next_in or next_out | 328 | inflateSetDictionary below), Z_DATA_ERROR if the input data was corrupted, |
297 | was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no | 329 | Z_STREAM_ERROR if the stream structure was inconsistent (for example if |
298 | progress is possible or if there was not enough room in the output buffer | 330 | next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, |
299 | when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then | 331 | Z_BUF_ERROR if no progress is possible or if there was not enough room in |
300 | call inflateSync to look for a good compression block. | 332 | the output buffer when Z_FINISH is used. In the Z_DATA_ERROR case, the |
333 | application may then call inflateSync to look for a good compression block. | ||
334 | In the Z_NEED_DICT case, strm->adler is set to the Adler32 value of the | ||
335 | dictionary chosen by the compressor. | ||
301 | */ | 336 | */ |
302 | 337 | ||
303 | 338 | ||
@@ -312,24 +347,26 @@ extern int inflateEnd OF((z_stream *strm)); | |||
312 | static string (which must not be deallocated). | 347 | static string (which must not be deallocated). |
313 | */ | 348 | */ |
314 | 349 | ||
315 | /* advanced functions */ | 350 | /* Advanced functions */ |
316 | 351 | ||
317 | /* | 352 | /* |
318 | The following functions are needed only in some special applications. | 353 | The following functions are needed only in some special applications. |
319 | */ | 354 | */ |
320 | 355 | ||
356 | /* | ||
321 | extern int deflateInit2 OF((z_stream *strm, | 357 | extern int deflateInit2 OF((z_stream *strm, |
322 | int level, | 358 | int level, |
323 | int method, | 359 | int method, |
324 | int windowBits, | 360 | int windowBits, |
325 | int memLevel, | 361 | int memLevel, |
326 | int strategy)); | 362 | int strategy)); |
327 | /* | 363 | |
328 | This is another version of deflateInit with more compression options. The | 364 | This is another version of deflateInit with more compression options. The |
329 | fields next_in, zalloc and zfree must be initialized before by the caller. | 365 | fields next_in, zalloc, zfree and opaque must be initialized before by |
366 | the caller. | ||
330 | 367 | ||
331 | The method parameter is the compression method. It must be 8 in this | 368 | The method parameter is the compression method. It must be Z_DEFLATED in |
332 | version of the library. (Method 9 will allow a 64K history buffer and | 369 | this version of the library. (Method 9 will allow a 64K history buffer and |
333 | partial block flushes.) | 370 | partial block flushes.) |
334 | 371 | ||
335 | The windowBits parameter is the base two logarithm of the window size | 372 | The windowBits parameter is the base two logarithm of the window size |
@@ -338,20 +375,22 @@ extern int deflateInit2 OF((z_stream *strm, | |||
338 | values of this parameter result in better compression at the expense of | 375 | values of this parameter result in better compression at the expense of |
339 | memory usage. The default value is 15 if deflateInit is used instead. | 376 | memory usage. The default value is 15 if deflateInit is used instead. |
340 | 377 | ||
341 | The memLevel parameter specifies how much memory should be allocated | 378 | The memLevel parameter specifies how much memory should be allocated |
342 | for the internal compression state. memLevel=1 uses minimum memory but | 379 | for the internal compression state. memLevel=1 uses minimum memory but |
343 | is slow and reduces compression ratio; memLevel=9 uses maximum memory | 380 | is slow and reduces compression ratio; memLevel=9 uses maximum memory |
344 | for optimal speed. The default value is 8. See zconf.h for total memory | 381 | for optimal speed. The default value is 8. See zconf.h for total memory |
345 | usage as a function of windowBits and memLevel. | 382 | usage as a function of windowBits and memLevel. |
346 | 383 | ||
347 | The strategy parameter is used to tune the compression algorithm. Use | 384 | The strategy parameter is used to tune the compression algorithm. Use the |
348 | the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data | 385 | value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a |
349 | produced by a filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman | 386 | filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no |
350 | encoding only (no string match). Filtered data consists mostly of small | 387 | string match). Filtered data consists mostly of small values with a |
351 | values with a somewhat random distribution. In this case, the | 388 | somewhat random distribution. In this case, the compression algorithm is |
352 | compression algorithm is tuned to compress them better. The strategy | 389 | tuned to compress them better. The effect of Z_FILTERED is to force more |
353 | parameter only affects the compression ratio but not the correctness of | 390 | Huffman coding and less string matching; it is somewhat intermediate |
354 | the compressed output even if it is not set appropriately. | 391 | between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects |
392 | the compression ratio but not the correctness of the compressed output even | ||
393 | if it is not set appropriately. | ||
355 | 394 | ||
356 | If next_in is not null, the library will use this buffer to hold also | 395 | If next_in is not null, the library will use this buffer to hold also |
357 | some history information; the buffer must either hold the entire input | 396 | some history information; the buffer must either hold the entire input |
@@ -370,9 +409,38 @@ extern int deflateInit2 OF((z_stream *strm, | |||
370 | not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as | 409 | not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as |
371 | an invalid method). msg is set to null if there is no error message. | 410 | an invalid method). msg is set to null if there is no error message. |
372 | deflateInit2 does not perform any compression: this will be done by | 411 | deflateInit2 does not perform any compression: this will be done by |
373 | deflate(). | 412 | deflate(). |
374 | */ | 413 | */ |
375 | 414 | ||
415 | extern int deflateSetDictionary OF((z_stream *strm, | ||
416 | const Bytef *dictionary, | ||
417 | uInt dictLength)); | ||
418 | /* | ||
419 | Initializes the compression dictionary (history buffer) from the given | ||
420 | byte sequence without producing any compressed output. This function must | ||
421 | be called immediately after deflateInit or deflateInit2, before any call | ||
422 | of deflate. The compressor and decompressor must use exactly the same | ||
423 | dictionary (see inflateSetDictionary). | ||
424 | The dictionary should consist of strings (byte sequences) that are likely | ||
425 | to be encountered later in the data to be compressed, with the most commonly | ||
426 | used strings preferably put towards the end of the dictionary. Using a | ||
427 | dictionary is most useful when the data to be compressed is short and | ||
428 | can be predicted with good accuracy; the data can then be compressed better | ||
429 | than with the default empty dictionary. In this version of the library, | ||
430 | only the last 32K bytes of the dictionary are used. | ||
431 | Upon return of this function, strm->adler is set to the Adler32 value | ||
432 | of the dictionary; the decompressor may later use this value to determine | ||
433 | which dictionary has been used by the compressor. (The Adler32 value | ||
434 | applies to the whole dictionary even if only a subset of the dictionary is | ||
435 | actually used by the compressor.) | ||
436 | |||
437 | deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a | ||
438 | parameter is invalid (such as NULL dictionary) or the stream state | ||
439 | is inconsistent (for example if deflate has already been called for this | ||
440 | stream). deflateSetDictionary does not perform any compression: this will | ||
441 | be done by deflate(). | ||
442 | */ | ||
443 | |||
376 | extern int deflateCopy OF((z_stream *dest, | 444 | extern int deflateCopy OF((z_stream *dest, |
377 | z_stream *source)); | 445 | z_stream *source)); |
378 | /* | 446 | /* |
@@ -383,14 +451,14 @@ extern int deflateCopy OF((z_stream *dest, | |||
383 | application to provide the correct values of next_out and avail_out for the | 451 | application to provide the correct values of next_out and avail_out for the |
384 | next call of deflate. | 452 | next call of deflate. |
385 | 453 | ||
386 | This function is useful when several compression strategies will be | 454 | This function can be useful when several compression strategies will be |
387 | tried, for example when there are several ways of pre-processing the input | 455 | tried, for example when there are several ways of pre-processing the input |
388 | data with a filter. The streams that will be discarded should then be freed | 456 | data with a filter. The streams that will be discarded should then be freed |
389 | by calling deflateEnd. Note that deflateCopy duplicates the internal | 457 | by calling deflateEnd. Note that deflateCopy duplicates the internal |
390 | compression state which can be quite large, so this strategy is slow and | 458 | compression state which can be quite large, so this strategy is slow and |
391 | can consume lots of memory. | 459 | can consume lots of memory. |
392 | 460 | ||
393 | deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not | 461 | deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not |
394 | enough memory, Z_STREAM_ERROR if the source stream state was inconsistent | 462 | enough memory, Z_STREAM_ERROR if the source stream state was inconsistent |
395 | (such as zalloc being NULL). msg is left unchanged in both source and | 463 | (such as zalloc being NULL). msg is left unchanged in both source and |
396 | destination. | 464 | destination. |
@@ -407,11 +475,26 @@ extern int deflateReset OF((z_stream *strm)); | |||
407 | stream state was inconsistent (such as zalloc or state being NULL). | 475 | stream state was inconsistent (such as zalloc or state being NULL). |
408 | */ | 476 | */ |
409 | 477 | ||
478 | extern int deflateParams OF((z_stream *strm, int level, int strategy)); | ||
479 | /* | ||
480 | Dynamically update the compression level and compression strategy. | ||
481 | This can be used to switch between compression and straight copy of | ||
482 | the input data, or to switch to a different kind of input data requiring | ||
483 | a different strategy. If the compression level is changed, the input | ||
484 | available so far is compressed with the old level (and may be flushed); | ||
485 | the new level will take effect only at the next call of deflate(). | ||
486 | |||
487 | deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source | ||
488 | stream state was inconsistent or if a parameter was invalid. | ||
489 | */ | ||
490 | |||
491 | /* | ||
410 | extern int inflateInit2 OF((z_stream *strm, | 492 | extern int inflateInit2 OF((z_stream *strm, |
411 | int windowBits)); | 493 | int windowBits)); |
412 | /* | 494 | |
413 | This is another version of inflateInit with more compression options. The | 495 | This is another version of inflateInit with more compression options. The |
414 | fields next_out, zalloc and zfree must be initialized before by the caller. | 496 | fields next_out, zalloc, zfree and opaque must be initialized before by |
497 | the caller. | ||
415 | 498 | ||
416 | The windowBits parameter is the base two logarithm of the maximum window | 499 | The windowBits parameter is the base two logarithm of the maximum window |
417 | size (the size of the history buffer). It should be in the range 8..15 for | 500 | size (the size of the history buffer). It should be in the range 8..15 for |
@@ -440,6 +523,25 @@ extern int inflateInit2 OF((z_stream *strm, | |||
440 | inflate(). | 523 | inflate(). |
441 | */ | 524 | */ |
442 | 525 | ||
526 | extern int inflateSetDictionary OF((z_stream *strm, | ||
527 | const Bytef *dictionary, | ||
528 | uInt dictLength)); | ||
529 | /* | ||
530 | Initializes the decompression dictionary (history buffer) from the given | ||
531 | uncompressed byte sequence. This function must be called immediately after | ||
532 | a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen | ||
533 | by the compressor can be determined from the Adler32 value returned by this | ||
534 | call of inflate. The compressor and decompressor must use exactly the same | ||
535 | dictionary (see deflateSetDictionary). | ||
536 | |||
537 | inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a | ||
538 | parameter is invalid (such as NULL dictionary) or the stream state is | ||
539 | inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the | ||
540 | expected one (incorrect Adler32 value). inflateSetDictionary does not | ||
541 | perform any decompression: this will be done by subsequent calls of | ||
542 | inflate(). | ||
543 | */ | ||
544 | |||
443 | extern int inflateSync OF((z_stream *strm)); | 545 | extern int inflateSync OF((z_stream *strm)); |
444 | /* | 546 | /* |
445 | Skips invalid compressed data until the special marker (see deflate() | 547 | Skips invalid compressed data until the special marker (see deflate() |
@@ -477,7 +579,7 @@ extern int inflateReset OF((z_stream *strm)); | |||
477 | */ | 579 | */ |
478 | 580 | ||
479 | extern int compress OF((Bytef *dest, uLongf *destLen, | 581 | extern int compress OF((Bytef *dest, uLongf *destLen, |
480 | Bytef *source, uLong sourceLen)); | 582 | const Bytef *source, uLong sourceLen)); |
481 | /* | 583 | /* |
482 | Compresses the source buffer into the destination buffer. sourceLen is | 584 | Compresses the source buffer into the destination buffer. sourceLen is |
483 | the byte length of the source buffer. Upon entry, destLen is the total | 585 | the byte length of the source buffer. Upon entry, destLen is the total |
@@ -492,7 +594,7 @@ extern int compress OF((Bytef *dest, uLongf *destLen, | |||
492 | */ | 594 | */ |
493 | 595 | ||
494 | extern int uncompress OF((Bytef *dest, uLongf *destLen, | 596 | extern int uncompress OF((Bytef *dest, uLongf *destLen, |
495 | Bytef *source, uLong sourceLen)); | 597 | const Bytef *source, uLong sourceLen)); |
496 | /* | 598 | /* |
497 | Decompresses the source buffer into the destination buffer. sourceLen is | 599 | Decompresses the source buffer into the destination buffer. sourceLen is |
498 | the byte length of the source buffer. Upon entry, destLen is the total | 600 | the byte length of the source buffer. Upon entry, destLen is the total |
@@ -512,7 +614,7 @@ extern int uncompress OF((Bytef *dest, uLongf *destLen, | |||
512 | 614 | ||
513 | typedef voidp gzFile; | 615 | typedef voidp gzFile; |
514 | 616 | ||
515 | extern gzFile gzopen OF((char *path, char *mode)); | 617 | extern gzFile gzopen OF((const char *path, const char *mode)); |
516 | /* | 618 | /* |
517 | Opens a gzip (.gz) file for reading or writing. The mode parameter | 619 | Opens a gzip (.gz) file for reading or writing. The mode parameter |
518 | is as in fopen ("rb" or "wb") but can also include a compression level | 620 | is as in fopen ("rb" or "wb") but can also include a compression level |
@@ -524,11 +626,15 @@ extern gzFile gzopen OF((char *path, char *mode)); | |||
524 | zlib error is Z_MEM_ERROR). | 626 | zlib error is Z_MEM_ERROR). |
525 | */ | 627 | */ |
526 | 628 | ||
527 | extern gzFile gzdopen OF((int fd, char *mode)); | 629 | extern gzFile gzdopen OF((int fd, const char *mode)); |
528 | /* | 630 | /* |
529 | gzdopen() associates a gzFile with the file descriptor fd. File | 631 | gzdopen() associates a gzFile with the file descriptor fd. File |
530 | descriptors are obtained from calls like open, dup, creat, or pipe. | 632 | descriptors are obtained from calls like open, dup, creat, pipe or |
633 | fileno (in the file has been previously opened with fopen). | ||
531 | The mode parameter is as in fopen ("rb" or "wb"). | 634 | The mode parameter is as in fopen ("rb" or "wb"). |
635 | The next call of gzclose on the returned gzFile will also close the | ||
636 | file descriptor fd, just like fclose(fdopen(fd), mode) closes the file | ||
637 | descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). | ||
532 | gzdopen returns NULL if there was insufficient memory to allocate | 638 | gzdopen returns NULL if there was insufficient memory to allocate |
533 | the (de)compression state. | 639 | the (de)compression state. |
534 | */ | 640 | */ |
@@ -541,7 +647,7 @@ extern int gzread OF((gzFile file, voidp buf, unsigned len)); | |||
541 | gzread returns the number of uncompressed bytes actually read (0 for | 647 | gzread returns the number of uncompressed bytes actually read (0 for |
542 | end of file, -1 for error). */ | 648 | end of file, -1 for error). */ |
543 | 649 | ||
544 | extern int gzwrite OF((gzFile file, voidp buf, unsigned len)); | 650 | extern int gzwrite OF((gzFile file, const voidp buf, unsigned len)); |
545 | /* | 651 | /* |
546 | Writes the given number of uncompressed bytes into the compressed file. | 652 | Writes the given number of uncompressed bytes into the compressed file. |
547 | gzwrite returns the number of uncompressed bytes actually written | 653 | gzwrite returns the number of uncompressed bytes actually written |
@@ -582,7 +688,7 @@ extern char* gzerror OF((gzFile file, int *errnum)); | |||
582 | compression library. | 688 | compression library. |
583 | */ | 689 | */ |
584 | 690 | ||
585 | extern uLong adler32 OF((uLong adler, Bytef *buf, uInt len)); | 691 | extern uLong adler32 OF((uLong adler, const Bytef *buf, uInt len)); |
586 | 692 | ||
587 | /* | 693 | /* |
588 | Update a running Adler-32 checksum with the bytes buf[0..len-1] and | 694 | Update a running Adler-32 checksum with the bytes buf[0..len-1] and |
@@ -599,7 +705,7 @@ extern uLong adler32 OF((uLong adler, Bytef *buf, uInt len)); | |||
599 | if (adler != original_adler) error(); | 705 | if (adler != original_adler) error(); |
600 | */ | 706 | */ |
601 | 707 | ||
602 | extern uLong crc32 OF((uLong crc, Bytef *buf, uInt len)); | 708 | extern uLong crc32 OF((uLong crc, const Bytef *buf, uInt len)); |
603 | /* | 709 | /* |
604 | Update a running crc with the bytes buf[0..len-1] and return the updated | 710 | Update a running crc with the bytes buf[0..len-1] and return the updated |
605 | crc. If buf is NULL, this function returns the required initial value | 711 | crc. If buf is NULL, this function returns the required initial value |
@@ -615,8 +721,39 @@ extern uLong crc32 OF((uLong crc, Bytef *buf, uInt len)); | |||
615 | if (crc != original_crc) error(); | 721 | if (crc != original_crc) error(); |
616 | */ | 722 | */ |
617 | 723 | ||
724 | |||
725 | /* various hacks, don't look :) */ | ||
726 | |||
727 | /* deflateInit and inflateInit are macros to allow checking the zlib version | ||
728 | * and the compiler's view of z_stream: | ||
729 | */ | ||
730 | extern int deflateInit_ OF((z_stream *strm, int level, | ||
731 | const char *version, int stream_size)); | ||
732 | extern int inflateInit_ OF((z_stream *strm, | ||
733 | const char *version, int stream_size)); | ||
734 | extern int deflateInit2_ OF((z_stream *strm, int level, int method, | ||
735 | int windowBits, int memLevel, int strategy, | ||
736 | const char *version, int stream_size)); | ||
737 | extern int inflateInit2_ OF((z_stream *strm, int windowBits, | ||
738 | const char *version, int stream_size)); | ||
739 | #define deflateInit(strm, level) \ | ||
740 | deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) | ||
741 | #define inflateInit(strm) \ | ||
742 | inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) | ||
743 | #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ | ||
744 | deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ | ||
745 | (strategy), ZLIB_VERSION, sizeof(z_stream)) | ||
746 | #define inflateInit2(strm, windowBits) \ | ||
747 | inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) | ||
748 | |||
618 | #ifndef _Z_UTIL_H | 749 | #ifndef _Z_UTIL_H |
619 | struct internal_state {int dummy;}; /* hack for buggy compilers */ | 750 | struct internal_state {int dummy;}; /* hack for buggy compilers */ |
620 | #endif | 751 | #endif |
621 | 752 | ||
753 | uLongf *get_crc_table OF((void)); /* can be used by asm versions of crc32() */ | ||
754 | |||
755 | #ifdef __cplusplus | ||
756 | } | ||
757 | #endif | ||
758 | |||
622 | #endif /* _ZLIB_H */ | 759 | #endif /* _ZLIB_H */ |
@@ -1,5 +1,5 @@ | |||
1 | /* zutil.c -- target dependent utility functions for the compression library | 1 | /* zutil.c -- target dependent utility functions for the compression library |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -11,20 +11,22 @@ | |||
11 | 11 | ||
12 | struct internal_state {int dummy;}; /* for buggy compilers */ | 12 | struct internal_state {int dummy;}; /* for buggy compilers */ |
13 | 13 | ||
14 | #ifndef __GO32__ | 14 | #ifndef STDC |
15 | extern void exit OF((int)); | 15 | extern void exit OF((int)); |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | char *zlib_version = ZLIB_VERSION; | 18 | const char *zlib_version = ZLIB_VERSION; |
19 | 19 | ||
20 | char *z_errmsg[] = { | 20 | const char *z_errmsg[10] = { |
21 | "stream end", /* Z_STREAM_END 1 */ | 21 | "need dictionary", /* Z_NEED_DICT 2 */ |
22 | "", /* Z_OK 0 */ | 22 | "stream end", /* Z_STREAM_END 1 */ |
23 | "file error", /* Z_ERRNO (-1) */ | 23 | "", /* Z_OK 0 */ |
24 | "stream error", /* Z_STREAM_ERROR (-2) */ | 24 | "file error", /* Z_ERRNO (-1) */ |
25 | "data error", /* Z_DATA_ERROR (-3) */ | 25 | "stream error", /* Z_STREAM_ERROR (-2) */ |
26 | "insufficient memory", /* Z_MEM_ERROR (-4) */ | 26 | "data error", /* Z_DATA_ERROR (-3) */ |
27 | "buffer error", /* Z_BUF_ERROR (-5) */ | 27 | "insufficient memory", /* Z_MEM_ERROR (-4) */ |
28 | "buffer error", /* Z_BUF_ERROR (-5) */ | ||
29 | "incompatible version",/* Z_VERSION_ERROR (-6) */ | ||
28 | ""}; | 30 | ""}; |
29 | 31 | ||
30 | 32 | ||
@@ -59,9 +61,10 @@ void zmemzero(dest, len) | |||
59 | } | 61 | } |
60 | #endif | 62 | #endif |
61 | 63 | ||
62 | #if defined( __TURBOC__) && !defined(__SMALL__) && !defined(__MEDIUM__) | 64 | #ifdef __TURBOC__ |
63 | /* Small and medium model are for now limited to near allocation with | 65 | #if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) |
64 | * reduced MAX_WBITS and MAX_MEM_LEVEL | 66 | /* Small and medium model in Turbo C are for now limited to near allocation |
67 | * with reduced MAX_WBITS and MAX_MEM_LEVEL | ||
65 | */ | 68 | */ |
66 | # define MY_ZCALLOC | 69 | # define MY_ZCALLOC |
67 | 70 | ||
@@ -94,7 +97,10 @@ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) | |||
94 | voidpf buf = opaque; /* just to make some compilers happy */ | 97 | voidpf buf = opaque; /* just to make some compilers happy */ |
95 | ulg bsize = (ulg)items*size; | 98 | ulg bsize = (ulg)items*size; |
96 | 99 | ||
97 | if (bsize < 65536L) { | 100 | /* If we allocate less than 65520 bytes, we assume that farmalloc |
101 | * will return a usable pointer which doesn't have to be normalized. | ||
102 | */ | ||
103 | if (bsize < 65520L) { | ||
98 | buf = farmalloc(bsize); | 104 | buf = farmalloc(bsize); |
99 | if (*(ush*)&buf != 0) return buf; | 105 | if (*(ush*)&buf != 0) return buf; |
100 | } else { | 106 | } else { |
@@ -131,9 +137,11 @@ void zcfree (voidpf opaque, voidpf ptr) | |||
131 | ptr = opaque; /* just to make some compilers happy */ | 137 | ptr = opaque; /* just to make some compilers happy */ |
132 | z_error("zcfree: ptr not found"); | 138 | z_error("zcfree: ptr not found"); |
133 | } | 139 | } |
140 | #endif | ||
134 | #endif /* __TURBOC__ */ | 141 | #endif /* __TURBOC__ */ |
135 | 142 | ||
136 | #if defined(M_I86SM)||defined(M_I86MM)||defined(M_I86CM)||defined(M_I86LM) | 143 | |
144 | #if defined(M_I86) && !(defined(__WATCOMC__) && defined(__386__)) | ||
137 | /* Microsoft C */ | 145 | /* Microsoft C */ |
138 | 146 | ||
139 | # define MY_ZCALLOC | 147 | # define MY_ZCALLOC |
@@ -160,7 +168,7 @@ void zcfree (voidpf opaque, voidpf ptr) | |||
160 | 168 | ||
161 | #ifndef MY_ZCALLOC /* Any system without a special alloc function */ | 169 | #ifndef MY_ZCALLOC /* Any system without a special alloc function */ |
162 | 170 | ||
163 | #ifndef __GO32__ | 171 | #ifndef STDC |
164 | extern voidp calloc OF((uInt items, uInt size)); | 172 | extern voidp calloc OF((uInt items, uInt size)); |
165 | extern void free OF((voidpf ptr)); | 173 | extern void free OF((voidpf ptr)); |
166 | #endif | 174 | #endif |
@@ -170,6 +178,7 @@ voidpf zcalloc (opaque, items, size) | |||
170 | unsigned items; | 178 | unsigned items; |
171 | unsigned size; | 179 | unsigned size; |
172 | { | 180 | { |
181 | if (opaque) opaque = 0; /* to make compiler happy */ | ||
173 | return (voidpf)calloc(items, size); | 182 | return (voidpf)calloc(items, size); |
174 | } | 183 | } |
175 | 184 | ||
@@ -177,6 +186,7 @@ void zcfree (opaque, ptr) | |||
177 | voidpf opaque; | 186 | voidpf opaque; |
178 | voidpf ptr; | 187 | voidpf ptr; |
179 | { | 188 | { |
189 | if (opaque) opaque = 0; /* to make compiler happy */ | ||
180 | free(ptr); | 190 | free(ptr); |
181 | } | 191 | } |
182 | 192 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* zutil.h -- internal interface and configuration of the compression library | 1 | /* zutil.h -- internal interface and configuration of the compression library |
2 | * Copyright (C) 1995 Jean-loup Gailly. | 2 | * Copyright (C) 1995-1996 Jean-loup Gailly. |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #include "zlib.h" | 16 | #include "zlib.h" |
17 | 17 | ||
18 | #if defined(MSDOS) || defined(VMS) | 18 | #if defined(MSDOS) || defined(VMS) || defined(CRAY) || defined(WIN32) |
19 | # include <stddef.h> | 19 | # include <stddef.h> |
20 | # include <errno.h> | 20 | # include <errno.h> |
21 | #else | 21 | #else |
@@ -23,6 +23,7 @@ | |||
23 | #endif | 23 | #endif |
24 | #ifdef STDC | 24 | #ifdef STDC |
25 | # include <string.h> | 25 | # include <string.h> |
26 | # include <stdlib.h> | ||
26 | #endif | 27 | #endif |
27 | 28 | ||
28 | #ifndef local | 29 | #ifndef local |
@@ -36,15 +37,17 @@ typedef unsigned short ush; | |||
36 | typedef ush FAR ushf; | 37 | typedef ush FAR ushf; |
37 | typedef unsigned long ulg; | 38 | typedef unsigned long ulg; |
38 | 39 | ||
39 | extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | 40 | extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ |
41 | /* (size given to avoid silly warnings with Visual C++) */ | ||
40 | 42 | ||
41 | #define ERR_RETURN(strm,err) return (strm->msg=z_errmsg[1-err], err) | 43 | #define ERR_MSG(err) (char*)z_errmsg[Z_NEED_DICT-(err)] |
44 | |||
45 | #define ERR_RETURN(strm,err) \ | ||
46 | return (strm->msg = ERR_MSG(err), (err)) | ||
42 | /* To be used only when the state is known to be valid */ | 47 | /* To be used only when the state is known to be valid */ |
43 | 48 | ||
44 | /* common constants */ | 49 | /* common constants */ |
45 | 50 | ||
46 | #define DEFLATED 8 | ||
47 | |||
48 | #ifndef DEF_WBITS | 51 | #ifndef DEF_WBITS |
49 | # define DEF_WBITS MAX_WBITS | 52 | # define DEF_WBITS MAX_WBITS |
50 | #endif | 53 | #endif |
@@ -66,6 +69,8 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||
66 | #define MAX_MATCH 258 | 69 | #define MAX_MATCH 258 |
67 | /* The minimum and maximum match lengths */ | 70 | /* The minimum and maximum match lengths */ |
68 | 71 | ||
72 | #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ | ||
73 | |||
69 | /* target dependencies */ | 74 | /* target dependencies */ |
70 | 75 | ||
71 | #ifdef MSDOS | 76 | #ifdef MSDOS |
@@ -81,7 +86,7 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||
81 | # define OS_CODE 0x06 | 86 | # define OS_CODE 0x06 |
82 | #endif | 87 | #endif |
83 | 88 | ||
84 | #ifdef WIN32 /* Windows NT */ | 89 | #ifdef WIN32 /* Window 95 & Windows NT */ |
85 | # define OS_CODE 0x0b | 90 | # define OS_CODE 0x0b |
86 | #endif | 91 | #endif |
87 | 92 | ||
@@ -143,11 +148,13 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||
143 | # define HAVE_MEMCPY | 148 | # define HAVE_MEMCPY |
144 | #endif | 149 | #endif |
145 | #ifdef HAVE_MEMCPY | 150 | #ifdef HAVE_MEMCPY |
146 | # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ | 151 | # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ |
147 | # define zmemcpy _fmemcpy | 152 | # define zmemcpy _fmemcpy |
153 | # define zmemcmp _fmemcmp | ||
148 | # define zmemzero(dest, len) _fmemset(dest, 0, len) | 154 | # define zmemzero(dest, len) _fmemset(dest, 0, len) |
149 | # else | 155 | # else |
150 | # define zmemcpy memcpy | 156 | # define zmemcpy memcpy |
157 | # define zmemcmp memcmp | ||
151 | # define zmemzero(dest, len) memset(dest, 0, len) | 158 | # define zmemzero(dest, len) memset(dest, 0, len) |
152 | # endif | 159 | # endif |
153 | #else | 160 | #else |
@@ -177,7 +184,7 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */ | |||
177 | #endif | 184 | #endif |
178 | 185 | ||
179 | 186 | ||
180 | typedef uLong (*check_func) OF((uLong check, Bytef *buf, uInt len)); | 187 | typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len)); |
181 | 188 | ||
182 | extern void z_error OF((char *m)); | 189 | extern void z_error OF((char *m)); |
183 | 190 | ||