summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-09 23:06:52 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-09 23:06:52 -0700
commit64b2e892035cf6ea98800c54dce0d63730d50272 (patch)
treee3b569f87e413eaef4a13469acfd4224b2a63d3a
parent4ca984fb447ac57120c394cf2fbba23837ed31c2 (diff)
downloadzlib-0.9.tar.gz
zlib-0.9.tar.bz2
zlib-0.9.zip
zlib 0.9v0.9
-rw-r--r--ChangeLog12
-rw-r--r--Makefile4
-rw-r--r--Makefile.bak59
-rw-r--r--Makefile.bor98
-rw-r--r--Makefile.msc95
-rw-r--r--Makefile.tc97
-rw-r--r--README19
-rw-r--r--crc32.c16
-rw-r--r--deflate.c32
-rw-r--r--deflate.h4
-rw-r--r--example.c81
-rw-r--r--gzio.c8
-rw-r--r--infblock.c74
-rw-r--r--infblock.h13
-rw-r--r--infcodes.c18
-rw-r--r--inffast.c12
-rw-r--r--inflate.c204
-rw-r--r--infutil.c8
-rw-r--r--infutil.h10
-rw-r--r--trees.c36
-rw-r--r--zconf.h18
-rw-r--r--zlib.h36
-rw-r--r--zutil.h11
23 files changed, 774 insertions, 191 deletions
diff --git a/ChangeLog b/ChangeLog
index 668d036..54470f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,22 @@
1 ChangeLog file for zlib 1 ChangeLog file for zlib
2 2
3Changes in 0.9 (1 May 95)
4- don't assume that zalloc clears the allocated memory (the TurboC bug
5 was Mark's bug after all :)
6- let again gzread copy uncompressed data unchanged (was working in 0.71)
7- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
8- added a test of inflateSync in example.c
9- moved MAX_WBITS to zconf.h because users might want to change that.
10- document explicitly that zalloc(64K) on MSDOS must return a normalized
11 pointer (zero offset)
12- added Makefiles for Microsoft C, Turbo C, Borland C++
13
3Changes in 0.8 (29 April 95) 14Changes in 0.8 (29 April 95)
4- added fast inflate (inffast.c) 15- added fast inflate (inffast.c)
5- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this 16- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
6 is incompatible with previous versions of zlib which returned Z_OK. 17 is incompatible with previous versions of zlib which returned Z_OK.
7- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) 18- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
19 (actually that was not a compiler bug, see 0.81 above)
8- gzread no longer reads one extra byte in certain cases 20- gzread no longer reads one extra byte in certain cases
9- In gzio destroy(), don't reference a freed structure 21- In gzio destroy(), don't reference a freed structure
10- avoid many warnings for MSDOS 22- avoid many warnings for MSDOS
diff --git a/Makefile b/Makefile
index facba8a..f251670 100644
--- a/Makefile
+++ b/Makefile
@@ -33,11 +33,11 @@ clean:
33 rm -f *.o example minigzip inftest libgz.a foo.gz 33 rm -f *.o example minigzip inftest libgz.a foo.gz
34 34
35zip: 35zip:
36 zip -ul9 zlib README ChangeLog Makefile *.[ch] 36 zip -ul9 zlib README ChangeLog Makefile Makefile.??? Makefile.?? *.[ch]
37 37
38tgz: 38tgz:
39 cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ 39 cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
40 zlib/*.[ch] 40 zlib/Makefile.??? zlib/Makefile.?? zlib/*.[ch]
41 41
42# DO NOT DELETE THIS LINE -- make depend depends on it. 42# DO NOT DELETE THIS LINE -- make depend depends on it.
43 43
diff --git a/Makefile.bak b/Makefile.bak
new file mode 100644
index 0000000..bfe1b74
--- /dev/null
+++ b/Makefile.bak
@@ -0,0 +1,59 @@
1CC=gcc
2CFLAGS=-O2
3#CFLAGS=-g -DDEBUG
4LDFLAGS=-L. -lgz
5
6RANLIB=ranlib
7
8OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
9 zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
10
11TEST_OBJS = example.o minigzip.o inftest.o
12
13all: example minigzip inftest
14
15test: all
16 ./example
17 echo hello world | ./minigzip | ./minigzip -d
18
19libgz.a: $(OBJS)
20 ar rc $@ $(OBJS)
21 $(RANLIB) $@
22
23example: example.o libgz.a
24 $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
25
26minigzip: minigzip.o libgz.a
27 $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
28
29inftest: inftest.o libgz.a
30 $(CC) $(CFLAGS) -o $@ inftest.o $(LDFLAGS)
31
32clean:
33 rm -f *.o example minigzip inftest libgz.a foo.gz
34
35zip:
36 zip -ul9 zlib README ChangeLog Makefile *.[ch]
37
38tgz:
39 cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
40 zlib/*.[ch]
41
42# DO NOT DELETE THIS LINE -- make depend depends on it.
43
44adler32.o: zutil.h zlib.h zconf.h
45compress.o: zlib.h zconf.h
46crc32.o: zutil.h zlib.h zconf.h
47deflate.o: deflate.h zutil.h zlib.h zconf.h
48example.o: zlib.h zconf.h
49gzio.o: zutil.h zlib.h zconf.h
50infblock.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
51infcodes.o: zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h
52inflate.o: zutil.h zlib.h zconf.h infblock.h
53inftest.o: zutil.h zlib.h zconf.h
54inftrees.o: zutil.h zlib.h zconf.h inftrees.h
55infutil.o: zutil.h zlib.h zconf.h inftrees.h infutil.h
56minigzip.o: zlib.h zconf.h
57trees.o: deflate.h zutil.h zlib.h zconf.h
58uncompr.o: zlib.h zconf.h
59zutil.o: zutil.h zlib.h zconf.h
diff --git a/Makefile.bor b/Makefile.bor
new file mode 100644
index 0000000..877ed62
--- /dev/null
+++ b/Makefile.bor
@@ -0,0 +1,98 @@
1# Makefile for zlib
2# Borland C++ ************ UNTESTED ***********
3
4# To use, do "make -fmakefile.bor"
5
6# WARNING: the small model is supported but only for small values of
7# MAX_WBITS and MAX_MEM_LEVEL
8
9# ------------- Turbo C++, Borland C++ -------------
10MODEL=-ml
11CFLAGS=-O2 -Z $(MODEL)
12CC=bcc
13LD=bcc
14LIB=tlib
15# replace bcc with tcc for Turbo C++ 1.0
16LDFLAGS=$(MODEL)
17O=.obj
18
19# variables
20OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
21 trees$(O)
22OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
23 trees$(O)
24OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
25 infutil$(O) inffast$(O)
26OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
27 infutil$(O)+inffast$(O)
28
29all: test
30
31adler32.obj: adler32.c zutil.h zlib.h zconf.h
32 $(CC) -c $(CFLAGS) $*.c
33
34compress.obj: compress.c zlib.h zconf.h
35 $(CC) -c $(CFLAGS) $*.c
36
37crc32.obj: crc32.c zutil.h zlib.h zconf.h
38 $(CC) -c $(CFLAGS) $*.c
39
40deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
41 $(CC) -c $(CFLAGS) $*.c
42
43gzio.obj: gzio.c zutil.h zlib.h zconf.h
44 $(CC) -c $(CFLAGS) $*.c
45
46infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
47 infcodes.h infutil.h
48 $(CC) -c $(CFLAGS) $*.c
49
50infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
51 infcodes.h inffast.h
52 $(CC) -c $(CFLAGS) $*.c
53
54inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
55 $(CC) -c $(CFLAGS) $*.c
56
57inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
58 $(CC) -c $(CFLAGS) $*.c
59
60infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
61 $(CC) -c $(CFLAGS) $*.c
62
63inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
64 $(CC) -c $(CFLAGS) $*.c
65
66trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
67 $(CC) -c $(CFLAGS) $*.c
68
69uncompr.obj: uncompr.c zlib.h zconf.h
70 $(CC) -c $(CFLAGS) $*.c
71
72zutil.obj: zutil.c zutil.h zlib.h zconf.h
73 $(CC) -c $(CFLAGS) $*.c
74
75example.obj: example.c zlib.h zconf.h
76 $(CC) -c $(CFLAGS) $*.c
77
78minigzip.obj: minigzip.c zlib.h zconf.h
79 $(CC) -c $(CFLAGS) $*.c
80
81# we must cut the command line to fit in the MS/DOS 128 byte limit:
82zlib.lib: $(OBJ1) $(OBJ2)
83 $(LIB) zlib +$(OBJP1)
84 $(LIB) zlib +$(OBJP2)
85
86example.exe: example.obj zlib.lib
87 $(LD) $(LDFLAGS) example.obj zlib.lib
88
89minigzip.exe: minigzip.obj zlib.lib
90 $(LD) $(LDFLAGS) minigzip.obj zlib.lib
91
92test: example.exe minigzip.exe
93 example
94 echo hello world | minigzip | minigzip -d
95
96#clean:
97# del *.obj
98# del *.exe
diff --git a/Makefile.msc b/Makefile.msc
new file mode 100644
index 0000000..375d21c
--- /dev/null
+++ b/Makefile.msc
@@ -0,0 +1,95 @@
1# Makefile for zlib
2# Microsoft C 5.1 or later
3
4# To use, do "make makefile.msc"
5
6# WARNING: the small model is supported but only for small values of
7# MAX_WBITS and MAX_MEM_LEVEL
8
9# ------------- Microsoft C 5.1 and later -------------
10MODEL=-AL
11CFLAGS=-Oait -Gs -nologo -W3 $(MODEL)
12#-Ox generates bad code with MSC 5.1
13CC=cl
14LD=link
15LDFLAGS=/e/st:0x1000/noe
16O=.obj
17
18# variables
19OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
20 trees$(O)
21OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
22 trees$(O)
23OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
24 infutil$(O) inffast$(O)
25OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
26 infutil$(O)+inffast$(O)
27
28adler32.obj: adler32.c zutil.h zlib.h zconf.h
29 $(CC) -c $(CFLAGS) $*.c
30
31compress.obj: compress.c zlib.h zconf.h
32 $(CC) -c $(CFLAGS) $*.c
33
34crc32.obj: crc32.c zutil.h zlib.h zconf.h
35 $(CC) -c $(CFLAGS) $*.c
36
37deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
38 $(CC) -c $(CFLAGS) $*.c
39
40gzio.obj: gzio.c zutil.h zlib.h zconf.h
41 $(CC) -c $(CFLAGS) $*.c
42
43infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
44 infcodes.h infutil.h
45 $(CC) -c $(CFLAGS) $*.c
46
47infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
48 infcodes.h inffast.h
49 $(CC) -c $(CFLAGS) $*.c
50
51inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
52 $(CC) -c $(CFLAGS) $*.c
53
54inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
55 $(CC) -c $(CFLAGS) $*.c
56
57infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
58 $(CC) -c $(CFLAGS) $*.c
59
60inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
61 $(CC) -c $(CFLAGS) $*.c
62
63trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
64 $(CC) -c $(CFLAGS) $*.c
65
66uncompr.obj: uncompr.c zlib.h zconf.h
67 $(CC) -c $(CFLAGS) $*.c
68
69zutil.obj: zutil.c zutil.h zlib.h zconf.h
70 $(CC) -c $(CFLAGS) $*.c
71
72example.obj: example.c zlib.h zconf.h
73 $(CC) -c $(CFLAGS) $*.c
74
75minigzip.obj: minigzip.c zlib.h zconf.h
76 $(CC) -c $(CFLAGS) $*.c
77
78# we must cut the command line to fit in the MS/DOS 128 byte limit:
79zlib.lib: $(OBJ1) $(OBJ2)
80 lib zlib $(OBJ1);
81 lib zlib $(OBJ2);
82
83example.exe: example.obj zlib.lib
84 $(LD) $(LDFLAGS) example.obj,,,zlib.lib;
85
86minigzip.exe: minigzip.obj zlib.lib
87 $(LD) $(LDFLAGS) minigzip.obj,,,zlib.lib;
88
89test: example.exe minigzip.exe
90 example
91 echo hello world | minigzip | minigzip -d
92
93#clean:
94# del *.obj
95# del *.exe
diff --git a/Makefile.tc b/Makefile.tc
new file mode 100644
index 0000000..51075f7
--- /dev/null
+++ b/Makefile.tc
@@ -0,0 +1,97 @@
1# Makefile for zlib
2# TurboC 2.0
3
4# To use, do "make -fmakefile.tc"
5
6# WARNING: the small model is supported but only for small values of
7# MAX_WBITS and MAX_MEM_LEVEL
8
9# ------------- Turbo C 2.0 -------------
10MODEL=-ml
11CFLAGS=-O2 -Z $(MODEL)
12CC=tcc
13LD=tcc
14LIB=tlib
15LDFLAGS=$(MODEL)
16O=.obj
17
18# variables
19OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O) deflate$(O) \
20 trees$(O)
21OBJP1 = adler32$(O)+compress$(O)+crc32$(O)+gzio$(O)+uncompr$(O)+deflate$(O)+\
22 trees$(O)
23OBJ2 = zutil$(O) inflate$(O) infblock$(O) inftrees$(O) infcodes$(O) \
24 infutil$(O) inffast$(O)
25OBJP2 = zutil$(O)+inflate$(O)+infblock$(O)+inftrees$(O)+infcodes$(O)+\
26 infutil$(O)+inffast$(O)
27
28all: test
29
30adler32.obj: adler32.c zutil.h zlib.h zconf.h
31 $(CC) -c $(CFLAGS) $*.c
32
33compress.obj: compress.c zlib.h zconf.h
34 $(CC) -c $(CFLAGS) $*.c
35
36crc32.obj: crc32.c zutil.h zlib.h zconf.h
37 $(CC) -c $(CFLAGS) $*.c
38
39deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
40 $(CC) -c $(CFLAGS) $*.c
41
42gzio.obj: gzio.c zutil.h zlib.h zconf.h
43 $(CC) -c $(CFLAGS) $*.c
44
45infblock.obj: infblock.c zutil.h zlib.h zconf.h infblock.h inftrees.h\
46 infcodes.h infutil.h
47 $(CC) -c $(CFLAGS) $*.c
48
49infcodes.obj: infcodes.c zutil.h zlib.h zconf.h inftrees.h infutil.h\
50 infcodes.h inffast.h
51 $(CC) -c $(CFLAGS) $*.c
52
53inflate.obj: inflate.c zutil.h zlib.h zconf.h infblock.h
54 $(CC) -c $(CFLAGS) $*.c
55
56inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
57 $(CC) -c $(CFLAGS) $*.c
58
59infutil.obj: infutil.c zutil.h zlib.h zconf.h inftrees.h infutil.h
60 $(CC) -c $(CFLAGS) $*.c
61
62inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
63 $(CC) -c $(CFLAGS) $*.c
64
65trees.obj: trees.c deflate.h zutil.h zlib.h zconf.h
66 $(CC) -c $(CFLAGS) $*.c
67
68uncompr.obj: uncompr.c zlib.h zconf.h
69 $(CC) -c $(CFLAGS) $*.c
70
71zutil.obj: zutil.c zutil.h zlib.h zconf.h
72 $(CC) -c $(CFLAGS) $*.c
73
74example.obj: example.c zlib.h zconf.h
75 $(CC) -c $(CFLAGS) $*.c
76
77minigzip.obj: minigzip.c zlib.h zconf.h
78 $(CC) -c $(CFLAGS) $*.c
79
80# we must cut the command line to fit in the MS/DOS 128 byte limit:
81zlib.lib: $(OBJ1) $(OBJ2)
82 $(LIB) zlib +$(OBJP1)
83 $(LIB) zlib +$(OBJP2)
84
85example.exe: example.obj zlib.lib
86 $(LD) $(LDFLAGS) -eexample.exe example.obj zlib.lib
87
88minigzip.exe: minigzip.obj zlib.lib
89 $(LD) $(LDFLAGS) -eminigzip.exe minigzip.obj zlib.lib
90
91test: example.exe minigzip.exe
92 example
93 echo hello world | minigzip | minigzip -d
94
95#clean:
96# del *.obj
97# del *.exe
diff --git a/README b/README
index a8d5788..0c718f1 100644
--- a/README
+++ b/README
@@ -1,6 +1,4 @@
1zlib 0.8 is a beta version of a general purpose compression library. 1zlib 0.9 is a beta version of a general purpose compression library.
2This is the first version with no known bugs. (There may still be
3problem on SGI, to be checked.)
4 2
5The data format used by the zlib library is described in the 3The data format used by the zlib library is described in the
6file zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available 4file zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available
@@ -11,18 +9,17 @@ zlib.h. A usage example of the library is given in the file example.c
11which also tests that the library is working correctly. 9which also tests that the library is working correctly.
12To compile all files and run the test program, just type: make test 10To compile all files and run the test program, just type: make test
13 11
14The changes made in version 0.8 are documented in the file ChangeLog. 12The changes made in version 0.9 are documented in the file ChangeLog.
15The main changes since 0.71 are: 13The main changes since 0.8 are:
16- added fast inflate (inffast.c) 14- don't assume that zalloc clears the allocated memory
17- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this 15- let again gzread copy uncompressed data unchanged (was working in 0.71)
18 is incompatible with previous versions of zlib which returned Z_OK. 16- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
19- work around a nasty TurboC compiler bug
20 17
21On MSDOS, this version works in both large and small model. However 18On MSDOS, this version works in both large and small model. However
22small model compression works only for small values of MEM_LEVEL and 19small model compression works only for small values of MEM_LEVEL and
23WBITS (see zutil.h). Small model decompression should work up to WBITS=15. 20WBITS (see zutil.h). Small model decompression should work up to WBITS=15.
24This version of zlib does not yet support small or medium model with 21This version of zlib does not support small or medium model with far
25far allocation of big objects. 22allocation of big objects.
26 23
27 24
28 Copyright (C) 1995 Jean-loup Gailly and Mark Adler 25 Copyright (C) 1995 Jean-loup Gailly and Mark Adler
diff --git a/crc32.c b/crc32.c
index e8d385f..d9485c2 100644
--- a/crc32.c
+++ b/crc32.c
@@ -3,12 +3,17 @@
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/* $Id: crc32.c,v 1.4 1995/04/14 14:55:12 jloup Exp $ */ 6/* $Id: crc32.c,v 1.5 1995/05/01 13:55:46 jloup Exp $ */
7 7
8#include "zlib.h" 8#include "zlib.h"
9 9
10extern uLong crc_table[]; /* crc table, defined below */ 10extern uLong crc_table[]; /* crc table, defined below */
11 11
12#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
13#define DO2(buf) DO1(buf); DO1(buf);
14#define DO4(buf) DO2(buf); DO2(buf);
15#define DO8(buf) DO4(buf); DO4(buf);
16
12/* ========================================================================= */ 17/* ========================================================================= */
13uLong crc32(crc, buf, len) 18uLong crc32(crc, buf, len)
14 uLong crc; 19 uLong crc;
@@ -17,8 +22,13 @@ uLong crc32(crc, buf, len)
17{ 22{
18 if (buf == Z_NULL) return 0L; 23 if (buf == Z_NULL) return 0L;
19 crc = crc ^ 0xffffffffL; 24 crc = crc ^ 0xffffffffL;
25 while (len >= 8)
26 {
27 DO8(buf);
28 len -= 8;
29 }
20 if (len) do { 30 if (len) do {
21 crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); 31 DO1(buf);
22 } while (--len); 32 } while (--len);
23 return crc ^ 0xffffffffL; 33 return crc ^ 0xffffffffL;
24} 34}
@@ -29,7 +39,7 @@ uLong crc32(crc, buf, len)
29 */ 39 */
30#ifdef DYNAMIC_CRC_TABLE 40#ifdef DYNAMIC_CRC_TABLE
31 41
32void make_crc_table() 42local void make_crc_table()
33{ 43{
34 uLong c; 44 uLong c;
35 int n, k; 45 int n, k;
diff --git a/deflate.c b/deflate.c
index e7e52af..75db3d0 100644
--- a/deflate.c
+++ b/deflate.c
@@ -47,7 +47,7 @@
47 * 47 *
48 */ 48 */
49 49
50/* $Id: deflate.c,v 1.5 1995/04/29 16:52:05 jloup Exp $ */ 50/* $Id: deflate.c,v 1.6 1995/05/01 17:23:57 jloup Exp $ */
51 51
52#include "deflate.h" 52#include "deflate.h"
53 53
@@ -152,12 +152,20 @@ local void check_match __P((deflate_state *s, IPos start, IPos match,
152 s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ 152 s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
153 s->head[s->ins_h] = (str)) 153 s->head[s->ins_h] = (str))
154 154
155/* ===========================================================================
156 * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
157 * prev[] will be initialized on the fly.
158 */
159#define CLEAR_HASH(s) \
160 s->head[s->hash_size-1] = NIL; \
161 zmemzero((char*)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
162
155/* ========================================================================= */ 163/* ========================================================================= */
156int deflateInit (strm, level) 164int deflateInit (strm, level)
157 z_stream *strm; 165 z_stream *strm;
158 int level; 166 int level;
159{ 167{
160 return deflateInit2 (strm, level, DEFLATED, WBITS, MEM_LEVEL, 0); 168 return deflateInit2 (strm, level, DEFLATED, MAX_WBITS, MAX_MEM_LEVEL, 0);
161 /* To do: ignore strm->next_in if we use it as window */ 169 /* To do: ignore strm->next_in if we use it as window */
162} 170}
163 171
@@ -345,6 +353,13 @@ int deflate (strm, flush)
345 } else { 353 } else {
346 if (deflate_slow(strm->state, flush)) return Z_OK; 354 if (deflate_slow(strm->state, flush)) return Z_OK;
347 } 355 }
356 /* ??? remember Z_FULL_FLUSH if we didn't have enough space */
357 if (flush == Z_FULL_FLUSH) {
358 ct_stored_block(strm->state, (char*)0, 0L, 0); /* special marker */
359 flush_pending(strm);
360 CLEAR_HASH(strm->state); /* forget history */
361 if (strm->avail_out == 0) return Z_OK;
362 }
348 } 363 }
349 Assert(strm->avail_out > 0, "bug2"); 364 Assert(strm->avail_out > 0, "bug2");
350 365
@@ -435,12 +450,7 @@ local void lm_init (s)
435 450
436 s->window_size = (ulg)2L*s->w_size; 451 s->window_size = (ulg)2L*s->w_size;
437 452
438 453 CLEAR_HASH(s);
439 /* Initialize the hash table (avoiding 64K overflow for 16 bit systems).
440 * prev[] will be initialized on the fly.
441 */
442 s->head[s->hash_size-1] = NIL;
443 zmemzero((char*)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
444 454
445 /* Set the default configuration parameters: 455 /* Set the default configuration parameters:
446 */ 456 */
@@ -930,8 +940,10 @@ local int deflate_slow(s, flush)
930 s->lookahead--; 940 s->lookahead--;
931 } 941 }
932 } 942 }
933 if (s->match_available) ct_tally (s, 0, s->window[s->strstart-1]); 943 if (s->match_available) {
934 944 ct_tally (s, 0, s->window[s->strstart-1]);
945 s->match_available = 0;
946 }
935 FLUSH_BLOCK(s, flush == Z_FINISH); 947 FLUSH_BLOCK(s, flush == Z_FINISH);
936 return 0; 948 return 0;
937} 949}
diff --git a/deflate.h b/deflate.h
index 740c25a..1f8068e 100644
--- a/deflate.h
+++ b/deflate.h
@@ -8,7 +8,7 @@
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/* $Id: deflate.h,v 1.3 1995/04/14 12:39:45 jloup Exp $ */ 11/* $Id: deflate.h,v 1.4 1995/05/01 15:08:45 jloup Exp $ */
12 12
13#include "zutil.h" 13#include "zutil.h"
14 14
@@ -268,3 +268,5 @@ typedef struct internal_state {
268void ct_init __P((deflate_state *s)); 268void ct_init __P((deflate_state *s));
269int ct_tally __P((deflate_state *s, int dist, int lc)); 269int ct_tally __P((deflate_state *s, int dist, int lc));
270ulg ct_flush_block __P((deflate_state *s, char *buf, ulg stored_len, int eof)); 270ulg ct_flush_block __P((deflate_state *s, char *buf, ulg stored_len, int eof));
271void ct_stored_block __P((deflate_state *s, char *buf, ulg stored_len,
272 int eof));
diff --git a/example.c b/example.c
index 5b482b8..c1bac1e 100644
--- a/example.c
+++ b/example.c
@@ -3,7 +3,7 @@
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/* $Id: example.c,v 1.6 1995/04/29 16:53:46 jloup Exp $ */ 6/* $Id: example.c,v 1.7 1995/05/01 16:57:22 jloup Exp $ */
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include "zlib.h" 9#include "zlib.h"
@@ -182,6 +182,81 @@ void test_inflate(compr)
182} 182}
183 183
184/* =========================================================================== 184/* ===========================================================================
185 * Test deflate() with full flush
186 */
187void test_flush(compr)
188 Byte compr[];
189{
190 z_stream c_stream; /* compression stream */
191 int err;
192 int len = strlen(hello)+1;
193
194 c_stream.zalloc = (alloc_func)0;
195 c_stream.zfree = (free_func)0;
196
197 err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
198 CHECK_ERR(err, "deflateInit");
199
200 c_stream.next_in = (Byte*)hello;
201 c_stream.next_out = compr;
202 c_stream.avail_in = 3;
203 c_stream.avail_out = BUFLEN;
204 err = deflate(&c_stream, Z_FULL_FLUSH);
205 CHECK_ERR(err, "deflate");
206
207 compr[3]++; /* force an error in first compressed block */
208 c_stream.avail_in = len - 3;
209
210 err = deflate(&c_stream, Z_FINISH);
211 if (err != Z_STREAM_END) {
212 CHECK_ERR(err, "deflate");
213 }
214 err = deflateEnd(&c_stream);
215 CHECK_ERR(err, "deflateEnd");
216}
217
218/* ===========================================================================
219 * Test inflateSync()
220 */
221void test_sync(compr)
222 Byte compr[];
223{
224 local Byte uncompr[BUFLEN];
225 int err;
226 z_stream d_stream; /* decompression stream */
227
228 strcpy((char*)uncompr, "garbage");
229
230 d_stream.zalloc = (alloc_func)0;
231 d_stream.zfree = (free_func)0;
232
233 err = inflateInit(&d_stream);
234 CHECK_ERR(err, "inflateInit");
235
236 d_stream.next_in = compr;
237 d_stream.next_out = uncompr;
238 d_stream.avail_in = 2; /* just read the zlib header */
239 d_stream.avail_out = sizeof(uncompr);
240
241 inflate(&d_stream, Z_NO_FLUSH);
242 CHECK_ERR(err, "inflate");
243
244 d_stream.avail_in = BUFLEN-2; /* let inflate read all compressed data */
245 err = inflateSync(&d_stream); /* skip the damaged part */
246 CHECK_ERR(err, "inflateSync");
247
248 err = inflate(&d_stream, Z_FINISH);
249 if (err != Z_DATA_ERROR) {
250 fprintf(stderr, "inflate should report DATA_ERROR\n");
251 /* Because of incorrect adler32 */
252 }
253 err = inflateEnd(&d_stream);
254 CHECK_ERR(err, "inflateEnd");
255
256 printf("after inflateSync(): %s\n", uncompr);
257}
258
259/* ===========================================================================
185 * Usage: example [output.gz [input.gz]] 260 * Usage: example [output.gz [input.gz]]
186 */ 261 */
187 262
@@ -204,8 +279,10 @@ void main(argc, argv)
204 (argc > 2 ? argv[2] : "foo.gz")); 279 (argc > 2 ? argv[2] : "foo.gz"));
205 280
206 test_deflate(compr); 281 test_deflate(compr);
207
208 test_inflate(compr); 282 test_inflate(compr);
209 283
284 test_flush(compr);
285 test_sync(compr);
286
210 exit(0); 287 exit(0);
211} 288}
diff --git a/gzio.c b/gzio.c
index 6c3211a..1f5e130 100644
--- a/gzio.c
+++ b/gzio.c
@@ -3,7 +3,7 @@
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/* $Id: gzio.c,v 1.5 1995/04/29 17:13:56 jloup Exp $ */ 6/* $Id: gzio.c,v 1.6 1995/04/30 19:52:21 jloup Exp $ */
7 7
8#include <stdio.h> 8#include <stdio.h>
9 9
@@ -128,7 +128,7 @@ local gzFile gz_open (path, mode, fd)
128 128
129 if (s->mode == 'w') { 129 if (s->mode == 'w') {
130 err = deflateInit2(&(s->stream), Z_DEFAULT_COMPRESSION, 130 err = deflateInit2(&(s->stream), Z_DEFAULT_COMPRESSION,
131 DEFLATED, -WBITS, MEM_LEVEL, 0); 131 DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, 0);
132 /* windowBits is passed < 0 to suppress zlib header */ 132 /* windowBits is passed < 0 to suppress zlib header */
133 133
134 s->stream.next_out = s->outbuf = ALLOC(Z_BUFSIZE); 134 s->stream.next_out = s->outbuf = ALLOC(Z_BUFSIZE);
@@ -137,7 +137,7 @@ local gzFile gz_open (path, mode, fd)
137 return destroy(s), (gzFile)Z_NULL; 137 return destroy(s), (gzFile)Z_NULL;
138 } 138 }
139 } else { 139 } else {
140 err = inflateInit2(&(s->stream), -WBITS); 140 err = inflateInit2(&(s->stream), -MAX_WBITS);
141 s->stream.next_in = s->inbuf = ALLOC(Z_BUFSIZE); 141 s->stream.next_in = s->inbuf = ALLOC(Z_BUFSIZE);
142 142
143 if (err != Z_OK || s->inbuf == Z_NULL) { 143 if (err != Z_OK || s->inbuf == Z_NULL) {
@@ -249,7 +249,7 @@ int gzread (file, buf, len)
249 len--; n++; 249 len--; n++;
250 } 250 }
251 if (len == 0) return n; 251 if (len == 0) return n;
252 return n + fread(buf, 1, len, s->file); 252 return n + fread(b, 1, len, s->file);
253 } 253 }
254 if (s->z_err == Z_DATA_ERROR) return -1; /* bad .gz file */ 254 if (s->z_err == Z_DATA_ERROR) return -1; /* bad .gz file */
255 if (s->z_err == Z_STREAM_END) return 0; /* don't read crc as data */ 255 if (s->z_err == Z_STREAM_END) return 0; /* don't read crc as data */
diff --git a/infblock.c b/infblock.c
index 2c2f8dd..538fa62 100644
--- a/infblock.c
+++ b/infblock.c
@@ -60,6 +60,28 @@ local uInt border[] = { /* Order of the bit length code lengths */
60 the two sets of lengths. 60 the two sets of lengths.
61 */ 61 */
62 62
63
64void inflate_blocks_reset(s, z, c)
65struct inflate_blocks_state *s;
66z_stream *z;
67uLong *c;
68{
69 if (s->checkfn != Z_NULL)
70 *c = s->check;
71 if (s->mode == BTREE || s->mode == DTREE)
72 ZFREE(z, s->sub.trees.blens);
73 if (s->mode == CODES)
74 inflate_codes_free(s->sub.codes, z);
75 s->mode = TYPE;
76 s->bitk = 0;
77 s->bitb = 0;
78 s->read = s->write = s->window;
79 if (s->checkfn != Z_NULL)
80 s->check = (*s->checkfn)(0L, Z_NULL, 0);
81 Trace((stderr, "inflate: blocks reset\n"));
82}
83
84
63struct inflate_blocks_state *inflate_blocks_new(z, c, w) 85struct inflate_blocks_state *inflate_blocks_new(z, c, w)
64z_stream *z; 86z_stream *z;
65check_func c; 87check_func c;
@@ -75,13 +97,11 @@ uInt w;
75 ZFREE(z, s); 97 ZFREE(z, s);
76 return Z_NULL; 98 return Z_NULL;
77 } 99 }
78 s->mode = TYPE;
79 s->bitk = 0;
80 s->read = s->write = s->window;
81 s->end = s->window + w; 100 s->end = s->window + w;
82 s->checkfn = c; 101 s->checkfn = c;
83 if (s->checkfn != Z_NULL) 102 s->mode = TYPE;
84 s->check = (*s->checkfn)(0L, Z_NULL, 0); 103 Trace((stderr, "inflate: blocks allocated\n"));
104 inflate_blocks_reset(s, z, &s->check);
85 return s; 105 return s;
86} 106}
87 107
@@ -112,12 +132,16 @@ int r;
112 switch (t >> 1) 132 switch (t >> 1)
113 { 133 {
114 case 0: /* stored */ 134 case 0: /* stored */
135 Trace((stderr, "inflate: stored block%s\n",
136 s->last ? " (last)" : ""));
115 DUMPBITS(3) 137 DUMPBITS(3)
116 t = k & 7; /* go to byte boundary */ 138 t = k & 7; /* go to byte boundary */
117 DUMPBITS(t) 139 DUMPBITS(t)
118 s->mode = LENS; /* get length of stored block */ 140 s->mode = LENS; /* get length of stored block */
119 break; 141 break;
120 case 1: /* fixed */ 142 case 1: /* fixed */
143 Trace((stderr, "inflate: fixed codes block%s\n",
144 s->last ? " (last)" : ""));
121 { 145 {
122 uInt bl, bd; 146 uInt bl, bd;
123 inflate_huft *tl, *td; 147 inflate_huft *tl, *td;
@@ -134,12 +158,14 @@ int r;
134 s->mode = CODES; 158 s->mode = CODES;
135 break; 159 break;
136 case 2: /* dynamic */ 160 case 2: /* dynamic */
161 Trace((stderr, "inflate: dynamic codes block%s\n",
162 s->last ? " (last)" : ""));
137 DUMPBITS(3) 163 DUMPBITS(3)
138 s->mode = TABLE; 164 s->mode = TABLE;
139 break; 165 break;
140 case 3: /* illegal */ 166 case 3: /* illegal */
141 DUMPBITS(3) 167 DUMPBITS(3)
142 s->mode = INF_ERROR; 168 s->mode = BAD;
143 z->msg = "invalid block type"; 169 z->msg = "invalid block type";
144 r = Z_DATA_ERROR; 170 r = Z_DATA_ERROR;
145 LEAVE 171 LEAVE
@@ -149,13 +175,14 @@ int r;
149 NEEDBITS(32) 175 NEEDBITS(32)
150 if ((~b) >> 16 != (b & 0xffff)) 176 if ((~b) >> 16 != (b & 0xffff))
151 { 177 {
152 s->mode = INF_ERROR; 178 s->mode = BAD;
153 z->msg = "invalid stored block lengths"; 179 z->msg = "invalid stored block lengths";
154 r = Z_DATA_ERROR; 180 r = Z_DATA_ERROR;
155 LEAVE 181 LEAVE
156 } 182 }
157 k = 0; /* dump bits */ 183 k = 0; /* dump bits */
158 s->sub.left = (uInt)b & 0xffff; 184 s->sub.left = (uInt)b & 0xffff;
185 Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
159 s->mode = s->sub.left ? STORED : TYPE; 186 s->mode = s->sub.left ? STORED : TYPE;
160 break; 187 break;
161 case STORED: 188 case STORED:
@@ -164,6 +191,9 @@ int r;
164 NEEDOUT 191 NEEDOUT
165 OUTBYTE(NEXTBYTE) 192 OUTBYTE(NEXTBYTE)
166 } while (--s->sub.left); 193 } while (--s->sub.left);
194 Tracev((stderr, "inflate: stored end, %lu total out\n",
195 z->total_out + (q >= s->read ? q - s->read :
196 (s->end - s->read) + (q - s->window))));
167 s->mode = s->last ? DRY : TYPE; 197 s->mode = s->last ? DRY : TYPE;
168 break; 198 break;
169 case TABLE: 199 case TABLE:
@@ -172,7 +202,7 @@ int r;
172#ifndef PKZIP_BUG_WORKAROUND 202#ifndef PKZIP_BUG_WORKAROUND
173 if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) 203 if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
174 { 204 {
175 s->mode = INF_ERROR; 205 s->mode = BAD;
176 z->msg = "too many length or distance symbols"; 206 z->msg = "too many length or distance symbols";
177 r = Z_DATA_ERROR; 207 r = Z_DATA_ERROR;
178 LEAVE 208 LEAVE
@@ -188,6 +218,7 @@ int r;
188 } 218 }
189 DUMPBITS(14) 219 DUMPBITS(14)
190 s->sub.trees.index = 0; 220 s->sub.trees.index = 0;
221 Tracev((stderr, "inflate: table sizes ok\n"));
191 s->mode = BTREE; 222 s->mode = BTREE;
192 case BTREE: 223 case BTREE:
193 while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) 224 while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
@@ -205,10 +236,11 @@ int r;
205 { 236 {
206 r = t; 237 r = t;
207 if (r == Z_DATA_ERROR) 238 if (r == Z_DATA_ERROR)
208 s->mode = INF_ERROR; 239 s->mode = BAD;
209 LEAVE 240 LEAVE
210 } 241 }
211 s->sub.trees.index = 0; 242 s->sub.trees.index = 0;
243 Tracev((stderr, "inflate: bits tree ok\n"));
212 s->mode = DTREE; 244 s->mode = DTREE;
213 case DTREE: 245 case DTREE:
214 while (t = s->sub.trees.table, 246 while (t = s->sub.trees.table,
@@ -240,7 +272,7 @@ int r;
240 if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || 272 if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
241 (c == 16 && i < 1)) 273 (c == 16 && i < 1))
242 { 274 {
243 s->mode = INF_ERROR; 275 s->mode = BAD;
244 z->msg = "invalid bit length repeat"; 276 z->msg = "invalid bit length repeat";
245 r = Z_DATA_ERROR; 277 r = Z_DATA_ERROR;
246 LEAVE 278 LEAVE
@@ -267,10 +299,11 @@ int r;
267 if (t != Z_OK) 299 if (t != Z_OK)
268 { 300 {
269 if (t == (uInt)Z_DATA_ERROR) 301 if (t == (uInt)Z_DATA_ERROR)
270 s->mode = INF_ERROR; 302 s->mode = BAD;
271 r = t; 303 r = t;
272 LEAVE 304 LEAVE
273 } 305 }
306 Tracev((stderr, "inflate: trees ok\n"));
274 if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) 307 if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
275 { 308 {
276 inflate_trees_free(td, z); 309 inflate_trees_free(td, z);
@@ -289,17 +322,20 @@ int r;
289 r = Z_OK; 322 r = Z_OK;
290 inflate_codes_free(s->sub.codes, z); 323 inflate_codes_free(s->sub.codes, z);
291 LOAD 324 LOAD
325 Tracev((stderr, "inflate: codes end, %lu total out\n",
326 z->total_out + (q >= s->read ? q - s->read :
327 (s->end - s->read) + (q - s->window))));
292 if (!s->last) 328 if (!s->last)
293 { 329 {
294 s->mode = TYPE; 330 s->mode = TYPE;
295 break; 331 break;
296 } 332 }
297 if (k > 7) /* return unused byte, if any */ 333 if (k > 7) /* return unused byte, if any */
298 { 334 {
299 Assert(k < 16, "inflate_codes grabbed too many bytes") 335 Assert(k < 16, "inflate_codes grabbed too many bytes")
300 k -= 8; 336 k -= 8;
301 n++; 337 n++;
302 p--; /* can always return one */ 338 p--; /* can always return one */
303 } 339 }
304 s->mode = DRY; 340 s->mode = DRY;
305 case DRY: 341 case DRY:
@@ -310,7 +346,7 @@ int r;
310 case DONE: 346 case DONE:
311 r = Z_STREAM_END; 347 r = Z_STREAM_END;
312 LEAVE 348 LEAVE
313 case INF_ERROR: 349 case BAD:
314 r = Z_DATA_ERROR; 350 r = Z_DATA_ERROR;
315 LEAVE 351 LEAVE
316 default: 352 default:
@@ -325,13 +361,9 @@ struct inflate_blocks_state *s;
325z_stream *z; 361z_stream *z;
326uLong *c; 362uLong *c;
327{ 363{
328 if (s->checkfn != Z_NULL) 364 inflate_blocks_reset(s, z, c);
329 *c = s->check;
330 if (s->mode == BTREE || s->mode == DTREE)
331 ZFREE(z, s->sub.trees.blens);
332 if (s->mode == CODES)
333 inflate_codes_free(s->sub.codes, z);
334 ZFREE(z, s->window); 365 ZFREE(z, s->window);
335 ZFREE(z, s); 366 ZFREE(z, s);
367 Trace((stderr, "inflate: blocks freed\n"));
336 return Z_OK; 368 return Z_OK;
337} 369}
diff --git a/infblock.h b/infblock.h
index 4a9e0e2..33e1696 100644
--- a/infblock.h
+++ b/infblock.h
@@ -11,16 +11,21 @@
11struct inflate_blocks_state; 11struct inflate_blocks_state;
12 12
13extern struct inflate_blocks_state * inflate_blocks_new __P(( 13extern struct inflate_blocks_state * inflate_blocks_new __P((
14 z_stream *z, 14 z_stream *,
15 check_func c, /* check function */ 15 check_func, /* check function */
16 uInt w)); /* window size */ 16 uInt)); /* window size */
17 17
18extern int inflate_blocks __P(( 18extern int inflate_blocks __P((
19 struct inflate_blocks_state *, 19 struct inflate_blocks_state *,
20 z_stream *, 20 z_stream *,
21 int)); /* initial return code */ 21 int)); /* initial return code */
22 22
23extern void inflate_blocks_reset __P((
24 struct inflate_blocks_state *,
25 z_stream *,
26 uLong *)); /* check value on output */
27
23extern int inflate_blocks_free __P(( 28extern int inflate_blocks_free __P((
24 struct inflate_blocks_state *, 29 struct inflate_blocks_state *,
25 z_stream *, 30 z_stream *,
26 uLong *)); /* check value on output */ 31 uLong *)); /* check value on output */
diff --git a/infcodes.c b/infcodes.c
index 489f9d6..fc56547 100644
--- a/infcodes.c
+++ b/infcodes.c
@@ -29,7 +29,7 @@ struct inflate_codes_state {
29 LIT, /* o: got literal, waiting for output space */ 29 LIT, /* o: got literal, waiting for output space */
30 WASH, /* o: got eob, possibly still output waiting */ 30 WASH, /* o: got eob, possibly still output waiting */
31 END, /* x: got eob and all data flushed */ 31 END, /* x: got eob and all data flushed */
32 BAD} /* x: got error */ 32 BADCODE} /* x: got error */
33 mode; /* current inflate_codes mode */ 33 mode; /* current inflate_codes mode */
34 34
35 /* mode dependent information */ 35 /* mode dependent information */
@@ -70,6 +70,7 @@ z_stream *z;
70 c->dbits = (Byte)bd; 70 c->dbits = (Byte)bd;
71 c->ltree = tl; 71 c->ltree = tl;
72 c->dtree = td; 72 c->dtree = td;
73 Tracev((stderr, "inflate: codes new\n"));
73 } 74 }
74 return c; 75 return c;
75} 76}
@@ -107,7 +108,7 @@ int r;
107 LOAD 108 LOAD
108 if (r != Z_OK) 109 if (r != Z_OK)
109 { 110 {
110 c->mode = r == Z_STREAM_END ? WASH : BAD; 111 c->mode = r == Z_STREAM_END ? WASH : BADCODE;
111 break; 112 break;
112 } 113 }
113 } 114 }
@@ -124,7 +125,7 @@ int r;
124 { 125 {
125 if (e == -128) /* invalid code */ 126 if (e == -128) /* invalid code */
126 { 127 {
127 c->mode = BAD; 128 c->mode = BADCODE;
128 z->msg = "invalid literal/length code"; 129 z->msg = "invalid literal/length code";
129 r = Z_DATA_ERROR; 130 r = Z_DATA_ERROR;
130 LEAVE 131 LEAVE
@@ -132,6 +133,7 @@ int r;
132 e = -e; 133 e = -e;
133 if (e & 64) /* end of block */ 134 if (e & 64) /* end of block */
134 { 135 {
136 Tracevv((stderr, "inflate: end of block\n"));
135 c->mode = WASH; 137 c->mode = WASH;
136 break; 138 break;
137 } 139 }
@@ -142,6 +144,9 @@ int r;
142 if (e & 16) /* literal */ 144 if (e & 16) /* literal */
143 { 145 {
144 c->sub.lit = t->base; 146 c->sub.lit = t->base;
147 Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
148 "inflate: literal '%c'\n" :
149 "inflate: literal 0x%02x\n", t->base));
145 c->mode = LIT; 150 c->mode = LIT;
146 break; 151 break;
147 } 152 }
@@ -155,6 +160,7 @@ int r;
155 DUMPBITS(j) 160 DUMPBITS(j)
156 c->sub.code.need = c->dbits; 161 c->sub.code.need = c->dbits;
157 c->sub.code.tree = c->dtree; 162 c->sub.code.tree = c->dtree;
163 Tracevv((stderr, "inflate: length %u\n", c->len));
158 c->mode = DIST; 164 c->mode = DIST;
159 case DIST: /* i: get distance next */ 165 case DIST: /* i: get distance next */
160 j = c->sub.code.need; 166 j = c->sub.code.need;
@@ -165,7 +171,7 @@ int r;
165 { 171 {
166 if (e == -128) 172 if (e == -128)
167 { 173 {
168 c->mode = BAD; 174 c->mode = BADCODE;
169 z->msg = "invalid distance code"; 175 z->msg = "invalid distance code";
170 r = Z_DATA_ERROR; 176 r = Z_DATA_ERROR;
171 LEAVE 177 LEAVE
@@ -182,6 +188,7 @@ int r;
182 NEEDBITS(j) 188 NEEDBITS(j)
183 c->sub.copy.dist += (uInt)b & inflate_mask[j]; 189 c->sub.copy.dist += (uInt)b & inflate_mask[j];
184 DUMPBITS(j) 190 DUMPBITS(j)
191 Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
185 c->mode = COPY; 192 c->mode = COPY;
186 case COPY: /* o: copying bytes in window, waiting for space */ 193 case COPY: /* o: copying bytes in window, waiting for space */
187 f = (uInt)(q - s->window) < c->sub.copy.dist ? 194 f = (uInt)(q - s->window) < c->sub.copy.dist ?
@@ -210,7 +217,7 @@ int r;
210 case END: 217 case END:
211 r = Z_STREAM_END; 218 r = Z_STREAM_END;
212 LEAVE 219 LEAVE
213 case BAD: /* x: got error */ 220 case BADCODE: /* x: got error */
214 r = Z_DATA_ERROR; 221 r = Z_DATA_ERROR;
215 LEAVE 222 LEAVE
216 default: 223 default:
@@ -227,4 +234,5 @@ z_stream *z;
227 inflate_trees_free(c->dtree, z); 234 inflate_trees_free(c->dtree, z);
228 inflate_trees_free(c->ltree, z); 235 inflate_trees_free(c->ltree, z);
229 ZFREE(z, c); 236 ZFREE(z, c);
237 Tracev((stderr, "inflate: codes free\n"));
230} 238}
diff --git a/inffast.c b/inffast.c
index 29c97e2..980a925 100644
--- a/inffast.c
+++ b/inffast.c
@@ -73,6 +73,7 @@ z_stream *z;
73 e = -e; 73 e = -e;
74 if (e & 64) /* end of block */ 74 if (e & 64) /* end of block */
75 { 75 {
76 Tracevv((stderr, "inflate: * end of block\n"));
76 UNGRAB 77 UNGRAB
77 UPDATE 78 UPDATE
78 return Z_STREAM_END; 79 return Z_STREAM_END;
@@ -83,6 +84,9 @@ z_stream *z;
83 /* process literal or length (end of block already trapped) */ 84 /* process literal or length (end of block already trapped) */
84 if (e & 16) /* then it's a literal */ 85 if (e & 16) /* then it's a literal */
85 { 86 {
87 Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
88 "inflate: * literal '%c'\n" :
89 "inflate: * literal 0x%02x\n", t->base));
86 *q++ = (Byte)t->base; 90 *q++ = (Byte)t->base;
87 m--; 91 m--;
88 } 92 }
@@ -91,6 +95,7 @@ z_stream *z;
91 /* get length of block to copy (already have extra bits) */ 95 /* get length of block to copy (already have extra bits) */
92 c = t->base + ((uInt)b & inflate_mask[e]); 96 c = t->base + ((uInt)b & inflate_mask[e]);
93 DUMPBITS(e); 97 DUMPBITS(e);
98 Tracevv((stderr, "inflate: * length %u\n", c));
94 99
95 /* decode distance base of block to copy */ 100 /* decode distance base of block to copy */
96 GRABBITS(15); /* max bits for distance code */ 101 GRABBITS(15); /* max bits for distance code */
@@ -109,13 +114,14 @@ z_stream *z;
109 DUMPBITS(t->bits) 114 DUMPBITS(t->bits)
110 115
111 /* get extra bits to add to distance base */ 116 /* get extra bits to add to distance base */
112 GRABBITS(e) /* get extra bits (up to 13) */ 117 GRABBITS((uInt)e) /* get extra bits (up to 13) */
113 d = t->base + ((uInt)b & inflate_mask[e]); 118 d = t->base + ((uInt)b & inflate_mask[e]);
114 DUMPBITS(e) 119 DUMPBITS(e)
120 Tracevv((stderr, "inflate: * distance %u\n", d));
115 121
116 /* do the copy */ 122 /* do the copy */
117 m -= c; 123 m -= c;
118 if (q - s->window >= d) /* if offset before destination, */ 124 if ((uInt)(q - s->window) >= d) /* if offset before destination, */
119 { /* just copy */ 125 { /* just copy */
120 r = q - d; 126 r = q - d;
121 *q++ = *r++; c--; /* minimum count is three, */ 127 *q++ = *r++; c--; /* minimum count is three, */
@@ -128,7 +134,7 @@ z_stream *z;
128 { 134 {
129 e = d - (q - s->window); /* bytes from offset to end */ 135 e = d - (q - s->window); /* bytes from offset to end */
130 r = s->end - e; /* pointer to offset */ 136 r = s->end - e; /* pointer to offset */
131 if (c > e) /* if source crosses, */ 137 if (c > (uInt)e) /* if source crosses, */
132 { 138 {
133 c -= e; /* copy to end of window */ 139 c -= e; /* copy to end of window */
134 do { 140 do {
diff --git a/inflate.c b/inflate.c
index b76e246..bed4e54 100644
--- a/inflate.c
+++ b/inflate.c
@@ -15,38 +15,63 @@ 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 START, /* make new blocks state */
19 BLOCKS, /* decompressing blocks */ 18 BLOCKS, /* decompressing blocks */
20 CHECK4, /* four check bytes to go */ 19 CHECK4, /* four check bytes to go */
21 CHECK3, /* three check bytes to go */ 20 CHECK3, /* three check bytes to go */
22 CHECK2, /* two check bytes to go */ 21 CHECK2, /* two check bytes to go */
23 CHECK1, /* one check byte to go */ 22 CHECK1, /* one check byte to go */
24 DONE, /* finished check, done */ 23 DONE, /* finished check, done */
25 INF_ERROR}/* got an error--stay here */ 24 BAD} /* got an error--stay here */
26 mode; /* current inflate mode */ 25 mode; /* current inflate mode */
27 26
28 /* mode dependent information */ 27 /* mode dependent information */
29 union { 28 union {
30 uInt method; /* if FLAGS, method byte */ 29 uInt method; /* if FLAGS, method byte */
31 struct inflate_blocks_state
32 *blocks; /* if BLOCKS, current state */
33 struct { 30 struct {
34 uLong was; /* computed check value */ 31 uLong was; /* computed check value */
35 uLong need; /* stream check value */ 32 uLong need; /* stream check value */
36 } check; /* if CHECK, check values to compare */ 33 } check; /* if CHECK, check values to compare */
34 uInt marker; /* if BAD, inflateSync's marker bytes count */
37 } sub; /* submode */ 35 } sub; /* submode */
38 36
39 /* mode independent information */ 37 /* mode independent information */
40 int nowrap; /* flag for no wrapper */ 38 int nowrap; /* flag for no wrapper */
41 uInt wbits; /* log2(window size) (8..15, defaults to 15) */ 39 uInt wbits; /* log2(window size) (8..15, defaults to 15) */
40 struct inflate_blocks_state
41 *blocks; /* current inflate_blocks state */
42 42
43}; 43};
44 44
45 45
46int inflateInit(z) 46int inflateReset(z)
47z_stream *z; 47z_stream *z;
48{ 48{
49 return inflateInit2(z, WBITS); 49 uLong c;
50
51 if (z == Z_NULL || z->state == Z_NULL)
52 return Z_STREAM_ERROR;
53 z->total_in = z->total_out = 0;
54 z->msg = Z_NULL;
55 z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
56 inflate_blocks_reset(z->state->blocks, z, &c);
57 Trace((stderr, "inflate: reset\n"));
58 return Z_OK;
59}
60
61
62int inflateEnd(z)
63z_stream *z;
64{
65 uLong c;
66
67 if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
68 return Z_STREAM_ERROR;
69 if (z->state->blocks != Z_NULL)
70 inflate_blocks_free(z->state->blocks, z, &c);
71 ZFREE(z, z->state);
72 z->state = Z_NULL;
73 Trace((stderr, "inflate: end\n"));
74 return Z_OK;
50} 75}
51 76
52 77
@@ -59,12 +84,10 @@ int w;
59 return Z_STREAM_ERROR; 84 return Z_STREAM_ERROR;
60 if (z->zalloc == Z_NULL) z->zalloc = zcalloc; 85 if (z->zalloc == Z_NULL) z->zalloc = zcalloc;
61 if (z->zfree == Z_NULL) z->zfree = zcfree; 86 if (z->zfree == Z_NULL) z->zfree = zcfree;
62 z->total_in = z->total_out = 0;
63 z->msg = Z_NULL;
64 if ((z->state = (struct internal_state *) 87 if ((z->state = (struct internal_state *)
65 ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) 88 ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
66 return Z_MEM_ERROR; 89 return Z_MEM_ERROR;
67 z->state->mode = METHOD; 90 z->state->blocks = Z_NULL;
68 91
69 /* handle undocumented nowrap option (no zlib header or check) */ 92 /* handle undocumented nowrap option (no zlib header or check) */
70 z->state->nowrap = 0; 93 z->state->nowrap = 0;
@@ -72,7 +95,6 @@ int w;
72 { 95 {
73 w = - w; 96 w = - w;
74 z->state->nowrap = 1; 97 z->state->nowrap = 1;
75 z->state->mode = START;
76 } 98 }
77 99
78 /* set window size */ 100 /* set window size */
@@ -81,20 +103,40 @@ int w;
81 inflateEnd(z); 103 inflateEnd(z);
82 return Z_STREAM_ERROR; 104 return Z_STREAM_ERROR;
83 } 105 }
84 z->state->wbits = w; 106 z->state->wbits = (uInt)w;
107
108 /* create inflate_blocks state */
109 if ((z->state->blocks =
110 inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, 1 << w))
111 == Z_NULL)
112 {
113 inflateEnd(z);
114 return Z_MEM_ERROR;
115 }
116 Trace((stderr, "inflate: allocated\n"));
117
118 /* reset state */
119 inflateReset(z);
85 return Z_OK; 120 return Z_OK;
86} 121}
87 122
88 123
124int inflateInit(z)
125z_stream *z;
126{
127 return inflateInit2(z, DEF_WBITS);
128}
129
130
131#define NEEDBYTE {if(z->avail_in==0)return r;r=Z_OK;}
89#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) 132#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
90 133
91int inflate(z, f) 134int inflate(z, f)
92z_stream *z; 135z_stream *z;
93int f; 136int f;
94{ 137{
95 int r = f; /* to avoid warning about unused f */ 138 int r = f; /* to avoid warning about unused f */
96 uInt b; 139 uInt b;
97 uLong c;
98 140
99 if (z == Z_NULL || z->next_in == Z_NULL) 141 if (z == Z_NULL || z->next_in == Z_NULL)
100 return Z_STREAM_ERROR; 142 return Z_STREAM_ERROR;
@@ -102,77 +144,86 @@ int f;
102 while (1) switch (z->state->mode) 144 while (1) switch (z->state->mode)
103 { 145 {
104 case METHOD: 146 case METHOD:
105 if (z->avail_in == 0) return r; r = Z_OK; 147 NEEDBYTE
106 if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED)) 148 if (((z->state->sub.method = NEXTBYTE) & 0xf != DEFLATED))
107 { 149 {
108 z->state->mode = INF_ERROR; 150 z->state->mode = BAD;
109 z->msg = "unknown compression method"; 151 z->msg = "unknown compression method";
110 return Z_DATA_ERROR; 152 z->state->sub.marker = 5; /* can't try inflateSync */
153 break;
111 } 154 }
112 if ((z->state->sub.method >> 4) + 8 > z->state->wbits) 155 if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
113 { 156 {
114 z->state->mode = INF_ERROR; 157 z->state->mode = BAD;
115 z->msg = "invalid window size"; 158 z->msg = "invalid window size";
116 return Z_DATA_ERROR; 159 z->state->sub.marker = 5; /* can't try inflateSync */
160 break;
117 } 161 }
118 z->state->mode = FLAG; 162 z->state->mode = FLAG;
119 case FLAG: 163 case FLAG:
120 if (z->avail_in == 0) return r; r = Z_OK; 164 NEEDBYTE
121 if ((b = NEXTBYTE) & 0x20) 165 if ((b = NEXTBYTE) & 0x20)
122 { 166 {
123 z->state->mode = INF_ERROR; 167 z->state->mode = BAD;
124 z->msg = "invalid reserved bit"; 168 z->msg = "invalid reserved bit";
125 return Z_DATA_ERROR; 169 z->state->sub.marker = 5; /* can't try inflateSync */
170 break;
126 } 171 }
127 if (((z->state->sub.method << 8) + b) % 31) 172 if (((z->state->sub.method << 8) + b) % 31)
128 { 173 {
129 z->state->mode = INF_ERROR; 174 z->state->mode = BAD;
130 z->msg = "incorrect header check"; 175 z->msg = "incorrect header check";
131 return Z_DATA_ERROR; 176 z->state->sub.marker = 5; /* can't try inflateSync */
177 break;
132 } 178 }
133 z->state->mode = START; 179 Trace((stderr, "inflate: zlib header ok\n"));
134 case START:
135 if ((z->state->sub.blocks = inflate_blocks_new(z,
136 z->state->nowrap ? Z_NULL : adler32,
137 1<< z->state->wbits)) == Z_NULL)
138 return Z_MEM_ERROR;
139 z->state->mode = BLOCKS; 180 z->state->mode = BLOCKS;
140 case BLOCKS: 181 case BLOCKS:
141 if ((r = inflate_blocks(z->state->sub.blocks, z, r)) != Z_STREAM_END) 182 r = inflate_blocks(z->state->blocks, z, r);
142 return r; 183 if (r == Z_DATA_ERROR)
143 inflate_blocks_free(z->state->sub.blocks, z, &c); 184 {
185 z->state->mode = BAD;
186 z->state->sub.marker = 0; /* can try inflateSync */
187 break;
188 }
189 if (r != Z_STREAM_END)
190 return r;
191 r = Z_OK;
192 inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
144 if (z->state->nowrap) 193 if (z->state->nowrap)
145 { 194 {
146 z->state->mode = DONE; 195 z->state->mode = DONE;
147 break; 196 break;
148 } 197 }
149 z->state->sub.check.was = c;
150 z->state->mode = CHECK4; 198 z->state->mode = CHECK4;
151 case CHECK4: 199 case CHECK4:
152 if (z->avail_in == 0) return r; r = Z_OK; 200 NEEDBYTE
153 z->state->sub.check.need = (uLong)NEXTBYTE << 24; 201 z->state->sub.check.need = (uLong)NEXTBYTE << 24;
154 z->state->mode = CHECK3; 202 z->state->mode = CHECK3;
155 case CHECK3: 203 case CHECK3:
156 if (z->avail_in == 0) return r; r = Z_OK; 204 NEEDBYTE
157 z->state->sub.check.need += (uLong)NEXTBYTE << 16; 205 z->state->sub.check.need += (uLong)NEXTBYTE << 16;
158 z->state->mode = CHECK2; 206 z->state->mode = CHECK2;
159 case CHECK2: 207 case CHECK2:
160 if (z->avail_in == 0) return r; r = Z_OK; 208 NEEDBYTE
161 z->state->sub.check.need += (uLong)NEXTBYTE << 8; 209 z->state->sub.check.need += (uLong)NEXTBYTE << 8;
162 z->state->mode = CHECK1; 210 z->state->mode = CHECK1;
163 case CHECK1: 211 case CHECK1:
164 if (z->avail_in == 0) return r; r = Z_OK; 212 NEEDBYTE
165 z->state->sub.check.need += (uLong)NEXTBYTE; 213 z->state->sub.check.need += (uLong)NEXTBYTE;
214
166 if (z->state->sub.check.was != z->state->sub.check.need) 215 if (z->state->sub.check.was != z->state->sub.check.need)
167 { 216 {
168 z->state->mode = INF_ERROR; 217 z->state->mode = BAD;
169 z->msg = "incorrect data check"; 218 z->msg = "incorrect data check";
170 return Z_DATA_ERROR; 219 z->state->sub.marker = 5; /* can't try inflateSync */
220 break;
171 } 221 }
222 Trace((stderr, "inflate: zlib check ok\n"));
172 z->state->mode = DONE; 223 z->state->mode = DONE;
173 case DONE: 224 case DONE:
174 return Z_STREAM_END; 225 return Z_STREAM_END;
175 case INF_ERROR: 226 case BAD:
176 return Z_DATA_ERROR; 227 return Z_DATA_ERROR;
177 default: 228 default:
178 return Z_STREAM_ERROR; 229 return Z_STREAM_ERROR;
@@ -180,41 +231,46 @@ int f;
180} 231}
181 232
182 233
183int inflateEnd(z) 234int inflateSync(z)
184z_stream *z; 235z_stream *z;
185{ 236{
186 uLong c; 237 uInt n; /* number of bytes to look at */
238 Byte *p; /* pointer to bytes */
239 uInt m; /* number of marker bytes found in a row */
240 uLong r, w; /* temporaries to save total_in and total_out */
187 241
188 if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) 242 /* set up */
243 if (z == Z_NULL || z->state == Z_NULL)
189 return Z_STREAM_ERROR; 244 return Z_STREAM_ERROR;
190 if (z->state->mode == BLOCKS) 245 if (z->state->mode != BAD)
191 inflate_blocks_free(z->state->sub.blocks, z, &c); 246 z->state->sub.marker = 0;
192 ZFREE(z, z->state); 247 if ((n = z->avail_in) == 0)
193 z->state = Z_NULL; 248 return Z_BUF_ERROR;
194 return Z_OK; 249 p = z->next_in;
195} 250 m = z->state->sub.marker;
196
197
198/* inflateSync not implemented yet--this just consumes input */
199int inflateSync(z)
200z_stream *z;
201{
202 if (z == Z_NULL) return Z_STREAM_ERROR;
203 if (z->avail_in == 0) return Z_BUF_ERROR;
204 do {
205 z->total_in++;
206 } while (--z->avail_in);
207 return Z_DATA_ERROR;
208}
209 251
252 /* search */
253 while (n && m < 4)
254 {
255 if (*p == (m < 2 ? 0 : 0xff))
256 m++;
257 else if (*p || m > 2)
258 m = 0;
259 p++, n--;
260 }
210 261
211/* inflateReset not fully implemented yet--this frees and reallocates */ 262 /* restore */
212int inflateReset(z) 263 z->total_in += p - z->next_in;
213z_stream *z; 264 z->next_in = p;
214{ 265 z->avail_in = n;
215 int r; 266 z->state->sub.marker = m;
216 267
217 if ((r = inflateEnd(z)) != Z_OK) 268 /* return no joy or set up to restart on a new block */
218 return r; 269 if (m != 4)
219 return inflateInit(z); 270 return Z_DATA_ERROR;
271 r = z->total_in; w = z->total_out;
272 inflateReset(z);
273 z->total_in = r; z->total_out = w;
274 z->state->mode = BLOCKS;
275 return Z_OK;
220} 276}
diff --git a/infutil.c b/infutil.c
index 3f687e6..a5902e7 100644
--- a/infutil.c
+++ b/infutil.c
@@ -44,7 +44,9 @@ int r;
44 s->check = (*s->checkfn)(s->check, q, n); 44 s->check = (*s->checkfn)(s->check, q, n);
45 45
46 /* copy as far as end of window */ 46 /* copy as far as end of window */
47 while (n--) *p++ = *q++; 47 zmemcpy(p, q, n);
48 p += n;
49 q += n;
48 50
49 /* see if more to copy at beginning of window */ 51 /* see if more to copy at beginning of window */
50 if (q == s->end) 52 if (q == s->end)
@@ -68,7 +70,9 @@ int r;
68 s->check = (*s->checkfn)(s->check, q, n); 70 s->check = (*s->checkfn)(s->check, q, n);
69 71
70 /* copy */ 72 /* copy */
71 while (n--) *p++ = *q++; 73 zmemcpy(p, q, n);
74 p += n;
75 q += n;
72 } 76 }
73 77
74 /* update pointers */ 78 /* update pointers */
diff --git a/infutil.h b/infutil.h
index 2aabf3c..f468f1a 100644
--- a/infutil.h
+++ b/infutil.h
@@ -22,7 +22,7 @@ struct inflate_blocks_state {
22 CODES, /* processing fixed or dynamic block */ 22 CODES, /* processing fixed or dynamic block */
23 DRY, /* output remaining window bytes */ 23 DRY, /* output remaining window bytes */
24 DONE, /* finished last block, done */ 24 DONE, /* finished last block, done */
25 INF_ERROR}/* got a data error--stuck here */ 25 BAD} /* got a data error--stuck here */
26 mode; /* current inflate_block mode */ 26 mode; /* current inflate_block mode */
27 27
28 /* mode dependent information */ 28 /* mode dependent information */
@@ -63,13 +63,7 @@ struct inflate_blocks_state {
63#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} 63#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
64#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} 64#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
65#define NEXTBYTE (n--,*p++) 65#define NEXTBYTE (n--,*p++)
66#ifdef __TURBOC__ /* bug in TurboC compiler, bad code for b << 0 */ 66#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
67# define NEEDBITS(j) {\
68 while(k<(j)){NEEDBYTE;b=k?b|(((uLong)NEXTBYTE)<<k):NEXTBYTE;k+=8;}\
69}
70#else
71# define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
72#endif
73#define DUMPBITS(j) {b>>=(j);k-=(j);} 67#define DUMPBITS(j) {b>>=(j);k-=(j);}
74/* output bytes */ 68/* output bytes */
75#define WAVAIL (q<s->read?s->read-q-1:s->end-q) 69#define WAVAIL (q<s->read?s->read-q-1:s->end-q)
diff --git a/trees.c b/trees.c
index 9234add..eb69d49 100644
--- a/trees.c
+++ b/trees.c
@@ -29,7 +29,7 @@
29 * Addison-Wesley, 1983. ISBN 0-201-06672-6. 29 * Addison-Wesley, 1983. ISBN 0-201-06672-6.
30 */ 30 */
31 31
32/* $Id: trees.c,v 1.3 1995/04/29 13:49:46 jloup Exp $ */ 32/* $Id: trees.c,v 1.4 1995/05/01 16:53:44 jloup Exp $ */
33 33
34#include "deflate.h" 34#include "deflate.h"
35 35
@@ -723,6 +723,22 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
723} 723}
724 724
725/* =========================================================================== 725/* ===========================================================================
726 * Send a stored block
727 */
728void ct_stored_block(s, buf, stored_len, eof)
729 deflate_state *s;
730 char *buf; /* input block */
731 ulg stored_len; /* length of input block */
732 int eof; /* true if this is the last block for a file */
733{
734 send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
735 s->compressed_len = (s->compressed_len + 3 + 7) & ~7L;
736 s->compressed_len += (stored_len + 4) << 3;
737
738 copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
739}
740
741/* ===========================================================================
726 * Determine the best encoding for the current block: dynamic trees, static 742 * Determine the best encoding for the current block: dynamic trees, static
727 * trees or store, and output the encoded block to the zip file. This function 743 * trees or store, and output the encoded block to the zip file. This function
728 * returns the total compressed length for the file so far. 744 * returns the total compressed length for the file so far.
@@ -771,8 +787,8 @@ ulg ct_flush_block(s, buf, stored_len, eof)
771 * the whole file is transformed into a stored file: 787 * the whole file is transformed into a stored file:
772 */ 788 */
773#ifdef STORED_FILE_OK 789#ifdef STORED_FILE_OK
774# ifdef FORCE_METHOD 790# ifdef FORCE_STORED_FILE
775 if (level == 1 && eof && compressed_len == 0L) { /* force stored file */ 791 if (eof && compressed_len == 0L) { /* force stored file */
776# else 792# else
777 if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) { 793 if (stored_len <= opt_lenb && eof && s->compressed_len==0L && seekable()) {
778# endif 794# endif
@@ -785,8 +801,8 @@ ulg ct_flush_block(s, buf, stored_len, eof)
785 } else 801 } else
786#endif /* STORED_FILE_OK */ 802#endif /* STORED_FILE_OK */
787 803
788#ifdef FORCE_METHOD 804#ifdef FORCE_STORED
789 if (level == 2 && buf != (char*)0) { /* force stored block */ 805 if (buf != (char*)0) { /* force stored block */
790#else 806#else
791 if (stored_len+4 <= opt_lenb && buf != (char*)0) { 807 if (stored_len+4 <= opt_lenb && buf != (char*)0) {
792 /* 4: two words for the lengths */ 808 /* 4: two words for the lengths */
@@ -797,14 +813,10 @@ ulg ct_flush_block(s, buf, stored_len, eof)
797 * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to 813 * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
798 * transform a block into a stored block. 814 * transform a block into a stored block.
799 */ 815 */
800 send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ 816 ct_stored_block(s, buf, stored_len, eof);
801 s->compressed_len = (s->compressed_len + 3 + 7) & ~7L;
802 s->compressed_len += (stored_len + 4) << 3;
803
804 copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
805 817
806#ifdef FORCE_METHOD 818#ifdef FORCE_STATIC
807 } else if (level == 3) { /* force static trees */ 819 } else if (static_lenb >= 0) { /* force static trees */
808#else 820#else
809 } else if (static_lenb == opt_lenb) { 821 } else if (static_lenb == opt_lenb) {
810#endif 822#endif
diff --git a/zconf.h b/zconf.h
index bcd8510..4e05a3e 100644
--- a/zconf.h
+++ b/zconf.h
@@ -3,7 +3,7 @@
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/* $Id: zconf.h,v 1.9 1995/04/29 12:02:14 jloup Exp $ */ 6/* $Id: zconf.h,v 1.10 1995/04/30 19:27:14 jloup Exp $ */
7 7
8#ifndef _ZCONF_H 8#ifndef _ZCONF_H
9#define _ZCONF_H 9#define _ZCONF_H
@@ -32,10 +32,16 @@
32# define STDC 32# define STDC
33#endif 33#endif
34 34
35#ifdef MAXSEG_64K 35#ifndef MAX_MEM_LEVEL
36# define MAX_MEM_LEVEL 8 36# ifdef MAXSEG_64K
37#else 37# define MAX_MEM_LEVEL 8
38# define MAX_MEM_LEVEL 9 38# else
39# define MAX_MEM_LEVEL 9
40# endif
41#endif
42
43#ifndef MAX_WBITS
44# define MAX_WBITS 15 /* 32K LZ77 window */
39#endif 45#endif
40 46
41 /* Type declarations */ 47 /* Type declarations */
@@ -52,7 +58,7 @@
52 typedef unsigned char Byte; /* 8 bits */ 58 typedef unsigned char Byte; /* 8 bits */
53#endif 59#endif
54#ifndef uInt 60#ifndef uInt
55 typedef unsigned int uInt; /* may be 16 or 32 bits */ 61 typedef unsigned int uInt; /* 16 bits or more */
56#endif 62#endif
57#ifndef uLong 63#ifndef uLong
58 typedef unsigned long uLong; /* 32 bits or more */ 64 typedef unsigned long uLong; /* 32 bits or more */
diff --git a/zlib.h b/zlib.h
index f72fff8..e64ab91 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1,5 +1,5 @@
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.8 April 29th, 1995. 2 version 0.9 April 30th, 1995.
3 3
4 Copyright (C) 1995 Jean-loup Gailly and Mark Adler 4 Copyright (C) 1995 Jean-loup Gailly and Mark Adler
5 5
@@ -28,7 +28,7 @@
28 28
29#include "zconf.h" 29#include "zconf.h"
30 30
31#define ZLIB_VERSION "0.8" 31#define ZLIB_VERSION "0.9"
32 32
33/* 33/*
34 The 'zlib' compression library provides in-memory compression and 34 The 'zlib' compression library provides in-memory compression and
@@ -81,7 +81,7 @@ typedef struct z_stream_s {
81 opaque before calling the init function. All other fields are set by the 81 opaque before calling the init function. All other fields are set by the
82 compression library and must not be updated by the application. 82 compression library and must not be updated by the application.
83 83
84 The opaque value provided by the application will be passed as first 84 The opaque value provided by the application will be passed as the first
85 parameter for calls of zalloc and zfree. This can be useful for custom 85 parameter for calls of zalloc and zfree. This can be useful for custom
86 memory management. The compression library attaches no meaning to the 86 memory management. The compression library attaches no meaning to the
87 opaque value. 87 opaque value.
@@ -89,7 +89,12 @@ typedef struct z_stream_s {
89 zalloc must return Z_NULL if there is not enough memory for the object. 89 zalloc must return Z_NULL if there is not enough memory for the object.
90 On 16-bit systems, the functions zalloc and zfree must be able to allocate 90 On 16-bit systems, the functions zalloc and zfree must be able to allocate
91 exactly 65536 bytes, but will not be required to allocate more than this 91 exactly 65536 bytes, but will not be required to allocate more than this
92 if the symbol MAXSEG_64K is defined (see zconf.h). 92 if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
93 pointers returned by zalloc for objects of exactly 65536 bytes *must*
94 have their offset normalized to zero. The default allocation function
95 provided by this library ensures this (see zutil.c). To reduce memory
96 requirements and avoid any allocation of 64K objects, at the expense of
97 compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
93 98
94 The fields total_in and total_out can be used for statistics or 99 The fields total_in and total_out can be used for statistics or
95 progress reports. After compression, total_in holds the total size of 100 progress reports. After compression, total_in holds the total size of
@@ -265,7 +270,7 @@ extern int inflate __P((z_stream *strm, int flush));
265 270
266 If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much 271 If the parameter flush is set to Z_PARTIAL_FLUSH, inflate flushes as much
267 output as possible to the output buffer. The flushing behavior of inflate is 272 output as possible to the output buffer. The flushing behavior of inflate is
268 not specified for values of the flush paramater other than Z_PARTIAL_FLUSH 273 not specified for values of the flush parameter other than Z_PARTIAL_FLUSH
269 and Z_FINISH, but the current implementation actually flushes as much output 274 and Z_FINISH, but the current implementation actually flushes as much output
270 as possible anyway. 275 as possible anyway.
271 276
@@ -367,7 +372,7 @@ extern int deflateCopy __P((z_stream *dest,
367 Sets the destination stream as a complete copy of the source stream. If 372 Sets the destination stream as a complete copy of the source stream. If
368 the source stream is using an application-supplied history buffer, a new 373 the source stream is using an application-supplied history buffer, a new
369 buffer is allocated for the destination stream. The compressed output 374 buffer is allocated for the destination stream. The compressed output
370 buffer is always application-supplied. It's the responsability of the 375 buffer is always application-supplied. It's the responsibility of the
371 application to provide the correct values of next_out and avail_out for the 376 application to provide the correct values of next_out and avail_out for the
372 next call of deflate. 377 next call of deflate.
373 378
@@ -430,12 +435,13 @@ extern int inflateInit2 __P((z_stream *strm,
430 435
431extern int inflateSync __P((z_stream *strm)); 436extern int inflateSync __P((z_stream *strm));
432/* 437/*
433 Skips invalid compressed data until the special marker and a valid block 438 Skips invalid compressed data until the special marker (see deflate()
434 can be found, or until all available input is skipped. No output is provided. 439 above) can be found, or until all available input is skipped. No output
440 is provided.
435 441
436 inflateSync returns Z_OK if a valid block has been found, Z_BUF_ERROR if 442 inflateSync returns Z_OK if the special marker has been found, Z_BUF_ERROR
437 no more input was provided, Z_DATA_ERROR if not valid block has been found, 443 if no more input was provided, Z_DATA_ERROR if no marker has been found,
438 Z_STREAM_ERROR if the stream structure was inconsistent. In the success 444 or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
439 case, the application may save the current current value of total_in which 445 case, the application may save the current current value of total_in which
440 indicates where valid compressed data was found. In the error case, the 446 indicates where valid compressed data was found. In the error case, the
441 application may repeatedly call inflateSync, providing more input each time, 447 application may repeatedly call inflateSync, providing more input each time,
@@ -469,7 +475,7 @@ extern int compress __P((Byte *dest, uLong *destLen,
469 Compresses the source buffer into the destination buffer. sourceLen is 475 Compresses the source buffer into the destination buffer. sourceLen is
470 the byte length of the source buffer. Upon entry, destLen is the total 476 the byte length of the source buffer. Upon entry, destLen is the total
471 size of the destination buffer, which must be at least 0.1% larger than 477 size of the destination buffer, which must be at least 0.1% larger than
472 sourceLen plus 8 bytes. Upon exit, destLen is the actual size of the 478 sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
473 compressed buffer. 479 compressed buffer.
474 This function can be used to compress a whole file at once if the 480 This function can be used to compress a whole file at once if the
475 input file is mmap'ed. 481 input file is mmap'ed.
@@ -505,7 +511,7 @@ extern gzFile gzopen __P((char *path, char *mode));
505 is as in fopen ("rb" or "wb"). gzopen can also be used to read a file 511 is as in fopen ("rb" or "wb"). gzopen can also be used to read a file
506 which is not in gzip format; in this case gzread will directly read from 512 which is not in gzip format; in this case gzread will directly read from
507 the file without decompression. 513 the file without decompression.
508 gzopen return NULL if the file could not be opened or if there was 514 gzopen returns NULL if the file could not be opened or if there was
509 insufficient memory to allocate the (de)compression state; errno 515 insufficient memory to allocate the (de)compression state; errno
510 can be checked to distinguish the two cases (if errno is zero, the 516 can be checked to distinguish the two cases (if errno is zero, the
511 zlib error is Z_MEM_ERROR). 517 zlib error is Z_MEM_ERROR).
@@ -516,7 +522,7 @@ extern gzFile gzdopen __P((int fd, char *mode));
516 gzdopen() associates a gzFile with the file descriptor fd. File 522 gzdopen() associates a gzFile with the file descriptor fd. File
517 descriptors are obtained from calls like open, dup, creat, or pipe. 523 descriptors are obtained from calls like open, dup, creat, or pipe.
518 The mode parameter is as in fopen ("rb" or "wb"). 524 The mode parameter is as in fopen ("rb" or "wb").
519 gzdopen return NULL if there was insufficient memory to allocate 525 gzdopen returns NULL if there was insufficient memory to allocate
520 the (de)compression state. 526 the (de)compression state.
521*/ 527*/
522 528
@@ -574,7 +580,7 @@ extern uLong adler32 __P((uLong adler, Byte *buf, uInt len));
574 Update a running Adler-32 checksum with the bytes buf[0..len-1] and 580 Update a running Adler-32 checksum with the bytes buf[0..len-1] and
575 return the updated checksum. If buf is NULL, this function returns 581 return the updated checksum. If buf is NULL, this function returns
576 the required initial value for the checksum. 582 the required initial value for the checksum.
577 An Adler-32 cheksum is almost as reliable as a CRC32 but can be computed 583 An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
578 much faster. Usage example: 584 much faster. Usage example:
579 585
580 uLong adler = adler32(0L, Z_NULL, 0); 586 uLong adler = adler32(0L, Z_NULL, 0);
diff --git a/zutil.h b/zutil.h
index 88f5961..a4b00a0 100644
--- a/zutil.h
+++ b/zutil.h
@@ -8,7 +8,7 @@
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/* $Id: zutil.h,v 1.6 1995/04/29 15:52:16 jloup Exp $ */ 11/* $Id: zutil.h,v 1.7 1995/04/30 10:55:33 jloup Exp $ */
12 12
13#ifndef _Z_UTIL_H 13#ifndef _Z_UTIL_H
14#define _Z_UTIL_H 14#define _Z_UTIL_H
@@ -42,13 +42,8 @@ extern char *z_errmsg[]; /* indexed by 1-zlib_error */
42 42
43#define DEFLATED 8 43#define DEFLATED 8
44 44
45#ifndef WBITS 45#define DEF_WBITS 15
46# define WBITS 15 /* 32K window */ 46/* default WBITS for decompression. MAX_WBITS is useful for compression only */
47#endif
48
49#ifndef MEM_LEVEL
50# define MEM_LEVEL 8
51#endif
52 47
53#define STORED_BLOCK 0 48#define STORED_BLOCK 0
54#define STATIC_TREES 1 49#define STATIC_TREES 1